четверг, 15 октября 2009 г.

Программа «Я Труп» v1.0!)

Однажды, холодными зимними буднями, меня попросили создать программу.. и не то чтобы просили, просто умоляли. Браться за работу я не очень то и хотел, но сжалился перед человеком, тем более что просили сделать не безвозмездно. Я был четвёртым программистом который за неё взялся, как я в последствии об этом узнал.
Работёнка предстояла сложная и для меня не привычная - надо было написать программу которая моделирует поведение устройства, конкретно устройства оперативного регулирования напряжения. Данное устройство описывалось в кандидатской работе заказчика, так что мне пришлось ещё в неё вникать. Там почти голая математика, работа с комплексными числами, многомерными матрицами, и при этом огромные по объёму расчёты которые программа должна была вычислять.
Создавалась сия програмка очень медленно, мешала учёба и основная работа в которой я работал...
В один прекрасный солнечный денёк, меня сильно обругал заказчик, и пригрозил мне сделать "ахтунг" если я не потороплюсь)) Тогда и родилось такое замечательное название к программе:) Пришлось делать..
Через два года, и с большими перерывами, работа над программой всё-таки была завершена.
О программе
Программа была написана на языке Си и Си++. Внешний вид показан на следующих рисунках:

 
Вкратце, принцип действия таков: При помощи редактора конфигурации вводятся исходные параметры системы. Затем после нажатия кнопки "Начать вычисления" происходят различные расчёты и моделирование (используя механизм псевдослучайных чисел). Результат работы сохраняется в виде отчёта в формате pdf, где содержаться различные результаты промежуточных вычислений, и графики.
Промежуточные вычисления в удобочитаемом формате, а также графики и конвертирование в pdf производятся при помощи утилит latex, gnuplot, и dvipdf, поэтому программа требует наличие в системе установленных пакетов gnuplot, texlive, и texlive-langcyrillic.
Лицензия: GNU GPL v3. Программа написана с использованием библиотеки Qt4.

Скачать (с rapidshare.de):
Скачать (с альтернативного источника):Пример генерируемого файла отчёта можно посмотреть здесь

вторник, 10 марта 2009 г.

Решение проблемы с модулем CGI::Ajax при передаче символов "+" и "%"

Наткнулся на один неприятный баг в данном модуле для Perl. Например есть вот такой код:
#!/usr/bin/perl -w
use strict;
use CGI; # or any other CGI:: form handler/decoder
use CGI::Ajax;

my $cgi = new CGI;
my $pjx = new CGI::Ajax( 'exported_func' => \&perl_func );
print $pjx->build_html( $cgi, \&Show_HTML);

sub perl_func {
 return( join("<br>",@_) );
}

sub Show_HTML {
 my $html = <<EOHTML;
 <HTML>
 <BODY>
  Enter something: 
  <input type="text" id="val">
  <input type="button" onclick='exported_func(["val"],["resultdiv"])' value="Do!"/>
  <br>
  <div id="resultdiv"></div>
 </BODY>
 </HTML>
EOHTML
 return $html;
}


Так вот, если запустить этот Perl-скрипт из браузера, ввести в поле ввода "плохую" строку вроде "text % text + text", нажать кнопку "Do!" мы не увидим знака "+" в "resultdiv".

Есть решение, в нашем примере, после строки:
 my $pjx = new CGI::Ajax( 'exported_func' => \&perl_func );

нужно добавить:
 $pjx->js_encode_function('encodeURIComponent');

В таком случае, при вводе в поле "+", мы получим "+", но если добавить/заменить "+" на "%" то ничего не получим. Кроме того, браузер выдаст различные ошибки JavaScript.

Методом копания в исходниках CGI::Ajax, была обнаружено что неполадки возникают при попытке повторного раскодирования запрошенной строки. Файл /usr/share/perl5/CGI/Ajax.pm, строка 942:

<...>
 pjxInitialized : function(){},
 pjxCompleted : function(){},
 readyState4 : function(){
  var rsp = $decodefn(this.r.responseText); /* the response from perl */
  var splitval = '__pjx__'; /* to split text */
  /* fix IE problems with undef values in an Array getting squashed*/
  rsp = rsp.replace(splitval+splitval+'g',splitval+" "+splitval);
  var data = rsp.split(splitval);

<...>

В данном куске кода строка:
  var rsp = $decodefn(this.r.responseText); /* the response from perl */
должна быть заменена на:
 var rsp = this.r.responseText; /* the response from perl */

А также в нашем примере, после строки:
 my $pjx = new CGI::Ajax( 'exported_func' => \&perl_func );

нужно добавить:
 $pjx->js_encode_function('encodeURIComponent');

И ошибка будет решена! :-)


