четверг, 10 марта 2011 г.

TinyMCE

Говно. Вообще за неспособность делать html руками и потребность в таких редактрах следует разжаловать из звания "человек" и отправлять в зоопарк, в клетку "говорящее животное". Или просто убивать на месте.

суббота, 5 марта 2011 г.

среда, 8 июля 2009 г.

SVG-иконки в QT-программах.

Теоретически это отличная идея - использовать векторные иконки. Внешний вид более не зависит от разрешения, при изменении масштаба глаза не начинают вытекать от пикселей. Ок, добавляем их в QT-ресурсы, компилируем и видим что ничего не работает. Иконок нет, как и сообщений об ошибках. В чём секрет?

Оказывается Qt с легкостью хватает любые форматы изображений без специального объявления кроме SVG. Для того чтобы QIcon понял что это, надо чтобы расширение svg было в имени. Лечение выглядит натуральным хаком - в alias ресурса надо добавить ".svg" и его-же в код грузящий иконки, Qt.QIcon(':/icon.svg').

Интересно только чем думают авторы?

понедельник, 15 июня 2009 г.

MySQL говно или как сделать DATETIME из DATE и TIME

Казалось бы делается это очевидно: DATETIME(date, time). Но нет, пидарасы, что создали MySQL, так не думают. Час в гугле вывел на работающий способ аналогичный удалению гланд через жопу. Нам надо собрать строку из date и time и эту строку преобразовать в datetime.

Узрейте свет ИСТИНЫ:

CAST(CONCAT(date, " ", time) AS DATETIME)

среда, 18 февраля 2009 г.

Python, subprocess и MPlayer

Какое-то время назад возникла проблема играть из программы звук в нечеловеческих форматах. Кроссплатформено. Сначала я хотел использовать существующие библиотеки (Audiere например), но в конце-концов решил использовать MPlayer в slave mode. Всё работает БОДРЯЧКОМ под Linux естественно. А под Windows?

А ситуация с Windows описывается словом "жопа". Научить MPlayer понимать команды я не смог (что-то с пайпами, лень возиться). К счастью бегать по одному треку или ставить на паузу не надо, процесс можно просто убивать. Просто хак с проверкой что мы под Windows и всё.

Новая проблема возникла далее - MPlayer просто не запускался. Если программа запускается из консоли или собирается с помощью py2exe как console - всё ОК, но как GUI не работает. Проблема оказалась снова в пайпах. Решение - при создании процесса с помощью subprocess.Popen задать все потоки (stdin, stdout, stderr), а не только нужные нам.

Но тут вылезла проблема номер 3. MPlayer выкидывал некрасивое пустое консольное окошечко поверх нашей Qt-морды. Решение было найдено в гугле минуты за 2 тут

В итоге всё даже работает. Осталось только поизучать исходники SMPlayer'а чтобы узнать как обойтись без хаков. А всё почему? Потому что Windows - говно.

пятница, 5 декабря 2008 г.

Автор Audiere - говноед и пидарас.

Это я заявляю официально. Который день разгребаю этот кусок говна (надо было на свою голову выбрать именно эту библиотеку), а оно не кончается. И это я еще код серьезно не трогал. А там ахуй в стиле "мы знаем вот такую клёвую фичу C++!". Слать туда патчи, как я планировал изначально, нельзя ни в коем случае. Форк, только форк и тотальный рефакторинг!

воскресенье, 23 ноября 2008 г.

*nix tools

Отношения с никсовыми инструментами у меня имеют длинную и сложную историю. Главное, что было в них отталкивающего - они абсолютно не похожи на Windows-инструменты. Первые попытки набрать что-либо в vim заканчивались ничем.

К счастью, реально эти программы оказались достаточно простыми, самое главное и сложное понять их принципы. Инструменты эти не рассчитаны на ложный простой путь "сел и начал работать". Это действительно инструменты, которые надо изучать. Проблема только в руководствах. Например, vimtutor это просто страх что такое, разобраться по нему конечно можно. Но он не даёт ответа на вопрос "зачем мне в этом разбираться, в чем профит?".

Но к счастью были найдены вполне человеческие руководства и учебники, не только плавно объясняющие "как делать" но и дающие ответ на вопрос "в чем профит для меня". Это различный *book - vimbook, autobook (гуглятся вмиг). Руководство по лучшему редакторы и по системе сборки программ соответственно. При наличии такой базы можно дальше лезть в стандартные мануалы, мгновенно становящиеся простыми и понятными.

Основной же принцип всех нормальных никосвых инструментов - делать что то одно. На самом деле тут не нужны многие привычные инструменты, замену которым активно ищут. Например, огромный Word может быть заменён не монстром OpenOffice а лёгким AbiWord для мелких текстов (запускается моментально) и LaTeX'ом для текстов сложных. Вполне недурный SMPlayer заменён на чистый MPlayer с сложным конфигом. Приятнее всего то, что отказ от уродливых windows-style программ-универсалов радикально повышает скорость работы. Ощущение что система "летает под пальцами", выполняя любое действие практически в тот-же миг, крайне приятно.

среда, 12 ноября 2008 г.

PyGTK и threading

Столкнулся сегодня с проблемой. У нас есть программа на PyGTK работающая под Windows. Она просто морда к БД и файловому архиву. Задача стоит достаточно тривиально - грузить файлы в фоне (они могут быть по много-много мегабайт). Делается так-же "тривиально" - поток на основе threading.Thread. Но обнаружилась засада - в фоне ничего не качало. Только при выполнении join() делалась нуждная работа.

В результате я пытался делать сложную магию и копал гугл. В итоге обнаружилось, что проблема в gtk. Оно как-то хитрым образом работает с потоками, потому все вызовы gtk надо оборачивать в gtk.threads_enter() и в gtk.threads_leave(). А в начале вызывать gtk.gdk.threads_init().

Теперь код должен выглядеть примерно так:

gtk.gdk.threads_init()
create_window()
gtk.gdk.threads_enter()
gtk.main()
gtk.gdk.threads_leave()

Вот такая вот ерунда.

четверг, 16 октября 2008 г.