• Выбор дальнейшего пути развития для студента,что необходимо учить 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.
    Ответ написан
    Комментировать
  • Прокладка витой пары в новом здании. Как правильно?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Все правильно вам сказали.
    Стандарты есть, читаем ГОСТ Р 53246-2008 Информационные технологии (ИТ). ....
    Как раз ОБЯЗАТЕЛЬНО как минимум две розетки
    Все рабочие места должны быть построены на основе как минимум двух телекоммуникационных розеток, обслуживаемых двумя кабелями горизонтальной подсистемы:

    На счет разбиения кабельной подсистемы на несколько коммутационных/телематических шкафов, тоже все правильно. Если хватает длины кабеля (в пределе 100 метров), что на 160 штук легче сделать один коммутационный и один телематический шкаф, тем более, что с учетом расстояния у вас на одну розетку всего 43 метра с учетом спусков, и сократить кабеля тут ни фига не получится. Причем нужно будет от шкафов пускать оптику, и не одно волокно, а 4 минимум (а лучше два кабеля по 4), ее разваривать и занимать отдельные юниты под кроссы. С оптикой проект усложнится.
    Вот если бы было концов 300-1000, то можно бы было о чем-то говорить.
    Ответ написан
    2 комментария
  • Обязательно ли кодить на Java в IDE?

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

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Нет, у вас все неправильно! Во первых, у вас НЕТ транзакции и на постгрес и на редис одновременно, и это ключевой момент. Во вторых, всегда все обновления делайте в постгрес с удалением ключа из редиса. Чтение - сначала читаем из редиса, и если там нет, лезем в постгрес и записываем ключ в редис.
    И да, если данные не критичны, типа счетчиков,, корзинок и т.д., то их можно хранить в редис.
    Ответ написан
    3 комментария
  • Организация сети для Ceph кластера?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Для клиентской сети хватит и гигабита. А вот для сети хранилища очень желательно как минимум 10 гигабит. Иначе будут страшные лаги по сети. На счет vlan даже и не думайте! Два независимых адаптера, ну или один на 10гигабит, разделенный на два srio на vlan-ы! У нас кластер вообше на infiniband 56ги, и то иногда пропускной способности не хватает.
    И не жалейте денег на сеть, ее всегда мало! Скйчас за 100килорублей можнл и карточки и коммутатор купить для 10гиг. И оптика не нужна, если все в одной серверной. Да и оптика иногда дешевле выходит, чем медь! Совсем она не дорогая!
    Ответ написан
  • Как получить приемлемую скорость на микротике при тарифе провайдера в 1 гигабит?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Это проблема не роутера (хотя роутеры очень разные бывают), а WiFi. Читаем википедию (пока не прикрыли) и видим, что https://ru.wikipedia.org/wiki/IEEE_802.11n
    Теоретически 802.11n способен обеспечить скорость передачи данных до 600 Мбит/с брутто, применяя передачу данных сразу по четырём антеннам, однако обычно встречаются решения 802.11n с одной антенной и скоростью до 150 Мбит/с.

    А у вас всего две антенны кажется. Упс.. И брутто - это плюс 20% нетто.
    И
    Реальная скорость передачи данных всегда меньше канальной скорости. Для Wi-Fi реальная скорость передачи данных обычно отличается более чем в два раза в меньшую сторону[6].

    Кроме того, существует еще несколько факторов, ограничивающих реальную пропускную способность:

    Канал всегда делится между клиентами;
    Передавая служебный трафик, точка доступа всегда подстраивается под клиента, работающего на минимальной скорости;
    Наличие помех (работающие рядом точки доступа, микроволновые печи, «радио-няни», bluetooth-устройства, радиотелефоны);

    Стоит отметить, что при работе в стандарте 802.11b или при обеспечении совместимого с ним режима существует всего три непересекающихся канала, то есть которые не мешают друг другу (обычно это 1-й, 6-й и 11-й). То есть, если у соседа за стеной работает точка доступа на 1-м канале, а у вас дома на 3-м, то эти точки доступа будут мешать друг другу, тем самым уменьшая скорость передачи данных.

    Ах, да. Еще многое зависит от чистоты эфира, препятствий, затуханий и прочей хрени. Так что хотите качество и скорость - кабель!
    Ответ написан
    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
    Ответ написан
    Комментировать
  • Доступ в сеть посредством VPN?

    leahch
    @leahch Куратор тега Linux
    3D специалист. Dолго, Dорого, Dерьмово.
    Настоятельно рекомендую использовать openvpn. Под винду клиентов полно, даже с GUI. Под OSX - thunnelblick. Плюсов огромное количество, начиная от проброса маршрутов, и заканчивая авторизацией, не говоря уж о всевозможных режимах работы как сервера, так и клиента.
    Да, единственный минус - клиент не из коробки.
    Ответ написан
  • Python. Как переподключиться к известной сети wifi через определённый период?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    А причем здесь python? И надеюсь, операционка у вас openbsd?!
    Проставьте уж теги нормальные!
    Ответ написан
  • Как использовать мои 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. Как-то так.
    Ответ написан
    Комментировать
  • Linux, аудит доступа к файлам, есть ли такое?

    leahch
    @leahch Куратор тега Linux
    3D специалист. Dолго, Dорого, Dерьмово.
    Да, есть, причем очень разный.
    1) Есть inotify - внутренний механизм ядра по слежению за файлами
    2) Есть SELinux - система безопасности
    3) есть auditd
    Ответ написан
    Комментировать
  • Как организовать работу с общими сущностями для клиент-серверного приложения?

    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.
    Ответ написан
    Комментировать
  • Как получить интернет в поезде?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Как технический специалист, которые обслуживает кое-какие системы в поездах дальнего следования, могу сказать, что волшебной таблетки здесь нет! У нас с нашими системами катается около 300 вагонов по разным направлениям. Связь в пути через 3G/4G дерьмовая везде, кроме как на узловых станциях и в городах. Если хотите ее как-то улучшить - берите GSM модем в выносной антенной, но это тоже не сильно спасет :-(
    Лучший способ быть на связи - купите или арендуйте спутниковый терминал или телефон ~ 300 руб в сутки. Телефоны и тарифы здесь - iridium-russian.ru
    С передачей данных сложнее - только 3G/4G, и то как я описал выше.

    Итого: для вас только 3. Офлайн интернет. Плюс в местах остановок очень возможно у вас будет 3/4G.
    Здесь есть одно но - 4G у вас практически не будет рядом с большими вокзалами - соты перегружены, если днем/вечером, ночью связь будет.
    Ответ написан
    8 комментариев
  • Jinja2. В чем отличия extends от include?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Разница конечно же есть, и значительная. Extends расширяет существующий шаблон, а include добавляет в нужное место кусок шаблона.

    Представим ситуацию с достаточно большим шаблоном, где нужно поменять только часть страницы. Базовый шаблон выглядит примерно так
    <!-- parent -->
    {%block заголовок%}
    {%block левый_блок%}
    {%block правый_блок%}
    {%block тело%}
    {%block подвал%}

    Если наследоваться от этого шаблона, то получится примерно так
    <!-- chlid -->
    {% extends parent %}
    {%block левый_блок %}
    {%block тело %}

    В противном случае нам пришлось бы инклюдами подключать все остальные блоки.
    Ответ написан
    3 комментария
  • Какой Java GUI фреймворк лучше сейчас использовать?

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

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    А все зависит от формата видео. Оно может быть в формате hls, тогда само видео изначально разбито на маленькие кусочки. Тогда нужно скачать индексный файл в формате m8u , где указаны все видеофрагменты.
    Ответ написан
    Комментировать
  • На чем пишут десктоп приложения на Java/C#?

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