

Консольный аналог статистики использования диска kdusader-a и т.п. Простая и удобная утилита. IMHO придется по вкусу тем, кому недостаточно дефолтного du.
Понравилось возможность выводить информацию по определенным разделам.
sudo ncdu -x /

Утилита умеет удалять, пересчитывать, сортировать и прочее. Полная информация в man и shift+? в программе.
Я больше не занимаюсь FreeSWITCH по нескольким причинам. Первая - я теперь не сетевой администратор с горкой АТС, и не работаю в VoIP стартапе.
Вторая - считаю разработчиков FreeSWITCH-а неадекватными по нескольким пунктам.
1. Прием патчей. Когда у нас глюкало видео я искал проблему и нашел ее. Создал патч и отправил в жиру. После месяца боданий патч был принят с формулировкой "а предыдущий пацанчик говорил что все работает отлично, но вы достали, хрен с вами". Многообщающе.
2. Использование DMCA для блокировки репозитория с кодом g729 кодека. Нормальные люди вначале пишут и говорят - у вас тут мои копирайты, вы поправьте. В общем мне их мотивировка неясна - их права никак не были нарушены, но шило в попе творит чудеса.
В общем как для профессионального разработчика для меня FreeSWITCH это один сплошной дурдом. Без причин с ним возиться я с ним возиться никакого желания не имею.
Как всегда, беда пришла, и её совсем не ждали. Организаторы конференции SPIE, в которой я заядлый участник, что-то там поменяли в своей системе приёма PDFников статей. Теперь система Numbus Roman не переваривает, и заменяет его чудовищным Courier. Вопрос о внедрении английских шрифтов в графики, созданные gnuplot, встал в полный рост. Летопись героической победы приложенных титанических усилий прилагается.#! /usr/bin/gnuplot -persistЧтобы узнать, внедрены в график шрифты или нет, нам нужны утилита
set terminal postscript "NimbusSanL-Regu" eps enhanced color
set output "./plots/plotresults_vonkarman.ps"
set logscale x
set format x "10^{%L}"
set logscale y
set format y "10^{%L}"
set style line 1 lt 1 pt 7
set xrange [10**(0):10**(3.4)]
set key top left
set grid
set bmargin 4
set xlabel "Frequency, [Hz]" font "NimbusSanL-Regu,18"
set ylabel "Power [dB/Hz]" font "NimbusSanL-Regu,18"
plot "./results_vonkarmanpsd.numdata" using 1:2 with points linestyle 1
pfbtops.line 0: Command 'pfbtops /usr/share/texmf-texlive/fonts/type1/urw/helvetic/uhvr8a.pfb' generated error, exitcode is 32512
aptitude install groff psutils
Это нам даст:
Чтение списков пакетов... Готово
Построение дерева зависимостей
Чтение информации о состоянии... Готово
Чтение информации о расширенных состояниях
Инициализация состояний пакетов... Готово
Чтение описаний задач... Готово
Следующие НОВЫЕ пакеты будут установлены:
groff psutils{a}
0 пакетов обновлено, 2 установлено новых, 0 пакетов отмечено для удаления, и 244 пакетов не обновлено.
Необходимо получить 1998kB архивов. После распаковки 5894kB будет занято.
Хотите продолжить? [Y/n/?]
Да, мы хотим. Теперь у нас всё есть - посмотрим, внедрены ли шрифты:
$ epstopdf plotresults_vonkarman.psи далее:
$ pdffonts plotresults_vonkarman.pdfВыхлоп этой команды будет в виде:
name type emb sub uni object IDПодсвеченное красным говорит нам всё: шрифты не внедрены. А жаль. Сейчас поправим. Решение выглядит вот так:
------------------------------------ ----------------- --- --- --- ---------
Courier Type 1 no no no 8 0
#! /usr/bin/gnuplot -persistСобственно, нужно вставить:
set terminal postscript "NimbusSanL-Regu" eps enhanced color fontfile "/usr/share/texmf-texlive/fonts/type1/urw/helvetic/uhvr8a.pfb"
set output "./plots/plotresults_vonkarman.ps"
set logscale x
set format x "10^{%L}"
set logscale y
set format y "10^{%L}"
set style line 1 lt 1 pt 7
set xrange [10**(0):10**(3.4)]
set key top left
set grid
set bmargin 4
set xlabel "Frequency, [Hz]" font "NimbusSanL-Regu,18"
set ylabel "Power [dB/Hz]" font "NimbusSanL-Regu,18"
plot "./results_vonkarmanpsd.numdata" using 1:2 with points linestyle 1
set terminal postscript "NimbusSanL-Regu" eps enhanced color fontfile "/usr/share/texmf-texlive/fonts/type1/urw/helvetic/uhvr8a.pfb"с точным указанием пути к шрифту. Теперь нашему графику должно полегчать:
$ epstopdf plotresults_vonkarman.psТак и есть! Теперь графики содержат шрифты, и всё в статье будет так, как мы хотим того.
$ pdffonts plotresults_vonkarman.pdf
name type emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
ZEVCBJ+NimbusSanL-Regu Type 1C yes yes no 8 0
Имея возможность из-под Ubuntu 11.04 запускать терминальное подключение к Ubuntu 11.10 очень сильно заметна разница в отрисовке шрифтов — она заметно лучше в новой версии.
Запись опубликована Aceler online. Вы можете оставить комментарии там, их ужеЯ за последние пару-тройку недель по вечерам и выходным понемногу сделал дикий, но симпатичный (и, может, полезный) сайт Showkr. И решил рассказать миру о том, зачем и как я это сделал - я думаю, что вторая часть может пригодиться, учитывая растущую популярность приложений в браузере.
У фликра довольно тяжелые страницы, и когда смотришь целый сет фотографий - утомительно ждать, пока каждая следующая загрузится и отрисуется (я вот только что попробовал, от нажатия кнопки до рендера где-то до секунды проходит на быстром интернете).
А тут, получается, открыл, дождался ответа апи фликра, и сиди себе просматривай, оно всë на одной странице. Тем более, что созданы все удобства - фотки, комментарии и хоткеи: поддерживается всë, что имеет хоть какой-то смысл - j/k, up/down, space/shift+space. Welcome!
Первый момент, который мне сохранил кучу времени - это Twitter Bootstrap. Тут мне рассказывать особенно нечего, если вы его не знаете - теперь будете знать. Хороший CSS framework, экономит тучу времени.
Второй момент - 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 запускается там, где это имеет больше смысла - фотки качаются сразу после того, как скачался сет, а комментарии - после того, как отрисовалась фотография.
Честно говоря, писать подробный туториал по бэкбону желания особенного нет - их уже много. Так что, если интересно, то стоит пойти посмотреть на исходники.
У меня были мысли приделать поддержку Пикасы еще, но немного лениво - я сам ею не пользуюсь, а работы хватает, привести два довольно разных апи к общему знаменателю... Ну и это не тема этой статьи (хотя если кому-то хочется, патчи я с радостью принимаю).
Я хотел сказать, что если вдруг остались или возникли вопросы, пишите мне - я либо отвечу там, либо дополню статью. Надеюсь, что она была полезна.


