суббота, 17 октября 2009 г.

Git: так ли хорош Subversion?

Subversion я пользуюсь уже около года. До этого был CVS, но преимущества SVN перед CVS'ом были настолько очевидны, что я нераздумывая перевел все свои репозитории на Subversion. С тех пор я как-то больше не оглядывался на другие системы контроля версий, но вот недавно на Хабрахабре наткнулся на пост с переводом выступления Линуса Торвальдса, посвященного Git - системе контроля версий, которую он написал, чтобы использовать при разработке ядра.

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

Цель данной заметки - заставить вас усомниться в вашем выборе системы контроля версий и подкинуть несколько ссылок, чтобы сэкономить вам время на поиске необходимой информации. Правда, сам я тоже особо время на поиск не тратил, т. к. довольно быстро нашел несколько статей, которые предоставили мне всю необходимую для ознакомления с Git информацию. На начальном этапе, я думаю, их будет вполне достаточно. Прочитав/прослушав/просмотрев данную информацию вы получите достаточно знаний, чтобы более или менее уверенно работать в Git. И лишь поработав с ней хотя бы месяц, поняв, что именно вам от нее нужно и в каком виде, можно будет приступить к чтению более обширной официальной документации. А пока...

Читать полностью...

вторник, 26 мая 2009 г.

Просмотр одновременно нескольких субтитров при проигрывании фильма

Недавно решил попробовать подтянуть свои знания английского языка общеизвестным методом просмотра зарубежных сериалов в оригинальной озвучке с английскими и русскими субтитрами. Полез в Synaptic и стал искать там подходящий для этого плеер. Собственно что хотелось:

  • Возможность одновременного просмотра нескольких субтитров на разных языках;
  • Возможность выделять текст субтитров, чтобы вставить его в словарь.

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

В итоге, не долго думая, я сел и написал собственный велосипед, благо мой любимый MPlayer довольно дружественен к пользователю тем, что не стесняясь выдает на свой стандартный вывод все, что в нем происходит. Поэтому все, что мне было нужно - это написать обертку над MPlayer'ом, которая будет подглядывать за его выводом и отображать нужные мне субтитры так, как я этого хочу.

Получилось вот что:


submplayer работает в точности как MPlayer, разве что путь к видеофайлу лучше передавать в командной строке первым аргументом, т. к. при запуске он просматривает список переданных аргументов и принимает в качестве пути к файлу, который необходимо воспроизвести, первый встретившийся аргумент, начинающийся не на "-". Определив путь к видеофайлу, как ${parent_directory}/${file_name}.${file_ext}, submplayer ищет и открывает все найденные субтитры вида ${parent_directory}/${file_name}*.srt.

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

Вообщем, результат меня устроил. :) Ну и как всегда, выкладываю сие творение в общий доступ на случай, если она пригодится кому-то кроме меня: submplayer.

P.S.: Субтитры беру с www.tvsubtitles.net, но, честно говоря, их качество меня не очень устраивает, к тому же, если говорить о сериале Scrubs, то русские субтитры там есть только для 6-8 сезонов. Вообщем, если кто подскажет, где еще можно найти субтитры хорошего качества, буду очень благодарен. Или, может быть, существуют какие-либо релиз-группы вроде lostfilm.tv и novafilm.tv, но выпускающие вместо озвучки профессионально составленные русские и английские субтитры?

Читать полностью...

воскресенье, 29 марта 2009 г.

Flush 0.4 released (GTK-based BitTorrent клиент)

Несколько месяцев назад я писал о выходе первой (0.1) версии своего BitTorrent клиента. С тех пор Flush дорос до версии 0.4. Т. к. первую версию, скорее всего, поставить решится далеко не каждый, да и в ней могло не быть каких-либо функций, отсутствие которых помешало бы использовать Flush, я решил, что настало время еще раз напомнить о существовании данного BitTorrent клиента. Я использую его с первой версии и сделал таким, каким, как я считаю, должен быть BitTorrent клиент. Если ваши предпочтения совпадают с моими, то, возможно, он вам придется по душе.

