• Как "нарисовать" стопку карт?

    @bitwheeze Автор вопроса
    Ну обычно наверное да, достаточно пару штук нарисовать, но в данном случае должен получиться блэкджек. Я конечно не специалист в нем, но судя по всему для игроков важно прикидывать число карт в колоде, что бы вести подсчет. Потому хочу достаточно точно отобразить. Не каждую карту, каждую вторую или даже каждую четвертую. В стопке в покере 2-4 стандартных колоды карт.

    Это проект для самообразования, я пытаюсь одновременно разобраться с accessibility. Что бы и незрячие могли бы пользоваться сайтом. Если генерить кучу div-ов, то навигировать по структуре сайта становится сложнее. Возможно я что то не знаю, возможно как то можно скрыть все эти дивы в одном, что бы пользователь мог только узнать число карт в колоде и пройти дальше, а не прыгать по каждому диву, что бы добраться до своих карт на руке. Как то так

    65423a0ded317702502348.png
    Написано
  • Как в spring определить очередность загрузки application.properties?

    @bitwheeze Автор вопроса
    Ну да, видимо ничего другого не остаётся, библиотека очевидно инициализируется до того, как приложение прочитает свой application.yml. Так что надо сразу при старте либо переменной окружения задавать значение, либо системными пропертями.
    Написано
  • Spring Webflux Как побороть 502 bad gateway?

    @bitwheeze Автор вопроса
    Я вообщем в UI клиенте закомментировал создание EventSource к точке /api/events/{gamer} и ошибки ушли. Почему запросы к это точке всё api блокируют, ума не приложу?

    Вот так создаю EventSource

    useEffect(() => {
    
            if(!account) {
              return;
            }
            console.log("read events", account, timestamp);
            const eventSource = new EventSource(sol_api + `/events/${account}`);
            eventSource.onerror = (e) => {console.log("Event Source Error!", e);eventSource.close();setError(true);};
            eventSource.onmessage = (e) => addEvent(JSON.parse(e.data));
            return () => {
              console.log("close eventSource", eventSource);
              eventSource.close();
            };
          }, [account, timestamp]);
  • Spring Webflux Как побороть 502 bad gateway?

    @bitwheeze Автор вопроса
    Dmitry Roo, С CloudEvent объектом были какие то проблемы, точно не помню уже. Кажется были проблемы с сериализацией CloudEvent объекта. С дефолтным ObjectMapper-ом webflux не мог сериализовать CloudEvent из-за атрибута data, который является каким то приватным классом. Короче я тогда забил и конвертировал сам в строку. Теоретически без разницы же.

    limit(0) я попробовал уже после того как проблема в продакшене проявилась, с другими значениями были те же проблемы.
  • Как найти самую длинную последовательность значений?

    @bitwheeze Автор вопроса
    Хитро! И главное работает. Спасибо.
  • Как отобразить состояния уже с загруженными данными в react/next?

    @bitwheeze
    Evgeii, обычно делается так

    if(!data) return <i>Loading...</i>;
    return (тут уже отрисовка данных, которые вернул клиент)
  • Как считать, на сколько снизится вероятность заболеть, если использовать два разных средства (к примеру, маску и дистанцирование)?

    @bitwheeze
    Алан Гибизов, ну я бы сказал, что маска это коэффициент к "вероятности зарозиться". Чем лучше маска, тем меньше коэффициент. Простая маска коэффициент 0.9 к примеру, а космический скафандр 0.0.

    А социальное дистанцирование влияет на вероятность встретить носителя, то есть на "вероятность заболеть". Если не соблюдать, то к примеру вы можете повстречать 1000 человек за день из которых 0.3 носителей. Если соблюдать, но ходить до магазина, то 100, а если жестко соблюдать, то только одного доставщика пиццы. Но тут надо как то по другому считать. Если популярная пиццерия, то и доставщиков больше, ну и 0.3 из них носители.

    Как то так
  • Какую базу данных выбрать для сервера на Node.js?

    @bitwheeze
    Aryeh Leonid R., что бы быстро работало так и так придется держать ее в памяти. Либо это будет делать само приложение, либо все будет в кэше диска, базы данных. Плюс оверхед на движок базы данных со всеми библиотеками. В приложении можно данные и уплотнить возможно, так как вам виднее, чем базе данных. Кто муже, если есть swap, то редко-используемые страницы будут выгружаться на диск. Да и 300Мб мелочи жизни.
  • В чем причина ошибки при запуске tomcat из intellij idea?

    @bitwheeze
    Это весь стектрейс или было что еще после Caused by?
  • Как подружить web flux long polling запрос и scheduled метод?

    @bitwheeze Автор вопроса
    Dmitry Roo, это мой пет проект, что бы поковыряться с новой явой, в web flux. На работе мы только год назад мигрировали на 8 яву, а 17 еще для меня внове. Мне самому ясно, что я не специалист, я только учусь и я нигде другого не утверждал. Какой смысл об это мне тыкать, я не понимаю. Не лучше помочь по существу?

    В неком блокчейне добавляются блоки с пользовательскими данными каждые 3 секунды. "scheduled" метод запускается с fixedDelay = 3s и читает новые, еще не прочитанные блоки. И если в блоках есть данные по пользователям, он сохраняет их в базе данных.

    web клиет должен узнать об изменениях в базе, для этого я попробовал сделать что то вроде long polling запроса. До сих пор никогда такого не делал., тем более с web flux. Я нашел пример с DefferedResult, но он видимо для web на сервлетах. Потому я пытаюсь сделать по аналогии с Mono.

    Я себе представляю это так, что веб клиент шлет запрос на сервер, сервер периодически, раз в три секунды проверяет, не обновилась ли база данных по определенному аккаунту. Если есть обновление, то он возвращает новое состояние, если за 4 попытки обновления не было, то возвращает старое состояние.

    Проблема в том, что как только приходит запрос, то обработка блоков почему то прерывается. Причем только на сервере, на моем компьютере все срабатывает как ожидается. И не пойму в чем дело.

    Сейчас мой long polling метод выглядит так.

    @GetMapping("/hooks/{account}/new_game")
        public Mono<TableauDto> publisher(@PathVariable String account) {
            return Mono.defer(() -> {
                var currentStartBlock = service
                        .load(account)
                        .map(session -> session.getStartBlock())
                        .orElse(0l);
    
                try {
                    Thread.sleep(3000);
                    for (int i = 0; i < 4; i++) {
                        var tempSession = service.load(account);
                        if (tempSession.isPresent()) {
                            log.info("tempSession is present {}", tempSession.get().getStartBlock());
                            if (currentStartBlock < tempSession.get().getStartBlock()) {
                                log.info("return new session {}", tempSession.get().getStartBlock());
                                var dto = tempSession.get().getTableau().dto();
                                dto.setStartBlock(tempSession.get().getStartBlock());
                                return Mono.just(dto);
                            }
                        }
                        log.info("wait 3000");
                        Thread.sleep(3000);
                    }
                } catch (Exception e) {
                    log.error("error waiting new game", e);
                }
                return Mono.empty();
            });
        }


    Я лично грешу, что где то оба метода цепляются друг за дружку, видимо на уровне базы данных. На выходных попробую включить трассировку и сам разобраться. С проблемой, а не в себе ))
  • Как подружить web flux long polling запрос и scheduled метод?

    @bitwheeze Автор вопроса
    Очевидно вы не соблюдаете принцип единой ответственности


    А как вы это определили по этому куску кода? Вроде бы есть три компоненты, которые занимаются своим делом. Одна компонента читает данные из внешнего источника и и отдает на обработку другой, которая уже пишет данные в базу посредством JpaRepository. Controller тоже занимается своим делом, обработкой запросов. Где вы увидели смешение ответственности, мне честно говоря неясно, но было бы интересно, если бы вы подсказали.

    Но спасибо, что помогли разобраться в себе ))
  • Как подружить web flux long polling запрос и scheduled метод?

    @bitwheeze Автор вопроса
    Dmitry Roo, потому что я его не копировал, а написал в простом редакторе. Я же написал, что упростил.

    А Scheduled метод я переписал сегодня под taskScheduler и запускаю scheduleWithFixedDelay. Результат к сожалению тот же. Могу конечно сам метод привести, но толку если он вызывает несколько других?

    public void run() {
            if(!doScan) {
                return;
            }
            long currentBlock = stateService.getCurrentBlock();
            long headBlock = api.getDynamicGlobalProperties().orElseThrow().getHeadBlockNumber();
            if(currentBlock == 0) {
                currentBlock = headBlock - 2;
            }
            while(++currentBlock < headBlock) {
                log.info("process block {}", currentBlock);
                var block = api.getBlock(currentBlock).orElseThrow();
                blockProcessor.process(currentBlock, block);
            }
        }


    Если схематично, то он из базы достает номер последнего обработанного блока. Если с последнего вызова было несколько блоков с данными, в цикле каждый блок данных обрабатывается Если в блоке с данными есть указанный аккаунт, то обновляется соответствующий Session Объект в базе данных. Так как метод этот вызывается с фиксированной задержкой, то в логе я вижу периодическое появление сообщения "process block". Но как только приходит запрос, появление сообщения прерывается на несколько секунд.

    В IDE все происходит видимо быстро. Там я вижу в логе сообщение из метода приведенного выше "wait 3000", следом "process block". В блоке обнаруживаются новые данные, Session обновляется и long polling метод завершается. На сервере, в контейнере же, в логе появляется "wait 3000" несколько раз, потом метод завершает свою работу, и начинают появляться "process block" сообщения.
  • Как подружить web flux long polling запрос и scheduled метод?

    @bitwheeze Автор вопроса
    Сергей Горностаев, спасибо, ваше мнение очень важно для нас...
  • Как подружить web flux long polling запрос и scheduled метод?

    @bitwheeze Автор вопроса
    Dmitry Roo, возвращает Entity-Обьект из базы данных. Там по сути просто запрос к JpaRepository getById() методу.
  • Как подружить web flux long polling запрос и scheduled метод?

    @bitwheeze Автор вопроса
    Dmitry Roo, ну там в цикле проверяется внешний ресурс, и если есть изменения, то обновляется Session-Entity в базе данных. Но судя по логам вообще scheduled метод не вызывается. Дело до обновления Session объекта даже не доходит.
  • Как подружить web flux long polling запрос и scheduled метод?

    @bitwheeze Автор вопроса
    Сергей Горностаев, ну да, не понимаю. Пытался гуглить, нахожу только примеры с DefferedResult Я и проект начал, что бы разобраться с reactive программированием. Почему просто не подсказать как правильно, обязательно показательно хвататься за голову? Это не продуктивно.

    Насколько же я понял, web flux, запросы отрабатываются в отдельном потоке, в event loop-e. То-есть даже если я заблокирую поток. Даже если я Mono.defer буду использовать, все равно мне надо обращаться к ресурсам и в цикле их опрашивать, блокируя поток. .
  • Как избежать мигания при загрузке данных?

    @bitwheeze Автор вопроса
    Да, так и сделал, плюс оптимировал загрузку данных, а то выходило последолвательно все загружалось, потому так медленно было. Вообщем гружу теперь все данные разом, что бы не моргало. Скорость ок.