tag:blogger.com,1999:blog-68273632805925329572024-02-08T08:24:51.703+02:00cat **/* | grep яAkshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.comBlogger31125tag:blogger.com,1999:blog-6827363280592532957.post-23963477900823888672009-03-22T15:22:00.002+02:002009-03-22T15:48:40.596+02:00CeBootLin - автозагрузка Linux/Android из WinCE на Loox 5XX (560/550)Написал "bootloader" для загрузки Linux/Android из WinCE автоматически при включении КПК. Это не настоящий bootloader, так как он не имеет ничего общего с загрузочными секторами, это просто WinCE приложение, которое начинает свою работу как можно раньше, чтобы загрузить Linux. Я сделал это именно так, а не иначе, из-за того, что не хотел убить свою КПК изменением бут секторов или иметь сложный механизм перепрошивок, обновлений и т.д. Автозагрузка из WinCE мне показалась досточно неплохим решением, имеющим разве что 3-4 секундный проиграш, если сравнивать с нормальным bootloader'ом, который еще помучиться реализовать надо. Также, такая рализация позволяет достаточно легко пропустить загрузку Linux и продолжить загрузку WM5 или WM6.. Код основан на утилите Haret (спасибо им), но я удалил ненужные мне части. Так как загрузчик использует аппаратные регистры для работы с клавиатурой и подсветкой (GPIO/CPLD) Fujitsu Siemens Loox N560/C550, то без изменений кода данный загрузчик не заработает на другой модели КПК...<br />Когда КПК включается и начинается загрузка WinCE, то ядро WinCE читает список приложений из HKEY_LOCAL_MACHINE\init и запускает их. Таким способом загружается CeBootLin. CeBootLin начинает мигать подсветкой клавиатуры и ждет одну секунду. В то время, пока клавиатура подмигивает, пользователь может нажать и отпустить какую-нибудь кнопку КПК - это сигнал для CeBootLin не продолжать загрузку Linux. Если никакие кнопки нажаты не были, то CeBootLin попытается открыть \CeBootLin\default.txt и будет использовать его в качестве скрипта Haret для загрузки Linux'а.<br /><br />Итого, чтобы поставить и настроить CeBootLin, надо проделать такие шаги:<br />1. <a href="http://downloads.akshaal.info/linux-n560-c550/CeBootLin-1.zip?attredirects=0">Скачать</a> CeBootLin.<ad2></ad2><br />2. Распаковать содержимое архива в корень основной памяти КПК. CeBootLin.exe должен быть доступен по пути \CeBootLin\CeBootLin.exe.<br />3. Поместить default.txt в каталог \CeBootLin. Файл default txt может например выглядеть так (для загрузки Andorid'а, например):<pre><br />set MTYPE 1454<br />set KERNEL "\CeBootLin\zImage"<br />set CMDLINE "root=179:3 mem=62M rootdelay=3 boot_delay=0 init=/init console=tty0 fbcon=rotate:0 androidboot.console=tty0 android.checkjni=1"<br />set RAMADDR 0xA0200000<br />bootlinux<br /></pre><br />4. Поместить zImage в каталог \CeBootLin\.<br /><a href="http://picasaweb.google.com/lh/photo/11wJSVlZKWbWAN3DhaJXSw?authkey=Gv1sRgCMTt-MKs5cTh6wE&feat=embedwebsite"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibMt1fqjMm9uy6EMLPY4mwHyfLCOW185T9ijHbvRoLy8Tie-w2iGxszcs56nBWhFItjaSQrtHOE3QU12YELZ74f5LkatyqTaZAScb2U-scZwwV-38A8-2hp8p93up16fgbuqGxGlvoesYb/s400/CeBootEdit-1.png" /></a><br />5. Добавить в HKEY_LOCAL_MACHINE\init значение для Launch82 ="CeBootLin.exe" и Depend82 = 14 00.<br /><a href="http://picasaweb.google.com/lh/photo/00DSupXz9qiOXs43h5f5cA?authkey=Gv1sRgCMTt-MKs5cTh6wE&feat=embedwebsite"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA9oV7TAoWKEU_GCw6OXVRJ1BK9hnUP69xa-WuhYHXtKmWV9GY2JCefQgcwiKWIu47XplDAwIOoXSaL9e-R2LxHO7QtgdDxeHcrp0hKaYMT-l436PcYqDbS8anEKXGXnqUqC2gLfGdgFq_/s400/CeBootEdit-3.png" /></a><br /><a href="http://picasaweb.google.com/lh/photo/0Rc2C1G2xiQKk5R0RmvaZg?authkey=Gv1sRgCMTt-MKs5cTh6wE&feat=embedwebsite"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKsra4QotvdaOFNtqhXwTExBB-6IzxtGbNG8k_5wEhLbub444YRB3SwXYALep1YHUJIKiHW0QP0JQhOGh46UAY-QDl3DEREPLrKaVHqYCSZawYbzzMOF8364TZ8tK2e9Ng10CO4jEqgmYj/s400/CeBootEdit-4.png" /></a><br />6. Добавить в HKEY_LOCAL_MACHINE\Loader\SystemPath путь \CeBootLin\<br /><a href="http://picasaweb.google.com/lh/photo/hbLfmcNrlr6RpUPvLX_-5A?authkey=Gv1sRgCMTt-MKs5cTh6wE&feat=embedwebsite"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhecsc4aDa4i188OdbQynB4cMKKWsC0NBX7w_e2xk_xhGfYBNFqDdAd1U09x7brqDSKQxtPdW-v1-H6HrzWhSZJ6mmcdSaVaCdmDU-icOJBm9vu99JhQ6iDiNAkFEyaLR6c7qnXgrHTHq_K/s400/CeBootEdit-2.png" /></a><br />7. Подождать 5 минут или типа того (WinCE нужно время, прежде чем она сохранит обновление в registry).<br />8. Перезагрузить КПК<br /><br />Если возникнут какие-то проблемы, то первым делом стоит проверить, а грузит ли CeBootLin.exe вообще ядро... для этого достаточно просто его запустить.<br /><br />В дальнейшем при желании можно сделать нормальный cab с setup'ом внутри, который, например, будет ставить андройд..<br /><br /><a href="http://downloads.akshaal.info/linux-n560-c550/CeBootLin-1.tar.gz?attredirects=0">Здесь</a> находятся исходные коды CeBootLinux. CeBootLinux лицензирован под GNU GPL.<ad></ad>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com3tag:blogger.com,1999:blog-6827363280592532957.post-43833809951685196992009-03-15T16:06:00.002+02:002009-03-15T16:09:43.071+02:00Фотографии Android и Linux на Fujitsu-Siemens Loox N560<a href="http://picasaweb.google.com/lh/photo/CUrNwUv_XICGqKQKeMx6rA?authkey=Gv1sRgCMTt-MKs5cTh6wE&feat=embedwebsite"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYTyWCI0G04tQ2C5IB7hMG8hB8xxTS9R4Wqzh2l5gUz1SxqrACiQnHKXEkK1oniuJe7DVPy7lb3atRpOTaJf2sVqxp3b_UTCk0K3FBi4L5SKtHutDlSUJTMy3Mg6i73mJ2Irg3Q3JQKwtN/s400/n560-1s.jpg" /></a><br />Сегодня судьба WM5 - загрузить Linux<br /><br /><a href="http://picasaweb.google.com/lh/photo/Wdt450DQpEcjKa1aIu3iUA?authkey=Gv1sRgCMTt-MKs5cTh6wE&feat=embedwebsite"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKLGJW-BwuQJWgtqbHTt_mgBxtwqwcAkLNUIYXz5HE6l3SRO51kY0jTCwsBOUCS5wYb4MFXt-ioMlLUlMnbZFjCvV-zwPOweGrWUVtYGVhpyK_8kE4rbI7_SxbNdYI5AwAUaUBIYvhxJCU/s400/n560-2s.jpg" /></a><br />Haret.. все что нужно - нажать Run<br /><br /><a href="http://picasaweb.google.com/lh/photo/LQ7LXZhb1hXw6cwFARC4pg?authkey=Gv1sRgCMTt-MKs5cTh6wE&feat=embedwebsite"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoAhm1XwOODQ7HJVbEqCZKUpubw8hFU3wqcZR-J2TkJ6Y4CoLBwQv8yBJoLDMptwc_bb1siIfqb8v5Eal2KEIZLlhxpBmsIZY068X3KPBSL-o1GVEp_8HA2i9QGKnu-Pgugxw5yK-krTOz/s400/n560-3s.jpg" /></a><br />Android на Loox N560<br /><br /><a href="http://picasaweb.google.com/lh/photo/K2EytIW2FJWybumV11UTRg?authkey=Gv1sRgCMTt-MKs5cTh6wE&feat=embedwebsite"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfPExtvRBTFgBGjrq8_5nVNThzgVPma48WWa0yeTET00SrhbQahYqiHcnYNqr54nrmAVvVzJ7nHF5736a4Ca0xFut8SLpJgW8Gj1JjqEzXExv_viafVVvSyPGthxhvTye8zaVI1IeZ3nJz/s400/n560-4s.jpg" /></a><br /><a href="http://rus.akshaal.info/2009/03/emdebian-pda-c550n560.html">Установка Debian'а</a> на Loox N560<br /><br /><a href="http://picasaweb.google.com/lh/photo/ReuuEUcxhZ4y-Es7lRGneQ?authkey=Gv1sRgCMTt-MKs5cTh6wE&feat=embedwebsite"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDSxbzLLIncA482Nd5wTtRvYB0AyYMcHu3-V9Yayr5Ja8XtilIhk2u0mQ5lmEr-Cws_tXK-Qf_x2AJp5EKqvn4N1ac3vqeuUZgAh3gM0T8LBoXzBzj5IWMr3g1BdF3rB0zrdpb-uow69Xw/s400/n560-5s.jpg" /></a><br /><a href="http://rus.akshaal.info/2009/03/emdebian-pda-c550n560.html">Установка Debian'а</a> на Loox N560Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com6tag:blogger.com,1999:blog-6827363280592532957.post-85406637443782264322009-03-15T14:54:00.004+02:002009-03-15T15:08:07.134+02:00Тестирование памяти на Loox N560/C550Недавно набросал "утилиту" для тестирования памяти на Fujitsu-Siemens Loox N560/C550. Нужна она тем, кто перепаевает память (с 64М на 128М) и хочет проверить ее работоспособность "на месте" без переустановки WM5. Итак, для того, чтобы протестировать память КПК:<br />1. Качаем <a href="http://downloads.akshaal.info/other-soft-for-pda">LooxMem128-v0.zip</a> (чтобы тестировать 128Мб памяти) или <a href="http://downloads.akshaal.info/other-soft-for-pda">LooxMem64-v0.zip</a> (чтобы тестировать 64Мб памяти).<br />2. Заливаем распакованный архив на SD карточку.<br />3. Карточку вставляем в Loox и перегружаем КПК.<br />4. Не давая КПК заснуть, запускаем haret.exe из архива, что распаковывали на SD карточку.<br />5. После запуска haret.exe нужно нажать на Run.<br />6. Загрузится linux и появится предупреждение.<br />7. Читаем предупреждение и либо нажимаем на RESET (на попе у КПК) либо нажимаем enter..<ad2></ad2><br />ВНИМАНИЕ: Накачественная память при тестировании может сгореть (собственно "утилита" для этого и нужна, чтобы выявлять такую память). Ни я, ни авторы memtester ни кто иной кроме вас никакой ответственности за это нести не будет. Вы тестируете память на свой страх и риск!!<br /><br />Замечание: При тестировании необходимо раз в 3-5 минут нажимать какую-нибудь кнопку КПК, чтобы КПК не заснула...<br />(<i>Для портирования "утилиты" на другую платформу достаточно заменить ядро zImage и поправить default.txt.</i>)<ad2></ad2>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com1tag:blogger.com,1999:blog-6827363280592532957.post-6141997722341529132009-03-14T19:49:00.003+02:002009-03-14T20:36:07.533+02:00Ядро linux для Loox N560/C550 с рабочим CPLD и светодиодамиДобавил поддержку CPLD и светодиодов. Для CPLD был заюзан драйвер htc-gpio с перечислением адресов регистров CPLD на Fujitsu-Siemens Loox 5XX (N560/C550). Теперь CPLD доступен для других драйверов.<br /><br />Примечательно, как в Linux'е реализована работа с CPLD. По сути, CPLD это чип, содержащий очень простую логику (за счет чего он очень быстр по сравнению с CPU), имеющий входные и выходные "ножки" (pins). Входные и выходные ножки - регистры - проецируются на определенную область памяти CPU. С логической точки зрения работа с CPLD заключается в переключении битов в регистрах CPLD в 0 или 1 (можно еще и читать оттуда, но я об этом тут не буду рассказывать..). Таким же образом выглядит работа с GPIO - общим вводом/выводом CPU: биты регистров CPU таким же образом принимают значение 0 или 1. В ядре Linux уже имеется драйвер GPIO, предоставляющий функции для работы с GPIO разработчикам платформенных драйверов. Также драйвер GPIO имеет механизм расширения, позволяющий другим драйверам/модулям проецировать заданные интервалы портов GPIO таким образом, что при обращении к такому порту произойдет вызов указанных при проецировании функций. Этот механизм используется CPLD драйвером htc-egpio для проецирования CPLD регистров на GPIO порты. Таким образом работа с CPLD идет через обыкновенные методы типа gpio_set_value.<ad2></ad2><br />На основе работающиго CPLD драйвера для Loox N560/C550 реализовал драйвер управления светодиодами КПК. Драйвер экспортирует методы и константы которые другие драйвера (wifi, gps, bluetooth, pm, ...) должны использовать для управления светодиодами. Также драйвер позволяет контролировать светодиоды из userspace пространства путем манипуляций с файлами sysfs. <br /><br />Ниже перечисленны файлы и значения которые могут находиться:<br /><b>/sys/devices/platform/loox5xx-leds.1/keyboard</b>: on, off, any<br />- подсветка клавиатуры<br /><br /><b>/sys/devices/platform/loox5xx-leds.1/left_green</b>: on, off, any<br />- зеленый светодиод с левой стороны. WM5 использует для индикации активности WiFi<br /><br /><b>/sys/devices/platform/loox5xx-leds.1/left_blue</b>: on, off, any<br />- голубой светодиод с левой стороны. WM5 использует для индикации активности Bluetooth<br /><br /><b>/sys/devices/platform/loox5xx-leds.1/left_orange</b>: on, off, any<br />- оранжевый светодиод с левой стороны. WM5 использует для индикации активности GPS на Loox N560<br /><br /><b>/sys/devices/platform/loox5xx-leds.1/right_green</b>: on, off, any<br />- зеленый светодиод на правой стороне КПК. WM5 использует как светодиод доступный приложениям (нотификации и т.д.)<br /><br /><b>/sys/devices/platform/loox5xx-leds.1/right_orange</b>: on, off, blink, any<br />- оранжевый светодиод с правой стороны КПК. WM5 использует для индикации процесса зарядки<br /><br />Где:<br /><b>on</b> - светодиод включен независимо от желаний ядра,<br /><b>off</b> - светодиод выключен независимо от желаний ядра,<br /><b>blink</b> - светодиод мигает независимо от желаний ядра,<br /><b>any</b> - светодиод контролируется ядром.<br /><br />Например, если установить right_orange в состояние on, то светодиод зарядки будет гореть независимо от того, заряжается КПК или нет. Это будет продолжаться до тех пор, пока в файл right_orange не будет записано значение any. После чего, первое же событие (установка КПК в крэдл и т.д.) переключит светодиод в соответствующее состояние. Sysfs интерфейс для светодиодов позволяет использовать светодиоды из программ для нотификации о событиях (пришла почта, кончается заряд и т.д.) с помощью всех доступных на устройстве светодиодов - насколько хватит фантазии. Например следующий shell код мигает подсветкой клавиатуры:<pre><br />while true;<br /> do echo on > /sys/devices/platform/loox5xx-leds.1/keyboard;<br /> sleep 0.1;<br /> echo off > /sys/devices/platform/loox5xx-leds.1/keyboard;<br /> sleep 0.1;<br /> # Condition for break...<br />done<br />echo any > /sys/devices/platform/loox5xx-leds.1/keyboard;</pre><br /><br />Актуальный патч на cupcake ядро андройда качать <a href="http://downloads.akshaal.info/linux-n560-c550/c550-android-kernel-2009-03-14.patch.gz?attredirects=0">здесь</a>.<br /><ad></ad>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com6tag:blogger.com,1999:blog-6827363280592532957.post-78349665113851074082009-03-10T10:07:00.006+02:002009-03-10T10:18:42.568+02:00Полезные команды для межплатформенной работыНесмотря на то, что debian/emdebian уже содержат громадное количество пакетов под armel, иногда нужно собрать или пересобрать что-то из исходников.<br /><br />Сборка пакетов в emdebian происходит например так:<pre>emsource --arch armel -b memtester</pre><br />Установка собранного пакета НЕ на целевом устройстве, а на хостовом, выполняется например вот так:<pre><br />dpkg-cross -a armel -i zlib1g-dev_1.2.3.3.dfsg-13em1_armel.deb<br /></pre>При этом команда <i>dpkg -l | grep zlib1g</i> выдаст:<pre><br />ii zlib1g-dev-armel-cross 1:1.2.3.3.dfsg-13em1<br /></pre><ad2></ad2><br />(dpkg-cross автоматически переназвала установленный пакет и разместила его содержимое в /usr/arm-linux-gnueabi)<br /><br />Чтобы пользоваться командой <i>emsource</i> без привелегий root'а, надо настроить <i>~/.apt-cross/emsource</i> например вот так:<pre><br />workingdir: /home/akshaal/.apt-cross-working-dir<br /></pre><br />Сборка пакета под armel из исходников, которые уже развернуты и имеют каталог debian производится командой:<pre><br />dpkg-buildpackage -aarmel</pre>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-52969838341258099952009-03-09T15:29:00.003+02:002009-03-09T15:39:22.028+02:00Установка emdebian на PDA (C550/N560)Последовательность действий, выполнив которую я без проблем установил debian на свой Fujitsu-Siemens Loox N560. Я предполагаю, что emdebian-tools уже установлен, а также стоят всякие кросскомпиляторы под arm платформу.<br /><br />Первым делом необходимо собрать архив базовой системой:<pre>cd /tmp;<br />mkdir grip/<br />sudo debootstrap --arch=arm --foreign lenny grip/ http://www.emdebian.org/grip/<br />cd grip/<br />sudo tar -czf /tmp/emdebian-grip-arm-debootstrap.tgz .</pre>Теперь необходимо переразбить SD карточку выделив на ней раздел под linux:<pre><br />cfdisk /dev/sdX<br />mkfs.ext3 /dev/sdXy</pre><br />где sdX - это устройство с SD картой, а sdXy это раздел который предполагается использовать под linux. Теперь монтируем раздел и разворачиваем туда emdebian-grip-arm-debootstrap.tgz:<pre><br />mount /dev/sdXy /mnt<br />cd /mnt<br />tar zxpvf /tmp/emdebian-grip-arm-debootstrap.tgz<br />ln -s bin/sh init<br />cd /tmp<br />umount /mnt<br /></pre><br />Теперь, когда раздел подготовлен, загружаем с него linux и выполняем следующие команды:<pre>cd /debootstrap<br />export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin<br />run ./debootstrap --second-stage<br />dpkg --configure -a<br />rm /init<br />cd /<br />ln -s sbin/init init<br /></pre><ad2></ad2>Теперь перегружаем linux еще раз. В этот раз должно появится приглашение залогинится. Используем root без пароля. И конфигурируем основные настройки:<pre><br />echo 'nameserver 1.1.1.1' > /etc/resolv.conf<br />echo '127.0.0.1 localhost' > /etc/hosts<br />echo '172.16.0.2 myhost 172.16.0.2' >> /etc/hosts<br />echo 'myhost' > /etc/hostname<br /></pre><br />Вместо 1.1.1.1 нужно использовать IP DNS сервера. И снова перегружаем КПК. Теперь конфигурирем сеть:<pre><br />ifconfig usb0 172.16.0.1 netmask 255.255.255.0<br />route add default gw 172.16.0.1</pre>Убеждаемся, что сеть работает. Апгрейдим пакеты:<pre><br />echo 'deb http://www.emdebian.org/grip/ sid main' > /etc/apt/sources.list<br />echo 'deb http://ftp.debian.org/debian/ sid main contrib non-free' >> /etc/apt/sources.list<br />apt-get update<br />apt-get dist-upgrade<br />apt-get install ...что угодно...</pre><br />И теперь настраеваем сеть так как это положено (собственно это можно было зделать и раньше, но тут можно уже залогинится через ssh и нормально все сделать с помощью copy&paste с ББ...):<pre>cat > /etc/network/interfaces<br />auto lo<br />iface lo inet loopback<br />allow-hotplug usb0<br />iface usb0 inet static<br /> address 172.16.0.2<br /> netmask 255.255.255.0<br /> network 127.16.0.0<br /> broadcast 172.16.0.255<br /> gateway 172.16.0.1<br /> dns-nameservers 1.1.1.1<br /> dns-search your.domain<br /></pre><ad></ad>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-72887756924752396952009-03-07T22:51:00.005+02:002009-03-08T12:49:32.445+02:00Ядро linux для Loox N560/C550 с рабочим usbnet'омПосле 3х дней мучений все-таки собрал ядро linux для Fujitsu-Siemens Loox N560/C550. Ядро брал с <a href="http://www.asm32.ru">http://www.asm32.ru</a>. Потратив еще несколько часов разобрался как запустить usbnet (сеть через обычный usb шнурок). Для этого пришлось дополнительно пропатчить pxa27x_udc.c. Сделал diff между текущей версией ядра андройда и теми исходниками (за 02-03-09), что выложены на asm32. В дальнейшем при обновлении ядра в cupcake'овской ветке можно будет просто накладывать этот патч сверху имея в результате и изменения под c550/n560 и исправления/дополнения внесенные в cupcake ветку. <a href="http://downloads.akshaal.info/linux-n560-c550/c550-android-kernel-2009-03-07.patch.gz?attredirects=0">Вот итоговый патч</a> в который также включены изменения для работы usbnet. В патче уже имеется .config, но там не включена поддержка usbnet. <a href="http://downloads.akshaal.info/linux-n560-c550/linux-config-2009-03-07?attredirects=0">Вот другой config</a>, он отличается от того, что в патче (а там тот, что выложен на asm32) поддержкой usbnet, выключенной power management (зачем не знаю, потом надо будет включить обратно), и настройкой для более крупного шрифта в консоли.. может еще чем-то.<br /><br />Собирать ядро можно с помощью любого toolchain'а. Я пробовал собирать с помощью: crosstool-ng, emdebian, а также того, что идет вместе с ядром андройда. Остановился на emdebian'е. Для сборки ядра emdebian'ом необходимо выполнить:<pre>make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-</pre>Предварительно emdebian конечно же нужно установить, например так:<pre><br />apt-get install emdebian-tool<br />emsetup --arch arm</pre>Добавить:<pre><br />deb http://www.emdebian.org/debian/ unstable main</pre><br />в /etc/apt/sources.list и выполнить:<br /><pre>apt-get install linux-kernel-headers-arm-cross gcc-4.2-arm-linux-gnu</pre><br /><br />Готовое ядро запускается haret'ом с конфигом:<pre><br />set MTYPE 1454<br />set KERNEL zImage<br />set CMDLINE "root=179:2 mem=60M rootdelay=3 boot_delay=0 init=/init console=tty0 fbcon=rotate:0 androidboot.console=tty0 android.checkjni=1"<br />set RAMADDR 0xA0200000<br />bootlinux</pre><ad></ad><br />И самое главное! После того, как ядро закинуто на sd карточку, эту sd карточку нужно вставить в КПК и ребутнуть КПК. А уже только после этого грузить haret'ом ядро! Ибо ядро не грузится (либо грузится с вероятностью 10%), если:<br />1. КПК заснула, а потом ее разбудили.<br />2. Вы только что вставили в КПК карточку.<br />Наверное это бага драйвера wince...<br /><br />P.S. Cupcake на который накладывается выложенный патч качается отсюда <a href="http://source.android.com/download"> http://source.android.com/download</a><br /><br />P.P.S. При сборке с поддержкой usbnet опцию CONFIG_USB_ETH_RNDIS<br /> включать не следует! Ибо в этом случае ПК не может нормально соеденится с КПК.. ни cdc_ether ни cdc_subset не видят usb устройство.Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-31988525560964962762009-02-04T18:10:00.002+02:002009-02-22T16:36:14.177+02:00Microsoft Windows EnvironmentКаждый раз перезжая на новое рабочую машину, я думаю - это последний раз, больше не придется.<br /><ad></ad><br />1. Установить http://virtuawin.sourceforge.net/ и назначить переключение рабочих столов на Win-0 ... Win-9 - как общие столы.<br /> Win-C для стола с Eclipse. <br /> Win-I для всяких чатов.<br /><br />2. Установить http://www.skynergy.com/hotkeyz.html<br /> Назначить Win-z для запуска rxtv с zsh<br /> Назначить Ctrl-Shift-f12 на закрытие окна<br /> Win-Enter - maximize window<br /> Shift-Win-Enter - restore window<br /><br />3. Установить http://www.cygwin.com/ с пакетами python, perl, zsh, diff, patch, make, mc и еще кучей ползеных программ и утилит.<br /><br />4. Если вдруг оказалось, что cygwin считает домашней директорией сетевой диск и из-за этого тормозит, то незабыть поменять home директорию в /etc/passwd<br /><br />5. В /etc/passwd прописать /usr/bin/zsh А в домашнюю директорию положить .zshrc следующего содержания:<pre><br />alias ls='ls --color'<br />alias ll='ls -l --color'<br />alias dfh='df -h'<br />alias duh='du -h'<br />alias rm="rm -i"<br />alias mc="mc -a"<br /><br />alias c="cd /cygdrive/c"<br /><br />alias cdp='cd /cygdrive/c/projects/'<br /><br />export INPUTRC=$HOME/.inputrc<br /><br />export HISTSIZE=80000<br />export HISTFILE=~/.history<br />export SAVEHIST=80000<br /><br />setopt hist_ignore_dups append_history bsd_echo multios<br />setopt hist_ignore_all_dups<br />setopt SHARE_HISTORY<br /><br />prompt=`echo -ne "%{\033[31m%}%n@%M:%B%30<..<%~%#%b "`<br /><br />export EDITOR=vim<br /><br />unsetopt beep<br /><br /># ##########################################################################3<br /># -+--+-+ --+-+-<br /><br />bindkey "\e[1~" beginning-of-line<br />bindkey '\eOH' beginning-of-line<br />bindkey "\e[2~" end-of-history<br />bindkey "\e[3~" delete-char<br />bindkey "\e[4~" end-of-line<br />bindkey "\eOF" end-of-line<br />bindkey "\e[5~" history-incremental-search-backward<br />bindkey "\e[6~" history-incremental-search-forward<br />bindkey "\e[A" history-beginning-search-backward<br />bindkey "\e[B" history-beginning-search-forward<br />bindkey "\e[C" forward-char<br />bindkey "\e[D" backward-char<br />bindkey "\e[7~" beginning-of-line<br />bindkey "\e[8~" end-of-line<br />bindkey "\e[3~" backward-delete-char<br />bindkey "\e[3~" delete-char<br /><br /><br /># ###########################################################################<br />chpwd precmd () {<br /> laststatus=$?<br /> [[ $laststatus != 0 ]] && print "\033[1,33m**** \033[1,31mExit code: $laststatus\n"<br /><br /> [[ -t 1 ]] || return<br /> case $TERM in<br /> *xterm*|*rxvt*|*(dt|k|E)term*) print -Pn "\e]2;%n@%M:%15<..<%~%<<\a"<br /> ;;<br /> esac<br />}<br /><br />preexec () {<br /> [[ -t 1 ]] || return<br /> case $TERM in<br /> *xterm*|*rxvt*|*(dt|k|E)term*) print -Pn "\e]2;%n@%M:%15<..<%~%<< (%15>..>$1%>>)\a"<br /> ;;<br /> esac<br />}<br /><br />chpwd<br /><br /># The following lines were added by compinstall<br /><br />zstyle ':completion:*' completer _expand _complete<br />zstyle ':completion:*' expand prefix suffix<br /><br />autoload -Uz compinit<br />compinit -u<br /># End of lines added by compinstall<br /></pre><ad></ad><br /><b>6. В c:/cygwin положить файлик rxvt.bat:</b><br /><pre>@echo off<br /><br />C:<br />chdir C:\cygwin\bin<br /><br />set CYGWIN=codepage:oem tty binmode title<br />set TERM=cygwin<br />rxvt -geometry 90x30 -bg black -fg white -sr -sl 5000 -fn 10x20 -e c:/cygwin/bin/zsh --login -i</pre>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-68035989963255122212008-08-11T19:31:00.001+03:002009-02-22T16:33:45.504+02:00Зедаржки в JavaТак как для задач управление домашней автоматикой я сделал не совсем очивидный выбор - Java, то, естественно, мне было необходимо настраивать работу Java приложения под требование иметь минимальные задержки на события. В результате, для того, чтобы получить имеющийся результат, пришлось предпринять следующие действия:<br /><ad2></ad2><br />1. Пускать приложение с schedtool -n -20 -R -p 1 -e /opt/mywire/bin/mywire<br /> Данная команда позволяет запустить приложение в realtime группе с приоритетом 1. Все приложение linux имеют приоритет 0 независимо от nice level'а. Таким образом работа нашего mywire всегда приоритетнее любой задачи.<br /><br />2. В некоторых критичных нитях, с помощью обращения к native методу происходит установка приоритета в значение 40. Таким образом внутри самого приложения нити имеют разные приоритеты. Это опасно и может привести к блокировкам!<br /><br />3. Для того, чтобы ни в коем случае mywire не оказался в свопе, память лочится с помощью обращения к native методу mlockall.<br /><br />4. Сам java процесс пускается со следующими опциями:<pre><br /> -Xms30m -Xmx64m -XX:PermSize=15m -XX:MaxPermSize=30m<br /> -XX:+UseTLAB -jvm server<br /> -XX:MaxGCPauseMillis=20 -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode<br /> -XX:+CMSClassUnloadingEnabled<br /> -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses<br /> -XX:+BackgroundCompilation</pre><br /> Количество памяти, которое я отдаю под heap выбранно таким образом, чтобы сразу после сборки мусора (full gc), свободной памяти было где-то 60%.<br /><br />Надеюсь ничего не забыл. Как результат мы имеем задержки порядки 10-16мс. При том, что библиотека quartz сама работает с дискретеностью в 10мс. Тоесть если ей сказать, что таску нужно запустить через 5мс, она ее все равно запустить через 10.<br /><br />К сожалению раз в час происходит full gc или что-то типа того и это влечет за собой неожиданные задержки. Величина зависит от того, как совпадут время срабатывания и начало сборки мусора. В среднем это 200мс. Бывает и 500мс и 700мс. Будем думать как это побороть.<br /><br />Вот графики:<br />Latency:<br /><img src="http://toril.ru/lj/hour.rrd.png"><br /><br />Память.<br /><img src="http://toril.ru/lj/phour.rrd.png"><br /><ad></ad><br />Видно, что в момент сборки мусора был всплеск задержек.<br /><br />Предугадывая вопросы:<br /> Java - чтобы писать быстрее.<br /><br /> Latency - в данном случае, это разница времени момента срабатывания таймера и времени, в которое данный таймер должен был сработать. Тоесть, например, если было сказано спать 100мс, а таймер проспал 120мс, то задержка 20мс.<br /><br /> Важность Latency заключается в том, что опрашивать некоторые датчики необходимо весьма часто, скажем датчик движения 2 раза в секунду. В моем варианте датчик движения замыкает размыкает контакты конденсатора давая ему зарядится, таким образом датчик напряжения 1-wire успеет заметить какой-нибудь заряд, даже если он пропустит сам импульс. Так вот если Latency будет слишком высокой (скажем 2-3 секунды), то срабатывания датчик может просто остаться незамеченным.<br /><br /> Кто озадачился вопросом, почему датчик движения не может сам сообщить о срабатывании, отвечу: 1-wire сеть может иметь только одного master'а, все остальные slave'ы.Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-13415856905194186412008-06-26T22:08:00.001+03:002009-02-22T16:31:21.158+02:00Linux 2Ну вроде разобрался с <a href="http://rus.akshaal.info/2008/06/linux.html">проблемой зависания</a>. Это определенно не дрова видюхи - без них в консоли все равно висло. Это не перегрев - в винде все ok. Четыре зависших попыток компиляции ядра 2.6.25.9 под ядром 2.6.25.8 показали, что проблема воспроизводима легко. Под 2.6.24 удалось собрать 2.6.25.9. Но собрать под 2.6.25.9 ради теста саму 2.6.25.9 не получилось - висла. Скачал 2.6.26-rc8. Тестовая сборка под этим ядром прошла нормально. Проблемы с протоколом Samba исчезли (интересно, что scp как работала нормально, так и работает). Вроде жизнь наладилась. Всем спасибо за советы.<br /><ad></ad><br />Итого. 2.6.25.6, 2.6.25.7, 2.6.25.8, 2.6.25.9 - на моей машине (64 бита, AMD) оказались не рабочими.Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-77019407538518361432008-06-24T16:59:00.001+03:002009-02-22T16:31:02.912+02:00LinuxЗадалбывает меня это. Вот все было круто, не знал я печали, как начались глюки. С чем связано понять не могу, но сходу:<br /><br />Эпизодически, несколько раз в день система фризится напроч. Тоесть мышиный курсор не двигается, музыка не играет и т.д.<br />Если я в это время залогинен по VNC на зафризенную машину, то в момент этот, я могу максимум что сделать - запустить zsh и все. И то наверное потому, что он в кэш памяти сидит. Изображение прорисовывается по нажатию на кнопку. Например набрал su <ENTER>, но ничего не произошло. Нужно любую кнопку нажать, чтобы увидеть запрос на логин. Странное поведение. В логах ничего подозрительного нет. shutdown -r now не отрабатывает (программа вообще не похоже, что запускается).<br /><br />Если копирую что-то по smb протоколу, то в файле только первые несколько кил нормальные, а дальше нули идут. Тоесть mp3 музыка играет пару сек и затыкается, если играть smb share'ы. При этом с другого компа доступ к томуже smb ресурсу работает без проблем и глюков. Если копируют mp3'ки мне на шару, то играет все нормально.<ad></ad><br />Даже не знаю что думать. Куллеры крутятся.. все как обычно. Винда на компе работает нормально, в т.ч. и Crysis. Ядро 2.6.25.(от 6 до 8). Никому ничего не напоминает?Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-48750551048445689372008-05-19T13:18:00.001+03:002009-02-22T15:46:45.681+02:00OWFS 2.7p4Нашел багу в OWFS 2.7p4. Немного криво написанная блокировка приводила к обращению к уже освобожденному участку памяти. Проявлялось через 1сек-5мин (как повезет) при паралелльном обращении к датчикам: owfs выключалась либо молча либо с сообщением функции tsearch из glibc о поврежденном списке. GDB помог не сильно. Valgrind помог весьма - отличная тулзень, давно ей пользуюсь.<br /><pre>==16965== Thread 9:<br />==16965== Invalid read of size 4<br />==16965== at 0x405F7A5: LockGet (ow_locks.c:142)<br />==16965== by 0x4066195: FS_r_given_bus (ow_read.c:229)<br />==16965== by 0x40663B2: FS_read_distribute (ow_read.c:191)<br />==16965== by 0x40668AD: FS_read_postparse (ow_read.c:106)<br />==16965== by 0x4066AEA: FS_read (ow_read.c:58)<br />==16965== by 0x409E26D: fuse_fs_read (in /usr/lib/libfuse.so.2.7.3)<br />==16965== by 0x40A2A12: (within /usr/lib/libfuse.so.2.7.3)<br />==16965== by 0x40A5F48: (within /usr/lib/libfuse.so.2.7.3)<br />==16965== by 0x40A6EAF: (within /usr/lib/libfuse.so.2.7.3)<br />==16965== by 0x40A86D5: fuse_session_process (in /usr/lib/libfuse.so.2.7.3)<br />==16965== by 0x40A4AD4: (within /usr/lib/libfuse.so.2.7.3)<br />==16965== by 0x40C8382: start_thread (in /lib/libpthread-2.7.so)<br />==16965== Address 0x43b8dc8 is 0 bytes inside a block of size 16 free'd<br />==16965== at 0x402465C: free (vg_replace_malloc.c:323)<br />==16965== by 0x41B281A: tdelete (in /lib/libc-2.7.so)<br />==16965== by 0x405F62B: LockRelease (ow_locks.c:164)<br />==16965== by 0x40662AD: FS_r_given_bus (ow_read.c:236)<br />==16965== by 0x40663B2: FS_read_distribute (ow_read.c:191)<br />==16965== by 0x40668AD: FS_read_postparse (ow_read.c:106)<br />==16965== by 0x4066AEA: FS_read (ow_read.c:58)<br />==16965== by 0x409E26D: fuse_fs_read (in /usr/lib/libfuse.so.2.7.3)<br />==16965== by 0x40A2A12: (within /usr/lib/libfuse.so.2.7.3)<br />==16965== by 0x40A5F48: (within /usr/lib/libfuse.so.2.7.3)<br />==16965== by 0x40A6EAF: (within /usr/lib/libfuse.so.2.7.3)<br />==16965== by 0x40A86D5: fuse_session_process (in /usr/lib/libfuse.so.2.7.3)</pre><ad></ad><br />Пропатченная версия работает уже 2 часа без проблем. Если до вечера доработает без ошибок напишу в mailing list owfs.<br /><br /><a href="http://toril.ru/soft/owfs-2.7p4-locksfix.patch.gz">Патч.</a><br /><br />P.S. Valgrind показал мемори ликов на 4кб. Надо будет глянуть.. это конечно не 4мб, но если там не дебри, то почему бы не пофиксить...<ad2></ad2>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-66491396845841042622008-04-27T20:03:00.001+03:002009-02-22T15:48:55.600+02:00Linux: Thread Priorities in JavaГрустно мне. Приоритеты нитей в linux джава игнорирует.<br /><a class="snap_shots" href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4813310">http://bugs.sun.com/bugdatabase/view_bu<wbr>g.do?bug_id=4813310</a><br /><br /><b>Update:</b> Решение кажется нашел. Разберусь до конца опишу подробнее.<ad2></ad2>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com1tag:blogger.com,1999:blog-6827363280592532957.post-34220333071348910442008-02-08T14:09:00.001+02:002009-02-22T15:55:01.122+02:00VNCПосвящается тем, кто как я (до того как составил таблицу) мучается со вводом русских букв из виндового vncclient'а при работе на юниксовом vncserver'е.<br /><br />Самое простое решение, что я нашел, без всяких извратов и прочего - это:<br />1-х. Нужно составить таблицу соответствия виндовых keysym'ов к keysym'ам linux'a и запускать vnc4 с аргументом -RemapKeys, так у меня получилось вот что:<ad2></ad2><br /><pre>0xb8->0x6a3,0xe9->0x6ca,0xf6->0x6c3,0xf3->0x6d5,<br />0xea->0x6cb,0xe5->0x6c5,0xed->0x6ce,0xe3->0x6c7,0xf8->0x6db,<br />0xf9->0x6dd,0xe7->0x6da,0xf5->0x6c8,0xfa->0x6df,<br />0xf4->0x6c6,0xfb->0x6d9,0xe2->0x6d7,0xe0->0x6c1,<br />0xef->0x6d0,0xf0->0x6d2,0xee->0x6cf,0xeb->0x6cc,<br />0xe4->0x6c4,0xe6->0x6d6,0xfd->0x6dc,0xff->0x6d1,<br />0xf7->0x6de,0xf1->0x6d3,0xec->0x6cd,0xe8->0x6c9,<br />0xf2->0x6d4,0xfc->0x6d8,0xe1->0x6c2,0xfe->0x6c0,<br />0xa8->0x6b3,0xc9->0x6ea,0xd6->0x6e3,0xd3->0x6f5,<br />0xca->0x6eb,0xc5->0x6e5,0xcd->0x6ee,0xc3->0x6e7,<br />0xd8->0x6fb,0xd9->0x6fd,0xc7->0x6fa,0xd5->0x6e8,<br />0xda->0x6ff,0xd4->0x6e6,0xdb->0x6f9,0xc2->0x6f7,<br />0xc0->0x6e1,0xcf->0x6f0,0xd0->0x6f2,0xce->0x6ef,<br />0xcb->0x6ec,0xc4->0x6e4,0xc6->0x6f6,0xdd->0x6fc,<br />0xdf->0x6f1,0xd7->0x6fe,0xd1->0x6f3,0xcc->0x6ed,<br />0xc8->0x6e9,0xd2->0x6f4,0xdc->0x6f8,0xc1->0x6e2,<br />0xde->0x6e0</pre><br /><br />2-х. Нужно сообщить xmodmap'у о том, какие символы он должен знать аутофбокс так сказать. vncserver конечно и сам их добавить может, но он сопровождает это сообщениями да и заглавные литеры при этом себя ведут не очень хорошо. Так что лучше все-таки заранее добавить. Я поместил в ~/.vnc/xstartup вот такие строки:<br /><pre>xmodmap -e "keycode 252 = Cyrillic_shorti Cyrillic_SHORTI"<br />xmodmap -e "keycode 251 = Cyrillic_tse Cyrillic_TSE"<br />xmodmap -e "keycode 250 = Cyrillic_u Cyrillic_U"<br />xmodmap -e "keycode 249 = Cyrillic_ka Cyrillic_KA"<br />xmodmap -e "keycode 248 = Cyrillic_ie Cyrillic_IE"<br />xmodmap -e "keycode 247 = Cyrillic_en Cyrillic_EN"<br />xmodmap -e "keycode 246 = Cyrillic_ghe Cyrillic_GHE"<br />xmodmap -e "keycode 245 = Cyrillic_sha Cyrillic_SHA"<br />xmodmap -e "keycode 244 = Cyrillic_shcha Cyrillic_SHCHA"<br />xmodmap -e "keycode 243 = Cyrillic_ze Cyrillic_ZE"<br />xmodmap -e "keycode 242 = Cyrillic_ha Cyrillic_HA"<br />xmodmap -e "keycode 241 = Cyrillic_hardsign Cyrillic_HARDSIGN"<br />xmodmap -e "keycode 240 = Cyrillic_ef Cyrillic_EF"<br />xmodmap -e "keycode 239 = Cyrillic_yeru Cyrillic_YERU"<br />xmodmap -e "keycode 238 = Cyrillic_ve Cyrillic_VE"<br />xmodmap -e "keycode 237 = Cyrillic_a Cyrillic_A"<br />xmodmap -e "keycode 236 = Cyrillic_pe Cyrillic_PE"<br />xmodmap -e "keycode 235 = Cyrillic_er Cyrillic_ER"<br />xmodmap -e "keycode 234 = Cyrillic_o Cyrillic_O"<br />xmodmap -e "keycode 233 = Cyrillic_el Cyrillic_EL"<br />xmodmap -e "keycode 232 = Cyrillic_de Cyrillic_DE"<br />xmodmap -e "keycode 231 = Cyrillic_zhe Cyrillic_ZHE"<br />xmodmap -e "keycode 230 = Cyrillic_e Cyrillic_E"<br />xmodmap -e "keycode 229 = Cyrillic_io Cyrillic_IO"<br />xmodmap -e "keycode 228 = Cyrillic_ya Cyrillic_YA"<br />xmodmap -e "keycode 227 = Cyrillic_che Cyrillic_CHE"<br />xmodmap -e "keycode 226 = Cyrillic_es Cyrillic_ES"<br />xmodmap -e "keycode 225 = Cyrillic_em Cyrillic_EM"<br />xmodmap -e "keycode 224 = Cyrillic_i Cyrillic_I"<br />xmodmap -e "keycode 223 = Cyrillic_te Cyrillic_TE"<br />xmodmap -e "keycode 222 = Cyrillic_softsign Cyrillic_SOFTSIGN"<br />xmodmap -e "keycode 221 = Cyrillic_be Cyrillic_BE"<br />xmodmap -e "keycode 220 = Cyrillic_yu Cyrillic_YU"</pre><ad></ad>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-15027549460103158712008-01-21T22:56:00.001+02:002009-02-22T15:56:40.193+02:00WayBackИногда возникает необходимость запустить приложение не в настоящем времени, а в прошлом или будущем. Обычно это нужно для тестирования приложения или для обхода устаревания evaluation license. Достигается это переводом системных часов, либо запуском приложения в vmware - оба этих метода имеют свои очевидные недостатки. К счастью в linux есть такая замечательная вещь как LD_PRELOAD, позволяющяя "переопределить" импортируемые функции приложения. Так, например, если подменить time, gettimeofday и clock_gettime - то программа с большой долей вероятности будет жить в том времени который нам нужен, в то время как вся остальная система будет жить в обычном временном русле. Для этих целей я написал <a href="http://toril.ru/soft/libwayback-1.tar.gz">небольшую C'ную библиотеку</a>. Устанавливается библиотека как обычно make install. <ad></ad><br /><br />Для примера, небольшое тестовое приложение на C:<pre><br />void main () {<br /> printf ("%lu\n", time(0));<br />}<br /></pre><br />Запускаем:<pre><br /><b>akshaal@...:/tmp% ./test</b><br />1200947571<br /><br /><b>akshaal@...:/tmp% WAYBACK_TODAY=1970.01.01 LD_PRELOAD=libwayback.so.0 /tmp/test</b><br />63225<br /><br /><b>akshaal@...:/tmp% WAYBACK_LOG_LEVEL=3 WAYBACK_TODAY=1970.01.01 LD_PRELOAD=libwayback.so.0 /tmp/test</b><br />Delta time: 3094082896<br />time modified<br />63257<br /></pre><br /><br />Библиотека libwayback не возвращает константу. После запуска, она определяет разницу между текущим временем и желаемым и запоминает ее как delta. В дальнейшем все вызовы к функция возвращающим время перехватываются и delta прибваляется к результату. Таким образом время не стоит на месте и в то же время она очень близко к желаемому.<br /><br />Например приложение на Java и стандартная утилита date:<pre><br />import java.util.Date;<br /><br />public class test {<br /> public static void main (String[] args) {<br /> System.out.println (new Date());<br /> }<br />}<br /><br /><b>akshaal@...:/tmp% java test</b><br />Mon Jan 21 22:39:26 EET 2008<br /><br /><b>akshaal@...:/tmp% WAYBACK_TODAY=2010.11.27 LD_PRELOAD=libwayback.so.0 java test</b><br />Sat Nov 27 20:40:39 EET 2010<br /><br /><b>akshaal@...:/tmp% date</b><br />Mon Jan 21 22:41:20 EET 2008<br /><br /><b>akshaal@...:/tmp% WAYBACK_TODAY=2010.11.27 LD_PRELOAD=libwayback.so.0 date</b><br />Sat Nov 27 20:41:50 EET 2010<br /></pre><br /><br />К сожалению данный способ может быть использован для обхода устаревания лицензии :) у программ к которым есть evaluation license ограниченная на определенный срок (например JProfiler 5, YourKit Profiler 7, InteliJ Idea и еще много). Я не проверял работает ли (но уверен, что да :) ) ибо предпочитаю опенсоурс софт и вообще это плохо и я против использования библиотеки для этих целей :).<br /><br />В библиотеке существует опция WAYBACK_RESET, которая определяет сколько секунд будет происходить подмена времени. К сожалению и эта опция может быть использована в целях обмана программ проверяющих срок действия лицензии. К примеру, если программа проверяет лицензию при запуске, то WAYBACK_RESET несознательный человек установит в 5 секунд, и после 5с получит пройденную проверку и программу с актуальным временем.<br /><br />Библиотека написана за час и не является Абсолютным Решением. Кому надо - юзают на свой страх и риск, а с меня никакого спросу.<ad2></ad2><br /><br />P.S. Больше всего напарился с одной вещью. Запускаю свинговое приложение, а оно виснет. Думаю че за нахрен. Копался-копался... оказывается java юзает pthread_condwait и ей в качестве параметра передается не относительное время (время когда ожидание прекращается), а абсолютное! Пришлось и эту функцию переопределить и вычитать дельту. Но как я искал.. strace говорит, что нить висит на futex каком-то.. и только чудом догадался, что futex может быть более нижним лаером под pthread'ом, а там уже полез смотреть как работа с X'ами идет в libawt.Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com1tag:blogger.com,1999:blog-6827363280592532957.post-41233637524047411822008-01-05T21:05:00.001+02:002009-02-22T15:59:07.478+02:00CollectDГрубо говоря - ни дня без патчей (хотя бы так, чем ничего). Провозившись с collectd нашел ошибку. Исправил. Патч (аж из трех новых строк) отослал. Может кто-то тоже возится, пытаясь понять, почему unixsock plugin для collectd не проставляет права на socket.<ad></ad><br /><pre>diff -urN old/src/unixsock.c new/src/unixsock.c<br />--- old/src/unixsock.c 2007-11-10 17:15:39.000000000 +0200<br />+++ new/src/unixsock.c 2008-01-05 20:45:17.000000000 +0200<br />@@ -29,6 +29,7 @@<br /> #include <pthread.h><br /><br /> #include <sys/socket.h><br />+#include <sys/stat.h><br /> #include <sys/un.h><br /><br /> #include <grp.h><br />@@ -365,6 +366,8 @@<br /> return (-1);<br /> }<br /><br />+ chmod (sa.sun_path, sock_perms);<br />+<br /> status = listen (sock_fd, 8);<br /> if (status != 0)<br /> {<br /></pre>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-85628414028219702652007-10-23T13:07:00.001+03:002009-02-22T16:05:02.559+02:00localeТеперь так:<br />> echo $LANG<br />en_GB.UTF-8<br /><br />Избавился еще от одной олдскульной вещи: локали в виде ru_RU.koi8-r. Пока пришлось заменить rxvt на rxvt-unicode-lite. Остальное вроде слега поднастроить и допилить. Centericq глючит (позицианирует курсор как будт-то вместо одного символа вставляются два (считает не символы а байты сволочь), но в пределах нормы, тем более, что в планах избавление от centericq. Рано или поздно это должно было случится.<ad2></ad2>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-74443792377678728572007-04-07T21:34:00.003+03:002009-02-22T16:08:17.422+02:00СломалНа второй день после покупки сломал dreambox 500 (ресивер на linux для спутникового телевиденья). Циклится при загрузке. Как это чинить - идей нет, поэтому решил перепрошить. Щас с легкостью перепрошивается.<ad2></ad2><br /><br />Такая вот фигня при загрузке:<br /><pre>[...]<br />Multiplex thread got Data<br />Command='ZAP'<br />Zap data ,<br />Multiplex thread got Data<br />Dropping connection<br />active count=0<br />rc=0 '0,'<br /> ------------> changed! 0<br />no transponder 1 444<br />[TUNE] tune failed<br />Segmentation fault<br /></pre>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-31570855211959773652007-03-25T17:35:00.001+03:002009-02-22T16:09:07.992+02:00mmcСделал <a href="http://toril.ru/soft/mmc-4.1-key-color256.diff.gz">патч</a> для MMC (консольный клиент для mud игр). С этим патчем mmc поддерживает 256 цветов в xterm/rxvt/putty, кривые терминалы (это когда "terminal cannot insert/delete characters") и символы с кейпада. <a href="http://toril.ru/lj/mmc-patch.png">Скриншот</a>.<ad2></ad2>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-83786235706074350672007-03-13T14:36:00.001+02:002009-02-22T16:10:24.172+02:00OSD DesktopЕще один пост, который давно откладываю (уже годы). Вобщем, я записал ролик о том, как мой десктоп выглядит (<a href="http://toril.ru/lj/akdesk1.avi">640x480 10fps 2mb</a> или <a href="http://toril.ru/lj/akdesk2.avi">1024x768 10fps 6mb</a>). Идея сделать его OSD'ным витала в воздухе задолго до того, как я написал первые строки кода. В результате эволюции десктопа, я привык работать в полноэкранном режиме. Часики, измерители и прочие пищали быстро сгинули с моего рабочего стола. И несмотря на то, что я оказался в мире без уведомлений, я был счастлив. И тогда OSD пришло ко мне как решение удержать программы в полноэкранном режиме и в то же время быть в курсе событий. Используя python и библиотеку OSD для него, я написал демона событий. Демон читает строки из файла ~/log/events и парсит их согласно шаблонам:<ll><br /><li> <b>string</b> - добавляет строку в список отображаемых строк.<br /><li> <b>[][][]\d\d\d\d: string</b> - тоже самое, что и в предыдущем случае, но отображает строку заданное количество мс.<br /><li> <b>\d\d\:\d\d:\d\d: string</b> - тоже, что и первый случай, но с датой. Дата не отображается на экране.<br /><li> <b>\d\d\:\d\d:\d\d: [][][]\d\d\d\d: string</b> - тоже, что и второй случай, но с комментарием из третьего случая.</ll><br />После этого пришло время реализовать программы, которые писали бы в файл ~/log/events. Первой такой программой стала <i>aktimelog</i>, которая пишет события о текущем времени каждые 25 минут. Еще сделал: плагин для irssi, чтобы видеть публичные сообщения, приватные или и то и то, мониторить переключение раскладки клавиатуры, переключение рабочих столов, уведомления о почте, уведомления шела.<ad></ad> Так же стоит сказать, что переключение рабочих столов происходит по шоткатам. Например, если вы нажимаете MOD-E, то в дополнение к переключению, ion3 проверяет а запущен ли emacs, и если не запущен и вы подтвердите запуск, то запускает его. Я обычно знаю, куда хочу переключиться, поэтому не трачу время на бег по списку программ или тыкание на тулбар (как это делают виндузятники и прочие линуксойды). Итого, MOD-e для emacs, MOD-p -- revelation, MOD-c -- eclipse, MOD-b -- browser, MOD-1 -- первый терминал, MOD-2 -- второй терминал... и тд. Вот так устроен мой десктоп. А ваш как? :)<br /><br /><a href="http://toril.ru/soft/akdesk.tar.gz">Исходники</a>.Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com1tag:blogger.com,1999:blog-6827363280592532957.post-37879944554082567922007-02-09T23:08:00.001+02:002009-02-22T16:15:59.219+02:00Synce & Linux & WM5 & PasswordКогда я разрабатывал для WM5 под linux'ом мне показалось, что копировать файлы для тестирования на КПК весьма напряжно. Файлы копировались на КПК либо через MMC карточку, либо с помощью монтирования КПК как USB флешки. Оба способа совершенно не удобны, когда эти действия приходится делать каждые 5 минут. В добавок, исполняемый файл надо было запускать, чтобы увидеть как он работает. Я запускал файлы руками. <ad2></ad2>Вобщем-то нет особого смысла говорить, как меня это раздражало после того как я в свое время поразрабатывал под виндой, где все эти действия выполнялись одним батничком. Тогда когда я попробовал найти что-то типа того я наткнулся на проект <a href="http://www.synce.org">synce</a>. Сначало мне показалось, что надо поставить драйвер <a href="http://www.synce.org/index.php/Connecting_your_Windows_Mobile_2005_device_via_USB_(usb-rndis)">usb-rndis</a>. Я попытался, но оно обломалось на этапе компиляции. После небольшого изучения сайта synce я все-таки обнаружил существование новой версии драйвера <a href="http://www.synce.org/index.php/Connecting_your_Windows_Mobile_2005_device_via_USB_%28usb-rndis-lite%29">"usb-rndis-lite"</a>. На этот раз получилось без проблем. После установки драйвера появилось новое сетевое устройство: rndis0. Затем надо было поставить synce утилиты и библиотеки. Это была самая жостка часть. Первым делом я попробовал следовать инструкциям с <a href="http://www.synce.org/index.php/Building_SynCE_with_Windows_Mobile_2005_support_from_Subversion">вики</a>. Но odccm вывавал мне ошибки о d-ubs, hal и т.д.. Ошибки были откровенно тупыми, т.е. по ним нельзя никак было сказать о причине... ну это было что-то типа "d-bus error" или типа того. Тогда я попробовал vdccm.. и мне показалось, что уже лучше. Появилось что-то первое и хорошее - программа запустилась без ошибок :). В остальном все было тихо и грустно. Я начал искать в гугле слово 'vdccm' и через какое-то время нашел, что некто пользовался утилитой triggerconnection, чтобы уведомить ActiveSync. Но в моих руках triggerconnection не производила никакого эффекта ни на vdccm, ни на ActiveSync. Я прошелся по исходникам triggerconnection, было походе, что оно (утилито) отсылает пакет на порт 5679 нашего PPC. Тогда я посканил КПК с помощью nmap. Но nmap сказал мне, что портов открытых немає. У меня не было никаких идей почему порт 5679 закрыт в том время, как сам ActiveSync запущен. Я устал и заколебался. Увы, я потратил кучу времени пытаясь понять почему порт 5679 закрыт, пока в конце-концов, не предположил, что порт может оставаться открытым только несколько секунд после того как мы воткнули КПК в кроватку. И действительно, vdcomm обнаружил КПК, когда я запустил tirggerconnection сразу после того, как воткнул КПК в крэдл. В этот раз стало ясно, что одна проблема закрывала собой другую. Теперь, vdccm мог обнаруживать КПК, но он не мог держать соединение с КПК больше нескольких секунд. И снова я стал гуглить. Где-то кто-то написал, что vdccm не работает с устройствами защищенными паролями. "@!#%@#%*#$!!!" воскликнул я. Я не хотел держать КПК не защищенным или снимать пароль каждый раз как я вставляю КПК в крэдл. Короче я сделал <a href="http://toril.ru/pda/vdccm-password.patch.gz">патч</a> для vdccm, сразу как только отреверсинженирил протокол авторизации и разобрался в коде synce. И тогда наше время пришло, пропатченный vdccm разарботал как надо! Вии! Итак вкратце, что я сделал:<br />1. Поставил usb-rndis-lite.<br />2. Поставил библиотеки: librapi2, libsynce.<br />3. Пропатчил vdccm.<br />4. Установил ifplugd. Он запускает ifup/ifdown для rndis0 когда это нужно.<br />5. Добавил следующее в /etc/network/interfaces:<pre><br />iface rndis0 inet static<br /> address 169.254.2.2<br /> netmask 255.255.255.0<br /> post-up /usr/local/bin/triggerconnection-delayed local-pda</pre><br />6. Добавил строку '169.254.2.1 local-pda' в /etc/hosts.<br />7. Написал /usr/local/bin/triggerconnection-delayed:<pre><br />#!/bin/sh<br /><br />sleep 2<br />exec /usr/local/bin/triggerconnection $@</pre><br />8. Следующее я добавил в ~/.xsession:<br /><pre>vdccm -d 3 -f -t -p `cat ~/.pda-pwd` 1>>~/logs/vdccm 2>>~/logs/vdccm &</pre><ad></ad><br />9. Записал секретный пароль в ~/.pda-pwd file (chmod 0600).<br /><br />Теперь могу наслаждаться использованием утилит: pls, pstatus... ставить кабы и тд.<br /><br />Любые комменты приветствуются.<br /><br />P.S. Патч собственно не совсем полный. Я написал его очень прямолинейно. Он не поддерживает ожидание ввода пароля откуда-то, вместо этого вы должны указать пароль через ключ -p. К сожалению, у меня нет времени это реализовывать.Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-11327610086967754192006-10-19T21:27:00.001+03:002009-02-22T16:23:38.864+02:00Устали ждать обновление Debian пакета?Оказывается в debian'е пакеты можно не только собирать из исходников, а еще эти исходники можно обновлять до upstream версии с сайта автора, а потом собирать deb пакет.<b><br /><br /><pre>akshaal@akshaal:/tmp% apt-get source libtorrent9</b><br />Чтение списков пакетов... Готово<br />Построение дерева зависимостей... Готово<br />Нужно загрузить 472kB архивов с исходными текстами.<br />Получено:1 <a href="http://debian.org.ua/">http://debian.org.ua</a> unstable/main libtorrent 0.10.2-1 (dsc) [634B]<br />Получено:2 <a href="http://debian.org.ua/">http://debian.org.ua</a> unstable/main libtorrent 0.10.2-1 (tar) [453kB]<br />Получено:3 <a href="http://debian.org.ua/">http://debian.org.ua</a> unstable/main libtorrent 0.10.2-1 (diff) [18,2kB]<br />Получено 472kB за 3s (143kB/c) <br />gpg: Подпись создана Чтв 21 Сен 2006 07:41:55 EEST ключом DSA с ID 1880283C<br />gpg: Не могу проверить подпись: открытый ключ не найден<br />dpkg-source: extracting libtorrent in libtorrent-0.10.2<br />dpkg-source: unpacking libtorrent_0.10.2.orig.tar.gz<br />dpkg-source: applying ./libtorrent_0.10.2-1.diff.gz<br /><br /><b>akshaal@akshaal:/tmp% cd libtorrent-0.10.2</b><br /><br /><b>akshaal@akshaal:/tmp/libtorrent-0.10.2% uscan</b><br />libtorrent: Newer version (0.10.3) available on remote site:<br /> <a href="http://libtorrent.rakshasa.no/downloads/libtorrent-0.10.3.tar.gz">http://libtorrent.rakshasa.no/downl<wbr>oads/libtorrent-0.10.3.tar.gz</a><br /> (local version is 0.10.2)<br />libtorrent: Successfully downloaded updated package libtorrent-0.10.3.tar.gz<br /> and symlinked libtorrent_0.10.3.orig.tar.gz to it<br /><br /><b>akshaal@akshaal:/tmp/libtorrent-0.10.2% uupdate ../libtorrent-0.10.3.tar.gz</b><br />New Release will be 0.10.3-1.<br />-- Untarring the new sourcecode archive ../libtorrent-0.10.3.tar.gz<br />Success! The diffs from version 0.10.2-1 worked fine.<br />Remember: Your current directory is the OLD sourcearchive!<br />Do a "cd ../libtorrent-0.10.3" to see the new package<br /><br /><b>akshaal@akshaal:/tmp/libtorrent-0.10.2% cd ../libtorrent-0.10.3/</b><br /><br /><b>akshaal@akshaal:/tmp/libtorrent-0.10.3% dpkg-buildpackage -rfakeroot -us -uc</b><br /></pre><ad></ad>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-63740601384141240512006-08-04T10:15:00.001+03:002009-02-22T17:04:22.065+02:00Патч для spcacatspcaview умеет подстраивать яркость изображения захватываемого камерой автоматически. А вот spcacat - необходимая для захвата изображения без его просмотра (в batch режиме) почему-то этого не умеет (хотя автор тот же самый). Сделал патчик, который это исправляет (ключ -b). Также добавил ключик -M <y> который указывает, что надо пропустить y кадров, прежде чем "захватить" -N <x> кадров. Это нужно, чтобы дать время на подстройку яркости - она подстраевается либо на основе пропущенного кадра, либо на основе захваченного.<br /><br />Из-за абсолютно дибильного кода (серьезно, я хуже open source'ного кода не видел никогда) на написание патча ушло 1.5 часа, хотя работы там реально минут на 20-30.<br /><br />Собственно <a href="http://toril.ru/soft/spcaview-20051212-spcacat-autobright.patch.gz">патч</a>.<ad2></ad2>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-73575927743634774312006-06-08T15:42:00.002+03:002009-02-22T17:02:42.689+02:00Labtec Webcam Pro. Driver bugfix. Пример фиксинга драйвера.Купил я тут вебкамеру. Выбирал такую, чтобы под линухом работала, была дешевой и качество имела получше. В выборе помогла <a href="http://mxhaard.free.fr/spca5xx.html">вот эта страничка</a>, на которой представлен перечень вебкамер поддерживаемых драйвером spca5xx с указанием качества картинки. Купил. Принес домой. Покдлючил. Скачал драйвера. Откомпилировал. Запустил xawtv, ужаснулся изображению. Повел камеру всторону и заметил, что компьютер "замер" и ни на что больше не реагирует. Оказалось, линух вис при резкой смене освещения.<br /><ad2></ad2><br />Поискал в интернете - может кто уже сталкивался? Множество пользователей вебкамер с драйвером spca5xx сталкивались с этой проблемой. Кто-то советует не дергать камеру. Кто-то винист усб мост, хост или еще что-то. Автор драйвера вообще <a href="http://lists.alioth.debian.org/pipermail/pkg-spca5xx-devel/2006-March/000118.html">заявил</a>, что драйвер написал для работы на мощьных компьютерах и собственно все у нас ok. Ближе всех к истине оказался <a href="http://lists-archives.org/spca50x-devs/00590-spca-triggering-kernel-bug-kernel-softirq-c-266.html">вот этот пост.</a> Но предложенное им решение (править код ядра линуха) это скорее лечение симптомов, а не устранение причины.<br />В чем суть проблемы. Есть у драйвера spca5xx такслет - это такая задача, которая шедулится из обработчика прерывания на этап окончания работы прерывания, тоесть прерывание побыстрому отработало, и запускается тасклет который может что-то делать продолжительное время (при этом другие прерывания не задисаблены). У каждого тасклета есть флаг состояния TASKLET_STATE_SCHED - если этот флаг включен, то считается, что тасклет еще не выполнялся, а только планируется к выполнению. Проблема возникла в том коде ядра, который активирует выполнение зашедуленного тасклета. Перед выполнением, ядро проверяет состояние этого флага, и если флаг включен, то сбрасывает его и выполняет код задачи. А вот если вдруг этот флаг выключен, но почему-то этот тасклет в очереди, то ядро выполняет функцию BUG() - тоесть распечатывает содержимое стека и вешается. Собственно, автор <a href="http://lists-archives.org/spca50x-devs/00590-spca-triggering-kernel-bug-kernel-softirq-c-266.html">того</a> поста так и предложил сделать - убрать вызов ф-ии BUG(). Если задуматься, почему к моменту выполнения тасклет оказывает без флага TASKLET_STATE_SCHED, можно предположить:<br />1. Бага в ядре - маловероятно.<br />2. Кто-то помимо ядра этот флаг сбрасывает. Проверка показала, что в драйверах spca5xx строка TASKLET_STATE_SCHED вообще отсутствует.<br />3. Память под тасклет выделяется один раз. Во время работы тасклета возникает прерывание и оно реинциализирует структуру тасклета (решедулит тасклет). После прерывания происходит возврат к тасклету, он оканчивает работу и сбрасывает флаг. А так как тасклет зашедулен в очереди, то к моменту его выполнения флаг оказывается сброшенным. Проверка показала, что это не так. Да и флаг сбрасывается до работы такслета, а не после.<br />4. Надо смотреть код.<br /><br />В драйверах spca5xx есть всего одно место где шедулится тасклет. И сразу перед вызовом функции tasklet_schedule стоит функция tasklet_init. Все это обернуто циклом по пакетами полученным от usb драйвера и условием при котором шедулится тасклет: если найден конец фрейма (оноже начало следующего). Получается, что если обнаружен фрейм, то структура тасклета инициализируется и шедулится. А если обнаружено два фрейма? Вот она и бага. Если обнаружено два фрейма, то в ядре в очереди тасклетов окажется две записи которые ссылаются на один и тот же участок памяти.<ad></ad><br />Как пофиксить:<br />1. Поставить проверку перед инитом. Если уже зашедулено, то игнорируем и не шедулим больше. Минусы - фрейм теряется. Плюсы - просто.<br />2. Выделять память под тасклет динамически, в тасклет параметром передавать указатель на структуру в которой указатель на структуру тасклета и фрейм для декодирования. После декодирования память такслета очищать. Минусы - потеря производительности, муторно вообще. Плюсы - фреймы не теряются, правильное решение.<br />3. Замутить какую-нибудь очередь или пулл.. лениво.<br />Вобщем выбрал я первый вариант. И так сойдет %). Написал <a href="http://lists.alioth.debian.org/pipermail/pkg-spca5xx-devel/2006-July/000196.html">письмо</a> в рассылку с <a href="http://toril.ru/soft/spca5xx-20060501-tasklet_bugfix.patch.gz">патчем</a> и обьяснениями на ломоном английском. Кому надо сам доделает нормально (open source модель такая вот).<br /><br />А люблю я все-таки причины ошибок искать. Докапываться до сути... Такой процесс интересный. Расследование.Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-21111139143823579762006-04-16T12:17:00.002+03:002009-02-22T17:00:46.185+02:00apt-get install emacs-snapshotПоставил emacs-snapshot (emacs 22 из cvs). Впечатления.<br /><ad2></ad2><br />Первое что заметил сразу:<br />* Copy'n'past между emacs'ом и прочими программами заработал на все 100%.<br />* Новый emacs без правки конфигов пустился в терминальном окне (в 21.4 у меня русские буквы не вводились, а разбираться было лень).<br />* ibuffer-and-update почему-то стало открывать буфер со списком буферов в отдельном окошке, да еще и не делая его активным. Проблема быстро решилась собственной ф-ией my-ibuffer-and-update, так что проблема не критичная. Теперь в ibuffer можно настраивать группы буферов, например для разных проектов, для gnus'а и тд. Настроил пока только gnus (для gnus'овских буферов), custom (для буферов с настройками), fundamental (для прочего<br />хлама).<br /><br />Благодрая changelog'у отметил для себя следующие приятные вещи:<br />* Если редактируемая строка шириной ровно в ширину экрана то дополнительный перевод строки больше не ставится, а если курсор нужно поместить за последний символ такой строки, то он появляется прям на правом 'поле для заметок'. Мне понравилось.<br />* longlines-mode. Так называемый soft перенос слов в длинных строках. Это когда автоматически происходит виртуальный перенос слов на новую строку, при этом при сохранении в файл или копировании в буфер обмена или другой буфер строка не будет содержать переносов строк. Повесил longlines-mode на f3.<br /><br />Но самое интересно - ljupdate перестал логинится к серверу lievjournal! Как я с этим (извините меня) натрахался. Часа два убил. Проверил в буфере scratch соответствие между работой функций lj-md5 на одинаковый исходные строки считает одинаковый md5. С помощью ngrep и tcpdump ПОБАЙТНО сверил процесс авторизации ljupdate запущенной в старом emacs и новом, даже на параметры TCP соединений смотрел - но все совпадало, кроме challenge и response. Вместо получения challenge с сервера пробивал константное значение, но ljupdate как и в старом так и в новом emacs'е считал одинаковый response! Что еще можно подумать, если протокол общения верный и совпадает побайтно, кроме значений auth_challenge и auth_response, а auth_response вычисляется соответственно auth_challenge? Все расставила на места документация по функции md5.... <a href="http://community.livejournal.com/ljupdate/30052.html">Пояснение проблемы</a> на ломаном английском и патч кинул в ljupdate.<ad2></ad2>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0