суббота, 8 ноября 2008 г.

"Правильная" обработка сигнала на активацию для GtkCellRendererToggle

Продолжаем бороться с GTK. На этот раз возникла необходимость отобразить дерево каталогов с возможностью выбора файлов/каталогов для скачивания примерно в таком виде:

На первый взгляд никаких проблем быть не должно: создаем GtkTreeViewColumn, в которую упаковываем GtkCellRendererToggle и GtkCellRendererText. Создали, упаковали - выглядит так, как и хотелось, но вот работает не так как надо. А именно, флажки переключаются даже тогда, когда пользователь щелкает по GtkCellRendererText с именем файла/директории. Подобное поведение может очень сильно раздражать, когда, например, пользователь ввиду слишком длинного списка с большим уровнем вложенности захочет просто кликнуть по имени файла, чтобы выделить всю строку и тем самым подсветить остальные колонки GtkTreeView, которых может быть довольно большое количество (размер, время модификации, тип файла и т. п.).

Как и в прошлый раз, для решения проблемы придется модифицировать внутренние структуры GTK, т. к. штатными средствами данную проблему похоже решить не удасться. Все, что нам нужно - это определить собственный обработчик сигнала для GtkCellRendererToggle. Пример того, как это можно сделать, представлен ниже. Все, что необходимо программисту - это вызвать функцию activate_cell_renderer_toggle_tree_mode(). После ее вызова все GtkCellRendererToggle'ы будут работать так, как требуется. Способ работает как с GTK, так и с Gtkmm.

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

Назначение обработчика сигнала для заголовка GtkTreeViewColumn

Недавно потребовалось сделать так, чтобы при нажатии правой кнопкой мыши по заголовку колонки GtkTreeView возникало меню, с помощью которого можно было бы выбрать для отображения или скрыть отдельные колонки. Порывшись в документации к GTK, я обнаружил, что это не так то просто. А именно - нет какой-либо функции, которая могла бы возвратить виджет заголовка колонки, к которому я бы смог привязать обработчик сигнала на нажатие кнопки мыши.

Т. к. поиск в документации не дал никаких результатов, я начал искать обходные пути решения данной проблемы. Оказалось, что GTK позволяет назначить собственный виджет, который будет помещен в кнопку заголовка GtkTreeViewColumn. По умолчанию, если пользователь не назначит собственный виджет, вместо него используется обычный GtkLabel с именем колонки. Если же мы назначим заголовку собственный виджет, то сможем подняться от него вверх по дереву содержащих его контейнеров и получить нужную нам кнопку.

Поэтому, недолго думая, я написал следующую функцию, которая возвращает заветную кнопку заголовка колонки (функция написана для Gtkmm, но переписать ее под обычный GTK не составит никакого труда):

вторник, 19 августа 2008 г.

PyVSB - простая в использовании система бэкапа данных

Меня давно привлекал язык программирования Python - по-моему все мнения о нем, которые мне доводилось слышать, были исключительно положительными, да и в последнее время при работе в Linux я стал замечать, что все больше и больше программ, которыми я пользуюсь, написаны на Python'е. Прочитав Python tutorial и просмотрев Python Library Reference, я понял, что совершенно не зря он стал так популярен в последнее время - это просто замечательный язык, который отлично подойдет как web-разработчику так и разработчику настольных программ, особенно если скорость написания программы для него имеет решающее значение.

После прочтения документации к Python, я стал думать, как бы мне закрепить полученные знания на практике. Идеальным вариантом было бы написание относительно небольшой программы, которая использует как можно больше возможностей библиотеки Python, и которая пригодилась бы мне впоследствии, чтобы не "писать программу, ради написания программы". Попытавшись вспомнить, каких программ мне не хватает, я пришел в тупик - оказалось, что в Linux я нашел для себя все, что мне было необходимо. Однако, я вспомнил, что уже довольно давно для бэкапа использую самописные скрипты, которые хоть и сжимают сохраненные данные, но не обеспечивают инкрементального бэкапа. Поставить какую-нибудь bacula и читать целый том документации к ней мне не хотелось - для "домашнего" бэкапа ее возможности совершенно не нужны. До поиска каких-нибудь более простых систем бэкапа у меня как-то не доходили руки.

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

