Инструменты пользователя

Инструменты сайта



// Pacman: информация по пакетам, установленным как зависимости...

…и не нужные никакому пакету.

На случай, если что-то удалялось как pacman -R пакет вместо pacman -Rs пакет:
<ДЕЛ>

pacman -Qd | awk '{print $1}' | xargs -I{} bash -c 'cnt=$(LANG=C pacman -Qi {} | grep "Required By\|Optional For" | grep None | wc -l); (test $cnt -eq 2 && echo "{}")' | xargs -I{} bash -c '(pacman -Qi {};pacaur -Sii {};echo =================)' 2>&1 | less -R

</ДЕЛ>

Спасибо Романычу, просто список пакетов:

pacman -Qtdq

и с описанием, как в уродстве выше (без запроса к Sync базе или AUR можно просто: pacman -Qtdqi):

pacman -Qtdq | xargs -I{} bash -c '(pacman -Qi {};pacaur -Sii {};echo =================)' 2>&1 | less -R

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

Если какой-то пакет в этом списке уже нужен как самостоятельная единица, то можно снять пометку:

  pacman -S --asexplicit пакет

Теперь вопрос: а как проще?

ЗЫ пакеты, которые не требуются никаким другим пакетом можно получить просто выполнив pacman -Qt

// ArchLinux, systemd, run-level 3, startx, udisks и монтирование

Столкнулся с ситуацией: после перехода к systemd и его logind внезапно отказались монтироваться флешки средствами udisks и udisks2. При этом на соседнем компьютере всё нормально. Разница при этом между ними только одна: на одном иксы запускаются через kdm, на другом - startx. Вот там, где используется startx монтирование и не работает.

В ходе разбора наткнулся на эпичный тред, где поттеринг пытается убедить, что нужно апдейтить startx: https://bugzilla.redhat.com/show_bug.cgi?id=820675

Но оставим этого человека альтернативной ориентации и вернёмся к нашим баранам. А бараны такие: заставить без костылей или минимум оных монтировать накопители средствами udisks/udisks2 на машине, где используется startx.

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

loginctl show-session $XDG_SESSION_ID

видим такие строчки:

Active=no

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

Проблема метода очевидна: ближайшее обновление и нам нужно мержить, или менять снова. Не гут.

Второй метод, запустить иксы на том же терминале, на котором мы залогинились. К примеру, мы зашли с первой консоли, команда tty выдаёт следующее:

/dev/tty1

тогда, что бы запустить иксы на этой консоли нам нужно выполнить следующую команду:

startx -- vt1

И видим, что в выводе loginctl Active стал yes. Viva!

В таком варианте есть свой плюс: если заблокировать экран, допустим, с помощью xscreensaver, то мы не сможем переключиться на первую текстовую консоль и, нажав Ctrl-C, убить иксы и получить доступ к залогиненому аккаунту. Здесь же кроется и минус: подвисшую сессию оперативно не убьёшь, особенно, если она отказывается реагировать на Ctrl-Alt-BS. Плюс как-то не классически.

Как последний штрих, добавляем в ~/.bashrc следующее:

stx()
{
	local vt=$(fgconsole)
	startx -- vt$vt
}
alias startx='stx'

и продолжать пользоваться просто командой startx.

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

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

Материалы которые помогли мне разобраться:

// Mime тип для GPX

Столкнулся с тем, что в файловых менеджерах в уютненьком Арчике GPX файлы отображаются просто как «Документ XML», соответственно если назначишь для открытия какую программу, это распространяется на все XML файлы.

Выход: сделать описание Mime типа

Рассмотрю вариант индивидуальный для пользователя, общесистемно - домашнее задание.

Шаг первый, создаём файл $HOME/.local/share/mime/packages/application-gpx+xml.xml:

application-gpx+xml.xml
<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
    <mime-type type="application/gpx+xml">
        <comment>Geoinformation data (waypoints, tracks and so on) in GPX format</comment>
        <glob-deleteall/>
        <glob pattern="*.gpx"/>
    </mime-type>
</mime-info>

Для ленивых, качаем в одну команду:

wget -O $HOME/.local/share/mime/packages/application-gpx+xml.xml http://htrd.su/wiki/_export/code/zhurnal/2012/07/07/mime_tip_dlja_gpx?codeblock=0

После чего выполняем команду:

update-mime-database $HOME/.local/share/mime

Усё.

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

// Набор для кросс-компиляции для Linux на ARM

Потребовалось сделать окружение для отстройки приложений для системы Linux, запущенной на платформе с процессором ARM.

Внутри есть eglibc, поэтому решено было попробовать сделать окружение с этой библиотекой Си, а не повсеместно используемой newlib.

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

Особо поразило мозг решение проблемы «кто первый: курица или яйцо?»

В результате получился набор правил для сборки окружение под ArchLinux (пакеты идут в порядке сборки):

Ну и несколько библиотек сразу в придачу:

// Новый GTK+ и падение Opera

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

$ opera

(opera:13093): Gtk-CRITICAL **: IA__gtk_widget_unrealize: assertion `GTK_IS_WIDGET (widget)' failed

(opera:13093): Gtk-CRITICAL **: IA__gtk_widget_is_toplevel: assertion `GTK_IS_WIDGET (widget)' failed
opera [crash logging]: CRASH!!
/usr/lib/opera/opera got signal SIGSEGV at address B6B26E77

Log was created here:
/var/tmp/crash20111110210615.txt
Убито

Для столкнувшихся с этой же проблемой в ArchLinux:

// ArchLinux: geda-gaf в community

Собственно - радость! :)

Там же теперь и разводчик pcb. Двойная радость!

К сожалению, утилита xgsch2pcb (менеджер проектов-интегратор gschem и pcb) до community ещё не добралась, но уже не плохо.

// Автомонтирование udev+udisks

Повторять весь текст не буду, авторство и так моё: http://groups.google.com/group/archlinux-ru/browse_thread/thread/33c0d288bd05823d

Тут как реминдер

// OpenSource #066

Вышел 66 выпуск электронного приложения к журналу «Системный администратор», а в нем и моя третья статья из цикла «Схемотехника в Linux с помощью gEDA», в которой рассмотрено создание условного обозначения компонент для gschem. Так же сделано небольшое отступление и рассказано о интеграции gschem и pcb при помощи менеджера проектов xgschm2pcb. В общем качаем и читаем: http://osa.samag.ru/get/OpenSource066.zip

// Arduino как программатор для контроллеров Atmel и сопутствующий софт

За последние дни окончательно убедился, что Arduino не просто игрушка, а настроящие ворота для начинающих постигать мир программирования микроконтроллеров Atmel.

К чему это я, а к тому, что плата Arduino может выступить в роли программатора для самостоятельных конструкций на контроллерах. Как минимум существует два варианта, про которые можно прочитать на сайте http://freeduino.ru: http://freeduino.ru/arduino/isp.html.

Меня больше заинтересовал вариант BitBang программатора, т.к. не нужно каждый раз заливать прошивку в Arduino, когда нужно прошить внешний контроллер. Кроме того, можно прошить сам контроллер в кроватке (допустим если вышел из строя, количество же циклов перезаписи ограничено или залить обновленный boot loader).

В статье выше сказано, что подходят не все платы, это верно, но главное, что бы это была USB плата и на ней был чип FT232R/FT232RL, а вот разьём X3 можно распаять и самому (как это сделал Я - при помощи олово-отсоса очистил отверстия, поставил планочку и пропаял).

Но на этом наши приключения не заканчиваются. Возникает вопрос - чем шить? Ведь BitBang («ножкодрыгание») это достаточно не стандартная для общепринятых API процедура. Соответственно этим нужно заниматься через специализированные библиотеки, коих под Linux я раскопал две для чипов от FTDI:

  • libftd2xx - закрытая (проприетарная) библиотека от производителя, есть в вариантах для i686 и x86_64 (и естественно для Windows), скачать можно тут: http://www.ftdichip.com/Drivers/D2XX.htm, там в же в архиве есть заголовочные файлы, а на сайте можно скачать PDF с руководтством программиста. Вообще, там же рекомендую скачать и документацию на саму микросхему FT232R/FT232RL и информацию про работу в BitBang режиме (дальше потребуется). Библиотека доступна в ArchLinux через AUR.
  • libftdi - библиотека с открытыми исходными кодами, из зависимостей только libusb, а так как последняя может быть собрана и для Windows, теоретически и данная библиотека тоже. Домашняя страница: http://www.intra2net.com/en/developer/libftdi/download.php, имеется так же в репозитории extra в ArchLinux.

Для первой библиотеки (libftd2xx), есть набор патчей для avrdude. На сайте FreeDuino есть ссылка на сборку для Windows. Я выложил в AUR правила для сборки последней версии avrdude с этими патчами: avrdude-serjtag (потому как патчи изначально родились в недрах проекта serjtag).

На сайте libftdi лежит патч для древней версии uisp, поэтому подумав, и потратив 1.5 дня сделал на основе патчей serjtag свой патч ftdi-bitbang-5.10-1.patch, который использует эту библиотеку. Проверил прошивая и устанавливая fuse-биты на ATTiny2313. Естественно сделал правила для сборки и поместил в AUR: avrdude-ftdi. Вариант, если нужно отстроить на архитектуру отличную от x86/x86_64 или если бинарная версия проприетарной библиотеки рушится на вашей системе (тем более, что обновлялась она с 2008 года).

Вот тут товарищ Di Halt более подробно рассказывает про программатор на такой же микросхеме, которая стоит на Arduino. Там он говорит об одной неприятной особенности: после прошивки не отпускается линия RESET и решает проблему аппаратно. Можете поступить так же, но оказалось что, что в исходных кодах avrdude достаточно добавить одну строчку - выставление высокого уровня на линии RESET перед закрытием порта и выходом. Патч делающий это для использования с libftd2xx и набором патчей serjtag можно поглядеть тут: http://aur.archlinux.org/packages/avrdude-serjtag/avrdude-serjtag/clean-reset-pin.diff. При сборке пакетов avrdude-serjtag и avrdude-ftdi изменения отраженные в этом патче уже применены, так что, счастливым обладателям ArchLinux достаточно просто собрать и поставить пакет :)

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

#arduino duemilanove
programmer
  id    = "duemilanove";
  desc  = "FT232R Synchronous BitBang";
  type  = ft245r;
  miso  = 3;  # CTS X3(1)
  sck   = 5;  # DSR X3(2)
  mosi  = 6;  # DCD X3(3)
  reset = 7;  # RI X3(4)
;

programmer
  id    = "ft245r";
  desc  = "FT245R Synchronous BitBang";
  type  = ft245r;
  miso  = 1; # D1
  sck   = 0; # D0
  mosi  = 2; # D2
  reset = 4; # D4
;

Не мог понять, пока не почитал внимательно приложение к даташиту FT232R подробно рассказывающее про Bit Bang режимы этой микросхемы. Если коротко: для программатора нужно 4 линии, микросхема предоставляет 8 линий, на которых можно играться уровнями. Естественно в каждом конкретном программаторе могут использоваться любые 4 из этих 8ми линий.

Каждая линия отражает бит с номером от 0 до 7. На Arduino на разъем X3 выведены контакты микросхемы с номерами 11, 9, 10, 6, подключаемых по следущей схеме:

11 - MISO
 9 - SCK
10 - MOSI
 6 - RESET

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

