RuNIX.org — планета блогов о *NIX на русском языке

Запуск QEMU-хоста в GNS3 — kaktyc

Сегодня понадобилось собрать для тестирования MPLS вот такую лабу. Для работы со сложными топологиями очень удобна программа GNS3, которая является графической надстройкой над dynamips/dynagen и QEMU. В первую очередь она пригодится для подготовки к экзаменам Cisco, т.к. PacketTracer умеет далеко не все. Мне было необходимо запустить несколько экземпляров RouterOS, соединить их, настроить маршрутизацию и MPLS.

Но при создании QEMU-хоста возникла проблема. Если просто создать хост и запустить, то все хорошо, консоль работает, телнет коннектится, но стоит только добавить линки с другими узлами (а это можно делать только в выключенном состоянии, т.к. GNS3 пока не умеет hot-link), то QEMU-хост больше не стартует. Опытным путем удалось установить, что дело в qemu-kvm, который в Ubuntu собран без поддержки udp. Было принято решение собрать свой пакет с нужной фунциональностью.

На форуме GNS есть множество патчей под разные версии, но мне было лень править их под последнюю, которая есть в репозиторях Ubuntu. Поэтому я скачал патчи из репозитория Gentoo (сюрприз-сюрприз, тут все работает из коробки :) ). Из архива мне понадобился только 0029-Integrating-Dynamips-and-GNS3-UDP-tunnels-Patches.patch

mkdir qemu-kvm
cd qemu-kvm
sudo apt-get build-dep qemu-kvm
apt-get source qemu-kvm
wget -c http://dev.gentoo.org/~lu_zero/distfiles/qemu-1.0-patches.tar.xz
tar xvJf qemu-1.0-patches.tar.xz
cd qemu-kvm-1.0+noroms/
patch -p1 < ../patches/0029-Integrating-Dynamips-and-GNS3-UDP-tunnels-Patches.patch
dpkg-buildpackage -b -uc -nc -j4
sudo dpkg -i ../qemu_1.0+noroms-0ubuntu13_amd64.deb

После этих действий QEMU-хосты можно соединять и они будут нормально стартовать и работать.
P.S.: вроде как в QEMU версии 1.1 обещают включить эту фунциональность в апстрим.


Использование экзотических юникодных символов в Xorg — kaktyc

Иногда, когда пишешь пост, хочется вставить какой-нибудь символ, типа © или ™, литературных кавычек « и » или буквы с ударением ó, á, а лезть за ними в таблицу символов слишком долго. Можно конечно воспользоваться специальным апплетом, из которого легко копируются в буфер обмена нужные сиволы. Но тогда придётся отрывать руки от клавиатуры, брать мышь, клацать на символе, а потом вставлять его в нужное место.
В Xorg существует т.н. Compose key, с помощью которой легко вводить различные экзотические символы и диакритику.

Чтобы её включить, надо в /etc/X11/xorg.conf к XkbOptions дописать compose:rwin.
У меня секция InputDevice для клавиатуры выглядит так:

Section "InputDevice"
Identifier "Keyboard1"
Driver "kbd"
Option "AutoRepeat" "250 30"
Option "XkbModel" "pc105"
Option "XkbLayout" "us,ru"
Option "XkbVariant" ",winkeys"
Option "Xleds" "1 2 3"
Option "XkbOptions" "grp:shift_caps_toggle,grp_led:scroll,caps:internal,compose:rwin"
EndSection

Теперь Compose key висит на правой win-клавише. Для левой win-клавиши параметр соответственно будет lwin.

Примеры использования:

Комбинация клавиш Символ Описание
Compose > > » Литературная правая кавычка
Compose < < « Литературная левая кавычка
Compose ‘ > Одиночная левая кавычка
Compose ‘ < Одиночная правая кавычка
Compose ” > Двойная левая кавычка
Compose ” < Двойная правая кавычка
Compose – - . Среднее тире
Compose – - - Длинное тире
Compose o o ° Знак градуса

Как видно, все комбинации легко запоминаются, т.к представляют собой мнемонические конструкции. Нет необходимости запоминать цифровые последовательности, достаточно представить, как выглядит символ и “сложить” его из имеющегося набора.
Список всех комбинаций находится в /usr/share/X11/locale/en_US.UTF-8/Compose
Если этого мало или хочется переопределить комбинации, необходимо отредактировать файл ~/.XCompose:

include "/usr/share/X11/locale/en_US.UTF-8/Compose"

<Multi_key> <period> <minus> : "…" U2026 # HORIZONTAL ELLIPSIS
<Multi_key> <bar> <minus> : "†" U2020 # DAGGER
<Multi_key> <bar> <equal> : "‡" U2021 # DOUBLE DAGGER

<Multi_key> <equal> <less> : "⇐" U21D0 # LEFTWARDS DOUBLE ARROW
<Multi_key> <equal> <asciicircum> : "⇑" U21D1 # UPWARDS DOUBLE ARROW
<Multi_key> <equal> <greater> : "⇒" U21D2 # RIGHTWARDS DOUBLE ARROW
<Multi_key> <equal> <v> : "⇓" U21D3 # DOWNWARDS DOUBLE ARROW

Для корректной работы понадобятся шрифты с поддержкой юникода и локаль UTF-8.


faces/muhas.png

Systemd в ArchLinux — muhas — Заметки аскетичного гика

В extra уже присутствует systemd, более того от libsystemd уже зависят pulseaudio и часть гнома (gnome-session, gnome-control-center, etc)
Если вы замечали что флешка или что-нить другое при автомонтировании подмонтировалось в /run/media/ololo и ничего ужасного не произошло то, поздравляю — вероятно systemd вам уже не страшен, ибо его часть уже установлена системе (не так страшен чёрт, как его малюют на ЛОРе)

Если ставить systemd полностью то, для непритязательных арчеводов, процесс смены практически не заметен. Несмотря на то что systemd не читает /etc/inittab, стандартные его настройки соответствуют стандартным из inittab, да и большинство параметров rc.conf читаются systemd (хотя его настройки имеют приоритет). Так же имеется пакет initscripts-systemd чтобы эмулировать скрипты инициализации Arch'а.
В общем в арчевики уже имеется достаточно объемная страничка по systemd с инструкцией по установке, описанием настройки-использования, интеграции с уже привычными инитскриптами и прочее, и прочее.

Так что, желающие уже сейчас могут относительно легко попробовать творение Леннарта Поттеринга в своем уютном арчике, на котором systemd в скором времени может заменить старый добрый initscripts…

Шифрование разделов и файлов в Linux с помощью loop-device и AES алгоритма — Записки дебианщика

Способов шифрования в Linux много, но в данном случае будет показан простой и быстрорастворимый метод с использованием cryptoloop. С его помощью мы можем шифровать как отдельные разделы (например, создать зашифрованный раздел на флешке), либо сделать криптофайл (зашифрованный файл, внутри которого хранятся ценные данные). Последнее особенно удобно для личного применения.




Немного юниксвея
Шифрование раздела на физическом носителе и создание криптофайла на самом деле для UNIX будут выглядеть одинаково. Это есть следствие принципа UNIX "всё есть файл", над которым стоит немного помедитировать. Так,
в посте о монтировании разделов уже приводился пример того, как можно примонтировать ISO-образ файла в Linux и получить доступ к файлам. Хотелось бы подчеркнуть этот факт ещё раз:
с точки зрения UNIX/Linux не важно, примонтируете ли вы:
  • физический CD-диск, который соответствует устройству /dev/cdrom в точку монтирования /mnt/cdfiles
  • ISO-образ этого диска в точку монитирования /mnt/cdfiles
вы получите один и тот же результат. На самом деле вы монтируете логическую структуру, подключая её к корневой файловой системе.
Понимание этого факта важно для последующего изложения, и вообще важно для работы в Linux, а не только тыкания по кнопкам в KDE/GNOME.


Два слова о петлевом устройстве (Loop-device)
Loopback Device (loop) это механизм ядра Linux, используемый для интерпретации файлов как реальных блочных устройств. Главное, что все инструменты, используемые для работы с реальными дисками (например mount), могут быть использованы и для петлевых устройств.

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

mount -t iso9660 file.iso /mnt/dvd -o loop
Именно параметр и указывает на то, что при монтировании будет использовано loop-устройство (петлевое устройство, петля). Петлевых устройств в системе несколько, и называются они /dev/loop0 ... /dev/loop7. Можно создать их и больше, если надо:

mknod /dev/loop8 b 7 8
mknod /dev/loop9 b 7 9
Главное, чтобы поддержка loopback-device была в ядре Linux (если вы его не собирали сами, она там скорее всего есть). Больше о петлевых устройствах можно прочитать тут, там и здесь.


Установка и подготовка к работе
Для cryptoloop нам потребуется установить небольшой пакет:
sudo aptitude install loop-aes-utils
Далее загружаем модуль cryptoloop:
sudo modprobe cryptoloop
он должен появиться в списке модулей ядра, проверить который можно командой lsmod.


Шифруем файлы и разделы с помощью Cryptoloop и алгоритма AES
Для начала нужно определиться: указываемый метод НЕ ПРЕДНАЗНАЧЕН для шифрования разделов с данными, а только для создания зашифрованных разделов, куда эти данные потом будут скопированы. Так что если вы сотрёте свой раздел с важными данными - пеняйте на себя и читайте в следующий раз внимательно.

Если следовать рецептам ниже с головой и всё сделать правильно, то в результате мы получим раздел\файл, с которым можно будет работать, как с любым диском на чтение и запись - с той разницей, что данные там будут зашифрованы. Каждый раз при монтировании от размонтировании нас будут спрашивать пароль для доступа к этим файлам.

Итак, начинаем подготавливать криптораздел\криптофайл, куда мы скопируем ценные данные и зашифруем.

0. Создание криптофайла или криптораздела
Если мы хотим создать один большой файл, который будет содержать зашифрованные файлы, делаем это так:
dd if=/dev/zero of=~crypto.file bs=1M count=30
В данном примере это файл на 30 Мб, но при нужде можно сделать сколько угодно.

Или ищем флешку, на которой есть пустой раздел - этот пустой раздел мы сделаем шифрованным. Допустим, это будет /dev/sdd2 который мы скоро отформатируем и зашифруем.

Ещё раз:/dev/sdd2 это НЕ раздел с вашими данными, а пустой раздел, куда вы эти данные переместите - и они при этом зашифруются. О создании разделов можно почитать в посте о форматировании.


1. Связываем устройство с loop device (петлевым устройством) с использованием шифрования
В случае криптофайла:
losetup -e aes /dev/loop0 ~crypto.file
В случае криптораздела:
losetup -e aes /dev/loop0 /dev/sdd2
При любом варианте вас попросят ввести пароль - он будет использоваться для доступа к вашим файлам.
cat file | losetup -e aes /dev/loop0 /dev/sdd2 -p0
Пароль меньше 20 символов оно не примет - и правильно сделает. Излишне напоминать, что если забудете пароль - не сможете примонтировать данные обратно. Для любопытных: ключ -e aes указывает программе использовать шифрование AES, который довольно устойчив ко взлому.

Теперь больше работать с устройством через /dev/sdd2 или crypto.file мы не будем, потому как оно зашифровано и система его просто так не примонтирует. Вместо этого работать мы будем именно с петлевым устройством, на которое замкнули криптофайл или криптораздел - оно может быть /dev/loop0 или другое (необязательно каждый раз замыкать на одно и то же устройство).


2. Форматирование зашифрованного раздела или файлаПосле того, как мы связали устройство или файл с loop-device, нужно его отформатировать:
mkfs.ext2 /dev/loop0
В этом примере мы отформатировали на файловую систему Ext2, но можно использовать любую.


3. Перенос данных и работа с зашифрованным разделом или файломРаботаем с петлевым устройством, как с обычным разделом: монтируем, записываем на него данные и так далее. Монтирование зашифрованного раздела или файла выглядит так:

mkdir /mnt/cryptodisk <--- это если точка монтирования ещё не создана
mount /dev/loop0 /mnt/cryptodisk
Размонтирование:
umount /dev/loop0
Больше о монтировании можно прочитать в соответствующем посте.


4. Окончание работы с криптофайлом\криптоустройством
После отмонтирования нужно отвязать устройство или файл от петлевого устройства:
losetup -d /dev/loop0
На всякий случай, просмотреть список задействованных петлевых устройств (loop devices) можно командой:
losetup -a
Теперь петлевое устройство свободно, данные зашифрованы, враг не пройдёт.


А как теперь обратно прикрутить криптованный раздел или файл?
Легко - доступ к зашифрованным данным можно получить, опять привязав к петлевому устройству криптораздел\криптофайл и введя пароль, который вы назначили ранее. То есть в случае криптофайла:
losetup -e aes /dev/loop0 ~crypto.file
В случае криптораздела:
losetup -e aes /dev/loop0 /dev/sdd2
Вас снова попросят ввести пароль, который нужен для доступа к вашим файлам.

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

Альтернативы
  • более каноничный способ по мнению некоторых комментаторов ниже, это использовать штатный cryptsetup. Об этом есть хорошая заметка на блоге у Librarian и толковое руководство.
  • ещё можно попробовать Truecrypt, где есть возможность создания зашифрованного контейнера с "двойным" дном, т.е. двух уровней правдоподобного отрицания, на случай рассекречивания паролей.


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


Тем не менее, светить своими данными не комильфо, и какое-то время вы выиграете.

apt-aide — Журнал Витуса.

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

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

This entry was originally posted at http://vitus-wagner.dreamwidth.org/735781.html. Please comment there using OpenID. Now there are comment count unavailable comments

faces/muhas.png

wifi-select — рулим беспроводными подключениями в ArchLinux — muhas — Заметки аскетичного гика

пример работы wifi-selectwifi-select — полезная консольная утилита для выбора и подключения к беспроводным сетям «на лету», что-то вроде wicd или networkmanager, но только для wifi.
Несомненный плюс(хотя может для кого-то и минус) wifi-select в том что он использует «штатный» для ArchLinux netcfg, и помимо этого не висит демоном как это делают wicd или nm (и netcfg тоже не висит, он лишь единожды запускается для применения настроек профиля). Работает wifi-select до ужаса просто (да и сам он всего лишь скрипт на bash с использованием dialog) — смотрит список сетей через iwlist и выдает их для выбора, выбрали нужную сеть и если требуется ввели пароль. Всё!
Профиль сохранен и подкючается через netcfg profilename, если подключился, то профиль уже сохранен для дальнейшего использования, если нет то предлагается похерить профиль или оставить его дабы мы смогли поменять ip или добавить каких-нить чудо-настроек в него…

Запускать, к сожалению, надо с правами суперпользователя, ибо и профиль надо писать туда где у пользователя прав не хватит и сам netcfg от пользователя не запуститься, но sudo ещё никто не отменял…

Уже существующие профили можно подключать чем душа пожелает, можно с помощью dmenu (чем я с радостью и пользуюсь) или того же wifi-select(правда он покажет только wifi), netcfggui или других. Хотя в итоге все такие управлялки запускают netcfg profilename

netcfg — настройка и управление профилями сетевых подключений (проводные, беспроводные, коммутируемые, vpn, bonding, etc)
Пакет wifi-select имеется в community, в AUR есть его версия из git


UPDATE: Сегодня (13 мая) в core пришел netcfg 2.8.2 (до этого была ветка 2.6), в котором ещё с версии 2.7 появилось wifi-menu работающее почти аналогично сабжу. Так же появилась поддержка PPPoE.
Не забудьте перенести конфиг сети из /etc/rc.conf в /etc/conf.d/netcfg
Полный ченджлог тут, а тут более коротко, но вполне доходчиво.

Автоматическое переключение раскладки клавиатуры в Ubuntu — Linux & Life

После установки Ubuntu 12.04 первое, на что обратил внимание, исправлен ли баг с отображением активной раскладки. Оказалось, что нет. Может большинству он не очень досаждает, но мне, как украинскому пользователю, имеющему 3 раскладки иногда надоедает неправильное отображение языка текущей раскладки.

Читать>>

gwinn

