вторник, 24 февраля 2015 г.

Кто использует точку монтирования?

Иногда при попытке отмонтировать каталог, будь то точка монтирования устройства или tmpfs, мы получаем ошибку devise is busy. Причиной этому могут служить различные факторы, рассмотрим несколько способов узнать кто же захватил нашу точку монтирования:
  1. fuser -v <полный путь> - если точку монтирования блокирует обычный процесс, эта команда покажет какой;
  2. lsof +D <полный путь> - аналогично;
  3. cat <полный путь>/etc/exports - проверяем экспортируются ли для NFS какие-либо каталоги. Запущенный NFS сервер внутри chroot может не определится в шагах 1 и 2;
  4. mount | grep <полный путь> - если внутри этого каталога есть bind mounts или другие mounts (procfs, tmpfs и т.д.), которые не определятся в шагах 1 и 2;

четверг, 6 марта 2014 г.

Миф о переходе Qt с C++ на QML

В сети уже давно циркулируют слухи, а точнее миф о том, что Qt перейдёт с С++ на QML, и весь код, написанный на С++ якобы будет объявлен deprecated. Эти слухи появились из статьи Ларса Нолла опубликованной здесь. Из этой статьи следует следующее:
  • Qt5 поддерживает и будет поддерживать C++ widgets, они не будут объявлены derprecated;
  • C++ виджеты объявлены как законченный модуль, новые возможности на данный момент никто не добавляет, но это не значит, что он заброшен и deprecated;
  • QML - дополнительный способ создания приложений;
  • QML - технология, ориентированная на будущее;
То есть C++ остаётся основным методом написания приложений, а QML просто даёт дополнительный метод создания приложений, часто - для мобильных платформ.

От себя добавлю несколько гадостей о QML (если быть точным, то о Quick), которые могут предотвратить ваш переход на него:
  • QML - довольно простая и ограниченная технология, сложные проекты будут представлять собой спагетти из QML и C++;
  • QML зависит от 2d-ускорения и качества видеодрайверов. Не удивляйтесь, что ваше окошко при быстром перемещении по рабочему столу начнёт чудовищно искажаться - это вина драйверов, то есть то, что вы не сможете починить. При отсутствии 2d-ускорения QML начинает серьёзно тормозить;
  • В QML до сих пор нет некоторых виджетов, которые вы использовали в C++, например дерева или диалогов. Вам придётся искать сторонние варианты реализации таких компонентов, либо писать их самим;
  • В QML компонентах, которые отображают данные, вроде TableView, нет поддержки сортировки, вам придётся в С++ коде создавать объект QSortFilterProxyModel с нужными переопределёнными виртуальными методами, и экспортировать его в QML;
  • В QML нет простого способа импортировать сложные С++ объекты, вам придётся писать дополнительный С++ код-обёртку чтобы передать сложный объект в QML;
  • периодически вы будете сталкиваться с разными недочётами и пользоваться костылями для их обхода (например, массивы в ListElement);
  • в QML нельзя передать любой enumerator из C++. Для этой операции вам потребуется выполнить несколько условий, а именно: 1) enum должен быть объявлен внутри QObject класса 2) внутри этого же класса должны быть объявления Q_OBJECT и Q_ENUMS(). Если вы используете чужие заголовочные файлы с enum-ами, то как вы сами понимаете, сделать их доступными в QML не получится. Самый прямой способ - дублирование объявления значений из enum-a в QML. Самый кривой - различные хаки с moc, работоспособность которых мне, к сожалению, неизвестна;

четверг, 2 января 2014 г.

Несколько слов о локализации ПО

Решил написать несколько слов о локализации ПО, а именно о тех вещах, с которыми столкнулся я сам. В тексте используется Qt-специфичные слова и методы перевода, хотя это не особо важно. Без лишних вступлений перейдём сразу к сути:
  • не расставляйте знаки препинания, да и вообще не воздействуйте на структуру предложения программно. Например, у вас в одном месте используется текст "Prefix", в другом - "Prefix:".  Чтобы сэкономить на спичках вы можете написать в первом месте tr("Prefix"), во втором - tr("Prefix") + ':', таким образом в файле перевода строка "Prefix" встретится только один раз. Это неверно, потому что в некоторых языках, например, во французском, перед двоеточием принято ставить пробел. Написав tr("Prefix") + ':' вы сделаете неприятный сюрприз для французских пользователей;
  • переводческие бюро, которые заявляют об услуге локализации ПО, часто даже не знают что такое XLIFF или .po;
  • ни одна переводческая фирма не даст отличный результат для текста со специфичными для какой-то области словами. Особенно для текста со сленговыми словами, которые понимают только работники данной области. Например, попробуйте перевести с английского глагол "untar" (UNIX-специфичный сленг) - вы даже не найдете его в словаре;
  • гарантированный результат качества перевода даст только индивидуальная работа с переводчиком, но и стоит это соответственно;
  • вы можете использовать онлайн сервисы для перевода вашего проекта добровольцами, например Transifex. Но если ваш проект не слишком популярен, то маловероятно, что добровольцы его переведут хотя бы на три языка;
  • на том же сервисе Transifex вы можете за деньги заказать перевод своего проекта в коммерческих сервисах Gengo и Texmaster. Gengo имеет больше языков и переводит довольно быстро (обычно в течение часа-двух), но Textmaster по моим субъективным ощущениям переводит качественнее, хоть стоит дешевле, но и переводит в течение суток-двух;
  • заказанный за деньги перевод на Transifex всё равно нужно вычитывать;
  • чтобы перевести небольшой текст на платной основе можно воспользоваться коммерческими онлайн переводчиками типа Gengo, Textmaster или Alconst Nitro, и его всё равно нужно будет вычитывать.