Имя линии Номер вывода микросхемы Имя вывода Номер вывода разъема X3 Номер/Имя бита (согласно таблицы)
MISO 11 CTS 1 D3
SCK 9 DSR 2 D5
MOSI 10 DCD 3 D6
RESET 6 RI 4 D7

Смотрим на последнюю колонку: вот они откуда и берутся эти самые 3, 5, 6, 7 в описании программатора в avrdude.conf. Т.е. эти номера - это номера битов. С остальными программаторами дело обстоит схожим образом. Одного я не понял, почему этого нет в документации? Или плохо искал?

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

// pacman 3.4.0

Все подробности тут: http://www.archlinux.org/news/503/

От себя, на что стоит обратить внимание:

  1. -U теперь в большинстве случаев работает как -S, а точнее:
    • обработка зависимостей
    • обработка конфликтов (если пакет заменяет какой-то пакет, раньше нужно было сначала удалить установленный, потом ставить локальный новый)
  2. makepkg теперь завершает свою работу с ошибкой, если какая-то вызываемая программа завершается не с нулевым кодом возврата. Таким образом не нужно больше писать «|| return 1» после команды, если дальнейшая сборка при ошибке не имеет смысла. С другой стороны, когда завершение программы с не нулевым кодом возврата это нормальное поведение (предположим наложение патчей с опцией -N, когда патч был уже наложен), нужно будет после команды поставить «|| true» что бы сборка не завершилась с ошибкой.

// Долго запускаются Xlib/Xt приложения

Столкнулся давно с проблемой: приложения написанные с использованием только Xlib и Xt, например,xclock, xfontsel, или удобная тюнинговалка xvidtune, или мелкая оповещалка xmessage, очень долго запускаются, до 15-20 секунд, при этом давая значительную нагрузку на процессор. Если запускать в терминале, то обычно получаем, среди прочего, такую строку:

Warning: Missing charsets in String to FontSet conversion

Так как эти приложения использовал достаточно редко, то не обращал внимание, но сегодня что-то достало, решил разобраться. Беглый поиск привел на эту страницу: http://www.holoweb.net/~liam/fonts/common-linux-font-problems.html (искать по фразе «Everything starts up really slowly»). Информация старая, ещё для XFree86, ориентировочно 2002 года, но, с небольшими поправками, не потерявшая актуальность и сегодня.

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

  1. Запускать через приведенный там скрипт nolocale, добавив туда ещё сточку:
    export LANG=
  2. Поставить шрифты со всеми нужными кодировками
  3. Отредактировать файл локали, убрав (закоментировав) использование несуществующих кодировок

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

Для начала нужно понять шрифтов в каких кодировках у нас нет.

Для этого бредём в директорию /usr/share/X11/locale/<ВАША_ЛОКАЛЬ>. У меня локаль ru_RU.UTF-8, поэтому директория: /usr/share/X11/locale/ru_RU.UTF-8 и выполним там команду:

cat XLC_LOCALE | grep name | grep -v 'object_name\|encoding_name'

В результате получим примерно такой вывод:

		name	ISO8859-1:GL
		name	ISO8859-1:GR
		name	KOI8-R:GR
		name	MICROSOFT-CP1251:GR
		name	ISO8859-5:GR
		name	JISX0208.1983-0:GL
		name	KSC5601.1987-0:GL
		name	GB2312.1980-0:GL
		name	JISX0201.1976-0:GR
		name	ISO10646-1

На то, что после двоеточия не обращаем внимания, итого, кодировка состоит из двух частей, разделенных «-»: CHARSET_REGISTRY и CHARSET_ENCODING (за подробностями сюда: http://lesstif.sourceforge.net/doc/super-ux/g1ae04e/chap5.html)

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

Итак, шрифты в X11 издревле задавались хитрой строчкой, поля в которой были разделены знаком «-», последние два элемента как раз и есть CHARSET_REGISTRY и CHARSET_ENCODING (в терминах xfontsel: rgstry и encdng соответственно). Теперь просто проверяем по последним двум полям, что есть все комбинации из вышеполученных rgstry-encdng (на регистр внимания не обращаем), те, которые не находим помечаем.

Теперь возвращаемся в каталог с локалью, открываем файл XLC_LOCALE на редактирование находим секцию с несуществующей кодировкой и комментируем её.

У себя я не нашел шрифтов в кодировке microsoft-cp1251 (есть только cp1252), поэтому полностью закомментированная секция выглядит теперь так:

#	fs3 class (MICROSOFT-CP1251)
#fs3	{
#	charset	{
#		name	MICROSOFT-CP1251:GR
#	}
#	font	{
#		primary	MICROSOFT-CP1251:GR
#	}
#}

Все, сохраняемся и выходим. Проверяем, приложения должны стартовать практически мгновенно.

Ну и последний штрих для ArhLinux. Дабы уберечь от перезаписывания этого файла при обновлениях пакета libx11 (а именно ему принадлежат эти файлы локали), его нужно «замаскировать». Для чего открываем на редактирование файл /etc/pacman.conf, находим параметр NoUpgrade и приводим его примерно к такому виду:

NoUpgrade    =  usr/share/X11/locale/ru_RU.UTF-8/XLC_LOCALE

Теперь при обновлениях, если файл в пакете изменился, он будет ставиться под именем XLC_LOCALE.pacnew и соответствующим предупреждением на экране и в логе. Дальнейшие шаги по поддержанию в актуальном состоянии зависят от вас.

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

// Xorg 1.8 в extra

Собственно сабж, подробности: http://www.archlinux.org/news/502/

Для пользователей старых карт nVidia небольшая засада.

// epssplit & jpeg2ps

Про эти утилиты писал года три назад в статье: Резка большеформатных изображений на листы формата А4 для последующего склеивания

Сейчас дошли руки приготовить пакеты для AUR: epssplit, jpeg2ps, так что, в ArchLinux с установкой стало проще :)

По поводу преобразование растра в PS/EPS можно почитать в статье Евгения Балдина в «Linux Format»: LaTeX. Часть 4: Графика

// Странная проблема с WiFi на EeePC 1000HA

Проблема сводится к тому, что при запуске Xorg связь начинает умирать. Для восстановления достаточно переключиться в консоль. Причины и связи мне не понятны, и вообще фантастически выглядит решение проблемы: перепрошивка точки доступа. Вот где тут связь???

Пока разбирался, научился запускать драйвер ath5k - просто для его включения нужно активизировать 2 rfkill устройсва:

  1. сначала eeepc-wlan (см вывод rfkill list)
  2. после появится ещё одно - phy0, и активировать его
  3. затем, в обязательном порядке - ifconfig wlan0 up

после чего можно начинать работать.

Точка доступа (DWL-G700AP) же, была последним шагом - нет нормальной связи, так хоть поэксперементирую. Прошивку туда залил Wive-ng, она на базе ядра Linux 2.4, и очень значительно расширяет возможности точки, превращая её в полноценный маленький сервер с управлением по ssh/telnet:

  • pppoe-client
  • pptp-client
  • dhcp
  • iptables/nat
  • балансировка трафика
  • роуминг (прозрачный переход от точки доступа к точке доступа)
  • vlan
  • широкий диапазон регулировки мощности (больше чем в базовой поставке, но для значений больше 20, следует применять принудительное охлаждение)
  • smbclient (но… не могу представить для чего :) если бы было память побольше, можно было бы туда запихнуть rtorrent с веб-интерфейсом (или даже без оного), а так…)
  • и ещё всего и вся по мелочи

В результате и связь при запущенных Xorg поднялась. Хитрая уличная магия.

По прошивке и вообще точке доступа:

General:

Wive:

Wive-ng:

// Emacs и пустые меню

Столкнулся с проблемой: в некоторых модах, которые добавляют пункты меню в Emacs, эти самые пукнты меню оказываются пустыми, причем, при последующем перезапуске, бывают оказываются и не пустыми.

Собственно вот так это выглядит, открыт C-файл и выбран пункт меню C:

Поиск привел на английски форум ArchLinux: http://bbs.archlinux.org/viewtopic.php?id=83860, собственно от туда варианты решения:

  1. выполнять команду:
    M-x accelerate-menu
  2. установить переменную окружения GDK_NATIVE_WINDOWS перед запуском Emacs:
    export GDK_NATIVE_WINDOWS=1

И сразу на правах рекомендации: Doxymacs

И ещё одна рекомендация, статья Алекса Отта по настройке CEDET: http://alexott.net/ru/writings/emacs-devenv/EmacsCedet.html

// Из одной установки ArchLinux

Подогнали тут машинку, мамка Asus CUBX-L, процессор Intel Celeron 600MHz, RAM около 415Mb (free кажет 416800Kb, что-то не могу подобрать комбинацию, там 3 планки стоят). У меня вообще в последнее время какая-то тенденция с оживлением всякого старого железа, лотеком прям себя ощущаю.

Образ с которого устанавливаюсь 2009.08, так вот, на машинке или сам привод немного подгоняет, или диск так записан (возможности проверить на другом нет), но при попытке установке пакетов, вылетает на том, что не может проверить контрольные суммы у некоторых пакетов. Причем, установка пакетов у меня выбрана не с диска, а с сети - благо у меня локальное зеркало есть. Это навело на мысль - удалить пакеты, чтобы перезакачались: была такая проблема на моём EeePC - подглючивала сетевая карта.

Сказано - сделано. Иду в /mnt/var/cache/pacman/pkg и… правильно, пытаюсь удалить некорректные пакеты, а оно мне что? А оно мне говорит - а нет таких файлов. Опппппааааа… ЧДКВ?

Смотрю какой командой запускается pacman:

pacman --root /mnt --config /tmp/pacman.conf --noconfirm -S <список пакетов>

Смекаю, я же зеркало выбирал, значит должно быть отражено в конфигурационном файле, а вдруг там ещё что, понаписано… Открываю:

nano /tmp/pacman.conf

и что я вижу? там в секции [options] указаны два параметра для CacheDir, один верно ведет в /mnt/var/cache/pacman/pkg, а другой, на те пакеты, что на диске: /src/… и так получилось, что пакеты, на которые ругалось, не изменились с августа прошлого года, а т.к. диск/привод гонят - прочитаться не смогли, на что ругнулось, что контрольные суммы не получилось просчитать.

Удаляю эту строчку, после чего возвращаюсь на пункт Install packages и пробую заново устанавливать пакеты - удача :)

To be continued…

// Medit из mercurial

Текущая версия замечательного редактора medit это 0.9.4 и она не обновлялась больше года. Решил собрать и попробовать сборку из mercurial, благо, смотря на даты последних изменений можно заметить, что работа ведется:
http://bitbucket.org/muntyan/moo/

Не все гладко - несколько переработан интерфейс, некоторые ошибки так и не исправлены (типа стоит галочка «переносить текст», а он не переносится, а если убрать - будет переноситься).

Кроме того, сменили систему сборки на cmake, в результате не все доделали, и пришлось сделать два патча и один work-around для того, что бы пакет собрался вообще и с ctags, в частности. Кроме того, правила cmake пока не докрутили для python-plugin, в результате ни консоли питона, ни питоновских команд для пользовательских утилит. Хотя меня не это больше смущает - на питоне сделан терминал был, удобная, иногда, штука.

По питону, есть бага: http://sourceforge.net/tracker/?func=detail&aid=2929703&group_id=167563&atid=843451 будемс следить.