И снова облачный хостинг — Free Runner » linux

    В продолжении темы исследования плюсов и минусов использования облачных инфраструктур сегодня расскажу как я эксперементировал с облачным хостингом от Cloud4Y. Возможности Процесс регистрации ничем не примечателен, быстр и прост, после прохождения данной процедуры нам открываются такие возможности как: Облако Linux Облако Windows Корпоративная почта (Exchange) Настраиваемый Backup (можно выбрать как объем хранилища под backup, [...]

Sun servers Power on — Unix pin

После аварийного пропадания питания, сервера с ILOM (Sun/Oracle t5440, t3-1, t3-4 итд) автоматически не включаются. Чтобы это исправить, в системном контролере выставляем

set /SP/policy HOST_LAST_POWER_STATE=enabled
set /SP/policy HOST_POWER_ON_DELAY=enabled

ЗЫ Если автозагрузка не установлена, то еще добавить
set /HOST/bootmode script="setenv auto-boot? true"

<g:plusone count="" href="http://www.unixpin.com/wordpress/2012/05/04/sun-servers-power-on/" size="medium">{lang: 'ru'}</g:plusone>

Сравнение времени автономной работы ноутбука в Kubuntu 11.04, 12.04 и Windows 7 — LinuxNow.ru — всё, что вы хотели бы знать о GNU/Linux

Достаточно часто на форумах о GNU/Linux мне попадались сообщения о том, что при использовании Linux время автономной работы ноутбука заметно ниже, чем при использовании Windows. Действительно ли это так? Теоретически в ноутбуках с дискретной видеокартой от Nvidia это должно быть и в самом деле так, ведь технология Nvidia Optimus (позволяющая использовать интегрированное видео ядро при малой нагрузке и переключаться на дискретную карту при большой...
gwinn

Немножко про VoIP — Free Runner » linux

В связи с переходом на VoIP завел в офисе вот такого чудо зверька: Невероятно приятный девайс: 3 линии, великолепный звук, 60-ти контактная телефонная книга, громкая связь, быстрый набор, количество настроек — over9000. В общем торт. Поначалу была мысль установить voip шлюз, но узнав, что стоимость выделенного ip у провайдера всего 150 рублей было решено не [...]

Скрипты для установки Redmine — GiNeR's Blog

По ссылке находятся скрипты предназначенные для подготовки RAILS-окружения для установки Redmine: http://www.helplinux.ru/wiki/en:kb:redmine-installation

Сначала создаётся системный пользователь redmine, затем в домашнюю директорию этого пользователя устанавливается RVM и всё связанное с Ruby/RAILS, а в /opt скачивается из svn-репозитория сам Redmine.

Основы Chef. Поиск и Data Bags — hrafn.me

Ссылка на оригинал

Это последняя часть из Chef Basics. И посвящена она краткому описанию (очень краткому) функций поиска и data bags, не знаю как перевести на русский это словосочетание. В ближайшее время постараюсь собрать все четыре части в PDF. Также в планах дальнейшие переводы по Chef: Chef.Architecture и Chef Essentials. Но об этом позже :)

Поиск

Поиск - это функциональность Chef, позволяющая использовать полнотекстовый поисковый движок (основанный на Apache Solr) для запроса информации об инфраструктуре и приложениях. Информация, содержащаяся в аттрибутах узла, data bags (смотрите ниже), окружения, роли и API клиентов также могут запрашиваться.

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

app_servers = search(:node, 'role:appserver')

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

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

knife search node 'role:appserver'

Для получения более подробной информации следует обратиться к Поиску.

Data Bag

Data Bags хранят вложенные данные ключ-значение (как аттрибуты) на серверах chef. По данным Data Bag можно производить поиск, также их можно загружать прямо по имени в рецепте. Data Bags глобальны для конкретной установки сервера Chef - их можно представить в качестве аттрибутов для всей инфраструктуры.

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

search(:users, '*:*') do |u|
    user u["username"] do
        home u["home"]
        shell u["shell"]
        comment u["comment"]
    end
end

Теперь, всякий раз при необходимости создать пользователя на узлах, можно сделать это просто отредактировав data bag вместо рецепта. Это не только упрощает рецепты, но и позволяет убедиться, что важные данные об инфраструктуре будут доступны для поиска. Доступность для поиска означает, что можно будет быстро получить ответ на вопросы об инфраструктуре, используя knife.Например, скажем, если требуется узнать оболочку по умолчанию пользователя "hank", можно проделать с knife следующее:

knife search users 'username:hank' -a shell

Для data bags, которые содержат конфиденциальную информацию, Chef предоставляет Encrypted Data Bags, позволяющие безопасно хранить информацию на Chef Server в зашифрованном виде. Для получения более подробной информации о databags и зашифрованных data bags следует обратиться к Data Bags и Encrypted Data Bags.

Краткий итог

  • Поиск позволяет делать запросы на получение информации об инфраструктуре из рецептов или через knife.
  • Data bags позволяет хранить данные в виде, пригодном для поиска. Эти данные в дальнейшем могут быть найдены и использованы в рецептах.

Основы Chef. Введение в "Поваренные книги" — hrafn.me

Ссылка на оригинал

"Поваренные книги" - способ, которым пользователи Chef и Hosted Chef запаковывают, распространяют и делают общей информацию о конфигурации. Они объединяют все ресурсы, необходимые для автоматизации инфраструктуры, а также облегчают обмен с другими пользователями Chef.

Они содержат рецепты, файлы аттрибутов, шаблоны и другие штуки для настройки.

При запуске Chef-Client рецепты, перечисленные с списке запуска узла перенаправляются на узел наравне с другим содержимым "поваренной книги", содержащей рецепт. Эти рецепты затем применяются к узлу, приводя его в надлежащее состояние.

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

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

Если репозиторий Chef использует git, можно быстро найти и использовать "поваренные книги", написанные сообществом, используя инструмент командной строки - Knife. Например, для того, чтобы скачать простую "поваренную книгу" "getting-started", можно запустить следующее из репозитория chef:

    knife cookbook site install getting-started

Для выгрузки ее на Chef Server или Hosted Chef:

    knife cookbook upload getting-started

И, для добавления рецепта "default" в эту поваренную книгу для списка запуска узла:

    knife node run_list add my_node 'getting-started::default'

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

    knife cookbook create new_cookbook_name

Рецепты

Рецепты - это файлы Ruby, в которых используется Domain Specific Language (DSL) для определения того, каким образом конкретные части узла следует настраивать. Как можно будет увидеть в последующих секциях, можно использовать данные, совмещенные с возможностью использовать код ruby в рецептах для динамического изменения конфигурации узла.

"Поваренные книги" могут содержать множество рецептов, включая рецепты, добавленные в список запуска по их полному имени, используя форму COOKBOOK_NAME::RECIPE_NAME. В список запуска добавляются только роли и рецепты.

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

При добавлении COOKBOOK_NAME в список запуска Chef считает, что нужен рецепт с именем "default" из "поваренной книги" с тем же именем. Чтобы посмотреть на пример такого поведения, можно изменить команду knife, использованную выше, для добавления рецепта в список запуска узла. Успользуя укороченный вариант, можно просто дать команду, приведенную выше:

    knife node run_list add my_node getting-started

Этом обновленном примере добавляется рецепт "default" из "поваренной книги" "getting-started" в список запуска "my_node", как и прежде.

Ресурсы и Провайдеры

Ресурсы - это строительные блоки, которые будут использоваться для создания должным образом настроенного узла. Они представляют собой крос-платформенную абстракцию того, что настраивается на узле - отдельные куски конфигурации системы, которые помещены в рецепты и применяются к узлам.

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

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

    user "sam" do
      home "/home/sam"
      shell "bin/zsh"
      comment "Sam loves DevOps"
      action :create
    end

Этот ресурс описывает пользователя, "sam", которого необходимо создать на узле. В действительности создание производится Провайдером, который выполняет команды, необходимые для создания нового пользователя.

Отдельные ресурсы могут иметь множество провайдеров, каждый из которых знает, как выполнить необходимые задачи на различных платформах. Chef-client выберет лучшего провайдера для платформы узла. Таким образом, описание этого едиснтвенного ресурса можеь быть использовано для создания пользователя "sam" на Linux-системе и FreeBSD-системе, без каких-либо изменений.

Ресурс пользователя, описанный выше, структурирован так же, как все описания ресурсов в Chef Domain Specific Language (DSL):

    resource_type "resource_name" do
      resource_attribute value
      ...
    end

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

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

Аттрибуты ресурса и относящиеся к ним значения описвают желаемое состояние ресурса. Каждый ресурс обладает различными аттрибутами, важными в контексте данного ресурса. Аттрибут "action" - это аттрибут, использующийся всеми ресурсами и определяющий, что должно произойти с этим ресурсом. В примере выше, действие "create" указывает, что требуется создать пользователя. Когда sam покинет организацию, можно изменить это действие на ":delete" для удаления пользователя.

Доступные аттрибуты ресурса и их значения по умолчанию подробно описываются на странице Ресурсы.

Когда chef-client загружает рецепты с свой список запуска.

  1. он запускает каждый рецепт как часть кода ruby
  2. каждый раз, когда ресурс используется, он добавляетя в коллекцию ресурсов для этого узла
  3. затем провайдеры этих ресурсов принимают решение действовать или нет для выполнения описания ресурсов.

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

Аттрибуты и Шаблоны

Аттрибуты обеспечивают хранение вложенных пар ключ-значение данных об узле и его конфигурации. Некоторые аттрибуты автоматически собираются на старте каждого запуска chef-client и включают такую информацию, как IP-адрес узлов, имя хоста или загруженные модули ядра. Другие аттрибуты добавляются из других источников, например, "поваренные книги". (Роли и Окружения также могут устанавливать аттрибуты, об этом будет написано далее).

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

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

    default["my_application"]["config_location"] = "/etc/myapp.conf"

Затем этот аттрибут может использоваться напрямую при контроле ресурсов конфигурационного файла:

    template node["my_application"]["config_location"] do
      action :create
    end

Определение Шаблона, который является особенностью Chef, позволяет создавать общие файлы, содержание которых может быть сгенерировано автоматически. Если этот файл конфигурации много раз упоминался в рецепте, изменение его расположения - причина изменения одного аттрибута.

Аттрибуты узла также содержат игформацию об узле, которая может использоваться в рецепте:

    if node.attribute?("ec2")
      # Выполнить специфичные для EC2 задачи.
    end

Это позволит рецепту выполнить некий набор задач по настройке только в том случае, если он был запущен в облаке Amazon EC2. За полной информацией об Аттрибутах необходимо обратиться к следующей странице.

Роли

Настройка одного узла может потребовать множество различных "поваренных книг". Для упорядочивания в группы похожих возможностей на похожих хостах Chef предоставляет Роли. Роли содержат список запуска (только для узла) и аттрибуты, относящиеся к конкретной функции. Например, можно создать роль "webserver", которяа будет включать список запуска со всеми сервисами, необходимыми для работы типичного веб-сервера в пределах инфраструктуры. Список запуска узла может содержать эти роли.

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

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

Окружения

Окружения в Chef предоставляют механизм для управления такими разлиными окружениями, как production, staging, development и testing в пределах одного Chef Server или организации Hosted Chef. С помощью окружений можно указать "список запуска" в роли, ограничение по версии "поваренной книги" и аттрибуты окружения для каждого их них по отдельности. Роли отличаются в это плане тем, что группируют системы по определенным функциям и могут распространяться между окружениями - например: сервер приложений, веб-сервер, сервер баз данных. Таким образом, есть возможность иметь список запуска для каждого окружения внутри роли - например: в окружении development сервер приложений должен подключаться к другому балансировщику нагрузки, находящимся в окружении test, и этим можно управлять внутри одного рецепта.

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

Кратко об описанном

  • Поваренные книги содержат рецепты, файлы аттрибутов и других информацию о конфигурации
  • Ресурсы представляют собой строительные блоки для рецептов и описывают конкретную часть конфигурации узла
  • Ресурсы идемпотентны. Применение одного и того же ресурса дважды должно приводить к одному и тому же результату
  • Провайдеры применяют необходимые действия, требующиеся для приведения узла в состояние согласно описанию ресурса
  • Аттрибуты предоставляет настраиваемые параметры, которые могут использоваться в рецептах, так же как информация об узле
  • Роли предоставляют способ описания определенной функции или типа узла. Роли имеют списки запуска и аттрибуты.
  • Окружения предоставляют способ управления различными инфраструктурными пространствами в пределах одного экземпляра Chef.

Надёжная и недорогая схема виртуализации — GiNeR's Blog

Надёжная и недорогая схема виртуализации основанная на Proxmox 2.0 и DRBD: http://www.helplinux.ru/wiki/en:kb:proxmox-drbd-cluster

Представляет из себя два физических хоста с установленным Proxmox 2.0, каждый из которых имеет по два жёстких диска. Один из этих дисков (а именно второй) используется для DRBD (зеркало по сети) на котором расположены диски виртуальных машин.

Как редактировать файл в vim, доступ к которому есть только у root. — Записки

Работаете вы за компьютером. Увлечены работой. Начинаете редактировать файл в vim. Долго редактируете, упорно. А когда пытаетесь сохранить полученный результат, выясняется, что файл редактировать может только root. А sudo vim filename вы и забыли. Знакомая ситуация? Тоже не раз сталкивался с подобной ситуацией. Сейчас я расскажу, как можно сохранить изменения в файле, если вы редактируете его от обычного пользователя.

Все очень просто. Нужно в ~/.vimrc добавить следующие строки:

map <C-R> :w !sudo tee %<CR>
imap <C-R> %<Esc>:w !sudo tee %<CR>
vmap <C-R> %<Esc>:w !sudo tee %<CR>


Вот собственно и весь рецепт. Теперь для сохранения изменений нужно нажать ctrl+r и ввести пароль. Изменения будут сохранены. Только есть одно маленькое но. Выходить из файла нужно по :q!, но не пугайтесь, все сделанное будет сохранено после ctrl+r.

Павел Вязовой

Рабочий стол — Elms.Pro




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

Я активно использую рабочий стол, у меня он выполняет функцию именно "рабочего стола". Я складываю на него те файлы, или ссылки на них, с которыми в данный момент работаю или собираюсь работать. Для этого не годятся реализации рабочих столов, в которых невозможно задать свободное расположение файлов на рабочем столе. В некотором смысле рабочий стол это просто директория "temp", только с возможностью визуальной организации файлов по пространству экрана монитора.

Пользователи tiled wm - с вашей ситуацией все понятно, у вас немного другой принцип работы и дело не только в том, что окна закрывают рабочий стол и сворачивать их не принято, но ещё и в нежелании "возить мышкой".

Для удобного использования рабочих столов существует много всяких интересных идей, например утилита
Fences для windows. Она позволяет организовывать файлы на рабочем столе в группы. Лучше всего объяснит скриншот:

А некоторые рисуют такие рамки прямо на обоях рабочего стола. Ещё на обоях рисуют календари, списки горячих клавиш и т.п.

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

P.S. Использую на работе Ubuntu и дома Windows 7, так что интересны программы для обоих ОС. 

Cкачать кешированное видео youtube из браузера в стиле UNIX — Записки дебианщика

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

Эта заметка появилась из вопроса, заданного мне местным убунтушником, который никак не мог скачать видеолекции с YouTube: в Firefox плагин VideoDownloader не срабатывал по какой-то причине, как и скрипт youtube-dl. То есть видео закешировано, в броузере играет и поёт, но скопировать его в файл из броузера не получается. Здесь нам на помощь придёт
файловая система proc и тот замечательный факт, что удалённый файл реально удаляется только после того, как он закрыт всеми приложениями, его использующими.


Вытаскивание кешированнго YouTube видео из-под Firefox

Для самых нетерпеливых, собственно, рецепт:

1. Заходим на YouTube, кликаем на интересующее видео и ждём, пока оно полностью загрузится.

2. В консоли запрашиваем список всех открытых видеороликов Flash:
$ lsof -n | grep Flash
Старые версии Firefox просто хранят кешированное видео в директории /tmp
и в этом случае видео можно просто скопировать. В этом случае вы увидите что-то вроде:
beast@notebeast:~/docs/mygtd$ lsof -n | grep Flash
plugin-co 6231 beast 15u REG 3,2 1938773 1746302 /tmp/FlasheY4skF
С обновлённым флеш-плагином этого не будет, а будет вот что:
beast@notebeast:~/docs/mygtd$ lsof -n | grep Flash
plugin-co 6231 beast 15u REG 3,2 1938773 1746302 /tmp/FlasheY4skF (deleted)
И ничего в /tmp мы, натурально, не найдём. Но файл всё-таки есть, так как в броузере он поёт, а значит, к нему в Linux можно добраться.

3. Запоминаем идентификатор процесса (в нашем случае 6231), который открыл вожделенное видео с утуба, и в консоли переходим в директорию /proc

Тут мы видим кучу подкаталогов с цифрами и странными названиями - нас интересует директория 6231 и она, как выясняется, не пуста. Переходим в подкаталог:
$ cd /proc/6231/fd
и после этого пытаемся просмотреть все файлы там:
$ ls -l
и увидим что-то вроде:

beast@notebeast:/proc/6231/fd$ ls -l
итого 0
lr-x------ 1 beast beast 64 2012-03-03 10:04 0 -> /dev/null
l-wx------ 1 beast beast 64 2012-03-03 10:04 1 -> /home/beast/.xsession-errors
lrwx------ 1 beast beast 64 2012-03-03 10:04 10 -> socket:[15270]
lrwx------ 1 beast beast 64 2012-03-03 10:04 11 -> socket:[15271]
lr-x------ 1 beast beast 64 2012-03-03 10:04 12 -> pipe:[15272]
l-wx------ 1 beast beast 64 2012-03-03 10:04 13 -> pipe:[15272]
lrwx------ 1 beast beast 64 2012-03-03 10:04 14 -> socket:[15284]
lrwx------ 1 beast beast 64 2012-03-03 10:04 15 -> /tmp/FlasheY4skF (deleted)
lr-x------ 1 beast beast 64 2012-03-03 10:04 16 -> /dev/snd/timer
lrwx------ 1 beast beast 64 2012-03-03 10:04 17 -> /dev/snd/pcmC0D0p
lrwx------ 1 beast beast 64 2012-03-03 10:04 18 -> /dev/snd/controlC0
l-wx------ 1 beast beast 64 2012-03-03 10:04 2 -> /home/beast/.xsession-errors
lrwx------ 1 beast beast 64 2012-03-03 10:04 3 -> socket:[15182]
lrwx------ 1 beast beast 64 2012-03-03 10:04 4 -> socket:[15183]
lr-x------ 1 beast beast 64 2012-03-03 10:04 5 -> pipe:[15268]
l-wx------ 1 beast beast 64 2012-03-03 10:04 6 -> pipe:[15268]
lr-x------ 1 beast beast 64 2012-03-03 10:04 7 -> pipe:[15269]
l-wx------ 1 beast beast 64 2012-03-03 10:04 8 -> pipe:[15269]
lrwx------ 1 beast beast 64 2012-03-03 10:04 9 -> anon_inode:[eventpoll]

4. Оказывается, что в директории /proc лежит наше вожделенное видео, только вместо имени там стоит номер, в данном случае 15 который указывает на видеофайл:

15 -> /tmp/FlasheY4skF (deleted)
Так как в UNIX действует принцип всё есть файл, мы просто копируем файл 15 в свою домашнюю директорию:
$ cp 15 ~/myNewCoolGreatFlashYouTubevideo.flv
Всё, теперь видео с тюбика в наших руках, и можно делать с ним всё, что душе угодно, в цветастом и мышастом Гноме (точнее, теперь уже Юнити).


Как это работает
После запуска, каждый процесс (и его подпроцессы) получает индетификатор (PID), при этом в каталоге /proc создаётся подкаталог с номером, соответствующем номеру PID вроде /proc/PID. Внутри создаются файлы и подкаталоги, которые содержат информацию о процессе. Вот ей-то мы и воспользовались в своих корыстных целях.

Среди прочего, о чём можно узнать из обновлённого поста о proc или другой документации, нас интересует каталог /proc/PID/fd. Этот каталог содержит символическую ссылку для дескрипторов файлов, которые открыты процессом. Это значит, что мы можем увидеть здесь ссылки на открытые файлы и устройства.

Внутри мы видим ссылки в виде номеров:
0 1 10 11 12 13 2 3 4 5 6 7 8 9,
но команда ls -l скажет вам намного больше интересного (об этом было выше). Ключевая строчка:

lrwx------ 1 beast beast 64 2012-03-03 10:04 15 -> /tmp/FlasheY4skF (deleted)

Ссылка 15 ведёт на файл с флеш-видео, который сейчас открыт. Помня, что в UNIX всё есть файл, мы скопируем ссылку 15 в свой домашний каталог. Только вместо ссылки копируется её содержимое. Ларчик открывается сравнительно просто, если знать как.


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

Главная проблема пользователей Windows-like дистрибутивов (Ubuntu, OpenSUSE, Fedora...) в том, что они тащят свои дурные привычки из Windows, которые в Linux\UNIX не позволяют добиться желаемого. Разница - в подходе ко взаимодействию системы и пользователя:
  • В UNIX схема работы ``от понимания - к действию'': чтобы что-то сделать, надо понимать (или хотя бы смутно догадываться), как оно устроено.
  • В Windows схема работы ``методом тыка'' (буквально): знаю КАК что-то сделать (куда нажать, какую галочку отметить) -> делаю.
Понимание устройства файловой системы в данном конкретном случае - ключ к решению проблемы. Но Windows-ориентированные дистрибутивы этому не способствуют. Никакого рокетсаенса в приведённом пример, конечно, нет, но тем не менее.

Эта заметка так же сподвигла автора обновить старый пост о /proc, немного почитать документацию, поработать Капитаном Очевидностью на полставки и, как говаривал Эркюль Пуаро, напрячь свои маленькие серые клеточки.

Подключаем Яндекс.Диск в наутилусе — Linux & Life

Прочитал на прошлой неделе на Хабрахабре статью про новый сервис от Яндекса - Яндекс.Диск, зашел на страничку и подал заявку на приглашение (сервис пока доступен только по инвайтам). Кроме того, что бы воспользоваться сервисом нужен аккаунт на яндексе.
Вчера пришел на почту инвайт.

VxVM dmp_native_support off — Unix pin

В последних версиях VxVM научился обнаруживать zfs ну и соответственно теперь может «делать каку»
# vxdisk list
DEVICE TYPE DISK GROUP STATUS
c0t5000CCA0125F2E84d0s2 auto:ZFS - - ZFS
c0t5000CCA01268CBECd0s2 auto:ZFS - - ZFS

При обновлении VxVM до версии 5.1SP1RP2 появляется сообщение:

Failed to turn off dmp_native_support tunable on myserver. Refer to Dynamic Multi-Pathing Administrator's guide to determine the reason for the failure
and take corrective action.
VxVM vxdmpadm ERROR V-5-1-15690 Operation failed for one or more zpools
VxVM vxdmpadm ERROR V-5-1-15686 The following zpool(s) could not be migrated as they are not healthy -
rpool

При том, что zfs пул rpool в порядке и вообще-то не использует vxdmp, а использует наоборот — mpxio.
Отключить опицию dmp_native_support в vxdmp не удалось ни после выкидывания дисков, на которых распалагается zfs rpool, ни после удаления путей dmp.
Методом научного тыка отключение этой опции было сделано через файл
# cat /etc/vx/dmppolicy.info
arraytype
#
arrayname
#
enclosure
#
naming
scheme=ebn persistence=yes mode=default lowercase=yes use_avid=yes
#
dmpnode
enable_all 1
fake_array0_0 osn_enabled
#

Итак, удаляем строки

dmpnode
enable_all 1
fake_array0_0 osn_enabled

и перегружаем хост.

<g:plusone count="" href="http://www.unixpin.com/wordpress/2012/04/12/dmp_native_support-zpool/" size="medium">{lang: 'ru'}</g:plusone>

Превращаем terminator в xterm, ну почти… — STALKER`s project::Blog

Terminator — это удобный и функциональный терминал, основными фичами которого является «деление» терминалов и «рассылка» нажатий клавиш на несколько терминалов одновременно. Очень удобная штука, если вам приходится работать с кластерами или выполнять одни и те же команды на нескольких серверах одновременно. Вообще-то Terminator всем хорош, кроме одного … мне нравится xterm, если быть точным то [...]

Антон Васильев о Shelr.tv, ненастоящих эмуляторах терминала и виме внутри емакса — ♠ Краплёная колода

Скринкастинг давно перестал быть чем-то экзотическим. Мы не хотим читать или слушать, мы хотим видеть, как ЭТО работает или как ЭТО выглядит на экране. Видеоуроки для изучающих GIMP, обзоры новых дизайнерских находок разработчиков Unity, тысячи howto, ведущих к светлому будущему... Скринкасты на ютубе можно смотреть часами.

А теперь представьте, что вам потребовалось продемонстрировать преимущества консольных приложений над графическими. Глупо записывать видеопоток о плюсах терминала, если для его просмотра понадобится плеер с графическим интерфейсом. Нужно записать символьный поток, и здесь нам на помощь приходит сервис Shelr.tv с одноимённым инструментом для создания шеллкастов. Интервью с автором проекта читайте в свежем номере «Краплёной колоды».

Представься, пожалуйста, и расскажи, чем занимаешься. По традиции спрошу и про твоё первое знакомство с open source.
Привет. Меня зовут Антон Васильев. И я программирую компьютеры. С open source впервые столкнулся около 10 лет назад, когда сосед по подъезду дал мне диск с дистрибутивом Fedora :)

Первая доза бесплатно :-)
У себя в
блоге ты рекомендуешь GNU/Linux в качестве «правильной платформы» для разработки на Ruby и RoR, Vim и Emacs — в качестве редактора, git — как основную систему контроля версий. Какими ещё инструментами ты активно пользуешься во время работы?
gnome-terminal и /usr/bin/* :)

Вот актуальный top:
$ history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn
343 git
150 cd
110 e (это alias для emacs-client)
41 cat
34 ls
34 bundle
33 shelr
32 rake
30 vi
25 tree
24 rm
23 sudo
21 gem
21 foreman
18 rspec
18 cp
16 echo
14 htop
12 dput
...

Как возникла идея записывать «кунг-фу» в терминале? Это попытка отделиться от жанра скринкастов или желание сделать тематический youtube для гиков?
Один из моих знакомых (Andrey "sshd" Petrenko) попросил меня помочь с простой задачкой: логгирование всех походов по ssh. Я поигрался с утилитой script и тут же родилась идея :)


Какой ты видишь аудиторию сервиса?
Я думаю, преимущественно это разработчики и администраторы Unix-подобных систем.

В каком виде shelr хранит записи консольных пассажей? Обязательно ли пользоваться shelr.tv, чтобы поделиться шеллкастом с приятелями?

Все достаточно просто. Каждая запись хранится в отдельной директории вида ~/.local/share/shelr/TIMESTAMP. Обычно там хранятся три файла:

  • typescript - непосредственный вывод с tty;
  • timing - информация для анимации;
  • meta - метаданные: размер терминала, заголовок, тэги и прочее.

Чтобы поделиться записью с приятелями, минуя shelr.tv, достаточно воспользоваться командой:
shelr dump last

Она создаст в текущей директории файл shelr-record.json, который можно отправить по почте или выложить на свой сервер. Проигрывается файл с помощью команды:
shelr play http://example.com/cool-record.json

В своём докладе на мартовской встрече MLUG ты упомянул о плачевном состоянии эмуляторов терминала на JS. Мол, у каждого свои недостатки, часть функций реализована с помощью хаков. С чем этом связано, на твой взгляд?
Я думаю, в первую очередь — с общей культурой разработчиков на JavaScript. Ситуация со временем меняется, и я очень надеюсь, что количество говнокода на JS будет падать :)
Ну и не так уж всё плохо на самом деле. За последний год их появилось несколько. Мой велосипед: vt.js, автор jslinux написал свой... (Фабрис Беллард помимо прочего и отец-основатель QEMU — справедливое примечание virens'а). Есть ещё несколько реализаций, но часть из них при ближайшем рассмотрении совсем не являются эмуляторами терминала :)

Звучит интригующе. Чем же они являются на самом деле?
Некоторые всего-лишь рендерят html, генерируемый сервером, некоторые никак не реагируют на ANSI Escape последовательности. Одним словом, дешёвые подделки :)

Если на чаши весов поставить ascii.io и shelr.tv, на чьей стороне будем наблюдать перевес?
Об этом лучше судить пользователям :) Я пока не нашёл на ascii чего-то такого, чего нет на shelr.tv. Идея установки через curl понравилась, но я обычно опасаюсь однострочников, которые просят пароль для sudo ;)

Какие нововведения планируешь реализовать в следующих версиях программы и сервиса?
В первую очередь это, конечно, устранение текущих недостатков: отсутствие перемотки и изменения скорости проигрывания.
В дальнейшем планирую добавить live streaming, аннотации, запись голоса, голосования и другие социальные фишки.
Вообще, я рад услышать любые предложения от пользователей и увидеть патчи от разработчиков :)

Помню раньше ты был апологетом использования vim. Теперь, насколько мне известно, перешёл на в лагерь емаксеров. Думаю, читателям любопытно, чем вызвана смена редактора. С какими трудностями довелось столкнуться? Не мучает ли ностальгия? :-)

Vim — замечательный редактор, и я продолжаю им пользоваться... просто сейчас мой vim написан на elisp и запускается в Emacs OS :) Мне всегда хотелось добавить к vim чего-нибудь своего, но никогда не было желания изучать vimscript. Emacs позволяет писать расширения на великом lisp-e и, с моей точки зрения, для разработчика расширений он предоставляет куда больше плюшек, чем vim. Хочу порекомендовать всем пользователям vim, которым не хватает мощи emacs, присмотреться к evil-mode — реализации vim внутри emacs :)

Спасибо за ответы. Жди наплыва ниндзя на shelr.tv :-)
Я хотел бы сказать спасибо людям которые помогали советами, поддержкой, плюсами, пакетированием и пулл реквестами:

  • Max Gonzih (pkgbuild для Arch Linux и советы);
  • Alexander Kolesen (ebuild для Gentoo);
  • Vasiliy Ermolovich (патчи и чистка кода);
  • Друзьям из MLUG за советы и идеи
  • Всем, кто твитил и рассказывал про сервис.


И сервис, и клиент распространяются по свободной лицензии (GPL, AGPL), и я буду рад видеть в нашей формирующейся команде новых участников!
Проект на гитхабе:
github.com/antono/shelr
github.com/antono/shelr.tv

Shelr.tv в твиттере:
twitter.com/shelr_tv

Успехов!
Спасибо!

CloudCamp Minsk. Впечатления и мысли — STALKER`s project::Blog

О мероприятии. Если коротко: холивары на тему «что же такое клауд», реклама своих клауд решений, безопасности в клауде достичь тяжело, разжевывание деталей какие бывают клауды, что такое IaaS/PaaS/SaaS, как это может работать. Если честно, то на него можно было не идти если вы представляете что такое облако внутри, т.к. реклама неинтересна и коротка, а холивары [...]

Подписываем исходящие письма с помощью DKIM в Postfix - легко и просто! — SANMAI 三昧



В этом нам поможет замечательный пакет dkim-filter.

# aptitude install dkim-filter
В конец его конфига /etc/dkim-filter.conf дописываем:

Canonicalization    relaxed/relaxed
KeyList         /etc/dkim-keys.conf
Domain *
BodyLengths yes
On-Default tempfail
On-DNSError accept
SignatureTTL 3600
SubDomains yes 
Создадим каталог под ключи:

# mkdir -p /etc/postfix/dkim/
# chgrp postfix /etc/postfix/dkim/
# chmod 750 /etc/postfix/dkim/
# cd /etc/postfix/dkim/
Генерируем ключи для сервера mail.example.com:

/etc/postfix/dkim# dkim-genkey -d example.com -s mail -r
Теперь в mail.txt у нас лежит TXT запись, которую нужно добавить, а в mail.private лежит приватный ключ, который и будет использоваться для подписи писем. Запись, которую нужно добавить, будет вида:

mail._domainkey IN TXT "v=DKIM1; g=*; k=rsa; p=..."
Обязательно нужно удалить расширение у файла с ключом, потому что dkim-filter берёт имя сервера из имени файла ключа:

/etc/postfix/dkim# mv mail.private mail
В файл /etc/dkim-keys.conf записываем какие домены каким ключом нужно подписывать:

*@example.com:example.com:/etc/postfix/dkim/mail
*:example.com:/etc/postfix/dkim/mail
Теперь в /etc/default/dkim-filter объясним dkim-демону где ему ждать подключений:

SOCKET="inet:8891@localhost"
Наконец, добавим в конец /etc/postfix/main.cf:

milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
Не забываем добавить TXT запись и проверить, что она на месте:

# dig txt mail._domainkey.example.com
Теперь перезапускаем postfix и dkim-filter, а затем отправляем тестовое письмо куда-нибудь на Яндекс и наслаждаемся успешным результатом проверки:



Если проверка прошла успешно то стоит запретить другим серверам принимать письма с вашим доменом, но без подписи. Это можно сделать добавив ADSP запись:

_adsp._domainkey IN TXT "dkim=all"

XRandR: настройка режимов работы с дисплеями (мониторами) в GNU/Linux — LinuxNow.ru — всё, что вы хотели бы знать о GNU/Linux

XRandR — расширение X сервера, позволяющее производить настройки режимов работы мониторов. Например, можно изменить разрешение, вывести изображение на внешний монитор, повернуть изображение и тому подобное. Утилита часто полезна для настройки корректного разрешения при подключении к внешнему монитору или телевизору.
vanoc

KDE отключение\настройка тачпада — vanoc.ru » runix

Давно мучал вопрос отключения тачпада при подключенной мышке и вот сегодня дошли руки. Решается все по сути установкой synaptiks. В арче он есть в ауре.

sudo yaourt -S synaptiks

Затем в Служебных находим Touchpad management


Быстро включить тачпад можно из панели задач

Обновление Flash вышло "синим" — Записки

На днях моя Ubuntu 11.10 обновила браузер chrome до версии 18.0.1025.142 и flash player до версии 11.2.202.228. В общем-то обычная штатная ситуация, если бы не одно но. Все ролики на youtube (который проигрываются через flash) стали синими. То есть в световой гамме видеороликов стал преобладать синий цвет, при чем сильно преобладать. Люди стали как зомби, синие и страшные. Да что я рассказываю, посмотрите на скриншот.


Такое наблюдается как в chrome, так и в firefox. На других видео сервисах такого не наблюдалось. Примечательно то, что видео с youtube, встроенное в другие сайты показывает нормально, а на самом сайте все синее. Вот два скриншота одного и того же видео с ленты google+ и с youtube.

 Скриншот с ленты google+.

Скриншот с сайта youtube.


Как это лечится ума не приложу. В настройках flash отсутствуют какие-либо пункты про цвета в видео, так же как и в настройках youtube. Для диагностирования проблемы хотелось бы знать, на вышеуказанных версиях chrome и flash у кого-то есть подобные проблемы, или это только у меня? Ну и ваши соображения были бы конечно интересны.

UPD:
Предыдущие версии плагина для тех у кого такая же проблема.
Для chrome
Для firefox

UPD2:
Заинтересованным рекомендую заглянуть на багтрекер. Там предложили еще одно решение. В файл /etc/adobe/mms.cfg (скорей всего файл придется создать самому) нужно добавить строки:

EnableLinuxHWVideoDecode=1
OverrideGPUValidation=true

Как утверждается, проблема решается без отключения аппаратного ускорения. У меня после сего действия некорректно стал работать flash плагин. При попытке просмотра прямой трансляции на sportbox.ru плагин вылетал.

vanoc

Alsa смена звуковой карты — vanoc.ru » runix

Посмотреть номера устройств можно командой aplay -l

Открываем alsa.conf

sudo vim /usr/share/alsa/alsa.conf

Правим строки на нужный номер устройства, который получили из aplay -l

defaults.ctl.card 0
defaults.pcm.card 0

Перезапускаем alsa.

sudo /etc/rc.d/alsa restart

Проверяем

aplay /usr/share/sounds/alsa/Front_Center.wav

Стандартный программный стек для роботов — Журнал Витуса.

http://www.xconomy.com/san-francisco/2012/03/29/can-willow-garages-linux-for-robots-spur-internet-scale-growth/?single_page=true

Интересная мысль, что пора разработать стандартный набор компонент для изготовления роботов, играющий при создании собственных роботов примерно ту же роль, что LAMP (Linux Apache mySQL PHP)-стэк при создании вебсайтов.

Больше ничего не скажу, читайте по ссылке.

This entry was originally posted at http://vitus-wagner.dreamwidth.org/723910.html. Please comment there using OpenID. Now there are comment count unavailable comments

Рву шаблон, качественно, дорого — Aceler online

«Oracle Linux был свободный, а теперь ещё и стал бесплатный».

Этой фразой я сегодня порвал где-то пять шаблонов.

Запись опубликована Aceler online. Вы можете оставить комментарии там, их уже .

Визуализация разработки компилятора GCC в 1989-2012 — Linux Maniacs

Ребята с помощью утилиты Gource визуализировали процесс разработки компилятора gcc. 
На мой взгляд получилось и наглядно и красиво.

<object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://0.gvt0.com/vi/ZEAlhVOZ8qQ/0.jpg" height="266" width="320"><param name="movie" value="http://www.youtube.com/v/ZEAlhVOZ8qQ&amp;fs=1&amp;source=uds"/> <param name="bgcolor" value="#FFFFFF"/> <embed height="566" src="http://www.youtube.com/v/ZEAlhVOZ8qQ&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash" width="620"></embed></object>

GCC - 25 лет. — Linux Maniacs

Ровно 25 лет назад, в далеком 1987 году Ричард Столлман анонсировал первый публичный релиз набора компиляторов GCC.

И к этой знаменательно дате приурочен выход новой версии GCC-4.7.0.

Компилятор GCC-4.7.0 содержит много новых возможностей, которых не было в ветке 4.6.x.
Из основных можно отметить:
  • Транзакционная память.
  • Поддержка большого количества фич стандарта ISO C++11, таких как atomics и новая модель памяти, определяемы пользователем литералы и т.д.
  • Значительно улучшен фреймворк оптимизации на этапе линковки (link-time optimization framework (LTO))
  • Улучшена поддержка расширений формата отладочной информации DWARF ()
  • Добавлена поддержка аппаратных платформ: 
    • Adapteva's Epiphany process
    • National Semiconductor's CR16 
    • TI's C6X 
    • Tilera's TILE-Gx and TILEPro.
    • Intel Haswell
    • AMD Piledriver 
    • ARM Cortex-A7 family.

Более подробно об изменениях можно почитать тут:
http://gcc.gnu.org/gcc-4.7/changes.html

PHP. Фильтрация данных. — Ubuntu days

Многие любители Ubuntu занимаются «для себя» или профессионально веб-программированием, а самым известным и распространенным языком для web-разработки безусловно является PHP. Однако разрабатывая для интернета не стоит забывать о безопасности, а наиболее важным пунктом безопасности web-сайта – это проверка абсолютно всех входящих к базе данных, потому следует всегда перепроверять данные, которые вводятся пользователем в формы поиска, заполнение полей регистрации и тому подобное, на присутствие «опасных» данных.

Например, это может быть, как вредный JavaScript, так и PERL или же PHP команды, однако самыми опасными являются – команды серверу. Рассуждать о вероятностях профессионального хакера, которому подвернулось непроверяемое поле на сайте, бессмысленно, такой профи сможет абсолютно все! Начав с установки редиректа и закончив выводом из строя сервера.

Необходимо всегда помнить, что совершенно любой пользователь – это опасность для уязвимого сайта, оттого необходимо всегда запросы и переменные перепроверять.
Если вы устали от php, то откиньтесь на стул возьмите бутылочку вина, и посетите сайт http://ru.partypoker.com/ именно здесь вы сможете отдохнуть морально, и развеяться мыслями, играя в покер. Покер это замечательная игра, в которую играют сотни тысяч людей по всему миру. И к этим людям сможете присоединиться и вы.

Существующие важнейшие этапы:
Анализирование переменных, а именно массивов GET или POST. Рекомендуется проверять особенно входящие переменные, не пропускайте до работы с запросами и функциями к базе данных еще не перепроверенные, возможно опасные данные от пользователей. Следовательно, все нужное для защиты функции, будут размещены в одном конкретном месте или же файле.

Приведем пример: $a1 = @$_GET["nomer"]; где символ @ используется для пренебрежения интерпритатором ошибок в случаи неимения переменной nomer в массиве GET;

Раздел переменных. Совершенно каждая переменная в скрипте в процессе проектирования уже должна иметь свой стиль, будет это строка или число. Желательнее всего перепроверять переменные на необходимый ей тип, к примеру: тип нашей переменной целое число, и в этом случаи для фильтрации данных довольно произвести приведение переменную $a1 к целостному типу: $a1 = @$_GET ["nomer"]; $a1 = intval ($a1)

К примеру, вредена ввел в строку запроса ?nomer = 43×34 в результате обработки переменная $a1 примет значение 43. Наряду с этим, не стоит забывать о диапазонах значений. При этом необходимо проверить переменную на диапазон. Пускай $a1 будет в пределе от 1 до 100, тогда перепроверка будет такой:

if (($a1<1) | | ($a1>100)) $a1=1;

Так, из данного примера видно, что совершается принужденная установка переменных $a1 со значением 1, в случаи нарушения.
Фильтрация строковых переменных. Особенно опасны текстове переменные, к примеру, поле для ввода поисковой фразы по сайту. Их требуется проверять на наличие вредного кода. Для ликвидации опасности, совершается удаление неких элементов из текста или же замена на другие символы. Зачастую устраняются php-вставки, html-тэги, а также конструкции для изменения запросов к базе MySQL.

Так что всегда предохраняйтесь, дамы и господа, даже программируя ;-)

