среда, 11 ноября 2009 г.

Все гениальное просто

Решил рассказать, как на своем опыте столкнулся с верностью этого высказывания.

Шел 2002 год. Первый курс университета.  В городе рассвет компьютерных клубов. Для одного из которых я написал программу, для управления и учета средств. Первая моя более менее серьёзная программа, испытываемая в таких масштабах. Но как ни странно все вроде бы работало.
Все хорошо, все замечательно. Но приходит день X . Рядовому игроку мало игр по локалке. Нужен доступ в интернет и игры по интернету. Как раз появился Warcraft 3, и битвы на Battle.net завладели умами игроков.
Начальством поставлена задача  - реализовать в программе возможность подсчета и блокировки интернет-трафика.
В тот период, программ для компьютерных клубов, которые продавались в интернете, было не так много. А уж считающих трафик - одна/две. Те что работали с трафиком, реализовали это через работу с сервером на linux. Он считал и блокировал интернет. Для меня же Linux тогда был  священной коровой. Программировать под него даже и мысли не было. Нужно было найти решение под Windows ( в тот момент Windows 98).

Поиски в интернете приводили только к одному - надо писать драйвер для Windows. На этом фоне перспектива использования Linux ,  была более радужной. Но в итоге, половину задачи удалось решить с помощью драйвера WinPCap. Он как раз таки позволял считать трафик на локальной машине. Нашлись и примеры использования его на Delphi. Использование его показало, что считает примерно правильно, не учитывая видимо некоторый служебный трафик. Но такого результата было достаточно.

Подсчет подсчетом, а блокировать трафик надо. Попалась на глаза следующая идея. Можно получить список открытых сетевых сессий, как программа netstat, а потом каждое соединение убить. Все это делать в цикле, т.к. новые соединения появлялись периодически. Был найден пример кода, и реализовано в программе. Радость была безмерной, работало, считало, блокировало... но не все блокировало. Например, в Counter-Strike можно было играть вечно. Трафик не блокировался. Оказывается UDP пакеты не блокировались моим методом. Облом был сильным. Всяко пробовал, но трафик не блокировался.

Не помню уже как мне пришла эта мысль,  решение было очень простым и действенным. Нужно было просто посмотреть как работает сеть. Чтобы попасть в интернет, пакеты должны попасть на шлюз. А если шлюза нет - нет и интернета. ЭВРИКА!!! Просто удаляем шлюз по умолчанию и интернета нет. Добавляем шлюз - интернет есть. За это отвечает команда 
route delete
и 
route add
Все работало как часы.

Казалось бы, задача реально сложная, а решается в пару строк кода. Возможно решение покажется корявым, но оно работало. Кстати, даже на современных ОС оно будет работать.

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

Проблемы с SVN

Столкнулся недавно с одной проблемой в моём svn репозитарии. Точнее  проблема была давно , а я обратил на неё внимание вот только что. Пытался просмотреть с помощью черепахи лог изменений в репозитарии, а он выдавал список ревизий, но без дат и описаний. Причем проблема возникала только на приватном репозитарии, а на публичном, там где colorer_se - все нормально.

В итоге появилась такая вот запись номером 3516 в баг-трекере Subversion. Если на русском, то суть вот в чем.
Имеем svn сервер с sasl. В нем два различных репозитария, один публичный, другой закрытый. Отличаются они записями в файле authz. Для публичного
[/]
*= r
master=rw
Для приватного  
[/]
*=
master=rw
Т.е. если ты не прошел аутентификацию , то тебе ничего нельзя.
Пробуем посмотреть лог обоих репозитариев. Для публичного он будет такой (это вывод в консоль, так что все нормально) 
r10 | sonar | 2009-03-16 09:21:53 +0300 (Mon, 16 Mar 2009) | 1 line

?\209?\131?\208?​180?\208?\176?\2​08?\187?\208?\181​?\208?\189?\209?​139 ?\208?
\191?\209?​128?\208?\190?\2​08?\181?\208?\186​?\209?\130?\209?​139 ?\208?\180?
\208?\187?\209?\143 ?\208?\188?\208?​184?\208?\179?\2​09?\128?\208?\176​?\209?
\134?\208?​184?\208?\184 ?\209?\129 ?\208?\190?\209?​135?\208?\181?\2​08?\189?
\209?\140​ ?\209?\129?\209?​130?\208?\176?\2​09?\128?\208?\190​?\208?\185 ?\208?
\178?\208?​181?\209?\128?\2​09?\129?\208?\184​?\208?\184 ?\208?\189?\208?\176 ?
\208?\189?\208?​190?\208?\178?\2​09?\131?\209?\142​.
--------------------​--------------------​--------------------​------------
r9 | sonar | 2009-03-16 09:06:05 +0300 (Mon, 16 Mar 2009) | 1 line