| Так они выглядят вместе |
| Толщина планшета в чехле |
| В закрытом виде |
| Клавиатура практически полноразмерная |
| Разъем USB и направляющая |
| Удобно доставать ручку |


Хотелось собрать ответы на некоторые вопросы и кое-какие арчеспецифичные советы для новоиспеченных пользователей ArchLinux в одном месте, дабы давать им эту ссылку сразу после того как они бегло просмотрели арчевики (и почему они её не читают?).
pacman -S base-devel Не буду расписываться о подробностях, коих вполне навалом тут (бывшим гентушникам настоятельно рекомендую обратить внимание на строки и ссылки про makepkg.conf)
pacman -U /path/to/pkg.tar.gz
[archlinuxfr]
Server = http://repo.archlinux.fr/i686и обновив список пакетов (pacman -Sy) установить как pacman -S yaourtРаботает yaourt аналогично пакману за исключением того что ищет и может устанавливать пакеты не только из репозитория но и из AUR, ну и имеет дополнительные возможности узнать о которых можно в мане или в какой-нить статье в сети с его описанием...
pacman -S testing/имя_пакета
pacman -U /var/cache/pacman/pkg/имя_файла.
pacman -S hwdetect (в AUR имеется гуй qhwdetect)
pacman -Qq > filename # сохраняем в файл
#что бы сохранить только из репозитариев можно искользовать строку ниже
#comm -13 <(pacman -Qmq | sort) <(pacman -Qqe | sort)
pacman -S `cat filename` # устанавливаем из списка, естественно что пакман будет ругаться если в списке есть пакеты не из реп
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fiДля пользователей zsh: включаем в нем автодополнения, если с дуру отключили, и устанавливаем из AUR пакеты zsh-packer для packer, zsh-bauerbill для bauerbill и zsh-yaourt для yaourt.
В ближайшие дни планирую уже окончательный переезд блога с WordPress на Jekyll. Соответственно, изменится и дизайн, и скорость загрузки.
Планируется, что все мои заметки будут доступны по тем же самых ссылкам. То же самое ожидается и с RSS, но тут надо еще посмотрим, быть может перейду на FeedBurner.
После переезда предполагается также некоторый период допиливания различных частей ресурса до удовлетворяющего меня состояния, но кардинальных перемен быть не должно.
И еще один момент: как минимум первое время система комментирования будет недоступна. Что с ней будет дальше пока не знаю, комментариев на данный момент не так много, и имеет ли смысл их вообще включать - сомневаюсь. Если есть мысли по этому поводу, пишите, пожалуйста, в комменты, пока они есть :)
Завершился очередной конкурс на лучшие новые обои для 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) |
С недавнего времени в horcm конфигах (файлах, описывающих репликацию ShadowImage, COW или TruCopy) теперь очень просто описать Command device:
#dev_name dev_name dev_name
\\.\CMD-99999:/dev/rdsk/
Где 99999 — серийный номер вашего массива.
В более ранних версиях требовалось указывать конкретные LUN-ы, на которых располагались Command devices, что вызывало проблемы при переезде путей в SAN или, например, замене HBA. Теперь, при замене HBA, изменении номера контроллера после перезагрузки или проведении динамической реконфигурации итд — репликация продолжает работать.
Очень уж давно не писал ничего. Как-то то времени не найти, то желания. Кроме того, особо ничего интересного не происходило, а плодить бессмысленные посты с очередным двухсоттысячным описанием настройки чего-либо не хочется.
Из последних новостей имеется только одна — установка основной системой свежевышедшей openSUSE 12.1. И даже тут рассказывать нечего :) Все работает, как и должно. Gnome, в третьей своей версии, нравится мне все больше, по-крайней мере, сильно удобней, чем Unity на Ubuntu, которой я пользуюсь на работе.
Хотел написать еще некоторые вещи, но что-то SpringPad работать не хочет, поэтому позже. Есть пара мыслей для небольших заметок.
Что можно сделать с помощью команды luxadm
При мультипатинге STMS(MPXIO) переключение пути с primary на secondary (на дисковых массивах в режиме active-passive). Посмотреть какие пути primary/secondary с помощью luxadm display /dev/rdsk/c14t6d0s2
# luxadm failover secondary /dev/rdsk/c14t6d0s2
Error: Device does not support failover
# luxadm failover primary /dev/rdsk/c14t6d0s2
Error: Device does not support failover
Переинициализировать порт hba (погасить и зажечь порт). Помогает при залипаниях и добавлении новых дисков со стороны массива.
# luxadm -e forcelip /dev/cfg/c3
# tail -100 /var/adm/messages
Oct 26 17:32:22 pioneer emlxs: [ID 349649 kern.info] [ 5.05F1]emlxs1: NOTICE: 730: Link reset. (Resetting link...)
Oct 26 17:32:22 pioneer emlxs: [ID 349649 kern.info] [ 5.031F]emlxs1: NOTICE: 710: Link down.
Oct 26 17:32:22 pioneer emlxs: [ID 349649 kern.info] [ 5.0631]emlxs1: NOTICE: 730: Link reset.
Oct 26 17:32:24 pioneer emlxs: [ID 349649 kern.info] [ 5.0549]emlxs1: NOTICE: 720: Link up. (4Gb, fabric, initiator)
Перевести устройство в offline (полезно при удалении определенных LUNов с массивов)
# luxadm -e offline /dev/rdsk/c14t6d0s2
Перевести устройство в online
# luxadm -e online /dev/rdsk/c14t6d0s2
Послать устройству команду reset
# luxadm -e dev_reset /dev/rdsk/c14t6d0s2
Зажечь или погасить лампочку на диске (работает только на некоторых устройствах)
# luxadm led /dev/rdsk/c14t6d0s2
# luxadm led_on /dev/rdsk/c14t6d0s2
# luxadm led_off /dev/rdsk/c14t6d0s2
# luxadm led_blink /dev/rdsk/c14t6d0s2
Обновить прошивку на hba (лучше пользоваться загрузчиком из firmware патча)
# luxadm fcode_download -d /path_to_firmware