Перепрошивка TP-Link TL-WR740N v3/v4 — Propheta

На выходных попытался перепрошить свой wifi-роутер потому как надоело пялиться на китайские иероглифы веб-интерфейса. Вот так припаял к схеме провода TX, RX, GND. Воткнул кабель в COM-порт, minicom настроил как написано тут и получил вот такую порнографию:
./!#-������.�..�3��$�I.$�f�.4geii.+.-id4f4fM���...�3��$�I.$.f�.4..��.�r��������~
�_.&H#K.I.I.$M.�%�3���S)R�Ir$��3�fM.=y���e�;!=�..5�.�..��K$J.22rd�..�3��$�I.$�f+
а должно было отобразиться нечто похожее на это:
U-Boot 1.1.4 (Mar  8 2010 - 10:29:42)

AP91 (ar7240) U-boot
DRAM:
sri
#### TAP VALUE 1 = 9, 2 = a
32 MB
id read 0x100000ff
flash size 4194304, sector count = 64
Flash: 4 MB 

Using default environment


Что я сделал неправильно?

Магический "путь" — Всё о Vim

Допустим у вас есть следующая иерархия директорий: . ├── somedir │   └── source.txt └── somedir2 └── 11111.txt тогда, запустив Вим в этом месте, вы можете легко открыть для редактирования файл source.txt, просто набрав: :find sourc<Tab> <Tab> - говорит о возможности автодополнения имени файла! Всё дело в специальной переменной path, установленной в следующее значение: set path=.,,** Эта