Причины, которые заставили меня написать собственный BitTorrent клиент, я изложил здесь, так что повторяться не буду. Думаю, лучше всего будет привести список изменений по сравнению с Flush 0.1 и скриншоты, которые зачастую могут сказать гораздо больше, чем любой Changelog. :)

Основные изменения (с полным списком изменений можно ознакомиться, почитав Changelog):

  • Создание собственных торрентов;
  • Переименование как самого торрента, так и его файлов при добавлении;
  • Поддержка не-UTF-8 локалей (Т. к. libtorrent поддерживает только локаль UTF-8, то в первых версиях клиент мог корректно работать только ней. В более поздних версиях мне удалось "обмануть" libtorrent и заставить его работать с другими локалями.);
  • Вкладка "Детали", отображающая информацию о выбранном в данный момент торренте.
  • Вкладка "Опции", в которой можно изменить список трекеров торрента и включить режим последовательного скачивания (в данном режиме скачивание частей торрента происходит не вразнобой, а последовательно, начиная с первых байтов и заканчивая последними).
  • Включение/отключение DHT и восстановление при запуске прошлой DHT сессии.
  • Включение/отключение LSD, Peer exchange, UPnP, NAT-PMP и Smart ban.
  • Возможность задания приоритета на скачивание каждого файла торрента.
  • Пакет с исходными текстами теперь поставляется в двух версиях: обычной и bundle. Bundle отличается от обычной тем, что включает в себя библиотеки libconfig и libtorrent для статической линковки. Это сделано для упрощения компиляции на тех дистрибутивах, которые не содержат данных библиотек.
  • Статистика по текущей сессии и за все время.
  • Возможность задания команды, которая будет использоваться для открытия файлов торрента.

Скриншоты:


Как и раньше, исходники и deb пакеты для Ubuntu-8.10-i386 и Ubuntu-8.10-x86-64 можно скачать здесь: http://sourceforge.net/projects/flush/.
Читать полностью...

вторник, 17 марта 2009 г.

Что почитать UNIX C/C++ программисту

Опыт программирования на C/C++ у меня относительно небольшой и, возможно, поэтому я еще помню, как в самом начале было тяжело определиться, с чего начинать свое изучение программирования под UNIX на C/C++. Поэтому попытаюсь слегка облегчить вам жизнь, приведя список книг (о которых удалось вспомнить), которые я прочитал, и какие впечатления у меня от них остались.

Хочу отметить, что книги - это не единственный источник информации. Если вы регулярно читаете различные статьи в Интернете, то у вас зачастую есть шанс найти в них что-то такое, о чем не напишут ни в одной книге и наоборот. Поэтому я бы советовал вам подписаться на RSS каких-нибудь новостных ресурсов, на которых время от времени пробегают интересные статьи. Например:


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

Помимо книг я попытался вспомнить хотя бы несколько статей, которые мне в свое время показались наиболее интересными, и привел ссылки на них.

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


Книги

Б. Керниган, Д. Ритчи - Язык программирования Си.
Эту книгу вам посоветуют на любом форуме, если вы спросите "Что почитать начинающему C программисту", и, пожалуй, будут правы. Для начинающего это, скорее всего, лучший вариант.

Х.М. Дейтел, П.Дж. Дейтел - Как программировать на C++.
Так получилось, что "Язык программирования Си" - это, если не ошибаюсь, единственная книга по С (не C++), которую я прочитал. После нее я продолжил свое обучение с "Как программировать на C++", в которой узнал много нового о C, о чем не говорилось в "Языке программирования Си" и основные возможности C++. На мой взгляд, очень неплохая книга для начинающих. Авторы постепенно вводят читателя в мир C/C++, не забывая при этом останавливаться на вопросах совместимости, быстродействия и хорошего стиля программирования, что является несомненным плюсом данной книги.

