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

О чужом коде

Пару лет назад я посмотрел код 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

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

Пора кодить!

Сессия была страшной и мозг включается тяжело. В ноуте новый кулер — тот самый, который мне пришлось поменять пару месяцев назад. К счастью, гарантия была на три месяца. Ноут на коленях. На ноуте механическая клава — явный признак того, что пора кодить. Рядом кофе. Для атмосферы. Сверху выползает консоль. В консоли открыт консольный плеер. Это именно то, что мне не хватало. Я давно забыл про тебя, moc. Где-то в километре от меня находится сервер. На сервере 2 процессора перемалывают один из самых ужасных кодов, которые я когда-либо писал — BSA-Analytics. Но он работает. Пульсары находятся. В двух метрах от меня стоит ноут с замененной по гарантии материнкой. Он стоит без крышки и экраном вниз — так эффективнее работает охлаждение. Занимается тем же самым. На другой вкладке консоли к нему открыта ssh-сессия. SSH-сессия идет не напрямую, а через нидерландский сервер — так удобнее. В ssh-сессии открыт screen. Screen — это вещь. В screen’e rsync перебрасывает посчитанные данные на четвертый сервер — он находится во Франции. Люблю современный уровень абстракций!

Программирование на ВМК

Сначала была задача. Задача была написать очередь с минимумом. Я посмотрел на ограничения и решил, что O(n log n) зайдет. Дерево отрезков без обновления наше все. Это была последняя задача контеста, поэтому я пошел сдавать все Шестимерову.

Шестимеров посмотрел на код и сказал, что код ему не нравится. После этого он пообещал забанить код. После этого он начал придумывать причину. Я сразу сказал, что я знаю что такое очередь с минимумом, но при таких ограничениях проще и быстрее написать дерево отрезков. Он сказал, что очередь это тоже плохо. После этого сообщил мне, что если увеличить ограничения, то моя версия упадет по памяти, так как в худшем случае она выжирает 4N памяти, а правильная версия только 2N памяти. После этого был бан.

Но этим дело не закончилось мне было сообщено, что такие как я, не пользующиеся STL’ем потом еще начинают все говорить, что он плох. Я, не долго думая, подтвердил. Таак, — протянул Шестимеров, — это уже религиозная тема! Чем вам не нравится STL? Мне не особо хочется приводить свои аргументы, но я смог сравнить итераторы по map в Qt и в STL. В Qt они лучше, поэтому тут меня переспорить не удалось. Все остальные аргументы провалились.

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

А вот например наша общая программа, которая сейчас называется «Системы программирования» просто ужасна. У нас был какой-то ужасный коллоквиум, на который почти у всех одна реакция.

Вот она - православная реакция

Вот она — православная реакция

Еще более православная реакция

Еще более православная реакция

Сейчас появилась еще одна веселая новость. Теперь у нас идет переразбиение на 2 группы. Одна группа будет учить С++ вместе с Шестимеровым. А другая будет готовиться к экзамену по грамматикам вместе с Курыниным. Выбор очевиден.

Как звучит пульсар

Успешно сконвертировал электромагнитное излучение в ультракоротком диапазоне в звук. Громкость звука пропорциональна напряжению на телескопе. Константы подобраны так, чтобы на выходе был звук в слышимом диапазоне.

Таким образом, можно «послушать» пульсар.

Пульсар слева. Полученная из него звуковая дорожка справа.

Пульсар слева. Полученная из него звуковая дорожка справа.

Скачать можно здесь:
Из коротких данных (меньше помех)
Из длинных данных (больше помех)

Открывать рекомендую в audacity, так как vlc, wmp, и chrome не справились.

Как исправлять утечки памяти

Моя программа поиска пульсаров очень любила падать без особых на то причин. Я чувствовал, что проблема состоит в том, что я освобождаю память, но не знал где именно. Попытки оставить на ночь в gdb на удаленной машине окончились тем, что программа просто не упала. Так что я убрал все освобождения памяти. Больше она не падает. А конечность оперативной памяти я решил проще.
memory leak1

BSA-Analytics

Уже долгое время пишу программу, для анализа данных и поиска пульсаров.
Исходники тут. Лицензия — GPL.

bsa-ex

Текущий статус поиска пульсаров:
1 час наблюдений в низком разрешении (10 точек в секунду) считается за 2 часа процессорного времени. Имеется в виду одно ядро нормального серверного процессора.
Программа умеет разделяться на потоки. Максимальное количество потоков на один файл — порядка 1500. По-умолчанию создается столько потоков, сколько ядер в системе. Есть надежда, что в итоге все будет считаться на суперкомпьютере.

После обработки файла, программа создает свои файлы *.pulsar которые умеет открывать для более точного анализа в ручном режиме.

Типичный пульсар

Типичные помехи

Примеры исходных данных доступны здесь.
Примеры посчитанных данных доступны здесь.

100500 способов передать данные в программу

Задача: надо считать ssl-сертификат и приватный ключ.
Они, естественно, зашифрованы.
Сертификат находится в известном файле, но надо безопасно считать пароль.

Сертификат считается считанным безопасно, если имея права рута единственная возможность узнать пароль — сделать дамп памяти сервера.
Читать далее