воскресенье, 22 февраля 2009 г.

Решение проблемы неработоспособности Slax 6.х при его загрузке.

Slax имеет возможность сохранять настройки сделанные пользователем на диск. Для этого служит параметр загрузки "changes=". В таком случае, выяснилось, что при интенсивном использовании, может случится что система перестанет загружатся и станет неработоспособной. Здесь я приведу свой (возможно не самый удачный) вариант решения проблемы.

Исходные данные таковы:
Есть раздел с NTFS. Предполагается что на этот раздел должны сохранятся настройки slax. Настройки будут сохранятся в одном файле - slax.dat

Мой вариант решения проблемы это каждый раз при загрузке проверять slax.dat на ошибки и автоматически их исправлять при помощи утилиты fsck.ext2

Приступим:
1) Загружаемся в Slax, открываем консоль :)

2) Подготовим файл в котором будут хранится настройки:
# dd if=/dev/zero of=/mnt/sda1/slax.dat bs=1M count=512
# /sbin/mkfs.ext2 /mnt/sda1/slax.dat


где:
/mnt/sda1/slax.dat - место хранения файла (в моём случае он хранится на разделе NTFS)
count=512 - размер файла в мб.

3) Находим файл boot/initrd.gz на CD-ROM, копируем его в /root

4) Распаковываем
# gzip -d initrd.gz

5) Монтируем:
# mkdir fs
# mount -t ext2 initrd fs -o loop


6) Качаем пакет e2fsprogs и его зависимости. Я нашёл его в репозиториях Debian (packages.debian.org):
# wget http://ftp.de.debian.org/debian/pool/main/e/e2fsprogs/e2fsprogs_1.39+1.40-WIP-2006.11.14+dfsg-2etch1_i386.deb
# wget http://ftp.de.debian.org/debian/pool/main/e/e2fsprogs/e2fslibs_1.39+1.40-WIP-2006.11.14+dfsg-2etch1_i386.deb
# wget http://ftp.de.debian.org/debian/pool/main/e/e2fsprogs/libcomerr2_1.39+1.40-WIP-2006.11.14+dfsg-2etch1_i386.deb


Далее необходимо извлечь нужные нам файлы из .deb пакетов и положить их в initrd. Для этого нам потребуется утилита dpkg, которая существует в составе модуля "debian package tools" для Slax. Данный модуль можно скачать с сайта slax.org.

7) Собственно извлекаем:
# mkdir e2fsprogs
# dpkg --extract "e2fsprogs_1.39+1.40-WIP-2006.11.14+dfsg-2etch1_i386.deb" e2fsprogs
# cp e2fsprogs/sbin/fsck.ext2 fs/sbin
# cp e2fsprogs/sbin/e2fsck fs/sbin


# mkdir e2fslibs
# dpkg --extract "e2fslibs_1.39+1.40-WIP-2006.11.14+dfsg-2etch1_i386.deb" e2fslibs
# cp e2fslibs/lib/* fs/lib


# mkdir libcomerr2
# dpkg --extract "libcomerr2_1.39+1.40-WIP-2006.11.14+dfsg-2etch1_i386.deb" libcomerr2
# cp libcomerr2/lib/* fs/lib



8) Редактируем файл fs/linuxrc: до строки `mount_device "$CHANGESMNT" $MEMORY` прописываем:

if [ "$(basename "$CHANGESMNT" .dat)" != "$CHANGESMNT" ]; then
  /sbin/fsck.ext2 -y "$CHANGESMNT"
fi


9) Заключительные шаги: Отмонтируем наш initrd и сожмём обратно программой gzip
# umount fs
# gzip initrd


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

При дальнейшей загрузке Slax не забываем указывать параметр "changes=/slax.dat"

суббота, 31 мая 2008 г.

Запуск Linux прямо из Glofiish M700

Это возможно! Сегодня я в этом убедился. Для этого нам понадобится следующее:

