• Какой легковесный orm лучше использовать?

    MrJcnby
    @MrJcnby
    Я бы посоветовал присмотреться к MyBatis. легко и не принужденно)
    Ответ написан
    Комментировать
  • В чем отличия redirect от requestDispatcher?

    zolt85
    @zolt85
    Программист
    И так, отличия.
    Forward:
    • выполняется непосредственно сервлетом
    • браузер абсолютно не в курсе, что происходит, и его исходный URL не меняется
    • перезагрузка страницы в браузере инициирует запрос на оригинальный URL


    Redirect:
    • состоит из двух шагов, в которых Ваше приложение говорит браузеру получить контент с другого URL, отличного от оригинального URL
    • перезагрузка страницы не инициирует запрос по оригинальному URL, а пойдет по URL из redirect
    • немного медленнее, т.к. приходится делать 2 запроса вместо одного
    • данные оригинального запроса (первого), будут недоступны второму запросу


    Проще говоря, через forward вы можете вернуть контент с другого ресурса, другую jsp. При этом исходный URL не изменится.
    Ответ написан
    4 комментария
  • GIT как правильно пользоваться?

    @xfg
    Github Flow за 5 минут.

    1. Создал ветку для фичи/фикса
    2. Сделал в ветку несколько коммитов
    3. Отправил пулл риквест
    4. Обсудил с коллегами пулл риквест и при необходимости внес правки
    5. Прогнал ветку через тесты.
    6. Влил в master
    7. Выкатил master на продакшн

    Если фича ветка долго не мержится и начинает расходиться с master веткой, то вливаем master в фичу ветку и продолжаем.

    Если кто-то из команды хочет руками потестить новую фичу, то может сделать
    git checkout -b new-feature origin/new-feature
    И потестить руками локально на своей дев машине.

    Update: Если sql база, то пишут миграции. Можно посмотреть в любом фреймворке что это и как использовать. После каждого git pull пробуем накатить миграции через консоль (можно хук для гита написать) и если есть новые миграции, то они применятся к локальной базе. Если nosql база типа mongo, то ничего не надо, они schemaless.

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

    @sarathorn
    php программист, веб-дизайнер, коллекционер
    Мне 20 лет, живу отдельно от родителей, зарабатываю фрилансом. Самое важное - организовать свой день.

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

    В моём случае физическая нагрузка или простая прогулка не улучшают продуктивность, с другой стороны залипание в ютюб/вк или чтение статей могут свести все старания на 0.

    Серьёзно мешают работать уведомления о письмах, сообщениях... звонки... В случае с работой в офисе будут отвлекать коллеги. Смело посылайте всех нафиг. Даже босса. Босс потом спасибо скажет, когда вы сделаете все задачи в срок или даже раньше.

    8 часов подряд кодить каждый день... Вы серьёзно? На этой неделе мои результаты такие: воскресенье - 12 часов кодинга, понедельник - 8, вторник - 8, среда - 6, четверг - 4, пятница - 3, суббота (сегодня) - нет ни малейшего желания, но очень надо хотя бы пару часов... Вы просто перегорите. Настраивайтесь на 4, максимум на 6 часов кодинга в день. Остальное время можно заполнить чтением документаций, проработкой прототипов на бумаге, обсуждениями с коллегами и боссом.

    Если ситуация требует 8-16 часов кодинга подряд (такое, увы, бывает), то меня спасают две вещи:
    1) Сериалы. Второй монитор, второй ПК, планшет или даже смартфон вам в помощь. Берёте сериал, который УЖЕ смотрели и включаете. Он должен быть интересный, но уже знакомый, это два обязательных требования. Так он не будет отвлекать от работы (сюжет же уже знаком, а половину реплик вы можете произнести вместо актёров), но создаст иллюзию отдыха. В моём случае можно всё привести к такому выражению: 60 минут кодинга = 80 минут кодинга под сериал. НО! Так я могу выдерживать 12-16 часов без особых усилий. Что в итоге даёт больше результата, чем 6-8 часов чистого кодига после которых я просто убитый на пару дней.
    2) Кофеин. Обычный кофеин. Кофе я не пью, а энергетики слишком дорогие для регулярного применения. Есть замечательная альтернатива - Кофеин-бензоат натрия. ~30рублей в аптеке за 6 таблеток. Максимальная разовая доза - 6 таблеток, она же 300мг кофеина. 1-2-3 таблетки мой организм может не заметить, а при шести я начинаю разговаривать сам с собой. Грань очень тонкая, но при правильной дозировке получается неплохой boost к производительности. Внимание! Кофеин может повышать давление и пульс, а также имеет ряд побочных эффектов. Передозировка может убить. Я не несу ответственности за последствия приёма кофеина.

    Смесь кофеина и прогулки (зима, 3 часа ночи, -20C) может породить тонну гениальных идей, увы, лишь 1 из сотни имеет шанс на успех в реальном мире.

    Вообще, я для себя вывел важную закономерность. Мотивация - фигня. Желание получить больше денег и когда-нибудь улететь на неделю на Мальдивы не приведёт к результату, рано или поздно, но мозг решит, что гораздо правильней работать в 2 раза меньше, но отдохнуть на местном водоёме с друзьями и шашлыками. Гораздо интереснее обстоит дело с чувством вынужденной необходимости. Проще говоря, с кнутом. Я не сделаю работу и меня уволят. Я не успею вовремя и меня лишат премии. Я облажаюсь и все будут смеяться надо мной... Вот это работает.

    Чтобы работа давалась без усилий нужно какое-то вдохновенье и чувство гордости за свою работу. Я сделаю этот проект и тысячи людей будут им пользоваться! Я напишу эту программу и моя девушка за меня порадуется. Этот проект будет помогать начинающим бизнесменам, они никогда не узнают моего имени, но они будут мне благодарны.

    Непосредственно программирование (как и дизайн) идёт легче, если есть план и схемы. В моём случае при работе над back-end у меня 70% времени уходит на проектирование и проработку мелочей на бумаге, лишь 30% времени это сам кодинг. При работе с фронт-эндом я где-то 60-70% времени работаю, а 30-40% проектирую. Я так понимаю, вас не заставляют именно кодить 8 часов. Вас заставляют 8 часов сидеть на рабочем месте. Вот и прикиньте, что из них лишь где-то 3-4 часа будут самим кодингом. Хотя... Если работы очень много, вы не единственный кодер в конторе и есть более опытные, которые и берут на себя всё проектирование... ух... тогда остаётся только монотонно стучать по клаве...

    Ещё очень важный момент. ОБЯЗАТЕЛЬНО ОТДЫХАЙТЕ! В выходные не должно быть ни единой мысли о работе, после работы займитесь хобби, уберитесь дома, погуляйте, сходите в спорт зал, почитайте книгу, посмотрите кино, поспите в конце-концов. Никакой работы за пределами рабочего места. Этот трюк заставит мозг ассоциировать рабочее место с рабочим процессом, а значит уже не нужно будет самому его мотивировать работать. Это работает крайне просто. Если вы видите очень красивую девушку да ещё и без одежды, то кое-что что происходит с одним очень важным органом и мозг начинает работать совершенно иначе. И вот теперь в поле зрения попадает ваше кресло и ваш рабочий комп, мозг пробегается по ассоциациям и понимает, что надо работать. В паре с состоянием вынужденной необходимости всё сработает на ура.

    Перерывы - спорный момент. Мне проще проработать, например, 6 часов без перерывов (только если на отойти до туалета или до кухни, чтобы налить воды и стащить печеньку), чем 6-8 с перерывами. Я очень много времени и сил трачу на переключение с одного вида деятельности на другой.

    По поводу еды. В момент приёма и пищи и где-то следующий час я способен только читать и смотреть, но никак не творить.
    Ответ написан
    10 комментариев
  • Как запустить несколько веб-приложений (Spring) на одном сервере?

    через Nginx. каждое приложение запустить на отдельном порту (а не все на 8080) и в Nginx для каждого домена указать свой backend сервер
    Ответ написан
    3 комментария
  • Что за шаблон Декоратор, и зачем он нужен?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    То что вы реализовали - не декоратор. Декоратор это интерфейсы а не абстрактные классы.

    суть шаблона Декоратор


    Декоратор, это такой шаблон, при котором мы "расширяем" поведение объекта без изменения оного. При этом важная состовляющая - интерфейс объекта не меняется.

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

    К примеру при использовании контейнера зависимостей, мы можем обернуть какой-то сервис в декоратор временно, и в декораторе логировать аргументы и результат выполнения методов. Скажем это нужно только для быстрого дебага. Делаем быстренько декоратор, подсовываем его вместо настоящей реализации (обычно это одна строчка в di-конфиге) и вуаля. Мы не вносили изменений в код а стало быть не могли ничего сломать случайно. История изменений будет выглядеть красиво. Да и тестировать такие вещи намного проще.
    Ответ написан
    Комментировать
  • Как исправить Null id generated?

    @bobzer
    Java EE Developer
    У Вас нигде не определена стратегия генерации первичных ключей, ни на уровне СУБД, ни на уровне вашей бизнес-логики. Для генерации ID могу порекомендовать использовать имеющиеся в MySQL средства. Для этого определите поле первичного ключа в БД как:
    ID BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT
    а в маппингах сущностей укажите следующее:
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    protected Long id;

    При таком подходе значение первичного ключа создаётся непосредственно в момент вставки записи в таблицу. При выполнении команды INSERT значение поля ID не указывается, а MySQL сам подставит значение, применив для его генерации сиквенс (специфический объект СУБД, последовательно генерирующий числа, обычно начиная с 1).

    Настоятельно не рекомендую использовать примитивы для определения ID в сущности (private int id в Note), т.к. при создании нового экземпляра класса будет присвоено значение по умолчанию 0, что приводит к заблуждению - первичный ключ еще не генерировался, но у него уже есть какое-то значение.

    Обычно, класс сущности, описывающий идентификатор, выносится в родительский класс, а все сущности проекта наследуются от него, за счёт чего возникает возможность не описывать поле ID повторно во всех наследниках, избавляясь от дублирования кода. Но, сначала добейтесь работоспособности текущей структуры, а затем занимайтесь рефакторингом иерархии классов. Вот пример определения родительского класса:
    import javax.persistence.*;
    import java.io.Serializable;
    
    @MappedSuperclass
    public abstract class Identifier implements Serializable {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "ID")
        protected Long id;
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public boolean equals(Object o) {
            if (this == o) {
                return true;
            }
            if (o == null || getClass() != o.getClass()) {
                return false;
            }
            Identifier that = (Identifier) o;
    
            if (getId() != null) {
                return getId().equals(that.getId());
            } else {
                return super.equals(o);
            }
        }
    
        public int hashCode() {
            return getId() != null ? getId().hashCode() : super.hashCode();
        }
    }


    UPD
    Маппинги сущностей БД обычно определяются с помощью аннотаций JPA, следующим образом:
    import javax.persistence.*;
    
    @Entity()
    @Table(name = "note")
    public class Note extends Identifier {
    //fields, getters, setters
    }
    Ответ написан
  • Почему программа виснет при создании ObjectInputStream?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    Доки: https://docs.oracle.com/javase/7/docs/api/java/io/...

    This constructor will block until the corresponding ObjectOutputStream has written and flushed the header.
    Ответ написан
    1 комментарий
  • Cron каждые 245 минут?

    Ответ написан
    Комментировать
  • Как написать функцию join по любому строковому свойству?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    Тут проблема в том, что Predicate - это функциональный интерфейс, используемый для проверки условий. Т.е., у него один метод test(), который проверяет условие. Решение есть, оно довольно простое.
    1) Создаём свой функциональный интерфейс, который принимает объект и возвращает строку:
    interface Getter<T> {
        String getString(T from);
    }

    Формально такой функциональный интерфейс соответствует лямбде, которая принимает один аргумент типа  T. А такая лямбда, в свою очередь, соответствует ссылке на метод класса Т без аргументов.

    2) Создаём join (delimeter я опустил, добавьте его сами):
    public static <T> String join(Collection<T> collection, Getter<T> getter) {
        StringBuilder builder = new StringBuilder();
        for(T cursor: collection) {
            builder.append(getter.getString(cursor));
        }
        return builder.toString();
    }


    3) Использовать так:
    class User {
        ...
        public String getName() { ... }
    }
    List<User> users = ...;
    String joined1 = join(users, User::getName); //<-- так
    String joined2 = join(users, user -> user.getName()); //<-- или так
    Ответ написан
    3 комментария
  • Разъяснение в конфигурации Spring+Hibernate(JPA). Помощь в настройке транзакций. Почему они не проходят?

    zolt85
    @zolt85
    Программист
    Я вам не скажу за всю Одессу, но у нас в Сибири считается, что
    1) @GeneratedValue(strategy = GenerationType.TABLE) - говорит, что нужно использовать таблицу для генерации PK. Не таблицу, на которую маппится сущность, а просто таблицу. Отсюда и возникает таблица hibernate_sequences. И возникает она из-за hibernate.hbm2ddl.auto=update.
    2) Про длину колонки, это опять из-за hibernate.hbm2ddl.auto=update.
    3) @Transaction говорит, что метод будет транзакционным. Что это значит. Это значит, что вызов метода будет обернут в proxy объект, у которого будет сессия, и при вызове всех вложенных методов эта сессия будет одна и та же, и при завершении метода транзакция закроется.
    4) propagation = Propagation.REQUIRED - это означает, что наличие сессии при вызове метода обязательно, если ее нету, то hibernate попытается ее создать.
    5) Откат транзакции (rollbak грубо говоря) происходит, по-умолчанию, только в случае возникновения RuntimeException, как этим управлять написано в документации к hibernate.
    6) значение в аннотации @Repository("personDao") задает имя бина.

    Теперь по классике надо что-то по советовать. Советую Вам не использовать hibernate.hbm2ddl.auto=update. Лучше посмотрите в сторону liquibase для управления состоянием БД.
    И почитайте вводные туториалы по Spring, разберитесь как работает IoC в Spring, как работает AOP в Spring, как Spring управляет бинами. И тогда Вам станет все понятно.

    Дерзайте, удачи Вам!
    Ответ написан
    1 комментарий
  • Как перевести строку в формулу на Java?

    zolt85
    @zolt85
    Программист
    Ну Вы конечно насоветовали человеку ...
    Если нужно запилить парсер нет ничего лучше, чем ANTLR
    сами описываете грамматику, он Вам генерит код, который эту грамматику понимает. Примеров грамматик для математики вагон и маленькая тележка.
    Ответ написан
    Комментировать
  • Как вы понимаете, когда и какой метод необходимо использовать?

    В общем меня это сводит с ума и я не понимаю, неужели все сводится к тому,чтобы брать и гуглить?

    Данная методология программирования называется Stack Overflow Driven Development, и практикуется даже программистами экспертного уровня.
    Ответ написан
    Комментировать
  • Почему после удаления элементов не изменяется длина массива?

    delete не удаляет свойство, только значение

    теперь ваш массив
    arr[undefined, undefined, undefined, undefined, undefined]
    длинной 5
    Ответ написан
    1 комментарий
  • Как редактировать текстовые файлы в java построчно?

    List lines = Files.readAllLines(Paths.get("res/file.txt"));
    //перебираете циклом
    for(String s : lines)
    {
    s = "Бла-бла-бла!"
    }
    /* Если нужно удалить - для перебора используйте Iterator.
    Не забудьте : */ 
    Files.write(Paths.get("res/file.txt"), lines);
    //иначе результат не запишется


    С FileWriter и BufferedWriter также.
    Ответ написан
    Комментировать
  • Что быстрее 10 запросов к файлам или 10 к базе?

    27cm
    @27cm
    TODO: Написать статус
    Что быстрее: спросить на тостере или проверить самому?
    Ответ написан
    1 комментарий
  • Где точнее буду производится математические операции с плавающей запятой на Java или на C++?

    @komjaga
    Программист встроенного ПО
    Точность будет одинаковая, это зависит не от языка, а от типа данных

    смотрите типы данных float и double
    Ответ написан
    1 комментарий
  • Tomcat это сервер, на котором деплоится сервер?

    @aol-nnov
    > Обычно, я сервер сайд своих апликух просто хощу у себя на ПК без всяких tomcato'в.
    особенно, если он у тебя на похапэ.

    Tomcat - контейнер сервлетов. Решительно хотя бы в вики загляни.
    Ответ написан
    2 комментария
  • Как создать объект зная имя его класса?

    @nirvimel
    Object object = Class.forName(className).getConstructor().newInstance();
    Ответ написан
    Комментировать
  • Каков процесс инициализации bean?

    eastywest
    @eastywest
    Backend developer
    Метод, указанный в init-method вызывается сразу после создания экземпляра. Тем самым Вы заменяете значение message на "null".
    Ответ написан
    2 комментария