GrandTorrino или второе дыхание Torrero
пост написан и отправлен в печать 2011-05-29 примерно в 15:01
Малопонятный заголовок, согласен, но позвольте мне объясниться: когда-то в прошлом, будучи под воздействием опиатов или каких-то других тяжелых наркотиков, позволяющих мне почувствовать себя чуточку счастливее, я сделал проигрыватель видеофайлов, распространяемых по пиринговым сетям протокола torrent без необходимости их полной загрузки. В двух словах, ждете 10% подгрузки и потом смотрите себе киношку без необходимости ожидания загрузки остального, вполне удобно, особенно для всяких там сериалов. Но, как и всё, что я делаю бесплатно и под воздействием галюциногенов и эйфоретиков, работало это из рук вон хуйово -  были проблемы с линейным алгоритмом загрузки, когда миниатюрные куски по 1-5 килобайт выпадали из piecepicking query, а декодер плеера на этом захлебывался за милую душу. Были проблемы с mplayer-ом, который очень нехотя цеплялся через hid windows forms компонента. Но, как ни странно, нашлись и дорчитатели этого бложика, которым очень даже понравилось. И вот они начали забрасывать меня багрепортами, мол не работают сабтитры, нельзя выбрать звуковую дорожку, нельзя выбрать, какой именно файл из торрента смотреть. На все это я отвечал, что удивительно, что оно вообще работает, любезно предлагая предоставить исходники. Но, увы, энтузиастов, готовых хоть сколько-то помочь в разработке, в наличии не оказалось, а письма все продолжали капать и капать - давать дельные советы, как известно, это вам не мешки ворочать. Ну теперь можно все вышеперечисленное, короче говоря. Открываю вам страшную тайну, для себя месяца 2-3 тому назад я написал отдельную версию, так сказать, исправленное и облегченное издание, лишенное большинства недостатков оригинала. И даже основного - ужасное GUI было начисто заменено ламповым черным консольным окном. К тому же, был полностью переписан алгоритм загрузки, он работает чуточку медленнее по причине необходимости подтягивать куски последовательно, зато файлы не ломает и позволяет даже использовать перемотку в пределах загруженного отрезка видео файла (все еще в экспериментальном режиме, как я не пытался сделать byte by byte, все равно идет разбивка на куски и параллельная загрузка, в этом весь битторрент). Называется эта версия GrandTorrino и, билдани я эту версию году так в 2007, всем мог бы говорить, что фильм Клинта Иствуда назван именно в честь нее. Но, кажись, все наоборот. Использование очень простое - drag and drop torrent файл на exe-шник GrandTorrino, ждем 10% буферизации и готово. Если в торренте 1 файл - все пройдет само собой, если больше 1го - вас спросят, какой именно вы хотели бы посмотреть. Все хоткеи для mplayer можно узнать в прилагаемом файле mplayer.html, они немного необычные. Скачать последнюю версию можно тут. Для работы необходим .net framework 3.5, и запас алчности, позволяющий вам воровать чеcтно заработанные деньги из дырявого кармана нищих правообладателей. 

А теперь, давайте по сути. Мне очень нравятся подобная идея - нарушение авторских прав без ожидания и очень печалит факт отсутствия нормальной реализации. Нет, конечно моя версия работает и с поставленной задачей справляется, но хотелось бы чего-то большего, интуитивно-удобного и приятного, а у меня для для такого не хватает ни знаний, ни времени, ни мотивации - работает же и сейчас, зачем мне что-то большое? Так вот, я отдам все исходники по запросу на email или в скайп, указанный в заголовке этого блога. Вы сможете делать с ними все, что душа пожелает - продавайте, воруйте, убивайте, делайте стартап, но я всегда должен буду иметь доступ к исходникам, природное любопытство и все дела. Написано все на C#, код конечно не ахти какой, но я постараюсь все приаккуратить к передаче, чтобы стыдно не было моим стареньким учителям информатики, которых у меня конечно же не было. В качестве проверки, что вы не какой-то хер с горы, вам нужно будет показать технику гроула рассказать, как можно рассчитать необходимый процент буферизации, имея скорость загрузки за последние 10 секунд, вес файла и его аудио-видео битрейт и как определить, что проигрывание идет быстрее скачивания файла с помощью стандартного mplayer вывода. А вообще, шучу конечно. Без проблем вышлю и так + модифицированную библиотеку MonoTorrent в довесок. Спасибопожалуйста.

