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

Мировой рекорд по спидрану uplink в категории ARC storyline

На прошлых выходных было отвратительное настроение, поэтому я решил поставить какой-нибудь мировой рекорд, чтобы его немного улучшить. Естественно, тратить по 100+ (1000+) часов в игре — это не очень, поэтому я выбрал uplink, где кто-то создал удачную для меня категорию, в которой до меня не было ранов. Теперь есть)) https://www.speedrun.com/uplink

Самое сложное было настроить линукс на снятие видео с рабочего стола. В процессе я понял, что спидранить в fullscreen режиме не получится. Пришлось уменьшать разрешение с FullHD до 1366×768, а сам uplink запускать в 1280×720 в оконном режиме. Также убрал vsync в kwin, и кое-как настроил таймер, чтобы мой speedrun выглядел как speedrun, а не как walkthrough. На прохождение ушло, как ни странно, больше 6 часов (по версии steam), потому что последнюю миссию мне удалось пройти всего лишь второй раз в жизни, она достаточно сложная.

По-хорошему, конечно, надо бы от рана отрезать 5-10 минут, но мне уже лень, все равно рекорд зафиксирован, а соревноваться со мной вряд ли кто будет.

switch без единого if

Лет 7 назад я придумал как можно проверять значение int за O(1). Тогда я подумал что можно просто разделить программу на одинаковые по размеру блоки и прыгнуть на соответствующий. Мне не было известно об устройстве switch, да и ассемблер я не знал.

Уже спустя пару лет я понял, что современный switch как раз этим и занимается, но только вчера я проверил, что теория сошлась с практикой.

Виной всему послужил доклад с cppcon:

Посмотрев на switch со слайдов, я вспомнил про свою старую идею и полез на godbolt проверять.
Читать далее

Используем кока-колу по назначению

Давно уже читал, кто кола на редкость вредный продукт. Где-то слышал, что она может растворить кого угодно. Мол, настолько адский продукт, что наш желудок выдерживает только потому, что организм быстро ее выводит. Специально не хочу гуглить до публикации, чтобы оставить свое мнение. Колу давно не пью, невкусно, но тут проходил мимо нее в магазине и задумался, а можно ли ей отмыть кружку с застывшим чаем?

Исходник

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

К сути эксперимента:

На фоне колы

Кружку залил доверха вместе с ложкой. Через 20 минут побежал проверять по ложке, но она по-прежнему была черная. Пришлось оставить все на утро. Утром меня ждало разочарование:

На следующее утро

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

Финалка

Сага о скорости sscanf

В нашем проекте есть одно из мест при чтении, когда надо распарсить строчку с числами вида «{ 123, 234, 345, 456, 567 }». Там всегда стоял сишный код декодирования через scanf. Ну а потом там пришлось все переделывать, и я на автомате написал декодирование в Qt стиле. А потом решил проверить что же будет быстрее.

Итого, у нас 2 варианта:
1) Ищем каждую первую цифру из каждого из чисел, после чего натравливаем scanf()
2) Сплитим строчку по разделителю, после чего для каждой полученной строки исполняем QString().toInt()

Для проверки что же работает быстрее я написал следующий код:

#include <QCoreApplication>
#include <QtGlobal>

#include <QElapsedTimer>
#include <QString>
#include <QStringList>
#include <QDebug>

#include <stdio.h>

int main(int argc, char *argv[])
{
    QByteArray r;
    for (int i = 0; i < 1000000; i++) {
        float a;
        int b = rand();
        a = *reinterpret_cast<float*>(&b);
        r += QString::number(rand()).toUtf8() + '\0';
    }

    //------------------------------------------
    //------------------------------------------

    QElapsedTimer timer;
    timer.start();

    QList<QByteArray> l = r.split('\0');
    float res = 0;
    for (int i = 0; i < l.size(); i++) {
        res += l.at(i).toFloat();
    }

    qDebug() << res << timer.elapsed();

    //------------------------------------------

    timer.start();

    const char *data = r.data();
    int size = r.size() - 1;
    res = 0;
    float f;
    for (int i = 0; i < size; i++)
        if (data[i] == '\0') {
            sscanf(data + i + 1, "%f", &f);
            res += f;
        }

    qDebug() << res << timer.elapsed();

    return 0;
}

