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

PEP-374

Сегодня GvR объявил о том, что python переходит на mercurial. По ссылке неплохой обзор трех DVCS и SVN.

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

Unit тестирование и boost::asio

Как известно, одно из главных требований к модульным тестам, это повторяемость. Очень сложно искать ошибку, которая воспроизводится через раз. А с кодом, использующим асинхронный ввод вывод, все обычно так и обстоит, как как обработчики различных событий, обычно, выполняются в неопределенном порядке, к тому-же из разных потоков. Но, если вы используете boost::asio, то все не так плохо. Эта библиотека спроектирована так, что-бы её можно было легко испоьзовать в модульных тестах. Представим, что у нас есть два класса, клиент и сервер, оба используют boost::asio для асинхронного IO. Для того, что-бы написать для них тест, нам нужно создать два io_service-a, так-как в они будут работать независимо. Далее, мы можем вызывать различные функции, которые начинают асинхронные операции, например запись данных в сокет, или ожидание подключения клиента. Но, вместо того, что-бы вызывать метод io_service::run, мы можем вызвать метод io_service::run_one, который выполняет обработчик только одного события. Благодаря этому, асинхронный код можно превратить в линейный и протестировать таким образом логику наших классов.
TEST(MyTest, test_async_connect)
{
    boost::io_service client_io, server_io;

    my_client client(client_io);
    my_server server(server_io);
    
    EXPECT_FALSE(client.connected());//connected возвращает false, если клиент не подключен к серверу
    EXPECT_EQ(server.clients_count(), 0);//к серверу не подключен ни один клиент
    server.start_accept();//начинаем принимать подключения
    client.async_connect("localhost", my_port);//метод async_connect, 
    //начинает асинхронную операцию подключения к серверу,
    //в коде my_client, это может быть реализовано примерно так:
    //  boost::asio::async_connect(thsi->socket_, &my_client::on_connect);
    //естественно, метод on_connect, должен изменить состояние клиента
    server_io.run_one();//во время этого вызова, сервер дожен принять подключение,
    //обработать сообветствующее событие и изменить свое состояние
    EXPECT_EQ(server.clients_count(), 1);//теперь клиент подключен к серверу
    EXPECT_FALSE(client.connected());//но сам еще не знает об этом
    client_io.run_one();//что-бы он об этом узнал, нужно что-бы выполнился обработчик собыитя on_connect
    EXPECT_TRUE(client.connected());//done
}

среда, 11 марта 2009 г.

Вдогонку к предыдущему посту. Помимо того, что существует масса заблуждений относительно того, как нужно выполнять те или иные упражнения, которые пришли главным образом из бодибилдинга и возможно фитнеса, есть еще заблуждения относительно того как нужно тренироваться. Самое распространенное, появилось благодаря Стюарту Мак Роберту и его книгам "Думай!" и "Думай 2". Его суть в том, что якобы существуют более отзывчивые к тренировочным нагрузкам люди(и их очень мало) и менее отзывчивые(хардгейнеры). И тренироваться они должны по разному. Так-же благодаря этим(и не только этим) книгам большинство посетителей различных тренажерных залов знают о таком явлении как перетренированность. В результате, мы имеем множество людей считающих себя хардгейнерами, хотя настоящих хардгейнеров так-же мало как и сверх-одаренных людей. Из за страха перетренироваться они работают недостаточно интенсивно, покупают всякие пищевые добавки и тд... Результаты у них естественно не улучшаются, что еще сильнее укрепляет их уверенность в собственной ущербности. Хотя, на самом деле, большинство из этих ребят в принципе не могут перетренироваться так-как не умеют тренироваться достаточно интенсивно. Обычный человек, обремененный работой, семьей и разными делами не в состоянии настолько интенсивно тренироваться, что-бы заработать перетренированность. К тому-же в состоянии перетренированности нет ничего плохого, обычно это просто нарушение сна, которое быстро проходит, достаточно лишь уменьшить нагрузки. Единственный возможный путь к успеху - тяжелая работа в спортзале, которой еще нужно сначала научиться. =)

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

Этот пост не о программировании, но возможно он будет полезен тем из моих читателей, кто регулярно занимается спортом или еще только думает об этом. Я уже довольно давно занимаюсь пауэрлифтингом, как любитель, и меня очень часто ужасает то, что люди делают с собой в спортзале, а особенно те, у кого хватает смелости подойти к штанге. Каждый понедельник, среду и пятницу, я вижу как кто-нибудь гробит свои колени и позвоночник частичными приседаниями с огромным(для того кто это делает) весом, различные вариации жима лежа, опасные в разной степени для плеч, спины и коленей(вы не поверите, но и это возможно:), ну и естественно становые тяги, на которые я стараюсь просто не смотреть... Большая часть книг и журналов по бодибилдингу(за фитнес я не знаю, никогда не интересовался) на мой взгляд просто преступны, и это не гипербола... Например недавно я прочитал в одном журнале о том, что оказывается, во время приседаний со штангой нужно ставить ноги уже ширины плеч. На самом деле, при такой технике можно получить травму колена, либо какое-нибудь дегенеративное заболевание коленного сустава, к тому-же такое движение просто противоестественно. Далее там было написано о том, что нужно "добить" мышцы разгибанием ног на тренажере. На самом деле это просто смерть для коленных суставов, так как пять минут назад они работали на сжатие(в чем их основная ф-ия и состоит), а теперь работают на разрыв =) В общем, если есть желание потягать железо, найдите себе хорошего тренера, который вам поставит технику. На это стоит потратить время, оно потом окупится. Ну а если такой возможности нет, можно изучить технику и по книгам, но только не из серии "Бодибилдинг для чайников" и уж тем более не по журналам. Для изучения техники выполнения упражнений со штангой я бы порекомендовал книги Mark Rippetoe(как правильно написать по русски я не знаю:), например Starting Strength: A Simple and Practical Guide for Coaching Beginners.. В этой книге очень прдробно написано, почему то или иное упражнение нужно делать так, а не иначе. Прошу прощения за оффтоп и удачи вам в том, чем вы занимаетесь в вашем фитнес клубе :)