Мэтрам django web разработки посвящается — Deepwalker


Я так считаю - любую задачу можно решить на тьюринг полном языке, вопрос в удобстве. Вот одно время программисты писали кругом goto и gosub, а потом пришла к ним мысль, что это не совсем удобно.

Но долгое время в сторону паскаля неслись смешки, и говорили -  нафиг нам ваши break и continue, да я с goto решу выход из цикла на раз, в три раза элегантнее.

А потом как-то обнаружилось, что без goto все таки лучше, а главное нагляднее - не обязательно теперь программу в блок-схемах рисовать, чтобы прикинуть редьку к луку.

Или вот можно писать::

if key in map:
    return map[k]
else:
    return None

А можно элегантнее действовать, можно написать `return map.get(k)`. А говорят еще есть некий монадический Option путь, там вообще трава зеленее. Но `if ... in ...` он проще и понятнее, я if уже двадцать лет знаю и умею, идите нафиг, я еще в великой энциклопедии самого профессора Фортрана читал. Я может потом, как время будет, прочту про хаскель сразу, и не буду писать ни одного `if` при разборе json. Но это конечно как время будет, а то я же человек серьезный, я сайты пишу - много if-ов, некогда мне, некогда.

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

Говорят под нее много приложений, хороших, бери пользуйся. Все написаны метрами, типа меня. Православный goto, if и никакой монадической зауми.

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

ORM слабый? Да пишите SQL уже, как все нормальные мужики. И формы наши эталон, CSRF у них талон, идите нафиг.

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


Но шутки в сторону. Скажите мне замшелые троглодиты из реально нереально серьезной веб разработки, что, экономия на рендере шаблонов это лишнее для проектов с посещаемостью >1000? Более быстрая разработка с более гибким ORM это лишнее? Да вы вообще БД используете, или планируете проект на sqlite запускать в продакшн? Даже обработка URL в Werkzeug быстрее. Можно говорить что где-то это копейки, но когда все копейки собираются во Flask, это уже становится серьезно, мимо проходить уже как-то непрофессионально,
и даже как-то стыдно.

За пределами уютного мирка в злато-зеленых тонах кипит жизнь, возникают новые идеи и инструменты, но всегда есть мэтры, которым некогда улучшать свои навыки - у них 1000 пользователей ждет, когда мэтр напишет все if-ы.

50 бесплатных гигабайт в облаке с доступом по webDAV — LAMERNOTES

Про то, что box.net раздаёт до 23 марта 50 гб халявного места, я уже слышал, но мне это было не нужно, пока я не узнал, что можно логиниться по webDAV. То есть использовать кусок места в облаке как отдельную папку на своём компьютере. Правда для этого для начала надо установить клиент box.net на смарт с андроидом ну или на худой конец на айфон, а потом зарегистрироваться залогиниться через него. При этом вам сообщат, что теперь вы счастливый обладатель 50 гб в box.net.

Потом устанавливаем на компьютер с лучшей операционной системой линукс  davfs.
Обладатели Archlinux делают:
yaourt -Sy davfs2

В /etc/davfs2/secrets вписываем строку вида
https://www.box.net/dav ваше_имя ваш_пароль

а в /etc/fstab одной строкой
https://www.box.net/dav /mnt/точка_монтирования    davfs  
rw,suid,dev,exec,noauto,nouser,async,uid=vinh,gid=vinh  0 0

предварительно создав в /mnt точку монтирования.
И теперь можете монтировать ваше внешнее хранилище
sudo mount /mnt/точка_монтирования

Жаль нет ещё клиента синхронизации, но тут уже cron в помощь.
Опции монтирования подсмотрел тут



<script src="http://odnaknopka.ru/ok2.js" type="text/javascript"> </script>

Андрей Мавлянов

java-package снова в репах Debian! — Digital Activity » Computing

Sylvestre Ledru и Cédric Pineau обновили пакет java-package и вернули его в debian/unstable! Напомню что java-package это набор скриптов призванный запакетировать Oracle Java для Debian. В своё время пакет был удалён из состава Debian и Ubuntu, т.к. Sun выпустила Java … Continue reading

Изменения в блоге - приглашаются авторы — Всё о Vim

Кажется, что пришло время вдохнуть второе дыхание в этот блог и дополнительно пригласить авторов, которые хотят делиться своим опытом использования Вима. На это решение меня натолкнул опыт Михаила Конника aka virens. Итак, если вам есть, чем поделиться с другими опытными и не очень виммирами, то пишите на почту. В идеале хотелось бы набрать команду  из 3-5 человек, которые наполняли бы этот блог

openSUSE, Kiwi добавляет поддержку загрузки fromiso — О Линуксе и не только » runix

Напомню, для тех немного «не в теме» про то, что такое загрузка fromiso/isofrom. Это — очень полезная опция для тестирования Live CD/DVD.

Grub2 «умеет» монтировать ISO образы и «доставать» из них файлы ядра и initrd. Потом управление передается извлеченному ядру, и система грузится дальше. С этим понятно, загрузочные скрипты отработали свою часть, но как им получить доступ к сжатой Live-системе, которая по-прежнему находится в ISO файле? Вот тут и приходит на помощь опция fromiso. Загрузочный скрипт парсит параметры, переданные ядру при загрузке, находит в них опцию  fromiso, монтирует указанный ISO образ и загрузка продолжается с него.

То есть ставите загрузчик на USB флешку, закидываете на нее же ISO образ Live CD/DVD без распаковки, прописываете необходимые строки в конфигурационном файле Grub 2, и грузитесь без лишних проблем и без траты оптических носителей. Большинство современных и не очень компьютеров умеют загружаться с USB флешки. Удобно ведь, согласитесь.

Эта или похожая опции доступны в Ubuntu (casper), Debian (live скрипты), ArchLinux (archiso).

А вот, собственно, и новость. Недавно в Kiwi, системе сборки образов openSUSE, тоже добавили эту возможность. Эта опция пока не доступна в susestudio.com, но, надеюсь, что скоро появится. Так что собранные с помощью susestudio.com Live CD образы openSUSE будут еще удобнее!

