Hatred's Log Place

DON'T PANIC!

May 27, 2010 - 1 minute read -

OpenID

Всё, снова работает на сайте. Под формой ввода логина/пароля ссылка для входа при помощи OpenID

May 26, 2010 - 2 minute read - programming

Cmake, Qt4 и кросс-компиляция

Есть у меня проектик, он как тестовый полигон, хоть код и достаточно в большом количестве поддается только одной характеристике: исторически сложилось. Но на нем первом я опробовал кросс-компиляцию для Windows из Linux. Теперь его же перевел в обучающих целях на Cmake. Однако, все новое не должно отменять старых достижений, как следствие встал вопрос - а как теперь делать сборку для Windows?

С учетом того, что система сама по себе пока малознакома, решил понапрягать гугл (точнее: http://google.com/linux)

Почти сразу нашел две статьи мини-цикла:

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

Именно по вышеуказанной причине я решил продолжить изыскания. Поиском по готовым модулям Cmake нашел упоминание некой директивы CMAKE_TOOLCHAIN_FILE, которая, по внутреннему ощущению, должна была мне помочь.

Дальнейший поиск привел меня на вики самого Cmake: How to use MinGW to cross compile software for Windows, где было сказано про тот самый toolchain file. С минимальными изменениями поместил его в каталог cmake в корне дерева проекта.

Ниже приведу листинг этого файла, назвал его win32-x-mingw32.cmake, в адоптации для ArchLinux:

# the name of the target operating system
SET(CMAKE_SYSTEM_NAME Windows)
 
# which compilers to use for C and C++
SET(CMAKE_C_COMPILER i486-mingw32-gcc)
SET(CMAKE_CXX_COMPILER i486-mingw32-g++)
SET(CMAKE_RC_COMPILER i486-mingw32-windres)
 
# here is the target environment located
SET(CMAKE_FIND_ROOT_PATH  /usr/i486-mingw32)
 
# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search 
# programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

# next options is needed by some cases
#set(CMAKE_EXE_LINKER_FLAGS
#    ${CMAKE_EXE_LINKER_FLAGS}
#    -Wl,-subsystem,windows
#    -Wl,-enable-auto-import
#    -Wl,-enable-runtime-pseudo-reloc)

# Uncomment this if you have problem: unrecognized option '-rdynamic'
#set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS)

set(MINGW32 1)

Это, конечно, не все, остались последние штрихи.

Использование данного тулчайна приведет к установке переменной CMAKE_CROSSCOMPILING, на основании этого, перед вызовом

find_package(Qt4 REQUIRED)

или аналогичного, достаточно вставить (в случае ArchLinux и пакета mingw32-qt из AUR или моей репы mingw32) следующий код:

if(CMAKE_CROSSCOMPILING)
  set(QT_HEADERS_DIR "/usr/i486-mingw32/include")
  set(QT_LIBRARY_DIR "/usr/i486-mingw32/lib")
endif()

После этого сборка осуществляется примерно так:

mkdir win32-build
cd win32-build
cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/win32-x-mingw32.cmake ..
make

Все! :)

PS проверено на Cmake 2.8.1 и Qt 4.6.2

Updated: обновлён файл тулчейна

May 23, 2010 - 2 minute read -

DokuWiki и web-закладки

Внимание: статья полностью неактуальна ввиду переезда на статику в 2019 году.

Случайно наткнулся на плагин dokubookmark, ставится в два движения, настраиваются неймспейсы… Но тороплюсь.

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

Как их потом искать? В шаблоне по-умолчанию сразу ставится тег Bookmark, я рекомендую его не убирать, потом по этому тегу просматривать свои закладки. Помимо этого:

  • по назначенным тегам, если озаботились этим
  • поиском по сайту

Что бы это дело работало, создайте себе браузерную закладку (я бы предположил поместить её на панель закладок, если оная у вас включена), с любым именем и следующим содержимым в качестве адреса:

javascript:Q=document.selection?document.selection.createRange().text:document.getSelection();void(window.open('http://SITE/wiki/doku.php?do=dokubookmark&te='+encodeURIComponent(Q)+'&ur='+encodeURIComponent(location.href)+'&ti='+encodeURIComponent(document.title),'dokuwikiadd','scrollbars=yes,resizable=yes,toolbars=yes,width=680,height=520,left=210,top=150,status=yes'));

Только исправьте адрес и путь на сайте на свои.

Все, пробуйте :)

UPD: Поддержка кирилицы

Из коробки пока не работает нормально с кирилицей (решение ниже, оно же отправлено разработчику)

Вы можете заметить, что для экранирования передаваемой строки используется escape(), так что кодировку строки-источника мы определить никак не сможем. Есть другие вызовы, которые так же экранируют строку, но в кодировке UTF-8, не зависимо от настроек сайта, это:

  • encodeURI()
  • encodeURIComponent() Различия между ними можно посмотреть в этой статье (и о escape() так же): http://habrahabr.ru/blogs/webdev/17640/, после чего выберите ту, которая по вкусу.

Но этого не достаточно, в самом плагине, нужно открыть файл helper.php и заменить все вхождения

htmlentities($some_text_var)

на

htmlentities($some_text_var, ENT_COMPAT, "UTF-8")

Дело в том, что у htmlentities(), согласно документации, кодировка по умолчанию ISO-8859-1, за подробностями в документацию (умный форматировщик кода у меня тут, даже ссылки сразу на первоисточники поставил, пользуйтесь).