Дебаг сборка
Qt: 165мс на декодирование
Си: 171мс на декодирование

Релиз сборка
Qt: 144мс
Си: 153мс

Массив чисел можно генерить как из целых, так и из float — скорость от этого особо не изменится. Зато скорость знатно меняется, если в качестве разделителя использовать не \0, а, допустим, просто пробел.

В таком случае, если уменьшить количество чисел с 1000000 до 100000, скорости будут такими (релиз):
Qt: 18мс
Си: 963мс

Знаете что это значит? Это значит, что если втупую написать код на Си, ожидая что он будет работать быстрее, то он не только может оказаться медленнее, он может совершенно случайно начать работать за квадрат вместо линии, которую обеспечивает Qt. Остается только догадываться насколько эффективно можно использовать еще более быстрый инструмент — ассемблер.

Ни дня без коммитов

Мой github

Прожил 73 дня, ежедневно модифицируя BSA-Analytics. Первые пару недель непрерывность была случайной, потом она стала искусственной. По внутренним правилам нельзя было переводить часы, заводить фиктивные задачи и отправлять коммиты с пробелами. Стрик был прерван случайно, я в тот день физически возился с сервером и просто забыл про отсутствие коммитов.

Положительные эффекты:

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

Отрицательные эффекты:

  • Размывается граница между отдыхом и работой. Иногда все же требуется на пару дней забыть о проекте
  • Постоянно приходится помнить о проекте. Иногда это весело, один раз я вспомнил об отсутствии коммитов в 23:56, и вполне успел реализовать конкретную фичу, но большей частью это просто неудобно
  • Начинается некоторое растягивание задач по времени. Например сначала открывается задача в багтрекере, а на следующий день закрывается. Еще получается удобно кодить около 11 вечера. Тогда можно сделать коммиты сразу за 2 дня
  • Не учитывается физический вклад. Конечно можно открывать и закрывать задачи вида «Сходить поставить программу на счет», но этому не место в моем уютном багтрекере

Забавные моменты:

  • Один раз пришлось все делать на экстрим-скорости: я вспомнил о BSA-Analytics в 23:56. К счастью, я весь день крутил в голове что и как надо сделать, поэтому успел за 15 секунд до полуночи
  • Три недели назад я остался без клавиатуры на ноуте, поэтому пяток коммитов был полностью сделан с помощью экранной клавиатуры
  • Один из коммитов пришлось по техническим причинам делать по дороге в Москву с экранной клавиатуры и мобильного интернета

Тест выцветания чернил: результаты

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

Наибольший интерес для меня представляет Pilot G2

Около месяца назад я убрал лист с подоконника, где он был неоднократно залит/высушен/болтался под ветром и снегом. С тех пор лист валялся в темном ящике, а мне было лень написать о результатах.

Читать далее

Система шестилетней давности

