Thursday, October 22, 2009

Microsoft Visual Studio 2005 + qt 2009.4 integration

По горячим следам пишу пляски с бубном по установке йобаного qt-integration в microsoft visual studio 2005

В моём случае использовалось:
  • ArchLinux + VirtualBox 3.0.8 + WinXP в нём
  • Microsoft Visual Studio 2005
  • Qt 4.5.0 (2009.04)
  • Qt visual studio integration add-in 1.1.0
  • 4 часа времени (умножить на число неудачных попыток собрать с другими параметрами)
  • 2 кружки чая

    Вкратце: чтобы всё заработало с минимумом плясок в будущем, надо пересобрать qt компилятором от msvs. Здесь описывается success story этих свистоплясок


    Процедура манипуляций:
    0x0) поставить Arch, VirtualBox, WinXP
    0x1) туда влепить MSVS 2005 (я вырезал всё, кроме Visual C++) - примерно 1.1 Gb
    0x2) ставить qt-sdk-win-opensource-2009.04.exe
    0x3) она поставится ну, пусть в C:\Qt\2009.04. Делаем там же копию, допустим, в C:\Qt\2009.04vc
    0x4) достать бубен, стряхнуть пыль. Распечатать соответствующие man-тры
    0x5) открыть MS Visual Studio Command Prompt (из MSVS -> Tools), можно в принципе, просто запустить нужный батник vcvarsall.bat, который пропишет все переменные, перейти в созданную нами папку
    0x6) конфигуем сборку. Единственный вариант ключей к configure, который потом у меня удачно собрался, был этот:
    configure.exe -platform win32-msvc2005-no-sql-sqlite-no-qt3support-no-dbus -no-phonon -no-phonon-backend -no-webkit

    Даже несмотря на поставленный psql, варианты типа -plugin-sql-psql не срабатывали, так как не могли найтись нужные библиотечные файлы (естественно, в системе присутствовавшие). Поэтому я решил, что стоит сначала собрать всё, как есть, а потом, если что, доставить (ибо процедурка сборки довольно длительная)
    0x7) запускаем nmake и можно откинуться на спинку кресла идти курить бамбук - оно ещё долго не будет от нас ожидать каких-то действий.
    Сборка заняла на моей виртуальной машине (WinXP, ~1.5Gb ram) около 3 часов. Это самое противное, потому что, примерно столько же по времени занимали опыты с, как выяснилось, неудачными параметрами сборки.
    0x8) ставим qt-vs-addin-1.1.0, запускаем msvs 2005. Если всё хорошо - переход к пункту 13.
    0x9) студия сказала - иди ты, не буду никаких плагинов брать или что-то в этом духе. Никаких дополнительных меню не появилось. Расстроенное перелогиниваемся перезагружаемся.
    0xA) открываем студию снова, видим, что появилось новое меню Qt. Если в qt options показывается поставленная (собранная нами) версия qt - переход к пункту 13.
    0xB) громко матерясь, попробовать добавить версию qt самостоятельно. Если добавилась (надо указать правильный путь. В нашем случае это c:\Qt\2009.04vc) - переход к пункту 13.
    0xC) прописать в переменные среды (My Computer -> Advanced -> Environment Variables. лучше в глобальные) QTDIR=c:\Qt\2009.04vc. Перелогиниться перегрузиться.
    0xD) если теперь правильная версия не подцепилась - подключить вручную.
    0xE) открыть какой-нибудь Qt project (из соответствующего пункта меню Qt -> open .pro), убедиться в работоспособности...
    0xF) ...
    0x10) PROFIT!

    В итоге из Microsoft Visual Studio - About Microsoft Visual Studio примерно следующая информация:

    Microsoft Visual Studio 2005
    Version 8.0.50727.42 (RTM.050727-4200)
    Microsoft .NET Framework
    Version 2.0.50727 SP1

    Installed Edition: Professional

    Microsoft Visual C++ 2005 77626-009-0000007-41572
    Microsoft Visual C++ 2005

    Qt4 Add-in 1.1.0
    For more information about the Qt 4 Add-in, see
    http://qt.nokia.com
    Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies)


    Инджой.
  • Friday, September 25, 2009

    Отличный пример для объяснения импликации

    Существует логическая операция, называемая импликацией [1] (обозначается стрелочкой)
    Обычно она объясняется как "посылка -> следствие"
    Стандартно у преподавателя возникает небольшая заминка с тем, какой пример выбрать для иллюстрации таблицы итинности данной операции. Наиболее удачное из того, что я слышал: x={"Студент сдаст хорошо сессию"} y={"Папа купит ему машину"}. Однако, это не совсем удачная иллюстрация, потому что как-то не очень близка к действительности. Напомню, что x->y == 0 только в том случае, если студент действительно хорошо сдал сессию, а папа машину ему не купил (наоборот, если студент сдал плохо, а папа купил ему машину, то папу лжецом уж точно не назовёшь).

    Внезапно однажды на занятии у меня родилась шикарная идея, какие два события лучше подходят для описания: x={"Девушка забеременела"}, y={"Её мальчик на ней женился"}. Тогда x->y = {"Если девушка забеременела, мальчик на ней женился"}. Действительно, если девушка не забеременела, а мальчик не женился, никакого обмана не произошло, и x->y истинно, если девушка не забеременела, а мальчик, тем не менее, женился, то он, бесспорно, благородный дон и высказывание x->y всё равно истинно (никто никого не обманул). Если же девушка забеременела и парень женился, то всё опять же истинно (мужик сказал - мужик сделал!). Однако, если же девушка забеременела, а парень на ней не женился, он, конечно же, козёл. И в этом месте даже самые отстающие школьники понимают, что информатика гораздо ближе к жизни и радостно поддакивают своими милыми мордашками "козёл, конечно!".

    ---

    [1] http://ru.wikipedia.org/wiki/Импликация

    Saturday, September 12, 2009

    Zenwalk 6.2: epic fail.



    Всё, пришло время менять дистрибутив.
    Я два с половиной года сижу на Zenwalk, недавно они выпустили следующую версию - 6.2. На моём ноутбуке сидит 6.0, я практически не пользуюсь иксовым софтом, поставляемым от дистрибутива (zenpanel, xfce, totem, geany). До недавнего времени всё работало, но я прозевал смену версии и не успел поставить какие-то пакеты из репозитория (эта политика закрытия старых репозиторий в основанных на версиях дистрибутивах меня безумно раздражает). Я понимаю, что если я опять скачаю инсталяционный диск, запишу его на болванку и поставлю систему "с нуля", то всё будет работать, а у меня в uname будет написано 6.2 вместо 6.0, но что-то внутри против такого решения.
    Соответственно, после выполнения ритуальных netpkg update, слетели иксы, запустить которые быстро не удалось (как уже потом стало ясно, вопрос пакетного менеджера "upgrade whole system?" не подразумевает установку дополнительных пакетов, необходимых для нормального функционирования системы). В общем, третий раз подряд апдейт провалился. Кажется, нормально проапгрейдить систему у меня получилось только один раз - с Zenwal 4.0 до Zenwalk 4.2. Сурово поматерясь и потратя полчаса на поиски болванки в общаге, в итоге был закачан archlinux и после двух-трёх часов конфигурации, я снова влюбился :) Да, почти голая система после установки, зато нет ничего лишнего и всё предельно просто, без излишних упрощений. В общем, философия Arch (The Arch Way) мне кажется более сохранённой, чем философия Zenwalk ("unix way - one task, one program." - Сильно ломается в последнее время, в связи с уходом одно с небольшим скандалом из постоянных контрибьюторов товарища gapan и в след за ним уходом ещё некоторого количества достаточно влиятельных людей).
    Короче, я доволен Archlinux, пока не всё настроил, но высокая степень прозрачности системы очевидна. Любимый оконный менеджер ion3 встал легко и непринуждённо, хотя с настройкой клавы и пришлось немножко повозиться.
    А самое главное! Тут нет погони за версиями. Просто rolling releases, которые регулярно отображаются в виде "а вот исошник тут - дамп основных пакетов из репозитория. Бери, коль инета нет".
    Так что, два с половиной года с Zenwalk было весело, но пора уже и честь знать. Судя по всему, с Archlinux повеселее будет :)

    Wednesday, September 9, 2009

    MIDI keyboard under linux (как подружить usb midi keyboard, fluidsynth и jack)

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

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

    Общая схема подключения оказалась такой:
    0. втыкаем клаву
    1. запускаем демон jackd с нужными параметрами (см. ниже)
    2. стартуем fluidsynth указывая, что надо использовать jack и определённый soundfont (без него ничего не получится)
    3. связываем средствами ALSA ввод с миди с выходом fluidsynth
    4. связываем jack-ом выход fluidsynth с системным выходом.
    5. ?????????
    6. PROFIT

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

    Если говорить в терминах команд, то получаем следующее:
    Запускаем джек:
    jackd -dalsa -dhw:0,0 -r44100 -p512 -n4 &

    Теперь запустим синтезатор, скормив ему звуковой шрифт:
    fluidsynth -ajack /home/cra/Unison.SF2

    Кстати, откроется шелл, в котором можно регулировать gain командой gain X, где X - число от 1 до 5. Остальные команды, в общем-то, не столь важны.

    Далее, смотрим, какие порты у нас открыты по выводу команды
    aconnect -o

    И подключаем вывод клавиатуры к входу синтезатора: что-то в духе
    aconnect 128:0 20:0

    Ну а теперь надо подцепить выход синтезатора джэком к системному выводу звука:
    jack_connect fluidsynth:left system:playback_1
    jack_connect fluidsynth:right system:playback_2

    Всё, из колонок должны доноситься звуки.

    Wednesday, April 29, 2009

    screen splitting

    Есть очень удобная тулза, gnu screen, которую я использую в связке сервер - скрин - приложения.
    По сути, это тот же концепт, что и виртуальные рабочие столы, только для консоли. Основное преимущество в том, что при разрыве коннекта мы можем подключиться потом к серверу и вернутся в тот же экран, где всё как раз на том же месте и осталось.
    Собственно, это делается командой screen -dAR - в такой комбинации параметров, если скрина не было, создаётся новый, а если был, то он дополнительно ресайзится в окно, в котором запущен.

    ctrl-A x - lock screen
    ctrl-A h - hardcopy current view. Очень удобная команда, делает ascii-скриншот того, что видно
    ctrl-A S - split screen - разбивает область со скринами на две, так, что можно в одной открыть tail -f какого-то лога, а в другой собственно проводить манипуляции с серваком.
    ctrl-A :resize +-N - изменить размер текущего фрейма. Такой консольный ion3 получается :)

    Friday, March 27, 2009

    bash wrapper scripting - parameters

    краткий ответ: $@

    сам пост:
    Допустим, есть какая-то уже налаженная схема запуска чего-либо, где всё настроено и работает, но хочется чуть-чуть изменить процесс, причём где-то в середине и без особого гемороя. Легко и просто - заменяем исполняемую команду на скриптег, который делает наши действия и потом вызывает саму настоящую программу. Бида, бида нас ждёт, если сделать всё в лоб!
    [cra@server 10:37 ~]
    $ cat /usr/bin/svnserve
    #!/bin/bash

    umask 002
    /usr/bin/svnserve_real

    даст, например, неудачный резальтат

    [cra@zenwalk 10:38:53 /tmp]
    $ svn checkout svn+ssh://servak_inet/repos/gui/trunk
    You must specify exactly one of -d, -i, -t or -X.
    Type '/usr/bin/svnserve_real --help' for usage.
    svn: Connection closed unexpectedly


    Решение тривиально, надо чуть-чуть изменить исходный скрипт
    [cra@server 10:45 ~]
    $ cat /usr/bin/svnserve
    #!/bin/bash

    umask 002
    /usr/bin/svnserve_real $@


    Вот так, а я и не знал, однако :)

    Friday, March 6, 2009

    Dream Theater в Москве 10 июня!



    Кстати, скриншоты в линуксе делаются командой, указанной на скриншоте :) import -window root filename.png %)

    UPD: that was awesome, но за такие деньги я на них больше не пойду.

    Wednesday, March 4, 2009

    Digitizers & awk helps a lot

    Понадобилось перевести картинку в набор точек. Оказалось, существует целый набор подобных программ, назваются Дигитайзеры. Я использовал Engauge Digitzer: ( например, тут можно его скачать http://linux.softpedia.com/progDownload/Engauge-Digitizer-Download-1240.html )

    Использование этой штуки крайне интуитивно, просто расставляются точки, устанавливаются опорные точки, и вуаля - на выходе csv готово. Засунуть в код можно простым и грубым способом через awk:
    awk {print "points[" NR-1 "].set(" $1 "," $2 ");"} Armko.csv

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

    Friday, February 20, 2009

    Pidgin migration pretty simple

    Мигрировал со старого компа на новый и переносил настройки пиджина..
    scp -r bigbro:.purple .
    "Ё-моё, и всего-то!" - промелькнуло у меня в голове :)

    P.s: bigbro прописан в .ssh/config, конечно же ;)

    Tuesday, February 17, 2009

    7z backup script

    Скрипт для удобного бэкапирования

    #!/bin/bash

    ARCHNAME=server-shares
    DIRS="/home/shares/work /home/shares/iso"
    BACKUPDIR=/backups

    NOW=`date +%d-%b`
    /usr/bin/tar -cf - $DIRS | 7za a -si $BACKUPDIR/$ARCHNAME-$NOW.tar.7z


    Потом кинуть куда-нибудь типа /etc/cron.monthly и радоваться :)

    Thursday, February 12, 2009

    Теория относительности на пальцах

    45 минут как школьник - нереально длинный промежуток времени
    45 минут как учитель - "Блин!! ВСЕГО 45???"

    Tuesday, February 10, 2009

    nice time

    $ date -d@1234567890
    Sat Feb 14 02:31:30 MSK 2009

    В это время мы с другом играли в battle for wesnoth :) Славная была битва

    nut apc smartups sc1000 com-usb и Zenwalk 5.2

    Фух, задолбался его настраивать. По горячим следам пишу этот пост. Воткнул упсу, читал, гуглил.. И так далее. Краткая выжимка:

    Втыкаем упсу, делаем lsusb, читаем вывод:
    $ lsusb
    Bus 007 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 006 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 004 Device 002: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
    Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub


    Если повезёт, то /dev/ttyUSB0 (или не 0, смотря что уже втыкали) появится в вашей системе. Мне повезло меньше, зато поплясал с бубном. Во-первых, эта сука почему-то хоть и писала в dmesg про /dev/ttyUSB0 цеплялась на /dev/tts/USB0, чем обильно попарила мне мозг старым добрым "Not a typewriter", ныне "inapropriate ioctl for device". Когда же успешный порт был найден (почти чудом, кстати), мой конфиг ups.conf выглядел так:
    [apc]
    driver = apcsmart
    port = /dev/tts/USB0
    cable = "940-0272"
    desc = "APC Back-UPS 1000SC"


    940-0272 это кабель com-usb, который я и подключал к девайсу.

    upsd больше не поддерживает Access Control List и вместо этого надо правильно указывать директиву LISTEN в файле upsd.conf:
    LISTEN 127.0.0.1 3493


    Другие параметры можно не трогать, разве что я MAXCONN выставил в 24 (просто убрав 10 из числа 1024)
    важная строка в upsmon.conf:
    MONITOR apc@localhost 1 monuser password master


    Кстати, убедитесь, что в /usr/local/ups/etc/* у вас нет world readable документов, на всякий случай. И world writable тем более, ибо SHUTDOWNCMD в upsmon.conf может кто-то заменить на что-то неприятное и тогда всё, плакал сервак.

    Далее, мне понадобилось накатать примерно такой /etc/rc.d/rc.nut (я почему-то не нашёл ничего подобного в тех краях, куда встал nut).

    #!/bin/sh
    # Start/stop/restart the ups nut daemon:

    # made by cra on 10 feb 2009

    nut_start() {
    # start driver
    /usr/local/ups/bin/drvctl start

    # now start daemon
    /usr/local/sbin/upsd
    }

    nut_stop() {
    kill `cat /var/state/ups/upsd.pid`
    /usr/local/ups/bin/drvctl stop
    }

    nut_restart() {
    if [ -r /var/state/ups/upsd.pid ]; then
    echo "Stopping daemon and driver, this might take a while"
    nut_stop
    else
    echo "There does not appear to be a parent instance of upsd running."
    exit 1
    fi
    sleep 2
    nut_start
    }

    case "$1" in
    'start')
    nut_start
    ;;
    'stop')
    nut_stop
    ;;
    'restart')
    nut_restart
    ;;
    *)
    echo "usage $0 start|stop|restart"
    esac

    Всё, можно делать service start ups и смотреть вывод /usr/local/ups/bin/upsc apc@localhost

    После этого можно настроить ремотную тулзу для мониторинга состояния упски, или можно настроить нагиос. Проверяем работоспособность плагина: $ /usr/local/nagios/libexec/check_ups -H localhost -u apc
    UPS OK - Status=Online Utility=218.0V Batt=100.0% Load=11.7% |voltage=218000mV;;;0 battery=100%;;;0;100 load=11%;;;0;100


    Чтобы это было в нагиосе, надо добавить в /usr/local/nagios/etc/objects/commands.cfg следующий кусочек:
    define command{
    command_name check_ups
    command_line $USER1$/check_ups $ARG1$
    }


    в конфиге нагиоса на нужном сервере тогда будет что-то в духе check_ups!-H localhost -u apc -w 80 -c 10
    Либо, если использовать один ups, то можно все параметры прописать сразу в комманде (или хотя бы стандартный нагиосовский -H $HOSTNAMEADDRESS$) и в конфиге писать просто check_ups. Теперь, как сказал коллега "если придёт письмо о варнинге, бежим за ключом от серверной".

    UPD: Оппа.. Проверка показала, что это не работает - хотя локально /usr/local/nagios/libexec/check_ups -H localhost -u apc даёт варнинг, когда шнурок отключён, нагиос считает, что всё хорошо :( Это я неправильно настроил кусок нагиоса.

    Monday, February 9, 2009

    bash minitip

    Раньше, когда я переходил в какую-то директорию и мне надо было потом назад, я использовал cd $OLDPWD, но оказалось, что всё намного проще и можно использовать просто "cd -". Мелочь, а приятно