• Не знаете как можно исправить ошибки на с++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вам надо описать конструктор Ball без параметров. Например:
    Ball() x(0), y(0), r(0), vx(0), vy(0) {}

    Потому что new Ball[n] Создает n объектов, но конструктора по умолчанию (без параметров) у класса Ball нет. Обычно его генерирует компилятор сам, но только если вы не указали никаких своих конструкторов. А new не знает, какие числа передавать в качестве x, y, r и т.д.

    Смотрите правило трех.
    Ответ написан
    Комментировать
  • Есть ли статьи, которые приводят наглядные примеры того, как код на rust превосходит код на других языках?

    vabka
    @vabka
    Токсичный шарпист

    Особенно там, где был использован язык Си или С++

    (если исключить memory safety и fearless concurrency)
    1. Хороших плюсовиков найти всё сложнее, ибо молодые разработчики часто хотят что-то более современное/простое/приятное.
    2. Переход с какого-нибудь более высокоуровнего языка на Rust гораздо легче, чем на C++
    3. DX у Rust на порядо лучше.
    4. Код на Rust на порядок более выразительный, чем код на Си

    За счёт этого поддержка кодовой базы на Rust заметно дешевле выходит

    Например вот что Тинькофф пишет:

    Наш Процессинговый Центр занимается разработкой финансовых систем, критичных к даунтайму и времени обработки. Изначально мы делали все свои продукты либо на чистом Си, либо на плюсах (C++14), однако пару лет назад мы переписали большой кусок нашего бэкенда на Rust, и нам настолько понравилось, что теперь все наши новые процессинговые сервисы пишутся на нём.



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

    Это можно будет определить только если ведётся статистика по багам и они классифицируются по причинам возникновения, но такую статистику ведут не все.
    В среднем статистика показывает, что багов связанных с неправильной работой с памятью в проектах на Rust на порядки меньше, чем в проектах на C++.


    ну тут все-равно unsafe

    В проектах на Rust он явный и от него можно избавиться, завернув в безопасную обёртку, которая будет гарантировать корректную работу с памятью и ffi.
    В проектах на C++ у тебя по факту всё является unsafe.

    ну, нам еще нужен подсчет ссылок

    В плюсах тоже активно пользуются подсчётом ссылок и всякими умными указателями, если по коду не очевидно, когда можно будет освободить память
    Ответ написан
    6 комментариев
  • Странный дизайн Rust?

    vabka
    @vabka
    Токсичный шарпист
    Во первых, почему указатели в Rust называются ссылками?

    Потому что в Rust есть свои типа умные ссылки, которые проверяются борроу-чекером - &T и &mut T.
    А есть сырые указатели, которые *const T и *mut T;

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

    Вот как это вместить - после плюсов вызывает неприязнь.

    Просто забыть привычки от C++ и плюсовую терминологию, и использовать новую.
    У вас же при изучении нового человеческого языка не возникает проблем от того что какой-нибудь кот называется кэт-ом?
    Ответ написан
    Комментировать
  • Уход во время испытательного срока, нормально ли это?

    iiiBird
    @iiiBird
    Пока ты спишь - твой конкурент совершенствуется
    это обычные деловые взаимоотношения с людьми. тебе никто не скажет как можно, а как нет. что будет если сделаешь так, а если по другому.
    сообщаешь на нынешнем месте о новом предложении и в зависимости от ответа отталкиваешься.
    к примеру, если ты уже показал себя хорошо - тебе могут предложить столько же денег, сколько тебе предлагают на новом месте.
    Ответ написан
    Комментировать
  • Уход во время испытательного срока, нормально ли это?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Нормально уходить с испытательного срока, если что-то не понравилось. Испытательный ведь не только для сотрудника, но и для компании. Однако, уход из-за того, что появилось более интересное предложение - это сомнительный с позиции морали и профессиональной этики поступок. Кроме того, не рекомендую прыгать в первые пару-тройку лет работы. Особенно не стоит спрыгивать с первого места работы.
    Ответ написан
    5 комментариев
  • Два IP на одном домене. Как настроить переадресацию?

    vabka
    @vabka
    Токсичный шарпист
    Это разруливается не через DNS, а через балансировщик.
    У тебя будет, получается, три узла: Основной, Резервный, и Балансер.
    В DNS ты прописываешь балансер (через A/AAA или CNAME - не важно).
    Все запросы от клиентов идут на Балансер и он их пересылает на основной.
    В случае сбоя, Балансер каким-то образом выясняет состояние основного узла (может прямо запрашивать периодически какой-нибудь GET /health или смотреть на ответы, которые он даёт клиентам), и перераспределяет запросы на Резервный в случае, когда был выявлен сбой, и наоборот - в случае сбоя Резервного можно попробовать перенаправить запросы снова на Основной (тут уже как настроишь).

    Попытаться обойтись без балансера можно, но тогда ты столкнёшся с той ситуацией, с которой ты столкнулся:

    При коннекте к www.site1.ru провайдеры через раз подключаются к правильному айпи, то к основному, то к резервному.
    Соответственно где то на сайт заходит, где то нет так как конектится ко 2 айпи который в текущий момент сервер не использует.

    И уйти от этого не получиться, тк это не баг, а фича - DNS сервер провайдера будет кэшировть информацию о записях в твоём домене, чтобы не нагружать твой сервер лишними запросами и быстрее отдавать ответ своим абонентам, при этом при кэшировании может учитываться тот TTL, который ты сам указал.
    + Кэширование может, и скорее всего будет в том числе и на стороне конечного клиента.

    Придирки к терминологии

    Не существует "DNS регистраторов". Есть просто регистраторы, которые говорят что домен принадлежит тебе и позволяют назначить dns-сервера, которые будут этот домен обслуживать.
    И есть отдельно dns-хостинги, где ты можешь прописать различие записи в рамках домена.
    Ответ написан
    5 комментариев
  • Зачем перед str ставить +?

    axifive
    @axifive
    Software Engineer
    Чтобы преобразовать строку в число

    +"76" == Number("76")
    Ответ написан
    3 комментария
  • Почему не работает программа нормально?

    Vindicar
    @Vindicar
    RTFM!
    Ты объявляешь функцию replay(), но не вызываешь её.
    А вообще, тебе тут нужен цикл, а не рекурсия.
    Ответ написан
    Комментировать
  • ++i быстрее чем i++?

    @dima20155
    you don't choose c++. It chooses you
    ++i инкрементирует и возвращает ссылку на переменную i.
    i++ создает временную переменную и сохраняет в неё текущее значение, инкрементирует значение переменной i, возвращает временную переменную.

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

    Написал код, который подтверждает мои слова:
    https://godbolt.org/z/GvMejj1bd
    Смотрите именно вывод ассмеблер.
    Для удобства чтения разделил все nop инструкциями
    Ответ написан
    Комментировать
  • Взаимодействие приложений на разных стэках?

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

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

    А потом приходит начальник, и говорит. - эээ, мы вообще планировали распараллеливать эту нейронку, у нас будет от 10 до 10500 инстансов в в облаке. Данные давайте сложим вот в монго-кластер, задачи по обработке сбрасываем в очередь в celery, если очередь вырастает больше чем на N, то кубер автоматически поднимает еще несколько инстансов... и так далее, насколько у него фантазия разгуляется.

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

    И как-то так получается, что пока у тебя маленький проект на одном сервере - тебе эти накладные расходы "со всем издержками http протокола" погоды не делают. А когда компов много, то может так выйти, что кроме этого протокола и альтернатив не так уж много.

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

    В общем тема большая, и большие коммпании решают ее по разному - структура сервисов фейсбука и алиэкспресса может сильно отличаться, и каждый будет уверен что его подход хорош. Ну или не очень хорош, но менять архитектуру для сотени или тысяч сервисов - дорого. И комания binance основанная 5 лет назад может архитектурно оказаться гораздо современнее и технологичнее какого-нибудь paypal'а основанного в прошлом тысячелетии. И не потому что paypal не шарит, а потому что переделывать большую систему очень дорого.

    А в майкрософте, основанном 50 лет назад, можно вообще очень странные и неэффективные штуки найти, я уверен.

    В общем, о чем это я - тема сложная, и одного решения на все случаи нет, и быть не может.
    В большинстве случаев оценивать нужно не только накладные расходы, но и масштабируемость, отказоустойчивость, насколько легко это все поддерживать, и цену, конечно-же. И цену за лицензии и зарплаты людей, которые это внедняют и обслуживают.
    Ответ написан
    2 комментария
  • Почему все называют TypeScript компилируемым языком программирования?

    vabka
    @vabka
    Токсичный шарпист
    1. Если душнить, то никто не называет TypeScript компилируемым языком.
    Вот например что написано на официальном сайте на самом верху:

    TypeScript is a strongly typed programming language that builds on JavaScript, giving you better tooling at any scale.


    2. У typescript есть компилятор tsc - его называют компилятором, потому что он по определению им является.

    Но стоп, компиляция - это процесс перевода "человеческого" кода в машинный код.

    Нет. Даже если брать определение из википедии, то будет:

    In computing, a compiler is a computer program that translates computer code written in one programming language (the source language) into another language (the target language).

    Никакой речи о "машинном коде" нет, как видишь)

    А если совсем душнить, то языки не делятся на компилируемые и интерпретируемые - это детали реализации.
    В теории для любого языка можно написать компилятор/транслятор или интерпретатор (и так действительно делают)

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

    2. В англоязычном интернете transpiler наоборот являются подмножеством compiler.
    Compiler - такая программа, которая преобразует код с одного языка на другой, причём из одного файла может получиться N файлов.
    А tanspiler - это такая программа, которая берёт исходный код на одном языке, и преобразует его в исходный код на другом языке, причём 1 файл преобразуется ровно в 1 файл.

    Получается, что tsc - это транслятор/транспайлер, а причислять их к компиляторам или нет - это дискуссионный вопрос.
    Ответ написан
    2 комментария
  • Как увеличить размер раздела без потери данных?

    Melkij
    @Melkij
    PostgreSQL DBA
    Disklabel type: dos

    вот и есть лимит в 2ТиБ, msdos label больше не умеет.

    - делаете бекап
    - внимательно сохраняете номер стартового и конечного сектора файловой системы
    - отмонтируете раздел
    - убираете disklabel msdos, создаёте gpt
    - создаёте новый раздел начинающийся в точности на той же позиции. Конец раздела можно сразу до конца диска сдвинуть
    - монтируете раздел, проверяете что файловая система на месте
    - resize2fs
    - правите fstab если надо
    Ответ написан
    2 комментария
  • Правильно ли я понимаю отношение классов "Композиция" в ООП?

    @Dementor
    программист, архитектор, аналитик
    Главного объекта, должны удалится все его составные части, потому что составная часть не может существовать без основного объекта. Верно?

    Нет такого утверждения в ООП и в реальном мире тоже нет. Взять ваш пример с человеком и органами - после смерти человека, его органы могут быть использованы для пересадки другим людям (если они здоровы и пересадка законна).
    Ответ написан
    7 комментариев
  • Сколько места доступно докер контейнеру на linux?

    @Drno
    если не ограничивать - занимает столько, сколько там данных
    Ответ написан
    Комментировать
  • Почему трейт не может быть результатом метода внутри трейта?

    vabka
    @vabka
    Токсичный шарпист
    В первом случае:
    fn chto_to(&self) -> impl StringAnalyzer;
    impl Trait значит, что функция возвращает неизвестную структуру, которая реализует трейт.
    Возвращаемое значение определяется компилятором в момент объявления функции.
    Внутри трейтов он это не может (хотя вроде хотят в будущем разрешить)

    Во втором случае:
    fn lexing<T>(&self) -> T where T: StringAnalyzer;
    Тут возвращаемое значение определяется по месту вызова.

    Если ты хочешь impl Trait использовать в трейтах - ты можешь использовать associated type:
    pub trait NewTrait {
      type AssociatedType: ExistingTrait;
      fn function() -> Self::AssociatedType;
    }
    Ответ написан
    1 комментарий
  • Как в этом сниппете кода работает владение (Rust)?

    vabka
    @vabka
    Токсичный шарпист
    Не может одновременно существовать mutable borrow и immutable borrow.
    Замыкание берёт mutable borrow и пока замыкание находится в области видимости - никто не может читать значение переменной.

    Мне кажется, лучше чем компилятор это не объяснит:
    Compiling playground v0.0.1 (/playground)
    error[E0502]: cannot borrow `counter` as immutable because it is also borrowed as mutable
      --> src/main.rs:11:30
       |
    7  |     let mut increase = || {
       |                        -- mutable borrow occurs here
    8  |         counter += INCR;
       |         ------- first borrow occurs due to use of `counter` in closure
    ...
    11 |     println!("counter = {}", counter);
       |                              ^^^^^^^ immutable borrow occurs here
    ...
    14 |         increase();
       |         -------- mutable borrow later used here
       |
       = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
    
    error[E0502]: cannot borrow `counter` as immutable because it is also borrowed as mutable
      --> src/main.rs:16:34
       |
    7  |     let mut increase = || {
       |                        -- mutable borrow occurs here
    8  |         counter += INCR;
       |         ------- first borrow occurs due to use of `counter` in closure
    ...
    14 |         increase();
       |         -------- mutable borrow later used here
    15 |
    16 |         println!("counter = {}", counter);
       |                                  ^^^^^^^ immutable borrow occurs here
       |
       = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
    
    error[E0503]: cannot use `counter` because it was mutably borrowed
      --> src/main.rs:18:12
       |
    7  |     let mut increase = || {
       |                        -- `counter` is borrowed here
    8  |         counter += INCR;
       |         ------- borrow occurs due to use of `counter` in closure
    ...
    14 |         increase();
       |         -------- borrow later used here
    ...
    18 |         if counter == STOP {
       |            ^^^^^^^ use of borrowed `counter`
    
    Some errors have detailed explanations: E0502, E0503.
    For more information about an error, try `rustc --explain E0502`.
    error: could not compile `playground` due to 3 previous errors
    Ответ написан
    6 комментариев
  • Сколько всего комбинаций будет?

    vabka
    @vabka
    Токсичный шарпист
    Если каждая из "маленьких переменных" принимает одно из 5 значений одного и того же множества вариантов, и при этом нам не важен порядок элементов, и при этом допускаются дубли, то это похоже на "Сочетание с повторениями".

    Количество сочетаний с повторениями считается по формуле:
    (n+k-1)! / ((k-1)! * n!)
    Где n - количество вариантов, а k - количество элементов.

    В случае с двумя элементами и двумя вариантами получается:
    (2+2-1)! / ((2-1)!*2!) = 3! / 2! = 3

    В случае с 50 элементами и 5 вариантами получается:
    (5+50-1)! / ((50-1)! * 5!) = 54! / (49! * 5!) = 3162510
    Ответ написан
    1 комментарий
  • Как сделать всплывающие окно с "ножной" на css?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    sqrt(10^2 + 20^2) = 22,36 != 20

    Исходя из этого, можно взять квадрат со стороной 22 пикселя, расплющить его в ромб (transform: skew(), градус посчитать или подобрать), повернуть на 45 градусов (transform:rotate()) и абсолютом прибить в нужное место.

    Кроме того, можно использовать варианты с SVG или clip-path.
    Ответ написан
    1 комментарий
  • Как правильно просить повышения зарплаты?

    @WaterSmith
    Android-разработчик. Java, Kotlin
    Вообще, вполне можно прямо вот так всё и рассказать начальству, как вы здесь написали.
    1. На настоящий момент я закрываю почти все таски на .Net
    2. Приставленный к моему проекту PM уже почти не участвует в моём проекте, я справляюсь сам.
    3. С момента трудоустройства вопрос о повышении зарплаты не поднимался, кажется пришло время, обычно зарплата пересматривается два раза в год.

    Удобный момент любой, вот прямо завтра идите к начальнику и говорите.
    Если захотите предварительно получить реальный оффер со стороны, он придаст вам уверенности, и даст последний аргумент, на случай если начальство не захочет повышать зарплату, а так, можете о нем даже не упоминать.
    Ответ написан
    2 комментария
  • Как асинхронно отслеживать изменение json?

    Vindicar
    @Vindicar
    RTFM!
    Либо обязать сервер пинать бота при обновлении JSON, либо периодически опрашивать JSON ботом.
    Если сервер отдаёт заголовок Last-Modified, то можно передавать в заголовке If-Modified-Since дату и время предыдущего успешного опроса. Тогда сервер либо ответит 304 Not Modified, либо 200 OK если были изменения.
    Ответ написан
    Комментировать