В общем, в результате изысканий, сделал правило для сборки и поместил в AUR: http://aur.archlinux.org/packages.php?ID=34336 там же необходимые патчи, хотя они тривиальны.

Да, рекомендую ознакомиться со справкой к программе, там вы найдете, в частности, как управлять поведением редактора на разных файлах (типа установить ширину отступа и кодировку, делается в манере, схожей с vim)

// Настройка сетевого сканирования

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

Для Xerox/Samsung МФУ и сканеров рекомендую поставить sane версии не ниже 1.0.20, т.к. там появилась нативная поддержка этих девайсов, в замен глючному Unified Linux Drivers (ULD).

Серверные настройки

Сервер - тот к кому подключен сканер

  1. в /etc/sane.d/dll.conf убираем строки добавленные при установке ULD, обычно содержат в себе слово mfp, добавляем строчку:
    xerox_mfp
  2. в /etc/sane.d/saned.conf прописываем адреса для которых разрешено сканирование, например, для все сети:
    192.168.13.0/24
  3. в /etc/xinetd.d/saned disable = yes заменяем на disable = no. Возможно сдесь же, придется исправить группу и пользователя от которого будет стартовать сервер saned.
  4. рестартуем xinetd

Или запускаем saned как сервер. Вот кстати полный конфиг для /etc/xinetd.d/saned:

service sane-port
{
	disable			= no
        port        	= 6566
	socket_type 	= stream
        wait        	= no
	groups			= yes
	user        	= saned
	group       	= users
	server      	= /usr/sbin/saned
}

Клиентская часть

Клиенты - те, с которых будет производиться сканирование.

Тут настройка проста, в /etc/sane.d/net.conf прописать адрес или адреса хостов, к которым подключены сканеры, можно задать таймаут опроса.

Дополнительно

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

none /dev/bus/usb usbfs auto,busgid=100,busmode=0775,devgid=100,devmode=0664 0 0

У меня на ArchLinux:

none /proc/bus/usb usbfs auto,busgid=108,busmode=0775,devgid=108,devmode=0664 0 0

группа для vbox ;-) ну а так, почти не отличается

ID групп и пользователя и права задаёте те, которые у вам нужны.

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

// Termit 2.3.0

Если кто захочет собрать Termit 2.3.0 (в AUR пока только PKGBUILD для 2.2.0), столкнется с фейлом линковки, соорудил это:

--- ./src/CMakeLists.txt.orig	2010-01-23 22:26:13.037085590 +1000
+++ ./src/CMakeLists.txt	2010-01-23 22:26:17.234609292 +1000
@@ -2,7 +2,7 @@
 
 INCLUDE_DIRECTORIES(${TERMIT_SOURCE_DIR})
 
-INCLUDE (FindGTK)
+INCLUDE (FindGTK2)
 
 INCLUDE (FindPkgConfig)
 pkg_search_module(VTE REQUIRED libvte>=0.13 vte>=0.13)
@@ -37,13 +37,13 @@
 #  LINK_FLAGS ${TERMIT_LDFLAGS})
 #set_target_properties(${TARGET} PROPERTIES LINK_FLAGS ${TERMIT_LDFLAGS})
 
-SET(TERMIT_LDFLAGS "")
-FOREACH(ldflag ${VTE_LDFLAGS} ${GTK_LDFLAGS})
-  SET(TERMIT_LDFLAGS "${TERMIT_LDFLAGS} ${ldflag}")
-ENDFOREACH(ldflag)
-set_target_properties(${TARGET} PROPERTIES LINK_FLAGS "${TERMIT_LDFLAGS}")
+#SET(TERMIT_LDFLAGS "")
+#FOREACH(ldflag ${VTE_LDFLAGS} ${GTK_LDFLAGS})
+#  SET(TERMIT_LDFLAGS "${TERMIT_LDFLAGS} ${ldflag}")
+#ENDFOREACH(ldflag)
+#set_target_properties(${TARGET} PROPERTIES LINK_FLAGS "${TERMIT_LDFLAGS}")
 
-target_link_libraries(${TARGET} ${LUA_LIBRARIES})
+target_link_libraries(${TARGET} ${LUA_LIBRARIES} ${VTE_LDFLAGS} ${GTK_LDFLAGS})
 
 INSTALL(TARGETS ${TARGET} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)

Альтернативная ссылка: http://codepad.org/ovoBTiFN

Собрал, обновил, в комментах к AUR-версии отписал о выходе новой версии и патче.

PS классная утилита curlpaste, помогает одним движением залить текстовый файлик на сервисы типа pastebin и получить прямой линк для отправки собеседнику. Работает не только с файлами, но и с иксовым буффером обмена, может отправлять стандартный вывод программы. В общем самое оно для обмена конфигами и/или логами, кусками кода и т.д.

// EeePC: uvesafb + родное разрешение в консоли и X11

Пришло время ядра 2.6.32 (уже 2.6.32.3) в core репозитория ArchLinux, да вот незадача: поломали они графику.

Проявляется так: через некоторое время работы, в иксах начинает дергаться экран, как в дерьмовом фильме, где после крутого взрыва на космическом корабле все мониторы взорвались, а последний, для связи с Землей, перед последним вздохом показывает дерганное изображение оператора с того конца. Еще через некоторое время графика фризится, на некоторых версиях иксовых дров (2.9.1) это финиш, для тех что из git - можно переключиться в консоль и там вырубить иксы, да вот запустить их не получится до полной перезагрузки. Да это не паника - система продолжает работать.

Если задать опцию powersave=0 для модуля i915, проявление вышеописанных багов несколько снижается, но не исчезает. Кроме того, после suspend-to-ram фейл появляется почти сразу.

Подумав, решил на время отказаться от родных драйверов в сторону vesa, мне главное нормальная и стабильная работа (да, Арч, что бы моск не заплыл :))

Собственно, все свелось к следующему

Для начала ставим пакет v86d из extra:

pacman -S v86d

После установки редактируем файл /etc/modprobe.d/uvesafb.conf на предмет нужного нам разрешения экрана, ставим сразу (верно для моего EeePC 1000H) 1024×600-32

И загружаем модуль usevafb:

modprobe uvesafb

Ииии облом :) получим разрешение 800×600 и растянутое изображение - приятного мало.

Связано с тем, что видеобиос на некоторых чипах не поддерживает переключение в нативное разрешение, глюк, согласно статье в вики: http://wiki.archlinux.org/index.php/Uvesafb#Uvesafb_and_915resolution

Там же находим способ как обходить - использовать хак под названием 915resolution лежит он в AUR, только берите версию 915resolution-static - там содержится патч для поддержки 945GME. Собираем этот пакет и ставим.

Дальше запускаем: sudo 915resolution -l

смотрим какие режимы предоставляет. Я для переопределения под номером 54 (в hex виде) - бывший 1024×768-32.

Если поддержки чипа нет - то будет об этом сказано, в этом случае - гуглите, патчите.

Дальше, нужно соблюдать порядок:

  • сначал хачим биос:
    915resolution 54 1024 600
  • потом уже загружаем модуль uvesafb:
    modprobe usevafb

    (при наличии настройки в /etc/modprobe.d/uvesafb.conf)

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

  1. редактируем хук: /lib/initcpio/hooks/915resolution на предмет нужного режиме (смотрим выше что написал, про хачим биос)
  2. редактируем /etc/mkinitcpio.conf и дабавляем в строку HOOKS следующие хуки: 915resolution и v86d (сначала первые потом второй - порядок важен)
  3. запускаем:
    mkinitcpio -p kernel26

Все, при перезагрузке все станет на свои места, либо вручную вызвать нужные команды. Кстати на официальном сайте uvesafb есть информация (http://dev.gentoo.org/~spock/projects/uvesafb/faq.php) как при работе выключить фреймбуфферную консоль и вернуть текстовую моду:

Can I unload the uvesafb module and switch back to a text mode?

Yes, provided your Video BIOS supports saving the VBE state. This is supported by the vast majority of the currently available BIOS-es. If yours does not support this feature, you will get an appropriate warning in the kernel log. In order to switch back to a text mode, you will need to detach fbcon: echo 0 > /sys/class/vtconsole/vtcon1/bind (make sure the VT_HW_CONSOLE_BINDING kernel config option is selected, otherwise this will do nothing). After you do that, you should be automatically switched back a text mode console. You will also be able to unload uvesafb and fbcon if they have been built as modules.

Уже мы все такие радостные, да? :) а теперь сделайте suspend-to-ram, ога, у меня не проснулось :) точно проснулось но графика слетела. В попытках исправить (для засыпания использую pm-utils с модулем uswsusp) поместил два скрипта в /etc/pm/sleep.d

  • скрипт 10_915resolution:
    #!/bin/bash
     
    case $1 in
        hibernate|resume)
        /usr/sbin/915resolution 54 1024 600
        ;;
    esac
  • скрипт 10fbcon:
    #!/bin/bash
     
    case $1 in
        hibernate|resume)
        echo 0 > /sys/class/graphics/fbcon/subsystem/fb0/state
        ;;
    esac

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

В общем, пока все, огромная просьба - протестить, отписаться.

Да! после сна, бывает черный экран - переключаемся в консоль и обратно. И для иксов достаточно прописать нужный режим (Modes «1024×600») и драйвер vesa.

ЗЫ жду когда родные дрова починят, поставил бы Торвальдс Арч, что ли :)

// Qt4 и кросскомпиляция для win32

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

Для начала ставим пакеты (верно для ArchLinux, для других названия будут или аналогичными, или похожими):

pacman -S mingw32-binutils mingw32-gcc mingw32-runtime mingw32-w32api qt wine

Далее, мы должны взять Windows-версию библиотеки Qt4. Берем отсюда (текущая версия 4.6, хотя лучше взять ту, которая у вас в дистрибутиве, в момент написания, это: 4.5.3, кроме того, берем ту, что дял MinGW и, мы же православные, LGPL):
http://qt.nokia.com/downloads/windows-cpp (получим самую последнюю версию)

или отсюда:
http://get.qt.nokia.com/qt/source/

Я беру 4.5.3:

wget -c http://get.qt.nokia.com/qt/source/qt-win-opensource-4.5.3-mingw.exe

После скачивания, нам поможет wine, дабы установить библиотеку14). Если у вас возникают какие ошибки и wine отваливается, попытайтесь удалить каталог ~/.wine и запустить процесс заново.

Предварительно делаем такой финт ушами:

ln -s /usr/i486-mingw32 ~/.wine/drive_c/MinGW

Пусть потом установщик думает, что у нас реальный MinGW стоит, в частности - библиотека mingwm10.dll, которую вы должны предоставить в целевой используемой системе, как и необходимые dll от Qt.

Итак:

wine qt-win-opensource-4.5.3-mingw.exe

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

~/.wine/drive_c/Qt/VERSION

где VERSION это версия, в нашем случае - 4.5.3

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

(1) mkdir /opt/qt4-win32
(2) cp -a /home/USER/.wine/driver_c/Qt/VERSION /opt/qt4-win32/
(3) ln -s /opt/qt4-win32/VERSION /opt/qt4-cross

где (1) - создаие каталога в общедоступной системной директории, (2) - копирование нашей установленной версии Qt4 в этот самый общедоступный каталог (USER - имя пользователя от которого происходила установка), (3) - делаем симлинк на нашу рабочую версию, этот симлинк я буду использовать в описании spec-файла для qmake.

Следующий шаг, создание спека для Qmake (любителям других систем сборок - велком с дополнениями).