Андрей Робачевский - Операционная система UNIX.
Читал довольно давно, так что уже и не помню насколько это стоящая книга, но в целом впечатления от нее остались хорошие.

Эрик С. Реймонд - Искусство программирования для UNIX.
Если не ошибаюсь, данная книга не содержит ни одной строчки кода, но это не делает ее менее интересной. Автор анализирует философию UNIX и основные принципы написания программ. Читается на одном дыхании. Очень советую.

С. Макконнелл - Совершенный код.
Совершенный код мне не понравился. Обычно, если я покупаю книгу, то читаю ее от корки до корки. Эта же книга, пожалуй, единственная, которую я не прочитал и до середины. Такое впечатление, что автор стремился сделать ее как можно толще и поэтому мусолит любую, даже самую очевидную проблему, которая может встретиться программисту - просто скучно читать. На мой взгляд, если вы прочитаете пару хороших книг по C/C++ и "Искусство программирования для UNIX", то не найдете в ней ничего нового.

Ричард Стивенс, Стивен Раго - UNIX. Профессиональное программирование.
Ричард Стивенс - UNIX. Разработка сетевых приложений.
Отличные книги. Читать обязательно. После их прочтения действительно начинаешь понимать, как "оно" работает.

Бьерн Страуструп - Язык программирования C++.
Обожаю книги, в которых авторы уделяют большое внимание деталям, а не останавливаются только на общем описании проблемы. "Язык программирования C++" - одна из немногих таких книг. Получил огромное удовольствие от прочтения данной книги. Всем советую. Однако, новичкам перед ее прочтением я бы порекомендовал сначала прочитать "Как программировать на C++".

Крис Касперски - Техника оптимизации программ. Эффективное использование памяти.
К моему удивлению, я ни разу не слышал упоминания данной книги на форумах (может быть, не туда ходил) и считаю, что ее незаслуженно обошли стороной. Ее нам порекомендовал преподаватель в институте, за что ему огромное спасибо. Прочитав данную книгу, вы поймете, что, оказывается, для написания хороших программ одного только знания языка порой оказывается недостаточно - так же важно иметь хотя бы базовое представление о том, как устроен компьютер. Пусть вы, скорее всего, и не будете применять большинство методов, описанных в данной книге в силу их слишком агрессивной оптимизации под конкретную архитектуру, но, прочитав ее, вы впоследствии при разработке программ будете учитывать хотя бы базовые принципы, которые могут значительно повысить скорость работы программы, при этом не отняв у вас времени на оптимизацию (принцип использования "как можно более локальных" данных и т. п.). Да, и пусть слова "Эффективное использование памяти" вас не смущают - речь в данной книге пойдет отнюдь не о ее экономии, а именно о эффективном ее использовании. В качестве затравки могу порекомендовать статью "Разработка на PC и производительность — Memory Latency" (см. ссылку в разделе статьи).

Конечно, это далеко не весь список книг, которые я прочитал. :) Но когда я начал вспоминать, какие из них посоветовать для изучения программирования на C/C++ по UNIX, то мне почему-то вспомнились именно они.


Статьи

Программирование в Linux с нуля
Программирование для Unix/Linux
Using GNU C __attribute__
Reading C type declarations
Ключевое слово volatile
Функциональное программирование для всех
Основы написания переносимого кода (обязательно почитайте комментарии к статье)
20 ловушек переноса Си++ - кода на 64-битную платформу
Data alignment: Straighten up and fly right
Разработка на PC и производительность — Memory Latency


Что дальше?

Если говорить о C++, то, судя по отзывам, дальше надо браться за Скотта Майерса, Герба Саттера и Андрея Александреску. Вообщем, думаю, скучать не придется. :)


Пожелания

Если вам есть что добавить в данный список (книг, статей, сайтов), или у вас есть какие-то советы с высоты вашего опыта - буду вам очень рад в комментариях.
Читать полностью...