А кто интересуется, подписывайтесь на лист рассылки Kiwi, groups.google.com/group/kiwi-images.

 

Нижний Новгород в погодном апплете Gnome — Bappoy's blog » linux

Для того, чтобы наблюдать погоду в верхней панели, всю жизнь тщательно вбивал координаты нашего нижегородского аэропорта (ICAO: UWGG) в /usr/share/libgweather/locations.xml, т.к. в списке городов Нижнего Новгорода нет и не было, а при вводе «nizh» показывался только Nizhnevartovsk. На прошлой неделе решил окончательно разобраться с этим вопросом и обнаружил, что вместо Нижнего Новгорода нужно искать Стригино — поселок в черте города, поделившийся названием с аэропортом.

Unix — Aceler online

Есть что-то такое… человекочитаемое в команде watch who.

Запись опубликована Aceler online. Вы можете оставить комментарии там, их уже .

Андрей Мавлянов

Firefox/stable ppa уходит на покой на следующей неделе — Digital Activity » Computing

Крис Коулсон (en: Chris Coulson), один из ведущих мантейнеров пакетов Mozilla в Ubuntu, сообщил о скором закрытии PPA для стабильного релиза Firefox. Отныне самая последняя стабильная версия этого браузера будет доступна прямо в main репозитарии всех поддерживаемых в настоящем времени … Continue reading

SamaraPy — Deepwalker

Зависть великая штука. Побывав на PyConUA я заразился чудной атмосферой живого общения с едино и разномышленниками. Я не уверен, что получится в Самаре найти достаточное число участников для SamaraPy, который более будет похож поначалу на KievPy, но я попробую.

Подробности будут тут http://vk.com/club34256705

В конце концов оказался же в этом городе Я!

Showkr - приложение в браузере — solovyov.net

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

Зачем

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

А тут, получается, открыл, дождался ответа апи фликра, и сиди себе просматривай, оно всë на одной странице. Тем более, что созданы все удобства - фотки, комментарии и хоткеи: поддерживается всë, что имеет хоть какой-то смысл - j/k, up/down, space/shift+space. Welcome!

Как

Первый момент, который мне сохранил кучу времени - это Twitter Bootstrap. Тут мне рассказывать особенно нечего, если вы его не знаете - теперь будете знать. Хороший CSS framework, экономит тучу времени.

Make

Второй момент - GNU Make. Я никогда толком не умел писать мейкфайлы - был испуган в детстве результатами запусков autoconf/automake. Но какое-то время назад я начал юзать мейкфайлы, как рубисты юзают рейк - для каких-то мелких задачек. Чисто как организатор шелл-команд, короче.

Но какое-то время назад я понял, что пришла пора. CoffeeScript хочет стать джаваскриптом, темплейты хотят стать джаваскриптом, индекс.хтмл хочет быть разным для разработки и работающего сайта, и все они не хотят это делать, когда не нужно (например, во время отдачи сайта - зачем, если всë можно сделать заранее?).

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

Основы

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