Хотя создание это громко сказано, в комплекте поставки есть спек:

/usr/share/qt/mkspecs/win32-g++

для работы с mingw32 в среде Windows, нам надо его только немного модифицировать, поэтому делаем копию:

cp -a /usr/share/qt/mkspecs/win32-g++ /usr/share/qt/mkspecs/win32-cross-g++

Переходим в /usr/share/qt/mkspecs/win32-cross-g++ и, можно наложить такой патч, бай ми:

diff -Nur win32-g++/qmake.conf win32-cross-g++/qmake.conf
--- win32-g++/qmake.conf	2009-10-08 09:30:49.000000000 +1100
+++ win32-cross-g++/qmake.conf	2009-04-10 13:56:14.809651570 +1100
@@ -14,7 +14,7 @@
 QMAKE_EXT_OBJ           = .o
 QMAKE_EXT_RES           = _res.o
 
-QMAKE_CC		= gcc
+QMAKE_CC		= i486-mingw32-gcc
 QMAKE_LEX		= flex
 QMAKE_LEXFLAGS		=
 QMAKE_YACC		= byacc
@@ -27,7 +27,7 @@
 QMAKE_CFLAGS_DEBUG	= -g
 QMAKE_CFLAGS_YACC	= -Wno-unused -Wno-parentheses
 
-QMAKE_CXX		= g++
+QMAKE_CXX		= i486-mingw32-g++
 QMAKE_CXXFLAGS		= $$QMAKE_CFLAGS
 QMAKE_CXXFLAGS_DEPS	= $$QMAKE_CFLAGS_DEPS
 QMAKE_CXXFLAGS_WARN_ON	= $$QMAKE_CFLAGS_WARN_ON
@@ -41,18 +41,18 @@
 QMAKE_CXXFLAGS_EXCEPTIONS_ON = -fexceptions -mthreads
 QMAKE_CXXFLAGS_EXCEPTIONS_OFF = -fno-exceptions
 
-QMAKE_INCDIR		=
-QMAKE_INCDIR_QT		= $$[QT_INSTALL_HEADERS]
-QMAKE_LIBDIR_QT		= $$[QT_INSTALL_LIBS]
+QMAKE_INCDIR		= /usr/i486-mingw32/include
+QMAKE_INCDIR_QT		= /opt/qt4-cross/include
+#QMAKE_INCDIR_QT         = /usr/include
+QMAKE_LIBDIR_QT		= /opt/qt4-cross/lib
 
 QMAKE_RUN_CC		= $(CC) -c $(CFLAGS) $(INCPATH) -o $obj $src
 QMAKE_RUN_CC_IMP	= $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
 QMAKE_RUN_CXX		= $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src
 QMAKE_RUN_CXX_IMP	= $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
 
-QMAKE_LINK		= g++
-QMAKE_LINK_C		= gcc
-QMAKE_LFLAGS		= -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
+QMAKE_LINK		= i486-mingw32-g++
+QMAKE_LFLAGS		= -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mwindows
 QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads -Wl
 QMAKE_LFLAGS_EXCEPTIONS_OFF =
 QMAKE_LFLAGS_RELEASE	= -Wl,-s
@@ -72,35 +72,26 @@
 QMAKE_LIBS_COMPAT       = -ladvapi32 -lshell32 -lcomdlg32 -luser32 -lgdi32 -lws2_32
 QMAKE_LIBS_QT_ENTRY     = -lmingw32 -lqtmain
 
-!isEmpty(QMAKE_SH) {
-    MINGW_IN_SHELL      = 1
-	QMAKE_DIR_SEP		= /
-	QMAKE_COPY		= cp
-	QMAKE_COPY_DIR		= xcopy /s /q /y /i
-	QMAKE_MOVE		= mv
-	QMAKE_DEL_FILE		= rm
-	QMAKE_MKDIR		= mkdir
-	QMAKE_DEL_DIR		= rmdir
-    QMAKE_CHK_DIR_EXISTS = test -d
-} else {
-	QMAKE_COPY		= copy /y
-	QMAKE_COPY_DIR		= xcopy /s /q /y /i
-	QMAKE_MOVE		= move
-	QMAKE_DEL_FILE		= del
-	QMAKE_MKDIR		= mkdir
-	QMAKE_DEL_DIR		= rmdir
-    QMAKE_CHK_DIR_EXISTS	= if not exist
-}
-
-QMAKE_MOC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}moc.exe
-QMAKE_UIC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}uic.exe
-QMAKE_IDC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}idc.exe
+
+MINGW_IN_SHELL      = 1
+QMAKE_DIR_SEP		= /
+QMAKE_COPY		= cp
+QMAKE_COPY_DIR		= cp -a
+QMAKE_MOVE		= mv
+QMAKE_DEL_FILE		= rm -rf
+QMAKE_MKDIR		= mkdir -p
+QMAKE_DEL_DIR		= rm -rf
+QMAKE_CHK_DIR_EXISTS = test -d
+
+QMAKE_MOC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}moc
+QMAKE_UIC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}uic
+QMAKE_IDC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}idc
 
 QMAKE_IDL		= midl
 QMAKE_LIB		= ar -ru
-QMAKE_RC		= windres
+QMAKE_RC		= i486-mingw32-windres
 QMAKE_ZIP		= zip -r -9
 
-QMAKE_STRIP		= strip
+QMAKE_STRIP		= i486-mingw32-strip
 QMAKE_STRIPFLAGS_LIB 	+= --strip-unneeded
 load(qt_config)

или на основании этого патча, внести изменения самостоятельно.

Видно, что основные отличия это:

  • указание компилятора
  • указание путей
  • указание разделителя директорий (принудительно) и системных команд, типа копирования или переименования.

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

Второй файл qplatformdefs.h в редактировании не нуждается.

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

Ну и последние акт, запускаем qmake так:

qmake -spec win32-cross-g++ file.pro
make

Вот собственно и все, если код написан правильно и корректно, то все должно собраться и слинковаться.

PS повторюсь: не забудьте в дистрибуцию добавить нужные для работы DLL в частности mingwm10.dll (его можно взять из поставки mingw32)

PPS Полезная ссылка для Арч-юзеров, вообще для кросскомпиляции: http://aur.archlinux.org/packages.php?K=mingw32, там в том числе есть пакет mingw32-qt, в первом коменте к которому PKGBUILD собирающий пакет с Qt 4.5.3 для mingw32

14)
в общем мы можем взять копию установки с какой нить Windows-машины, разницы никакой, или попытаться собрать самому из исходников

// Текстовый редактор Medit

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

Требования

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

  1. т.к. нужно редактировать код, нужна подсветка синтаксиса, должна быть возможность создавать свои схемы подсветки
  2. автоотступ, как при вводе кода, так и при обычном текстовом редактировании
  3. отображение номеров строк, мне привычно - отдельной колонкой
  4. многооконный интерфейс образованный вкладками
  5. отступ блока кода и обратный отступ
  6. фолдинг - сокрытие блока кода
  7. поддержка кодировки текста
  8. поддержка поля вывода для внешних команд
  9. собственно вызов внешних команд
  10. боковые панели для быстрой навигации по дереву каталогов и открытия файлов (удобно работать в проекте)
  11. расширяемость - простые средства добавления нового функционала, без написания кода.

Знакомимся - MEdit

Повторю то, что кратко сказал в первом посте про данный редактор:

MEdit15) замечательный редактор, написанный на Gtk, пока, за малым исключением, удовлетворяет все мои запросы. Корнями уходит графическому интерфейсу GGAP16) для GAP17).

Теперь же давайте рассмотрим его соответствие моим требованиям к хорошему текстовому редактору:

  1. подстветка синтаксиса: есть, описание в xml файлах, можно делать свои схемы
  2. автоотступ: есть
  3. отображение номеров строк: есть
  4. многооконный интерфейс образованный вкладками: есть
  5. отступ блока кода и обратный отступ: есть, в конфигурации по-умолчанию клавишами Tab и Shift+Tab соответственно
  6. фолдинг: нет, но как оказалось, в тех редакторах, что он есть, мною не использовался.
  7. поддержка кодировки текста: есть, но иногда после переключения нужно делать File → Reopen With Codepage…
  8. поддержка поля вывода для внешних команд: есть + поддержка фильтров, но это подробнее позже
  9. собственно вызов внешних команд: есть, через механизм Инструментов (или Тулов, от английского Tools)
  10. боковые панели для быстрой навигации по дереву каталогов и открытия файлов: есть
  11. расширяемость: есть, через механизм плагинов (C или Python), через механизм Инструментов, которых реализован ооооочень удобно.

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

Инструменты

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

Сами инструменты могут быть описанием программы на встроенном Python, LUA или быть командой оболочки (в большинстве случаев - BASH).

Общие параметры для всех языков, это:

  • Включен - определяет включен инструмент или нет
  • Файлы - задает, в случае открытия какого файла будет доступен данный инструмент (например в зависимости от того файл какого языка мы редактируем). Тут могут быть заданы маски файлов, выражение типа: langs: c++, c, pascal или регулярное выражение типа: regex:\.[ch]$. Пустое значение подразумевает что доступно при редактировании всех документов. На основе этого я сделал свой тул для валидации кода php.
  • Параметры - определяют при каких условиях инструмент будет отрабатывать, представляет собой разделенный запятыми список:
    • need-doc - документ должен быть открыт
    • need-file - инструмент не будет работать для новых, ещё не сохраненных на диск файлов
    • need-save - документ будет сохранен перед выполнением команды
    • need-save-all - все открытые документы будут сохранены перед выполнением команды

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

Для Типа команды «Команда оболочки» доступны так же следующие параметры:

  • Ввод - что будет посылаться на стандартный ввод команды, скрипт должен уметь принимать стандартный ввод
  • Вывод - куда будет посылаться вывод команд:
    • Ничего - никуда, редактор будет недоступен пока команда не завершится
    • Ничего, асинхронно - никуда, можно сразу продолжать работу с редактором
    • Панель вывода - собственно текст будет выведен в панель вывода, к этому выводу можно определить фильтр, о чем скажу ниже
    • Последние пункты соответственно вставят результаты или в текущую позицию в документе или в новый документ.
  • Фильтр - как будет восприниматься текст в панели вывода. Например, если это сообщения компилятора, можно выделить строки содержащие сообщения об ошибках компиляции, подсветить их красным и сделать возможность перехода на строку с ошибкой по клику мыши. Определено несколько стандартных фильтров:
    • Default - ничего не подствечивает, если строка вывода начинается с имя_файла:номер_строки то по клику по такой строке будет произведена попытка открыть файл и перейти на указанную строку.
    • Остальные специфичны для конкретных применений. Посмотреть их описания можно в /usr/share/moo/filters.xml

Описания языка LUA и Python можно посмотреть в справочном руководстве к редактору, в формате HTML, если он у вас установлен по тем же путям, то можно открыть по этой ссылке: file:///usr/share/doc/medit/help/sect-user-tools.html

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

  • $DOC - имя документа без пути к нему
  • $DOC_DIR - полный путь к документу
  • $DOC_BASE - имя документа без расширения (последнего элемента отделенного точкой)
  • $DOC_EXT - расширение документа
  • $LINE - номер строки в которой стоит курсор
  • $DATA_DIR - директория в которой хранятся настройки medit, бывает удобно, что бы некоторые сценарии сохраняли или читали от туда свои настройки.