воскресенье, 18 января 2009 г.

QGtkStyle - заставляем Qt4 приложения использовать оформление GTK

Оказывается, можно заставить Qt (>= 4.4) приложения выглядеть так же, как и GTK, причем сделать для этого нужно совсем немного:

svn co svn://labs.trolltech.com/svn/styles/gtkstyle
cd gtkstyle/
qmake-qt4 && make
sudo make install
Далее запускаем, к примеру, systemsettings и выбираем в Appearance->Style стиль GTK.

В результате Qt4 приложения примут примерно следующий вид:


Читать полностью...

четверг, 15 января 2009 г.

Интересный способ передачи файлов с одного компьютера на другой

Вот за что я всегда любил Linux, так это за то, что он предоставляет возможность решать возникающие задачи невообразимым количеством различных и зачастую очень интересных способов. Я понимаю, что не открыл ничего нового, наверняка данный способ многим известен (особенно среди системных администраторов), но я почему-то о нем ни разу не слышал.

Недавно мне потребовалось передать по локальной сети репозиторий Ubuntu 8.10 с одного компьютера на другой. 44000 файлов и папок - это довольно много. Заливать их, к примеру, по FTP - очень долго, т. к. для каждого файла будет открываться новое соединение. scp и rsync тоже, насколько я знаю, довольно медленно работают с большим количеством файлов.

И я уже начал запаковывать его в tar архив, чтобы передать по FTP, как вспомнил, что есть такая вещь как netcat. Раньше я им никогда не пользовался - просто где-то слышал о нем и запомнил о его существовании, т. к. он может очень пригодиться при написании скриптов.

Открыл man, почитал и запустил на одной машине команду

nc -q0 -l -p 6000 | tar -x
а на другой
tar -c Ubuntu.8.10.i386.repository | nc -q0 192.168.0.1 6000

Все! Файлы потекли бурным потоком с одной машины на другую.

Кстати, кроме красоты реализации и скорости работы он также имеет следующие преимущества перед остальными способами (FTP, scp, rsync):
  • Нет необходимости держать постоянно запущенный демон (FTP, SSH);
  • tar и netcat по умолчанию ставятся, наверное, практически во всех дистрибутивах, так что данный метод можно использовать "из коробки";
  • Если вы передаете, например, дерево исходников, которые очень хорошо сжимаются, то можно добавить к опциям tar флаг -z или -j, в результате чего передаваемые данные будут сжиматься на лету (ну ни красота ли? :) ), что может быть актуально, к примеру, при передаче файлов через Интернет.

Читать полностью...

суббота, 3 января 2009 г.

Flush - еще один GTK-based BitTorrent клиент

Вступление

Единственный BitTorrent клиент под Linux, который пришелся мне по душе - это KTorrent. Не скажу, что он меня полностью устраивал, но при его использовании я не испытывал особых неудобств.

Хотя некоторого функционала мне в нем все же не хватало. Что-то я реализовал скриптами, что-то продолжал делать руками... Вообщем нужного мне уровня автоматизма, которого я пытаюсь добиться со всеми приложениями, которые использую более или менее регулярно, и которые время от времени требуют выполнения каких-либо рутинных операций, мне достичь не удалось.

На самом деле мне не так уж и много надо. Мне не нужен огромный комбайн, который умеет, например, читать RSS, поддерживать надстройки в виде плагинов и т. п.

Попробую объяснить, что мне нужно от BitTorrent клиента, и зачем мне это нужно...

Вот, к примеру, на некоторых трекерах стоит ограничение на максимальное количество торрентов, которые вы раздаете. При превышении лимита вам грозят баном или прочими видами ограничений. Даже если банить вас никто не собирается, то все равно правила нарушать не стоит хотя бы из соображений взаимного уважения, но вручную отслеживать количество раздаваемых торрентов - довольно утомительное занятие. Почему бы не возложить эту работу на BitTorrent клиент?