SOURCE = $(wildcard app/*.coffee)

И правило, чтоб их скомпилить:

build/%.js: app/%.coffee
    @mkdir -p $(@D)
    coffee -pc $< > $@

Всë это выглядит немного стрëмно, но я сейчас объясню, а с внешним видом можно жить - это на самом деле довольно неплохой DSL, хотя можно и поприятнее сделать было бы. В мейкфайле есть:

  • переменные
  • функции
  • правила

Всë остальное пока не волнует. У нас здесь есть переменная SOURCE, которой присваивается результат исполнения функции wildcard. И переменные, и функции раскрываются с помощью оборачивания в конструкцию $(...) (исключая однобуквенные переменные, тогда просто $x). Функции, конечно, еще параметров хотят.

Нечто с двоеточием и строками с отступами - это правило. Говорит нам, что файл, который заканчивается на .js и находится в директории build/, зависит от файла с точно таким же именем, только в директории app/ и с расширением .coffee.

В правиле есть две инструкции. Эти инструкции - это вызов обычных команд, причëм каждая инструкция запускается в своëм инстансе шелла (переменные не сохраняются). Каждая инструкция во время выполнения выводится на экран как команда, или, если она начинается с @ (как наш мкдир) - не выводится.

Еще мейк внутри правила даëт какое-то количество переменных с видом разной степени стрëмности. $@ - файл-цель (который мы хотим получить), $< - его первая (здесь - и единственная) зависимость. $(@D) - родительская директория файла-цели. Я забил на слежение за тем, чтоб директории были созданы заранее, и просто создаю их в каждом правиле, которое пишет в файлы, первой строкой. Паттерн "хватит беспокоиться". ;)

И теперь мажорный аккорд, правило, которое заставит это работать:

all: $(patsubst app/%.coffee, build/%.js, $(SOURCE))

Это правило идëт первым, чтоб запуск просто make запускал его, и говорит нам, что правило all зависит от таких-то файлов (а правило для постройки этих файлов мы определили выше по тексту). От каких файлов - от всего в $(SOURCE), только надо заменить app на build, а coffee на js - ну, понятно, компиляция зависит от того, чтоб в директории билд были все нужные джаваскриптовые файлы. А каждый файл зависит уже (определили раньше) от кофескриптового.

Теперь запуск make в директории скомпилирует каждый файл в джаваскриптовый. Кроме того, если еще раз запустить make, то он запустит обработку только тех файлов, которые изменились - он смотрит на время изменения файла и не делает лишних движений.

Казалось бы, зачем это надо, если coffee -bco build/ app/ сделает то же самое. Ну, во-первых, то же самое он не сделает - он не следит за временем изменения, а компилирует всë (и всего может случайно стать много), а во-вторых, не кофескриптом единым! Но не будем забегать вперëд.

Зачистка

Итак, у нас есть первая инкарнация мейк-файла:

SOURCE = $(wildcard app/*.coffee)

all: $(patsubst app/%.coffee, build/%.js, $(SOURCE))

build/%.js: app/%.coffee
    @mkdir -p $(@D)
    coffee -pc $< > $@

Что тут неплохо бы подчистить? Ну, нам не нужен список исходных файлов. Только результатов, поэтому заменим начало на такое:

SOURCE = $(patsubst app/%.coffee, build/%.js, $(wildcard app/*.coffee))

all: $(SOURCE)

Ещëëë

Теперь проще понять, чего хочет главное правило - оно хочет исходники! Ок, понятно. Чего еще нам надо? Нам надо вот это всë динамически сгенерированное запихать в index.html.

Маленькое отступление: фактически в showkr'e у меня не используется require.js, потому что мне лень скрещивать ender с ним, а потому загрузка модулей синхронна и все файлы хотят быть загружены прямо из индекса. В ином случае этого бы момента не было и индекс был бы статическим, но, мне кажется, это хороший повод порисовать еще правил. Итак.

Для начала наше главное правило захочет еще index.html:

all: $(SOURCE) build/index.html

Что делать с индексом? Я решил не ломать себе мозги, а взять awk (еще одна штука, про которую стоит знать) и... В общем, индекс выглядит как-то так:

...
<head>
...
<!-- js-deps -->
</head>
...

И у меня есть прекрасный скрипт на awk, который берëт переменную DEPS из окружения (со списком зависимостей) и влепляет в хтмл:

/<!-- js-deps -->/ {
    split(ENVIRON["DEPS"], DEPS)
    # this way it goes from 1 to 9 instead of random ordering
    for (i = 1; DEPS[i]; i++)
        printf("<script type=\"text/javascript\" src=\"%s\"></script>\n", DEPS[i])
    next
}

1 # print everything else

Я мог бы расписывать, как работает авк, но давайте вы лучше почитаете на английском, на русском, или вообще что-нибудь еще.

Правило при этом для постройки индекса выглядит так:

build/index.html: index.html $(SOURCE)
    @mkdir -p $(@D)
    DEPS="$(SOURCE:build/%=%)" awk -f build.awk $< > $@

Что у нас новенького? Ну, убираем имя директории, ссылаясь на переменную с заменой (аналогично тому $(patsubst ...), что мы использовали раньше). Вроде всë, создали директорию, авк прочитал файл, изменил, мы его направили в нашу цель ($@ == build/index.html). Красота.

Теперь make при запуске сначала скомпилирует наш кофескрипт (если надо), а потом index.html. Ура.

Публичная версия

А теперь надо собрать версию для сайта - один джаваскриптовый файл. Отлично:

prod: all prod/app.js prod/index.html

prod/index.html: index.html
    @mkdir -p $(@D)
    DEPS="app.js" awk -f build.awk $< > $@

prod/app.js: $(SOURCE:build/%=prod/%)
    @mkdir -p $(@D)
    cat $^ | uglifyjs > $@

Теперь make prod возьмëт все зависимости prod/app.js (вспомните, $^ - это все зависимости правила) и минифицирует их в нужный нам файлик. И скомпилирует еще index.html.

Надо сказать, что меня эти замены директорий в переменных серьëзно раздражают, поэтому мы сейчас этот момент зачистим. Итак, результат трудов вместе с зачисткой:

SOURCE = $(patsubst app/%.coffee, %.js, $(wildcard app/*.coffee))

all: $(addprefix build/, $(SOURCE) index.html)

build/%.js: app/%.coffee
    @mkdir -p $(@D)
    coffee -pc $< > $@

build/index.html: index.html $(addprefix build/, $(SOURCE))
    @mkdir -p $(@D)
    DEPS="$(SOURCE:build/%=%)" awk -f build.awk $< > $@

prod: all $(addprefix prod/, app.js index.html)

prod/index.html: index.html
    @mkdir -p $(@D)
    DEPS="app.js" awk -f build.awk $< > $@

prod/app.js: $(addprefix prod/, $(SOURCE))
    @mkdir -p $(@D)
    cat $^ | uglifyjs > $@

Может, еще немножко?

Вот такой отличный мейкфайл. А теперь добавим сюда темплейты! Они лежат в директории app/templates и имеют расширение .eco, а результаты будут иметь расширение .eco.js (чтоб отличать от просто .js).

TEMPLATES = $(patsubst app/%, %.js, $(wildcard app/templates/*.eco))

all: $(addprefix build/, $(TEMPLATES) $(SOURCE) index.html)

build/templates/%.js: app/templates/%
        @mkdir -p $(@D)
    ./eco.js $< $(<:app/%=%) > $@

prod/app.js: $(addprefix prod/, $(TEMPLATES) $(SOURCE))
    @mkdir -p $(@D)
    cat $^ | uglifyjs > $@

Здесь ./eco.js - самописный скрипт для вызова компиляции эко-темплейтов, который применяет к результату нужную мне обëртку. Первым параметром у него путь к файлу, а вторым - имя, под которым темплейт будет известен (templates/something.eco). Темплейты будут сминифицированы в один файл с приложением.

Важные моменты

У меня важен порядок файлов джаваскриптовых, поэтому я просто задаю их руками:

SOURCE = $(patsubst %,%.js,util api models viewing browsing showkr)

А выше показан вариант относительно того, когда устраивает сортировка по алфавиту.

Функция wildcard не умеет рекурсивно находить файлы, поэтому если есть поддиректории в структуре, то я использую $(shell find ...) - обычный find.

Ну вот и всë, надеюсь, что какие-то базовые основы я рассказал понятно, а полный код Makefile'а (ссылка стоит на ту версию, которая существовала на момент написания статьи) можно найти в репозитории.

Архитектура

Вернëмся к собственно самому приложению. Оно построено на backbone.js, который сейчас самая модная библиотека для мвц на джаваскрипте, наверное. Бэкбон стоит того - он не пытается скрыть детали имплементации (как эмбер, например - его я тоже пробовал), но организует всë отлично.

Ядро

Центральная часть приложения - Router Showkr. С его инициализацией запускается приложение.

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

Остальное

А дальше всë банально - вьюхи инициализируют модели и внутренние вьюхи, модели качают данные с фликра (используя переопределëнные методы sync и parse).

У большинства моделей есть какая-нибудь вложенная коллекция, поэтому получилась иерархия User -> SetList -> Set -> PhotoList -> Photo -> CommentList -> Comment. Вложенные коллекции инициализируются в инициализации модели, fetch запускается там, где это имеет больше смысла - фотки качаются сразу после того, как скачался сет, а комментарии - после того, как отрисовалась фотография.

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

Эпилог

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

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

Свежие обои — K Notes

Завершился очередной конкурс на лучшие новые обои для KDE SC. Жюри из Nuno Pinheiro, Ingo «neverendingo» Malchow и Lydia «Nightrose» Pintscher отобрали шестерых победителей, которые войдут в KDE SC 4.8.

Первым стал Storm от Marco Oggioni, который вошёл в состав «погодных» обоев из KDE Artwork (кстати, туда же переехала часть старых обоев из kde-wallpapers):

Storm (Marco Oggioni)

Эти пять пополнили «изкоробочную» поставку:

Azul (Davide Bettio)

Castilla Sky (Luiz Bettoni)

Flying Field (Luiz Bettoni)

Fog on the West Lake (Vimac)

Ну а этот представитель минималистичного абстракционизма будет новым фоном по умолчанию для следующей версии KDE SC:

Ariya (Eshat Cakar)

Синтаксис команды route в Android — Propheta

  • route add default dev DEVICE
  • route add default gw IP dev DEVICE
  • route add -net IP netmask NETMASK gw IP
Нашел здесь: zecke.blogspot.com

Павел Вязовой

Альт Линукс vs Ubuntu — Unix way

Очень интересный опыт у меня был сегодня с этими дистрибутивами.
Вчера Марина купила мне нетбук и мне нужно было протестировать его на совместимость с Linux. Если бы он провалил проверку - отправился бы обратно в магазин.
Интересное в этой истории то, что уже из отзывов на сайте магазина можно узнать, что в нём не работает тачпад в Ubuntu, да и в других дистрибутивах тоже. Это я и собирался проверить.
Для проверки решил скачать и установить на него свежий Ubuntu 11.10.
Диагноз:
  1. тач действительно не работает
  2. wifi не работает при первом подключении
  3. bluetooth-адаптер не обнаружен
  4. разрешение дисплея только 1024x768 и 800x600
Последовательная проверка в других дистрибутивах (Arch, Fedora, Meego) выявила то, что тачпад работает только в Meego. Разница заключалась в том, что везде тач определялся как PS/2 mouse, а в Meego - IMPS/2 Mouse.
В результате выяснилось что тачпад работает, если модуль psmouse загружать с параметром proto=imps.
Но остальные проблемы оставались нерешенными в Ubuntu и я решил попробовать Simply Linux, который я уже использую на других машинах.
И вот что получилось с Симпли:
  1. проблемы с wifi нет
  2. bluetooth работает, хоть и не выключается кнопкой на клавиатуре (наверняка поправимо)
  3. разрешение ок
  4. даже тачпад работает из коробки!
Вот так порадовал меня Симпли. Сейчас обновлю его до сизифа и хорошо если ничего из этого списка не отвалится.

P.S. Это очень неплохой нетбук - матовый экран, отличная картинка, приятная клава с крупными кнопками, неплохая емкость батарейки.

Ищем JavaScript-программиста — solovyov.net

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

Мы пишем (модное ;) приложение, которое объединяет чат, location-based сервисы и т.п. Работает на мобильных устройствах и в браузере (сюда и нужен разработчик), бэкенд на Erlang/XMPP.

Плюсы:

  • офис в центре Киева, на улице Чапаева (м. Золотые Ворота/Университет) - зелено (летом, хе-хе), тихо, близко ко всему;
  • удобные стулья и хорошие столы;
  • приятная зарплата (от $2,5k);
  • Backbone.js, CoffeeScript;
  • основатель - из Малайзии, есть отличная от нуля вероятность командировки;
  • нас трое в команде, так что вы не будете мелким незаметным винтиком. ;)

Чего хочется от вас:

  • знания джаваскрипта - не обязательно знать каждый мелкий подлый момент, но что такое контекст исполнения функции и как работает объектная система знать нужно;
  • какого-никакого умения написать немного CSS'a - у нас нет выделенного верстальщика и пока что обходимся своими скромными силами;
  • понимания, что такое MVC, для чего оно нужно, etc;
  • знание Backbone.js - плюс (я понимаю, что коммерческого опыта может и не быть, но если вы хотя бы его видели, я буду рад);
  • само-собой, какой-никакой английский.

Если вам кажется, что вы подходите, пишите:

alexander@solovyov.net

Если вы опытный программист, но JS - не ваш основной язык, и вам интересно, пишите всë равно. :) И если у вас есть еще вопросы, тоже пишите.

Удобный Okular — K Notes

Продолжаем рассказ о победном шествии разработчиков KDE против застарелых проблем и недостающих функций в своих приложениях. Сегодня на очереди Okular — универсальный просмотрщик документов PDF, DjVu, PostScript, ODT и других.

Выдели это!

Да-да, то, что мы так долго ждали, наконец-то появилось! Благодаря работе, проделанной Mahfuzur Rahman Mamun в рамках GSoC2011, Okular теперь правильно выделяет и копирует многоколоночный текст.

Слева — как было, справа — как стало

Заодно решилась проблема с невыделяемыми пробелами в DjVu:

Было

Стало

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

Настрой это!

Надоело, что все новые документы открываются со включённой подгонкой по ширине? Хочется уменьшить шаг прокрутки по PgUp/PgDown? Или включить отображение имени файла в заголовке окна?

Теперь всё это перестало быть проблемой:

Перейди на это!

Довольно часто в Сети попадаются PDF, содержащие т.н. метки страниц. Они являются частью стандарта PDF и позволяют организовать собственную нумерацию страниц (например, пропустить обложку и оглавление), использовать буквы вместо цифр и т.п.

И вот, новая версия Okular также обзавелась поддержкой этих меток. Достаточно открыть любой содержащий их документ, и панель номера страницы станет выглядеть вот так:

Протестируй это!

Наконец, на это неделе произошли ещё три крупных обновления. Во-первых, был принят патч, улучшающий отклик интерфейса при отрисовке «тяжёлых» страниц. Во-вторых, реализация многопоточности была перемещена из бэкенда PDF/poppler в общий код (никаких новшеств, просто рефакторинг).

Третье и самое крупное обновление, как это ни парадоксально, никак не отразиться на пользователях Okular, но зато наверняка понравится пользователям Kile (редактора TeX для KDE). Оно сделало Okular KPart очень удобным инструментом для показа превью генерируемого документа. Например, появилась подсветка (пока очень простенькая) редактируемого участка:

На этом всё. Скачивайте последние версии, изучайте, тестируйте и помогайте разработчикам в нахождении ошибок.

Ах да, всё вышеперечисленное мы увидим в KDE SC 4.8.

Релиз Trinity 3.5.13 (форк KDE3), установка на Debian Squeeze, обновление — RU Linux

KDE Trinity
1 ноября вышел KDE 3.5.13 Trinity. На зеркалах пока не все пакеты. Поставил из Nightly Builds.

Обновлялся с 3.5.12, предварительно накатил 300+ накопившихся апдейтов стабильной версии Debian прямо из иксов, включая ядро, сами иксы и aptitude, который обновил себя же :) Ощутил разницу в upgrade, которые предлагает aptitude и apt-get -- первый отследил ненужные более по зависимостям пакеты и предложил сразу удалить их, не стал обновлять некоторые пакеты, которые позже оказались ненужными и были удалены вручную. После рестарта пришлось заменить в логин-скрине тип сессии с Default на TDE, остальное все сразу заработало без глюков и донастройки. А в вашем дистрибутиве Linux как дела с апдейтами?

Блог: RU Linux

Введение в прикладное программирование под GNU/Linux — Случайные заметки

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

Аудитория

Эта статья расчитана на два вида читателей. Во-первых, это люди, имеющие опыт программирования под MS Windows, но не имеющие такого опыта под GNU/Linux. Во-вторых, это люди, не имеющие опыта программирования вовсе. Однако, я предполагаю, что читатель в общем знаком с общепринятой в программировании терминологией, и ему не нужно объяснять, например, что такое «программа», «функция», «компилятор» или «отладка».

Средства разработки

Я буду рассматривать разработку с использованием тех средств, которые являются наиболее «родными» для GNU/Linux. К ним относятся:

  • Язык программирования C

  • Командная оболочка bash

  • Текстовые редакторы Vim и Emacs

  • Компилятор GCC

  • Отладчик GDB

  • Утилита для сборки проекта GNU make

  • Система управления версиями Git

  • Оконная система X11

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

Языки программирования

Наиболее «родным» языком программирования для GNU/Linux является C. Это обусловлено следующими факторами:

  • GNU/Linux заимствует многие идеи (практически, идеологию) операционной системы UNIX;

  • Операционная система UNIX была написана на языке C (собственно, этот язык создавался именно для написания этой ОС);

  • Соответственно, ядро Linux и системное окружение GNU написаны тоже на C.

Ниже я буду рассматривать разработку с использованием языка C. Однако, этот выбор не является догмой. Другими популярными при разработке под GNU/Linux языками являются C++, Python, Perl. Конечно, могут использоваться и любые другие языки.

Среда разработки

В течение последних двух десятилетий очень широкое распространение получили т.н. IDE — интегрированные среды разработки. Такая среда включает в себя текстовый редактор, компилятор, отладчик, средства сборки проекта и мн.др. Такие среды есть и под GNU/Linux (наиболее популярны Eclipse, NetBeans, IDEA, KDevelop, Anjuta). Однако, история разработки под UNIX-подобные системы показывает, что IDE не являются не только единственным, но и наиболее эффективным средством разработки. Практически, правильный ответ на вопрос «какая самая лучшая IDE под GNU/Linux» — это «GNU/Linux это и есть IDE».

Часто можно встретить мнение, что большой проект без IDE разрабатывать невозможно. Это мнение легко опровергается. Первые версии UNIX писались даже не в Vim (его тогда ещё не было), а в Ed. Это так называемый «построчный» текстовый редактор, в котором вы можете редактировать за раз только одну строку текста. Весь файл на экране не отображается. В случае с UNIX по-другому и быть не могло — у разработчиков не было никаких экранов, а общение с системой осуществлялось при помощи телетайпов. Современное ядро Linux пишется в основном в редакторах Emacs и Vim.

Многие утилиты UNIX вызывают «текстовый редактор по умолчанию». Команда, запускающая текстовый редактор по умолчанию, берётся из переменной окружения $EDITOR. Некоторые утилиты смотрят сначала в переменную $VISUAL, и, лишь если она не установлена, в переменную $EDITOR. Это исторически сложившееся поведение: к старым компьютерам зачастую не было подключено никакого дисплея, а только телетайп, поэтому запускать экранный (визуальный) редактор смысла не было. В современных дистрибутивах обычно по умолчанию оказывается EDITOR=vi или EDITOR=nano. Указать использование другого редактора для одной команды можно так:

EDITOR=emacs some-command

Чтобы использовать нужный редактор по умолчанию всегда, нужно добавить в файл ~/.profile строчку типа

export EDITOR=emacs

Исторически сложилось так, что «настоящими» текстовыми редакторами для программистов являются только Vim и Emacs (просто из-за того, что у них самая долгая история развития именно в качестве текстовых редакторов для программистов). Остальные редакторы находятся в положении догоняющих.

Командная оболочка

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

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

ОС семейств DOS и Windows заимствовали некоторые функции командной оболочки из UNIX, однако их авторы пошли на существенные упрощения, из-за чего функционал COMMAND.COM и cmd.exe получился сильно урезанным. PowerShell вполне на уровне, но работает существенно по-другому.

В рамках этой статьи я ограничусь использованием командной оболочки bash (как наиболее распространённой и используемой по умолчанию в большинстве дистрибутивов) для запуска компилятора и других средств разработки. Хороший обзор использования командной оболочки можно найти, например, в известной книге [kernigan_pike].

Документация

Все средства разработки и библиотеки в GNU/Linux обычно довольно хорошо документированы. Традиционно для документации используется специальный формат и утилита для его просмотра — man. Документация в системе делится на несколько разделов:

  1. Команды пользователя (например, ls, gcc или man)

  2. Системные вызовы — API ядра ОС

  3. Библиотечные функции

  4. Драйвера и т.п

  5. Форматы файлов

  6. Игры и т.п

  7. Различные обзоры подсистем

  8. Команды, используемые для системного администрирования

Для вызова раздела документации по имени нужно указать это имя при вызове команды man (например, man ls). Иногда разделы с одинаковым названием есть сразу в нескольких разделах документации документации. Указать конкретный раздел можно при вызове man (например, man 3 printf).

Более подробную информацию о справочной системе man см. в man man.

Утилиты системного окружения GNU часто используют для документации формат info. См., например, info Coreutils.

Компилятор

Сейчас существует много компиляторов языка C, более-менее совместимых с различными стандартами. Тем не менее, пока что в среде GNU/Linux наиболее применимым остаётся компилятор C, входящий в комплект GNU Compilers Collection (GCC). Этот компилятор, кроме стандарта C, поддерживает некоторое количество расширений стандарта. Эти расширения, в частности, широко используются в исходных текстах ядра Linux. В последнее время появляются компиляторы, способные скомпилировать ядро Linux (например, llvm-clang, или EKO).

Компилятор GCC запускается из командной оболочки командой вида

gcc [OPTIONS] program.c

где program.c — имя входного файла. Кроме того, по стандарту POSIX, компилятор может быть запущен командой cc program.c (cc — от "C compiler").

При обычном запуске компилятор пытается создать исполняемый файл. По умолчанию, выходной файл называется a.out (такое название осталось от древних версий UNIX). Другое название можно задать с помощью опции компилятора -o, например,

gcc -o program program.c

При сборке программы из нескольких модулей компилятору можно подавать на вход несколько исходных файлов или файлов объектного кода, например,

gcc -o program main.c module1.o module2.o …

Чтобы только скомпилировать один исходный файл в объектный код (не пытаясь собрать исполняемый файл), нужно дать команду вида

gcc -c module.c

(имя выходного файла по умолчанию будет module.o).

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

Статическая библиотека в UNIX-подобных системах представляет собой архив (старинного формата ar), включающий набор объектных файлов. Такой архив создаётся командой вида

ar r libsomething.a module1.o module2.o …

Имена файлов библиотек традиционно начинаются с префикса lib.

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

gcc -shared -o libsomething.so module1.c module2.c …

Для использования библиотеки при сборке программы её нужно указать компилятору при помощи опции -l, например

gcc -o program -lm program.c

(здесь будет использоваться файл библиотеки libm.so, префикс lib компилятор подставляет по умолчанию). По умолчанию компилятор собирает программу, использующую динамические библиотеки. Если нужно использовать статические версии библиотек, компилятору нужно указать опцию -static.

Подробную информацию об опциях gcc см. в man gcc.

Hello, world!

Считается, что традиция начинать изучение языка программирования с написания программы, выводящей строку "Hello, world!", пошла с книги Кернигана и Ричи "Язык C" [kernigan_richie]. В случае с языком C эта программа выглядит следующим образом:

#include <stdio.h><stdio.h>

int main(int argc, char* argv[]) {
printf("Hello world!\n");
return 0;
}
</stdio.h>

Чтобы запустить эту программу, этот текст нужно записать в файл с именем, скажем, hello.c, и из директории, в которой расположен этот файл, дать команду вида

gcc -o hello hello.c

Впрочем, в случае такой простой программы достаточно дать команду

make hello

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

./hello

Порядок сборки

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




На входе компилятор имеет в общем случае набор файлов с исходными текстами. Перед началом собственно компиляции эти файлы обрабатываются т.н. препроцессором (программа cpp). Главная функция этой программы — выполнение директив вида #include <stdio.h></stdio.h>. Встретив такую директиву, препроцессор вставляет содержимое указанного файла (в данном случае, stdio.h) на место этой директивы. Препроцессор понимает ещё некоторые директивы, но сейчас на них останавливаться я не буду.

После препроцессора выполняется собственно компиляция. Из исходных файлов на этом этапе получаются т.н. объектные файлы. Это файлы, содержащие исполняемый машинный код, но ещё не готовые для запуска. Главное, чего в них недостаёт — это адреса вызываемых библиотечных функций. Например, код функции printf() содержится в библиотеке libc. А в объектном файле содержится только имя этой функции. Кроме того, объектный файл содержит имена всех объявленных в нём функций.

Объектные файлы, а также используемые библиотеки подаются на вход компоновщику (программа ld). Компоновщик ищет все вызываемые из различных объектных файлов функции (по именам) в объектных файлах и в библиотеках. Если все функции найдены, то компоновщик собирает собственно исполняемый файл. При этом имена вызываемых функций заменяются на конкретные адреса памяти. В случае использования динамической библиотеки имя используемой функции остаётся, и к нему добавляется имя файла динамической библиотеки, в которой при запуске программы нужно будет искать эту функцию.

Собственно программа gcc представляет собой так называемый драйвер (driver). Она запускает упомянутые выше программы (или только некоторые из них, в зависимости от опций), чтобы получить исполняемый файл.

Второй пример: решение квадратных уравнений

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

#include <stdio.h><stdio.h>
#include <math.h><math.h>

/* solve: calculate roots of square equation.
* a, b, c are coefficients in equation.
* Roots would be stored at x1, x2.
* Return value: count of real roots.
*/
int solve(double a, double b, double c,
double* x1, double* x2) {
double D = b*b - 4*a*c;
double sqrtD;

if (D > 0) {
sqrtD = sqrt(D);
*x1 = (-b - sqrtD)/(2.0 * a);
*x2 = (-b + sqrtD)/(2.0 * a);
return 2;
} else if (D < 0)
return 0;
else {
*x1 = -b/(2.0*a);
return 1;
}
}

int main (int argc, char* argv[]) {
double a,b,c;
double x1, x2;
int roots_count;

// Input coefficients
printf("A: ");
scanf("%lf", &a);
printf("B: ");
scanf("%lf", &b);
printf("C: ");
scanf("%lf", &c);

// Solve the equation
roots_count = solve(a,b,c, &x1, &x2);

// Output results
switch (roots_count) {
case 0:
printf("No (real) roots.\n");
break;
case 1:
printf("One root: %0.4lf\n", x1);
break;
case 2:
printf("Two roots: %0.4lf and %0.4lf\n",
x1, x2);
break;
}

return 0;
}

</math.h></stdio.h>

По аналогии с предыдущим примером, запишем этот текст в файл square.c и попытаемся скомпилировать его командой

gcc -o square square.c

Но на этот раз мы получим ошибку примерно такого вида:

/tmp/cc6RNFIi.o: In function `solve': square.c:(.text+0x6d): undefined reference to `sqrt' collect2: ld returned 1 exit status

В чём здесь дело? Ясно, что компилятору почему-то не понравился вызов функции sqrt(). Причём, он жалуется уже не на файл исходного кода, а на объектный файл (вот этот cc6RNFIi.o). Это означает, что исходный файл благополучно скомпилировался, а проблемы возникли на стадии компоновки (что можно видеть и по упоминанию в тексте ошибки программы ld — это стандартный в GNU/Linux компоновщик). Компоновщик не смог найти функцию sqrt(). В данном случае, это произошло из-за того, что эта функция содержится в библиотеке libm, а мы не просили компилятор использовать её. Чтобы избавиться от этой ошибки, нам нужно изменить команду компиляции на следующую:

gcc -o square -lm square.c

Такая команда должна отработать без ошибок и создать исполняемый файл square.

При сборке любой достаточно сложной программы нам придётся использовать несколько библиотек, и, возможно, понадобится указывать ещё какие-то опции компилятору. Команда может получиться довольно длинная. Что же, каждый раз набирать её вручную? Нет. Один из принципов философии UNIX гласит: «Всё, что может быть автоматизировано, должно быть автоматизировано». Здесь нам пригодится одна из древнейших UNIX-утилит — программа make. Чтобы воспользоваться ею, нужно написать файл с именем Makefile (в той же директории, что и наш исходный файл) со следующим содержимым:

square: square.c         $(CC) -o $@ -lm $<

Теперь собрать исполняемый файл можно просто дав команду make. Как это работает?

Make

Утилита make предназначена для сборки программ (хотя может использоваться для автоматизации многих других похожих задач). Она читает файл с именем Makefile и видит в нём набор правил. Каждое правило определяет три вещи: цель (goal, т.е. то, что нужно собрать), список исходных файлов и набор команд, которые нужно выполнить, чтобы собрать цель из исходных файлов. В примере выше, square — это имя цели, square.c — единственный в данном случае исходный файл (если их несколько, они перечисляются через пробел), а вторая строчка — команда. В команде могут использоваться переменные. Некоторые из переменных имеют специальное значение. В частности, в любом правиле $@ обозначает имя цели, а $< — первый исходный файл. Переменная $(CC) указывает на компилятор C, используемый в системе по умолчанию (в большинстве случаев это gcc, но бывает и что-нибудь другое).

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

%.o: %.c   $(CC) -c $<

обозначает, что файлы с именем, заканчивающимся на .o, нужно собирать из соответствующих файлов с суффиксом .c.

Кроме того, make заранее знает некоторое количество правил по умолчанию. Среди них есть упомянутое в последнем примере, а также правило

%: %.c   $(CC) -o $@ $<

Благодаря этому правилу, в примере с «Hello, world!» просто команда make hello запускала cc -o hello hello.c.

По набору правил make составляет граф зависимостей целей друг от друга и от исходных файлов, и выполняет только те команды, которые нужны для сборки цели, указанной в командной строке. Если не указано никаких целей, то собирается первая цель, описанная в Makefile.

Более подробную информацию об этой утилите см., например, в man make.

Управление версиями

Для управления версиями исходного кода может использоваться любая VCS. Однако, раз уж мы говорим о GNU/Linux, рассмотрим вкратце систему, используемую для разработки ядра Linux: git. По git существует довольно обширная документация, в т.ч. и на русском языке. См. например, мою статью [vcs_git] или известную серию статей [los-t_git].

Для начала использования git нужно создать репозиторий — хранилище для версий файлов. Это делается командой

git init

Теперь можно добавлять файлы в репозиторий. Но нам не нужно отслеживать версии некоторых файлов, а именно: объектных файлов и исполняемых файлов. Чтобы сразу исключить их из рассмотрения git, напишем файл .gitignore следующего содержания:

*.o square hello

Теперь команда

git add .

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

git commit

По этой команде откроется текстовый редактор по умолчанию. Тут нужно будет написать комментарий к коммиту. В данном случае достаточно строчки типа «Initial commit».

Отладка

Для отладки в Linux используется отладчик gdb. Но сначала, для того, чтобы программу было удобно отлаживать, её нужно скомпилировать с опцией -g. Сейчас нам достаточно изменить Makefile, приведя его к виду

square: square.c         $(CC) -o $@ -lm -g $<

и пересобрать программу.

При обычной компиляции в исполняемый файл не попадают имена функций, переменных и т.п. Опция -g указывает компилятору, что эту информацию нужно записать в соответствующую секцию исполняемого файла. Кроме того, с этой опцией в исполняемый файл записывается информация о соответствии смещений и номеров строк в исходном файле.

Отладка запускается командой вида

gdb ./square

Если отлаживаемой программе нужно передать какие-то опции командной строки, их можно указать здесь же:

gdb ./some-program -a -b

При запуске отладчика появляется приглашение командной строки вида:

GNU gdb (GDB) 7.2-ubuntu Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http: html="" licenses="" org=""> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.  Type "show copying" and "show warranty" for details. This GDB was configured as "i686-linux-gnu". For bug reporting instructions, please see: <http: bugs="" gdb="" org="" software="">... Reading symbols from /home/portnov/LUG/src/square...done. (gdb)</http:></http:>

Работа с отладчиком, в общих чертах, напоминает работу с командной оболочкой. Вы вводите команды, отладчик их исполняет. Как и в командной оболочке, работает автодополнение команд по клавише Tab. Кроме того, для краткости можно сокращать команды до первых нескольких букв — лишь бы избежать неоднозначности.

К наиболее часто используемым командам относятся:

list

Напечатать очередной кусок исходника (печатается 10 строк). Можно указать конкретные номера строк после имени команды, например l 10,15.

run

Запустить программу на выполнение под отладчиком. Программа будет выполняться до ближайшей точки останова, или до конца.

break

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

next

Выполнить одну строку программы.

print

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

display

Добавить выражение к списку постоянно отображаемых. Значения этих выражений будут показываться после исполнения каждой команды. Рядом с каждым выражением печатается его номер в списке. Удалить выражение из списка можно командой undisplay с номером выражения.

quit

Выход из отладчика.

Более подробную информацию по GDB см. в man gdb.

Оконная система X11

Исторически в UNIX не было и не могло быть никакой графической среды, потому что не было графических дисплеев. Графическая среда для UNIX появилась примерно тогда, когда появились распространённые графические дисплеи: в 1984. Сначала она называлась W (от Window), затем её усовершенствовали и назвали следующей буквой алфавита — X, следующая версия называлась X2… Сейчас имеем X11.

X11 представляет собой, прежде всего, сетевой протокол поверх TCP/IP и UDP/IP. У протокола есть клиент и есть сервер. Клиент посылает последовательность запросов вида «нарисуй мне окошко», «нарисуй на нём кнопочку», а сервер их исполняет. Один из главных принципов X11 — «определять механизмы, а не политики». Протокол предоставляет возможность, скажем, рисовать окошки, а как именно они будут отображаться — не определяет.

Наиболее распространённым X-сервером сейчас является Xorg (http://x.org); всё ещё жив XFree86; под Windows актуален Xming; выпускаются аппаратные X-серверы — комплекты «монитор + клавиатура + мышка», в которых поддержка серверной функциональности X11 реализована аппаратно — такие комплекты используются в качестве графических терминалов.

Протокол X11, в отличие от, скажем, HTTP, является бинарным, а не текстовым — это сделано из соображений экономии пропускной способности сетевого соединения и простоты разбора запросов сервером. Но это усложняет создание клиентов этого протокола: собирать замысловатые бинарные X11-запросы заведомо сложнее, чем, например, текстовые HTTP-запросы. Поэтому для написания X-клиентов используются специальные библиотеки функций, формирующих и отправляющих серверу X-запросы. Наиболее распространена библиотека libX11. Более современным вариантом является libxcb.

Запросы X11 весьма низкоуровневые. Например, чтобы реализовать функциональность кнопки, нужно нарисовать в окне прямоугольник, написать в нём текст, ждать в цикле нажатия кнопки мыши, и при каждом нажатии проверять, где щёлкнули — внутри прямоугольника или вне него. Поэтому стали появляться так называемые тулкиты — библиотеки, являющиеся высокоуровневыми обёртками над libX11.

Исторически первым тулкитом был Athena3D. Потом были Motif и Tk. Сейчас наиболее распространены GTK+ и Qt (Qt, строго говоря, представляет собой не X11-тулкит, а многоцелевой кроссплатформенный набор библиотек, который может использоваться в качестве X11-тулкита).

Hello, world на GTK+

В качестве примера рассмотрим следующую программу. Она показывает окно с одной кнопкой. При нажатии на эту кнопку появляется сообщение «Hello, world».

#include <gtk/gtk.h>

// This function displays message dialog.
// main_window parameter should be set to parent window of the dialog.
void message_box (GtkWindow* main_window, gchar *message) {
GtkWidget *dialog, *label, *content_area;

// Create a dialog
dialog = gtk_dialog_new_with_buttons ("Message",
main_window,
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_STOCK_OK,
GTK_RESPONSE_NONE,
NULL);
// Create a label
content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
label = gtk_label_new (message);

// On "response" signal (it's called when user clicks a button in
// the dialog), destroy the dialog.
g_signal_connect_swapped (dialog,
"response",
G_CALLBACK (gtk_widget_destroy),
dialog);

// Add a label
gtk_container_add (GTK_CONTAINER (content_area), label);
// Show the dialog
gtk_widget_show_all (dialog);
}

// Callback for delete-event signal
static gboolean delete_event( GtkWidget *widget,
GdkEvent *event,
gpointer data )
{
// If return TRUE, window will not be closed.
// This may be used to preven closing window in some situations.
return FALSE;
}

// Callback for destroy signal
static void destroy( GtkWidget *widget,
gpointer data )
{
// End main GTK+ event loop
gtk_main_quit ();
}

// Callback for button click
static void hello ( GtkWidget *widget,
gpointer data )
{
// "data" parameter represents main window here
message_box(GTK_WINDOW(data), "Hello, world!");
}

int main( int argc,
char *argv[] )
{
GtkWidget *window;
GtkWidget *button;

// Init GTK+
gtk_init (&argc, &argv);

// Create main window
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

// Set up callbacks for some signals
g_signal_connect (window, "delete-event",
G_CALLBACK (delete_event), NULL);

g_signal_connect (window, "destroy",
G_CALLBACK (destroy), NULL);

// Set window borders width
gtk_container_set_border_width (GTK_CONTAINER (window), 10);

// Create labeled button
button = gtk_button_new_with_label ("Hello World");

// Set up callback for "clicked" signal of the button.
// Pass main window as second parameter.
g_signal_connect (button, "clicked", G_CALLBACK (hello), (gpointer)window);

// Pack the button into window
gtk_container_add (GTK_CONTAINER (window), button);

// Show the button
gtk_widget_show (button);

// Show the window
gtk_widget_show (window);

// Run main GTK+ event loop.
gtk_main ();

return 0;
}

Собирается эта программа командой вида

gcc -o gtk-hello $(pkg-config --cflags gtk+-2.0) $(pkg-config --libs gtk+-2.0) gtk-hello.c

GTK+ — довольно сложно устроенный набор библиотек, поэтому, чтобы не указывать все нужные библиотеки и опции компилятора вручную, мы используем здесь программу pkg-config, которая печатает опции компилятора, нужные для использования GTK+.

Дополнительная литература

[raymond] Реймонд, Эрик С. Искусство программирования для UNIX. — Пер. с англ. — М.: Издательский дом «Вильямс», 2005. — 544с., ил.

[kernigan_pike] Керниган Б., Пайк Р. UNIX. Программное окружене. — Пер с англ. — СПб: Символ-Плюс, 2003. — 416с., ил.

[kernigan_richie] Керниган Б., Ритчи Д. Язык программирования C. — Пер. с англ. — Москва: Вильямс, 2006. — 304 с.

[vcs_git] Портнов И. Системы контроля версий. Git. URL: http://iportnov.blogspot.com/2008/06/git.html

[los-t_git] Los-t. Git guts (серия статей в ЖЖ). URL: http://los-t.livejournal.com/tags/git+guts


Добавление диапазона IP адресов для сетевого интерфейса в Red Hat, CentOS, Fedora. — Выделенный сервер своими руками

Иногда владельцам выделенных серверов необходимо добавить не один, два ip адреса к своему сетевому интерфейсу, а целую подсеть. Как это сделать? Не будешь же, к примеру, для добавления 18-ти ip адресов создавать 18 файлов вида ifcfg-eth0:X. К счастью, у нас есть соответствующий механизм.

Для добавления диапазона адресов 192.168.1.2 - 192.168.1.20 для сетевого интерфейса eth0 создаем файл:

vi /etc/sysconfig/network-scripts/ifcfg-eth0-range0

и в него добавляем следующие строки:

читать далее

GPS-навигация под Linux — RU Linux

В моем модеме для ноутбука есть GPS-приемник. Вот решил настроить, раз уж модемом стал заниматься, и заодно посмотреть какие-нибудь GPS-программы под Linux.

Сначала нужно установить программу mbm-gpsd, которая общается с модемом, при обращении к /dev/gps0 включает GPS и возвращает NMEA-данные от GPS-приемника, а при отключении -- выключает GPS. Поставить mbm-gpsd можно из GIT по инструкции по ссылке или из моего пакета в конце поста, если у вас Debian Stable/AMD64. Проверить можно так:

mbm-gpsd
cat /dev/gps0

И через время посыпется такое:

$GPGGA,,,,,,0,00,1.0,,M,,,,*04

$GPRMC,212235.34,V,,,,,,,151011,,,N*7A

$GPGSV,3,1,11,32,36,124,28,01,12,186,26,23,76,330,,20,62,141,*79

$GPGSV,3,2,11,13,54,278,,04,31,297,,16,22,116,,07,16,211,*7F

Теперь нужно поставить программу gpsd, она преобразует NMEA-поток в удобный формат и раздает клиентским программам по TCP/IP, имеется в Debian:

apt-get install gpsd gpsd-clients
gpsd -b -N /dev/gps0

Теперь надо запустить "xgps", подойти к окну, подождать пока поймаются спутники и поглядеть на них:

XGPS

Точное время и координаты есть, даже высота какая-то есть, если спутников достаточно. Теперь увидим себя на карте с помощью gpsdrive. В Debian старая версия gpsdrive, не понимающая новую версию gpsd. Поэтому gpsdrive надо установить с сайта.

Репозитарий там для Debian какой-то кривой, мне пришлось скачать и поставить вручную следующие пакеты:
openstreetmap-map-icons-classic.small_18403_all.deb
openstreetmap-map-icons-svg-png_18403_all.deb
openstreetmap-map-icons-japan-png_18403_all.deb
openstreetmap-map-icons-svg-twotone-png_18403_all.deb
openstreetmap-map-icons-japan_18403_all.deb
openstreetmap-map-icons-svg-twotone_18403_all.deb
openstreetmap-map-icons-square.big_18403_all.deb
openstreetmap-map-icons-svg_18403_all.deb
openstreetmap-map-icons-square.small_18403_all.deb

Если поискать тамже, то можно найти gpsdrive версии 2.12. Предварительно поставить зависимости:

aptitude install libboost-filesystem1.42.0 libboost-thread1.42.0 libmapnik0.7 libpq5 libspeechd2

Отключаем недоделанный перевод интерфейса и запускаем:

export LANG=en_EN.UTF-8
gpsdrive

Текущее положение будет отмечено на карте Земли. Считается скорость, показывается направление. Перемещаться по карте свободно можно в Explore Mode. Можно мерять расстояния, прокладывать путь, что-то там сохранять в SQL-базу данных и даже искать соседей через какие-то сервера. В меню Options - Maps - Download можно скачать разные карты, в том числе увидеть себя на OpenStreetMaps:

gpsdrive 2.12

Интересно, какие еще программы под Linux поддерживают GPS?

Блог: RU Linux

CentOS 6 и php 5.2.17 — Выделенный сервер своими руками

В дистрибутиве CentOS 6 изначально присутствует php версии 5.3. Это не всегда хорошо, потому как многие программы работают с этой ветко криво. Например UmiCMS. Вот и возникает парадоксальная ситуация, связанная со снижением версии php например до  5.2.17.

Одним из вариантов решения данного вопроса является использование репозитария atomic. Для его установки используем следующие команды:

wget http://www.atomicorp.com/installers/atomic
sh atomic

Далее удаляем установленный php.

читать далее

Андрей Боровский об YAGF, программистской ноосфере и интеллектуальном распознавании — ♠ Краплёная колода

Термин OCR мы вспоминаем, когда требуется конвертировать внушительных размеров фолиант в неприметный текстовый файл или сделать электронную версию документа на бумаге. Так или иначе, проблему надо решать. И среди свободных решений самым популярным по праву считается YAGF — оболочка для систем распознавания текстов Cuneiform и Tesseract.

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

Представьтесь, пожалуйста. Расскажите, чем занимаетесь по долгу службы и каким образом примкнули к лагерю open source?
Меня зовут Андрей Боровский. На работе я программист, занимаюсь в основном разработкой экспертных систем. Дома я, помимо прочего, тоже иногда программист, а еще любитель возиться со всякими электронными штуками.

С Линуксом познакомился в конце 97-го года. Мне тогда очень надоела Винда (даже эстетически) и я попросил знакомого найти что-нибудь свеженькое. Он принес мне компакт-диск с дистрибутивом Линукс. Кажется, это была Калдера. На диске были записаны образы дискет по 1.44 мегабайта, двадцать с чем-то дискет. Их надо было переписать на настоящие дискеты и устанавливать систему, что уже тогда было некоторым анахронизмом. В те времена в процессе установки инсталлятору нужно было сообщать много низкоуровневых параметров своего оборудования. Мне даже корпус компа пришлось открыть. Но я прошел эту процедуру и познакомился с Линуксом. :)

Как программист я столкнулся с Линуксом в 2001 году. Там был такой момент, мне нужно было посмотреть, как на практике работала какая-то вещь в тогдашней Qt, я взял диск с исходниками дистрибутива Линукс (это был Linux-Mandrake Russian Edition) и быстро нашел то, что мне было нужно. С тех пор я проникся уважением к открытому ПО. Для меня это своего рода «облако знаний», программистская ноосфера, где можно многому научиться. Так получилось, что многие редкие и интересные алгоритмы я прочел сначала в коде, а потом уже находил их описания в книгах или статьях. Для меня понятия «открытое ПО» и «Линукс» не тождественны. Например, существуют драйверы для Windows с открытыми исходными текстами. Всем, кому нужно писать свои драйверы, я рекомендую познакомиться с открытыми драйверами. Это хорошие наглядные учебные пособия. Разумеется, специальную литературу они не отменяют.

То есть, после первого знакомства забыли о линуксе на четыре года? Что помешало переходу?
Нет, не забыл, но и убежденным линуксоидом сразу не стал. Тогда были и другие интересные системы для десктопов: OS/2 еще не умерла и BeOS. BeOS выглядела очень интересно и перспективно. Ее убили не технические проблемы, а чисто маркетинговые ходы. Мне даже сейчас жаль, что так получилось. С интересом слежу за проектом Haiku, может что-нибудь сделаю для него.

Думал, задавать или не задавать вопрос о выборе Qt в качестве фреймворка для YAGF. Теперь же он потерял всякую актуальность — десять лет опыта не шутка. В развитии иных проектов на Qt не участвуете? Как оцениваете эволюцию «Кьюта» за прошедшую декаду лет?
Эволюция огромна. Сейчас некоторые подсистемы Qt сложнее, чем вся библиотека 10 лет назад. Возможно, библиотека стала слишком большой и пытается охватить слишком многое. Но это уже отдельная тема.

Извиняюсь, но не могу не задать вопрос после прочтения страницы вашего
профиля в Google+. Там сказано: «В 15 лет своей программой убил школьную ЛВС. Так уж она была устроена. В смысле — ЛВС». Расскажите, пожалуйста, как примерили рубашку хакера :-)
«Рубашку черного хакера» я примерил случайно. Я не хотел никому навредить. Я писал программу, которая должна была передавать данные по этой самой ЛВС, и что-то там не так сделал. А в классе информатики использовалась централизованная архитектура, где всей передачей данных по сетке управляла программа на центральной станции. Эта программа получила мои данные и умерла. И при этом еще умудрилась запортить диск, а диск был системный. Я не считаю, что это моя вина. Программа, управляющая сетью, не должна падать от того, что кто-то передал «неправильные» данные. И тем более не должна портить файловую систему. Но учитель информатики был в ярости и две недели не подпускал меня к компьютерам вообще. :)

