Архив метки: говнокод

Про современный линукс

Многие годы я восхищался экосистемой linux и opensource. Я видел насколько сложные задачи и интеграционные проблемы решают энтузиасты. Там же миллионы проблем:
— ядро
— bootloader
— драйвера
— тонна мелких утилит
— desktop environment

Читать далее

О накопившихся багах

Мне тут оказалось нужно как-то объяснить железячникам как кодировать и декодировать сообщения нашего формата. Прикинув сколько у нас Qt-контейнеров начал разбираться что же происходит после исполнения команды вида:
QDataStream() << QDateTime() << QString() << QVector()

Для этого пришлось залезть в исходники Qt 4.8.6, где мой глаз зацепился за этот ужас:

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

Читать далее

Овца, Собака и Волк: прохождение 15 лет спустя

Когда-то очень давно у меня был диск с игрушкой «Овца, Собака и Волк». Игра мне сразу не понравилась: пройти дальше стартовой площадки было не возможно из-за кривого перевода и полного отсутствия описания управления я не смог понять как развернуться (нужно было зажать шифт), и что надо посмотреть наверх (нужно было посмотреть наверх, этого не было сказано в обучении), потом была проблем с поиском клавиши Z, которая отвечала за быстрый бег. Абсолютно убийственно, по текущим меркам, выпускать игру, где негде посмотреть управление. Я не помню сколько прошло времени от первого запуска до прохождения первого уровня, наверное около года.

На десятом уровне случилась загвоздка — босса было невозможо пройти. Он просто прыгал на месте, создавая волну, которая убивала овец, а я сам ничего не мог сделать. Я не знаю сколько часов было на него потрачено, но это было много часов. Мои друзья из Черноголовки по воле случая имели эту же игру и застряли на том же уровне. Он был непроходимым.

Читать далее

Russian AI Cup

Каждый год господа из mail.ru придумывают очередную игру для соревнования стратегий.

Я участвовал в CodeTanks, но с аккаунта, который уже не существует. Место у меня там было в районе 500ого, но всех знакомых я тогда обогнал.

Я участвовал в CodeTroopers, но тогда мне не было 18, и претендовать на призы я не мог. Что, впрочем, не помешало мне получить футболку и забрать места из начала второй сотни.

Я формально участвовал CodeHockey, но так и не научился забивать шайбы в ворота, так что у меня быстро исчез интерес.

Я участвовал в CodeRacing, но моя стратегия была всего лишь заглушкой. Мне тогда было очень весело получать свою футболку на соплях — это было крайне высокое отношение цена/качество. Тем не менее, я до сих пор жалею, что не отправился за первым местом. Моих знаний и навыков хватило за то чтобы потолкаться в финале, генетический алгоритм для поиска оптимальной траектории это вполне по мне. Но тогда катастрофически не хватало времени.

Я не участвовал в CodeWizards, потому что Дота — вселенское зло, и ее отголоски надо презирать и уничтожать. Короче, было неинтересно.

Я не собирался участвовать в CodeWars. Мне было непонятно какую стратегию писать. Но меньше чем за неделю до первого раунда я посмотрел на количество участников — чуть больше 500 — и решил отправиться за халявной футболкой. Простейшая заглушка дошла до ~220ого места, так что я остался вдохновлен. После этого рейтинг начал падать и грохнул кучу времени в Стратегию. Стратегия оказалась на редкость хреновой, допилить ее до конца я не успел, но времени грохнул тьму. В первом раунде вошел в топ-100.

Текущее состояние CodeWars. Несколько минут назад завершился первый раунд

Короче, я отправляюсь за толстовкой. Цель — попасть в топ-50. До встречи через 2 недели.

Школьная олимпиада по программированию 2017

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

Арсений следил за всем на площадке, я же в Пущино не поехал, ибо мне сильно не понравились задачи. Следил за проведением из Москвы. Все прошло нормально.

Около 550 посылок. Я на этот раз сделал героический поступок — я посмотрел все прошедшие решения, и примерно половину зафейлившихся. На этих задачах конечно особо не разойдешься, но интересные посылки были.
Читать далее

О чужом коде

Пару лет назад я посмотрел код OpenSSL. Он был ужасен. Особенно меня поразила примерно такая конструкция:

if (0) {
    L1:
    // some code
}

if (condition)
    goto L1;

Через некоторое время я решил что конструкция в принципе нормальная. А прочие ужасы кода свалил на то, что он написан математиками.

Но сейчас я решил расковырять другой продукт. Дело в том, что в CoolReader при ресайзе окна в управлении kwin происходит неприятный баг — он перематывает текст на конец. Это невероятно разражает — по сути единственный выход, это не ресайзить окно. Я решил найти в чем же проблема и полез в исходники. Исходники оказались страшноваты, но следующий код — это…

#define XS_IMPLEMENT_SCHEME 1
#include "../include/fb2def.h"

#if 0
void SaveBase64Objects( ldomNode * node )
{
    if ( !node->isElement() || node->getNodeId()!=el_binary )
    return;
    lString16 name = node->getAttributeValue(attr_id);
    if ( name.empty() )
    return;
    fprintf( stderr, "opening base64 stream...\n" );
    LVStreamRef in = node->createBase64Stream();
    if ( in.isNull() )
    return;
    fprintf( stderr, "base64 stream opened: %d bytes\n", (int)in->GetSize() );
    fprintf( stderr, "opening out stream...\n" );
    LVStreamRef outstream = LVOpenFileStream( name.c_str(), LVOM_WRITE );
    if (outstream.isNull())
    return;
    //outstream->Write( "test", 4, NULL );
    fprintf( stderr, "streams opened, copying...\n" );
    /*
     lUInt8 dbuf[128000];
     lvsize_t bytesRead = 0;
     if ( in->Read( dbuf, 128000, &bytesRead )==LVERR_OK )
     {
     fprintf(stderr, "Read %d bytes, writing...\n", (int) bytesRead );
     //outstream->Write( "test2", 5, NULL );
     //outstream->Write( "test3", 5, NULL );
     outstream->Write( dbuf, 100, NULL );
     outstream->Write( dbuf, bytesRead, NULL );
     //outstream->Write( "test4", 5, NULL );
     }
     */
    LVPumpStream( outstream, in );
    fprintf(stderr, "...\n");
}
#endif

А вот так элегантно решается вопрос об индикаторе батареи:

О современных браузерах

Я неожиданно заметил, что ноут перестал шуметь. Что такое подумал я? Какие отклонения от нормы? Отстутствие хрома было мне ответом. Неужто браузер настолько греет комп? Запустив браузер и открыв пустую вкладку я затаился на другом рабочем столе открыв показания датчиков температуры.
Читать далее