UPD2: Все, эти пляски не нужны, автор обновил версию, за что ему большое спасибо :)

May 22, 2010 - 1 minute read -

DokuWiki, blog и include плагины

Коротко: include плагин некорректно закрывает <div> если задана опция отображать только первую секцию, в результате может поехать… Ну сами догадайтесь.

Исправление, подразумевается, что мы в директории plugins:

  1. открыть include/helper.php
  2. найти там функцию _get_firstsec(&$ins, $page)
  3. найти в ней строкуphp$ins[] = array('section_close');
  4. заменить на: php$ins[] = array('section_close', array());
  5. очистить кеш
  6. радоваться :)

Вот так выглядело до исправления:

http://img153.imageshack.us/img153/1839/screenshoot201005221900.png

Так после:

http://img232.imageshack.us/img232/1196/screenshoot201005222034.png

UPD: написал письмо разработчикам, отреагировали быстро, в git уже есть изменения :)

May 21, 2010 - 1 minute read -

YouTube и HTML5

На правах реминдера.

http://www.youtube.com/html5

позволяет включить для видео тег

<video>

и забыть о необходимости флеша. Работает сразу в chrome/chromium, для Firefox есть расширение которое заменяет тег на

<embed>

и после этого нормально работает.

May 13, 2010 - 6 minute read - linux

Резервное копирование при помощи rsync+ssh

Статей на эту тему много, к примеру:

Но нигде не нашел внятного объяснения как сохранять права доступа, группу и владельца, особенно, если удаленный сервер (backup-сервер) работает не от пользователя root.

В общем, постановка задачи:

  • инкрементный бекап
  • клиент-сервер
  • сохранять права доступа, владельца и группу
  • сохранять только указанные директории, представлять возможность исключения по паттерну, делать исключения в исключениях :)
  • выполнение каких-то операций пред выполнением резервирования

May 10, 2010 - 2 minute read -

Xorg 1.8

Поставил из любопытства, в частности поглядеть на новые средства конфигурации для Input устройств - теперь HAL не используется, а используется, в Linux (кстати, а как на других *nix?), UDEV.

Сразу, для олдовых мужиков, которые издревле конфигурировали иксы через /etc/X11/XFree86.conf или /etc/X11/xorg.conf, тут практически ничего не изменилось:

  • появилась возможность “дробить конфигурацию”, ложить в отдельных файликах в /etc/X11/xorg.conf.d
  • именно для Input-устройств появилась новая конфигурационная секция (что бы все драйверы не грузились, только нужное) - InputClass о которой можно так же почитать в man xorg.conf (там обратите внимание на новые директивы, которые помогают определять устройство, всякие Match*)

Теперь, как узнать различную информацию которую можно подсунуть этим самым Match*? Тут рекомендуют обратиться к udevadm, но отчего-то у меня она оказалась мало-информативна. Воспользовался логикой: UDEV берет информацию из SYSFS, при помощи правил в /etc/udev/rules.d добавляет/модифицирует свою, но основную можно глянуть и самому в SYSFS. Для этого идем в /sys/class/input делаем ls и смотрим сколько у нас тут всякого! По крайней мере у меня на EeePC:

$ ls
event0   event11  event4  event7  input0   input11  input4  input7  mice
event1   event2   event5  event8  input1   input2   input5  input8  mouse0
event10  event3   event6  event9  input10  input3   input6  input9  mouse1

Ну а потом обзором по всем этим устройствам, меня больше интересовало имя моего тачпада, это оказалось устройство event10:

$ cat /sys/class/input/event10/device/name 
ETPS/2 Elantech Touchpad

Там и другие файлы, другая информация есть, смотрите что нужно.

Из остальных: event1 оказался клавиатурой, там же оказались и ACPI кнопки типа Power Button (event5, event6 - почему только два?), Sleep Button (event4), встроенная usb веб-камера (event8), PC Speaker (event11). Унификация, фигли :)

Ну и вот мои конфиги:

  • Для тачпада: /etc/X11/xorg.conf.d/09-elantech.conf``` Section “InputClass” Identifier “touchpad catchall”
    # Как я получил имя продукта, описано выше MatchProduct “ETPS/2 Elantech Touchpad”

    Option  "SHMConfig"              "on"
    Option  "MaxSpeed"               "1.00"
    Option  "MinSpeed"               "0.75"
    Option  "Emulate3Buttons"        "on"
    Option  "VertTwoFingerScroll"    "1"
    Option  "HorizTwoFingerScroll"   "1"
    Option  "TapButton1"             "1"
    Option  "TapButton2"             "2"
    Option  "TapButton3"             "3"
    Option  "LockedDrags"            "11"
    
    Driver "synaptics"
    

EndSection


  * Для переключения раскладки клавиатуры: **/etc/X11/xorg.conf.d/09-keymap.conf**```
# Мои общесистемные настройки переключения клавиатуры для Xorg 1.8
Section "InputClass"
        Identifier "evdev keyboard catchall"
        MatchIsKeyboard "on"

        Option "XkbModel"    "evdev"
        Option "XkbRules"    "base"
        Option "XkbLayout"   "us,ru"
        Option "XkbVariant"  ",winkeys"
        Option "XkbOptions"  "grp:lwin_toggle,grp_led:scroll,compose:ralt,terminate:ctrl_alt_bksp"
EndSection

Немного более детально можно почитать:

PS на правах хинта, а то постоянно вылетает из головы: получить базовый xorg.conf: X -configure или Xorg -configure