Необходимые для меня функции - это:
  • Инкрементальный бэкап
  • Сжатие сохраняемых данных
  • Отправка уведомлений на email
  • Возможность запуска собственных скриптов до и после бэкапа
  • Фильтрация файлов, подлежащих резервному копированию, по регулярным выражениям

Вот что у меня получилось (взято из Readme файла к программе):

вторник, 12 августа 2008 г.

Ctrl+H и другие Emacs (Bash) клавиши в GTK

Работая в Vim и Bash, я очень сильно привык к комбинации Ctrl+H, которая служит аналогом Backspace, т. к. при слепом методе набора текста на нее нажимать гораздо удобнее, нежели на Backspace. Результатом данной привычки явилось всевозрастающее неудобство при работе с GTK приложениями, которые данную комбинацию клавиш не поддерживали, хотя Qt приложения обрабатывали ее так, как надо. После довольно непродолжительных поисков в интернете нашлось решение данной проблемы.

суббота, 26 июля 2008 г.

Очередной HowTo по Vim

Ранее я уже выкладывал небольшой HowTo по Vim. Тогда я только начинал свое знакомство с ним и решил, что на начальном этапе изучения лучше руководствоваться различными tutorial'ами и HowTo, а официальную документацию пока оставить в стороне. Почему? А потому, что если вы только начинаете изучать Vim, то вы еще не знаете, что вам от него нужно - необходим определенный опыт работы, чтобы при чтении документации вы смогли бы наиболее точно оценить, какие функции будут вам полезны, а о каких можно забыть. Все команды вы все равно не запомните - уж слишком их много, поэтому приходится отсеивать только те, которыми вы действительно будете пользоваться.

Поработав в Vim достаточное количество времени, чтобы понять, что мне от него нужно, я наконец-то принялся за чтение документации. Просто так ее читать бесполезно - все не запомнишь, поэтому в процессе чтения я выписывал те сочетания клавиш, которые считал для себя полезными. Конечно, даже после этого список получился довольно большой, но я его составлял не для того чтобы потом сесть и зубрить. :) Нет, это вообщем-то и не нужно. Вполне достаточно внимательно прочитать его один раз, запомнив описываемые им возможности, чтобы в последствии, когда вы в очередной раз поймаете себя на выполнении повторяющихся действий, от вас потребовалось бы только заглянуть в этот список команд и подумать, как можно сделать то же самое одной комбинацией клавиш.

Подобные HowTo просто подарок судьбы для начинающих пользователей Vim'a, т. к., прочитав их и скопипастив строчки из чужих конфигов в свои, они уже смогут работать в нем, не испытывая при этом особого дискомфорта. Данный HowTo предполагает, что вы уже знаете Vim в объеме Vim Tutor. Опытные пользователи, которые не смогли найти время для прочтения документации, также, возможно, найдут что-то полезное для себя в этой статье - я, например, к своему стыду, о командах gj и gk узнал именно из документации, но сколько же я без них мучился... :)

четверг, 17 июля 2008 г.

Назначение имен заголовкам табов в Vim

Vim предоставляет довольно удобный способ группировки редактируемых файлов - табы (вкладки). И все бы хорошо, но лично мне сильно мешал один недостаток - в именах вкладок не присутствуют их номера, и поэтому при переключении на нужную вкладку командой :tabn[tab_num] каждый раз приходится проводить взглядом по всем табам и высчитывать порядковый номер этой вкладки. При частом переключении это действительно начинает надоедать...

На днях, читая документацию к Vim, я к своему удивлению обнаружил, что он предоставляет возможность назначать собственные функции, которые будут генерировать имена для каждой вкладки. Там же был простой пример того, как это можно сделать. Пробежавшись глазами по руководству о написании скриптов для Vim, я модифицировал приведенный пример, получив следующий результат (для текстового и GUI режима отображения):


четверг, 10 июля 2008 г.

Недокументированные возможности IceWM

Если вы используете IceWM уже довольно давно, то наверняка не раз замечали, что в документации перечислены не все опции, с помощью которых его можно настроить. Я с этим сталкивался не раз, но до недавнего времени мне хватало всех тех опций, которые были мне известны.

Когда же я захотел, чтобы при запуске определенное приложение разворачивалось на весь экран (Fullscreen), то обнаружил, что в документации к ~/.icewm/winoptions нет опции, позволяющей сделать это.