1) Ядро Linux
2) Наличие в устройстве карточки MicroSD объёмом не менее 128мб
3) Haret - программа-загрузчик ядра запускающийся прямо из Windows CE
4) Текстовый файл с параметрами загрузки ядра
5) Образ OPIE или GPE

Приступим.

1) Скачаем образ ядра (здесь)
2) Скачаем haret
3) Скопируем всё это хозяйство в память коммуникатора (не на карточку а на встроенную память)
4) Создадим в той папке в которую скопировали, файл default.txt с таким содержанием:
set MTYPE 0x664
set KERNEL "zImage_x500"
set RAMADDR 0x30000000
set RAMSIZE 0x4000000
set CMDLINE "root=/dev/mmcblk0p2 rootdelay=5 panic=360"
bootlinux

5) Необходимо подключить microSD карту к компьютеру (через кардридер или напрямую через USB кабель+WM5Storage), при этом убедится что не один раздел не смонтировался автоматически.

6) Создадим разделы на карточке согласно такой схеме - минимум 50мб для раздела с ext3, всё оставшееся свободное пространство оставим для fat16. Для своей карты объемом 2ГБ я разбил диск на разделы по такой схеме:
+================================================+
| 1800мб - FAT16                 | 213мб - EXT3  |
+================================================+
для выполнения этого шага использовалась утилита cfdisk.

7) Необходимо записать на созданные разделы файловую систему:
$/sbin/mkfs.msdos /dev/sdc1 -n WINDOWS
$/sbin/mkfs.ext3 /dev/sdc2 -j -L LINUX

где:
/dev/sdc - имя устройства microSD карты
/dev/sdc1 - первый раздел с windows fat
/dev/sdc2 - второй раздел с linux ext3

8) Скачаем OPIE например отсюда

9) Скопируем всё содержимое скачаного архива на раздел с линуксом (/dev/sdc2 в моём случае)

10) Отмонтируем карточку с компьютера(если использовался кард-ридер), вставим обратно в зверька, убедимся что FAT раздел на карточке виден с КПК

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

11) Запускаем haret, нажимаем кнопку RUN, и... нервно ожидаем загрузки....

Приятного использования :)

Да, совсем забыл сказать, чтобы обратно перезагрузится в винду нажмите одновременно Soft-Reset и клавишу выключения (только не удерживая долго)



          
    
          












Полезные программы для OPIE, а также пакеты с локализацией можно скачать здесь

Полезные ссылки:
1) http://linux.cybernet.net.ru (битая?)
2) http://www.handhelds.org
3) http://ipkgfind.handhelds.org

вторник, 27 мая 2008 г.

Конвертирование APE/CUE в OGG Vorbis

Есть необходимость конвертировать файл формата Monkey's Audio (APE) в формат OGG Vorbis при этом целевой файл будет необходимо ещё "порезать" на треки. Для этого понадобятся утилиты mac, oggenc и mp3splt, а также собственно файл CUE со схемой разметки треков. Для упрощения использования сего действия был мною собственноручно написан bash-скрипт, я назвал его apecue2ogg:
#!/bin/sh
INPUT_APE=$1
INPUT_CUE=$2
OUT_DIR=$3
MAC="/usr/bin/mac"
OGGENC="/usr/bin/oggenc"
MP3SPLT="/usr/bin/mp3splt"
TMP="/tmp/$(basename "$INPUT_APE")"
progname=$(basename "$0")

help()
{
echo "Использование: $progname ФАЙЛ1.ape ФАЙЛ2.cue [КАТАЛОГ_ДЛЯ_ВЫВОДА]"
echo
}

if test $# -lt 2; then
help >&2
exit 1
fi

if ! [ -e $MAC ]; then
echo "Программа $(basename "$MAC") (Monkey's Audio) не установлена" >&2
echo "Попробуйте скачать её с сайта http://sourceforge.net/projects/mac-port/" >&2
echo >&2
exit 1
fi

if ! [ -e $OGGENC ]; then
echo "Программа $(basename "$OGGENC") не установлена" >&2
echo >&2
exit 1
fi

if ! [ -e $MP3SPLT ]; then
echo "Программа $(basename "$MP3SPLT") не установлена" >&2
echo "Попробуйте скачать её с сайта http://mp3splt.sf.net" >&2
echo >&2
exit 1
fi

if test "$OUT_DIR" == ""; then
OUT_DIR="."
fi

