linux

Тачскрин на Линуксе

Два последних дня ковырял по работе планшет фирмы «Дигма» — это китайское го… годное вполне за свои деньги изделие поставляется с ОС «Виндоуз». А наша задача была показать на нём один из отечественных дистрибутивов Линукса.

Линукс встал довольно легко, но вот проблема — прикосновения к экрану не давали никакого эффекта. Вот этим я героически два дня и боролся.

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

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

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

Часть плёнки у нас оказалась под рамкой, так что ноль координат плёнки и экрана не совпадают, кроме того, разрешающая возможность тоже разная. Экран, например, 1366 пикселей шириной, а плёнка даёт 740. Как пересчитываются координаты нажатия на плёнку в экранные, чтобы операционная система поняла куда пользователь нажал?

Для этого в Линуксе задаётся трансформационная матрица («Coordinate Transformation Matrix»), на которую умножаются абсолютные координаты, в которых датчик экрана уловил нажатие. С её помощью можно сдвигать координаты, сжимать их и растягивать, а так же поворачивать на 90°, если датчик стоит так, что у него перепутаны оси — это вполне стандартная математика, которую многие могут помнить по школе.

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

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

Правда в нашем случае она не помогла — компенсировать «слепое пятно» она не в состоянии, для этого нужно чудо или более подходящий драйвер.

Оставить комментарий

Linux 0.0.1

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

В архиве всё готово для «Винды», для «Мака» я поставил QEMU отдельно, для запуска сработала вот такая строчка:

qemu-system-i386 -nic none -L pc-bios -hda \
linux-0.11-devel-060625.qcow2 -no-reboot -m 16 -k en-us

Стартует всё моментально, после запуска образа будет доступно меню выбора источника загрузки, там надо будет нажать 1, после чего появится командная строка.

Удивительно, но несмотря на то, что это версия 0.0.1, очень многое из привычного работает — есть файловая система, компилятор, bash, grep и awk. Правда у команд есть далеко не все ключи и я не обнаружил никакой справки ко внешним командам (для встроенных есть help).

Скриншот терминала QEMU с выводом загрузки ядра, информацией о памяти и списком файлов в /usr/root, включая readme, hello.c и shoelace.tar.Z; справа — пиксельная лягушка
Linux 0.0.1, запущенный в QEMU, а жаба, потому что скриншот — это скучно

В статье, где я нашёл ссылку для скачивания образа первого Линукса, есть любопытный факт — Линукс когда-то назывался «FREAX», как оказалось, в исходниках эта строка упоминается. Попытавшись найти её в бинарных файлах, споткнулся об отсутствие команды find, пришлось городить вот такую конструкцию:

ls -R / | awk -F: '/:/{dir=$1} ! /:/ && $1 {print dir"/"$1}' |
grep -v ^/dev | xargs -n1 strings | grep -i freax

Строчка не нашлась, она и в исходниках-то упоминается только в комментариях.

Я понимаю, что все эти утилиты писал не автор Линукса, но то, что это всё работает в операционной системе, код которой размером чуть больше восьми с половиной тысяч строк, меня лично восхищает.

2 комментария

Горячие клавиши на Toshiba AC100 в Ubuntu

В Лубунте (Lubuntu), которой я недавно ставил на Тошибу жены, почему-то не настроены горячие клавиши, идущие на смартбуке верхним рядом. Написал конфиг для программы input-event-daemon, может пригодится кому-нибудь. Дополнительно нужно поставить пакеты xdotool и wmctrl, остальное уже в Лубунте есть:

[Global]
# следим за событиями клавиатуры
listen = /dev/input/event0
# События крышки
listen = /dev/input/event4

[Keys]
# уменьшение яркости
META + F6 = echo $((`cat /sys/class/backlight/pwm-backlight/brightness` - 10)) > /sys/class/backlight/pwm-backlight/brightness
# увеличение яркости
META + F7 = echo $((`cat /sys/class/backlight/pwm-backlight/brightness` + 10)) > /sys/class/backlight/pwm-backlight/brightness
# включение/отключение радиомодулей (вайфай, блютуз)
META + F8 = rfkill $(rfkill list | fgrep -q yes && echo un)block all
# включение/выключение звука
META + F12 = a=$(amixer sget Master|fgrep -q '[off]'&&echo un)mute; for m in Master Speaker Headphone; do amixer -q sset "$m" $a; done
# показать/скрыть рабочий стол
MENU = wmctrl -k $(wmctrl -m|fgrep -q OFF&&echo on||echo off)
# уменьшить громкость
META + F10 = v=$((`amixer get Master|awk -F[\[%] '/[0-9]+%/ {print $2; exit}'`-10)); [ $v -lt 0 ] && v=0;amixer set Master $v%
# увеличить громкость
META + F11 = v=$((`amixer get Master|awk -F[\[%] '/[0-9]+%/ {print $2; exit}'`+10)); [ $v -gt 100 ] && v=100;amixer set Master $v%
# клавиша поиска теперь вызывает искалку
SEARCH = catfish &
# скриншот экрана на рабочий стол
META + SYSRQ = scrot 'screen-%Y-%m-%d_%s.png' -e 'chown "'$SUDO_USER'" "$f"; mv "$f" "/home/'$SUDO_USER'/Desktop"'
# Клавиша Delete, как в Маке
META + BACKSPACE = xdotool key Delete

