Немного туп(л,)
84 subscribers
177 photos
26 videos
39 links
Маленький бложег С++ программиста, увлекающегося Rust'ом. Не столько про пргрмрвне, а вообще.
Download Telegram
Побыл немного археологом-палеонтологом.
Ну, пластмассовый мир победил, все дела.

#irl
🔥10
Ну как вы там, молодёжь? 🌚

picture by Cyanide and Happiness | Цианид и Счастье

#happybirthday
Ещё немного ЦиС 🌚

#repost #happybirthday
Как меня поздравляли сегодня компании, имеющие мои ПД.

Самое интересное сообщение прислал Делимобиль (1).
Мегафон (2) просто прислал смску.
Сгорающие баллы выдали Аскона (3) и Воронежский парк аттракционов (4).
Дополнительные скидки и кэшбеки дали Альфа (5) и Сбер (6). Последний ещё открытку впихнул в приветственную картинку приложения.
Ну и по пидорски поступили ВТБ (7): они мне в качестве подарка предложили выбрать кэшбек из обычного месячного набора, который я уже ранее выбрал.

UPD:
Ещё Т-Банк выдал доп. категорию кэшбека на рестораны, а Руцентр выдал 1000 бонусных балов. И если первое - штука уместная очень, то вот в Руцентре я не могу восстановить пароль, потому что система говорит, что у меня некорректный номер договора, который они сами же написали в поздравительном письме 😅

#irl #happybirthday
😁5
Немного туп(л,)
Ну как вы там, молодёжь? 🌚 picture by Cyanide and Happiness | Цианид и Счастье #happybirthday
Маленький факт обо мне: этот пост был в отложенных ровно год. Я его написал 6 февраля 2024 года. Но и то, только потому, что телега не даёт создавать отложенные посты сроком больше чем на год вперёд 🌚

Ну да и это не предел. Приблизительно через пол года я собираюсь опубликовать ещё одну шутку, которую я заготовил где-то 3-4 года назад 🌚
🤔4😁3👀2
Если когда-нибудь я захочу написать свою командную оболочку, я назову её grish, чтобы можно было говорить:
Я скриптовал на Грише

🌚
👀1
[root@cent84-x64-0001 ~]# vim t.sh && chmod a+x t.sh
-bash: vim: command not found

Хоспади, люди добрые, это что же делается, это где же такое видано, ох мать честная, дева пресвятая, спаси и сохрани, Vim установи...
🙈2
Что значит быть инженером?
Это значит делать окружающий мир проще, удобнее, доступнее, иногда красивее, в общем - делать его лучше.
Но так же это про выбор велосипеда (да-да, отсылка к той самой пасте) или чайника...
Преамбула: я начинал эту заметку ещё несколько месяцев назад, но не дописал совсем чуть-чуть в конце. Сейчас вот наткнулся снова и решил дописать. Всё, что ниже - это текст от "прошлого меня", за исключением последних трёх абзацев.
--------------------
У меня бомбит, поэтому сейчас будет эмоциональная история про пргрмвне (история про пргрмрвне на канале про пргрмрвне!)

#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 и поместил туда объект с меньшим временем жизни, чем контекст.