Задать вопрос
  • Как скопировать данные с одного 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 без привлечения вордпресса вообще. Может оказаться неудобным, если в процессе обработки такого запроса нужно лезть в БД вордпресса.
    Ответ написан
    Комментировать
  • Как в коде в стиле "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.
    Ответ написан
  • Какой стек технологий выбрать для высоконагруженного MVP?

    @Akela_wolf
    Extreme Programmer
    Писать надо на том, что знаешь. От языка способность держать высокую нагрузку зависит слабо - есть вполне себе хайлоад (лично видел, платежная система), написанный на PHP.
    Для серьезного хайлоада важнее другая характеристика: не скорость работы, а стоимость ошибки. Если ваш хайлоад "ляжет" из-за какой-то ошибки (да еще с потерей части данных) - это будет очень-очень-очень плохой экспириенс для пользователей. А если это будет происходить неоднократно - потеря посетителей вам гарантирована.
    Поэтому у меня для хайлоада приоритеты:
    1. Надежность
    2. Скорость разработки
    3. Производительность

    Итак, по пунктам.
    Надежность. Это про то, насколько строго язык отлавливает ошибки программиста и насколько просто на нем написать подверженную ошибкам муть. Насколько просто будет сопровождать код, написанный на данном языке. В этом пункте ключевые слова "архитектура", "покрытие тестами" и "статическая типизация". Первые два пункта - это про любой язык, так как реализуются на уровне процессов разработки. Из предложенного списка языков статическую типизацию обеспечивают Java (Kotlin) в мире JVM и Typescript (не Javascript) в мире Node.js

    Скорость разработки. Это про наличие большого количества готовых библиотек и про богатые возможности языка для выражения требуемых программисту структур данных и алгоритмов. Тут фавориты те же: Java/Kotlin и Typescript. На мой взгляд, JVM-мир сложнее, но дает все-таки больше возможностей (тот же Spring обеспечивает создание бинов за пару аннотаций).

    Производительность. Не могу сказать о Node.js - не тестировал на производительность, но JVM обеспечивает очень хорошую скорость. Еще один немаловажный момент: очень часто в хайлоаде приложение чего-то ждет. Например, отправив запрос в БД ожидает ответа. А в это время могло бы обрабатывать другой запрос другого пользователя, а получив ответ из БД - вернуться к обработке первого (reactive programming). Для этого у нас есть разные реактивные фреймворки для той же Java (Reactor, Vert.x и т.п.) и, что особенно приятно, корутины в котлине, которые позволяют писать асинхронный код почти настолько же просто как и синхронный. На Javascript с их async/await тоже можно такое писать, хотя возможностей все-таки поменьше чем в Котлине.
    Опять же, с корутинами достаточно легко и просто реализуется многопоточность, в ноде с ней не все так просто (хотя она тоже есть).

    Таким образом, мой личный выбор для хайлоада: JVM и Kotlin.
    Альтернативный вариант: Node.js и Typescript.

    Другие я бы стал рассматривать только при наличии очень весомых преимуществ перед обозначенными.

    P.S. Также Kotlin является официальным языком для Android, поэтому можно подумать о том чтобы писать и мобильное приложение и сервер на одном языке.
    Ответ написан
    Комментировать