Пишем свой caching nameserver с фильтрацией
пост написан и отправлен в печать 2011-04-09 примерно в 10:58
Прежде чем начинать свое повествование, маленькое сообщение для всех, кто прочитал топик поста и закачал убеленной сединой\лысиной головой с неприкрытым укором: да, я знаю о существовании BIND и да, я знаю про MySQL BIND SDB, или даже про MyDNS тоже слышал, и настроить кеширующий child неймсервер умею. Увы, реализация такой комбинации не виделась мне целесообразной по ряду причин о которых я не буду тут писать. В любом случае, мне нужно было сделать DNS с фильтрацией определенных доменных имен с хранением списка этих имен на центральном сервере в MySQL базе данных. Нужно было сделать его не намного медленней родного варианта, что было вполне нетривиальной задачей. Думаю, что для начала мне стоит объяснить, зачем это все задумывалось. Как упоминалось в прошлом посте, я работаю в компании основным направление деятельности которой является предоставление сервиса защищенного VPN туннеля для обхода корпоративных фаерволов, шифрования трафика, защиты от man-in-the-middle и прочих мерзких снифферов, получения своего личного реального IP где-то в странах экваториальной Америки, ну и для защиты от вирусов с помощью решений от тов. Касперского. В качестве серверных площадок используются разнообразные virtual dedicated и root dedicated от разных провайдеров по всему миру. И вот тут возникает основная проблема, которая загубила большинство подобных сервисов - торренты. Да, в большинстве TOS-ов большинства хостеров ясно прописано, что если с вашего сервера будет замечена подозрительная активность по загрузке из интернета нелегального контента, то вы автоматически лишаетесь предоставляемой услуги без какой-либо надежды на материальное возмещение. Звучит достаточно печально, учитывая предоплату на целый год. В итоге, часто получаешь подобные письма, рассылаемые полуавтоматическими системами правозащитных ищеек, что не добавляет хорошего настроения в твой и так не особо веселый рабочий день. Каким образом они отслеживают попытку скачивания торрента? Fake Seed к примеру? Или просто фильтруют запросы к торрент трекерам? Я без понятия, но вот если правильным образом не среагировать на подобное письмо, убедив хостера, что этот мудак, качающий Спанжбоба, физически устранен, а вся его семья стерилизована - можно получить серьезные проблемы. Вплоть даже до судебного разбирательства, все мы новости читаем. Это проблема, теперь поговорим о решении. Любой системный администратор скажет вам, что не существует оптимального решения перекрытия кислорода p2p трафику. Да, можно ограничивать количество udp сессий одного хоста (что достаточно глупое решение, учитывая саму природу протокола с неявным закрытием соединения), можно вообще закрыть udp (что еще глупее, одним махом лишаем пользователя всяких скайпов\сипов, а торрент клиенты могут спокойно и через TCP работать), можно использовать всякие модули фильтрации уровня iptables вроде ipp2p, OpenDPI, l7-filter (на сайте пишут про высокий perfomance, но у меня la вскакивал до 1 при 10 соединениях и иногда всплывали defunct зомби) или вообще пускать весь трафик OpenVPN  в лоб через фильтрующий прокси сервер (мною было опробовано все из списка, увы, все решения крайне требовательны к системным ресурсами из-за необходимости прочесывания регулярками большого потока данных и по этой причине не подошли, не все сервера в сети могли позволить себе такую роскошь). Есть еще решения для дураков: закрытие типичных портов, что не работает в условиях современных клиентов и тот вариант, который выбрал я - DNS блокировка главных торрент трекеров. Защита ужасная, ничто не мешает клиенту после подключения выставить вместо присваиваемого неймсервера какой-то другой, данное решение к тому же не помогает, если пользователь начал скачивание торрента до подключения к нашему VPN-у (хотя моя практика показывает, что в таких случаях правозащитные ищейки молчат, что еще раз служит подтверждением конспирологической теории, что софт копирайтеров просто отслеживает announce запросы к трекерам), и конечно же данный вариант не спасает от DHT, которому вообще ничего не нужно: ни трекеры, ни днсы. Но работает же, количество писем от правообладателей сократилось до 1-2х за 3 месяца, возвращаем NXDOMAIN для всех доменных имен в блеклисте и живем припеваючи. Кстати, если кто имеет идеи, как побороть bittorrent в сети - скиньте мне хоть пару строк на mail@smirnoff.sumy.ua, чтоб я примерно знал, куда копать. С меня благодарности в приемном для вас эквиваленте.