Как реализовывать конкретный функционал, уже удел вашей фантазии.

Да! На каждый созданный документ, можно после в Изменить → Настройка горячих клавиш, можно настроить свою клавишу. Оду и ту же клавишу можно назначать на разные инструменты, если они выбираются для разных файлов. Если будет отображаться одновременно два инструмента с одинаковой горячей клавишей, будет выполнен тот, который идет раньше.

Остальное

Тут кратко рассмотрю основные интересности о medit:

  • описание синтаксиса можно сохранять в пользовательскую директорию: ~/.local/share/medit/language-specs
  • свои фильтры можно добавлять в файл ~/.local/share/medit/filters.xml причем нужно писать только сам фильтр, например:
    <filter id="php-syntax-check" name="php-syntax-check">
      <match what="stderr" pattern=".*Parse error:.* in (?P&lt;file&gt;[^:]+) on line (?P&lt;line&gt;\d+)" style="output-error" /
      <match what="stdout" pattern=".*Parse error:.* in (?P&lt;file&gt;[^:]+) on line (?P&lt;line&gt;\d+)" style="output-error" /
    </filter>

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

Собственно пока всё, будет дополняться.

// Как запустить...

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

Начальная загрузка

Тут относительно просто, и уже все рассмотрено в интернетах, но пару слов скажу.

После того как ядро загрузилось, оно передает (в общем случае) управление пользовательскому процессу init (обычно /sbin/init), который дальше запускает необходимые скрипты, соотвутствующие разным уровням запуска (знаменитые run-levels18)). Какие скрипты будут запускаться, определяется в файле /etc/inittab, там же определяется какой run-level будет использован для запуска, по умолчанию (его можно передать через команду загрузки ядра), в классической схеме, это - 3. В модных дистрибутивах, это - 5.

Hint: man inittab

Скрипты запуска, указанные в конфиге init, обладают своей логикой, в зависимости от дистрибутива, в большинстве своём, реализуют схему загрузки в стиле SysV (Mandriva (ex. Mandrake), Fedora (ex. RedHat), AltLinux, ASPLinux и им подобные) или BSD-like (типа Slackware, ещё примеров не приведу). Часто схему трудно определить, например в моём любимом ArchLinux: вроде просто набор скриптов в /etc/rc.d, но управляются порядком запуска удобно через /etc/rc.conf.

Обычно скрипты, запускаемые лежат в /etc/rc.d или /etc/init.d, как их запускать в различных ранлевелах, рассказывать не моя задача, хочу сказать, что так или иначе, всегда есть специальный скрипт с именем /etc/rc.local, или /etc/rc.d/local, или /etc/init.d/local или различные вариации на эту тему (интересно для своего дистрибутива - поищите в http://google.com/linux). Этот скрипт нужен, что бы пользователь прописал туда свои команды, которые нужно выполнить при загрузке. В некоторых системах существует скприт rc.local.shutdown, который выполняется при выключении или перезагрузке, поищите его у себя.

Справедливости ради, стоит отметить, что схемой init/SysV/BSD схемы загрузки не ограничиваются, у меня на сервере, допустим, дополнительно используется daemontools для управления автоматическим подключением по pppoe19). Данный механизм относится к асинхронной загрузке + перезапуск сервиса в случае его краха. Кроме того, существуют варианты загрузки с зависимостями (в ArchLinux существуют только базовые средства для определения зависимостей), когда запускаемый процесс определяет, что ему нужно для работы ещё какие-то процессы и автоматически пытается их загрузить. В общем, тут есть что почитать для общего развития, для начала - про свой дистрибутив.

Подытоживая: при начальной загрузке в ArchLinux, пользовательские команды можно прописать в файл /etc/rc.local, команды, выполняемые при выключении/перезагрузки можно прописать в /etc/rc.local.shutdown. Обратите внимание: это файлы можно править только от root'а, и команды из них выполняются только от пользователя root, соответственно, если нужно понизить привилегии, используйте команды:

su - <USER> <COMMAND>

или

sudo -u <USER> <COMMAND>

Вход в систему

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

Итак, вы загрузились, у вас на экране приглашение ввести логин и пароль. Задумываемся, а как сделать так, что бы команды выполнялись после ввода логина и пароля…

Тут немного отвлечемся.

У каждого пользователя или через /etc/passwd или через ldap или ещё какую пень-колоду но задана командная оболочка, в народе - шел20), после успешной проверки имени и пароля, собственно и запускается для пользователя эта его оболочка. В качестве её можно, впринципе, прописать что угодно, есть даже такие команды замечательные: /bin/false или /bin/true, которые можно прописать, и пользователь никогда не войдет в систему (например, ему доступна только почта, удаленно, зачем ему давать локальный файловый доступ?) или rssh - оболочка для ограниченного доступа по ssh, если хотим, что бы пользователь мог заливать себе файлы, но не мог зайти в командный режим (понятно, ога, мне самому не поятно :-D)