Когда-то очень давно когда я учился в школе, у меня не было ноута. При этом уже тогда мне нравился линукс, который я таскал с собой на внешнем жестком диске. Когда я приходил на кружок по программированию, я доставал специальный mini-cd диск на 200 мегабайт, содержащий загрузчик Grub 0.97. Школьные машины не умели грузиться по USB, но имели cd приводы.

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

  1. ASPLinux — крутой инсталлятор, проблемы с софтом, очень старая (уже по тем временам) версия дистрибутива
  2. Mandriva — сидел около года, наверное. Но с диска она грузиться не умела
  3. Fedora — норм система, но чем-то не понравилась
  4. ArchLinux — графику не завезли, при нажатии бекспейса на консоли TTY раздавался страшный звук из динамиков, который меня сильно пугал
  5. Gentoo — поставил, только клавиатура не работала. И графики не было. А так в принципе норм, приглашение логина появлялось. Зато без initramfs грузился
  6. OpenSUSE — грузилась с диска, работала, имела пакетный менеджер
  7. Ubuntu — с диска не грузилась, судя по всему из-за автоустановки и настройки проприетарных драйверов на видеокарту.
    Раздражала из-за своей простоты. Тем не менее, в тем времена Cannonical рассылала бесплатно свои диски, и у меня была идея фикс на следующем релизе (10.04) попросить их прислать мне пару дисков.
    К сожалению, именно начиная с этой версии они эту халяву прекратили
  8. Kubuntu — сидел около полугода, норм система
  9. Mint — сидел года два. Любимая система до арча. Отличалась открытием менюшки аналогичной Win по 4-5 секунд. С загрузкой процесса python2 на 100%. Поэтому я не люблю питон

Короче, на диске у меня стояла OpenSUSE. В СУНЦе диск благодаря одалживанию различным нехорошим личностям раздолбался (а это не самая легкая затея раздолбать ADATA SH93), и до недавних пор пылился, потому что я разобрать его не мог. Но сейчас у меня дошли руки, поэтому с помощью ножа, топора, рычагов и грубой силы я раздолбал внешнюю неразбираемую оболочку и, неожиданно, извлек вполне рабочий Western Digital Blue 500GB.

Читать далее

ThinkPad P50 — мощь без компромиссов

Предыстория

С недавних пор меня перестал устраивать Acer Aspire S7. Конкретно — откровенно перестало хватать 4Gb памяти. Любая активность, вплоть до открывания нескольких «правильных» вкладок chrome, выливалось в использование swap со всеми вытекающими. В принципе, с учетом SSD, скорость swap’a была вполне приемлемой. На постоянно жить на swap’е c последующим перегревом — не вариант. Я просто боялся в какой-то момент остаться со сгоревшим ноутом. SSD можно было бы конечно дернуть, но его стоимость (а он был достаточно странным — планка представлялась рейд массивом, количество сброшенных данных не считалось) была несравнима со стоимостью всей машины. Поэтому он был торжественно продан.

Поиск нового ноута

Основные критерии:

  1. Экран не меньше FullHD
  2. Приличная батарея
  3. Либо 4 ядра SkyLake, либо 2 ядра KabyLake
  4. Отсутствие видеокарты AMD
  5. Возможность установки не менее 16 гигов оперативки, лучше 32
  6. Возможность установки SSD. Его, конечно всюду можно поставить, но все же…

Список интересных моделей:

  1. Dell XPS 15. Красивый и легкий ноут. Хорошая батарея и процессор. К сожалению, дико дорогой в нормальной конфигурации — 130 тысяч, из-за границы никак не провезти без возни с таможней. Вдобавок к этому — он перегревается при нагрузке. Если бы был готов отдать столько денег — купил бы его.
  2. ThinkPad t460/t560. Хорошие машинки. Единственная претензия — слабоват процессор.
  3. Ряд игровых ноутов. Две основные проблемы: никакущие аккумуляторы, уродливый дизайн.

Но победил ThinkPad p50. Младшая модель — 20ENCTO1WW.

Последняя фотка Aspire S7 на линуксе


Читать далее

Тест выцветания чернил

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

Ручки — одно из самых безобидных и дешевых увлечений, поэтому я торжественно провозгласил себе любителем ручек и приступил к закупкам. К сожалению, самая крутая ручка всех времен и народов (Pilot Cavalier, если кто не в курсе) какого-то черта снята с производства в своем оригинальном виде. Вместо нее была взята Platinum SBTB, которая шикарна всем, кроме того что в нее нельзя запихать гелевые стержни Pilot…

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

Мой почерк красивый, примите это в качестве аксиомы

Мой почерк красивый, примите это в качестве аксиомы


Читать далее