[Switches]
# Сброс звуковой карты на подъём крышки
LID:0 =  alsaucm -c tegraalc5632 reset

В качестве клавиши «Fn» выступает клавиша с «домиком», именно она опознаётся программой как «META». Последняя строка добавлена, что исправить глюк — у меня иногда после того, как устройство просыпается, звуковая плата из спячки не выходит.

23 комментария

Ошибка в Lubuntu 12.10 на Toshiba AC100

Я сегодня Линукс Лубунту поставил на Тошибу ЭйСи100-116, которую для жены когда-то покупал. Всё получилось, хоть и не без скрипа (минут 20 на это ушло), но после обновления всех пакетов получил такую ошибку:

"Couldn't find android boot partition on /dev/mmcblk0" and /etc/initramfs/post-update.d//flash-kernel exited with return code 1

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

sudo apt-get install abootimg

И всё заработает.

11 комментариев

Как заменить табы, используя sed

Утилита командной строки sed (это потоковый редактор), как-то неочевидно работает с символом табуляции (tab). Выражения «\t», «\x09», «\011» не срабатывают даже в расширенном режиме регулярных выражений (включается флагами „-r“ или „-E“, в зависимости от системы).

Я немного поэксперементировал, оказалось, что sed вполне воспринимает этот символ как таковой, а все «магические выражения» не работают. Поскольку «таб» имеет специальное значение в командной строке, ввести его можно либо через комбинацию Ctrl+V, tab, либо Ctrl+V, Ctrl+I. Во многих шеллах (например, в bash, ksh, sh) сработает специальный синтаксис с долларом, как в примере ниже.

Например, если вам надо заменить последовательные «табы» на один, то это может выглядеть вот так:

sed $'s/\t\t*/\t/g' sample.txt # именно \t\t*, а не \t+

# или

sed -E $'s/\t+/\t/g' sample.txt # в Линуксе ключ „-r“

Если вы знаете как в sed можно работать с tab проще, расскажите, пожалуйста, в комментариях.

7 комментариев

Му!

bolk-dev ~ $ aptitude -v moo
There really are no Easter Eggs in this program.
bolk-dev ~ $ aptitude -vv moo
Didn't I already tell you that there are no Easter Eggs in this program?
bolk-dev ~ $ aptitude -vvv moo
Stop it!
bolk-dev ~ $ aptitude -vvvv moo
Okay, okay, if I give you an Easter Egg, will you go away?
bolk-dev ~ $ aptitude -vvvvv moo
All right, you win.

                               /----
                       -------/      
                      /               
                     /                |
   -----------------/                  --------
   ----------------------------------------------
bolk-dev ~ $ aptitude -vvvvvv moo
What is it?  It's an elephant being eaten by a snake, of course.

«Пасхальное яйцо» в aptitude.

6 комментариев

Использование VRAM

Интересную статью обнаружил на просторах сети: «VRAM Storage Device — How to use the memory on GFX board in a different way». В статье показано как использовать лишнюю видеопамять под swap или как RAM-диск — я, буквально вчера, видел на Linux-сервере без GUI видеокарту с памятью 256Мб.

В статье показано как «откусить» у видеокарты память, которую она всё равно не использует. Я, для интереса, попробовал на нашем development-сервере (стоит S3 ViRGE/DX, 2Mb) откусить половину видеопамяти, по результатам опытов появилась несколько рекомендаций.

Во-первых, нельзя огульно верить всему, что написано в lscpi (см. статью). Если в результатах вывода написано о наличии региона некого размера, это ещё не значит, что на видеокарте именно столько памяти. Лучше посмотреть в лог X Window. Пример:

[root@hulk ~]# lspci -vv
...
02:01.0 VGA compatible controller: S3 Inc. ViRGE/DX or /GX (rev 01) (prog-if 00 [VGA])
        Subsystem: S3 Inc. ViRGE/DX
        ...
        Region 0: Memory at f4000000 (32-bit, non-prefetchable) [size=64M]
...
[root@hulk ~]# grep -i videoram /var/log/Xorg.0.log  
(--) S3VIRGE(0): videoram:  2048k

Во-вторых, лучше сделать modprobe и для остальных модулей, необходимых MTD для работы: mtdcore, mtdchar, mtdblock. Без этого, у нас на сервере, получить доступ к созданному устройству не получилось.

В остальном, всё работает замечательно:

[root@hulk ~]# cat /proc/swaps 
Filename                                Type            Size    Used    Priority
/dev/sda2                               partition       2096472 0       -1
/dev/mtdblock0                          partition       1016    0       0

1 комментарий

Маленькая Казань

Уважаемые казанцы, знаете ли вы, что Казань — это не только столица республики Татарстан, но и маленький город в Слободском районе Кировской области.

Казань, Кировская область, Слободский район (10.98КиБ)