Не поверив, что разработчики не реализовали подобную возможность, я полез в интернет. Не найдя в интернете решения моей проблемы, я решил посмотреть исходники IceWM. Как я и предполагал, разработчики реализовали нужную мне опцию ~/.icewm/winoptions, но не отразили это в документации. Там же я нашел еще несколько опций, о которых в ней не упоминалось. Так как имена опций и их описание находились в коде недалеко друг от друга, то, составив несколько action'ов в Vim'е, я получил из исходных текстов список с парами "имя опции - описание", которым и решил с вами поделиться - вдруг кто-нибудь найдет в нем опцию, которой ему очень не хватало. Описание в коде присутствовало не для всех опций, поэтому и в моем списке они не все документированы, но по их именам в большинстве случаев совсем не сложно догадаться, что они означают.

суббота, 21 июня 2008 г.

Жизнь без gnome-settings-daemon

Я не использую Gnome и вообще не сторонник DE. В качестве оконного менеджера у меня стоит IceWM. Раньше, чтобы при работе в IceWM у меня автоматически задавалась нужная мне тема оформления для GTK приложений, и включалось сглаживание шрифтов, при старте IceWM запускался gnome-settings-daemon.

В последнее время я стал замечать нестабильную работу системы из-за gnome-settings-daemon'а. Например, при работе в VMWare во время выхода из гостевой ОС у меня время от времени блокировалась клавиатура, и после этого не запускалось ни одно графическое приложение - помогал только перезапуск иксов. В итоге я решил от него избавиться, т. к. никакой необходимости у меня в нем нет.

пятница, 13 июня 2008 г.

Установка и настройка Ubuntu 8.04 на ASUS Eee PC


Когда я покупал себе ASUS Eee PC, я совершенно не думал о том, какую операционную систему установлю на нем - однозначно это будет Ubuntu Linux. Во-первых, потому, что Ubuntu у меня стоит и дома и на работе, во-вторых, потому, что и дома и на работе у меня есть локальное зеркало репозитория Ubuntu, а в-третьих просто потому, что данный дистрибутив меня всем устраивает.

После покупки я сразу же полез в Интернет в поисках различных HowTo по установке Ubuntu 8.04 на Eee PC. Результат меня несколько удивил. Несмотря на огромный ажиотаж вокруг Eee PC, этих самых HowTo в сети не так уж и много + большинство из них нацелены на Ubuntu 7.10 и предлагают запустить некий скрипт, который заменит системные конфигурационные файлы своими, заточенными под Eee PC.

На эти скрипты я даже и смотреть не стал, т. к. они предназначены для Ubuntu 7.10, и их запуск на Ubuntu 8.04 может привести к нехорошим последствиям. Поэтому во время поиска необходимой информации в сети я обращал внимание только на те статьи, в которых описывается, как можно настроить Ubuntu под Eee PC "своими руками". Найти такой HowTo, в котором содержались бы ответы на все встающие передо мной вопросы, мне не удалось, поэтому я решил систематизировать собранную мной информацию и слить ее в одну статью. Сейчас моя система уже настроена, поэтому я постараюсь вспомнить все действия, которые я производил над ней, дабы все заработало так, как мне хочется. Надеюсь, я ничего не упущу. :)

понедельник, 5 мая 2008 г.

Скрипт для помощи в разрешении конфликтов CVS

