суббота, декабря 29, 2007

Screen-Launcher


Вот делаю такую программу. Это еще один десктоп, позволяющий запускать программы, что-то из серии idesk или rox-desktop.
Первое отличие от упомянутых проектов - кнопки запуска могут быть организованы в разделы, что упрощает ориентацию при большом количестве программ на десктопе.
Второе отличие: программа сама определяет, является ли текущий юзер 'админом' или "простым пользователем" (как - см. ниже). Добавлять/удалять/редактировать разделы и кнопки запуска могут только админы. Юзер, соответственно, может запускать только то, что ему разрешил админ.
Программа делается в основном для компьютерных клубов, но ее вполне можно использовать и дома.

Конфиг - простой текстовый файл ini-формата /etc/launcher.conf, его можно редактировать руками, а можно прямо из интерфейса самой программулины.
Админы от юзеров отличаются очень просто: считаем, что текущий юзер - админ, если у него есть право на запись в конфиг. Т.о. для отделения юзеров от админов можно использовать всю мощь традиционной unix-системы разделения прав (группы, ACL-ы и пр.).
Программа на python-gtk2.
Скрин админского интерфейса:

Посмотреть/взять можно из svn тут:
http://screenlauncher.googlecode.com/
На днях авось выложу deb-пакет.

UPD. Вставил скриншоты, выложил deb-пакет.
Предвидя вопрос: да, wallpaper-ы пока не поддерживаются.
Для меня эта задача с низким приоритетом.

UPD2. Ух ты, оно под маздаём запустилось!!! :)

понедельник, октября 15, 2007

Проверяю постинг из гнома ;)

Сабж. Нашел такую штуку - gnome-blog-poster.

ЗЫ. Результат: работает, но заголовок вставляет прямо в тело сообщения вместо соответствующего поля. Вобщем, пока — недоделка. Авось когда-нить заработает нормально.

суббота, сентября 08, 2007

"Состояния клавиатуры" в ion3

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

STATE=0

function toggle_state(ws)
if STATE==1 then
STATE=0
ioncore.exec_on(ws,"xset -led 3")
else
STATE=1
ioncore.exec_on(ws,"xset led 3")
end
end

function exec_on_if(ws,prog_true,prog_false)
if STATE==1 then
ioncore.exec_on(ws,prog_true)
else
ioncore.exec_on(ws,prog_false)
end
end

function exec_if(prog_true,prog_false)
return "exec_on_if(_,'"..prog_true.."','"..prog_false.."')"
end

....

kpress("Scroll_Lock","toggle_state(_)"),

kpress("XF86AudioPlay", exec_if('audacious -t', GIMP)),
kpress("XF86AudioStop", exec_if('audacious -s', 'mypaint')),
kpress("XF86AudioNext", exec_if('audacious -f', 'gedit')),
kpress("XF86AudioPrev", exec_if('audacious -r', 'gqview')),
kpress("XF86AudioMute", exec_if('xvolume toggle', 'inkscape')),
kpress("XF86AudioRaiseVolume", exec_if('xvolume 5+%', 'liferea')),
kpress("XF86AudioLowerVolume", exec_if('xvolume 5-%', 'f-spot')),


Как это работает.
В режиме "0" (по умолчанию) "аудио" клавиши запускают приложения. В режиме "1" - управляют плеером. Переключение между режимами - клавишей ScrollLock. Индикация режима - соответствующей лампочкой на клавиатуре.

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

Скрин

Решил выложить один свой давний скрин.


Скрин вообще ни о чем, чисто поржать ;).

среда, сентября 05, 2007

LiveMath: Продолжаю штамповать LiveCD.

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