понедельник, 11 ноября 2013 г.

Сокращение размера собственного инсталлятора Qt4 (компилятор MinGW)

Если вы собрали свой инсталлятор Qt4 для каких-то своих целей, то вероятно обратили внимание на то, что в каталоге сборки Qt в подкаталогах bin и lib лежат дублирующие друг друга наборы Qt библиотек - bin\QtCore4.dll, lib\QtCore4.dll и т.д. Если вы собирали Qt с флагом -debug-and-release, то один такой набор занимает порядка 500 Mb, то есть ваш инсталлятор установит лишние 500 Mb файлов, и сам будет больше на 50-60 "лишних" мегабайт. При использовании MinGW мы можем решить эту проблему никак не трогая проекта, который будет собираться напротив этой сборки Qt.

Сперва удаляем все Qt-шные dll из подкаталога lib. Библиотеки Qt теперь останутся только в подкаталоге bin.

При линковке вашего проекта, основанного на Qt, линкер будет искать библиотеки Qt именно в почищенном нами lib. Данную проблему можно решить заданием флагов QMAKE_LFLAGS в вашем проекте (QMAKE_LFLAGS += -L <ПУТЬ УСТАНОВКИ Qt>/bin), но решение с обёртками мне кажется более логичным. К тому же не забывайте, что разработчик не ожидает такого поведения от вашей сборки Qt. Для компилятора отличного от MinGW решение с QMAKE_LFLAGS может быть единственным. Чтобы решить эту проблему для сборки на основе MinGW мы можем создать файлы-обёртки для линкера.

Итак, чтобы создать обёртку для библиотеки QtCore4.dll нужно:
  1. Создать пустой файл libQtCore4.a в подкаталоге lib;
  2. Добавить в него текст GROUP(../bin/QtCore4.dll). Этой строкой вы укажете линкеру, что ему нужно добавить в список линковки библиотеку QtCore4.dll из каталога bin.
Теперь когда ваш проект будет линковаться с QtCore4, линкер откроет файл lib\libQtCore4.a, прочтёт скрипт, и подлинкует библиотеку bin\QtCore4.dll. Повторите эти действия для всех библиотек из вашей сборки Qt (QtCore4.dll, QtGui4.dll, QtSql4.dll и т.д.). Теперь ваш инсталлятор cможет похудеть на 50-60 Mb, а установленная Qt - приблизительно на 500.

воскресенье, 27 октября 2013 г.

Перемещение собранного Qt4

Как известно, во время сборки Qt4 в библиотеке QtCore и qmake сохраняется путь к каталогу сборки, например F:\qt4. Если вы переместите этот каталог в другое место, например, F:\toolchains\qt4, и попытаетесь использовать его как новый профиль в Qt Creator, то некоторые вещи откажутся работать - например, не будет грузиться sqlite плагин, т.к. программа будет искать его по старому пути в F:\qt4. Для этих целей существуют специальные программы-патчеры, которые изменяют пути внутри QtCore или qmake. Рассмотрим следующие варианты:
  • QtBinPatcher. Источник: 1. Позволяет патчить все необходимые файлы без указания каких-либо параметров командной строки. Наилучший вариант из виденных мной;
  • QtPathCorrector. Источник: 1 2. Позволяет патчить файл без указания старого пути. Требует задать новый путь через параметры командной строки. Например, зайдите в перемещённый каталог F:\toolchains\qt4 и выполните: qtpathcorrector patch -n "%cd%" -f bin\qmake.exe bin\QtCore4.dll lib\QtCore4.dll . Пути в qmake и QtCore установятся в "F:\toolchains\qt4". Недостатки: если возникли ошибки, то файл, который должен был быть исправлен, становится размером 0;
  • QPatch. Источник: 1. Требует задать как старый, так и новый путь через параметры командной строки. Недостатки: нужно указывать старый каталог, новый путь должен быть короче старого (что скорее всего неприемлимо для вас);