Со стороны кажется, что у YAGF поставлена амбициозная задача — убедить пользователей отказаться от виртуальных машин с FineReader. Так ли это на самом деле? Как вы оцениваете ситуацию с OCR в Linux? Какой системе отдаёте предпочтение: tesseract или cuneiform?
Нет, цель YAGF немного другая. Давайте будем реалистами. cuneiform, и tesseract разрабатывались как коммерческие проекты (и первый дошел до стадии стабильной коммерческой разработки). Потом разработчики открыли коды этих программ. Мы все понимаем, конечно, что если бы эти программы могли конкурировать с лидерами рынка, мы бы сейчас вряд ли имели на руках их исходники. Так что мы едва ли догоним и перегоним Readiris или FineReader. Но это не значит, что открытые проекты распознавания текста не нужны. Их преимущество — более высокая адаптируемость. Например, сейчас возрастает интерес к процессорам ARM. Когда появятся коммерческие системы распознавания текста для этих процессоров? Я думаю, этого никто точно не знает. А вот tesseract уже портировали на ARM. Что касается, собственно, YAGF, то в будущем эта программа могла бы поддерживать импорт из DjVu или, например, распознавание текста, зафиксированного видеокамерой. Причем не обязательно, что это сделаю именно я. Любой может подключиться к проекту и адаптировать его для своих нужд.

