воскресенье, 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()

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