Теперь qmake будет знать, что prefix поменялся, и будет использовать новое значение. Чтобы проверить установился ли новый prefix, выполните команду qmake -query.

Встречаются заметки, что нужно также патчить пути в .prl файлах в каталоге lib (т.е. F:\toolchains\qt4\lib), но я не обнаружил ошибок или неправильного поведения или компиляции своих программ, если эти пути оставить как есть при использовании патчера, которому нужно в явном виде указывать какие файлы патчить.

    вторник, 11 июня 2013 г.

    Использование ссылок svn+ssh:// на SourceForge

    Если вы используете svn репозиторий на sourceforge.net, TortoiseSVN на локальном компьютере, и репозиторий по протоколу svn+ssh://, то вы можете столкнуться с тем, что commit или checkout проваливается:

    svn: E720087: Can't create tunnel: Параметр задан неверно.

    Это связано с тем, что у вас в PATH отсутствует совместимая версия plink.exe. Чтобы исправить эту ситуацию, можно указать TortoiseSVN использовать свою собственную версию plink-a. Для этого создайте переменную окружения SVN_SSH с таким содержимым:

    C:/Program Files/TortoiseSVN/bin/TortoisePlink.exe

    Не забудьте указать правильный каталог, где установлен TortoiseSVN. Если же вы используете SSH ключи для авторизации, то эта переменная будет выглядеть так:

    "C:/Program Files/TortoiseSVN/bin/TortoisePlink.exe" -i ПУТЬ_К_PRIVATE_КЛЮЧУ
    Ссылки:

    понедельник, 10 июня 2013 г.

    Медленная инициализация SSL в Qt на Windows

    Если вы пишете сетевое приложение с помощью Qt и уже подложили SSL библиотеки в каталог с программой, и ваша программа успешно скачивает секретные данные по протоколу https, то вы могли заметить довольно медленную инициализацию приложения на Windows.

    Если раньше ваша программа стартовала и начинала скачивание данных по http за 200 мс., то теперь с https это время увеличилось до 800 мс. (и это на Phenom II X6)! Задержка происходит в методе QNetworkAccessManager::get(). Использовав профайлер AQTime я выяснил, что основная задержка была внутри модуля QtNetwork в функции q_RAND_status(). После гугления стало ясно, что SSL инфраструктуру в программе лучше инициализировать чем раньше тем лучше, и это связано с кучей (heap) приложения.

    Если ещё до создания объекта QApplication добавить следующий простой код, то инициализация программы сократится с 800 мс до 400 мс.:
    int main(int argc, char *argv[])
    {
        qDebug(QSslSocket::supportsSsl()
                   ? "SSL is supported"
                   : "SSL is not supported");
    
        QApplication app(argc, argv);
    
    ...
    Ссылки:

    ld.exe: final link failed: Memory exhausted

    Если вы компилируете Qt самостоятельно с помощью MinGW и на сборке debug версии получаете ошибку "ld.exe: final link failed: Memory exhausted", то используйте для компиляции платформу win32-g++-4.6:

    configure.exe -platform win32-g++-4.6 ...

    Данный mkspec добавляет новые ключи компиляции, которые убирают из dll много мусора, и линковка должна пройти успешно. Сам компилятор GCC при этом должен быть версии 4.6 или выше.

    пятница, 18 января 2013 г.

    Установщик Qt Linguist 4.8.4 для Windows

    Qt Linguist - средство локализации программ. Поддерживает файлы переводов в форматах Qt (.ts), XLIFF (.xlf) и GNU Gettext (.po).

    Ссылки:

    понедельник, 17 сентября 2012 г.

    Патчи на Qt 4.8.2-4.8.5 для Windows

    Я задался вопросом как уменьшить размер Qt библиотек для Windows платформы, оставив только то, что реально используется. Это нужно по понятной причине: в Windows все программы вынуждены таскать все свои зависимости с собой. Это значит, что если у вас установлено 5 программ, написанных на Qt, все пять будут содержать копию Qt библиотек в своём каталоге. Место на диске уменьшится при этом существенно. Вторая причина - это скорость запуска. Чем меньше размер dll библиотек, тем быстрее грузится программа. Поэтому я решил уменьшить размер Qt хотя бы для своей программы.

    Как оказалось, не всё так просто. Некоторые вещи, которые можно отключить в qconfig, нельзя отключать по причине ошибок компиляции Qt. Я написал несколько патчей, которые снимают некоторые (но не все) ограничения по компиляции Qt, и добавляют некоторую новую функциональность.

    суббота, 10 марта 2012 г.

    Объединение музыкальной композиции и картинки

    Иногда требуется создать видео с одной картинкой на фоне и музыкальной композицией, например, для того чтобы выложить какую-либо песню на Youtube. Здесь вы найдёте скрипт, которым я пользуюсь сам. Для его корректной работы должны быть установлены программы ffmpeg, mplayer, mencoder, и dvd-slideshow, желательно последних версий, чтобы избежать багов. На вход скрипту передаётся только два параметра: MP3 файл и картинка в формате JPEG или PNG.

    В результате вы получите XviD AVI файл в том же каталоге, где лежит музыкальная композиция.

    Заметка: вы можете пользоваться одной только программой dvd-slideshow, она может это делать и сама по себе, но у неё есть два недостатка: она перекодирует музыкальную композицию в низкий битрейт и создаёт несжатый VOB файл, который может быть довольно большим. Если для вас это не проблемы, то смело пользуйтесь dvd-slideshow. Если же это всё-таки проблема, то можете пользоваться этим скриптом.

    Например:
    $ ./one-image-plus-song solo.mp3 cover.jpg

    Ссылки:

    среда, 17 августа 2011 г.

    Преобразование FLAC в MP3

    Скрипт преобразования отдельных FLAC треков в текущем каталоге в MP3 (320 Kbit/s). Найден на просторах интернета и немного отредактирован для исправления мелких багов. Использует утилиты flac, metaflac и lame, так что убедитесь, что они установлены.

    Ссылки:

    понедельник, 2 мая 2011 г.

    Настройка виртуальных пользователей и SSL в vsftpd

    Иногда возникает необходимость настроить виртуальных пользователей и SSL шифрование в FTP сервере vsftpd. Рассмотрим как это сделать в Debian Squeeze.

    суббота, 20 ноября 2010 г.

    Скрипт для нарезки видео

    Простенький скрипт для нарезки видео для Youtube. Использует mplayer и ffmpeg, так что эти пакеты должны быть установлены, желательно из debian-multimedia. По умолчанию режет видео на куски по 14 минут 50 секунд, это значение можно поменять. Например

    $ ./split film.avi

    порежет видео на три части с именами part000-film.avi, part001-film.avi, part002-film.avi, длительностью 14:50 каждая (890 секунд), а

    $ ./split 445 film.avi

    порежет видео на шесть частей длительностью 7:25 (445 секунд) каждая.

    Ссылки:

    суббота, 23 октября 2010 г.

    копирование русских URL в Firefox

    Как многие знают, при копировании из панели адреса URL'ов с русскими символами (например, http://ru.wikipedia.org/wiki/Масленица), Firefox превращает русские символы в escape последовательности согласно RFC (в http://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%86%D0%B0).

    Чтобы этого не происходило, необходимо перейти по адресу about:config, найти там параметр network.standard-url.escape-utf8, и установить его значение в false. Этот параметр работает в Firefox 3.6.x.

    пятница, 15 октября 2010 г.

    reportbug bug

    При отправке некоторых багов через reportbug наблюдается забавная картина - появляется чёрное окно, как эмулятор терминала, и окно reportbug начинает постоянно расширяться. У меня стабильно воспроизводится на отправке багов по пакетам linux-image и iceweasel.

    воскресенье, 19 сентября 2010 г.

    Извлечение cookies из Firefox

    Иногда требуется получить cookies из кэша Мозиллы, например для использования в программе wget. Следущий скрипт позволит это сделать: скрипт. В качестве аргумента командной строки скрипт принимает путь к базе данных cookies.

    Пример использования:

    $ ./cookie-export ~/.mozilla/firefox/ioxcehl6.default/cookies.sqlite
    

    Не забудьте указать правильный путь к базе данных, он будет у всех разный, т.к. профиль хранится в уникальном каталоге (в моём случае - каталог "ioxcehl6.default").

    среда, 15 сентября 2010 г.

    Пакеты Clementine для Debian Squeeze

    Искал я простой аудио плеер, чтобы была панель каталогов для быстрого перетаскивания в плейлист, глобальные клавиши, и простой GUI.


    суббота, 28 августа 2010 г.

    Драйвер для USB Wifi карточки D-Link DWA-125


    Если вы приобрели карточку DWA-125, то можете столкнуться с тем, что она не работает. Это может быть из-за отсутствия нужного драйвера. Если вы не ратуете за чистоту системы от неуправляемых файлов, вы можете скачать и установить официальный драйвер согласно инструкциям. Однако, если вы хотите сделать deb пакет для драйвера, потребуется чуть-чуть больше времени.

    понедельник, 23 августа 2010 г.

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

    Пол Грэм "What happened to Yahoo"