• Правильно ли я понимаю работу защищенных протоколов?

    pazukdev
    @pazukdev
    Java Dev
    Вы можете безопасно обмениваться данными с кем-то только в том случае, если у Вас обоих есть общий ключ для их шифровки и расшифровки, о котором больше никто не знает. Проблема в том, как сделать так, чтобы он оказался у вас обоих, но при этом никто его не узнал. Т.е. как передать ключ по открытому каналу не скомпроментировав его. Ассиметричное шифрование как раз вот про это.

    Алгоритм этой операции такой:

    1. Сервер передает клиенту публичный ключ по незащищенному соединению.

    2. На основе публичного ключа сервера клиент создает разделяемый (общий) ключ, сохраняет его у себя.

    3. Клиент шифрует свой разделяемый ключ и в зашифрованном виде передает серверу.

    4. Сервер расшифровывает зашифрованный разделяемый ключ c помощью своего приватного ключа и получает разделяемый ключ у себя.

    Ассиметричное шифрование свою задачу выполнило - handshake состоялось. Далее клиент и сервер имея разделяемый ключ могут обмениваться уже симметрично зашифрованными данными.
    Ответ написан
    Комментировать
  • Шифрование с открытым ключом. Что такое ключ?

    pazukdev
    @pazukdev
    Java Dev
    Вы можете безопасно обмениваться данными с кем-то только в том случае, если у Вас обоих есть общий ключ для их шифровки и расшифровки, о котором больше никто не знает. Проблема в том, как сделать так, чтобы он оказался у вас обоих, но при этом никто не узнал. Т.е. как передать ключ по открытому каналу не скомпроментировав его. Ассиметричное шифрование как раз вот про это.

    Алгоритм этой операции такой:

    1. Сервер передает клиенту публичный ключ по незащищенному соединению.

    2. На основе публичного ключа сервера клиент создает разделяемый (общий) ключ, сохраняет его у себя.

    3. Клиент шифрует свой разделяемый ключ и в зашифрованном виде передает серверу.

    4. Сервер расшифровывает зашифрованный разделяемый ключ c помощью своего приватного ключа и получает разделяемый ключ у себя.

    Ассиметричное шифрование свою задачу выполнило - handshake состоялось. Далее клиент и сервер имея разделяемый ключ могут обмениваться уже симметрично зашифрованными данными.
    Ответ написан
    Комментировать
  • Почему нельзя просто вызвать clone?

    pazukdev
    @pazukdev
    Java Dev
    Почему нельзя, когда можно?
    public class SomeSubClass {
        
        void someMethod() throws CloneNotSupportedException {
            this.clone();
        }
        
    }

    Этот код компилируется.
    Ответ написан
    Комментировать
  • Многопоточность vs асинхронность?

    pazukdev
    @pazukdev
    Java Dev
    Многопоточность vs асинхронность

    Ресторан. Клиент заказал яичницу и гренки. 

    1. Синхронное выполнение: даем задание 1 повару. Он сначала делает яичницу. После того как она готова он приступает к гренкам.

    2. Асинхронное выполнение (многопоточность): даем задание 2 поварам. Они приступают условно одновременно. Один делает яичницу, второй гренки и оба конфликтуют из-за доступа к общим ресурсам (перцу, соли, сковородке).

    3. Асинхронное выполнение (1 поток): даем задание 1 повару. Он ставит на плиту яичницу и ставит таймер. Ставит гренки и тоже ставит таймер. Пока таймеры не сработали, чтобы не терять время, прибирает кухню. После того как сработают оба таймера - отдает заказ.
    Ответ написан
    Комментировать
  • Как связаны Thread.join() и InterruptedException?

    pazukdev
    @pazukdev
    Java Dev
    1. Ставить catch блок нужно потому, что метод join() throws InterruptedException
    2. Метод join кидает InterruptedException в случае, если вызывающий его поток interrupted:
    Thread.currentThread().interrupt();
    t.join(); // will throw InterruptedException
    Ответ написан
    Комментировать
  • Зачем нужно ООП?

    pazukdev
    @pazukdev
    Java Dev
    Как уже тут было сказано в комменте выше:
    с одной целью - снизить сложность сопровождения и развития большой кодовой базы

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

    pazukdev
    @pazukdev
    Java Dev
    Если фомулировка "чтобы выбирался нужный кейс" предполагает использование именно конструкции switch, то:

    double area;
    try (Scanner sc = new Scanner(System.in)) {
        String command = sc.nextLine();
        switch (command) {
            case "square":
                area = getSquareArea();
                break;
            case ... // дальше сами    
        }
    }
    Ответ написан
    Комментировать
  • Как привести таблицу ко второй нормальной форме?

    pazukdev
    @pazukdev
    Java Dev
    Требование 2НФ - отсутствие зависимости неключевых атрибутов от части составного ключа. Дата рождения ребенка зависит только от его имени. Т.е. только от части ключа "Сотрудник, имя ребенка". Поэтому для приведение к 2НФ надо декомпозировать отношение, вынеся отдельную таблицу "Имя ребенка, дата рождения ребенка".
    PS Замена вашего составного первичного ключа на id, кстати, тоже формально приведет к 2НФ. Но это такое.
    Ответ написан
    Комментировать
  • Для чего используются геттеры и сеттеры в Java?

    pazukdev
    @pazukdev
    Java Dev
    Суть я понимаю, что они позволяют получать доступ к переменным других классов с уровнем доступа private


    Они позволяют получать контролируемый доступ. Любая сущность должна быть доступна для внешней среды только через интерфейс. Public методы - это интерфейс любго класса. Setter'ы и Getter'ы - часть этого интерфейса.
    Хотя аксессоры действительно в какой-то мере могут казаться формализмом.
    Ответ написан
    Комментировать
  • Интерфейсы по умолчанию наследуются от Object класса в Java?

    pazukdev
    @pazukdev
    Java Dev
    Интерфейсы в Java не наследуются от Object.
    Ответ написан
    Комментировать
  • Когда в коде следует использовать интерфейсы (Java)?

    pazukdev
    @pazukdev
    Java Dev
    1, Абстракция нужна везде, где будет проходить ось изменений системы. А интерфейс - основное средство достижения абстракции в Java. Из этого следует п.2.
    2. Всегда, когда нужна абстракция (за исключением случаев, когда абстракция должна обладать состоянием. В таком случае вместо интерфейса придется использовать абстрактный класс т.к. интерфейс не может обладать состоянием).
    Ответ написан
    Комментировать
  • Может ли метод интерфейса иметь тело в Java?

    pazukdev
    @pazukdev
    Java Dev
    Body могут (и обязательно должны) иметь static, default (Java 8) и private (Java 9) методы.
    Ответ написан
    Комментировать
  • В чем суть интерфейсов в программировании?

    pazukdev
    @pazukdev
    Java Dev
    1. Класс - это всегда интерфейс + реализация (хотя бы частичная).
    2. Интерфейс - это способ полностью отделить интерфейс от реализаци. Т.е. полностью абстрактный класс. Служит для описания котракта поведения класса для взаимодействия с внешним окружением.
    Ответ написан
    Комментировать
  • Отличия абстрактного класса от интерфейса?

    pazukdev
    @pazukdev
    Java Dev
    1. Interface - это контракт системы с внешним окружением. Более Java-специфично: контракт для класса на определенное поведение реализованный в форме напоминающей полностью абстрактный класс.
    Применять всегда. Это основной способ реализации абстракции.

    2. Abstract class - это шаблон для группы классов кот. не может быть инстанциирован т.к. не содержит полного описания поведения (может содержать частичное).
    Применять только в специфических случаях, когда нужно какое-то стостояние в абстракции.

    Конкретные различия можно посмотреть тут: https://ru.stackoverflow.com/a/1229336/258227
    Ответ написан
    Комментировать
  • Совет по проектированию класса?

    pazukdev
    @pazukdev
    Java Dev
    По п. 1 Вашего вопроса.
    Если уверены, что через этот функционал (эту сущность) не будет проходить ось изменений, то пишите класс. Если нет - интерфейс. Или абстрактный класс, если эта сущность должна обладать каким-то state.
    Ответ написан
    Комментировать
  • Что такое монада?

    pazukdev
    @pazukdev
    Java Dev
    Монада - это абстракция над цепочкой связанных вычислений. Контейнер, который принимает текущее состояние и функцию, которая принимает это состояние в качестве аргумента и возвращает новое состояние. Этот контейнер инкапсулирует среду (контекст) выполнения вычислений с учетом возможных исключений; на выходе только ожидаемые значения. Вобщем, just a monoid in the category of endofunctors (c).
    Ответ написан
    Комментировать