Системы компьютерной алгебры:
Maxima (http://maxima.sourceforge.net) - полнофункциональная система аналитических вычислений;
Axiom (http://axiom-developer.org) - мощная система компьютерной алгебры;
YaCas (http://yacas.sourceforge.net) - еще одна система компьютерной алгебры;
PARI/GP (http://pari.math.u-bordeaux.fr/) - широко используемая компьютерно-алгебраическая система, разработанная для быстрых вычислений в теории чисел (факторизации, алгебраическая теория чисел, эллиптические кривые...);
GAP (http://www.gap-system.org/) - свободно распространяемый, открытый и расширяемый программный комплекс для применения в области вычислительной дискретной математики, в частности, теории групп;
Mathomatic (http://www.mathomatic.org/) - переносимая, универсальная программа, которая может решать, упрощать, группировать, дифференцировать, интегрировать и сравнивать алгебраические выражения;
Системы автоматизации доказательств:
ACL2 (http://www.cs.utexas.edu/users/moore/acl2/) - язык программирования для моделирования компьютерных систем и средство, помогающее доказывать свойства этих моделей;
Coq (http://coq.inria.fr/) - система автоматизированного построения доказательств, с помощью которой, кроме всего прочего, была решена проблема четырех красок;
HOL (http://hol.sourceforge.net) - система автоматизации доказательств для логики высших порядков;
Системы численных вычислений:
SciLab (http://www.scilab.org/) - пакет научных программ для численных вычислений, предоставляющий мощное открытое окружение для инженерных и научных расчетов;
GNU Octave (http://www.octave.org/) - язык высокого уровня, предназначенный для выполнения математических вычислений;
Tela (http://www.geo.fmi.fi/prog/tela.html) - "интерактивный тензорный язык" для численных вычислений;
Разное:
Yorick (http://yorick.sourceforge.net/) - компактная программная среда, предназначенная для комплексного решения научно-инженерных вычислительных задач;
GNU R (http://r-project.org/) - мощный язык статистических вычислений, используемый профессиональными статистиками;
GRETL (http://gretl.sourceforge.net/) - система эконометрического анализа;
Kig (http://edu.kde.org/kig/) - интерактивная геометрия;
Инструменты построения графиков - geg, kmplot, gnuplot;
Визуализация данных:
Mayavi (http://mayavi.sourceforge.net/) - открытый пакет научной 2D и 3D визуализации данных;
OpenDX (http://www.opendx.org/) - программное средство для анализа данных в графическом виде, визуализации научных данных;
GGobi (http://www.ggobi.org/) - среда визуализации многомерных данных;
LabPlot (http://labplot.sourceforge.net/) - программа для анализа и визуализации различных данных;
Grace6 (http://plasma-gate.weizmann.ac.il/Grace/) - программа для подготовки двумерных графиков по численным данным;
PAW (http://cern.ch/paw/) - интерактивная программа анализа и графического представления результатов. Может применяться для анализа большого и очень большого объёма данных;
Научные редакторы:
teTeX (http://www.tug.org/tetex/) - полноценный дистрибутив TeX;
TeXmacs (http://texmacs.org) - текстовый редактор для набора математических и прочих научных текстов, также позволяет включать в документ сессии Axiom, Maxima, Octave, SciLab и других систем компьютерной математики;
Kile (http://kile.sourceforge.net/) - интегрированная среда подготовки документов с помощью TeX;
Texmaker (http://www.xm1math.net/texmaker/) - интегрированная оболочка для LaTeX;
LyX (http://www.lyx.org/) - WYSIWYM (What You See Is What You MEAN) редактор который работает как front end to LaTeX;

Здесь не упомянуты пара текстовых редакторов, браузер, почтовик, а также фронт-енды к упомянутым системам, ну и еще кучка дополнительных программ. Все основные программы с встроенным хелпом, а также на CD есть еще подборка документации по ним.

пятница, августа 31, 2007

Пара слов о Xorg

Вот, хочу сообщить тем кто не знает. Современный Xorg (начиная, как минимум, с 7.0) в состоянии сам определить параметры монитора и видеокарты. Настолько в состоянии, что может работать без конфига (xorg.conf) вообще! Правда, он не может сам догадаться, что нам надо вводить с клавиатуры русские буквы итп, такие вещи в конфиге все-такие приходится прописывать.
Это я на самом деле в продолжение темы о LiveCD. Ибо там традиционно вставал вопрос - как написать универсальный xorg.conf ?
Сейчас это практически не проблема. Указываем
Driver "vesa"
Этого вполне достаточно на большинстве видух (ну да, 3Д ускорением и не пахнет, но зачем оно на LiveCD?). Для всех остальных добавляем куда-нибудь в startup-скрипты такой код:
DRIVER=$(egrep -o 'x11=[a-z0-9]+' /proc/cmdline | cut -d'=' -f2)
if [ "$DRIVER" ]
then sed -i -e "s/vesa/$DRIVER/" /etc/X11/xorg.conf
fi
Это позволяет указать нужный драйвер при запуске livecd (в приглашении isolinux вводим, например: "linux x11=sis").
Опции VertRefresh и HorizSync (которые в свое время, помнится, могли стоить испорченной видухи или монитора) не указываем вообще. Xorg их сам спросит у монитора и выставит максимальную рабочую частоту. Аналогично, можно не указывать строчку Modes. Или указать, перечислив возможные разрешения: Modes "1024x768" "800x600" "640x480".

четверг, августа 16, 2007

Сборка из исходников в Debian.

По сабжу надеюсь всем интересующимся известно про "apt-get -b source" и "apt-build". Кому неизвестно - см. документацию ;)
Но оба этих механизма берут исходники из репозитариев debian. Хорошо это или плохо - зависит от ситуации. В том случае, если мы пересобираем пакет с тем, чтобы улучшить оптимизацию или включить какую-то возможность - это хорошо. А в случае, если нам нужна последняя версия программы (вплоть до svn), это плохо - в репозиториях оказываются только более-менее протестированные версии.
Итак, задача - собрать программу из исходников, полученных прямо с оф.сайта (или даже из svn). Скачали, распаковали. По логике, сейчас надо делать ./configure, make, make install. Только обновлять или удалять потом все файлы этой программы - будет целая история. Не говоря уж о том, чтоб быстро и просто перенести скомпиленное на другой комп. Отсюда возникает идея сделать некую обёртку над make install, которая будет сразу собирать deb-пакет и устанавливать его в систему.
Идея эта не нова, такие обертки уже есть. Самой известной является checkinstall. Она отслеживает, куда какие файлы пытается копировать make install, и все их записывает потом в deb-пакет. Я долго пользовался checkinstall, но это как оказалось не универсально и тем более не гибко. Так что я решил изобрести очередной велосипед ;) Правда, этот мой велосипед работает только для программ, которые понимают переменную DESTDIR (она должна указывать make install-у, куда копировать файлы) или другую с тем же смыслом. Но, насколько я понимаю, к этому классу относится большинство программ, использующих autotools. Зато он с точки зрения устанавливаемой программы выглядит "более естественно", и не требует рутовых привелегий вплоть до установки пакета (используется sudo).

Итак, вот обертка над make install (у меня называется /usr/local/bin/debinstall):

#!/bin/bash

# Установить пакет из исходников.
# Управляющие переменные:
# $DSTVAR - имя переменной, используемой make install в качестве префикса;
# по умолчанию - DESTDIR.
# $INSTALL - команда, устанавливающая программу; по умолчанию - make install.

set -e

DDIR=${DSTVAR:-DESTDIR}
INSTALL=${INSTALL:-make install}

IDIR=install_dir

if [ -d $IDIR ]
then mv $IDIR/DEBIAN .DEBIAN
rm -rf $IDIR
mkdir $IDIR
mv .DEBIAN $IDIR/DEBIAN
else mkdir $IDIR
fi
$INSTALL $DDIR=$(pwd)/$IDIR
mkdir -p $IDIR/DEBIAN
if [ -e $IDIR/DEBIAN/control ]
then :
else cp ~/.control.template $IDIR/DEBIAN/control
fi
${EDITOR:-vim} $IDIR/DEBIAN/control
cd $IDIR
echo -n "Enter the name of .deb package: "
read NAME
dpkg-deb -b . ../$NAME
sudo dpkg -i ../$NAME

Ну и тогда уж пусть будет обертка над всем заклинанием "configure; make; make install" (у меня называется /usr/local/bin/debuild):

#!/bin/bash

# Скомпилировать и установить программу из исходников.
# Управляющие переменные:
# $OPTIONS - опции сборки, передаваемые ./configure;
# Если существует файл build-options, дефолтные опции берутся из него.
# $CFLAGS, $CPPFLAGS, etc - как обычно, параметры компилятора
# Также см. описание в скрипте debinstall.

set -e

if [ -e build-options ]
then OPTIONS="$(cat build-options) $OPTIONS"
fi

if [ -x configure ]
then ./configure --prefix=/usr $OPTIONS
else if [ -x autogen.sh ]
then ./autogen.sh
./configure --prefix=/usr $OPTIONS
fi
fi

make
debinstall

Т.о. , обновление некоторых программ у меня теперь выглядит так:

cd ~/src/../
svn update
debuild

суббота, августа 11, 2007

FAQ: что такое Linux?

Сподобился-таки на еще один FAQ. Это "для самых маленьких", так что за отсутствие строгости просьба не пинать.

Q. Что такое эта Linux?

A. Linux - это свободная операционная система.

Q. Так. А что такое операционная система?

A. Это комплекс программ, запускающий все остальные программы, и необходимый им (программам) для 1) работы с оборудованием компьютера, 2) для взаимодействия с пользователем. Кроме того, операционная система (как правило) позволяет запускать несколько программ одновременно и обеспечивает их взаимодействие между собой. Коротко говоря, операционная система (ОС) - это главная программа на компьютере. Примерами операционных систем являются: UNIX, Linux, Solaris, Windows, DOS.

Q. Так. А что означает "свободная"?

A. Термин "свободная" применительно к программе означает, что лицензия на эту программу гарантирует вам как минимум четыре основных свободы: 0) Свобода запускать программу в любых целях; 1) Свобода изучения работы программы и адаптация ее к вашим нуждам; 2) Свобода распространять копии, так что вы можете помочь вашему товарищу; 3) Свобода улучшать программу и публиковать ваши улучшения, так что все общество выиграет от этого.

Q. Кто создает Linux и другие свободные программы?

A. Огромное количество разработчиков по всему миру.

Q. Ну как эта компания называется?

A. Это не компания. Это то, что люди называют _сообществом_. Просто большое количество людей, которых объединяют только общие взгляды на IT-индустрию и общее дело.

Q. А какая им от этого выгода?

A. Большинство из этих людей работает ради собственного удовольствия (Just for fun). Многим их работу оплачивают компании, которые хотят иметь более высококачественное ПО. Более того, есть компании, специализирующиеся на разработке свободного ПО.

Q. А какая выгода компаниям, раз эти программы бесплатные?

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

Q. И много их, этих энтузиастов?

A. Точной статистики нет ни у кого. Однако есть оценки, согласно которым над одной свободной программой _в среднем_ работают 3 человека. А общее количество свободных программ оценивается в 378000. Простым перемножением получаем свыше миллиона разработчиков.

Q. А много ли людей пользуются Linux?

A. Опять же, точной статистики нет. Но, как минимум, известно, что Linux используется во всех государственных учереждениях в Бельгии, Франции, Норвегии, Китае. Это уже многие миллионы человек. У нас в стране многие ВУЗы используют Linux - в частности, Московский государственный технический университет им.Н.Э.Баумана. Кроме того, очень многие используют Linux, не зная об этом. Linux стоит на миллионах серверов в Интернете. Linux используется в автоматизации производства. Linux установлен на множестве небольших устройств - это ADSL-модемы и другое сетевое оборудование, смартфоны и КПК, DVD-плейеры и многое другое. Многие миллионы человек, использующие эти устройства, тем самым используют Linux.

Q. Как давно существует Linux?

A. Собственно Linux появилась в 1991 году. Однако часто, говоря "Linux", подразумевают операционную систему, от которой Linux берет все основные идеи - UNIX. UNIX появилась в 1969 году.

Q. Раз эти программы создают мало кому известные люди, какие гарантии того, что они не встроят в программы вредоносный или шпионский код?

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

Q. Что за слова такие - "исходный код", "скомпилировать" ?

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

Q. И чем же так замечательно распространение программ в исходных кодах?

A. Коммерческие программы (обычно) распространяются без исходных кодов, в виде уже скомпилированного машинного кода. Весь фокус в том, что обратное преобразование - из машинного кода в исходный - технически очень сложно, а юридически - запрещено лицензией. А машинный код человеку все равно не понять. Таким образом, производитель может встраивать в свои (коммерческие, закрытые) программы все что ему вздумается - вредоносный или шпионский код, например - пользователь об этом даже не узнает. А при наличии исходных кодов их может прочитать и понять любой программист, и он быстро выявит любые несуразности. Если вы не программист, вы можете просто позвать знакомого программиста…

Q. Но это все не означает, что я должен… как его… компилировать все программы?

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

вторник, июля 03, 2007

Купил мультимедийную клавиатуру

Собственно, сабж ;)
Давно хотел, ибо у обычной клавиатуры клавиш банально не хватает. Ну действительно, алфавитные клавиши заняты просто алфавитом, Ctrl-буква используются во многих приложениях, Alt-буква - используются для вызова меню итп. Остаются только сочетания Win+что-то. Но все их я давно уже занял на операции с окнами, запуск основных программ итп. Так что в последнее время у меня начали появляться всякие "емаксерские" комбинации, вроде "Win-X,L" для управления разными named scratchpad-ами. Что не есть удобно :)
Купил клаву Defender Virtuoso какую-то. Появился лишний десяток кнопок, половину из них занял сразу под управление скратчпадами.
Клавиатура, видимо, использует нестандартные коды клавиш для XF86Play итп., так как иксы их сходу не узнали, пришлось дописывать в ~/.Xmodmap:
keycode 148 = XF86Cut
keycode 202 = XF86Copy
keycode 101 = XF86Paste

keycode 162 = XF86AudioPlay
keycode 164 = XF86AudioStop
keycode 144 = XF86AudioPrev
keycode 153 = XF86AudioNext
keycode 160 = XF86AudioMute
keycode 174 = XF86AudioLowerVolume
keycode 176 = XF86AudioRaiseVolume

keycode 229 = XF86Search
keycode 178 = XF86HomePage
keycode 236 = XF86Mail

keycode 230 = XF86Favorites
keycode 233 = XF86Forward
keycode 234 = XF86Back
keycode 231 = XF86Refresh

keycode 161 = XF86Calculator


Тогда запахало почти всё, кроме XF86Cut,Copy,Paste - их иксы не видели, а ядро в логах ругалось на неопределенные сканкоды. Совет ядра воспользоваться утилитой setkeycodes помог. Написал в /etc/init.d/rc.local:
setkeycodes e025 222
setkeycodes e026 223
setkeycodes e023 224

Только вот приложения, как выяснилось, по умолчанию такие клавиши (Cut,Copy,Paste) не понимают. Ну мне-то все равно, я на них скратчпады повесил в ion-е, но хочется, чтобы у родни они работали соответственно иконкам на них (вырезать-копировать-вставить). Долго мучался, нашел решение в виде xbindkeys+xvkbd. В .xbindkeysrc пишем:
"xvkbd -xsendevent -text '\Cx'"
Mod2 + XF86Cut

"xvkbd -xsendevent -text '\Cc'"
Mod2 + XF86Copy

"xvkbd -xsendevent -text '\Cv'"
Mod2 + XF86Paste
Откуда Mod2 и почему именно Mod2 - не спрашивайте, не знаю :) Именно так определил эти клавиши xbindkeys -k.

И заодно, раз уж взялся настраивать клавиатуру, решил осуществить еще одно давнее желание - чтоб стандартные комбинации клавиш (напр., вимовские hjkl, башевские Ctrl-A,Ctrl-E и пр.) работали во всех приложениях. Понятно, что в чистом виде это неосуществимо - каждое приложение работает с клавиатурой по-своему. Поэтому пришлось добавить "модификатор" на CapsLock и работать с ним. Делается это так: в /usr/share/X11/xkb/symbols/addkeys пишем:
partial alphanumeric_keys
xkb_symbols "en" {
include "us"
name[Group1]= "US - Additional";
key.type[group1]="FOUR_LEVEL";
key <ac01> { [ a, A, Home, Home ] };
key <ad03> { [ e, E, End, End ] };
key <ac05> { [ g, G, Home, End ] };
key <ac06> { [ h, H, Left, Left ] };
key <ac07> { [ j, J, Down, Down ] };
key <ac08> { [ k, K, Up, Up ] };
key <ac09> { [ l, L, Right, Right ] };
key <ac03> { [ d, D, Delete, Delete ] };
include "addkeys(caps_switch)"
};

partial alphanumeric_keys
xkb_symbols "ru" {
include "ru(winkeys)"
name[Group1]= "Russia - Winkeys - Additional";
key.type[group1]="FOUR_LEVEL";
key <ac01> { [ Cyrillic_ef, Cyrillic_EF, Home, Home ] };
key <ad03> { [ Cyrillic_u, Cyrillic_U, End, End ] };
key <ac05> { [ Cyrillic_pe, Cyrillic_PE, Home, End ] };
key <ac06> { [ Cyrillic_er, Cyrillic_ER, Left, Left ] };
key <ac07> { [ Cyrillic_o, Cyrillic_O, Down, Down ] };
key <ac08> { [ Cyrillic_el, Cyrillic_EL, Up, Up ] };
key <ac09> { [ Cyrillic_de, Cyrillic_DE, Right, Right ] };
key <ac03> { [ Cyrillic_ve, Cyrillic_VE, Delete, Delete ] };
include "addkeys(caps_switch)"
};

default partial modifier_keys
xkb_symbols "caps_switch" {
key <caps> {
type[Group1]="ONE_LEVEL",
symbols[Group1] = [ ISO_Level3_Shift ]
};
modifier_map Mod5 { ISO_Level3_Shift };
};
И в /etc/X11/xorg.conf заменяем
Option "XkbLayout" "us,ru(winkeys)"
(ну или что там у вас) на
Option "XkbLayout" "addkeys(en),addkeys(ru)"
Все. Теперь Caps+hjkl - это стрелки, Caps+A - это Home, Caps+E - End, Caps+g - Home, Caps+Shift+g - End, Caps+D - Delete. При желании можно добавить и другие клавиши.

суббота, июня 02, 2007

Мы это сделали! ;)

В городе Магнитогорске Челябинской области начала работу одна из первых компаний по внедрению и поддержке свободного ПО - компания RTFM.
Я говорю "мы это сделали", потому что я - один из учредителей.
Сайт: http://rtfm-mgn.ru

понедельник, мая 14, 2007

Как сделать маленький LiveCD "вручную"

Я сделал уже второй livecd, правда этот - уже совсем специального назначения - для развертывания системы из образа. Так что у меня выработалась некая технология изготовления таких микро-дистрибутивов.
Пакеты я беру из своего debian etch (а шо? много уже скомпилированного софта). Но я считаю, что на liveCD система управления пакетами вроде apt совершенно ни к чему. Поэтому перед установкой в создаваемую систему я конвертирую deb-пакеты в обычные тарболлы (.tar.gz), благо это совсем просто (вот скрипт).
Далее, из идеи о минимальном дистрибутиве сразу следует, что на диске должно быть только то, что необходимо в данном случае. Поэтому начинаем создание livecd с установки самых нужных пакетов. Например, в последнем случае у меня был скрипт-инсталятор, написанный на bash+dialog. Значит, на диске нужны: bash, dialog и их (жесткие) зависимости. Скрипт использует cp с компанией - значит, нужен пакет coreutils.
Зависимости надо как-то отслеживать, не вручную же? В качестве внешней (по отношению к создаваемой системе) базы данных зависимостей я использую базу apt-cache моей рабочей системы.
Все это делается, естественно, скриптами. Вот скрипт, устанавливающий tar.gz в директорию с создаваемой системой. Этот скрипт находит deb-пакет, конвертирует его в tar.gz (используя вышеприведенный deb2targz), и устанавливает его. Наконец, этот скрипт устанавливает сначала зависимости пакета, а потом и сам пакет. Таким образом, пакеты ставятся в систему командой install-depends <имя-пакета>.
Замечание 1: скрипт install-depends устанавливает только непосредственные зависимости пакета. Т.е. если пакет A зависит от B, а B зависит от C, то команда install-depends A поставит пакеты A и B, но не поставит пакет C. Это пока приходится отслеживать вручную. Благо, в маленьких системах таких случаев мало. А для большой системы можно и скрипт поправить (а можно и нормальный пакетный менеджер поставить).
Замечание 2: всем скриптам нужна директория, выделенная под новую систему, и в ней директория с именем packages. Там будут складываться установленные пакеты (deb и tar.gz), и там же будет храниться файл installed.list со списком установленных пакетов - чтобы не устанавливать одно и то же два раза.
Замечание 3: во всех приводимых скриптах перед использованием нужно везде прописать правильные директории, по контексту вроде понятно, какие. Если непонятно - спросите в комментах.
Таким образом, по кусочкам, в выделенной директории оказывается более-менее рабочий вариант системы (по вопросам, какие пакеты надо ставить для того, чтобы работало то или другое, например login, загляните в LFS - полезная книжка). После того, как поставлен bash с зависимостями, в созданную систему можно chroot'нуться (chroot /path/to/live /bin/bash), и работать уже "изнутри".
После установки пакетов понадобится еще кое-какая доводка, чтобы система стала совсем рабочей - написание /etc/fstab, /etc/inittab и еще чего понадобится (в инсталяторе, например, мне ни inittab, ни fstab не понадобились). Сюда же относится написание startup сценариев - тут у вас полная свобода, пишите что вам надо. Для совсем простых систем можно вообще не ставить sysvinit, а в качестве init использовать самописный скрипт на bash.
Таким образом получается система, в которой можно работать как в chroot-среде. Теперь нужно обеспечить ее загрузку. Для этого, прежде всего, нужно ядро.
Можно взять дистрибутивное ядро. Оно сконфигурировано так, чтобы загружаться на чем угодно. Есть у него недостаток - оно модульное, и нужность тех или иных модулей определяется скриптами при каждой загрузке. Скрипты а) выполняются относительно долго и б) сложные, захочешь чего-то сделать по-своему - скорее всего сломаешь. Однако пару "дистрибутивное ядро + скрипты из рабочей системы" я посоветую для тех livecd, которые должны загружаться на совсем разных конфигурациях железа.
Если круг оборудования более определен, можно собрать для него свое ядро. Это окажется необходимо, если загружаться надо на самом распоследнем железе - дистрибутивное ядро его не поддерживает. Это также необходимо, если вы хотите применить к ядру патчи, которых нет в дистрибутивном ядре. Например, в LiveIDE я использую SquashFS, чтоб впихнуть всего побольше.
Для маленьких систем можно собрать монолитное ядро. Это хорошо тем, что ядро само определит все оборудование, какое оно знает, т.е. скрипты для определения оборудования не нужны. Конечно, эта идея не пройдет, если поддерживать нужно очень широкий круг оборудования. Но, например, из ядра для инсталятора я выкинул поддержку звуковых карт, сети и еще много чего - оно в момент установки не нужно.
Для загрузки нужен загрузчик. Я использую isolinux. Настроить его совсем несложно, все описано в документации. В качестве примера настройки можете взять содержимое директории isolinux/ на установочном CD вашего дистрибутива.
Загрузчик загрузит ядро. А ядро, по идее, должно запустить /sbin/init. Но для этого оно должно примонтировать корневую ФС. А где у нас будет корень? CD-ROM не подходит из-за того, что на разных машинах он подключен по-разному - то он /dev/hdb, а то вовсе /dev/scd0. Поэтому на LiveCD в качестве корневой ФС (по крайней мере, на первом этапе загрузки) традиционно используют initrd.
initrd - это файл образа любой ФС, понимаемой ядром (поддержка этой ФС должна быть вкомпилирована в ядро намертво, т.е. не модулем). Можно этот образ пожать при помощи gzip, получив initrd.gz - ядро умеет такие образы распаковывать.
Что класть в initrd? В initrd может быть, как минимум, три варианта:
  • Совсем минимальная система, которая только и делает, что находит диск и монтирует его в качестве "настоящей" корневой ФС;
  • Вся система;
  • Часть системы, способная загрузиться и подмонтировать остальные части системы с cd.
Первый вариант обычно используется в "настольных" системах. Его можно использовать и для livecd, в том случае, если основная (live) система занимает как раз что-то около 500..700Мб. Если система занимает больше - нужно использовать сжатие отдельных частей системы, для того, чтобы с ними работать, нужна уже не совсем тривиальная система.
В LiveIDE у меня используется третий вариант. Директория /usr сжата в образ squashfs, а все остальное находится в initrd.
Для маленьких систем имеет смысл использовать второй вариант - помещение системы в initrd целиком.
Файловая система, находящаяся в памяти имеет следующие преимущества: 1) она доступна на чтение/запись (а cd и squashfs - только на чтение); 2) если, кроме ядра и initrd, с диска ничего не грузится, диск можно достать из привода сразу после загрузки. Ну а недостаток большого initrd очевиден - он занимает много места в памяти.
Для загрузки ядра с initrd в качестве корневой ФС нужна следующая строка в isolinux.cfg:
append initrd=initrd.gz load_ramdisk=1 ramdisk_size=50000 rw root=/dev/ram0
В параметре ramdisk_size нужно указать число, несколько превосходящее размер распакованного initrd.
Если в системе не используется sysvinit, а используется свой init-скрипт, нужно дописать к этой строке что-то вроде "init=/sbin/install-image" .
Теперь создаем образ initrd (например, так: dd if=/dev/zero of=initrd bs=1024 count=40x1024), форматируем его (mkfs.ext2 initrd), монтируем как loop-устройство (mount -o loop initrd /mnt/initrd), кладем туда все, что решили положить, отмонтируем и сжимаем (gzip initrd). Создаем директорию (mkdir output/), из которой будем собирать образ диска, в нее кладем директорию isolinux, создаем директорию isolinux/kernel, туда кладем ядро и initrd. По мере надобности кладем файлы/директории в корневую директорию диска.
Для создания загрузочного iso-образа используем команду вроде следующей
mkisofs -o /path/to/live-image.iso -r -V "My Live CD" -v -no-emul-boot -boot-load-size 4 -boot-info-table -b isolinux/isolinux.bin -c isolinux/isolinux.boot /path/to/output

Конечно, вряд ли все получится с первого раза. Чтобы не пороть кучу cd-болванок, образы можно тестировать под эмулятором (qemu).

ЗЫ. Я в курсе, что это "не совсем дебиан-вей". Это, скорее, слако-вей. Но этот способ гораздо более гибкий.

воскресенье, апреля 15, 2007

Чего-то давно не писал...

Вроде и повода не было. Надо бы про asciidoc статью сделать, да руки не доходят...
Через недельку-другую, надеюсь, будет кое-что новенькое ;)
А пока - еду на чемпионат Урала по программированию с 18 по 22-е число.
PS. Кто-нибудь может что-нибудь осмысленное сказать по поводу вот этого: http://portnov84.narod.ru/what.pdf ? Найдено в местной сетке, авторство/источник неизвестны. Есть подозрение, что это плод воображения какого-то тронутого линуксоида.

вторник, февраля 27, 2007

Live IDE

Сочиняю в связи с надоевшим вопросом "а IDE под линукс есть?". Как известно, правильный ответ - "*nix это и есть IDE". В подтверждение - делаю Linux Live CD узкого назначения - Live IDE. Пакеты беру из своего Debian testing/unstable. Софт выбран соответственно назначению лайва:
gvim 7.0 +plugins (taglist, NERDTree, SourceCodeObserver, bufexplorer, marksbrowser, MRU);
gcc, g++ 4.1 с комплектом (всякие gdb, gprof итп);
glade-2;
free pascal 2.0;
ghc6.6 (glasgow haskell compiler);
perl 5.8.8 - само собой;
python2.4;
man-ы, естественно ;)
evince, xpdf и djview - для просмотра документации;
irssi и dillo - чтоб можно было и в инет вылезти;
ну и набор dev-пакетов для библиотек - gtk1/2, glade-2, и тп.
В настоящий момент лайв грузится и работает, но есть десяток мелких багов, думаю за недельку их исправлю. Размер iso - 250Mb (вероятно, будет увеличиваться, но не знаю, насколько). Если кому-то интересно посмотреть - скажите куда можно залить 250Мб ;) Впрочем, в основном я об этом сообщаю не для того, чтоб все бросились сливать мой лайв, а скорее для того, чтоб указать, что создание live-cd узкого назначения - дело несложное, особенно если есть какой-то подходящий лайв, который можно положить в основу. Если б у меня был slackware live cd и работающая слака под боком - наверное, я бы стал делать диск на основе слаки, и заняло бы это у меня день от силы. Но слаки у меня нет, так что я потратил 4 дня на сочинение системы по методу LFS, только не из исходников, а из пакетов debian. Зато узнал много нового ;)
В общем - кому, как мне, приходится заниматься разработкой на компах, на которых нет возможности установить юникс - сочините себе такой лайв из любимого дистрибутива.

UPD. Образ занимает уже 350Мб, зато LiveCD поддерживает аж 10 языков программирования: C, C++, C#(mono), Java(JDK5), FreePascal2.0, Haskell,Ocaml,Perl,Python,Ruby.

среда, января 31, 2007

Тоже присоединяюсь

... к http://ivlad.livejournal.com/184754.html. Цитата:

В связи с т.н. "делом Поносова" (http://ru.wikipedia.org/wiki/Дело_Поносова ) хочу сказать, что если вы - учитель информатики (или любой другой учитель, или представитель администрации школы), который хочет (или, скажем мягче, готов попробовать) использовать Linux в учебном процессе, но не знает, с чего начать, я готов встретиться, рассказать и показать. Более-менее в любые выходные. Безвозмездно, то есть даром. =)
Правда, в совсем любые выходные я не могу (в частности, пол-февраля меня не будет в городе - буду в Перми на студенческой научной школе по программированию с 5-го по 11-е), но уж через e-mail (см. в профиле) меня найти можно. Ну и напомню - живу я в Магнитогорске Челябинской области, выезжаю редко. Если надо - могу до Белорецка съездить.

Также запостил предложение присоединяться на наш LUG (http://lug.mgn.ru), авось, еще кто-нибудь откликнется.

Чтоб не забыть - работающее решение с suspend2, GDM, xlock и пр.

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

Чего я хочу. Хочу, чтоб при моем логине на четвертой консоли автоматически запускались иксы (на одинадцатой - первые десять у меня рабочие). А остальные юзеры должны входить в систему через GDM, запущенный на двенадцатой консоли. При этом должен работать спящий режим, при выходе из спящего режима должен появляться экран входа GDM (т.е. активной быть двенадцатая консоль) чтобы другой пользователь мог сразу залогиниться, а мои иксы (на 11-ой) должны быть заблокированы (xlock).

Настраиваем suspend в ядре (надежнее применить патч - suspend2). Чтоб оно работало удобно - в /etc/acpi/events/powerbtn пишем:

# We need to react on "button power.*" and "button/power.*" because
# of kernel changes.

event=button[ /]power
action=/usr/local/bin/sswsusp

где /usr/local/bin/sswsusp:

#!/bin/sh

su -c 'xlock -display :0 -planfont "-xos4-terminus-medium-*-normal-*-*-140-*-*-*-*-koi8-r"' portnov &
chvt 12
sudo swapon /dev/hda5
sudo hibernate
sudo swapoff /dev/hda5

swapon/swapoff нужны из-за того, что у меня обычно своп отключен, а suspend2 настроен писать образ памяти в своп. Если своп включен постоянно или suspend2 пишет образ в файл - swapon/swapoff не понадобится. xlock запускается от моего имени. chvt делает активной 12-ю консоль.

Теперь suspend работает по нажатию кнопки Power на системнике.

В конце ~/.zshrc пишем:

case "$(basename `tty`)@$HOST" in
tty4@portnov) runx
logout ;;
esac

где /usr/local/bin/runx:

#!/bin/bash

OPTIONS=$*

for I in $(seq 0 6)
do if [ ! -e /tmp/.X$I-lock ]
then break
fi
done

echo Running X on localhost:$I..
xinit ~/.xinitrc $OPTIONS -- -dpi 100 :$I

Этот скрипт запускает иксы на первом свободном дисплее.

Чтобы GDM нормально работал на 12-ой консоли, надо в /usr/share/gdm/defaults.conf (наверное, можно в более идеологически правильном месте… но не суть) поправить секцию [server-Standard]:

[server-Standard]
name=Standard server
command=/usr/bin/X -dpi 100 vt12 -audit 0
flexible=true

Без этой поправки GDM будет запускаться на седьмой консоли. А так как 7-я консоль у меня рабочая, то клавиатура уже перехвачена getty, и GDM клавиатуры не видит, в результате единственное, что можно сделать - ребутнуть комп из меню gdm.

Теперь выглядит работа так. Выключается компьютер (точнее, переводится в спящий режим) просто по кнопке Power на системнике. При включении показывается экран GDM. Если компьютер включил кто-то из родственников - он тыкает в свою иконку в списке, вводит пароль и работает. Если включил я - нажимаю Ctrl-Alt-F11, созерцаю заставку xlock, ввожу свой пароль - и продолжаю прерванный сеанс.

вторник, января 30, 2007

Еще одна примочка для ion3

Пишем где-нибудь в конфигах:

 function toggle_tabbar(fr)
if WFrame.mode(fr)=="tiled-alt"
then WFrame.set_mode(fr,"tiled")
else WFrame.set_mode(fr,"tiled-alt")
end
end

defbindings("WFrame", {
...
mpress(MOD4.."Control+Button2", "toggle_tabbar(_)"),
...});

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

понедельник, января 15, 2007

Humm

Посмотрел по "культуре" обсуждение явления блогов. Много думал :)
Резко не понравилось, что постоянно вместо "блог" говорили "жеже".

суббота, января 06, 2007

И еще одна поделка на python-gtk

Сабж. Сделал удобнейшую вещь - при втыкании в usb-разъем флэшки от фотика появляется окошко "Слить фотки". Выбираем директорию, нажимаем Старт, и начинается процесс. На одном прогрессбаре показывается процесс копирования, потом на другом - процесс проявки из RAW. Т.е. практически аналог соответствующей тулзы из Гнома. Только Гном здесь совсем не нужен, не нужен ни hal, ни dbus, а нужны python, python-gtk2, python-glade-2.

Кстати, долго думал: как при подключении устройства показать окошко? Ну хорошо, любую программу при подключении флэшки можно запустить с помощью строчки где-нибудь в /etc/udev/rules.d наподобие этой:
SUBSYSTEM=="scsi", SYSFS{model}=="CF Card CF", ACTION=="add", RUN="/path/to/program"
Но ведь программа будет запущена с правами демона udevd, вне любых иксов, и вообще не знает, что иксы запущены. Ей бы надо определить, запущены ли иксы вообще, на каком именно дисплее (предусмотреть случай, когда запущены двое иксов - у меня это штатный режим), получить разрешение на подключение к этим иксам, и только тогда можно показывать окошко. Во геморрою-то...
Но, нормальные герои юниксоиды всегда идут в обход!
Обходной путь получился такой. При запуске иксов фоном запускается питоновский скрипт, который каждые 5 секунд проверяет содержимое пайпа /var/run/mphotos. Если там появляется строчка "plugged" - показывается окошко и делается вся работа по копированию и проявке фоток. Иначе ждет дальше. А udev указанным выше способом при подключении флэшки запускает примитивный скрипт, который и записывает строчку "plugged" в пайп /var/run/mphotos. Все.

четверг, января 04, 2007

Swish-e, python-gtk, glade...

Уже довольно давно я пользуюсь замечательным поисковиком swish-e. Он довольно быстро индексирует документы, а потом ищет по созданному индексу (о его близком сородиче, swish++, писал virens). Все бы хорошо, только компьютером я пользуюсь не один, вместе со мно им пользуются далекие от компьютеров родственники. И совсем мне неохота объяснять им про прелести командной строки... Так что понадобилась "графическая морда" к swish-e. Ничего полезного не нашел, пришлось писать самому. Стал подбирать, на чем писать. Прежде всего, логика предельно простая (запустить команду и перехватить стандартный вывод), поэтому желания писать на чем-нибудь типа C/C++ не возникает совсем. В идеале это должен быть bash-скрипт. Но как из bash сделать GUI? Варианты получились такие.

Xdialog. Позволяет что-нибудь спросить у пользователя, например, так:
ANSWER=$(Xdialog --stdout --inputbox "Что ищем?" 10 30)
Нет возможности сделать сколько-нибудь сложный диалог. В данном случае этот вариант отпал.

kaptain. Позволяет создавать довольно сложные диалоги, которые описываются на специальном языке. Но эти диалоги нельзя изменить после создания, т.е. они могут работать только как формы ввода. Кроме того, у kaptain большие проблемы с нелатинскими алфавитами. Опять отпадает.

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

А остановился я в итоге на связке python + python-gtk + glade. Python - скриптовый, достаточно высокоуровневый, язык, так что простая логика на нем занимает мало места. Сам интерфейс нарисовал с помощью Glade (визуальный конструктор интерфейсов для gtk), сохранил в .glade-файле (это xml), а из python-скрипта он только подгружается (с помощью python-glade). Скрипт получился довольно скромного размера, соответственно своей простой функциональности. Кому интересно, взять можно здесь: http://portnov84.narod.ru/downloads/sw-search-0.1b.tar.gz (Depends: swish-e, python, python-gtk2, python-glade-2).

вторник, января 02, 2007

2007 год...

Дожили. Температура за бортом - +2 градуса (ПЛЮС!).

PS. С Новым годом всех кстати.