if ! [ -d "$OUT_DIR" ]; then
echo "Каталог $OUT_DIR не существует!" >&2
echo >&2
exit 1
fi

if (! $MAC "$INPUT_APE" "$TMP.wav" -d ); then
exit 1
fi

if (! $OGGENC -q 8 "$TMP.wav" -o "$TMP.ogg" ); then
exit 1
fi

rm "$TMP.wav"

if (! $MP3SPLT -c "$INPUT_CUE" "$TMP.ogg" -o "@n @a - @t" -d "$OUT_DIR" ); then
exit 1
fi

rm "$TMP.ogg"

Сохраним его например в каталоге /usr/bin. Используем например так:
$apecue2ogg 'Пилот - ЧБ.ape' 'Пилот - ЧБ.cue'

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

понедельник, 19 мая 2008 г.

Мой кот предпочитает чежское :)

Вообще-то он пьёт любое пиво, главное чтобы с него газы вышли, он их не любит :)


А потом нажравшись отправляется спать:


А это он после дня рожденья:


Вот такой у меня кот :)

Создаём программы для WinMobile на Linux'e

Если вы хотите писать/написать какую/ие-то программы для своего PDA удобно располагаясь при этом в любимой ОС(линуксе конечно), то для этого можно воспользоватся компилятором CeGCC. Вот как я устанавливал этот замечательный кросс-компилятор на свой Debian:

Сначала переходим в свой домашний каталог:
$cd ~

Часть 1:
----------------------------------
Качаем cegcc с сайта http://sourceforge.net/projects/cegcc. Я качал версию 4.3.0:
~$wget -c http://switch.dl.sourceforge.net/sourceforge/cegcc/cegcc-gcc430.tar.gz

Но имеется проблемка, у меня система amd64, а скомпилированную cegcc можно загрузить только версию для i386. Поэтому если вы не счастливый обладатель amd64 то можете не читать строки ниже, а смело переходите к части 2.
Устанавливаем ia32-libs:
$sudo apt-get install ia32-libs

Загружаем необходимый пакет libgmp3:
$wget http://ftp.de.debian.org/debian/pool/main/g/gmp/libgmp3c2_4.2.2+dfsg-3_i386.deb

Создаём каталог /usr/linux32:
$sudo mkdir /usr/linux32

Распаковываем туда наш deb-пакет:
sudo dpkg -x 'libgmp3c2_4.2.2+dfsg-3_i386.deb' /usr/linux32

Чтобы эту библиотеку система могла найти создадим файл /etc/ld.so.conf.d/linux32.conf с таким содержимым:
/usr/linux32/usr/lib
/usr/linux32/lib

и выполним ldconfig:
$sudo /sbin/ldconfig

Часть 2:
----------------------------------
Переходим в корневой каталог:
$cd /

Распаковываем архив с CeGCC:
$sudo tar --gzip -xvf ~/cegcc-gcc430.tar.gz

В результате, в /opt должны распаковаться 2 папки - cegcc и mingw32ce, создадим для них отдельную папку и переместим туда:
$sudo mkdir /opt/wince
$cd /opt/wince
$sudo mv ../cegcc .
$sudo mv ../mingw32ce .

Теперь, для удобства вызова можно создать ссылки на компилятор cegcc в /usr/bin:
$sudo ln -s /opt/wince/mingw32ce/bin/arm-mingw32ce-gcc /usr/bin

Проверяем работоспособность компилятора. Для этого создадим файл test.c с таким содержанием:
#include
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
MessageBoxW(0, L"HELLO WORLD!", L"HELLO!", 0);
}

Попытаемся скомпилировать:
$ arm-mingw32ce-gcc -o test.exe test.c

Должен получится целевой файл test.exe. При использовании на своём девайсе не забудьте в папку с программой положить /opt/wince/cegcc/arm-cegcc/lib/cegcc.dll
Пользуемся!

Часть 3:
----------------------------------
Не так давно trolltech создала версию своей кросплатформенной библиотеки Qt для Windows CE платформы. В связи с таким событием появилось желание создавать qt-программы на линукс для целевой платформы Windows Mobile. Но есть проблема: в состав пакета программ cegcc не входит компилятор "arm-mingw32ce-g++". Основываясь на информации из списка рассылки http://www.mail-archive.com/cegcc-devel@lists.sourceforge.net/msg01155.html работа над компилятором g++ ещё не закончена. Так что придется пока подождать....