1 комментарий

Быстродействие ФС

Прочитал статью «FreeBSD vs Linux: быстродействие файловых систем». Самые интересные выводы:

  • файловая система freeBSD (UFS и UFS2) куда
    медленнее файловых систем Linux (EXT2, EXT3, ReiserFS, XFS, JFS).
  • EXT2 рано выбрасывать на помойку, если вам хочется добиться максимальной
    производительности. Но не забудьте купить UPS.
  • JFS лучше не ставить. В режиме по умолчанию она обеспечивает
    наихудшую производительность, а в её настройках ещё нужно разобраться.
  • Возможно, следует приглядеться к ReiserFS.
  • EXT3/writeback может быть и не быстрее EXT3/ordered.

Удивительно как с такой непроизводительной файловой системой freeBSD удерживает лидирующие позиции на рынке серверов? Из-за бо́льшей надёжности? Но и во freeBSD немало уязвимостей. Из-за меньших проблем с настройкой? Достаточный ли это аргумент?

Оставить комментарий

Мобильный SSH

Кстати, занимаясь поиском интересных мидлетов, наткнулся на Floyd Telnet & SSH midlet и muTelnet midlet. Забавная штука. В принципе, через это можно выполнить какие-нибудь несложные действия — перезагрузить машину, обновить Apache и т. п.

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

Оставить комментарий

Проблема с c-client

Bug #29783 IMAP module problem.

Хозяйке на заметку: если под Linux RedHat у вас не собрался PHP с IMAP c-client, соберите его с модулем OpenSSL (ключ -​-open-ssl). Должно помочь. Удивляет то обстоятельство, что разработчики PHP явно знают как о существовании проблемы, так и методе её решения. Почему бы не написать об этом хоть где-нибудь?

Оставить комментарий

Хардлинки в WinXP

Я очень часто начинаю разрабатывать проект под Windows и заканчиваю — под Linux или freeBSD. Конечно, даже на уровне PHP, между этими группами операционных систем есть существенные различия. Обычно, они легко преодолеваются. В последнем проекте мне более всего не хватало функции link.

Поэкспериментировав с w32api и ffi, я понял, что этот путь — тупиковый. Побродив по поисковикам, я выяснил, что простейший выход — использовать в качестве заглушки утилиту fsutil из Windows XP. У неё есть параметр «hardlink create», позволяющий создавать ссылки.

if (PHP_OS == 'WINNT' && file_exists($_ENV['windir'].'\system32\fsutil.exe'))
{
    function link($target, $link)
    {
        $cmd = $_ENV['windir'].'\system32\fsutil.exe hardlink create';
        exec ($cmd.' "'.$link.'" "'.$target, $out, $ret);

        return !$ret;
    }
}

В случае, если вы будете использовать эту функцию в проекте, будьте осторожны — это всего лишь заглушка. Во-первых, одна ссылка создаётся примерно за 0.6 — 1сек, во-вторых, в ней нет проверки на наличие специальных символов в переменных $target и $link — если там попадётся кавычка, возникнет опасность внедрения вредоносного кода.

Оставить комментарий

LANG

«Его пример — другим наука». Господа, если при попытки инсталляции модуля для Perl, вы встретите сообщение вида «Makefile:85: *** missing separator. Stop.», не отчаивайтесь, а посмотрите значение переменной LANG. Её значение должно быть «en_US». Скорее всего у вас там «UTF8», измените его на «en_US» (обычно «export LANG en_US») и попробуйте установить модуль ещё раз.

Оставить комментарий

Нюансы qmail

Совет из недавно приобретённого мной опыта настройки Qmail+SMTP-AUTH+Vpopmail+MySQL:

Если в логах Qmail на попытку отправить письмо вы видите ошибку

«Sorry,_I_wasn’t_able_to_establish_an_SMTP_connection._(#4.4.1)»

посмотрите — нет ли у вас файла «outgoungip» в controls qmail. Если есть, то скорее всего там стоит 127.0.0.1. Поменяйте его на внешний IP-адрес вашего сервера.

Оставить комментарий

О безопасности в Unix

О безопасности Unix-систем.

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

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

Примерно через 5—10 минут (я как раз вбивал какое-то нечитаемое наименование с коробки из-под монитора), система меня пустила… Думаете я подобрал пароль? Если бы. СИСТЕМА МЕНЯ ПУСТИЛА, но, как будет видно ниже, Я НЕ НАБРАЛ ПРАВИЛЬНЫЙ ПАРОЛЬ.

Теория о том, что совпала hash-сумма, или, что я нашел «инженерный» пароль, не подтвердилась. После прихода Сергея мы провели «следственный эксперимент» — он заблокировал консоль и ввел ту же комбинацию.

Так что единственное разумное объяснение, которое пришло мне в голову, заключается в следующем. Похоже разработчики включили в свой продукт одну недокументированную особенность — система пускает человека, который в течение долгого времени вводит парольные последовательности, некоторая часть которых совпадает по буквенному составу и/или длине с правильным паролем. «Cчитая», что хозяин забыл пароль.

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

4 комментария