Немного туп(л,)
85 subscribers
192 photos
27 videos
46 links
Маленький бложег С++ программиста, увлекающегося Rust'ом. Не столько про пргрмрвне, а вообще.
Download Telegram
#irl #hate
БЛЯДЬ КАКОЙ ЖЕ УЕБАНСКИЙ ТЕКСТОВЫЙ РЕДАКТОР У ТЕЛЕГРАММА, СУКА, ПОСТОЯННО ВЁРСТКА КОДА СЛЕТАЕТ БЛЯДЬ Я ПОЛ ЧАСА ТУПО КОПИРОВАЛ ЭТУ ТЕЛЕГУ ТЕКСТА ИЗ ТЕКСТОВОГО ФАЙЛА
😁1
Татцукиро - пидр. Сейчас поверьте, а поймёте потом.

#jobbing #hate
😁1
Хоспаде, ВТБ, что у вас там с политиками безопасности?

Мало того, что вы уменьшаете допустимый словарь для пароля, так ещё и валидация формы сделана через одно место.
Вот чем, чем вам не понравились символы *, - и :? А при этом ! и ? - это норм, это можно. Тьфу на вас.

А пин-код для доступа к мобильному приложению? Это же тоже трешак
Окей, я понимаю логику почему вы запретили начинать пин-код с цифр 19 и 20 (чтобы год рождения никто не вписывал), но зачем надо было запрещать повторяющиеся подряд одинаковые цифры? Вы же опять же уменьшили набор всех возможных вариантов на порядки! Или по вашему пин-код 1818 сложнее, чем 1881?
Совсем в голову клюнутые?

#irl #hate
😁4👏2
Немного туп(л,)
Продолжу тему "замедления" ТыТрубы. Столкнулся лично. Интересный момент в том, что старые видео (загруженные более недели назад) - спокойно грузятся в 720p (выше качеством не смотрю), а вот свежие (загруженные менее 2 суток назад) - фризятся даже в 360p.…
Развивая тему РКН и YouTube'а:
Всё-таки это замедление канала между серверами тытрубы и клиентскими хостами. Довольно хитрое. Я сам не нашёл, а вот умные люди нашли.

В двух словах:
Проблема: ТСПУ отбрасывают пакет ориентируясь по заголовку SNI в TLS-сообщении.
Обход: Разбивать TCP пакет в середине SNI.

Подробнее по ссылке, там есть ещё ссылки, оттуда ещё ссылки, развлекайтесь крч.

#hate
Что случилось с блядским VirtualBox'ом?!

У меня был небольшой набор настроенных виртуалок. Но вот чот начали они тупить по страшному.
Я увидел, что у меня разъехались версии Guest Additions и самого vbox'а (последний убежал вперёд, потому что его обновляет стороннее средство).
Решил обновить дополнения, а заодно и самую новую версию vbox'а воткнуть (стороннее средство обновляет не по принципу "есть самое новое - ставим", а по принципу устранения уязвимостей минимальным апдейтом версии).
В итоге стало многократно хуже. Не подхватывается сеть с родительским хостом через виртуальный адаптер — это вообще куда так можно?!

Добавим к этому сложности, которые вставляет в колёса отдел ИБ, так происходит полный пиздец. Я просто 3 последних часа только и делал, что воевал с этим говнищем. А когда в конце концов оно просто выдало ошибку из-за чтения то ли повисшего, то ли нулевого указателя - я вообще в ахуй выпал и психанул.
Простите, тестировщики, но крайний корнер-кейс вам придётся проверять самим.

#hate #jobbing
Преамбула: я начинал эту заметку ещё несколько месяцев назад, но не дописал совсем чуть-чуть в конце. Сейчас вот наткнулся снова и решил дописать. Всё, что ниже - это текст от "прошлого меня", за исключением последних трёх абзацев.
--------------------
У меня бомбит, поэтому сейчас будет эмоциональная история про пргрмвне (история про пргрмрвне на канале про пргрмрвне!)

#jobbing #prog #cpp #hate

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

Начиная с С++11 существует такая интересная штука, как std::reference_wrapper.
Если в двух словах, то это хреновина, которая позволяет использовать ссылки так, как обычно их использовать нельзя.
Например: класть в std::vector, или переприсваивать именно "значения ссылок", а не "значения куда указывают ссылки" (актуально для шаблонных алгоритмов).

Зачем вообще это нужно? Чтобы избегать ненужного копирования, как минимум.
Например, очень удобно написать что-то такое:
struct Some {
Some() = default;
~Some() = default;
Some(const Some&) = delete;
Some(Some&&) = delete;
Some& operator=(const Some&) = delete;
Some& operator=(Some&&) = delete;
};

Some global_object;
thread_local Some thread_object;

struct A {
Some m_object;

void foo(Some& object) {
std::vector<std::reference_wrapper<Some>> objects;
objects.emplace_back(object);
objects.emplace_back(m_object);
objects.emplace_back(thread_object);
objects.emplace_back(global_object);

for (const auto& o : objects) {
// some process without copying
}
}
};

Тем самым мы можем обработать обработать кучу данных из разных источников без необходимости их копирования; накладные расходы будут только на внутряночку std::reference_wrapper (а это обычный указатель) и на сам std::vector.

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

Вот буквально сегодня я увидел примерно вот такое:
struct Context {
std::optional<std::reference_wrapper<std::string>> m_id = std::nullopt;
}

Context createContext() {
Context ctx;
std::string guid = generateGUID();
ctx.m_id = guid;
return ctx;
}

И всё, пиздец котёнку. Успело попасть в релизную ветку, благо на тестировании стали ловить странные падения.

Как программист вообще мог такое написать и так облажаться? Очень просто: это было два программиста.
Первый - внедрил использование std::optional<std::reference_wrapper<std::string>>, второй не понял что такое этот ваш std::reference_wrapper и поместил туда объект с меньшим временем жизни, чем контекст.
РЖД, это, простите, как?

Да, в блокноте - тот самый пароль, который я пытаюсь использовать.

#hate
👀1