• Как переиспользовать сервис в docker-compose?

    pxz
    @pxz
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    Добрый день!

    Можно так:
    version: '3.9'
    
    x-app:
      &php
      restart: always
      working_dir: /app
      environment:
        ...
      volumes:
        ...
    
    app:
        <<: *php
        image: php8_fpm
        build:
          context: ./docker/fpm
          target: php8_fpm
          dockerfile: Dockerfile
    
    queues:
        <<: *php
        image: php8_fpm
        command: php artisan horizon
        depends_on:
          - app
    Ответ написан
    1 комментарий
  • Какая хорошая книжка по TypeScript для тех, кто знает только JS и не приходил в этот мир из языка Си с ООП?

    vabka
    @vabka
    Токсичный шарпист
    Для того чтобы изучать Typescript, необходимо знать только JS, ибо это и есть js, просто с дополнительными проверками.
    https://www.typescriptlang.org/
    которые вообще непонятны зачем они там, типа интерфейсы и прочее, только лишний код и куча лишних файлов

    Тогда может тебе не нужен TS, раз для тебя это лишнее?
    Весь этот лишний код нужен для того чтобы описывать типы.
    Хотя в принципе - это необязательная часть TS. Он может работать и без них, хоть и менее точно. А типы в параметрах функций можно описывать через jsdoc

    Нужно это для того чтобы:
    1. Повысить надёжность кода, избавившись от ошибок, вызванных опечатками, забыванием о null/undefined, опасным неявным преобразованием типов, и попыток выполнения неразрешённых операций над данными.
    2. Повысить удобство разработчика, предоставив ему более точные подсказки в редакторе.

    Если для тебя эти два пункта не актуальны, то тебе не нужен TS, по крайней мере сейчас
    Ответ написан
    Комментировать
  • Как получить текущий класс в static методе?

    @Akela_wolf
    Extreme Programmer
    Никак. Рассматривайте статический метод как функцию, которая никак не связана с классом (кроме того что статический метод объявлен в его пределах). Просто в Java нет глобальных функций, все делается в пределах классов. А это оставляет для глобальных функций только статические методы. Статический метод вы можете перенести в другой класс - и все будет работать (когда ссылки поправите, разумеется). Также статический метод не может иметь никакого отношения к наследованию.

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

    vabka
    @vabka
    Токсичный шарпист
    Докер же как раз поднимает у тебя wsl2 и он просит чтобы ты сам установил ядро, и даже кидает ссылку, как это сделать.

    Если принципиально хочешь обойтись без wsl2 - вырубай его поддержку в docker desktop и используй virtual box или hyper-v - тогда докер развернёт виртуалку с линуксом на них.
    Ответ написан
    2 комментария
  • Как дальше продолжить обучение Java?

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

    Gremlin92
    @Gremlin92 Автор вопроса
    Целеустремленный
    Добавив
    javac -encoding UTF-8 Main.java
    решилось
    Ответ написан
    Комментировать
  • Как извлечь данные из нескольких таблиц?

    @Akela_wolf
    Extreme Programmer
    Достаете из БД экземпляр класса Information, остальные зависимости Hibernate вытащит сам, если они корректно описаны.
    Ответ написан
    Комментировать
  • Есть ли разница между x64 jar и x86 jar?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Можно, вся суть Java в том, что она платформонезависимая.
    Ответ написан
    Комментировать
  • Как открыть файл .class?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    В общем случае никак. Это не сильно проще, чем открыть файл .exe, поменять несколько значений и сохранить обратно. Можете попробовать декомпилятор, как советуют в другом вопросе, но не ожидайте, что это будет просто.
    Ответ написан
    1 комментарий
  • Как экранировать кавычки внутри кавычек?

    @Akela_wolf
    Extreme Programmer
    Регуляркой вы это сделать не сможете. Так как возможны всякие фиговые случаи, например:
    "full_name": "Колхоз "Светлый путь", деревня Пролетарская", ...

    или
    "full_name": "Слева направо: "Москвич", "Волга", "Жигули"", ...

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

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    javac -cp lib.jar -d . *.java
    java -cp .;lib.jar <package name>.A
    Ответ написан
    7 комментариев
  • Как лучше сделать экспорт класса, чтобы вызывать его как функцию?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Вам лень писать new? Имхо, это перебор. Не отвалятся у вас руки три лишних символа написать, и это будет куда нагляднее чем непонятные излишние функции.

    Но рас так хочется, то тип для твоей функции таков:
    function exportConstruct<P extends any[], T>(classFromExport: { new (...args: P): T; }): 
    (...args: P) => T {
      return (...args) => new classFromExport(...args);
    }

    Но так ты теряешь например возможность использовать статические методы класса.

    Если можешь использовать Proxy то можно просто сделать класс вызываемым:
    function exportCallable<T extends { new (...args: any[]): any; }>(classFromExport: T) {
      return new Proxy(classFromExport, {
        apply(ctor, _, args) {
          return new ctor(...args);
        }
      }) as T & ((...args: ConstructorParameters<T>) => InstanceType<T>);
    }
    
    const Lol = exportCallable(class Lol extends BaseLol {
      constructor(public name: string) {
        super();
        this.name = name.toUpperCase();
      }
    });
    
    Lol('qwe');


    Либо ты можешь просто добавть статический метод, который будет делать то же самое:
    abstract class Newable {
      static new<P extends any[], T>(this: { new (...args: P): T; }, ...args: P): T { 
        return (new this(...args)) as T
      }
    }
    
    class BaseLol extends Newable {  /* ... */ }
    
    class Lol extends BaseLol {
      constructor(public name: string) {
        super();
        this.name = name.toUpperCase();
      }
    }
    
    Lol.new('qwe');
    Ответ написан
  • Нормально ли вызывать из Сервлета DAO и Service одновременно?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    Расскажу из личного опыта:
    Мне всегда хочется, чтобы модель, которая используется в БД, и модель, которая используется в контроллере, были одной и той же моделью.
    Все просто же: пришёл запрос в контроллер - сохрани в бд; нужно что-то из бд - сделай селект и отправь в контроллер.
    Но никогда, ни разу это не было хорошей идеей.

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

    Отвечаю на ваш вопрос:
    1. Всегда используйте сервис. Умение сохранять объекты в бд у контроллера противоречит принципу solid
    2. Используйте луковую архитектуру. Доменная модель не должна ничего знать о внешних интеграциях.
    Ответ написан
    1 комментарий
  • Как правильно логировать базу данных?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Определитесь что вы хотите логгировать.
    1. уровень события БД это уже скидывается в системный лог
    2. Изменения схемы, зависит от СУБД и в некоторых настраивается
    3. Изменение данных, просто добавляете пользователя в отдельное поле
    4. Версионность, то же что и в пп3 но версия и измененные столбцы (крайне не советую)
    5. Blame триггер на какие то действия, пишется в отдельную таблицу, тут все зависит от бизнеса

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

    @Akela_wolf
    Extreme Programmer
    Логировать в БД (в отдельную таблицу) спринг вполне может. Но это, обычно, не очень хорошее решение. В промышленном использовании все-таки лучше логировать в файл, затем logstash -> elastic -> grafana/kibana или аналогичный стек. Можно graylog - решений в общем-то много и смысла нагружать именно реляционную БД логами обычно мало.
    Ответ написан
    1 комментарий
  • Как языки, исполняемые на ВМ, пишут в консоль?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    stdout это просто дескриптор, который открывает консоль.

    Для каждой консольной программы открывается три дескриптора с номерами 0, 1, 2 (stdin, stdout, stderr), куда они могут писать.

    /dev/fd/1
    Нет, fd это просто файловый дескриптор/1
    правильный путь будет /proc/ID_процесса/fd/1
    то есть у каждого процесса stdout свой.

    Ну и еще. Неважно какой язык. Это про архитектуру операционки, а не язык.
    Ответ написан
    5 комментариев
  • Аннотация @Autowired выводит null, хотя написал правильно. Почему?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Spring
    Седой и строгий
    Внедрение происходит только в те компоненты, жизненным циклом которых управляет контейнер. А вы EventsBotApp создали сами оператором new.
    Ответ написан
    1 комментарий
  • Может ли Service иметь репозитории других классов?

    @Akela_wolf
    Extreme Programmer
    Технически вам никто не мешает так делать

    Архитектурно - нужно смотреть по конкретному проекту.
    Ответ написан
    1 комментарий
  • Нормально ли кидать эксепшены в Spring boot web app?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Нормально.
    Ответ написан
    Комментировать
  • Как обратиться в enam по числовому порядку?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    Я бы сделал ещё одно поле с геттером:
    public enum DayOfWeek {
        MONDAY(1),
        TUESDAY(2),
        WEDNESDAY(3),
        THURSDAY(4),
        FRIDAY(5),
        SATURDAY(6),
        SUNDAY(7);
    
         @Getter
         private final int number;
    
        DayOfWeek(int number) {
            this.number = number;
        }
    }
    Ответ написан
    Комментировать