Pull to refresh
4
0.1
Send message

Повестка в военкомат не является направлением на военную службу. Повестка военкомат - это предписание явиться в военкомат, что наверное можно классифицировать как "призыв на военную службу", но не как "направление на военную службу".

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

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

Законодательных ограничений мне неизвестно.

Обучение никогда не должно останавливаться

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

Нет, я специально уточнил, что она имеет ввиду. Потом уже не удержался и рассмеялся. Не очень профессионально себя повел, да.

Там было интереснее. Я разработчик на С++. Они искали Rust разработчика, но сказали, что если опыта в С++ больше 6 лет (мой случай), то готовы взять.

У меня уже был оффер на руках, я им сказал, что если у них четырёхэтапные собесы или лютые тестовые, то сразу нет, если процесс найма оперативный, то давайте.

В итоге, созваниваемся с HR и она мне почти с ходу: "нужно будет выполнить тестовое на 3-3.5 недели". Я ее тормознул и сразу отказал. На этом разговор закончился.

Не помню, но по-моему аббревиатура компании была из четырёх букв. Какой-то там блокчейн проект на Rust. Было два года назад, запамятовал.

Мне как-то прислали тестовое с объёмом работы на 3 недели) Причем это не я даже оценил, а их собственная оценка. Я даже задание читать не стал, просто сразу отказал)

Откуда у вас edgeSet в контексте функции dfs?

У меня стойкое ощущение, что автор статьи пытается изобрести Go (он же golang).

LE и BE - куда более распространены, чем фразы вида "от старшего к младшему".

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

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

Успешным насколько? Я просто когда прошёл в молодости стадию "всё такое новое и интересное", в лучшем случае трачу пару дней своего личного времени в месяц на какое-то "дообучение". Т.е. прям сажусь, открываю IDE, пишу там чего-то. Или открываю какую-нибудь новую для себя технологию, читаю документацию, играюсь с ней.

И это в лучшем случае. Бывают месяцы, когда я этого вообще не делаю. В большинстве же случаев сегодня мое "изучение программирования" - сводится к чтению хабра, чем я занимаюсь просто в качестве "убить время".

БОльшую часть новых технологий или погружение в уже известные я выполняю в рабочее время. После работы - да хоть бы и потоп, у меня вон еще 44 игры на XBox не пройдены, с женой вон в театр надо сходить, кота за пузико почесать.

При всём этом я как-то дорос до состояния "Senior Developer", но конечно я не работаю в гугле там и не получаю десятки тысяч долларов ЗП. По современному курсу моя зарплата едва дотянет до 4к в долларах, но я живу в Москве и мне этих денег просто за глаза хватает.

Успешный ли я программист? Ну, я явно звёзд с неба не хватаю, но проблем с работой не испытываю (пока что).

Со мной это случилось после появление std::iota.

Когда я это увидел впервые на какой-то конференции, я такой: "да вы с ума все посходили". Причём на википедии даже не описан такой смысл у этой буквы в греческом.

Ответ на SO по этому поводу, привёл меня к мысли, что все реально с ума посходили)

Но, ведь...

Это довольно странный и даже строго говоря некорректный аргумент и вот почему

  1. Кастомный deleter является частью типа умного указателя в С++. Соответственно формально мусорный тип мы всё равно порождаем.

  2. Более того, сам Deleter - это тоже не какая-то функция, это "функтор", т.е. по сути структура с переопределённым оператором скобочек. Т.е. придётся если подходить к вопросу совсем дубово, то придётся породить целых два новых мусорных типа.

  3. Даже если вы не согласны с пунктами выше вы всё равно породите мусорный тип через using просто для удобства.

Вы же не будете каждый раз писать что-то такое:

Код на С++17
// Где-то приходится написать мусорный 
// Deduction Guide 
namespace std 
{
    template<typename P, typename D>
    unique_ptr(P*, D&&) -> unique_ptr<P, D>;
}


