Архив метки: извращения

Чиним Aspire S7 с помощью березы и топора

У меня давно был раздолбан разъем питания на ноуте. Ну как раздолбан, я всего лишь один разок уронил его на пол с полуметровой высоты аккурат на воткнутый китайский штекер. Который был слишком длинным.

В общем, разъем внутри треснул, и с нормальным БП работать по-хорошему не захотел. По традиции, развлекаюсь сам. EBay, 8 дней ожидания, 450 рублей, часок на почте и приготовления завершены.

Новый разъем

Новый разъем

Читать далее

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

Я очень часто повторяю, что на ВМК не учат программировать. Большинство людей такие фразы абсолютно не понимают, а объяснять мне обычно лень. Но вот недавно я увидел код ВМКшника, в котором была задача прочитать бинарный файл. Задача несколько осложнялась тем, что ожидаемый (а может быть и требуемый) язык реализации был C/C++. Как бы вы считали бинарный файл? Я бы открыл его fopen’ом (плохо знаю плюсы, надо бы, конечно, какой-нибудь datastream использовать). А по возможности использовал бы Qt, который позволил бы удалиться на более высокий уровень, почти не потеряв в скорости. Этот товарищ использовал системные вызовы. Он читал файл через open и read. Это ужасно. Совершенно не к месту системные вызовы, которые еще и медленнее будут, если что-то пойдет не так с кешами. А если хочешь кеши — придется их самому написать. Может возникнуть вопрос — а зачем использовались системные вызовы то? Ответ прост — нам рассказывали только их. Поэтому, если вы видите странный код, изобилующий системными вызовами вместо нормальных библиотечных функций — перед вами с большой вероятностью ВМКшник. Этот пример не единственный. Я уже насмотрелся на однострочные комментарии «конструктор», «деструктор», «выделение памяти», «освобождение памяти», а также удаление дефолтных операторов присваивания, дефолтных конструкторов и прочей ереси, которую удалять совсем не обязательно.

Короче, учат не тому. А после просмотра подобного кода сразу видно какие курсы посещал человек. И не дай бог ему понравился ассемблер…

О чужом коде

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

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

BSA-analytics: нужно больше окон!

Иногда мне кажется, что интерфейс несколько переусложнен. С другой стороны, теперь я знаю как отвечать на вопрос: "Зачем тебе такое большое разрешение?"

Иногда мне кажется, что интерфейс несколько переусложнен. С другой стороны, теперь я знаю что отвечать на вопрос: «Зачем тебе такое большое разрешение?»

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Старая машинка снова в деле

Ищу пульсары на своем старом ноуте.

Он загружается стабильно с третьего раза перед этим сообщив о убитом биосе, затем о мертвых вентиляторах и нерабочей клавиатуре. Ее, к слову, вообще нет. Тачпад не работает. Аккумулятор мертв. cdrom не работает. Из сна ноут выходить не умеет. Еще при перезагрузке сбрасывается время, а при попытке зайти на https сайт вылетает ошибка «Сертификат еще не валиден». Ну да это не важно, мне же только процессор нужен, верно?

Читать далее