Возвращаемся к теме реализации. Прежде всего, отвечаю на вопрос: зачем мне нужно много неймсерверов, а не один центральный без всех этих заморочек с MySQL и т.д. В качестве master мы будем использовать Google Public DNS, на нем был замечен load balancing для некоторых крупных сайтов, на запрос по тому же ютубу с разных географических точек отдавались разные A-записи. К тому же, проводить NS query с гонконгского сервера через туннель на центральный сервер где-то в Люксембурге или США - очень медленно, поэтому наши DNS-ы будут отвечать по тому же адресу, что и шлюз. Языком реализации стал Perl. Почему? Да просто в нем есть все необходимые нам компоненты. Использовать мы будем Net::DNS для резолвера и Net::DNS::Nameserver для сервера. Разумеется, без кеширования никуда. В качестве решения я советую смотреть в сторону Cache::Bounded, которое является по сути оберткой вокруг Cache::MemoryCache с оптимизацией и обнулением кеша по достижению определенного размера, что спасет нас от переполнения памяти. В результате получилось что-то вроде такого кода. Сразу замечу, что 3 цикла for при чтении ответа из кеша - необъяснимая мною мистика. Казалось бы с помощью тех же элементов исходного массива путем перебора формируем новый, а вот простое присваивание - не работает. И хоть ты тресни. По скорости вполне нормально, первый запрос конечно отнимает определенное время, но в дальнейшем из кеша в памяти все читается очень быстро. В качестве бонуса, держите список из 1800 самых крупных торрент трекеров для блокировки.

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

Мой бог, они украли мое MOHO
пост написан и отправлен в печать 2011-01-07 примерно в 17:20
Меня почему-то считают сведущим в области кинематографа. Но нет, я не культурный кинокритик в очочках без оправы и с хорошими манерами, который может написать трехстраничную рецензию на фильм с сюжетом "эй, джонни, какой артхаусный фильм про говорящий пирог на фоне фиалкового водопада из пасти рыбы-осла мы будем смотреть сегодня на нашем черно белом говорящем космическом тостере с Девой Марией". Нет, я просто любитель нормального кино, обычного и казуального, ширпотреб, так сказать, кино, которое снимается для кассовых сборов, а не компенсации детских сексуальных травм режиссеров и сценаристов, простите. Почему так повелось - неизвестно, возможно, я постоянно рассказываю, какие дерьмовые фильмы снимают сейчас и какие отличные фильм снимали до этого. Возможно, все дело в моей футболке с вышитой руками моей мамы (не без помощи иголки и нитки) надписью "я блять знаю все про кино сука". Тут уж никто не разберет. Чего кривить душой - в этом блоге часто появлялись критические обзоры некоторых фильмов, чаще всего негативные, изобличающие российские усы от кинематографии в сладострастном уповании казенным золотом или излишнее увлечение православием на квадратный сантиметр кинопленки. Больше этого не будет, произошла балканизация (да простит меня бд, уж больно мне нравится мне это выражение) интересов. Встречайте MOHO или, если попроще, My Own Hubmble Opinion, Мое Личное Скромное Мнение, если на русский перевести, хотя как-то МЛСМ не звучит, ага. Ничего сверхъестественного: 0 дизайна, 0 функционала, блок высотой в 150px на рецензию и красный-зеленый цвет для обозначения впечатления. Для дальтоников есть RSS. Там все понятней. Позавчера забил свое МОХО начальными значениями из воспоминаний, в дальнейшем все обновления будут происходить в режиме реального времени - у меня есть клиент для мобильного телефона и планшета, рецензия появляется сразу же после окончания просмотра, таков я графоман.

