• Вопрос с собеседования на Java Бекенд. Как гарантировать согласованность операций?

    Я не из МТС банка, но у нас в собесе тоже есть похожий вопрос, но я бы не назвал его простым, так как там дальше ещё много дополнительных вопросов и обсуждений можно невертеть.

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

    Самый простой и часто используемый вариант - Outbox.

    Смысл в том, что мы должны в нашей основной базе завести таблицу, в которой будет записано, что нам нужно отправить запрос в тот сервис и с какими параметрами. (Например отправить письмо по электронной почте)

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

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

    Переносить взаимодействие со сторонним сервисом в Outbox также имеет смысл из-за того что ты не можешь гарантировать его доступность и задержки - если будешь работат с ним при обработке запроса от клиента по API, то можешь просто упасть по тайм-аут.

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

    66ab5b548e5a9142225375.png

    Благодаря тому что мы записываем основные бизнес-данные и намерение сделать запрос в сторонний сервис в одной транзакции - мы гарантируем, что мы не будем отправлять запрос, если данные не записались и наоборот - если данные записались, то мы гарантируем, что попытаемся рано или поздно отправить запрос.
    Ответ написан
    3 комментария
  • Зачем передавать функцию как параметр через указатель с++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Чтобы модифицировать поведение. Вы передаете в качестве параметра - что делать. Вместо того, чтобы писать отдельно несколько функций, отличающихся лишь маленькой частью, вы пишите лишь одну функцию, где эта маленькая различная часть - вынесена в передаваемую функцию.

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

    Или у вас вопрос, почему указатель? Ну ведь фунция - это огромный кусок кода в памяти. Логично же ее передавать как указатель, как и массивы, например. Но тут есть еще и низкоуровневая проблема - в процессоре есть защита от исполнения данных. Без дополнительных танцев с бубном, вы никак данные не выполните, даже если там записан корректный машинный код. Поэтому все функции записаны в read-only секции памяти, специально помеченной, как разрешенная к исполнению. Поэтому единственный сопособ как-то эти данные куда-то передать - это указатель туда. Сами данные-то не перемещаемые.
    Ответ написан
    1 комментарий
  • Изучение vue без хорошего знания JS?

    @SigmaMale
    Middle Frontend developer (плюс минус middle)
    Использовать vue не зная JS теоретически можно, при условии, что умеете программировать на другом языке, но Ваши возможности будут очень сильно ограничены.

    Кроме того, решение самых простых проблем и ошибок превратится для Вас в ад. Получится замкнутый круг: Вы не знаете JS потому что не любите его, а не любите потому что у Вас будет негативный опыт с ним, который возникнет из за того, что Вы не знаете JS.

    Скорее всего, Вы не любите JS из за того, что уже привыкли к логике и синтаксису Go. Человеческий мозг не очень любит оказываться в новой обстановке. Среднестатистический программист знает 3 языка программирования, если Вы планируете работать в этой области, то рано или поздно Вам придется работать с другими, не привычными технологиями. По сути, в Вашем случаи, лучший способ полюбить JS - это поработать с ним какое то время, что бы мозг привык. В прошлом я сильно не любил язык PHP, так было до тех пор, пока я не поработал с ним какое то время и не привык ко всем его странностям. Сейчас я к нему нейтрально отношусь.

    P.S.
    и на vue просто в 1 файле сделал разметку с css и используешь в других страницах, а в HTML нужно копировать html и переносить, что не особо нравится.

    Для вёрстки Вы можете начать использовать шаблонизаторы (pug) и препроцессоры (SCSS). Они решают описанную Вами проблему. Обычно для их компиляции используют gulp или webpack, но Вам как новичку я рекомендую использовать программу preposs. Хотя в целом, для маленьких тестовых проектов - это вообще не проблема.
    Ответ написан
    2 комментария
  • Почему для самого класса статическая переменная использует правильное значение, но при попытке вывести его, выдаёт 1?

    @rPman
    static int Print(){
    это ФУНКЦИЯ
    для ее вызова нужно использовать скобки
    Bacteria::Print()
    иначе ты получаешь ее адрес
    Ответ написан
    7 комментариев
  • Чем технически отличаются dev-, prod- и peer-зависимости в Node JS?

    peer-зависимости - обычно предназначены для подключения особо крупных библиотек
    Крупность тут ни при чём. Peer-зависимости нужны для реализациии чего-то типа плагинов - они позволяют этому самому плагину сказать "я работают в такой-то библиотеке такой-то версии, но сама эта библиотека в моём коде не используется". Таким образом при установке плагина проверяется, что на одном с ним уровне есть эта библиотека, но в зависимости плагина она не тянется.

    Теоретически, мы могли бы отмечать и мелкие библиотеки как peer-зависимости.
    Peer-зависимости вообще не используются в конечных приложениях, они нужны только для библиотек, которые сами будут распространяться как пакеты. А у таких библиотек не может быть много peer-зависимостей по определению.

    Ну и вообще-то не особо понятно, в чём конкретно у вас вопрос.
    Ответ написан
  • Как пересобрать массив объектов, выкинув из него лишнее?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Как-то так, если без учёта дубликатов, в один проход.
    function removeSomeShit(arr) {
      const table = {};
      const result = [];
    
      for(const current of arr) {
        const {uid, owner, createdAt} = current;
    
        const uidOvnerKey = `${uid}\0${owner}`;
        const ownerUidKey = `${owner}\0${uid}`;
    
        const matched = table[uidOvnerKey];
    
        if (matched) {
          delete table[uidOvnerKey];
          result.push(matched.createdAt > createdAt ? matched : current);
        } else {
          table[ownerUidKey] = current;
        }
      };
      
      return Object.values(table).concat(result);
    }
    Ответ написан
    1 комментарий
  • По какому принципу работает алгоритм с массивом очереди?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Много разных вариантов для структур данных. Например, кольцевой буфер. Или связный список. В этом случае можно удалять элемент с начала, не сдвигая все элементы в массиве.
    Ответ написан
  • Возможно ли идеальное шифрование?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Идеальным считается Шифр Вернама. В принципе это идея Книги Кодов или одноразового блокнота.
    При его использовании Алиса и Боб могли-бы спокойно переписываться и быть уверенными что никто
    их не читает. Но здесь возникает вопросы.

    Как Алиса и Боб ей обменяются?. Совершенно очевидно что
    классические цифровые каналы здесь не подходят. Нужна личная встреча. Иначе слабым местом
    в протоколе становится не Вернам а тот способ которым произошел обмен.

    Как ее сгенерируют?
    Нельзя использовать классические ГПСЧ иначе они станут еще
    одним слабым местом. Очевидно что книга кодов должна создаваться очень оригинальным
    и неповторимым методом который не дает злоумышленнику (Кларку например) никаких
    гипотез. Аналоговый шум радиоэфира. Рулетка. Игральные кости. Карты. Короче
    любые источники энтропии которые никак не связаны с цифровым миром где Кларк
    может строть гипотезы. Кроме того книга кодов (КК) должна быть достаточно
    длинной (я-бы рекомендовал терабайты) чтобы Алиса и Боб хотя-бы на пару
    лет могли не встречаться повторно для обмена новой книгой.

    И надежность самого десктопа Алисы и Боба. Наука криптография (К) полностью
    не изучает этот вопрос. Тоесть К является как-бы частью ИБ и полностью доверяется ей.
    И любой троян на десктопе Алисы может полностью обнулить все наши утверждения
    о надежности Вернама и книги кодов потому что книга кодов уже скомпрометирована
    и Алисе с Бобом надо договариваться снова о следующем протоколе.
    Ответ написан
    Комментировать
  • Как работает Jinja?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Jinja
    Седой и строгий
    Jinja, как и любой другой шаблонизатор, выполняется на бэкенде. Конкретно Jinja ещё и про html не знает вообще ничего, для него шаблон - это набор инструкций и какой-то текст, а результат работы - просто строка.
    Ответ написан
    Комментировать
  • Как посчитать сколько раз повторяется значение обьекта?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    [value.language]: i
    Вы ничего не считаете, а записываете индекс элемента в массиве. Си у вас идёт в нулевом элементе, вот и получается 0.

    Решение очевидно
    Нужно поменять местами первый и второй элемент массива, тогда будет формироваться корректный объект. (нет)
    Ответ написан
    Комментировать
  • Использует ли WSL виртуализацию Hyper-V?

    Ответ написан
    Комментировать
  • Функции в питоне. Как избавиться от None?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Что возвращает функция print()?
    # s=print("Ниже нуля:", count1,'Выше нуля:',count,'Равно нулю',count2)
    s = f"Ниже нуля: {count1}, Выше нуля: {count}, Равно нулю: {count2}"

    https://stackoverflow.com/questions/28812851/why-i...
    https://stackoverflow.com/questions/7053652/why-is...
    Ответ написан
    1 комментарий
  • В чём проявляется зависимость c++ от железа и касается ли это Rust?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Многие пишут, что C++ - низкоуровневый язык и программы могут не работать на разных платформах в отличии от той же Java и касается ли эти проблемы Rust?

    Касается, и это не проблема, а фича.

    C/++, rust и go требует компиляции под конкретное железо. Для Java и C# необходима компиляция в промежуточный код (java байт-код и CIL соответственно) под их виртуальную машину (JVM и .NET соответственно). Виртуальная машина позволяет практически не заботиться о том, на каком железе будет выполняться написанное приложение, если конечно данное железо/os поддерживает эту виртуальную машину.

    Однако, Java и C# могут быть так же скомпилированы сразу в машинный код (AOT), но это не является обязательным. Данная компиляция так же производится под конкретное железо.
    Ответ написан
    Комментировать
  • Почему printf() выводит нули после точки?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    потому что int cusBal[10]. У вас массив целых чисел, вы его инициализируете константой 35.50. При этом происходит приведение к типу int и часть после точки с запятой теряется.

    Вторая проблема, вы эту int переменную выводите через "%.2f". Так что вам еще очень повезло, что оно вывело вообще что-то похожее на нужное число.

    Об обеих ошибках компилятор вам выдавал предупреждение (если он правильно настроен). Их все надо внимательно прочитать и убедиться, что они все безобидные, а лучше, чтобы их вообще не было.
    Ответ написан
    Комментировать
  • #Define TRUE FALSE. Что произойдёт?

    GavriKos
    @GavriKos
    1. Читаешь что такое define и когда он срабатывает
    2. Пробуешь сам в онлайн-компиляторе.

    В таком виде - ничего не произойдет, true-false с маленькой буквы должны быть. Если очень кратко что произойдет - все true в коде заменятся на false.
    Ответ написан
    Комментировать
  • Что так с моим кодом?

    @kaka888
    C, C++, Qt, Python Flask, MySQL, Lua
    Дык попробуйте скомпилировать свою программу и увидите следующую ошибку:
    main.cpp: In function ‘int main()’:
    main.cpp:19:35: error: ‘a’ was not declared in this scope
       19 |                 arr[i] = new int [a];
          |                                   ^

    Здесь сказано, что переменная `a` не определена. Её и правда нигде в коде нет.

    Память, выделенная для подмассивов внутри arr, не освобождается = утечка памяти. Вы же выполняете сначала один new, а потом в цикле выполняете ещё new для каждого подмассива. Освобождать память с помощью delete надо по такой же логике - сначала для подмассивов, а потом только для самого arr - delete[] arr.
    Ответ написан
  • Зачем использовать кучу если есть стек? а так же где применяются указатели и ссылки?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Проблема стека в том, что там лежат только локальные данные, которые исчезнут вместе с выходом из функции. Кроме того, обычно размер всех переменных на стеке известен во время компиляции. Некоторые языки умеют выделять на стеке массивы переменной длины, но даже не все C++ компиляторы так умеют. В самом стандарте языка c++ - таких масивов нет. Поэтому стек часто не подходит.

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

    Т.е. если вам нужны данные доступные вне какой-то функции, да еще их точный размер и/или количество неизвестно на этапе компиляции - вам нужно что-то кроме стека и глобальных переменных. Это и есть куча.
    Ответ написан
    4 комментария
  • Выбор загрузки дистрибутивов с Bluetooth клавиатуры?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Вам не нужно устанавливать три разные ОС: достаточно поставить дебиан с xfce, затем поставить на него коди и ретропай. Если хотите четко разделить пространства - то просто заведите три отдельных пользователя и в каждом сделайте разную оболочку - коди/ретро/xfce. Для коди и ретро настраиваете вход без пароля (для рабочей учетки - по желанию), а так же показ списка пользователей на экране входа. И не надо городить костыли с несколькими ОС. Под систему и ретро игры сразу используйте SSD и обычный HDD под фильмы и прочее.
    Ответ написан
    2 комментария
  • Почему экраны имеют разрешения не кратны степени 2? Почему 1080, а 1024, если вместо умножения на 1080, можно сдвинуть 10 байт?

    @d22b
    1080 или 1980


    Потому что делятся на 9 (в обеспечение формата 16:9). А ранее были 600 и 768 делящиеся на 3 (в обеспечение формата 4:3).
    Ответ написан
    Комментировать