?\208?\161?\208?​190?\209?\133?\2​09?\128?\208?\176​?\208?\189?\208?​181?\208?
\189?\2​08?\184?\208?\181​ ?\208?\178?\208?​181?\209?\128?\2​09?\129?\208?\184​?
\208?\184 0.9
--------------------​--------------------​--------------------​------------
Тут мы видим и дату , и пользователя, и сообщение ревизии. Для приватного вывод будет следующим 
--------------------​--------------------​--------------------​------------
r10 | (no author) | (no date) | 1 line

--------------------​--------------------​--------------------​------------
r9 | (no author) | (no date) | 1 line

--------------------​--------------------​--------------------​------------
r8 | (no author) | (no date) | 1 line
Тут мы видим "ничего".

Может возникнуть мнение, что ошибка в самом хранилище. Но я объясняю на двух разных для наглядности. Тоже самое будет, если для публичного отредактировать файл authz  как у приватного. Следующий возникающий вопрос - а ты то под тем логином/паролем заходишь? Специально проверил такой командой 
svn log svn://address --username master --password pass
Результат прежний.

В итоге напрашивается такое объяснение. Команда log  не использует логин/пароль для чтения данных, а ломится на сервер под anonymous.

Будем надеяться, что исправят эту ошибку, либо укажут что я делаю не правильно. Жаль только, что аж с 27 октября к багу ни одного комментария.

понедельник, 31 августа 2009 г.

ООП и я

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

Найти бы какую идейку программки, в которой бы ооп можно было бы использовать. Да так чтоб затянуло. Но пока идей ноль. А работа начинает доставать. Не приносит того удовольствия, что по началу. И искать в основной работе такую идею вообще нет смысла.

четверг, 20 августа 2009 г.

Баг Оперы и TineMCE 3.2.4 в WordPress

Пока писал предыдущий пост заметил следующую багу. Если в окне редактора в начале строки стоят пробелы или табы, то при сохранении поста эти символы в начале строк удаляются. Воспроизводится в Opera 9.64 и 10 beta 3 . В IE8 все отлично.
Думал запостить в багрепорт TineMCE , но у них на тестовой странице с TineMCE 3.2.5 из под оперы все нормально работает. То ли они это исправили (явно в ченджлоге не видно), толи это бага WordPress. Но блин я вчера из-за этого убил 4 часа времени. Проверил предыдущие свои посты, там тоже самое  - форматирование сбивается.

среда, 19 августа 2009 г.

Скелет службы (service) на Visual C++

Потребовалось мне написать службу, он же сервис, для Windows. Как показали поиски в интернете, самой используемой статьёй по этой теме оказалась Beginner's introductory guide to writing, installing, starting, stopping NT services аж 2001 года. В ней приводится скелет простой работующей службы. Этот скелет я встретил в нескольких широкоиспользуемых opensource программах, например FileZilla . Код рабочий, но есть в нем несколько моментов, которые не устраивают.

1. Управление службой идет из сторонних программ. Т.е. чтобы запустить или остановить службу, нужна дополнительная утилита.
2. Нет вывода произошедших ошибок.
3. Некоторые, найденые пользователями, ошибки. Ну даже не ошибки. Один момент проявился с выходом Windows XP. Другой момент - вызов своего потока до отправки команды "я работаю" проявляется редко. И то не понятно почему. Так что в мсдн появилась рекомендация поменять порядок вызова.
4. Во многих источниках, в том числе и в мсдн, приведен следующий код запуска программы ( не дословно, но по смылсу одинаков)
void __cdecl _tmain(int argc, TCHAR *argv[])
{
// If command-line parameter is "install", install the service.
// Otherwise, the service is probably being started by the SCM.

  if( lstrcmpi( argv[1], TEXT("install")) == 0 )
  {
    SvcInstall();
    return;
  }

// TO_DO: Add any additional services for the process to this table.
  SERVICE_TABLE_ENTRY DispatchTable[] =
  {
    { SVCNAME, (LPSERVICE_MAIN_FUNCTION) SvcMain },
    { NULL, NULL }
  };

// This call returns when the service has stopped.
// The process should simply terminate when the call returns.

  if (!StartServiceCtrlDispatcher( DispatchTable ))
  {
    SvcReportEvent(TEXT("StartServiceCtrlDispatcher"));
  }
}
Суть в том, что в мсдн не отображено, или плохо отображено, что служба должна стартовать только через service control manager. Т.е. если вы запустите этот код из консоли, то служба не запустится. Код ошибки ERROR_FAILED_SERVICE_CONTROLLER_CONNECT. Этот момент у меня вызвал продолжительные поиски. Я не мог понять почему у меня служба не запускается. Как показал поиск в  интернете я не одинок. Службу нужно запускать либо через консоль администрирования либо в своей программе через функцию StartService. А вышепреведенный код расчитан, что программа будет запускаться через service control manager.

