• Хочу начать изучать Rust, стоит ли начинать с официальной книги?

    @historydev
    Редактирую файлы с непонятными расширениями
    Да, стоит, это великолепное издание проведёт тебя так гладко и приятно по языку, что после ты не захочешь смотреть на другие)

    Вдобавок многие популярные библиотеки пишут обучалки в формате Rust Book.
    Ответ написан
    3 комментария
  • Где пройти производственную практику?

    Производственная практика - это очень часто чуть ли не формальная процедура. Снижай планку требований к месту прохождения практики.
    Ответ написан
    Комментировать
  • Где пройти производственную практику?

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

    Если у вас поднялся вопрос с выбором места практики, и вы его не можете решить, то он решается вот таким рутинным способом.
    Ответ написан
    Комментировать
  • Как настроить CMake на установку пакетов?

    Nipheris
    @Nipheris Куратор тега C++
    Какой пакетный менеджер лучше взять?

    Conan или vcpkg, чё тут думать. Рекомендую Conan, но vcpkg тоже уже созревшее решение, сейчас они оба захватывают рынок.
    Или "взрослое" решение пишется без пакетного менеджера?

    А вы пилите библиотеку или законченное приложение? Опишите подробнее что у вас за программное средство. Требования сильно разные. Например:
    • если это C++ библиотека - то я бы выбрал один из пакетных менеджеров и подготовил бы библиотеку для работы с ним. Например в случае Conan это значит написать conan-рецепт (который conanfile.py), который и будет "точкой входа" в вашу библиотеку: с помощью рецепта Conan узнаёт, как собирать библиотеку, какие у неё зависимости, как упаковывать в бинарный пакет, какие архитектуры и ОС поддерживаются и ещё кучу полезной информации, которую без ПМ обычно описывают ручками в README
    • если это сетевой-сервис, например HTTP-бэкенд для чего-либо - ну тут стандартом индустрии является Docker/OCI-образ. Собираете образ под нужные комбинации архитектуры и ОС (см. multiplatform builds), заливаете в registry, и любой желающий запустит контейнер из вашего образа в своей инфраструктуре, или использует ваш образ как базовый для сборки своего
    • если это десктопное приложение, неважно GUI или CLI - ну тогда обычно ожидается инсталляционный пакет под поддерживаемую ОС. Для Линуха это deb/rpm/flatpak/snap, для Венды - msix или exe, для Мака - dmg. Далее либо выкладываете для скачивания где-то на сайте, либо публикуетесь в магазинах типа Microsoft Store или Snapcraft


    Опишите точнее ваш случай, я лучше посоветую что вам взять.
    Ответ написан
    3 комментария
  • Как настроить CMake на установку пакетов?

    @res2001
    Developer, ex-admin
    Самому заниматься установкой зависимостей есть смысл только для статически линкуемых библиотек. В этом случае самый простой вариант такие библиотеки оформить например как субмодуль git. Тогда при клонировании вашего репозитория скачаются исходники библиотеки. В cmake просто собираете ее как отдельный таргет и используете по назначению. Хорошо если библиотека уже поддерживает сборку через cmake - будет меньше возни. Если нет, то придется написать самому для нее CMakeLists.txt.

    Для динамических библиотек стоит оставить удовлетворение зависимостей пользователю, потому что вариантов пакетных менеджеров много (вы хотите их все поддерживать?). В вашем CMakeLists.txt нужно только сделать тем или иным способом поиск установленного пакета и если его нет - выдачу ошибки и завершение сборки. Такие механизмы в cmake есть. Можно использовать выше приведенный find_package или например pkg_check_modules (который в свою очередь использует утилиту pkg-config).
    Почти все более-менее серьезные приложения не пытаются установить самостоятельно свои зависимости при сборке. Можете проверить. Например: https://github.com/nginx/nginx?tab=readme-ov-file#...

    Вы можете дополнительно к сборке приложения добавить и создание пакета для пакетного менеджера (или для нескольких пакетных менеджеров). Вот тут то вы и укажите необходимые приложению зависимости (в разных дистрибутивах линукс пакеты с зависимостями могут называться по разному). И тогда, когда пользователь будет устанавливать ваш пакет через пакетный менеджер все зависимости установятся автоматически.
    В cmake есть механизм для создания пакетов для разных пакетных менеджеров: https://cmake.org/cmake/help/book/mastering-cmake/...
    Ответ написан
    2 комментария
  • Насколько хороша такая политика обновления библиотеки?

    Постепенно я дополняю её патчами.

    Непонятно какую схему вы планируете для разных unstable-версий. major.new_minor.patch-unstable.1, major.new_minor.patch-unstable.2. Кстати, рекомендую выбрать какой-то более привычный prerelease-идентификатор вместо unstable, например alpha и beta.

    Также рекомендую подглядеть схему версионирования у какого-нибудь популярного крейта, например actix-web. Они используют предрелизные версии перед мажорными релизами.

    Тут кстати встаёт вопрос, а так ли вам нужны предрелизы для ПАТЧ-версий библиотеки? Выглядит как чрезмерно детальное версионирование. Обычно когда публикуется патч-апдейт, и в нём обнаруживается баг, то просто выпускается новая версия с фиксом и со следующим patch-числом (т.е. была 2.5.2, потом вышла 2.5.3 с багом, для фикса которого выпустили 2.5.4).

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

    Собственно предрелизы на то и меньше релизов при операциях сравнения, что для этого и придуманы. Т.е. например:
    1.2.5 < 1.3.0-alpha.1 < 1.3.0-alpha.2 < 1.3.0-beta.1 < 1.3.0

    Чтобы пользоваться предрелизами правильно и потом не кусать локти из-за неудачно выбранной схемы, почитайте внимательно правила сравнения в спеке semver для предрелизов и подсмотрите в популярные пакеты как кто делает. Лично мы используем схему c alpha/beta плюс через точку номер предрелизного билда.

    Схема именования предрелизов должна быть устроена так, чтобы решать задачу "приближения" к релизной версии. Если обычные 3.5.7 нужно читать как "3-я версия API + 5-й набор фичей для этого API + 7-я версия патчей для этого набора фичей", то 4.0.0-beta.6 нужно читать как «вроде бы уже почти 4.0.0, но ещё непонятно сколько ещё косяков надо перепрыгнуть, чтобы добраться до 4.0.0. На глаз вроде бы уже немного осталось (beta), но это уже 6-я бета, а до неё ещё несколько альф было, поглядим сколько ещё багов нам заведут»
    Ответ написан
    2 комментария
  • Для чего нужна отмена задач, кроме таймаутов и каналов?

    В дополнение к предыдущему - случай с graceful shutdown, когда у тебя есть какой-то долгий процесс и в случае его завершения в середине нужно какие-то особые телодвижения совершить (сохранить результат куда нибудь в файлы, дождаться закрытия соединения итд.
    Ответ написан
    Комментировать
  • Для чего нужна отмена задач, кроме таймаутов и каналов?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Отмены задач используются, как ни странно, для отмены задач. А чтобы отменить задачу, это должно быть кому-нидуь нужно. Например, этим "кем-нибудь" часто бывает пользователь, которому результат задачи перестал быть нужным.

    В качестве примера: пользователь послал на сервер через веб-страницу запрос и ждет результата. Представим, что запрос - сложный, результат так сразу не получить, запрос выполняется, а пользователь ждет, потому что всё это понимает. Потом пользователю внезапно надоедает ждать и он посылает команду Отменить. Или - закрывает страницу. Так вот, по-хорошему, в этом случае надо отменить задачу, которая выполняет запрос, чтобы она не тратила впустую ресурсы сервера.

    А ещё отмена полезна для прерывания процессов потенциально бесконечных, типа смотреть, как горит огонь, как течет вода, как люди работают... :-)

    Таймауты тут не помогут в обоих случаях. В первом случае пользователь сам часто не знает, сколько он согласен ждать, а во втором - вообще нет никакого таймаута, ибо процесс бесконечен.
    Ответ написан
    Комментировать
  • Стоит ли изучать MongoDB в 2024?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    При такой постановке вопроса - ответ на вопрос - "нет, изучать не нужно".
    По крайней мере пока вы не поймете, что:
    1. MongoDB и PostgreSQL - это разные вещи для использования в разных задачах.
    2. Что такое SaaS модель а что такое - локальное развертывание
    .3 Зачем нужен докер.
    Ответ написан
    1 комментарий
  • Где моя ошибка в питоне?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    import math
    
    while True:
        a = int(input("ax^2+bx+c=0 / a: ")) 
        b = int(input("ax^2+bx+c=0 / b: "))
        c = int(input("ax^2+bx+c=0 / c: "))
        
        d = b ** 2 - 4 * a * c
        
        if d > 0:
            x1 = (-b + math.sqrt(d)) / (2 * a)
            x2 = (-b - math.sqrt(d)) / (2 * a)
            print(f'Корней: 2. \n x1 = {x1}')
            print(f'Корней: 2. \n x2 = {x2}')
            
        elif d == 0:
            x1 = -b / (2 * a)
            print(f'Корень: 1. \n x1 = {x1}')
            
        else:
            print("Корней: 0")
    Ответ написан
    Комментировать
  • Как устроиться в начинающую компанию?

    saboteur_kiev
    @saboteur_kiev Куратор тега Карьера в IT
    software engineer
    Никак. В таких компаниях нет необходимости в сотрудниках или в MVP.
    Таким компаниям нафиг не нужен сайт (может быть пригодится группа в ФБ/телеграме).
    В таких компаниях нет денег на третьего сотрудника и вообще не выделен и не создан бюджет на айти.
    Зачем туда устраиваться?

    Вдобавок, не путайте начинающую ИТ компанию и стартап - разные вещи.

    В такую компанию нужен не сотрудник, а инвестор.
    Ответ написан
    3 комментария
  • Как организовать журнал событий в распределённой системе правильно?

    newross
    @newross
    Product owner
    Звучит как задача для Elastic (хранение логов) + Kibana для визуализации.
    Ответ написан
    1 комментарий
  • Как правильнее хранить друзей и контакты в бд?

    @Everything_is_bad
    Первое что пришло в голову - таблица contacts
    норм

    1. 10.000 пользователей импортируют свои 100-200 контактов - в бд уже будет >1 млн записей
    это мало

    Если строк будет очень много, то будет ли тормозить обычный select? на userId и phoneNumber будут индексы
    с большой вероятностью не будет, но обычно если возникает вопрос, собирают тестовый стенд и проверяют самостоятельно.
    Ответ написан
    Комментировать
  • Каких вещей следует избегать в Rust?

    vabka
    @vabka Куратор тега Rust
    Сложно сказать, чего стоит избегать, но точно не стоит избегать чтения растбука
    Ответ написан
    2 комментария
  • Каких вещей следует избегать в Rust?

    bingo347
    @bingo347
    Crazy on performance...
    Я знаю, что следует избегать всяких "продвинутых" штук из ряда связных списков, самореферентных структур и т.п.
    Односвязные списки никаких проблем не доставляют (ну кроме того, что они плохо ложатся на процессорный кэш). Для двусвязных списков и самореферентных структур придётся использовать сырые указатели и unsafe.

    Ещё я обнаружил, что создание больших структур, с методами, с кучей полей, обычно приводит к проблемам с borrow checker.
    Borrow checker абсолютно плевать на размер структур. Это никак не связано.

    А если в структуре будет ссылка или иное заимствование, то это гарантированные проблемы.
    Нет ни каких проблем.

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

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

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

    И очень часто в Rust программах, мне приходится идти на более уродливую архитектуру, дабы избежать проблем с (почти ненужным в однопоточном коде) borrow checker.
    Что-то делаете не так. Скорее всего просто не понимаете borrow checker и пытаетесь писать на новом языке так, как привыкли в каком-то другом.

    И в вопросе о borrow checker, разве не является тот факт, что большинство библиотек избегает &mut self в изменяющих что-то методах, звоночком к наличию большим проблем в языке?
    О каком большинстве речь? Библиотеки используют мутабельные ссылки там где это нужно. Если метод действительно что-то меняет, то будет мутабельная ссылка ну и иногда будет использоваться interior mutability там где это необходимо. В языке нет проблем с мутабельными ссылками.

    В общем, посоветуйте что-то что-бы помогало меньше бороться с borrow checker, потому что сейчас я очень много времени трачу именно на это.
    Для начала понять его. Понять какую проблему он решает. Почитайте, что такое undefined behavior. Почитайте, что такое алиасинг.

    Возможно где-то альтернативой мутабельным ссылкам будут Cell/RefCell в однопоточном коде и Mutex/RwLock в многопоточном.
    Возможно если покажете примеры кода, где у Вас проблемы, то можно будет подсказать что-то более конкретное.
    Ответ написан
    3 комментария
  • Почему в Go вакансиях требование знания PHP?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Или это просто такое количество кодовой базы на PHP накопилось, которую все дружно решили переписывать на Go

    Скорее всего.

    если да, то почему именно на Go?

    Если компания решилась вложиться в переписывание продукта на другом языке, то у неё на это точно очень веские причины, вероятнее всего - проблемы производительности. В этом случае Go - очевидный выбор. Python, Ruby и JS не дадут никакого выигрыша относительно PHP. Хоть на языках из мира jvm и .net можно писать высокопроизводительный софт, но они скорее решают проблемы сложности огромных кодовых баз. С++ и Rust очень сложны и для прикладного софта применяются только в крайнем случае. Всякая экзотика, типа Erlang, Elixir и Haskell - это вообще редкий случай в энтерпрайзе. Go же одновременно очень прост и ориентирован на высокую производительности.
    Ответ написан
    7 комментариев
  • Как в библиотеке пометить макрос, как unstable?

    vabka
    @vabka Куратор тега Rust
    Мне кажется, прямо в названии отражать, что он unstable не обязательно, ибо стабилизация существует только в рамках стандартной библиотеки - просто дай ему другое название и закрой за feature, которую можно включить только на nightly.

    Когда фичу стабилизируют - добавишь в новой версии deprecated с указанием на старый макрос, а потом, в следующей мажорной версии, удалишь окончательно.
    Ответ написан
    1 комментарий
  • Какое самое простое решение для создания простой базы данных с GUI?

    @alexalexes
    MS Excel.
    Создаете таблицу с названиями колонок:
    Клиент, Цвет волос, Длина волос.
    Добавляете фильтры на заголовки таблицы и можете фильтровать по любой комбинации критериев.

    MS Access.
    Создаете аналогичную таблицу в СУБД.
    Добавляете формы и отчеты (уже не помню, что там в школьной программе делали).
    Ответ написан
    7 комментариев
  • Выбор программы или ЯП для создания приложения по обработке данных?

    Делать это всё на чистом экселе - умрёшь.

    Это очень пахнет отраслевым решением - такие редко делают бесплатные.
    Скорее всего какое-то специализированное решение для ресторанов уже имеет функции для работы с технологическими картами и складом (r_keeper и подобное, например)
    В ту же сторону - 1С, тем более что в этом соцучреждении уже наверняка 1С где-то используется.
    Ответ написан
    Комментировать
  • Как правильно добавлять столбцы в БД - в конец таблицы или логически группировать?

    @Everything_is_bad
    Просто в выборках явно указывай поля, а не тупо *. Либо извлекай в ассоциативный массив.
    Ответ написан
    Комментировать