Нам в команду нужен опытный JavaScript-программист, в офис, на полный рабочий день.
Мы пишем (модное ;) приложение, которое объединяет чат, location-based сервисы и т.п. Работает на мобильных устройствах и в браузере (сюда и нужен разработчик), бэкенд на Erlang/XMPP.
Плюсы:
Чего хочется от вас:
Если вам кажется, что вы подходите, пишите:
Если вы опытный программист, но JS - не ваш основной язык, и вам интересно, пишите всë равно. :) И если у вас есть еще вопросы, тоже пишите.
Сегодня NNLUG проводил сабж. Место традиционное, время тоже, самое главное — те же проблемы :) Не готовый к моменты старта мероприятия коммуникационный сервер, на котором ваш покорный разворачивал NAT где-то ближе к 11 часам утра с помощью Wiki и какой-то матери, непонятно зачем проложенные свободные Ethernet-концы на столах. Мы, наверное, в следующий раз ограничимся двумя-тремя концами на всю зону. Плюс жестокий перерасход по времени, два доклада вообще выкинули из сетки.
Зато у нас впервые была интернет-трансляция. Кто-то даже посмотрел, человек так 15.
Я рассказывал про Gnome3 и Unity на основе моих исследований этих интерфейсов. Говорят, минимум два человека перешли на Gnome3 с Gnome2 после того, как поняли, зачем его таким сделали. Будем надеяться, и нынешним слушателям материал поможет.
Второй доклад про Digikam опять с родовой травмой наших фестов — установкой софта на лету. 15 минут на установку — многовато, народ откровенно скучает. Ещё один конфуз — на проекторе нифига не видно результата работы фильтров. В итоге народ не понял, зачем нужен CIMG.
Третий доклад — о перспективных разработках. В номере — Blender3D 2.6.1, OpenOctaveStudio, Gimp 2.8 и гвоздь программы — LightWorks. Презентация была сделана больше в рекламных целях, эффект, по-моему, был :)
И последней частью стал мастер-класс по OpenOctaveMidi. В зале было два человека. знакомых со звукорежиссурой, похоже, что они немного прониклись. Эпические инструменты, кнопка «суперпаник», и 16384 дорожки одновременно поразили их воображение, а фильтры Calf в LV2 показали, как сделать красиво.
В общем и в целом, традиция делать доклады на InstallFest оказалось наиболее правильной — современные InstallFest-ы практически не несут в себе именно инсталляционной составляющией.
Запись опубликована Aceler online. Вы можете оставить комментарии там, их ужеПродолжаем рассказ о победном шествии разработчиков 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.