Кому это нужно? Да ровным счетом никому. Я в очередной раз создал абсолютно ненужную вещь для успокоения души, у меня сейчас творческий кризис программиста, когда есть деньги, но нет работы, которая бы привлекала мое внимание и составляла какой-либо интерес (да-да, я ищу идеи, пиши мне, молодой парень с классной идеей, но без классного ее исполнителя). В каком-то смысле получился обычный дневник, который я смогу просматривать и оживлять воспоминания и переживания, испытываемые мной при просмотре, прочтении или прослушивании. Да, еще и это. Книги я тоже читаю, хотя в определенных кругах это уже тоже не считается модным, простите пацаны, я подвел вас. Ну и музыка, само собой. Таким образом, прошу меня простить за информационный шум. Нигде больше данная ссылка пиарится не будет, основной RSS загрязнятся не будет тем более, возможно кто-то сочтет за необходимость клацнуть курсором своей мыши на ссылку, сформировать свое столь важное объективное мнение и оставить его при себе. Или же выслать мне на электронную почту, указанную вам в шапке говорящей консервированной головой из футурамы. Такие дела, спасибо за внимание. Имей счастье ты и семья тоже твоя, человек, в новому году и счастливом рождестве.

Torrero Video Player
пост написан и отправлен в печать 2010-05-30 примерно в 12:59
Как-то раз наткнулся я на обсасываемый топик на хабре о софте под названием Torrent Stream. За пафосными фразочками "лучшие и зарекомендовавшие себя программные разработки авторитетных учреждений и команд разработчиков со всего мира и которому по функциональным и эксплуатационным возможностям, на сегодняшний день, нет равных в мире" скрывался легкоуловимый смысл: данное ПО давало возможность смотреть видео с торрентов не дожидаясь их полной загрузки. Как раз это мне и было нужно, вот только оказалось, что техническая реализация немного прихрамывает: все было реализовано в виде плагина к браузеру, все ужасно тормозило и файл с того же лостфильма и огромным количеством пиров слвался очень неспешно, переодически подвисая на "буферизацию". Вот поэтому я и написал свой плеер видео-файлов с торрента с цыганами и пасьянсом. Прошу любить и жаловать: Torrero Movie Stream Player. Ну или просто Torrero.

Кому лень читать дальше - большая ссылка скачать (с автообновлением и плюшками)

А для остальных, продолжим. Как всегда, сперва техническая часть. Написано приложение на С# и WinForms в Visual C# 2010 Express под .NET 3,5. Почему не WPF? Все очень просто, WPF контролсы не имеют своего собственного window handle, что было необходимо для встраивания mplayer-а в окно формы. Перепробывал сотни варинантов, но максимум что удалось получать, это handle окна, а нужен был hwnd панели или текстлейбла. Ну, вообщем, такая канитель. В качестве Torrent библиотеки был выбран велосипед MonoTorrent, который просто божественный. Поддержка на форуме и уровень возможностей позволяет писать все: начиная обычным парсером торрент файлов и заканчивая собственным трекером. Едиственная проблема, это практически полное отсутствие документации. Приходится копаться в исходниках, благо они отлично комментированны. Плеером был выбран MPlayer по следующим причинам: возможность встраивания без activex и прочих финтов ушами, как у VLC например, небольшой размер и встроенные декодеры, возможность проигрывания недокачанных файлов.