Сравнивать tesseract и cuneiform можно очень долго, потому что у этих программ много разных особенностей и параметров. Если быть кратким, то мое мнение такое: в будущем tesseract превзойдет cuneiform по всем пунктам (если, конечно, разработчики будут прилагать усилия, как сейчас). А пока-что лучше установить в системе оба инструмента и опытным путем выяснить, какой из них подходит лучше для конкретных задач. Поэтому я и добавил поддержку обоих инструментов в YAGF 0.8.7.


Касательно интереса к процессорам ARM. Смартфоны с Android'ом берут всё новые высоты по завоеванию рынка. Но Google не спешит внедрять Tesseract в прошивку. Их программа Googles отправляет снимок с камеры в облако, а потом присылает результат распознавания. Это говорит о моде облачных решений или сырости вышеназванной OCR?
Неудивительно, что tesseract нет в Android. Там вообще-то много чего нет, и я бы очень удивился, если бы там сейчас появился именно tesseract. Говоря о портировании на ARM, я, все-таки, имел в виду системы, к которым можно подключить сканер. При распознавании текста с фотографий tesseract показывает скромные результаты, в чем каждый может самостоятельно убедиться.

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

Перед интервью я попросил читателей задать свои вопросы «о наболевшем». Один комментатор интересовался преимуществом графических оболочек над CLI. Чтобы не уходить в дебри философии, придётся переформулировать и сузить вопрос: по-вашему, можно ли эффективно распознавать текст в консоли?
Ну давайте посмотрим, что для этого нужно. Сначала нужно запустить XSane, отсканировать страницы. Затем в графическом редакторе все это подправить. Затем, собственно, инструмент распознавания, потом текстовый редактор, чтобы посмотреть, что же получилось. Промежуточные данные нужно передавать в файлах, а затем удалять их. Некоторые этапы этого цикла придется пройти несколько раз. Если кому-то нравится работать таким образом, это его право. Но я думаю, что все это удобнее делать из одной программы, которая управляет всем циклом и показывает пользователю результаты. И многие пользователи YAGF согласны со мной. :)

Спрашиваю, потому что предпринимал попытки обойтись одним cuneiform. Результат был плачевным.
Мне при таком подходе не нравится, что я не вижу, что именно распознается. Приходится держать открытыми несколько программ и все время перезагружать файлы. YAGF избавляет от этой необходимости.

На сайте написано, что вы развиваете собственную ветку Cuneiform главным образом для распознавания текстов на смешанных языках (русский-французский, русский-немецкий, русский-испанский). Ваши патчи попадают в основную ветку? Какие наработки наиболее значимы, на ваш взгляд?
Тут надо учесть, что cuneiform не полностью открытая программа. Не углубляясь в технические подробности, скажу, что cuneiform нельзя обучить новым языкам. Он будет распознавать только то, что в него было когда-то заложено. Соответственно, мои попытки расширить возможности распознавания носили характер «хака». Текст распознавался на двух языках, а потом «склеивался». В процессе этого хакинга я узнал много интересного о внутреннем устройстве cuneiform, и иногда мои хаки неплохо работали, но в конечном итоге я понял — это неверный путь. Сейчас я не работаю над этим, а если снова начну, то уже на базе tesseract, который полностью открыт и обучаем.

В версии 0.8.7 появился импорт страниц из PDF. Стоит ли ожидать поддержки формата DjVu? Появится ли возможность наложить текстовый слой вместо изображения в PDF/DjVu?
При импорте PDF возникла одна интересная проблема. Во многих документах PDF, где текст хранится как картинка, разрешение этой картинки слишком низкое для уверенного распознавания. Я сейчас размышляю над алгоритмами реконструкции текста из картинки с низким разрешением в картинку с более высоким разрешением. Обычные алгоритмы масштабирования, такие, которые использует GIMP, например, тут не годятся. У меня уже есть идеи, но они будут хорошо работать (если будут) только для PDF, но не для DjVu. Для DjVu придется придумать что-то другое. Если получится, то импорт будет.

Для пост-обработки сканированных страниц существует Scan Tailor. Не планируете ли вы интегрировать этот инструмент в YAGF?
Я обсуждал эту возможность с разработчиками Scan Tailor (правда, это было давно) и мы пришли тогда к выводу, что пока каждый пойдет своим путем. Я сейчас хочу направить основные усилия на добавление в YAGF алгоритмов обработки текста, необходимых именно при распознавании текста (распознавание таблиц, распознавание типов блоков «текст/картинка». Когда это будет сделано, к вопросу об объединении со Scan Tailor можно будет вернуться, если вторая сторона, конечно, этого захочет. С другой стороны, один открытый проект, как правило, может заимствовать код из другого открытого проекта, что бы об этом не думал автор кода. Так что на многие вещи можно посмотреть и проще.

Каким вы видите первый финальный релиз (1.0)? У проекта есть roadmap или функции внедряются в зависимости от запросов пользователей и ваших личных предпочтений?
Более интеллектуальным (с большим числом алгоритмов, повышающих распознаваемость текста). Да и графический интерфейс надо доработать. Будет возможность сохранять проекты, которые состоят из многих страниц, для дальнейшей работы с проектом как с единым целым. Возможно, еще кое что будет добавлено. Но я осторожен в обещаниях. Лучше пообещать меньше, а сделать больше, чем наоборот. :)

Пожелания пользователей принимаются (принимаются и патчи с исправлениями и дополнениями), если новые фичи соответствуют моему представлению об облике программы. Я точно могу сказать, чем она не должна быть. Она не должна стать «комбайном». Слишком много функций редактирования изображения или текста, вызываемых пользователем, могут помешать. YAGF — это не графический редактор и не текстовый. Говоря о том, что не должно быть слишком много функций, я имею в виду именно команды пользователя. Функции, которые автоматически улучшают распознаваемость текста или исправляют ошибки, будут добавляться и добавляться.

Спасибо за беседу. Успехов вам и проекту!
Спасибо и Вам.

Чтение стен ВКонтакте через RSS — KonishchevDmitry's small blog

Недавно возникло желание читать пару групп ВКонтакте. Регулярно заходить туда и проверять, не появилось ли чего нового - это не наш путь. Поэтому, узрев в этом желании отличную возможность поиграться с Google App Engine и Python'овским HTMLParser'ом, написал себе небольшой "велосипед" - vkontakte-feed.appspot.com. :) Отдает посты с публичных стен в RSS. Пользуйтесь, если кому надо.

Комфортная работа в Midnight Commander — Bappoy's blog » linux

Многие мои коллеги принципиально игнорируют Midnight Commander, предпочитая работать в командной строке. Мотивируют это целым рядом причин, начиная с «нортон коммандер устарел еще в 1995 году» и заканчивая «я юниксоид с 1970 года и без всяких mc прекрасно управляюсь в консоли». Конечно же, это дело вкуса, и можно (и нужно!) настроить консоль под себя так, чтобы она летала со скоростью мысли: на помощь приходят команда alias, сочетание Ctrl+R, описание команды shopt в builtins(1), пакет bash_completion или его аналоги, ряд мелких хаков, наподобие такого, или альтернатива в виде zsh, в конце концов.

Однако визуалам типа меня удобнее постоянно иметь перед глазами списки файлов и папок, а не помнить, какой файл где находится и что здесь есть еще. Кроме того, пользуясь исключительно командами cd и ls --color, можно легко проглядеть что-нибудь ненужное, типа оставшихся от vim бэкапов в текущем каталоге (если бэкапы нужны, см :help backupdir) или папок с именем из пробела.

Конечно, сначала mc производит немного гнетущее впечатление, но если разобраться и привыкнуть, то может оказаться, что даже с конфигурацией из коробки он очень облегчает жизнь разработчика и системного администратора. Поделюсь собственными хитростями, используемыми каждый день. За кадром осталось еще множество интересных фич, типа кастомной раскраски файлов в панели, смены цветовой схемы на черно-зеленую, сниппетов в редакторе mcedit, настраиваемых VFS, но поскольку я ими не пользуюсь, то ничего про них не скажу. Примеры их настроек и использования можно посмотреть в /etc/mc и в /usr/share/mc.

Сначала полезные мелочи, для многих очевидные.

  • Если до mc по каким-то причинам не доходят коды кнопок Fn, их можно заменить Esc-n. А Alt, иногда перехватываемый панелью меню, успешно заменяется кнопкой Esc
  • Режим просмотра файлов «Full file list» лучше, чем «Short file list». При желании можно добавить туда показ прав на объекты файловой системы, например:
    half type name | size | mtime | mode:3
  • Панели подсказок над и под командной строкой внизу и меню сверху можно отключить в Options — Layout, будет больше пространства для списка файлов. Заодно там можно включить отображение свободного места в текущем разделе — очень полезно для нетбуков с мелкими экранами
  • При навигации по списку файлов сочетание Ctrl+S перекидывает на файл, начинающийся с вводимых символов
  • Alt+Y перекидывает в предыдущую папку. Иногда это бывает полезно при восстановлении после ошибки «The shell is already running the command», за все время существования mc ставшей его визиткой
  • Встроенный редактор ужасен. В ~/.bashrc добавьте строчку export EDITOR=vim, а в пункте меню Options — Configuration снимите галку «Use internal editor». Точно так же можно использовать переменную окружения PAGER=view для просмотра файлов (опция «Use internal view»)
  • Alt+I покажет текущую папку в противоположной панели, а Alt+O — папку под курсором, а если под курсором файл, то родительскую.
  • Начиная с ветки midnight commander 4.7.1, в меню сортировки появилась сортировка по версиям, она работает точно так же, как ls -v, т.е. показывает список 1.2.1, 1.2.2, 1.2.10 именно в этом порядке, а не в алфавитном (1.2.1, 1.2.10, 1.2.2). Сам делал :).
  • Ctrl+X c — просмотр и редактирование прав на файл
  • Ctrl+X d — три варианта сравнения двух каталогов: быстрое (по спискам файлов), по размерам (то же самое, только с учетом размеров), полное (по содержимому файлов)
  • Alt+C — быстрый переход в нужную папку без изменения командной строки. По Esc-Tab показывает список подстановки (в командной строке mc Esc-Tab тоже иногда работает)
  • По Ctrl+\ имеется многоуровневое меню быстрого доступа к папкам, в т.ч. и через FTP и SSH. При желании его можно отредактировать вручную в ~/.mc/hotlist

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

Я поддерживаю несколько сайтов под mod_perl, и после изменений в коде startup.pl необходимо перезапускать процесс apache, свой для каждого сайта. Каждый сайт находится в /home/sites/sitename, а конфиг apache для этих сайтов — в /usr/local/apache/conf/httpd-sitename.conf.

Когда мне надоело вручную писать /usr/local/apache/bin/apachectl-sitename restart после каждого изменения, в ~/.mc/menu добавились строчки:

s Restart apache for sitename
   sudo /usr/local/apache/bin/apachectl-sitename restart

Первая строка задаёт быструю клавишу и название пункта меню, а все за ней следующее — команду, в которой можно использовать ряд макро-подстановок:

  • %f — имя файла под курсором, %x — расширение, %b — имя файла без расширения
  • %d — каталог в активной панели, %D — каталог в неактивной панели
  • %t — выбранные файлы в активной панели, %T — в неактивной

и т.д.

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

+= d /home/sites/sitename | f httpd-sitename.conf
s Restart apache for sitename
   sudo /usr/local/apache/bin/apachectl-sitename restart

Первый символ «=» означает начало условия, при котором пункт меню становится активным по умолчанию (при вызове меню курсор уже стоит на этом пункте, так что остаётся только нажать Enter); если перед ним стоит +, то пункт появляется в меню только при выполнении этого условия. Следующий символ — тип условия, например:

  • f шаблон — имя файла соответствует шаблону (если в начале файла меню не указана опция shell_patterns=0, то под шаблоном имеется в виду шелл-шаблон, в противном случае — регулярное выражение)
  • d шаблон — текущий каталог соответствует шаблону
  • t type — то, что под курсором, имеет тип:
    • n не является директорией
    • r обычный файл
    • d каталог
    • l ссылка
    • c последовательное устройство
    • b блочное устройство
    • f FIFO
    • s сокет
    • x исполняемый файл
    • t отмеченный файл

    Различные типы можно комбинировать, например, t rdl означает файл, каталог или ссылку

  • остальные тесты можно подсмотреть в упомянутой справке

Условия можно комбинировать и объединять, например:

# если находимся в папке /home/sites/sitename и под курсором — файл .sql, показать этот пункт меню
+= d /home/sites/site_name & f *.sql
S import sql-file to database sitedb
   mysql sitedb < %f

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

Остальное — дело фантазии и техники. Достаточно подумать о том, какие рутинные действия выполняются достаточно часто, и просто автоматизировать их.

sed -i wrt symlinks — Kir Kolyshkin

Оказалось, что sed -i, применённый к симлинку, делает из симлинка файл. А если этот симлинк -- /etc/grub.conf, который смотрит в /boot/grub/grub.conf, то потом на CentOS новые ядра не ставятся...

Чтобы этого не происходило, надо говорить sed -i -c.

Вот такая приключилась.

Технический этаж