1 ноября вышел KDE 3.5.13 Trinity. На зеркалах пока не все пакеты. Поставил из Nightly Builds.
Обновлялся с 3.5.12, предварительно накатил 300+ накопившихся апдейтов стабильной версии Debian прямо из иксов, включая ядро, сами иксы и aptitude, который обновил себя же :) Ощутил разницу в upgrade, которые предлагает aptitude и apt-get -- первый отследил ненужные более по зависимостям пакеты и предложил сразу удалить их, не стал обновлять некоторые пакеты, которые позже оказались ненужными и были удалены вручную. После рестарта пришлось заменить в логин-скрине тип сессии с Default на TDE, остальное все сразу заработало без глюков и донастройки. А в вашем дистрибутиве Linux как дела с апдейтами?
Блог: RU Linux
Так уж сложилось, что сегодня пятница, есть свободное время, а так же несколько устройств с андройдом, комп с арчем и wifi точка.
Как следствие установка minidlna и просмотр фильмов находящихся на компе с планшета.
В арче Minidlna ставится командой
sudo yaourt -S minidlna
Вся настройка сводится к редактированию файла /etc/minidlna.conf
В нем достаточно указать пути до директорий с музыкой и фильмами
media_dir=A,/media/sda5/music
media_dir=V,/media/sda5/films
раскомментировать и как-то назвать свой комп
friendly_name=vanocpc
а также подправить интервал обновления медиатеки
notify_interval=60
Теперь можно смело запускать
sudo /etc/rc.d/minidlna start
Так же надо бы добавить minidlna к демонам в /etc/rc.conf для автозапуска.
Upd: лучше все-таки добавить в автозапуск иксов. Т.к. на момент запуска демонов wifi не поднят и minidlna не стартует.
Для просмотра видео с андройда установил BubbleUPnP. Проблем с кодировкой нет, видео запускается с задержкой ~3-4 секунды, перемотка работает великолепно.
Upd: в итоге отказался от использования minidlna и ushare установив vsftpd на комп, ES explorer и mx video player на планшет.
Эта статья расчитана на два вида читателей. Во-первых, это люди, имеющие опыт программирования под 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. Документация в системе делится на несколько разделов:
Команды пользователя (например, ls, gcc или man)
Системные вызовы — API ядра ОС
Библиотечные функции
Драйвера и т.п
Форматы файлов
Игры и т.п
Различные обзоры подсистем
Команды, используемые для системного администрирования
Для вызова раздела документации по имени нужно указать это имя при вызове команды 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!", пошла с книги Кернигана и Ричи "Язык 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 предназначена для сборки программ (хотя может использоваться для автоматизации многих других похожих задач). Она читает файл с именем 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. Кроме того, для краткости можно сокращать команды до первых нескольких букв — лишь бы избежать неоднозначности.
К наиболее часто используемым командам относятся:
Напечатать очередной кусок исходника (печатается 10 строк). Можно указать конкретные номера строк после имени команды, например l 10,15.
Запустить программу на выполнение под отладчиком. Программа будет выполняться до ближайшей точки останова, или до конца.
Установить точку останова. Номер строки, на которой нужно установить точку останова, указывается после имени команды.
Выполнить одну строку программы.
Вычислить и напечатать выражение. Выражение указывается после команды. Таким образом можно, например, однократно посмотреть значение какой-нибудь переменной.
Добавить выражение к списку постоянно отображаемых. Значения этих выражений будут показываться после исполнения каждой команды. Рядом с каждым выражением печатается его номер в списке. Удалить выражение из списка можно командой undisplay с номером выражения.
Выход из отладчика.
Более подробную информацию по GDB см. в man gdb.
Исторически в 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».
#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 адреса к своему сетевому интерфейсу, а целую подсеть. Как это сделать? Не будешь же, к примеру, для добавления 18-ти ip адресов создавать 18 файлов вида ifcfg-eth0:X. К счастью, у нас есть соответствующий механизм.
Для добавления диапазона адресов 192.168.1.2 - 192.168.1.20 для сетевого интерфейса eth0 создаем файл:
vi /etc/sysconfig/network-scripts/ifcfg-eth0-range0
и в него добавляем следующие строки:
В моем модеме для ноутбука есть 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", подойти к окну, подождать пока поймаются спутники и поглядеть на них:

Точное время и координаты есть, даже высота какая-то есть, если спутников достаточно. Теперь увидим себя на карте с помощью 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:

Интересно, какие еще программы под Linux поддерживают GPS?
Блог: RU LinuxВ дистрибутиве CentOS 6 изначально присутствует php версии 5.3. Это не всегда хорошо, потому как многие программы работают с этой ветко криво. Например UmiCMS. Вот и возникает парадоксальная ситуация, связанная со снижением версии php например до 5.2.17.
Одним из вариантов решения данного вопроса является использование репозитария atomic. Для его установки используем следующие команды:
wget http://www.atomicorp.com/installers/atomic sh atomic
Далее удаляем установленный php.
YAGF немного другая. Давайте будем реалистами. cuneiform, и tesseract разрабатывались как коммерческие проекты (и первый дошел до стадии стабильной коммерческой разработки). Потом разработчики открыли коды этих программ. Мы все понимаем, конечно, что если бы эти программы могли конкурировать с лидерами рынка, мы бы сейчас вряд ли имели на руках их исходники. Так что мы едва ли догоним и перегоним Readiris или FineReader. Но это не значит, что открытые проекты распознавания текста не нужны. Их преимущество — более высокая адаптируемость. Например, сейчас возрастает интерес к процессорам ARM. Когда появятся коммерческие системы распознавания текста для этих процессоров? Я думаю, этого никто точно не знает. А вот tesseract уже портировали на ARM. Что касается, собственно, YAGF, то в будущем эта программа могла бы поддерживать импорт из DjVu или, например, распознавание текста, зафиксированного видеокамерой. Причем не обязательно, что это сделаю именно я. Любой может подключиться к проекту и адаптировать его для своих нужд.tesseract и cuneiform можно очень долго, потому что у этих программ много разных особенностей и параметров. Если быть кратким, то мое мнение такое: в будущем tesseract превзойдет cuneiform по всем пунктам (если, конечно, разработчики будут прилагать усилия, как сейчас). А пока-что лучше установить в системе оба инструмента и опытным путем выяснить, какой из них подходит лучше для конкретных задач. Поэтому я и добавил поддержку обоих инструментов в YAGF 0.8.7.tesseract нет в Android. Там вообще-то много чего нет, и я бы очень удивился, если бы там сейчас появился именно tesseract. Говоря о портировании на ARM, я, все-таки, имел в виду системы, к которым можно подключить сканер. При распознавании текста с фотографий tesseract показывает скромные результаты, в чем каждый может самостоятельно убедиться.XSane, отсканировать страницы. Затем в графическом редакторе все это подправить. Затем, собственно, инструмент распознавания, потом текстовый редактор, чтобы посмотреть, что же получилось. Промежуточные данные нужно передавать в файлах, а затем удалять их. Некоторые этапы этого цикла придется пройти несколько раз. Если кому-то нравится работать таким образом, это его право. Но я думаю, что все это удобнее делать из одной программы, которая управляет всем циклом и показывает пользователю результаты. И многие пользователи YAGF согласны со мной. :)YAGF избавляет от этой необходимости.cuneiform не полностью открытая программа. Не углубляясь в технические подробности, скажу, что cuneiform нельзя обучить новым языкам. Он будет распознавать только то, что в него было когда-то заложено. Соответственно, мои попытки расширить возможности распознавания носили характер «хака». Текст распознавался на двух языках, а потом «склеивался». В процессе этого хакинга я узнал много интересного о внутреннем устройстве cuneiform, и иногда мои хаки неплохо работали, но в конечном итоге я понял — это неверный путь. Сейчас я не работаю над этим, а если снова начну, то уже на базе tesseract, который полностью открыт и обучаем. YAGF алгоритмов обработки текста, необходимых именно при распознавании текста (распознавание таблиц, распознавание типов блоков «текст/картинка». Когда это будет сделано, к вопросу об объединении со Scan Tailor можно будет вернуться, если вторая сторона, конечно, этого захочет. С другой стороны, один открытый проект, как правило, может заимствовать код из другого открытого проекта, что бы об этом не думал автор кода. Так что на многие вещи можно посмотреть и проще.YAGF — это не графический редактор и не текстовый. Говоря о том, что не должно быть слишком много функций, я имею в виду именно команды пользователя. Функции, которые автоматически улучшают распознаваемость текста или исправляют ошибки, будут добавляться и добавляться.
Многие мои коллеги принципиально игнорируют 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.
Сначала полезные мелочи, для многих очевидные.
half type name | size | mtime | mode:3
export EDITOR=vim, а в пункте меню Options — Configuration снимите галку «Use internal editor». Точно так же можно использовать переменную окружения PAGER=view для просмотра файлов (опция «Use internal view»)ls -v, т.е. показывает список 1.2.1, 1.2.2, 1.2.10 именно в этом порядке, а не в алфавитном (1.2.1, 1.2.10, 1.2.2). Сам делал :).На данный момент самой полезной фичей для меня является пользовательское меню. Про него я уже писал пару раз (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
Первая строка задаёт быструю клавишу и название пункта меню, а все за ней следующее — команду, в которой можно использовать ряд макро-подстановок:
и т.д.
Потом появилось еще пять подобных пунктов, для каждого сайта. В конце концов, мне надоело выбирать стрелками нужную команду или искать в длинном списке, какая буква соответствует соответствует нужному пункту. Внимательно перечитав справку, появляющуюся при нажатии F1 в меню F2, добавил еще по строчке к каждому определению пункта меню:
+= d /home/sites/sitename | f httpd-sitename.conf s Restart apache for sitename sudo /usr/local/apache/bin/apachectl-sitename restart
Первый символ «=» означает начало условия, при котором пункт меню становится активным по умолчанию (при вызове меню курсор уже стоит на этом пункте, так что остаётся только нажать Enter); если перед ним стоит +, то пункт появляется в меню только при выполнении этого условия. Следующий символ — тип условия, например:
Различные типы можно комбинировать, например, 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, применённый к симлинку, делает из симлинка файл. А если этот симлинк -- /etc/grub.conf, который смотрит в /boot/grub/grub.conf, то потом на CentOS новые ядра не ставятся...sed -i -c.HEAD / HTTP/1.1 Host: www.example.com Range: bytes=0-,5-0,5-1,5-2,5-3,5-4,<...>,5-1299,5-1300 Accept-Encoding: gzip Connection: close
curl -I -H "Range: bytes=0-1,0-2" -s http://www.example.com/test.bin | grep Partial
Обсуждение на хабре:
http://habrahabr.ru/blogs/infosecurity/127029/
#!/bin/bash
test "$1" == "" && echo $0 requests threads target-url && exit 0
seq 1 $1 | xargs -I{} -P $2 curl -I -H "User-Agent:" \
-H "Range: bytes=0-`printf ',5-%d' {10..1000}`" \
--compress -s $3 | grep HTTPKeePass с интерфейсом на Qt. Почему именно этот менеджер? Открытый, свободный и проверенный временем продукт. sudo aptitude install keepassx
Dropbox.![]() |
| Главное окно KeePassX |
Lastpass делает плагины и для смартфонов, правда, доступны они при наличии premium аккаунта (месячная подписка обойдётся в 1$). Мне по душе связка KeePassDroid и Dropbox. Что называется, дёшево и сердито :-) Если честно, второй способ показался даже сподручнее первого, потому что LastPass на Андроиде плодит сущности, добавляя дополнительный браузер с функциями автозаполнения полей.$ git clone Project NewProjectДействуем:
$ cd NewProject
$ git reset `echo "начало работы над новым проектом" | git commit-tree HEAD^{tree}`
$ git gc --pruneПо желанию сообщение можно заменить на любое другое подходящее. $ git log
commit bc1f1192112cc1c8141e1efdc0601c7bb67d5aa0
Author: You
Date: Tue Aug 16 21:40:00 2011 +0900
начало работы над новым проектомВот и всё!Если какой-то старый проект по разным причинам нельзя перевести из koi8 или cp1251 в utf8, то чтобы не писать каждый раз :e ++enc=cp1251 при открытии файла из определенной папки, можно добавить в ~/.vimrc следующий кусок:
if expand("%:p:h") =~ '^/path/to/project' || expand("%:p:t") == 'filename.txt'
:silent :e ++enc=cp1251
endif
Выражение :expand("%:p") преобразуется в полный путь к файлу, а с модификатором :h (head, путь к файла без последнего компонента) — в папку; чтобы получить только имя файла, можно воспользоваться модификатором :t (tail, последний компонент пути). :silent нужен, чтобы избавиться от предложения vim «Press ENTER or type command to continue».

gtk-vector-screenshot, Joachim Breitner, сообщил о том, что его разработка успешно создаёт скриншоты окна Epiphany (об этом ему в свою очередь сообщил Martin Borgert). Так что те, кто читал мой предыдущий пост и заинтересовался идеей, могут подключать репозитории sid и ставить себе вкусняшку — она уже работает ;)Если гора не идет к Магомету, то Магомет идет к горе.
(с) кто то, давно