Парочка ответов на парочку вопросов. Все это будет бесплатно? Разумеется и даже opensource. Вот только второе будет чуть позднее, в настоящее время код ужасен, некоментирован и захламлен мусором. После парочки рефакторингов открою для анонимного доступа svn проекта. Почему Torrero, что это значит? Значит это производное от слова torero, матадор. Почему? Ну не знаю, хотелось присутствия в названии чего-то похожего на Torrent. Изначальная версия "torrantino", полученная объединением Torrent + Tarantion оказалась уже забита. Будет ли дальше развиваться проект, а что что-то все виснет и лагает? Да, разумеется, планов море. Это и переделать интерфейс, и сделать поддержку проигрывания нескольких файлов в торренте, и еще куча всего, вот только времени у меня в обрез, но в скорости появится отдельная страница, где можно будет смотреть change-лог, планы развития и узнавать об обновлениях.

Если вы нашли ошибку или хотите получить исходники немедленно, пишите мне в твиттер @middlesizetit либо же на почту mail@smirnoff.sumy.ua. Обязательно отвечу всем желающим.

Сайт honcharov.net
пост написан и отправлен в печать 2010-05-18 примерно в 10:19
Совсем забыл, на правах наглой, безоговорочной рекламы и самопиара, хочу дать вам ссылку на сайт honcharov.net. Сайт отличного чувака, а по совместительству, еще и отличного фотографа Дмитрия Гончарова. От начала и до конца (сайт, не Дима) сделан мной в рекордно сжатые сроки без ограничений по времени разработки на основе jquery + css3 и предназначен для просмотра на диагоналях 19 дюймов и выше. Нет, разумеется посмотреть можно и в Opera Mobile, и все даже работать будет, но это не то. Вот чуть ниже сайт открыт на 42" плазмы панасониковской. Фотография, конечно, все впечатления не передаст, но сама идея скрола больших картинок в фоне для сайта-портфолио фотографа мне кажется вполне удачной: можно рассмотреть мельчайшие огрешности работы визажистов, стилистов и самого фотографа :) Ах да, фоток в бекграунде аж 7 штук, выбираются случайно - есть повод поклацать F5.

В первоначальном варианте сайт выглядел намного круче из-за моего околоманиакального увлечения драфтами css3 в виде transform scale и rotate, border-radius, box-shadow, background rgb и прочих плюшек, но потом я посмотрел на это все не в webkit-овских chrome или safari, которые являются в настоящее время двумя моими основными браузерами, а на обычных пацанских интернет-смотрелках IE, Opera и Firefox последних версий. И если в огнелисе версии 3,7 более-менее работало, хотя и тормозило безбожно, то в первых двух обрубках все выглядело у-жа-с-но. Пришлось еще пару дней потратить на приведение к нормальному адекватному внешнему виду и скорости работы. Вот в такие моменты думаешь, кстати, что монополия в сфере браузеров это не так уж и плохо, особенно когда пытаешься скормить IE7 "a"-ссылку со стилем inline-block, а таких примеров over 9000. Ну и если бы еще W3C шевелился быстрее, превратив черновик в стандарт - вообще отлично было. Может даже бы краснознаменная опера подтянулась. Но это так, мечты-мечты.

На самом деле, я сейчас уже не занимаюсь разработкой сайтов на постоянной коммерческой основе. Если у вас есть какая-либо интересная идея или уникальный концепт на бумаге - пишите мне, помогу реализовать в вебе за "спасибо" или же за коньяк Бучач (5 звезд, возможны варианты Закарпатский, Alexx) в таре 0,5 литра, если это действительно будет интересно и при условии, что меня никто не будет ограничивать, как рамками ТЗ, так и временными лимитами. А вот еще один пример моей работы, я - классный.