@hirthwork

Тег programming в блоге hirthwork

hirthwork

Каждый бекенд разработчик в своей жизни обязан:
* написать собственный класс эксепшенов, которые хранят HTTP status code

hirthwork


Эта картинка является квинтэссенцией того как рождается инженер.
Инженер следует инструкции, потому что инструкция загоняет инженера в рамки мышления автора инструкции.
Инженер действует вопреки инструкции, чтобы расширить понимание природы изучаемого предмета.
Инженер выдернет устройство из радиоточки и воткнёт его в сеть 220В и таким образом получит бесценный опыт пиздюлей от бабушки и информацию о том, что устройство рассчитано (было) на 30В.
Инженер постепенно будет поднимать напряжение на светодиод до 12В, чтобы узнать, что белый светодиод перестаёт быть белым за пределами номинального напряжения.
Инженер соединит два провода торчащих из стены, чтобы узнать что они под напряжением (были, пока не выбило пробки).
Лишь в одном случае инженер полезет в инструкцию — когда он уже что-то сделал, а ничего не изменилось.

hirthwork

Три года назад написал один небольшой класс на Java, всего 200 строк.
Сегодня нашёл в нём багу. Сел смотреть как поправить.
В общем, решил что теперь у меня будет два класса. Именно так в проектах и заводится рак.

hirthwork

Я очень медленный, но оказывается в шланг уже 128-битные атомики завезли:

$ cat main.cpp
#include <atomic>
#include <iostream>

struct foo {
    uint64_t a;
    uint64_t b;
};

struct bar {
    uint64_t a;
    uint64_t b;
    uint64_t c;
};

int main(int, char**) {
    std::cout << std::atomic<foo>().is_lock_free() << std::endl;
    std::cout << std::atomic<bar>().is_lock_free() << std::endl;
    return 0;
}

$ clang++ -stdlib=libc++ -nostdinc++ -latomic -I/usr/include/c++/v1 -march=native main.cpp
$ ./a.out
1
0
hirthwork

Когда в проекте обнаруживается критическая "точка роста" и ты понимаешь, что тебе нужно её закрыть в этом квартале

hirthwork

hirthwork

Dat feel, когда ты наконец-то поймал место где происходит проезд по памяти и сразу же по сообщению от asan понял как это починить. Можно идти домой

hirthwork

Появилась задача: иметь тредпул, в котором задачи можно прерывать по истечении некоторого таймаута.
Вся гуглёжка сводится к "нет, так нельзя".
Ну мы же инженеры, пьём трипл ипу из черепов фронтендеров, так что откопали, что если в джава послать треду SIGBUS, то он выбросит java.lang.InternalError, который успешно пролетит весь стек вызовов, пока ты его не поймаешь.

Скоро сказка сказывается, да не скоро код пишется.
Прерываемый тред ощущает последствия сигнала иногда за 700мс, а иногда и за несколько секунд (текущий рекорд — 111 секунд).
А если пустить это тестироваться в бесконечном цикле, то итераций через 50 случается SIGABRT. В общем, я уже даже jdk в дебаге собрал и принтфов там наделал, но до конца механику пиздеца пока не понял.

hirthwork

Если хочешь много секса, много ласки и любви, короче говоря я заиспользовал в проде регулярки. PCRE. А потом несколько дней искал, почему у меня программа со stack overflow падает. И даже чтобы выяснить, что дело в stack overflow у меня ушло два дня.
Не используйте неограниченные квантификаторы в проде, пацаны (и замечательная Хильди)

hirthwork

Дожили. Нашёл false positive в msan'е шланговском.

hirthwork

У меня была функция и в этой функции я передавал переменную со стека в другую функцию «по указателю», а затем значение этой переменной возвращал тому, кто мою функцию вызвал.
И проверял я return value другой функции и говорил он мне, что всё хорошо.
И снаружи всех функций я печатал значение возвращённой переменной.
Но однажды пришёл msan и в момент печати сказал, что значение функции не проинициализиовано.
Он был совсем не против пока я передавал переменную. Молчал, когда я присваивал её значение другим переменным, но вот позволить печатать эту переменную он мне не мог. Безжалостно он убивал мою программу при попытке узнать реальное значение переменной.
И я был уверен, что в моём коде нет ни единой ошибки. Но как я мог это доказать, если не мог ни распечатать переменную, ни даже сравнить её значение?
Чему равно значение переменной значение которой нельзя узнать?

hirthwork

Чем больше я читаю документацию по PCRE (не по синтаксису, а по сишной либе v8.44), тем больше склоняюсь к мысли, что большинство пользователей PCRE даже не подозревают насколько это мощная библиотека и сколько в ней тонкостей.
Тред: один рецомменд — один факт о PCRE.
0. Вызов pcre_study без включённого JIT соптимизирует только повторный pcre_exec одной и той же строки на одной и той же регулярке. Зато если PCRE скомпилен с JIT и в pcre_study передан флаг PCRE_STUDY_JIT_COMPILE, то скорость выполнения регулярок запросто может увеличиться в 10 раз.

hirthwork

hirthwork


А будешь выёбываться — посадят в пресс-хату с жавскриптерами, которые тебе объяснят, что электрон — это будущее десктоп разработки.

hirthwork

Если жизнь и рассудок дороги вам — не пишите кастомные компараторы для json-объектов.
Сделал рефакторинг, запустил тесты. Вижу, что различается значение двух полей.
Полтора часа искал, почему различаются.
Оказывается «не различаются» — мой компаратор погрешности вычислений просто умеет игнорировать и -0.3E-8 и 1.4E-8 признает одинаковыми. А вот из-за того что я опечатался в имени второго поля он выводил дифф по точным значениям и показывал различие в первом поле в ом числе.

hirthwork

Восемнадцатилетний Хворк:

hirthwork

hirthwork

hirthwork

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

А вы «из говна и палок». Нормальные люди инструменты просто из говна лепят

hirthwork

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

Добавить пост

Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
Для форматирования текста используется Markdown.