Время от времени, когда вы заливаете в CVS только что отредактированный файл, она выдает вам следующее сообщение:
cvs commit: Up-to-date check failed for `main.c'
cvs [commit aborted]: correct above errors first!
которое означает, что кто-то уже успел отредактировать этот файл и залить его в CVS раньше вас.

Встает проблема разрешения конфликта. Что делать? Выполнить cvs update и доверить разрешение конфликта CVS? Нет, я кроме себя никому не доверяю. :)

суббота, 5 апреля 2008 г.

RSS для LinuxForum.ru

Я очень дорожу своим временем и поэтому предпочитаю получать всю необходимую мне информацию из интернета только в формате RSS. Это как минимум позволяет мне узнавать обо всем новом, вообще не заходя на сайты, а также при помощи Google Reader читать новости не только дома, когда можно заниматься более продуктивными делами, но и в транспорте с мобильного телефона или КПК.

Вот только даже сегодня, в эпоху Web 2.0 далеко не все сайты предоставляют качественный экспорт информации в RSS. Так, к примеру, на LinuxForum.ru мне сильно не хватает RSS ленты, которая выдавала бы мне все последние темы, появляющиеся в интересующем меня форуме. Ради справедливости можно сказать, что движок форума позволяет подписаться на новые темы по e-mail, но мне электронную почту для чтения подобной информации использовать очень неудобно. Я уже спрашивал на форуме, можно ли забирать эту информацию по RSS, на что получил отрицательный ответ.

В итоге пришлось решать эту проблему своими силами. С помощью Yahoo Pipes я создал pipe, который выдает все последние темы указанного в параметрах pipe'а форума. По правде сказать, раньше я с Yahoo Pipes никогда не работал и его возможности меня сильно удивили - это действительно очень мощный инструмент, который замечательно справляется со своей задачей. Так что всячески вам его рекомендую.

четверг, 20 марта 2008 г.

ПСПЛ: Полезные Советы По Linux

Пару дней назад, когда я в очередной раз просматривал в Google Reader свои RSS ленты, в графе "Top Recommendations" он предложил мне почитать RSS ленту сайта ПСПЛ: Полезные Советы По Linux.

До настоящего момента Google Reader мне еще ни разу не советовал ни одной ленты, которая бы мне действительно понравилась, и я бы решил подписаться на нее. Этот же сайт оказался действительно интересным, поэтому я хочу вам его порекомендовать. Как можно догадаться из названия, он является сборником наиболее ценных советов относительно Linux.

Просмотрев весь сайт, я нашел для себя много интересного. Если у вас нет желания просматривать весь сайт целиком, приведу наиболее интересные, на мой взгляд, советы:

понедельник, 10 марта 2008 г.

Управление KTorrent'ом при изменении сетевой активности браузера

По сегодняшним меркам у меня довольно медленное соединение с Интернетом - 150 Кбит/с днем и 300 Кбит/с ночью. Компьютер работает круглосуточно. Ночью для локальной сети зеркалируются репозитории Ubuntu 7.10 и 8.04, и все время включен KTorrent, который постоянно что-то раздает и довольно часто что-то качает. В итоге получается, что мой канал забит практически круглосуточно.

Зеркалирование мне никак не мешает, т. к. работает ночью. А вот ходить по Интернету при работающем KTorrent'e, который качает в несколько потоков, занятие не из приятных. Вручную останавливать/запускать закачки/раздачи - не выход.

Ранее в небольшой заметке я упоминал, как можно управлять KTorrent'ом из консоли. Теперь же я хочу показать вам, как у меня это реализовано на практике в виде небольшого Bash скрипта.

вторник, 26 февраля 2008 г.

Запоминание позиции воспроизведения файла в MPlayer

Думаю, многим знакома следующая ситуация. Вы запускаете свой любимый MPlayer, чтобы посмотреть какой-нибудь фильм, смотрите, но до конца досмотреть не успеваете, т. к. вам нужно куда-нибудь уходить. Вы закрываете MPlayer, выключаете компьютер и идете по своим делам. Вернувшись, вы решаете досмотреть фильм. Вот только где же вы остановились? Что делать? "Проматывать", пока не наткнетесь на тот момент, который не видели? Записывать время остановки на бумажке? :) Нет, это не наш метод...

воскресенье, 17 февраля 2008 г.

Подсветка текста в терминале

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

понедельник, 21 января 2008 г.

Шпаргалка по mnoGoSearch

Недавно мне потребовалось установить у себя поисковый движок для индексирования HTML страничек. Остановился я на mnoGoSearch. В процессе чтения документации я выписывал некоторые моменты, которые могут пригодиться впоследствии, чтобы не пришлось заново копаться в мануалах. В результате получилось что-то вроде небольшой шпаргалки. На случай, если вдруг она кому-нибудь пригодится, выкладываю ее сюда.

воскресенье, 13 января 2008 г.

Советы по bash, часть 2

Как и обещал, я нашел у себя время для того чтобы почитать man bash. :) Честно признаюсь, что прочитал его не весь, а только те разделы, которые были наиболее интересны для меня. Вот некоторые интересные настройки, которые мне удалось найти кроме Советы и подсказки по bash.