В общем, при запуске, оболочка считывает настройки и выполняет команды, например bash:

  • выполняет команды из /etc/profile - общесистемный
  • из /etc/profile цепляется файл /etc/profile.bash - для конкретной оболочки
  • далее цепляются скрипты из /etc/profile.d/*.sh
  • после выполняются файлы в домашней директории пользователя:
    • ~/.bash_profile
    • ~/.bash_login (если не обнаружен предыдущий)
    • ~/.profile (если не обнаружен предыдущий)
    • ~/.bashrc (всегда)

Вышеперечисленные файлы, кроме .bashrc, выполняются только когда оболочка bash запускается как login-shell (с параметром -l), т.е. или сразу после ввода логина и пароля, или когда принудительно запущена как 'bash -l'

.bashrc выполняется каждый раз, когда запускается копия шела, а это происходит, например, когда запускается терминал (xterm, termit, konsole, gnome-terminal и пр.). Удобно сюда запихать вызов команд fortune и celebrat или cowsay наблюдать забавные фортунки и нотификации:

cowsay `date` `uname -a`
echo
celebrat
echo
fortune ru
echo

вот что имеем в итоге:

 ______________________________________ 
/ Fri Oct 30 10:23:42 VLAT 2009 Linux  \
| gaz_eeepc 2.6.31-ARCH #1 SMP PREEMPT |
| Fri Oct 23 11:12:58 CEST 2009 i686   |
| Intel(R) Atom(TM) CPU N270 @ 1.60GHz |
\ GenuineIntel GNU/Linux               /
 -------------------------------------- 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Meeting at the LUG tomorrow.
День военной разведки РФ six days from now.

Рyкописи, может быть, и не горят. Зато диски С отлично форматирyются.

Когда login-shell закрывается (набрали exit или logout) выполняются команды из файла ~/.bash_logout

Загружаемся в X-Window

Теперь дошла очередь до загрузки иксов.

И вновь нам нужно что-то как-то запустить. Я опишу свой случай, когда используется такая связка: staybox + openbox.

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

  1. прописывать системные команды в /etc/X11/xinit/xinitrc
  2. создавать скрипты в /etc/X11/xinit/xinitrc.d
  3. свои персональные команды в ~/.xinitrc

Первые два игнорируются, когда в домашней директории есть файлик ~/.xinitrc, так что, если вы рулите иксами через него, подцепляйте системные из /etc/X11/xinit/xinitrc.d:

source /etc/X11/xinit/xinitrc.d/*

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

(sleep 5; command ) &

В конце файла ~/.xinitrc всегда должна стоять команда

exec <ваш оконный менеджер или DE>

без всяких & в конце.

Пример моего файла, некоторые команды закоментированы (исторически сложилось :))

#!/bin/sh
 
#
# ~/.xinitrc
#
# Executed by startx (run your window manager from here)
#
 
# http://www.linux-archive.org/debian-kde/20524-fish-ssh-kioslave-doesnt-work.html
export KDE_FORK_SLAVES=true
 
xhost +127.0.0.1
xhost +localhost
#kdeinit &
#gnome-settings-daemon &
 
#asusosd &
#noteo &
 
xscreensaver -nosplash &
xrdb ~/.Xdefaults
 
#gkrellm &
#osmo &
#xfce4-power-manager
xbindkeys
#wicd-client
#icewmtray &
 
(sleep 5; sbxkb) &
 
#numlockx
#blueman-applet &
 
# regenerate menu
#mmaker -f -t xfterm icewm &
 
#nvidia-settings -a InitialPixmapPlacement=2
 
source /etc/X11/xinit/xinitrc.d/*
#gnome-keyring-daemon -d
 
exec ck-launch-session staybox-session
#exec openbox-session
#icewm-session
# exec icewm
#exec startkde
# exec blackbox
# exec fluxbox
#exec startxfce4
#exec afterstep
#exec xterm
 
 
##################################################################
# For LXDE only
##################################################################
 
# Корректор клавиатурного ввода, индикатор раскладки
#gxneur &
 
# Мыльный нотификатор
#mail-notification &
#gnubiff --systemtray --nogui &
 
#exec startlxde
#exec xterm
 
#exec /usr/share/antico/antico

Всякие менеджеры сессий, которые являются неотъемлемой частью различных DE: KDE, Gnome, XFCE, LXDE и т.п. или используемый мною Staybox для собственного окружения, так же читают .desktop файлы из директорий:

  1. системные, общие для всех пользователей: /etc/xdg/autostart/
  2. пользовательские: ~/.config/autostart/

Кроме того, у Staybox есть файл ~/.config/staybox/autostart в который можно в специальной форме прописывать команды, так если перед именем команды ставить @, то менеджер будет следить за ним, и, если он рухнет - перезапускать.

У меня в этом файле прописано:

@lxpanel
@pcmanfm -d
dbus-launch nm-applet

Staybox после запускает оконный менеджер, по умолчанию это OpenBox. У него тоже свои средства для запуска приложений, это файл: ~/.config/openbox/autostart.sh

Для оконного менеджера IceWM, файлом запуска будет ~/.icewm/startup

Хочется отметить, что в случае использования xdm/gdm/kdm/slim или им подобным графическим менеджерам входа в систему, стадия пользовательского .xinirc пролетает, и там следует отдельно читать как выполнить свои команды, но я данный подход не использую, поэтому особо и не страдаю.

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

18)
0 - останов; 1(S) - однопользовательский режим; 2 - зарезервирован; 3 - многопользовательский режим; 4 - зарезервирован; 5 - запуск графической системы; 6 - перезагрузка
20)
от слова shell

// NetworkManager

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

Это пост-размышление и попытка найти золотую середину.

Итак, исходное: нетбук Asus EeePC 1000H, дистрибутив ArchLinux, из тех менеджеров, что можно найти в стандартных репозитариях: networkmanager, wicd, nuts (в AUR или в чакра-проджект).

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

wicd

Исторически так сложилось, что это был первый мененджер сетевых подключений, который я использовал. Он меня всем устраивал, даже тем, что можно было указать только под одному сетевому интерфейсу для проводной и беспроводной сети. Все, больше ничего лишнего: не VPN, не PPPoE, ни подключения телефона и т.п. Только управление профилями проводных и безпроводных (WIFI) сетей.

Изначально обладал только графическим клиентом - wicd-client, в последних версия обзавелся и консольным - wicd-curses, и все бы было хорошо, если бы не написан на питоне (есть у меня предубеждения к этому языку, считаю его идеальным для обучения хорошему стилю кодирования, но не как не для создания полноценных приложений, по сути, в мире *nix он стал эквивалентом Visual Basic для Windows).

Ладно, мне главное ехать, а не шашечки. Но в какой-то момент времени стали наблюдаться непонятные события - при отключении сетевого подключения (например если просто вынуть кабель) долгие тормоза, при этом от системы никакого отклика. Те же события при подключении, причем, я не могу выловить закономерности (мало-мало грешу на флеш в Firefox, конкретно - всякие ролики типа с Ютуба). Это меня сподвигло на поиск альтернативы.

NetworkManager

Логичной альтернативой стал NetworkManager, разработанный в рамках проекта Gnome. Исследуя его зависимости, оказалось, что сам демон (NetworkManager) от gnome никак не зависит, а вот с клиентами чуть каша (про это позже).

Краткие возможности: написан на Си, что несколько радует, позволяет настраивать сеть по нескольким сетевым интерфейсам, как проводным так и беспроводным, позволяет настраивать соединения по PPPoE, поддерживает настроку VPN (OpenVPN, pptp и ещё что-то), но через допольнительные плагины (которые требуют, для чего-то, установленного network-manager-applet)

Стандартный клиент - gnetwork-manager-applet (вызывается nm-applet), встраивается в системный трей, откуда можно вызвать и конфигуратор, имеет гномовские зависимости: gnome-keyring, policykit-gnome, notification-daemon

Есть клиент для KDE - knetworkmanager, к сожалению есть только в AUR21) и только для KDE3

Для консоли, клиент cnetworkmanager-git или cnetworkmanager, опять таки только в AUR22). Клиент написан на питоне.

В общем, GUI клиента без лишних DE зависимостей пока найти не удалось, так что если кто предложит, написанный только на QT/Gtk, буду благодарен, а пока наблюдаю работа в nm-applet.

nuts

Орешки :) Но пока я его не расколол - в клиенте так и не увидел ни одного профиля. Из минусов программы: жесткая настройка сетевых профилей в конфигурационном файле, но работать может с несколькими интерфейсами. В комплекте графический клиент на QT4 - qnut и консольный - cnut.

Доступен из AUR23) или из репозитариев чакра-проджект24), для отстройки нужен пакет kdemod-openresolv25) и хотя оба пакета в своём названии содержат kdemod, никаких kde зависимостей они не тянут26).

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

// EeePC: 2.6.31.4 + wifi

EeePC 1000HA, wifi, карторчка Atheros (чип - AR2425, согласно этому, это AR5007EG, хотя lspci называет её как AR5001), ядро 2.6.31.4

возможные драйвера:

  • ath5k - стоковый
  • madwifi-hal - из AUR
  • ndiswrapper - из core + виндовый драйвер (нужны *.sys и *.inf файлы)

Поведение:

ath5k
У меня вообще отказался нормально работать, соединение устанавливается только при перезагрузке системы, после, если выгружать подгружать драйвер, ноль реакции.

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

madwifi-hal
Работает. Не сумел завести карточку в режиме 802.11g, хотя она это поддерживает, как и точка доступа. Скорость крайне медленная, меньше 1 мбита, хотя точка в 1.5 метрах. Иногда бывают затыки, потом на короткое время соединение опять поднимается.

ndiswrapper
наконец дошли руки попробовать, точне довело: раньше нормально работал madwifi-hal, поставил, особо ничего трудного, в вики есть немного информации. Карта встала как 802.11g, скорость в выводе iwconfig светится как 54Mbit, но, судя по всему, сумма в обе стороны, скачка большого файла с сервера идет со скоростью примерно 2.7 Мбайт/сек, что примерно равно 24мбит. Пока ещё наблюдаем, надеюсь, с madwifi-hal что–то сделают.

UPD: а у этого способа оказался свой косяк: убивается, со временем, шина USB, перестаёт реагировать мышка, принудительная выгрузка модулей помогает, но следующий слет USB приводит к Kernel Panic

Настройка

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

ath5k/ath9k

ath9k драйвер используется для новых карточек 802.11n

  1. /etc/rc.conf:
    MODULES=(... !ndiswrapper ath5k !ath_hal !ath_pci ...)
  2. /etc/modprobe.d/wifi_balacklist.conf:
    blacklist ndiswrapper
    blacklist ath_hal
    blacklist ath_pci
  3. при использовании acpi-eeepc-generic, /etc/conf.d/acpi-eeepc-generic.conf:
    WIFI_DRIVERS=("ath5k")

madwifi-hal

  1. скачиваем из AUR: http://aur.archlinux.org/packages.php?ID=20857, распаковываем, строим, устанавливаем, без подробностей.
  2. /etc/rc.conf:
    MODULES=(... !ndiswrapper !ath5k ath_hal ath_pci ...)
  3. /etc/modprobe.d/wifi_balacklist.conf:
    blacklist ndiswrapper
    blacklist ath5k
    blacklist ath9k
  4. /etc/modprobe.d/madwifi.conf:
    options ath_pci autocreate=sta ratectl=minstrel countrycode=0 xchanmode=1 intmit=1 ath_debug=1 ieee80211_debug=1

    вы можете поиграться с этими опциями, посмотреть можно по modinfo ath_pci

  5. при использовании acpi-eeepc-generic, /etc/conf.d/acpi-eeepc-generic.conf:
    WIFI_DRIVERS=("wlan_tkip" "wlan_ccmp" "ath_pci" "ath_rate_sample" "ath_hal" "wlan_scan_sta" "wlan")

ndiswrapper

Пока использую его на последнем ядре.

  1. Устанавливаем ndiswrapper и ndiswrapper-utils
  2. /etc/rc.conf:
    MODULES=(... ndiswrapper !ath5k !ath_hal !ath_pci ...)
  3. /etc/modprobe.d/wifi_balacklist.conf:
    blacklist ath_pci
    blaclist ath_hal
    blacklist ath5k
    blacklist ath9k
  4. распаковать виндовый драйвер (можно взять отсюда последний: http://www.atheros.cz), выполнить команды от рута:
    ndiswrapper -i netathw.inf
    ndiswrapper -l
    ndiswrapper -m
  5. при использовании acpi-eeepc-generic, /etc/conf.d/acpi-eeepc-generic.conf:
    WIFI_DRIVERS=("ndiswrapper")

// Генерация меню в IceWM

Подробно это описано в АрчВики по следующим ссылкам:

Рекомендую использовать первый способ, а ещё - подкорректировать вики, у меня пока руки не доходят.

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

xdg_menu.diff
--- xdg_menu.old	2009-10-08 15:27:26.387920020 +1100
+++ xdg_menu.new	2009-10-08 15:25:09.995432647 +1100
@@ -65,6 +65,89 @@
     }
 }
 
+sub findicon
+{
+
+#       my $theme = "hicolor";
+
+        my $iconname = shift;
+
+
+        my $home = $ENV{"HOME"};
+        my $xdg_data_dirs = $ENV{"XDG_DATA_DIRS"};
+
+        my (@xdg_data_dirs);
+        @xdg_data_dirs = split(":",$xdg_data_dirs);
+
+        my (@icon_search_path);
+
+        my (@categorylist);
+        @categorylist = ("apps", "places", "devices", "actions", "animations", "categories", "emblems", "emotes", "filesystems", "intl", "mimetypes", "status", "stock");
+
+        my (@sizelist);
+        @sizelist = (16, 22, 24, 26, 32, 36, 48, 64, 72, 128, 192, 256);
+
+        my $thisdir = $home."/.icons";
+        ( -d $thisdir ) && push @icon_search_path, $thisdir;
+        foreach my $dir (@xdg_data_dirs)
+        {
+                my $theme = "hicolor";
+                my $size;
+                my $category;
+                foreach $size (@sizelist)
+                {
+                        foreach $category (@categorylist)
+                        {
+                                $thisdir = $dir."/icons/".$theme."/".$size."x".$size."/".$category;
+                                ( -d $thisdir ) && push @icon_search_path, $thisdir;
+                        }
+                }
+                $thisdir = $dir."/icons/mini";
+                ( -d $thisdir ) && push @icon_search_path, $thisdir;
+                $thisdir = $dir."/icons";
+                ( -d $thisdir ) && push @icon_search_path, $thisdir;
+                $thisdir = $dir."/icons/large";
+                ( -d $thisdir ) && push @icon_search_path, $thisdir;
+                $theme = "gnome";
+                foreach $size (@sizelist)
+                {
+                        foreach $category (@categorylist)
+                        {
+                                $thisdir = $dir."/icons/".$theme."/".$size."x".$size."/".$category;
+                                ( -d $thisdir ) && push @icon_search_path, $thisdir;
+
+                        }
+                }
+        }
+
+        push @icon_search_path, "/usr/share/pixmaps";
+
+        my $filename;
+
+        #if ( -f $iconname )
+        #{
+        #        return $iconname;
+        #}
+        #else
+        {
+
+                foreach my $dir (@icon_search_path)
+                {
+                        foreach my $ext ('','.png','.xpm')
+                        {
+                                $filename = $dir."/".$iconname.$ext;
+                                ( -f $filename ) && return $filename;
+                        }
+                }
+        }
+}
+
+sub add_png_extension_if_needed ($)
+{
+        my ($f) = @_;
+        return $f =~ /\.(png|xpm|svg)$/ ? $f : "$f.png";
+}
+
 sub scan_AppDir ($$;$)
 {
     my ($pool, $dir, $topdir) = @_;
@@ -1565,11 +1648,13 @@
     $indent = 0 unless defined $indent;
 
     my $menu_name = $menu->{'PrepName'};
+    #my $menu_icon = $menu->{'PrepIcon'} || "folder" ;
+    my $menu_icon = findicon($menu->{'PrepIcon'} || "folder");
 
     if($indent)
     {
 	$output .= ' ' x $indent;
-	$output .= "menu \"$menu_name\" folder {\n";
+	$output .= "menu \"$menu_name\" $menu_icon {\n";
     }
 
     foreach my $entry (@{$menu->{'entries'}})
@@ -1580,9 +1665,10 @@
 
             my $name = $desktop->{'PrepName'};
             my $exec = $desktop->{'PrepExec'};
+            my $icon = findicon(add_png_extension_if_needed($desktop->{'Icon'})) || "-";
 
             $output .= ' ' x $indent;
-            $output .= " prog \"$name\" none $exec\n";
+            $output .= " prog \"$name\" $icon $exec\n";
         }
         elsif ($entry->{type} eq 'menu')
         {

У меня получилось примерно следующее:

// Интернет радио

Искал, что себе подключить на послушать на работе, в результате ничего подходящего не нашел. Сделал на связке mpd+icecast2 (почитать можно тут и тут).

Адрес: http://hatred.homelinux.net:8000
Добавить в проигрыватель: http://hatred.homelinux.net:8000/radio.ogg

Пару заметок для ArchLinux:

  1. создать директорию: /var/log/icecast и сменить владельца на nobody
  2. прописать в загрузке сначала icecast, потом mpd

Ну и запустил вещание свободной музыки с Magnitune, добавлял при помощи плагина к gmpc - gmpc-magnatune.

ЗЫ сегодня в эфире джаз :)

// Непонятки с MIME типами

Тут столкнулся с проблемой: появляются временами у меня файлики, документики подготовленный в ворде с расширением *.doc и вот незадача, когда, допустим в Thunar'е пытаемся их запустить - пытается загружать в текстовый редактор mousepad. Через свойства задаешь окрывать в OpenOffice Writer, так после этого все текстовые файлы начинают открываться в нем, почесал репу…

запустил mime-editor, смотрю тип text/plain и что я вижу? А вижу, что в условиях определения типа стоит расширение *.doc… какого… При этом существует тип application/msword который делает что нужно.

Ползу в /usr/share/mime делаю

grep -R '*.doc' ./

Смотрю где упоминается '*.doc' и что теперь я вижу? Добрые люди из KDE сделали такое в файлике packages/kde.xml:

  <mime-type type="text/plain"> <!-- As discussed on xdg list, *.doc is needed here for disambiguation -->
    <glob pattern="*.doc"/>
  </mime-type>

Пусть сами себе там дискутируют, взял и удалил нафиг эту секцию, после чего сделал

sudo update-mime-database /usr/share/mime

и перезапустил xfce, теперь все нормально.

// Перекодировка тегов MP3

Установите пакет mutagen:

pacman -Sy mutagen

В каталоге с вашей коллекцией mp3 файлов выполните команду:

find -iname '*.mp3' -print0 | xargs -0 mid3iconv -eCP1251 --remove-v1

Команда перекодирует старые теги из кодировки CP1251 в UTF8, запишет тег версии id3v2.4 и удалит теги первой версии.

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

Hint: в mpd после этого нужно перечитать список проигрывания, например так:

mpc update (дождитесь завершения, статус можно смотреть запуская mpc без параметров)
mpc clear
mpc listall | mpc add

Опционально:

mpc rm all
mpc save all

P.S. Попутно обновил страницу интернационализации на ArchWiki

// Firefox и память

Про стандартный malloc и firefox можно много пошукать в нете. Для лучшей работы предлагают использовать реализацию malloc из OpenBSD. Исходники я опакетил и залил в AUR: openbsd-malloc.

Вот так можно использовать вместе с firefox, скрипт firefox.sh:

#!/bin/bash
 
#ulimit -v 300000
MOZ_ENABLE_PANGO=0 LD_PRELOAD=/opt/lib/malloc.so /usr/bin/firefox.orig "$@"

особо-фанатичным можно поиграть с ulimit.

предположим, сохранили его в домашней директории, далее делаем такое:

sudo mv /usr/bin/firefox /usr/bin/firefox.orig
sudo cp firefox.sh /usr/bin/firefox
sudo chmod 755 /usr/bin/firefox

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

~~odnaknopka~~

// Asus EeePC 1000HA и AHCI

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

Для начала выяснилось, что жесткий диск у меня SATA, а не IDE и поддерживает NCQ. Вот его включить и захотелось.

// ArchLinux: делаем UXA акселерацию на Intel 945GME

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

  • ядро 2.6.29
  • oxrg 1.6.0
  • xf86-video-intel 2.6.3

В новых драйверах для xorg появилась возможность использовать акселерацию UXA, вопрос - как её получить?

А просто.

// Переключение раскладок клавиатуры

Если коротко: есть повод открыть шампанское! Исправлена проблема, которая очень напрягала в последнее время большую часть сообщества ArchLinux.

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

  • xproto
  • xorg-server-utils
  • xorg-server

нормально заработали индикаторы раскладки клавиатуры, проверено на xfce-xkb, akxb и fbxkb, есть подтверждение на форуме, что заработало в кде.

// Софт на Qt4

Вот наткнулся случайно: список приложений написанных на Qt4 по английски, но выбрать себе можно. Мне вот понравился браузер Arora, в репозитариях есть arora (extra) и arora-git (community). Но про браузеры ещё будет пост ;)

// Настройка принтера Samsung ML-1520P: обновление статьи

Обновил статью Настройка принтера Samsung ML-1520P.

Отмечено что закрытые драйвера больше не поддерживаются и не располагаются на сайте Самсунга, добавлен обзор настройки через samsunggdi и splix, добавлена ссылка на закрытые драйвера (расположил на моём сайте, если будут притензии, придется удалить).

// XFCE 4.6, exo и опять опции монтирования

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

Недавно вот даже вышла версия 4.6 XFCE, а баг был запощен вроде даже в 4.2, жалко. К счастью немного посидел на LXDE, где, в замечательном файловом менеджере PCManFM таки сделали возможность указания опций монтирования, я подглядел как там сделали, и подготовил вторую версию патча. Файл настроек без именений берется из PCManFM.

А в целом впечатления от XFCE 4.6 положительные :)

// strace и его аналоги в других *nix (truss, par)

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

// EeePC и обновление до ядра 2.6.28

В репозитариях ArchLinux появилось ядро 2.6.28, сегодня утром проивел обновление системы. Сразу всплыло несколько проблем:

  • некорректно работает тачпад в иксах
  • странно работает wifi

Итак, по порядку…

Elantech Touchpad

Input устройства у меня подключены через hal, соответственно в /etc/hal/fdi/policy лежал (да и лежит) файлик 09-x11-elantech.fdi вот только беда, после обновления он вроде как не цепляется (точнее это я понял потом, что он не цепляется).

Симптомы такие:

  • «дерганное» передвижение курсора в иксах, отсутствие реакции на слабые перемещения по тачпаду
  • при переключении из иксов в консоль и обратно: курсор вообще перестает двигаться, в консоли наблюдаем: FIXME
    (EE) EXPS/2 Elantech Touchpad: ... - disabled

Причины, трудно сказать кто конкретно - hal или ядро, но внутри fdi была строчка:

<match key="info.capabilities" contains="input.touchpad">

посмотрев вывод hal_device я обнаружил, что у тачпада в списке capabilities нет строки input.touchpad, есть только input и input.mouse, поэтому вышеуказанная строчка приобрела вид:

<match key="info.capabilities" contains="input.mouse">

и полный fdi стал такой:

<?xml version="1.0" encoding="ISO-8859-1"?>
<deviceinfo version="0.2">
  <device>
    <match key="info.capabilities" contains="input.mouse">
        <match key="info.product" contains="Elantech Touchpad">
        <merge key="input.x11_driver" type="string">synaptics</merge>
        <merge key="input.x11_options.SHMConfig" type="string">on</merge>
        <merge key="input.x11_options.MaxSpeed" type="string">1.00</merge>
        <merge key="input.x11_options.MinSpeed" type="string">0.75</merge>
        <merge key="input.x11_options.Emulate3Buttons" type="string">on</merge>
        <merge key="input.x11_options.VertTwoFingerScroll" type="string">1</merge>
        <merge key="input.x11_options.HorizTwoFingerScroll" type="string">1</merge>
        <merge key="input.x11_options.TapButton1" type="string">1</merge>
        <merge key="input.x11_options.TapButton2" type="string">2</merge>
        <merge key="input.x11_options.TapButton3" type="string">3</merge>
        <merge key="input.x11_options.LockedDrags" type="string">11</merge>
      </match>
    </match>
  </device>
</deviceinfo>

после чего делаем /etc/rc.d/hal restart и, на всяк, перезапускаем иксы. Всё, работа восстановлена.

Wifi

Тут вспомнил, что на archlinux.org.ru проскакивала информация, что драйвер переделан для совместимости с rfkill.

Раньше карточку можно было включать/выключать записывая 1 или 0 в /sys/devices/platform/eeepc/wlan, теперь же это нужно делать через /sys/class/rfkill/rfkill0/state, соответственно нужно подправить конфиг для acpi: /etc/acpi/eee.conf (смотреть предыдущие статьи).

Но и это не всё.

К сожалению, одно сделали - другое поломали, т.е. раньше драйвер eeepc_laptop знал - включена или нет wifi карта и, соответственно, генерировал на нажатие Fn + F2 разные последовательности.

Теперь он не знает. Поэтому пришлось сделать небольшой хак (надеюсь временный), основанный на сиквенс-намбере нажатия - делим на 2 и получаем остаток, если 0 - выключаем карту, если 1 - включаем.

Что бы это работало - меняем файл /etc/acpi/eee-handler.sh, находим где обрабатываются hotkey (строчка «hotkey)») далее ищем «00000010) # wlan on» комментируем строку

#/etc/acpi/eee/wlan.sh poweron

и прописываем вот такие команды

# some hack for 2.6.28 stock kernel
rez=$(( 0x$4 % 2 ))
[ $rez -eq 0 ] && /etc/acpi/eee/wlan.sh poweroff
[ $rez -eq 1 ] && /etc/acpi/eee/wlan.sh poweron

неприятно что asusosd будет постоянно говорить что wifi включается :(

В заключение

Нашел вот это:

новые темы в вики, на форуме и в AUR касательно Asus EeePC 1000

// Обновление udev 130->135 или как пропал интернет

После очередного обновления системы обновился udev с версии 130 на 135. Попутно хочу сказать, у меня две сетевых карточки, и, что бы именования интерфейсов сохранялись, используется 75-persistent-net-generator.rules, благодаря которому генерируется 70-persistent-net.rules.

Так вот, в новом udev произошли обновления, из-за которых старый 70-persistent-net.rules оказался несостоятельным. Имена сетевых интерфейсков поменялись, в результате PPPoE не поднимался. Пришлось удалить файл и переименовать 75-persistent-net-generator.rules.optional в 75-persistent-net-generator.rules и перечитать правила, подправить получившийся 70-persistent-net.rules. Но этого мало: нужно или выгрузить и подгрузить модули сетевух или перезагрузить систему, что бы правила подействовали на именование интерфейсов.

Собственно, вот такая вот ремарка.

// EeePC: dpi & wifi

В продолжение изначальной темы про мой EeePC. Разберем вопрос правильного задания DPI и как пользоваться WIFI и вообще сетью на ноутбуке.

DPI

Как задавать DPI (dots per inch / точек на дюйм) рассказано в статье про установку Arch Linux на EeePC 901 (смотреть мой первый пост про EeePC на этом блоге или пользоваться поиском на ArchWIKI). Я же хочу разобраться как получить это значение вообще, и какое оно будет для EeePC 1000HA, в частности.

Итак, разрешение матрицы монитора X на Y точек (пикселей). Тогда количество точек по диагонали:

Z = sqrt(X^2 + Y^2)

Диагональ монитора D дюймов, тогда значение DPI:

DPI = Z / D

Округляем его до большего целого.

Для EeePC имеем разрешение матрицы 1024×600 пикселей и диагональ 10.2 дюйма:

Z = sqrt(1024^2 + 600^2) = 1186.8
DPI = 1186.8 / 10.2 = 116.36 ~ 117 dpi

Иногда встречается информация, что диагональ 10 дюймов… спорить не берусь, меня пока всё устраивает :)

А для моего ThinkPad T530 (15.6 inch, 1920×1080):

Z = sqrt(1920^2 + 1080^2) = 2202.90717
DPI = 2202.90717 / 15.6 = 141.21 ~ 141 dpi
Width = 15.6 / 2202.90717 * 1920 * 25.4 = 345.35 ~ 345 mm
Height = 15.6 / 2202.90717 * 1080 * 25.4 = 194.26 ~ 194 mm

Прописываем полученное значение в /etc/X11/xinit/xserverrc, где строчка запуска превращается примерно в такое:

exec /usr/bin/X -nolisten tcp -dpi 117 "$@"

При использовании всяких mdm, gdm, kdm и иже с ними, нужно параметры запуска Xserver искать у них в настройках. Плюс, при таких настройках строчка ниже упорно рапортует о 96dpi. Зато в логах Xorg.0.log гордо красуется 141 (это уже новый ноутбук). При конфигурировании через xorg.conf картина с точностью до наоборот.

Перезапускаем, проверяем при помощи xdpyinfo:

xdpyinfo | grep -B2 resolution:

На картах nVidia (это уже не про EeePC :-)) есть опция для драйвера DPI, использовать её как-то так:

Section "Device"
    Identifier          "Card0"
    Driver              "nvidia"
    ...
    Option              "UseEdidDpi"   "false"
    Option              "DPI"          "141 x 141"
EndSection

Для других карт поможет DisplaySize в миллиметрах (сохраняем, например, в /etc/X11/xorg.conf.d/90-monitor.conf):

Section "Monitor"
	Identifier "<default monitor>"
	DisplaySize 345 194 # посчитали выше
EndSection

Более подробно:

WIFI

Хотя не только он, но больше про него.

Первое, говорится что стандартный драйвер не очень хорошо работает, я не стал проверять, поставил madwifi-hal из AUR. Надо только занести модуль ndiswrapper в blacklist или вообще удалить пакеты ndiswrapper и ndiswrapper-utils (если были поставлены). Если с драйвером madwifi-hal карточка не заведется, то, как рекомендуют форумы, стоит попробовать родной драйвер ath5k, и наоборот.

Да, я думаю пакет acpi-eee901 у вас уже стоит, так вот, стоит отредактировать файл /etc/acpi/eee.conf, конкретно, изменить значение переменной WIRELESS_MODULE и поставить её в ath_pci (в случае использования madwifi-hal) или ath5k (в случае использования стокового драйвера).

Теперь дело за малым. За менеджером соедененний.

Ноутбук устройство мобильное, и может использоваться в различных сетях, каждый раз править /etc/rc.conf и перезапускать сеть не выход. На помощь приходят менеджеры соединений. На себе проверил wicd, который есть в репозитариях ArchLinux. Прочитать про его настройку можно тут. Хотя я настроил методом «научного клика» и все заработало на ура :)

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

Проверил работу wifi совместно с wicd на работе - работает :) На этом тема wifi для меня пока закрыта.

// Asus EeePC 1000HA

На прошлой неделе пришел мне сабжевый нетбук. Машинка неплохая, мне, вцелом понравилась :)

В продаже, на момент покупки была только версия с WindowsXP SP3, которую по приходу снес и поставил туда ArchLinux.

При конфигурировании пользовался статьями а ArchWiki:

По результату, использую стоковое ядро, вайфай ещё не трогал, пока родной стоковый драйвер сетевой карточки (но уже сталкивался с ошибкой в назначении MAC адреса, так что нужно будет обновиться). Тачпад настроил пока по дефолту, настроил ACPI (из первой статьи для Eee PC 901), так что кнопочки все работают, suspend2ram работает тоже, звук изменяется и яркость тоже. Настроил cpufreq в целях экономии батареи. В общем ещё опишу что да как.

В планах:

// Sakura и Termit

На форуме русского сообщества ArchLinux в разделе скриншотов за декабрь 2008 появилась тема, там, на снимке экрана фигурировал эмулятор терминала Sakura, решил попробывать.

Sakura

Терминал зависит только от GTK и компоненты VTE, умеет UTF-8, табы. Есть в community репозитария ArchLinux. После запуска имеет примерно такой вид:

sakura

Все настройки, коих аскетично мало, делаются через контекстное меню:

sakura2

Конечно, горячие клавиши, тут даю на основные операции, что меня интересуют:

  • Ctrl-Shift-t - создать новую вкладку
  • Ctrl-Shift-w - закрыть текущую вкладку
  • Alt-Left/Right - переключение между вкладками влево/вправо

Исходный код программы состоит из одного файла :)

Termit

Изучая сакуру, нашел на её сайте упоминание терминала Termit. Эмулятор терминала так же зависит от GTK и VTE, но ещё требует LUA 5.1. Умеет UTF-8, табы. В репозитариях ArchLinux нету, есть только в AUR. После первого запуска видим такое окно:

termit

Терминал может конфигурироваться через меню, но настройки распространяются только на текущую сессию. Основная конфигурация идет через файл init.lua (о чем немного далее)

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

Автор уже знает, а пока что можем сделать сами.

Вот тут делои касается конфигурации. Она происходит скриптом на LUA который помещается в ~/.config/termit/init.lua, пример этого скрипта есть в архиве с исходными кодами, пример надо сказать работающий и функциональный. В случае ArchLinux выполним команды:

mkdir ~/.config/termit
cp /usr/share/doc/termit/init.lua.example ~/.config/termit/init.lua

и немного подредактируем. Главное раскомментируйте параметр defaults.foreground_color и укажите тот что вам нужен, gray в большинстве случаем окажется достаточным.

Перезапускаем termit, наблюдаем что в новых вкладках нормально отображается текст, наблюдаем два новых пункта меню:

  • User menu
  • Encodings

termit2

Последнее позволяет поменять кодировки, особенно актуально мне, когда приходится по ssh заходить то на сервера со старой доброй koi8-r или на новые utf-8. Да luit помогает, но иногда забывается, а перелогиниваться лениво :)

Почитать про LUA API термита можно в доке, что идет с ним: /usr/share/doc/termit/lua_api.txt (путь может отличаться в вашем дистрибутиве)

Горячие клавиши настраиваются через init.lua, по умолчанию такие:

  • Alt-Left - предыдущая вкладка
  • Alt-Right - следующая вкладка
  • Ctrl-t - открыть новую вкладку
  • Ctlr-w - закрыть текущую вкладку
  • Ctrl-Insert - копировать выделенный текст в буффер
  • Shift-Insert - вставить текст из буффера

Выполнение приложений

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

bash -c 'echo test; read'

и пока не нажмешь Enter терминал не закроется

Для sakura командная строка получилась:

sakura -e "bash -c 'echo test; read'"

и ничего не отработало - завершилось ошибкой

У termit строка такая:

termit --execute "bash -c 'echo test; read'"

и всё отработало как нужно!

termit3

Ну… В общем, Termit - мой выбор ;)

Сайты программ

// Автоподключение PPPoE. Переподключение при разрыве.

Запостил как ответ на форуме русского сообщества ArchLinux: http://archlinux.org.ru/forum/viewtopic.php?f=8&t=922&p=6580#p6580

Сохраню и для себя :)

Итак, стоят пакеты rp-pppoe и ppp. Дальше.

С переподключением при обрыве, имхо, только завести pppoe через daemontools:
http://aur.archlinux.org/packages.php?ID=16966

ну дальше читать документацию как добавлять сервисы. Если кратко, для 'pppoe', то так:

  • создаём директорию /etc/ppp-internet
  • создаём файл /etc/ppp-internet/run с следующим содержимым:
    #!/bin/bash
     
    # тут укажи сетевую которая у тебя подключена
    ifconfig eth0 up
     
    # nodetach - обязательно. за подробностями в документацию.
    exec pppd nodetach call dsl-provider
  • делаем его исполняемым: chmod +x /etc/ppp-internet/run

Потом создай этот самый dsl-provider, файл /etc/ppp/peers/dsl-provider с примерно следующим содержимым:

plugin rp-pppoe.so
# network interface
eth0
# login name
name "pppoe-login"
# use assigned DNS
usepeerdns
# add default route to connection
defaultroute
hide-password
noauth
# create interface with name ppp999 (in my case others users from LAN have access to Internet via VPN for accounting purposes)
unit 999

В конфиге никоим образом не должно быть опции «persist». Логин/пароль должны быть прописаны в /etc/pap-secrets или /etc/chap-secrets

ну и последний пасс:

ln -s /etc/ppp-internet /service/

управлять процессами daemontools можно при помощи команды svc

UPD:

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

// KDE4 и монтирование флешки

Всё хорошо, вот только с кодировками беда, пошел по пути как описано тут

Единственно, для флешек тип файловой системы подменяется на mvfat, дабы не было зацикливания в скриптах.

Создаем файл /sbin/mount.mvfat:

#!/bin/bash
 
eval mount -t vfat $@,quiet,iocharset=utf8,codepage=1251,showexec,umask=0,flush

Делаем на него:

chown root:root
chmod +x /sbin/mount.mvfat

Создаем файл /etc/hal/fdi/policy/10_my_fsops.fdi

<?xml version="1.0" encoding="UTF-8"?>
<deviceinfo version="0.2">
    <device>
        <match key="volume.fstype" string="vfat">
            <match key="@block.storage_device:storage.hotpluggable" bool="true">
                <merge key="volume.fstype" type="string">mvfat</merge>
                <merge key="volume.policy.mount_filesystem" type="string">mvfat</merge>
                <merge key="volume.mount.valid_options" type="strlist">utf8</merge>
                <merge key="volume.mount.valid_options" type="strlist">shortname=</merge>
                <merge key="volume.mount.valid_options" type="strlist">codepage=</merge>
                <merge key="volume.mount.valid_options" type="strlist">iocharset=</merge>
                <merge key="volume.mount.valid_options" type="strlist">umask=</merge>
                <merge key="volume.mount.valid_options" type="strlist">dmask=</merge>
                <merge key="volume.mount.valid_options" type="strlist">fmask=</merge>
                <merge key="volume.mount.valid_options" type="strlist">uid=</merge>
                <merge key="volume.mount.valid_options" type="strlist">flush</merge>
            </match>
        </match>
    </device>

</deviceinfo>

policy опции вроде уже не работают, но оставил, много не ест. valid_options нужны обязательно, иначе hal будет выдавать ошибку с намеком: rethink extra_options, типа, переосмыслите опции ;)

Перезапускаем hal:

/etc/rc.d/hal restart

Можно в терминале запустить такую командочку:

while true; do ps auxwww | grep mount | grep -v grep | tee -a /tmp/my.log; done

Посмотреть что происходит при монтировании. Втыкаем флешку в Дельфине по ней щелкаем два раза, на терминале получим примерно следующее:

root     17258  0.0  0.1  15340  1132 ?        S    09:21   0:00 /usr/lib/hal/hal-storage-mount
root     17259  0.0  0.0   8016   592 ?        S    09:21   0:00 /bin/mount -t mvfat -o nosuid,nodev /dev/sdb1 /media/disk
root     17260  0.0  0.1  15376  1516 ?        S    09:21   0:00 /bin/bash /sbin/mount.mvfat /dev/sdb1 /media/disk -o rw,nosuid,nodev
root     17261  0.0  0.0   8016   608 ?        D    09:21   0:00 mount -t vfat /dev/sdb1 /media/disk -o rw,nosuid,nodev,quiet,iocharset=utf8,codepage=1251,showexec,umask=0,flush

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

ЗЫ ждем нормальных средств для настройки монтирования флешек из КДЕ4

ЗЫЫ KDE 4.1, hal 0.5.11, ArchLinux

// Немного о бекапе

Хавтушка для Gentoo, но в умелых руках пойдет где угодно :)

HowTo: http://www.inode.ru/articles/linux/2005-10-14/103

От себя в адаптирование к ArchLinux:

  • Утилита nc есть в пакете gnu-netcat
  • Утилиты rsync, rdiff-backup есть в дистрибутиве (последня используется из backup-ninja на работе под Debian, бывает вылетает, приходится весь бекап грохать и начинать заново)

// Yaourt

Случайно наткнулся на программу yaourt (2), является небольшим враппером для pacman с расширением возможности до работы с AUR