// одна единица трасляции
auto ptr1 = std::unique_ptr(&s, [](session* s){ close_session(s); });

// другая единица трасляции
auto ptr2 = std::unique_ptr(&s, [](session* s){ close_session(s); }); 

// мы вынуждены каждый раз писать длиннющие
// некрасивые лямбды, потому что не хотим ни 
// порождать новые типы, ни мусорные глобальные
// объекты

Код на версиях ниже С++17 еще страшнее
// Можно так
auto deleter = [](session* s){ close_session(s); };
auto ptr1 = std::unique_ptr<session, decltype(deleter)>(&s);

// Можно совсем пойти страшным путём
// но я бы такое никогда на ревью не пропустил
auto ptr2 = std::unique_ptr<session, decltype([](session* s){ close_session(s); })>(&s);

Вы скорее всего, удобства ради, напишете вот такое

Работает с любым стандартом
// Упс, мусорный тип
using session_ptr = std::unique_ptr<session, decltype([](session* s){ close_session(s); })>;

// Зато какой удобный!
auto ptr = session_ptr(&s);

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

Ну и да, кстати в Rust написать обвязу вокруг Box, если нужен такой функционал - дело недолгое, но на мой взгляд вообще не нужное.

Нужна RAII обвяза для какой-то невнятной ерунды - породи такую обвязу явно и будет счастье. Вроде неплохой подход.

ну так в стектрейсе или дампе это было бы видно сразу, но их не дают

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

В целом, как я и сказал: залогировать можно и нужно, но анализ обозначенной в статье проблемы не требует выездной бригады). Любой монитор ресурсов показал бы out of memory.

То, что у компании есть деньги на оплату выездной бригады и нет денег на настройку мониторинга ресурсов на железе - это оч интересно конечно)

Можно сделать обертку с необходимым действием в деструкторе, но это нудно и неудобно по очевидным причинам.

Это действительно так, но идеологически - это более правильно.

К слову, написать подобный универсальный Guard можно, но да, в стандартной библиотеке его нет, насколько я знаю.

Я вот на Rust не пишу, а вот на С++ пишу. И всё же у меня всегда возникает вопрос: а оно мне точно надо, этот кастомный deleter? Почти всегда это костыль.

Программа как минимум могла бы напечатать "Out of memory".

Или просто поможно было посмотреть в диспетчер задач, Process Monitor, Event Viewer, Performance Monitor, тысячи их. Без всякой выездной бригады. За неумение диагностировать проблемы приходится платить.

Да и толку особо нет. Я проверю, я молодец, а кто-нибудь из моих зависимостей - не проверит, опять упадём, что делать будем? Опять бригаду высылать?

P.S.

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

P.P.S.

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

Не очень понятно зачем это было на хабр-то писать? Тот объём информации, что тут представлен гугл/GPT расскажет одним запросом. Открывая статью я ожидал увидеть какую-то глубину погружения хотя бы на уровень "смотрите как оно реализовано в коде GCC".

Для таких публикаций на хабре придуманы посты.

P.S.

Ваша картинка со стрелочками плоховата. По ней можно заключить будто об объект oth в move-конструкторе всегда умирает при выходе из move-конструктора.

Это справедливо для временных объектов, но в общем случае не является верным.

как вызывающая сторона определила типы (сигнатуру) функций внутри динамической библиотеки - по имени экспортируемых символов? -

@oktonion

Для С++ это более чем возможно, т.к. в имени функции есть вся информация о типах. Вы всегда можете извлечь эту информацию с помощью любого доступного "де-манглера" (не знаю как demangling перевести корректно). Хоть бы и онлайн.

http://demangler.com/

Но есть и локальные, c++filt например. Для Си, ясное дело, простого решения этой проблемы нет.

Не могу припомнить каких-то других киллер-фич у винды 11. Хотя признаться, я ей пользовался всего неделю, так что распробовать не успел.

Information

Rating
3,775-th
Registered
Activity