Ответы пользователя по тегу Java
  • Почему результат такой?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Ну потому, что вы изменяете не массив, а НОВЫЙ список, полученный из массива, а массив сам не трогаете.
    Ответ написан
  • Как передать массив из метода java, а зачем очистить его?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Во первых, в java нет понятия "очищения" элементарного массива. Но можно очистить список типа List (Vector, Arralist и т.д.).
    Во вторых, не пойму, зачем вообще что-то чистить, в яве прекрасный автоматический сборщик мусора, чем мы все и гордимся.
    В третьих - передавать массив так и нужно, просто возвращая его имя в return
    Ответ написан
    8 комментариев
  • Какая правильная архитектура развертывания приложения с REST сервисом?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    А какие проблемы с томкатом? В сервлетах есть такое понятие, как листенеры. Определяете листенер, который реализует ServletContextListener. В нем заводите свои треды, которые живут, пока живет ваше приложение в томкате. Прописываете его в web.xml. В ваших рест-сервисах достаточно получить ServletContext и оттуда забирать созданный инстанс класса.
    <listener>
     <listener-class>
     my.long.life.clazz.Listener
     </listener-class>
    </listener>


    Вот подробно разобран листенер (пункт 5 если чо) - https://www.journaldev.com/1945/servletcontextlist...

    Ну или плюнуть на сервлеты к херам собачьим и сделать все на javalin или jooby! (мой поросячий выбор)
    import io.javalin.Javalin;
    
    public class HelloWorld {
        public static void main(String[] args) {
            MyTelegramBot mybot = new MyTelegramBot(); // тут херачим телеграм
            Javalin app = Javalin.create().start(7000); // тут запускаем сервер
            app.get("/", ctx -> ctx.result("Hello World")); // тут херачим свои REST
            app.put("/myrest", ctx -> mybot.send(ctx));
        }
    }
    Ответ написан
  • Какая структуру выбрать для массива, где неважен порядок, а определяется только элементами?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Да хоть, если даже дорога проходит через 10 городов - используйте TreeSet().

    SortedSet road1 = TreeSet<City>();
    road1.add("Mos");
    road1.add("Spb");
    
    SortedSet road2 = TreeSet<City>();
    road2.add("Spb");
    road2.add("Mos");
    
    assert road1.equals(road2);
    Ответ написан
    Комментировать
  • Как работать с видео в java?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Можно работать через gstreamer. Как с видео, так и со звуком, очень качественно. В яве есть биндинг для gstreamer- https://github.com/gstreamer-java/gst1-java-core
    Как раз на этой технологии пишу (написал уже) промышленный аудио/видео плеер (для рынка цифровой рекламы).
    Примеры есть здесь - https://github.com/gstreamer-java/gst1-java-examples

    Ну и радикальное решение - использовать GraalVM (к этому решению сейчас подхожу все ближе и ближе). Вся обработка видео будет на C или Rust с биндингами в яву. Все будет жить в GraalVM.
    Ответ написан
    Комментировать
  • Как поддерживать пользователя авторизированным в приложении?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Подписанные куки, ключ по куки (сами данные в базе), ключ в заголовках, jwt в куках тли заголовках. Выбирайте, что хотите.
    Ответ написан
  • Что сейчас актуально изучать в java, а что уже нет?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Смотрите в сторону clojure/clojurescript
    Ответ написан
  • Залипание кнопки интерфейса или как добавить событию вызов функции Swing?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    У вас блокируется рсновной цикл обработки. Используйте SwingYtilities. invokeLater() и оберните в Runnable.
    Ответ написан
    Комментировать
  • Почему localhost запрашивает логин и пароль?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    У вас spring boot starter security не настроен! Он по умолчанию на все пароль требует ( по описанию)
    Ответ написан
    Комментировать
  • Выбор дальнейшего пути развития для студента,что необходимо учить junior java backend developer?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    • Углубиться в Nosql - kafka, streaming conputation, hadoop/hbase/tarantul, elastic search.
    • Углубиться в современные микросервисы - jooby.io, javalin, micronaut (это к вопросу о REST/Websocket)
    • Углубиться в reactor.io/rxjava/akka
    • Углубиться в OSGI (кроме spring, и в дополнение к нему)
    • Обязательно углубиться в kotlin.

    А еще настоятельно взглянуть на clojure и clojurescript.
    Ответ написан
    Комментировать
  • Обязательно ли кодить на Java в IDE?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Конечно же не обязательно! Я начинал программировать в mymacs ( сильно урезанный порт emacs года 1995-го). Кв нем нем, кроме скобок ничего не было, интернета тоже не было. Явы тоже не было. Потом появился линукс и «нормальный» emacs. Но небыло списка функций, потом появилась утилита ctags. Потом классная IDE code wariot с подсветкой синтаксиса, шаблонами и прочей херью, ускоряя процесс разработки на порядок. Потом появлась ява, и снова emacs. И вот компания ibm выложила в суровый модемный интернет eclipse, который я качал примерно неделю. Появился рефакторинг, Переход по классам, функциям, автоматическая документация, подстановка функций и методов и т.д.
    И конечно же я могу вернуться к монохромному зеленому монитору, старому редактору, командной строке с make. Но, черт возьми, нахрена тогда эти 30 лет эволюции?!
    Ответ написан
    2 комментария
  • Как вичетать корень и записать красиво?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Не совсеv понятно, чем не нравится результат?
    В питоне: math.sqrt(388) = 19.697715603592208
    В яве: Math.sqrt(388) = 19.697715603592208

    Можно взять остаток от деления (%) на 2 или 4 (и далее), и тогда взять корень от результата деления.
    int number = 388;
    		int tail = number;
    		int mul = 1;
    		if(number % 2 == 0) {
    			mul = 2; tail = number/mul;
    		}
    		if(number % 3 == 0) {
    			mul = 3; tail = number/mul;
    		}
    		if(number % 4 == 0) {
    			mul = 4; tail = number/mul;
    		}
    		if(number % 5 == 0) {
    			mul = 5; tail = number/mul;
    		}
    		if(number % 6 == 0) {
    			mul = 6; tail = number/mul;
    		}
    		if(number % 7 == 0) {
    			mul = 7; tail = number/mul;
    		}
    		if(number % 8 == 0) {
    			mul = 8; tail = number/mul;
    		}
    		if(number % 9 == 0) {
    			mul = 9; tail = number/mul;
    		}
    		
    		System.out.printf("%d = %d√%d = %d * %.20f\n", number, mul, tail, mul, Math.sqrt(tail));

    Результат
    388 = 4√97 = 4 * 9,84885780179610400000

    ХА! Немного оптимизировал!
    int number = 388;
    		int tail = number;
    		int mul = 1;
    		for(int i=2; i<number/2; i++) {
    			if(number % i == 0) {
    				mul = i; tail = number/mul;
    			}
    		}
    		
    		System.out.println(Math.sqrt(tail));
    		System.out.printf("%d = %d√%d = %d * %.20f\n", number, mul, tail, mul, Math.sqrt(tail));

    Результат!
    388 = 97√4 = 97 * 2,00000000000000000000
    Ответ написан
    Комментировать
  • Как использовать мои ArrayList в другом Java классе?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Вам стоит почитать про поля класса и их геттеры/сеттеры, конструкторы класса, инициализацию полей класса, их видимость. ( Например здесь - developer.alexanderklimov.ru/android/java/class.php или https://metanit.com/java/tutorial/3.1.php )
    Например можно переделать ваш класс так (это очень на скорую руку, так чтобы было понятней).

    package com.antek.memgen.gui;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class Objects {
    
    	public static class ItemsNames {
    
    		private Map<String, List<String>> laptops = new HashMap<>();
    		private Map<String, List<String>> phones = new HashMap<>();
    
    		public ItemsNames() {
    			List<String> dell = new ArrayList<>();
    			List<String> hp = new ArrayList<>();
    			List<String> apple_comps = new ArrayList<>();
    
    			List<String> nokia = new ArrayList<>();
    			List<String> xiaomi = new ArrayList<>();
    			List<String> apple_phones = new ArrayList<>();
    
    			// initialize computers
    			dell.add(0, "DELL Inspiron");
    			dell.add(1, "DELL Latitude");
    			hp.add(0, "HP Pavilion");
    			hp.add(1, "HP_Omen");
    			apple_comps.add(0, "McBook Air 11");
    			apple_comps.add(1, "McBook Air 13");
    
    			// initialize phones
    
    			nokia.add(0, "Nokia 3310");
    			nokia.add(0, "Nokia 5.1");
    			xiaomi.add(0, "Xiaomi redmi note 3 pro");
    			xiaomi.add(1, "Xiaomi Mi 9T Pro");
    			apple_phones.add(0, "Iphone 8S");
    			apple_phones.add(0, "Iphone 11 Pro");
    
    			laptops.put("dell", dell);
    			laptops.put("hp", hp);
    			laptops.put("apple", apple_comps);
    
    			phones.put("nokia", nokia);
    			phones.put("xiaomi", xiaomi);
    			phones.put("apple", apple_phones);
    		}
    
    		public List<String> laptopNames(String brand) {
    			return laptops.get(brand);
    		}
    
    		public List<String> smartPhonesNames(String brand) {
    			return phones.get(brand);
    		}
    
    	}
    
    	public static void main(String[] args) {
    
    		// Simple tests
    
    		ItemsNames items = new ItemsNames();
    
    		items.laptopNames("apple").forEach(System.out::println);
    
    		items.smartPhonesNames("apple").forEach(System.out::println);
    
    	}
    
    }
    Ответ написан
    2 комментария
  • Нужно ли знать ОС программисту Java?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Да, нужно! Как минимум нужно общее представление. Так как любая программа выполняется в окружении операционной системы.
    Взять серверную часть. У вас не просто запускается tomcat/jboss/jetty/что-то-там-еще. У вас скорее всего стоит база данных, прокси-сервер. Есть мониторинг, оркестрация, сети... все это сильно зависит от операционной системы, настроек, прав доступа. Если в этом совсем ничего не понимать, то простые ошибки, типа занятого порта или лимита на открытые дескрипторы, можно искать днями.
    В результате, и тесты проходят, и все работает, а нагрузку не держит! Или крашится с непонятным результатом.
    Я уж не говорю про десктопные приложения, утилиты, cli и gui.
    Если хотите делать реально переносимые приложения, придется немного глубже копать, чем ява.
    Ну и пример. Сейчас пишу, да-да, аудиоплеер с биндингом к gstreamer. Разрабатываю на маке, отлаживаю в линуксе, а целевая система - на arm с armbian. Как-то так.
    Ответ написан
    Комментировать
  • Как организовать работу с общими сущностями для клиент-серверного приложения?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Заливайте в redis например.
    Ответ написан
    Комментировать
  • Что такое сервлет?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Ну пойдем.
    1) Сервлет - не аналог CGI, и не аналог PHP
    Если уж говорить про аналоги, то ближе всего это FastCGI, но тоже очень далеко.
    В отличии от CGI/FastCGI - это ресурс, который:
    - имеет четко заданный жизненный цикл с сохранением состояний на приложение, сессию, запрос
    - имеет ресурсы, передаваемые ему сервером приложения (авторизация, внешние ресурсы, ресурсы приложения, ресурсы запроса, ресурсы сессии)
    - может включать в себя так называемые фильтры пре/пост обработки
    - может взаимодействовать с ресурсами приложения и контейнера

    В рамках сравнения с PHP, сервлет не имеет встроенного языка шаблонов. И прямой аналог этомы - JSP, которые компилируются перед исполнением в тот же сервлет.

    2) Сервлет - строительный кирпичик для контейнеров web-приложений.
    Другими словами, есть контейнер (web) приложений, который реализует жизненный цикл сервлетов и фактически является web-сервером, в котором и живут эти web-приложения, обмениваются ресурсами и их используют.

    3) Напрямую на сервлетах сейчас достаточно редко пишут, хотя по быстрому набросать websocket очень даже можно. Обычно используют фреймфорки типа spring, javalin, jooby, vaadin, wicklets, tapesty и т.д. (их сотни под разные нужды и задачи!). Все эти фреймворки (библиотеки и обертки) делают удобным работу с API сервлетов, языками шаблонов (их тоже - десятки) и взаимедействием с ресурсами.

    4) Кроме сервлетов, есть еще куча всего, что можно сделать без создания сервлета, но получить полноценный web (хотя внутри это все будет обернуто в сервлет скорее всего).

    5) кроме сервлетов появились и новые фреймворки, расчитанные на микросервисы, и не обеспечивающие спецификацию сервлетов, например jooby, javalin и т.д.
    Вот код простого, боевого, приложения, в котором уже есть web-сервер, держащий нагрузку в несколько тысяч RPS.
    import io.javalin.Javalin;
    
    public class HelloWorld {
        public static void main(String[] args) {
            Javalin app = Javalin.create().start(7000);
            app.get("/", ctx -> ctx.result("Hello World"));
        }
    }
    Ответ написан
    9 комментариев
  • Как дешифровать WebSocket на Java?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    А в чем собственно проблема то? Вот на спринге и клиент и сервер.
    https://www.baeldung.com/java-websockets
    Стандартный servlet api тоже поддерживает, как и современные сервлет-контейнеры, что tomcat, что jetty.
    Ответ написан
    Комментировать
  • Какой Java GUI фреймворк лучше сейчас использовать?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Рекомендую платформу rcp на которой сделан эклипс https://www.vogella.com/tutorials/EclipseRCP/artic...
    Меньше писать придется, чем на fx. Но fx никакой не депрекейтед!
    Ответ написан
    Комментировать
  • На чем пишут десктоп приложения на Java/C#?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    JavaFX вполне годное поделие. Пишу на нем сейчас плеер специфический. Очень похож на свинг, но есть и очень приятные отличия, например бинбинг проперти. В отличии от свинга можно делать гораздо больше.
    Да, еще SWT от эклипса, но давно под него не программировал.
    Ответ написан
    Комментировать
  • Как получить дробную часть числа?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    BigDecimal вас спасет. И да, с даблом такое сплошь и рядом. Пример не в кассу, но показателен.
    Double toBeTruncated = new Double("3.5789055");
    
    Double truncatedDouble = BigDecimal.valueOf(toBeTruncated)
        .setScale(3, RoundingMode.HALF_UP)
        .doubleValue();
    Ответ написан
    Комментировать