• ++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 если были изменения.
    Ответ написан
    Комментировать
  • Для чего внутри связного списка нужен массив?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    В тексте задания уже есть ответ на ваш вопрос:
    To better utilize memory, the list should include an array T=8 of structures representing a block


    Для экономии памяти. Такие гибридные структуры обладают характеристиками средними между списком и массивом. В список можно быстро вставлять и удалять из него элементы. В массивах можно быстро искать k-ый элемент и он занимает меньше памяти (не нужны указатели).

    Ваша структура позволяет добавлять и удалять элементы быстрее чем в массиве, но при этом занимает меньше памяти чем просто список, хоть и добавление и удаление элементов там медленнее, чем в списке.
    Ответ написан
    Комментировать
  • Зачем продают OEM-процессоры и рискованно ли покупать их?

    vabka
    @vabka
    Токсичный шарпист
    Зачем продают OEM-процессоры и рискованно ли покупать их?

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

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

    И нет, риски крайне малы (не больше, чем при покупке боксовых), если покупать у нормального продавца.

    Боксовый кулер мне не нужен

    А его сейчас в BOX и не кладут практически :)

    родная гарантия тоже особо не нужна

    У OEM процессоров гарантия ровно такая же, как и у BOX.

    Из-за чего они появляются и могут ли они быть хуже, чем боксовые?

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

    На фото лотки от райзена, но для интела примерно что-то похожее.
    119787-amd-ryzen-cpu-pictured-2.jpg
    Ответ написан
    9 комментариев
  • Есть ли смысл делать анимацию без JS?

    neuotq
    @neuotq
    Прокрастинация
    Анимация = анимации рознь.

    Конкретный ответ со списком вы тут не увидите, это будет большая статья, со множественными "а вот тут", "но здесь" просто потому что многое зависит от контекста, задач, планирование.
    Главные рекомендации это не делать на js то, что отлично реализуется с помощью css. Этим к сожалению часто болеют многие фронтендеры, особенно из тех кто принципиально не любит вёрстку. Банальные примеры некоторые виды трансформаций объектов при булевых сменах какого параметра(условно навел/убрал наведения, вкл-выкл и тп).

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

    Поэтому просто зная возможности css, имея здравый смысл, вы будете видеть и знать где что использовать.
    К счастью css тоже в последнее время активно развивается давай нам всё больше возможностей.
    Поэтому - простая штука, что-то типа одноразовых анимации, простого повторения, туда сюда - подумать про css.
    Если к этому добавляются всякие реакции на сложные тайминги, старт-пауза перемотать остановить на промежутке и тп - js.
    Ну и безусловно разные сложные, многоходовки с завязкой друг на друга - однозначно js.

    В целом информации на эту тему достаточно в интернете, мудрить здесь особо не стоит. Поэтому повторюсь: просто здравый смысл и держать в уме знание css и не брезговать его использовать. Нередко кстати сами верстальщики уже готовят эти анимации, но это уже отдельный разговор организации команд и внутрипроектной кухни. Я сторонник того что фронтэндер, пусть и не обязан прям верстать верстать, но знать вёрстку/css должен на очень хорошем уровне.
    Ответ написан
    Комментировать
  • Имеется ли в C++ данный синтаксис?

    @rPman
    Смотрим исходники (как же там неудобно искать, проще было склонировать и найти в файлах)

    Видим что этот дефайн ожидает первым аргументом X часть имени определяемых им переменными и функциями, а вторым, аргументы перед ними, т.е. в твоем примере это static (для макросов нет никакой разницы что в аргументах, лишь бы разбиралось на лексемы даже на скобки кстати пофиг)

    Описание аргументов ,... это variadic т.е. можно несколько аргументов писать в вызове макроса, они все передадутся как есть (есть разные способы их развертывания)

    Вот к примеру твой пример развернется в
    static vnet_feature_arc_registration_t vnet_feat_arc_ip4_unicast;
    static void __vnet_add_feature_arc_registration_ip4_unicast (void)
      __attribute__((__constructor__)) ;
    static void __vnet_add_feature_arc_registration_ip4_unicast (void)
    {
      vnet_feature_main_t * fm = &feature_main;
      vnet_feat_arc_ip4_unicast.next = fm->next_arc;
      fm->next_arc = & vnet_feat_arc_ip4_unicast;
    }
    static void __vnet_rm_feature_arc_registration_ip4_unicast (void)
      __attribute__((__destructor__)) ;
    static void __vnet_rm_feature_arc_registration_ip4_unicast (void)
    {
      vnet_feature_main_t * fm = &feature_main;
      vnet_feature_arc_registration_t *r = &vnet_feat_arc_ip4_unicast;
      VLIB_REMOVE_FROM_LINKED_LIST (fm->next_arc, r, next);
    }
    static vnet_feature_arc_registration_t vnet_feat_arc_ip4_unicast

    Заметь что последняя строчка не завершена, нет ";", значит если после вызова этого макроса поставить = ... то пойдет определение значения переменной vnet_feat_arc_ip4_unicast
    а запись через { .имя_поля=значение,...} это удобный способ инициализировать структуры
    Ответ написан
    1 комментарий
  • Как узнать, какой тип у элементов?

    yarkov
    @yarkov Куратор тега JavaScript
    Помог ответ? Отметь решением.
    7 комментариев
  • Почему postgres не считает null уникальным значением?

    Fragster
    @Fragster
    помогло? отметь решением!
    Это фича (и не только postgres). Поступить - поменять индекс, сделав его не UNIQUE, а UNIQUE NULLS NOT DISTINCT
    (и да, эта фича доступна только в постгре 15. для более ранних версий нужно хранить в этом поле не NULL, а, например, 0 (но тут есть свои нюансы с foreign keys))
    Ответ написан
    4 комментария
  • Тег < p > и < span >. Есть разница?

    vabka
    @vabka
    Токсичный шарпист
    Разница в том, что span не несёт никакого семантического смысла, а p несёт и является параграфом.
    Ответ написан
    5 комментариев
  • Чем отличается наследование в ооп от протипированного наследования?

    Stalker_RED
    @Stalker_RED
    Вопрос некорректный, различий не может быть, так как прототипы - разновидность ООП.

    Отличие с классами есть:
    Прототипное программирование # Сравнение с класс-о...
    В языках, основанных на понятии «класс», все объекты разделены на два основных типа — классы и экземпляры. Класс определяет структуру и функциональность (поведение), одинаковую для всех экземпляров данного класса. Экземпляр является носителем данных — то есть обладает состоянием, меняющимся в соответствии с поведением, заданным классом.

    Сторонники прототипного программирования часто утверждают, что языки, основанные на классах, приводят к излишней концентрации на таксономии классов и на отношениях между ними. В противоположность этому, прототипирование заостряет внимание на поведении некоторого (небольшого) количества «образцов», которые затем классифицируются как «базовые» объекты и используются для создания других объектов. Многие прототип-ориентированные системы поддерживают изменение прототипов во время выполнения программы, тогда как лишь небольшая часть класс-ориентированных систем (например, Smalltalk, Ruby) позволяет динамически изменять классы.

    Хотя подавляющее большинство прототип-ориентированных систем основаны на интерпретируемых языках с динамической типизацией, технически возможно добавить прототипирование и в языки со статической проверкой типов. Язык Omega является одним из примеров такой системы.
    Ответ написан
    1 комментарий