В итоге я поправил код. Что мы имеем:
  • программа обрабатывает команды -[start|stop|install|uninstall]
  • для стандартных часто встречающихся ошибок выводит понятное сообщение в консоль, для остальных - только код ошибки
  • выводится подсказка по параметрам программы
  • исправлены ошибки пункта 3

Кстати, в консоль выводятся только ошибки, возникающие при выполнении команд [start|stop|install|uninstall]. Т.к. они и подаются большей частью из консоли. В идеале, для остальных случаев, еще бы крикрутить функцию для записи ошибок (событий) в системный журнал. Но это, думаю, будет позже.

Работоспособность проверял на Windows XP и Windows 2003. В идеале проверить бы еще на Windows 2000, Vista, 2008 и 7. Исходник на VC++ 2008 service.zip. Тут только модуль, без файлов проекта.

понедельник, 17 августа 2009 г.

Зацепило

Прочитал на днях две цитаты. Зацепили ...

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

Вот ведь. Я ж взрослею  :lol: . Со мной такое бывает раз в неделю. Ну коммент мой конечно не опровеграет все остальные, но вносит какую то ясность. И вот пишишь  его пишишь, а потом раз и удалил.
А еще бесит, что иногда тоже развернешь пост на форуе свой, распишишь. А после твоего поста тишина. Вообще никто ничего не пишит, ни мне в ответ, ни дальше в тему. И происходит это на разных ресурсах. Тут напрашивается вывод, что я тормоз , пишу в темах когдак ним пропадает интерес у народа.

Вторая цитата

Hаpодная пpимета: Если пpогpаммист в pабочее вpемя игpает, значит — либо у него мало pаботы и большая заpплата, либо у него много pаботы и маленькая заpплата. (C) взято с http://pankratov.org.ua/it/dev-play

актуальна она что то в кризис. В общем зацепило, задело.

вторник, 11 августа 2009 г.

Дела, заботы и маленький праздник

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

Сделал к своему небольшому празднику, сегодня кстати мне четверть века исполнилось, подарок. Именной домен и почту. Открою маленькую тайну - зовут меня Добрунов Алексей. Ну и почта соответственно aleksey щенок dobrunov . Мелочь вроде, а приятно. Еще родне в этом домене почту сделать для приличия надо. Почту как и dobrih.net перенес с хостинга  на gmail. И управлять удобнее, и ограничений почти нет, и работает быстрее. В общем одни плюсы.

Ну и само собой блог. Настало время обновится. И вордпресс дорос до следующей стабильной версии, да и тема оформления меня честно говоря запарила. уж очень тяжелая и некрасивая. Пришлось пожертвовать удачным по-моему логотипом, и перейти на другую тему. Лучше выглядит, ни такая громоздкая. Заодно решил уйти от плагина wp-synhighlight, о котором упоминал ранее. Долго он не обновлялся, и не работали нужные вещи. Перешел на  CodeColorer . То что меня раздражало в предыдущем тут было нормально. Вчера правда получил письмо от автора wp-synhighlight, о том что он поправил многие вещи что просили. Просит протестировать поглядеть. Блин вот ведь сейчас делема то.
Кстати, во время настройки выяснился один факт - wordpress не очень хорошо работает с списками (нумерованный или маркированный). При форматировании может добавить лишний закрывающий тег. Вот описание проблемы.
Поставил еще антиспам плагин WP Captcha Free. Счас в радостном недоумении. Спама вообще не стало. Раньше в день  по 20 сообщений было. Akismet отметал из, но они были. А счас вообще тишина.

А в остальном вроде все постарому. Машина так же мозги и руки мои мучает. Достало блин. Раньше терпимее к ней был. А сейчас желание ходить пешком все больше проявляется. Порой мечтаешь  о велосипеде. На работу на велосипеде, обратно также. По делам на нем же. Так ведь блин, работа в 40 км от дома, погода не айс. Да и с ним бывают проблемы.

Недавно решил отвлечься от всего, почитал новую книгу Лукъяненко - Недотепа. Как оказалось - сказка.  Наверное для детей своих писал. В целом не плохо, для сказки. Для 6-9 летних детей. Но взрослым читать наверное не надо. Найти бы чего то типо "Звезды Холодные игрушки" или "Линия Грез". А уж если бы что то похожее на "Лабиринт отражений" ну просто шикарно бы было. Хотя сам понимаю, что написать что то похожее на лабиринты врятли получится.Получится, но будет не то. Не ново, похоже на все эти онлайн игры. Кстати, отличнейшая пародия на ситуацию вокруг онлайн игр показали в Южном парке ( South Park) еще аж в 2004 году.  Серия из разряда  "я уржался".