Palm Springs

Одна из характерных черт жизни в Штатах - это то, что все значительные события планируются на месяцы и годы вперед. В начале учебного года детям (а на самом деле - их родителям) выдается календарь расписанный на год вперед: каникулы, выходные, разные обязательные и не очень школьные мероприятия вроде Back to School Day также известный как “гоните ваши денежки”. Поездка в отпуск запланированная на полтора года вперед - норма. Записывать ребенка на Junior Lifeguard Program на следующее лето нужно в январе. Пропустил момент - жди следующего года.

Мы с женой привыкали к такому порядку вещей с большим трудом. Это как акцент. Теоретически, если поднапрячься, от него можно избавиться или, по крайней мере, сильно уменьшить. Это просто функция вложенного труда. Но ведь лень. Тут в спорт зал сходить себя еле-еле заставишь, а еще и на планирование на год вперед время тратить…

Read On →

Айда все на Луну

Ну что, BFR тихой сапой приближается к реальности. Пройденные этапы:

  • Основательно прожгли прототип двигателя.
  • Застолбили палатку с запчастями в порту Long Beach.
  • Предварительно просчитали посадку с правильной моделью атмосферы (что как мы знаем по опыту KSP is a big deal. Там, помнится, после очередного обновления модель атмосферы поменялась - половина ракет перестала нормально летать. Столько криков было…)
  • Обозначили предварительные цели - сразу к Марсу лететь сложно, а вот оттестироваться как следует вокруг Земли и Луны - сам бог велел.
  • Ну и самое главное - увеличился счет в банке. Т.е. деньги на дальнейшее движение есть.

Read On →

Отпуск. Окончание

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

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

Этот ящик, конечно, вис от жары постоянно. Но с другой стороны с его помощью я познакомился с Turbo Vision - культовой библиотекой для создания интерактивного интерфейса под DOS. Помнится я даже пытался добавить поддержку графики - в режиме 320x200 и 256 цветов конечно. Все шло довольно неплохо, пока я не наткнулся на код оптимальной отрисовки перекрывающихся окон. В этот момент я понял, что столько страниц ассемблерного кода я не потяну.

Пока пили чай зацепили тему поступления в вуз в Украине. Статистика удручает конечно. Я вот тоже не понимаю, на кой нужно столько филологов на фоне того, что такие специальности, как металлургия, материаловедение, атомная энергетика, авиационная и ракетно-космическая техника, судостроение и прочие набрали несколько сотен заявок в лучшем случае. А главное я не понимаю на кой идти на филолога вообще. Если все равно работать не по специальности, то должно быть все равно, что учить, а большинство “прикладных” специальностей потенциально оплачиваются выше. Учить популярные языки вроде английского все равно лучше и дешевле с репетитором. Это я по своему опыту сужу. Разве что если учить арабский и китайский одновременно?

Read On →

Полное погружение

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

:-)

Хмельницкий

Я сейчас в отпуске - в гостях у родителей. Получайте свежую порцию впечатлений от поездки в Украину.

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

В Амстердаме после выхода из самолета нас встретил поток воды, льющейся с потолка. Не иначе, как для усиления ощущения “приключения”. Половина пассажиров ускакала через лужи догонять свой следующий рейс. Оставшаяся половина побрела выяснять свои ближайшие планы уже никуда не торопясь. Я решил расположится у библиотеки - менять билет на поезд из Киева и предупредить что б меня не ждали. В аэропорту был приличный Wi-Fi, который пришелся очень кстати.

Read On →

Текстовые данные в юнит тестах

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

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

Как сделать код еще более понятным? К примеру, возьмем таблицу из предыдущего поста. Что с ней не так?

struct {
    int x;
    int y;
    std::string that_thing;
    std::string this_key;
    bool result;
} const cases[] = {
    {0, 0, "thing1", "key2", false},
    {0, 1, "thing1", "key2", false},
    {0, 2, "thing1", "key2", false},
    {0, 3, "thing1", "key1", true },
    {1, 0, "thing2", "key1", false},
    {1, 1, "thing2", "",     false},
    {1, 2, "thing2", "",     true },
    {2, 0, "",       "",     false},
    {2, 1, "",       "",     true },
    {2, 2, "",       "",     false},
};

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

Read On →

Табличные юнит тесты

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

bool foobar(int x, int y)
{
    return (x + y) > 0 && ((x + y) % 3) == 0;
}
ASSERT_FALSE(foobar(0, 0));
ASSERT_FALSE(foobar(0, 1));
ASSERT_FALSE(foobar(0, 2));
ASSERT_TRUE (foobar(0, 3));
ASSERT_FALSE(foobar(1, 0));
ASSERT_FALSE(foobar(1, 1));
ASSERT_TRUE (foobar(1, 2));
ASSERT_FALSE(foobar(2, 0));
ASSERT_TRUE (foobar(2, 1));
ASSERT_FALSE(foobar(2, 2));
...

Такой тест достаточно легко читать. Достаточно понять конструкцию ASSERT_XXX(foobar(...)) после чего глаза сами фокусируются на входных значениях, автоматически отсеивая ненужный синтаксический мусор.

Однако, если взять реальный код, то подобный пример превратиться в гораздо менее удобочитаемого монстра:

std::unique_ptr<Foobar> rabbit =
    create_foobar_with_abc(parent,
        some_context,
        more_stuff + that + is_required + to_create_foobar,
        a,
        b,
        mock_c(),
        logger);

ASSERT_TRUE(
    rabbit->connect(
        this_thing,
        that_key,
        did_you_think_we_are_done_here ? no : hell_no));

ASSERT_TRUE(rabbit->wait_for_accept(timeout));

ASSERT_FALSE(rabbit->foobar(0, 0));

… и так далее для каждого тест кейса. Подобный код легко превращается в длинную простыню однообразного текста с незаметными, но важными вариациями во входных данных или параметрах инициализации.

Read On →

Что это за хрень в небе была?

О! Отличная, годная блок-схема, дающая ответ на вопрос “Что это за хрень в небе была?” в девяноста случаях из ста (по клику открывается более крупный вариант):

Картинка - перевод оригинала.

От себя могу добавить, что ветку с планетой можно уточнить. В трех четвертях случаев там будет Венера, а еще в 24% случаев - Юпитер.

Пассаж про сверхновую тоже хорош. Бетельгейзе, мы ждем. :-)

Read On →

Хороший, плохой, злой

Датский национальный симфонический оркестр отжигает:

Хочу особенно обратить внимание на то, как красиво это выступление снято - прямо целая история рассказана. Столько интересных мелочей. У “wah, wah, wah” солистки - сережки-револьверы. :-)

Если понравилось, то там целый плейлист есть.

Read On →

Юпитер в инфракрасном свете

Юпитер вместе со своим кольцом в инфракрасном свете:

Read On →