• Как избежать впустую расходования ресурсов при чтении из BlockingQueue Java?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    Кажется, вашу проблему полностью решает project reactor

    Вот небольшое демо:

    @Test
        void testMultiproducer() throws InterruptedException {
    
            Sinks.Many<Integer> sinksA = Sinks.many().multicast().onBackpressureBuffer();
            Sinks.Many<Integer> sinksB = Sinks.many().multicast().onBackpressureBuffer();
            Sinks.Many<Integer> sinksC = Sinks.many().multicast().onBackpressureBuffer();
    
            Sinks.Many<Integer> sinkCommon = Sinks.many()
                    .multicast()
                    .onBackpressureBuffer();
    
            sinkCommon.asFlux()
                    .mergeWith(sinksA.asFlux().delayElements(Duration.ofMillis(100)))
                    .mergeWith(sinksB.asFlux().delayElements(Duration.ofMillis(200)))
                    .mergeWith(sinksC.asFlux().delayElements(Duration.ofMillis(300)))
                    .subscribe(e -> log.info("Element {}", e));  // Your consumer
            
            IntStream.range(0, 100)
                    .forEach(sinksA::tryEmitNext);  // Your producers
    
            IntStream.range(1000, 1100)
                    .forEach(sinksB::tryEmitNext);
    
            IntStream.range(2000, 2100)
                    .forEach(sinksC::tryEmitNext);
    
            Thread.sleep(10000); // Is necessary for test only
        }
    Ответ написан
    Комментировать
  • Как организовать monorepo с привязкой к версии maven?

    Vamp
    @Vamp
    Вы можете собрать весь проект целиком, тогда в maven reactor будут добавлены сразу все модули и dependency resolver сможет разобраться в зависимостях от соседних модулей. Но если собирать один конкретный модуль, то мавен уже не разберётся и полезет во внешние репозитории. В таком случае необходимо передать дополнительный ключ -am (--also-make):

    mvn -am -pl модуль package
    Ответ написан
    Комментировать
  • Как зашифровать пароль через BCrypt в базу данных H2 или HSQLDB?

    @mystifier
    Можно отдельно запустить где-нибудь определение хешей для нужных паролей.
    А потом в insert вставить нужный хеш.

    BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(8);
    String hashedAdmin = passwordEncoder.encode("admin");
    String hashedPassword = passwordEncoder.encode("password");
    Ответ написан
    Комментировать
  • Установка значений, массив?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    3 комментария
  • Как создать веб-сервис (Задание от Mail.ru) новичку?

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


    Т.е. вы застопорились даже не на задании, а на чтении плана.
    А как запускать (и где взять), будет рассказано в главе, не поверите, "1.4 Java: Запуск сервера".
    И под каждом степом есть секция с комментариями, очень полезная, если есть сложности.

    И перед эти курсом крайне желательно пройти эти два:
    Java. Базовый курс
    Java. Functional programming
    Ответ написан
    Комментировать
  • Как в Spring полуить имена всех шрифтов в контроллере?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Можно с помощью PathMatchingResourcePatternResolver:
    ClassLoader classLoader = this.getClass().getClassLoader();
    ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(classLoader);
    Resource[] resources = resolver.getResources("classpath*:assets/fonts/*") ;
    for (Resource resource: resources){
        ...
    }
    Ответ написан
    Комментировать
  • Как запустить 10000 классов в java?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Прежде всего нужно заметить, что запустить класс нельзя, его можно только объявить, а запускать можно методы экземпляров этого класса. Почему я и подумал, что вопрос неправильно сформулирован.

    Но если уж вопрос именно об объявлении новых классов в рантайме, то это называется кодогенерацией. И, во-первых, рефлексия в этом бессильна, а во-вторых, это очень сложная тема, озадачить которой начинающего программиста мог только очень мерзкий тролль.

    Генерировать можно как java-код, так и байткод. Первый способ использует популярная библиотека Lombok. Для него понадобиться механизм работы с AST и механизм взаимодействия с компилятором. Oracle JDK и Open JDK предоставляют Compiler API, реализующий оба механизма. Кроме того, есть и другие инструменты для работы с AST, например Eclipse JDT. Я покажу применение пакета com.sun.tools.javac из Compiler API.
    Сноска
    До Java 9 пакет com.sun.tools.javac был упакован в tools.jar, поставляемый вместе с JDK. Начиная с 9-ки API компилятора вынесли в модуль jdk.compiler, не экспортирующие свои пакеты. Теперь можно не указывать путь до tools.jar в classpath, но нужно добавлять экспорты. В остальном ничего не изменилось.
    import java.lang.reflect.Method;
    import java.net.URI;
    import java.util.ArrayList;
     
    import javax.tools.JavaCompiler;
    import javax.tools.JavaCompiler.CompilationTask;
    import javax.tools.JavaFileObject;
    import javax.tools.SimpleJavaFileObject;
    import javax.tools.ToolProvider;
    
    import com.sun.tools.javac.code.Flags;
    import com.sun.tools.javac.code.Type;
    import com.sun.tools.javac.file.JavacFileManager;
    import com.sun.tools.javac.model.JavacElements;
    import com.sun.tools.javac.processing.JavacProcessingEnvironment;
    import com.sun.tools.javac.tree.JCTree;
    import com.sun.tools.javac.tree.TreeMaker;
    import com.sun.tools.javac.util.Context;
    import com.sun.tools.javac.util.List;
    import com.sun.tools.javac.util.Name;
    
    
    /**
     * Класс эмулирующий для компилятора файлы исходного кода
     * и позволяющий компилировать код прямо из памяти
     */
    class JavaSourceFromString extends SimpleJavaFileObject {
        private final String code;
    
        public JavaSourceFromString(String name, String code) {
            super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension), Kind.SOURCE);
            this.code = code;
        }
    
        @Override
        public CharSequence getCharContent(boolean ignoreEncodingErrors) {
            return code;
        }
    }
     
    public class CompilerDemo {
        private static final String BASE_NAME = "DynamicHello";
        private static final ClassLoader classLoader = ToolProvider.getSystemToolClassLoader();
        private static final JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    
        /**
         * Метод формирующий абстрактное синтаксическое дерево
         * и преобразующий его в исходный код
         */
        private static String generateSource(String className) {
            Context ctx = new Context();
            JavacFileManager.preRegister(ctx);
            TreeMaker treeMaker = TreeMaker.instance(ctx);
            JavacElements elements = JavacElements.instance(ctx);
    
            JCTree.JCModifiers modifiers = treeMaker.Modifiers(Flags.PUBLIC);
    
            // Тело генерируемого метода
            // выводящее имя класса
            JCTree.JCBlock methodBody = treeMaker.Block(0, List.of(
                treeMaker.Exec(
                    treeMaker.Apply(
                        List.<JCTree.JCExpression>nil(),
                        treeMaker.Select(
                            treeMaker.Select(
                                treeMaker.Ident(
                                    elements.getName("System")
                                ),
                                elements.getName("out")
                            ),
                            elements.getName("println")
                        ),
                        List.<JCTree.JCExpression>of(
                            treeMaker.Binary(
                                JCTree.Tag.PLUS,
                                treeMaker.Literal("I am "),
                                treeMaker.Apply(
                                    List.<JCTree.JCExpression>nil(),
                                    treeMaker.Select(
                                        treeMaker.Apply(
                                            List.<JCTree.JCExpression>nil(),
                                            treeMaker.Select(
                                                treeMaker.Ident(
                                                    elements.getName("this")
                                                ),
                                                elements.getName("getClass")
                                            ),
                                            List.<JCTree.JCExpression>nil()
                                        ),
                                        elements.getName("getName")
                                    ),
                                    List.<JCTree.JCExpression>nil()
                                )
                            )
                        )
                    )
                )
            ));
    
            // Определение генерируемого метода
            JCTree.JCMethodDecl method = treeMaker.MethodDef(
                modifiers,
                elements.getName("introduceYourself"),
                treeMaker.Type(new Type.JCVoidType()),
                List.<JCTree.JCTypeParameter>nil(),
                List.<JCTree.JCVariableDecl>nil(),
                List.<JCTree.JCExpression>nil(),
                methodBody,
                null
            );
    
            // Определение генерируемого класса
            JCTree.JCClassDecl tree = treeMaker.ClassDef(
                modifiers,
                elements.getName(className),
                List.<JCTree.JCTypeParameter>nil(),
                null,
                List.<JCTree.JCExpression>nil(),
                List.of(method)
            );
    
            return tree.toString();
        }
    
        /**
         * Метод компилирующий исходный код
         */
        public static void compile(Iterable<? extends JavaFileObject> compilationUnits) {
            CompilationTask task = compiler.getTask(null, null, null, null, null, compilationUnits);
            task.call();    
        }
    
    
        /**
         * Метод запускающий сгенерированные классы с помощью рефлексии
         */    
        public static void loadAndRun(String className) throws ReflectiveOperationException {
            Class<?> cls = classLoader.loadClass(className);
            
            Method method = cls.getDeclaredMethod("introduceYourself");
            method.invoke(cls.newInstance());    
        }
    
        public static void main(String[] args) throws Exception {
            java.util.List<JavaFileObject> sources = new ArrayList<>();
    
            // Генерируем исходный код десятка классов
            for (int x = 0; x < 10; x++) {
                String className = BASE_NAME + x;
                sources.add(new JavaSourceFromString(className, generateSource(className)));
            }
    
            // Компилируем сгенерированный код
            compile(sources);
            
            // Запускаем скомпилированные классы
            for (int x = 0; x < 10; x++) {
                loadAndRun(BASE_NAME + x);
            }
        }
    }

    Конечно, можно было не заморачиваться с AST, просто засунуть код в строковый литерал, подставлять в этот литерал разные имена и подсовывать компилятору. Но это не так интересно!

    Продолжение в первом комментарии, а то я в лимит символов не укладываюсь.
    Ответ написан
    3 комментария
  • Как запретить плагинам сервера, занимать порты?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    При запуске JVM передать параметр -Djava.security.policy=server.policy, а в файле server.policy написать

    grant {
        permission java.net.SocketPermission "127.0.0.1:25565", "connect,accept,resolve";
    };

    JVM не позволит программам занимать иные порты, кроме указанных в политике. Правда, она ещё много чего запретит и скорее всего вам придётся долго и кропотливо выяснять, какие ещё права нужны вашему серверу для нормальной работы.
    Ответ написан
    3 комментария
  • Как добиться воспроизведения 8K видео в Unity?

    @Quiensabe Автор вопроса
    VR-разработчик
    Для тех кому интересен ответ на вопрос, а не советы сменить архитектуру или упражнения в остроумии - пишу к чему сам пришел на данный момент.

    Из опробованных мной ассетов и библиотек, лучший результат показал AVPro Video.
    Он умеет играть видео больше 4K используя аппаратные средства. На моей системе, 2*4K видео (стерео) - играет без проблем. Загрузка процессора ~40%, видеокарта ~30%.

    Таким образом, производительность этого решения на unity, в протестированном кейсе, - не уступает "нативным" решениям (из тестированных, плеер Virtual desktop, GoPro Player, Steam 360 Player).

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

    Любую дополнительную информацию, хотя бы косвенно относящуюся к исходному вопросу - с удовольствием отмечу решением. Пока, решения на вопрос НЕТ.
    Ответ написан
    4 комментария
  • Зачем делают backend на разных языках?

    @InoMono
    Возьмем например Дропбокс.

    Изначально был написан на Python - это быстрее для прототипирования.
    Потом был переделан на Go - для предсказуемости и скорости. Но зачем переделывать полностью? Многие куски на Python существуют там до сих пор. И работают.
    И маааалюсенький кусочек был переделан на Rust - для ускорения самого узкого места.

    Вот вам и 3 языка работающих одновременно в Дропбоксе на бэке.

    Или имеется в данный момент свободен тот или иной специалист, который лучше знает тот или иной язык. Ему поручили - он сделал на том, что лучше знает, чтобы сделать быстрее и качественнее.

    Или такова была особенность задачи. Пример с комбинацей Rust/Go выше приведен. Где то может быть лучше один язык, где то другой.

    А если мы вспомним, что проект не только пишется, а еще и готовые компоненты применяются - то автоматически к любому почти проекту добавляются С/С++ те что в БД к примеру и пр. и пр. SQL - тоже язык бэкенда. И пр. и пр.

    Вы преувеличивайте значение языка. Это всего лишь инструмент программиста. Такой же как клавиатура. Опытный программист за долгие годы изучает не меньше десятка языков, а кто то и намного больше. Ничего такого в этом нет.
    Ответ написан
    Комментировать
  • Какой автокликер может искать объект?

    @OlegPyatakov
    pyatakov.com
    Для десктопа все, что было описано, умеет, например, Sikuli
    Ответ написан
    3 комментария
  • JNA. Почему не удается загрузить С библиотеку?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Проблема в опции noexec монтирования /tmp, не позволяющей ничего выполнять из временного каталога. Нужно либо перемонтировать без неё, либо попробовать запустить виртуальную машину с параметром jna.tmpdir указывающим куда-нибудь в другое место.
    Ответ написан
    Комментировать
  • Для чего может понадобится ethernet розетка, если существуют переходники?

    Jump
    @Jump
    Системный администратор со стажем.
    Для чего может понадобится электрическая розетка, если существуют переходники?
    Попалась мне недавно такая интересная штука, картинка тут: delumo.ru/upload/resize_cache/iblock/6b8/488_488_2... Не совсем понимаю, в чём разница использования такой штуки и когда есть два обжатых конца, соединённых в коробке-переходнике? Итог одинаковый, или же нет?
    Ответ написан
    1 комментарий
  • Есть ли онлайн таблицы с правами доступа к столбцам?

    p00h
    @p00h
    Фехтовальщик-стропальщик
    Файл1.xls - столбец для группы пользователей 1.
    Файл2.xls - столбец для группы пользователей 2.
    ГлавнаяТаблица.xls - ссылка на столбцы из внешних файлов.
    Ответ написан
    1 комментарий
  • CPUlimit для сервера Майнкрафт?

    chupasaurus
    @chupasaurus
    Сею рефлекторное, злое, временное
    1. Завести отдельную cgroup для сервера
    2. Выставить в ней квоты
    3. Запускать через cgexec

    Пример для первых двух пунктов:
    cgcreate -g cpu:/minecraft
    cgset -r cpu.cfs_quota_us=30000 minecraft
    cgset -r cpu.cfs_period_us=100000 minecraft

    Для третьего пункта:
    serverCommand = cgexec;-g;cpu/minecraft;java;...
    Ответ написан
    Комментировать
  • Как получить имена столбцов из sql запроса в Hibernate?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Из объекта SQLQuery никак. Но можно из SessionFactory получить мета-данные для какой-либо сущности:
    String[] columnNames = getSessionFactory()
                            .getClassMetadata(SomeEntity.class)
                            .getPropertyNames();
    Ответ написан
    Комментировать
  • Условия интернет провайдера. Нормальная практика?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Ого. Обалдеть - впервые такое вижу. У большинства провайдеров просто стабильный интернет без отвалов и более-менее приличная скорость - уже хорошо. А если еще и до техподдержки можно дозвониться - то вообще круто. А тут прям даже точные и измеримые показатели связи.
    Ответ написан
    4 комментария
  • Сколько нужно денег для объединения 50 компьютеров в сеть?

    Buchachalo
    @Buchachalo
    Тут подходов к проектированию много.

    Вариант раз. Все сделать на шнурках если позволяет размещение пользователей (в плане того что столы стоят около стен и не нужно шнурки тянуть через проходы и защищать их кабельканалами). 50 пользователей в обычный коммутатор не поместятся. Придется ставить несколько свичей (это с учетом того что вам не нужны vlan или гостевые сети иначе придется управляемые свичи ставить, а это требует более навороченного оборудования)
    Если прямо бюджетно то нужно:
    1) 5-6 бухт витой пары cat5 (тут лучше прикинуть где будут пользователи и посчитать сколько вам нужно шнурка + 10-15% запаса). От 4200 рублей за бухту.
    2) DES-1018P (есть пара гигабитный портов для подключения сервера и МФУ, 16 дырок для пользователей) 11000 за штуку.
    3) DES-1050G (48 дырок для пользователей + гигабитная дырка для интернетов) 10000 за штуку.
    4) В качестве сервера Платформа Supermicro 1U SYS-5018R-M. В районе 50.000 рублей без хардов и памяти. Сверху vmware и на нем уже развернуть файлопомойку, AD и сервер 1С. SSD для 1С поставить не забыть. Под backup и файлопомойку харды считаем отдельно. Еще накинуть оперативной памяти от 16Гб (не забываем что такие платформы знатно шумят, его нужно прятать от ушей подальше)
    5) Винда, 1С, антивирус, настройка всего этого нужно считать отдельно. Желательно нанять админа что бы он все это поддерживал. С горем пополам это будет работать.

    Вариант два.
    1) Сокращаем количество бухт до 1-2.
    2) Заменяем DES-1050G на Toчка доступа UniFi AC‑LR-5 (комплект 5шт) х 2. от 30.000 за комплект. Этим отвязываемся от шнурков которые тянутся к компутерам. Только не забыть на рабочие станции поставить хорошие wifi модули.
    3) Все остальное остается так же.

    Это в примерном приближение. Из более менее дешевого и то что в теории будет работать. Фирмы можно любые вставить. Практически все можно поменять на Mikrotik.

    По серверной платформе то же есть варианты. Можно взять юзанный HP Proliant MicroServer Gen8. Менее шумный, компактный, но если возрастет нагрузка на сервер, модернизировать его сложнее.

    И БОЛЬШОЙ вопрос будите ли пользоваться лицензионным ПО, так как цена за лицензии очень часто превышает цены сетевого оборудования.
    Ответ написан
    7 комментариев
  • Intellij IDEA для Unity?

    @D3lphi
    Зачем, если можно использовать Rider (ide, которая нацелена на C# разработку)? С плагином для Unity.
    Ответ написан
    3 комментария
  • Как сделать программу для уведомлений в Windows с интервалом на Java?

    jamakasi666
    @jamakasi666 Куратор тега Java
    Просто IT'шник.
    Ответ написан
    Комментировать