• Разница в стримах коллекций и массива?

    @Akela_wolf
    Extreme Programmer
    Потому что в Java массивы и коллекции - это совершенно разные вещи (хоть и похожие по своему назначению). Массив, находится максимально близко к сишному массиву (разве что на джаве встроена проверка выхода за пределы, а в остальном - практически также). Соответственно, массив не может иметь своих методов, т.к. не является объектом (аналогично примитивным типам данных, по сути массив - это примитивный тип данных в Java). Коллекция же, наоборот, суть объект. Что и обуславливает разницу между ними. Эту разницу можно было бы сгладить на уровне языка, но во времена разработки Java не было понимания как удобнее сделать. А затем - бремя обратной совместимости пришлось нести через годы (аналогичная история приключилась с type erasure). Причем это настолько фундаментальная разница, существующая на уровне JVM, поэтому даже современные языки, например Kotlin, не в состоянии уйти от этой нее (так в Kotlin, класс Array не реализует интерфейс Iterable именно по этой причине).
    Ответ написан
    Комментировать
  • Как сформировать и отправить Principal на React Js в Spring Boot приложение?

    @Akela_wolf
    Extreme Programmer
    React-приложение должно послать те данные, которые нужны спрингу, чтобы сконструировать Principal. Распространенный вариант - JWT-токен. Либо идентификатор сессии. Либо еще что-то, нужно смотреть конкретику как у вас сконфигурирован Spring Security в приложении.
    Ответ написан
    Комментировать
  • Как изменить 1200 строк в таблице?

    @Akela_wolf
    Extreme Programmer
    Как вариант:
    UPDATE product SET `alias`=transliterate(title);

    Хранимую функцию transliterate придется написать самостоятельно (или найти в интернете, они есть)
    Ответ написан
    Комментировать
  • Не могу сделать запрос к БД MySQL?

    @Akela_wolf
    Extreme Programmer
    Объявите переменную как global. Переменные в PHP, если ничего не путаю, локальны в пределах включаемого файла.

    https://www.php.net/manual/ru/language.variables.s...
    Ответ написан
    Комментировать
  • Можно увеличить быстродействие из двух ssd (незагрузочные)?

    @Akela_wolf
    Extreme Programmer
    Тут надо смотреть во что вы упираетесь. Если создание программного RAID0 не дает эффекта - значит "бутылочное горлышко" находится не здесь. Как вы измеряете производительность?

    Целесообразность определяется задачей. Если вам не хватает производительности именно дисков - значит целесообразно для вашей задачи.
    Ответ написан
  • Если тратить по 8-10ч в день на программирование, возможно ли дорасти до уровня middle разрб?

    @Akela_wolf
    Extreme Programmer
    10000 часов до мастерства.

    Но 8 часов в день, считая еще плюсом время на учебу - это очень тяжко. Отдыхать тоже нужно, так что обязательно планируйте время на сон (7-8 часов минимум), физические тренировки (дома или в зале) и просто отдых. Так что, посчитаем 4 часа в день. Если заниматься и по субботам тоже, то можно планировать 300 дней в год. Итого 1200 часов в год, 3000 часов до окончания университета. Это вполне хороший запас времени. Я думаю что за это время вполне можно добраться до мидла.

    Теперь о том кто же такой мидл, чему учиться. Ключевое понятие - самостоятельность. Джуниору нужна точная постановка задачи - сделай так. И он переводит с русского (или английского) языка на язык программирования. По сути это близко к понятию "кодер". Джуниор может очень хорошо знать язык, технологии, писать прекрасные программы. Но пока он не принимает самостоятельные решения - он остается джуном.
    Мидл умеет принимать собственные решения в пределах своего модуля. Тут уже начинаются основы проектирования: SOLID, KISS, YAGNI, MVC, MVP и т.п. страшные слова. Главный критерий - практика. Поэтому я бы советовал реализовывать в качестве практики какой-нибудь долгоиграющий проект. Это даст важную практику работы "вдолгую", позволит ощутить такую радость как "сопровождение". И сразу же учиться применять стандартные для вашего стека инструменты, будь то composer, npm, gradle и др. Обязательно git. Обязательно приучать себя писать тесты (юнит-тесты, функциональные и интеграционные) - это будет большим плюсом в дальнейшем. Плюсом читать умные книги и сразу же применять то что в них написано на практике. Это в первую очередь "Программист-прагматик", "Идеальный программист", "Чистый код", "Чистая архитектура", что-нибудь по TDD. Плюсом документацию по выбранным технологиям. Несмотря на то что это скучно, в документации часто можно найти важные нюансы, которые редко встречаются в других источниках. Документацию можно заменить хорошими книгами по той же теме. Но тут сложно советовать абстрактно, не зная какой стек вы выбрали.
    Ответ написан
    Комментировать
  • Какой подход правильный в описании docker-compose?

    @Akela_wolf
    Extreme Programmer
    1. По ситуации. Иногда это более чем оправданно. Не стал бы возводить это в абсолют
    2. Опять же - по ситуации. Иногда требуется.
    3. Вопрос с обновлением этого самого кода. Если он лежит на volume, то обновить не проблема (в том числе и изнутри контейнера). Если он в контейнере - то потребуется пересобрать контейнер.
    4. Этого вопроса не понял.
    Ответ написан
  • Чем отличается роутер от точки доступа?

    @Akela_wolf
    Extreme Programmer
    Сетевое оборудование с которым можно столкнуться не углубляясь в дебри:
    1. Хаб. Самое древнее и сейчас уже обычно неактуальное. В него включаются несколько сетевых проводов и все что он делает - пересылает все пакеты из каждого порта всем остальным. А дальше сетевые карты уже сами разбираются - надо им этот пакет или нет. Работает только в пределах локальной сети.
    2. Свитч. Тот же хаб, но поумнее. Умеет понимать аппаратные адреса (MAC-адреса) и посылать пакеты конкретному адресату. Опять же работает только в пределах локальной сети.
    3. Роутер. Соединяет 2 (или более) локальных сети, работает уже не на уровне MAC-адресов, а на уровне сетевых (IP) адресов. Определяет в какую локальную сеть отправить пакет в соответствии с таблицей маршрутизации. Обычно также может выполнять функции свитча, то есть поддерживать локальную сеть. И большинство роутеров "для дома" именно так и используются - локальная сеть на LAN-портах и маршрутизация пакетов в интернет через WAN-порт. Также роутеры часто содержат уйму дополнительных возможностей - DHCP, VPN-подключения, файрволл, NAT, проброс портов и т.д. Но концептуально это отдельный функционал. Маршрутизатор занимается только передачей пакетов из одной локальной сети в другую.
    4. Точка доступа. Чисто технически это "беспроводной свитч". То есть весь функционал точки доступа - это принимать пакеты по проводу и транслировать их по радиоканалу для беспроводных устройств и наоборот - принимать пакеты по радиоканалу и транслировать их по проводу. Это точка доступа в узком смысле. Но домашние роутеры часто объединяют с точкой доступа, что и вызывает путаницу - я выхожу в интернет с телефона через точку доступа. Да, разумеется, потому что там 2-в-1 устройстве: точка доступа обеспечивает радиоканал, а маршрутизатор обеспечивает передачу данных в глобальную сеть.
    Ответ написан
    2 комментария
  • Могу ли я преобразовать файл CSV в файл string.xml с помощью Gradle?

    @Akela_wolf
    Extreme Programmer
    Да. Вам нужно написать плагин для Gradle, который реализует логику конвертации CSV -> XML и использовать его. За подробностями разработки плагина - отсылаю в документацию Gradle, там все прекрасно написано.
    Ответ написан
  • Есть ли жизнь на Java (Бекенд) кроме Финтеха?

    @Akela_wolf
    Extreme Programmer
    Есть. Скажу лично про себя - работаю в сфере логистики, у нас в рантайме Java 11, а пишем мы на Kotlin. Стек вполне современный (некоторое количество легаси есть, но не слишком много).

    Еще точно знаю что СДЭК ищет Java-разработчиков, но больше про них ничего сказать не могу.
    Ответ написан
    Комментировать
  • Активизация предложений пользователю?

    @Akela_wolf
    Extreme Programmer
    Если бы каждый мог узнать какие товары просматривает (гуглит) другой человек - жизнь была бы намного веселее. Как вам идея, что ваш бывший одноклассник может легко узнать что вы гуглили Ford Mondeo и заходили на сайты автосалонов?

    Технически это отслеживание делается в общих чертах следующим образом: все эти сайты, типа DNS, подключены к какой-то рекламной сети (например Yandex.Direct). И когда пользователь заходит на сайт, то кроме кода страницы ему в браузер загружается код рекламной сети. Который читает и устанавливает cookie. И затем, по этому cookie может сопоставить: с этого компьютера заходили на сайт DNS за утюгом, на сайт МВидео за телевизором, на сайт туроператора за туром в Доминикану и т.д. И, соответственно, формирует индивидуальные рекламные предложения. Плюс, рекламная сеть "дружит" с поисковиком. Соответственно, может также добавить к этому какие поисковые запросы делает пользователь.

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

    @Akela_wolf
    Extreme Programmer
    Возможно, хотя и сложно.
    Требуется:
    1. иметь знания и навыки. Причем по современному, востребованному стеку. В случае Java это: Spring Boot, Hibernate, SQL, Kotlin, Gradle... Можете пойти в сторону мобильной разработки (под Android), там своя специфика. В той стороне сейчас модно Kotlin Multiplatform (потом с ним вернетесь к бэку, если будет интересно). Уметь Git - для командной работы это очень важный инструмент. Английский на уровне чтения и понимания документации и технических статей.
    2. иметь практический пример использования ваших знаний и навыков. Это могут быть: ответы на stackoverflow (заодно уровень английского прокачаете), pet projects, мерж реквесты в open source библиотеки/проекты. Фрилансерские проекты и т.п. В общем хоть что-то что показывает как вы пользуетесь вашими знаниями на практике. Чем больше таких примеров, тем лучше.
    3. пробиться на уровень технического собеседования. Это может оказаться сложно, поскольку HR будет смотреть на формальную сторону вашего резюме. Так что ищите компании, в которых есть вакансия junior developer. Такие компании, обычно, готовы обучать новых разработчиков, поэтому к ним будет проще
    4. если пройдете онлайн-курс и получите сертификат - это тоже будет вам плюсом.
    Ответ написан
    Комментировать
  • Правильно ли я понял принцип инверсии зависимостей?

    @Akela_wolf
    Extreme Programmer
    Главная идея принципа инверсии зависимостей "детали зависят от абстракций, но не абстракции от деталей".
    В приведенном вами примере класс Main зависит от всего: от интерфейса INumberOperation и от обоих классов NumberOperation1, NumberOperation2. То есть тут принцип инверсии зависимостей вообще не работает. Никак.

    Проявляется же он в следующем примере. Пусть у меня есть некая абстрактная логика "прочитай число, выполни над ним операцию, запиши результат". Эта абстрактная логика (потому она и абстрактная) ничего не должна знать ни откуда она читает число, ни какую операцию над ним выполняет, ни куда и как записывает результат. Таким образом, у нас есть модуль, состоящий из
    interface NumberInput {
      int read();
    }
    interface NumberProcessor {
      int process(int a);
    }
    interface NumberOutput {
      void write(int a);
    }
    class Processor {
      private final NumberInput input;  
      private final NumberProcessor processor;
      private final NumberOutput output;
    
      public Processor(NumberInput input, NumberProcessor processor, NumberOutput output) {
        this.input = input;
        this.processor = processor;
        this.output = output;
      }
    
      void process() {
        output.write(processor.process(input.read()));
      }
    }

    Все. Модуль получился очень абстрактным и ни от кого никак не зависящим.
    Затем мы можем сделать реализации этих интерфейсов - они будут зависеть от нашего модуля логики (так как ссылаются на интерфейсы). И это полностью соответствует принципу инверсии зависимостей - детали зависят от абстракций.

    И наконец функция main, которая будет собирать все это в единое целое. Она самое конкретное что есть в нашей программе, так как она имеет дело с конкретными классами, экземпляры которых она создает. Поэтому она зависит от всех модулей - от модуля абстрактной логики и от модулей с реализациями интерфейсов. И тут принцип инверсии зависимостей тоже соблюдается - деталь (в какой именно конфигурации запускается программа) зависит от абстракции (абстрактная логики и конкретные реализации интерфейсов из которых выбирается именно та, которая будет использована)

    Этот принцип очень хорошо объяснен в книге Р.Мартина "Чистая архитектура", по крайней мере у меня все встало на свои места именно после прочтения этой книги.
    Ответ написан
    1 комментарий
  • Как лучше организовать базу данных товаров?

    @Akela_wolf
    Extreme Programmer
    Разумеется в одну таблицу.

    Запомните - никогда однородные данные не должны рассыпаться на несколько табличек (за исключением шардирования/партиционирования, но вам до этой темы далеко еще). Если вам нужно "раскрасить" данные по группам, видам, назначению и т.п. образом - это делается при помощи атрибутов данных в таблице, никак не с помощью разделения данных на несколько таблиц.
    Ответ написан
    2 комментария
  • Как реализовать обновление пользователя в базе?

    @Akela_wolf
    Extreme Programmer
    Если у вас есть ORM - то загружаете сущность, обновляете пришедшие в запросе поля, сохраняете в БД. Два запроса (на чтение и на апдейт).

    Если работаете на уровне обычных SQL-запросов, то делаете что-то вроде:
    UPDATE table SET field1=value1, field2=value2, ... WHERE id=idvalue;

    где блок после SET собираете динамически в зависимости от того что пришло в JSON (и это вовсе необязательно делать текстом, например такая библиотека как jooq предоставляет удобный API для сборки подобных запросов)
    Ответ написан
    Комментировать
  • Какой подход использовать?

    @Akela_wolf
    Extreme Programmer
    Нотификации - в реальном мире это очень сложная тема, с большим количеством подводных граблей и регулярно меняющимися требованиями. Давайте посмотрим какие сущности у нас тут есть с точки зрения принципа единственной ответственности (SRP):

    1. Канал уведомления (NotificationChannel). Вот это то самое: Email, SMS, Telegram, Slack, VK и т.д. Его ответственностью является отсылка сообщения определенным способом (определенный текст в определенный адрес). Я бы написал его интерфейс так:
    interface NotificationChannel {
      void send(String to, String text);
    }


    2. Уведомлятель (Notifier). Его ответственностью является формирование уведомления. И тут тоже возможны варианты, поскольку разных пользователей нужно уведомлять о разных событиях и разным образом. Его ответственостью является сформировать текст сообщения и отправить через определенный канал. Интерфейс выглядит примерно так:
    interface Notifier {
      void notify(User user, Event event);
    }


    3. Дальше возможны варианты. В частности формирование текста сообщения можно выделить в отдельную ответственность, создав класс (или интерфейс) NotificationFormatter. Если предусматривается настройка каналов уведомления для каждого пользователя, то может потребоваться какой-нибудь NotificationChannelManager и т.д. Погружаться в эту кроличью нору можно очень глубоко. Все зависит от того насколько детально вы хотите разложить подсистему на объекты.

    Лично я бы начал как минимум с интерфейса Notifier, который позволяет "закрыть" подробности реализации подсистемы уведомлений от вызывающего кода. Эта граница, на мой взгляд, лишней не будет. А затем уже, по желанию или при необходимости, раскладывал его реализацию на отдельные, несвязанные классы.
    Ответ написан
    3 комментария
  • Как скачать сайт с lazy lood?

    @Akela_wolf
    Extreme Programmer
    Суть в том, что браузер использует JavaScript для формирования страницы. Если нужно скачать только данные - то найти запрос, который браузер шлет в бэкэнд и скачать данные им (там будет JSON или что-то подобное)

    Если нужно скачать сайт прямо с оформлением - то проще всего написать небольшую программу, которая запустит реальный браузер (chrome точно так можно, насчет firefox не уверен) в автоматическом режиме и может имитировать в нем любые действия пользователя. См. chromedriver. Если ничего не путаю, то Selenium такое умеет.
    Ответ написан
    1 комментарий
  • Как сделать на yii2 distinct несколько полей не теряя при этом остальных?

    @Akela_wolf
    Extreme Programmer
    Yii2 Query builder не умеет distinct on
    Есть такой хак: Model::find()->select('distinct on (a) *')
    либо написать весь SQL-запрос руками.
    Ответ написан
  • Как сделать один идентификатор на 2 таблицы?

    @Akela_wolf
    Extreme Programmer
    В Postgresql нет автоинкремента, в postgresql есть последовательности (sequence).
    Собственно берите значение (nextval) из одного и того же сиквенса при вставке записи в обе таблицы - получите то что вам нужно.
    Ответ написан
    Комментировать
  • Для каких примерно целей программисту нужен computer science?

    @Akela_wolf
    Extreme Programmer
    Если коротко: не нужен.

    Если длинно, то нужен в определенных областях. Например, разработка компилятора (особенно оптимизирующего компилятора) - это самый что ни на есть computer science. Разработка ядра операционной системы. Разработка виртуальной машины. И тому подобные задачи, которые требуют глубокого понимания как работает компьютер, какие алгоритмы будут эффективны, а какие нет.
    В обычной жизни прикладного программиста максимум computer science, который мне приходилось использовать - это понимание О-нотации. Чем для меня, как для разработчика, оборачивается использование коллекции со временем доступа О(1) или О(n)? Насколько критично в данном месте (с определенными объемами данных) использовать алгоритм сложности О(n^2)? И тому подобные вопросы.
    Ответ написан
    4 комментария