Далее. Если уж говорить обо мне, то у меня все устроено следующим образом: есть старый диск на 160 Гб, на котором у меня хранятся зеркала репозиториев и скачанные торренты, т. е. наиболее часто изменяемые данные. Не смотря на то, что скачивание торрентов из локальной сети требует очень активной работы с диском, система не тормозит, т. к. находится на другом диске + если из-за сильного износа скачиванием и раздачей торрентов диск выйдет из строя, то никакие ценные данные не потеряются - только торренты и зеркала репозиториев, которые всегда можно скачать заново.

Так вот. Опять-таки правило хорошего тона при использовании peer-to-peer сетей гласит: скачал файл - не уходи с раздачи, дай скачать другим. Тут я предпочитаю следующую схему: при открытии BitTorrent клиентом *.torrent файла, файлы торрента скачиваются на тот самый старый диск. По завершении скачивания всех файлов они копируются в специальную директорию типа "Посмотреть в свободное время", в которой они будут лежать бесконечно долгое время, пока я их не посмотрю и не удалю. Раздача же торрента продолжается с моего старого диска, работа с которым, напомню еще раз, практически не замедляет работу системы. Как только время раздачи торрента превысит, к примеру, неделю, его раздача прекращается и он удаляется с диска.

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

Ну и, конечно же, необходима возможность контролировать максимальную скорость скачивания/отдачи в зависимости от времени суток, т. к., к примеру, у моего провайдера ночью скорость скачивания и отдачи увеличивается в 2 раза. Самый удобный, на мой взгляд, способ такого контроля - запуск при помощи cron'а какой-нибудь программы, которая будет передавать указанные опции командной строки уже запущенной копии.

Кроме этого, хотелось бы, чтобы клиент был написан на GTK, т. к. KTorrent - это единственное Qt приложение, которое я использую в повседневной работе - зачем же в таком случае постоянно держать в памяти различные Qt/KDE библиотеки?

На работе, в силу ее специфики, я программирую только на C, поэтому получать опыт программирования на других языках и изучать далекие от специфики работы технологии с целью повышения квалификации приходится дома. :) В итоге, как и в случае с PyVSB, неудовлетворенность имеющимися средствами и желание попрограммировать на C++ параллельно с чтением "Язык программирования C++" Б. Страуструпа сподвигли меня на написание собственного торрент клиента.


Знакомьтесь, Flush

Основные возможности:

  • Контролирование уже запущенной копии через интерфейс командной строки, а именно:
    • Запуск/остановка торрентов.
    • Изменение максимальной скорости скачивания/раздачи.
    • Изменение максимального количества соединений.
  • Запуск нескольких копий с различными конфигурационными файлами.
  • Автоматическое копирование скачанных торрентов в указанную директорию.
  • Автоматическое удаление старых торрентов.

Flush использует библиотеку libtorrent от Rasterbar Software.


Скриншоты:






Отговорки, отказ от ответственности и прочее

Как уже было сказано выше, Flush писался исключительно для того, чтобы "написать что-нибудь на C++", поэтому возгласы типа "зачем еще один велосипед?" не имеют смысла.

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

libtorrent-rasterbar-0.14 я пока не поддерживаю - в ней довольно сильно изменился API по сравнению с 0.13, и внести изменения в код я пока не успел.

Да, и самое главное: никакой гарантии, что Flush будет активно поддерживаться и развиваться я не даю. :)


Где скачать?

Естественно, эту статью я написал не просто так. Если мне потребовался такой BitTorrent клиент, то наверняка он также придется по душе и кому-то другому, чему я буду очень рад. Несмотря на существующие недостатки и недоработки, я Flush'ем вполне доволен и KTorrent'ом больше не пользуюсь.

Исходники и deb пакеты для Ubuntu-8.10-i386 и Ubuntu-8.10-x86-64 можно скачать здесь:
http://sourceforge.net/projects/flush/
Читать полностью...