• Как скопировать данные с одного volume на другой?

    @Akela_wolf
    Extreme Programmer
    1. Написать Dockerfile в котором будет доступна команда cp (или взять любой подходящий)
    2. Запустить, примонтировать в него оба volume
    3. docker exec -it cp -R
    Ответ написан
    Комментировать
  • Как исправить ошибки в программе "Побитовое шифрование"?

    @Akela_wolf
    Extreme Programmer
    Зачем вы извращаетесь со строкой alfa?
    Откройте для себя метод String.getBytes() и вообще разберитесь что такое кодировка символов.
    Ответ написан
    Комментировать
  • Thymeleaf, th:text не работает, если находится внутри другого th:text, как обойти?

    @Akela_wolf
    Extreme Programmer
    Наверное так? Иначе подстановка содержимого в тег h4 затрет тот шаблон, который вы в нем написали.
    <h4><span th:text="${product.name}">Some product</span><span th:text="${product.getPrice()}">45</span></h4>
    Ответ написан
    1 комментарий
  • Как сделать deploy без простоя?

    @Akela_wolf
    Extreme Programmer
    Принцип следующий:
    1. Делаете контейнер с фронтом-балансировщиком (nginx или что-то подобное).
    2. Запускаете второй контейнер с бэком, содержащий новую версию.
    3. Новый контейнер подключается к балансировщику. Тут дальше возможны варианты - балансировщик автоматически начинает переводить траффик на новую версию. Или в каком-то соотношении. Или только тестовый трафик. Или переключаете балансировщик на новый контейнер вручную. Или... (в общем вариантов тут много). Идея в том, чтобы перейти в целевое состояние - запросы обрабатывает новый бэкэнд. На этом этапе старая и новая версия бэкэнда должны уметь работать параллельно, то есть часть запросов может обрабатываться старой версией, часть новой, что налагает на новую версию требование сохранения обратной совместимости со старой версией (в частности это ограничивает возможные изменения структуры БД). В любой момент, если новая версия заработала как-то не так, можно "вертать всё взад", то есть опустить контейнер с новой версией и вернуть весь трафик на старую.
    4. Убедившись что новая версия работает стабильно, переводите с балансировщика весь трафик на новую и опускаете контейнер со старой версией, оставляя контейнер с новой единственным.

    Не очень понимаю что вы подразумеваете под контейнером с фронтендом, если это просто веб-сервер, который раздает SPA-приложение (HTML/CSS/JS), то в принципе аналогично.

    Схема такого апгрейда не слишком проста в реализации, поэтому такой апгрейд (zero-downtime upgrade) применяется в энтерпрайзе, в котором никак нельзя допустить простоя в обслуживании. Поэтому смотрите сами - насколько те несколько секунд (максимум минут) простоя за которые запускается новый контейнер стоят этой возни. Если такой апгрейд действительно нужен, то советую вместо docker compose посмотреть в сторону kubernetes.
    Ответ написан
    2 комментария
  • Различен ли оффсет у разных партиций одного топика Kafka?

    @Akela_wolf
    Extreme Programmer
    Каждый консьюмер читает свои партиции и у каждой партиции свой оффсет.
    Ответ написан
    Комментировать
  • Зачем таблицам в базах данных многих сайтов задают префикс?

    @Akela_wolf
    Extreme Programmer
    Если сайт размещается на shared хостинге (он же виртуальный хостинг), то на дешевых тарифах часто доступна только одна БД. Либо вторая-третья и т.д. за дополнительную плату. А на сайте иногда требуется разместить несколько приложений, каждое со своим набором таблиц в БД. Тогда, чтобы иметь возможность запихнуть их в одну БД и придумали префиксовать таблицы. Таким образом у CMS они свои, у форума - свои, у гостевой - свои, у фотогалереи - свои и т.д. И даже при совпадении имен, благодаря префиксам, конфликтов не возникает все работает.
    Но это, вообще говоря, от безысходности. Лучше так не делать и все-таки каждому приложению выделять собственную БД.
    Ответ написан
    Комментировать
  • Как суммировать вывод двух потоков?

    @Akela_wolf
    Extreme Programmer
    Так как написано у вас - никак. Потоки сами вызывают println, то есть выводят на экран. И ничего вы с этим не сделаете. Нужно сделать так, чтобы потоки обменивались данными с другим (главным) потоком, который уже будет выполнять обработку данных и выводить на экран. Например через очереди.
    import java.util.Queue;
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.BlockingQueue;
     
    public class Main {
     
        static class Task extends Thread {
     
            private final Queue<Integer> queue;
     
            public Task(Queue<Integer> queue) {
                this.queue = queue;
            }
     
            @Override
            public void run() {
                for (int i=0; i<=10; ++i) {
                    queue.add(i);
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
     
        public static void main(String[] args) throws InterruptedException {
            final BlockingQueue<Integer> queue1 = new ArrayBlockingQueue<Integer>(100);
            final BlockingQueue<Integer> queue2 = new ArrayBlockingQueue<Integer>(100);
     
            final Thread thread1 = new Task(queue1);
            thread1.start();
            final Thread thread2 = new Task(queue2);
            thread2.start();
     
            while(true) {
                System.out.println(queue1.take() + queue2.take());
            }
     
        }
    }
    Ответ написан
  • PostgreSQL - какой тип данных лучше использовать для валюты?

    @Akela_wolf
    Extreme Programmer
    Вообще, если говорить о деньгах, то крайне маловероятно что у вас будут доли копеек (центов и т.п.). Поэтому, можно хранить денежные суммы в виде пары "целое число" (long) + "код валюты" (целое или строка, код валюты ISO). К этой структуре, тогда, нужно иметь справочник валют, в котором будет точность валюты т.е. множитель для перевода из рублей в копейки, из долларов в центы, из евро в евроценты (1 к 100). А, например, у юаня этот множитель будет 1, так как эти денежные единицы не делятся на доли. У биткоина этот множитель будет 10^8 (сатоши).

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

    @Akela_wolf
    Extreme Programmer
    Допустим все эти пользователи входят в группу editors
    1. Повесить группу editors на каталог /var/www/html
    2. Установить SGID бит на этом каталоге.

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

    @Akela_wolf
    Extreme Programmer
    Я бы сделал как background-image
    Думаю что это проще в верстке, и сопровождении: вот есть некий элемент оформления сайта (который можно вынести в отдельный banner.css и подключить куда нужно), вот есть текст. То что вы хотите на небольших экранах через CSS, насколько я понимаю, вполне реализуется. Так зачем добавлять лишние теги, если можно без них?
    Ответ написан
    Комментировать
  • Стоит ли переплатить за процессор?

    @Akela_wolf
    Extreme Programmer
    Смотрите, главное различие между ними это количество ядер
    У 5600G - 6 ядер/12 потоков
    У 5700G - 8 ядер/16 потоков

    Еще у 5700 более мощная видеокарта встроена.

    Собственно далее вопрос: у вас, в вашей нагрузке будет чем утилизировать эти дополнительные 2 ядра/4 потока? Это либо задачи, которые хорошо параллелятся, либо большое количество процессов (виртуальные машины, например). Я в свое время взял 1700 первого поколения именно из-за этих дополнительных ядер по сравнению с 1600. Собственно никаких проблем с пиковой загрузкой проца не имею. Может быть хватило бы и 6 ядер, может быть и 4. Но, поскольку комп я брал надолго (и мне его более чем хватает на данный момент), то решил брать максимально доступную конфигурацию (был еще Threadripper, но его цена чуть более чем неприличная).

    Занимаюсь разработкой на Java и время от времени играю в не особо требовательные игры.

    Лично я при таких условиях взял бы 5700, но решать разумеется вам.
    Ответ написан
    Комментировать
  • Как лучше организовать структуру сайта услуг?

    @Akela_wolf
    Extreme Programmer
    Я бы вытащил раздел "Проблемы" на верхний уровень. А уже в нем сделал подразделы: компьютеры-телефоны-телевизоры и т.д. Это привлечет внимание пользователей к важному слову, потому что на подобный сайт приходят чтобы решить имеющуюся проблему, то есть это понятие в навигации сайта должно быть первым.

    И так же, на верхнем уровне, форму "Задать вопрос" или "Описать проблему", если функционал сайта такое предполагает.
    Ответ написан
    Комментировать
  • Как научиться писать большие проекты в одиночку и не сойти с ума?

    @Akela_wolf
    Extreme Programmer
    Роберт Мартин. "Чистая архитектура"
    Ответ написан
    Комментировать
  • Как отправлять в Telegram-канал новости со своего сайта на Django?

    @Akela_wolf
    Extreme Programmer
    1. Создать бота (статей множество)
    2. Добавить его в канал
    3. Узнать ID канала (бот получает его в своем сообщении, можно записать в лог, например)
    4. Прописать ID канала боту в настройки
    5. Написать боту логику: проверяй новые записи в БД каждые N минут. Если есть - отсылай сообщение в канал с данным ID
    6. Готово

    В пункте 5 можно реализовать другую логику уведомления о статьях, в том числе подписку на события, отправление которых настроить в Django. Я в свое время делал именно через события, но у меня бот был "встроен" внутрь серверной части приложения так что с этим никаких проблем не было в принципе. Как у вас - не знаю, поэтому предлагаю 2 варианта.
    Ответ написан
    1 комментарий
  • Как создать на Wordpress страницу ответа на GET-запрос?

    @Akela_wolf
    Extreme Programmer
    Тут у вас 3 варианта:
    1. Найти плагин для вордпресса (если сервис бронирования более-менее популярен, то, возможно, кто-то уже озаботился таким плагином).
    2. Написать плагин самостоятельно (или заказать его разработку).
    3. Написать эту страницу на PHP без привлечения вордпресса вообще. Может оказаться неудобным, если в процессе обработки такого запроса нужно лезть в БД вордпресса.
    Ответ написан
    Комментировать
  • VM vs native, какие плюсы и минусы?

    @Akela_wolf
    Extreme Programmer
    Плюсы VM:
    1. Главный плюс - переносимость. У нас есть VM и байт-код, работать это будет на любой платформе для которой есть VM. В частности девиз Java: write once, run anywhere.
    2. Упрощение взаимодействия между разными языками. В случае native, например, у нас есть библиотека на C++ и код на Go - как их подружить? Это возможно, но это дополнительная сложность и трудоемкость. В случае JVM у нас есть interoperability между Java, Scala, Kotlin, Groovy и т.д. В случае JS - аналогично, между Javascript, Typescript, Kotlin.js, Dart. Конечно там есть свои особенности, например использовать Kotlin coroutines из Java-кода не так просто, но в целом, на базовом уровне все вполне пристойно работает вместе.
    3. JIT-оптимизация. JIT-компилятор может собирать статистику работы конкретного экземпляра программы, выявлять hot paths и оптимизировать именно их. При компиляции такую оптимизацию сделать невозможно т.к. она зависит от рантайма (в частности от данных с которыми работает программа)

    Минусы:
    1. Зависимость от VM. Коду, очевидно, нужна VM. Во многих продуктах приходится поставлять VM вместе с продуктом, чтобы не зависеть от установленного в системе софта. Это увеличивает объем дистрибутива.
    2. Поскольку перед стартом программы должна стартовать VM - программа стартует дольше
    3. Производительность. В общем будет ниже чем у native кода. Хотя в очень многих случаях это не будет критично.
    Ответ написан
    Комментировать
  • Как в коде в стиле "clean architecture" использовать транзакции?

    @Akela_wolf
    Extreme Programmer
    Тут все довольно просто. У нас есть слой бизнес-логики, который имеет 3 интерфейса:
    TransactionManager - собственно менеджер транзакций
    OrderRepository - репозиторий заказов
    PaymentRepository - репозиторий платежей

    И, допустим, нам нужно транзакционно сделать следующий сценарий: "при получении платежа записать его в БД и изменить статус заказа на PAID" (пишу пример на Kotlin, надеюсь понятно)
    transactionManager.inTransaction {
      order.status = PAID
      paymentRepository.save(payment)
      orderRepository.save(order)
    }

    Собственно дальше - это уже вопрос реализации TransactionManager. Если мы имеем дело с простым случаем, таким как хранение данных в SQL Database, то его реализация должна быть понятна. Если более сложный случай - то распределенные транзакции, либо пустая реализация (транзакционность не поддерживается). Разумеется, при инжекции зависимостей в модуль бизнес-логики реализация менеджера транзакций должна соответствовать реализации репозиториев (мало толку будет если менеджер транзакций реализует транзакционность в БД, а репозитории - хранение в файлах). Но это уже слегка другой разговор, тут на помощь приходят фабрики и подобные шаблоны.
    Ответ написан
    6 комментариев
  • Как создать кнопку на сайте, которая блокирует функционал до завершения действия кнопки?

    @Akela_wolf
    Extreme Programmer
    Что значит "блокирует функционал"? Запрещает взаимодействовать с сайтом?

    Повесьте "поверх всего" прозрачный (или полупрозрачный) (position: fixed, размер по окну браузера), который будет перехватывать все клики. Таким образом, пользователь кликать по контенту сайта не сможет никак. Останутся нажатия кнопок на клавиатуре, но это уже по специфике сайта надо смотреть.
    Ответ написан
    4 комментария
  • Как минимизировать логическое выражение?

    @Akela_wolf
    Extreme Programmer
    Что-то мне не кажется что эти два выражения равны. Второе выражение будет равно единице если A=0 и любых значениях остальных B, C, D

    Но если мы подставим в первое A=0 и любое из B, C, D = 1, то получим 0.

    А вообще: создаем таблицу истинности первого выражения (всего 16 строк), переводим в нормальную дизъюнктивную форму, выбрасываем лишние члены. Например, если получилось ABC + !ABC, то это, очевидным образом упрощается до BC.
    Ответ написан
    Комментировать
  • Как назвать этот процесс?

    @Akela_wolf
    Extreme Programmer
    А первый проект прям проект-проект или по сути скрипт сборки второго проекта?
    Пока выглядит так, что эти три проекта (2-4) суть модули какой-то системы. А первый - часть buildscript этой системы.

    По крайней мере так было бы в моем мире JVM и Gradle.
    Ответ написан