Git Product home page Git Product logo

kgparser's Introduction

Chat on Telegram GitHub issues Github PR

Bugs Code Smells Coverage Vulnerabilities Quality Gate Status

Related resources

Statistics generation import process

Json config files are used to set and transfer configuration values for main import classes.

How to execute PlayerDataDownloader to download data from Klavogonki to JSON files

PlayerDataDownloader takes 2 arguments: <inputConfigFilePath> and <outputConfigFilePath>. I will add download start and end dates from <inputConfigFilePath> and save the update json to <outputConfigFilePath>.

For example, to load players with playerId in [30000; 30100] (total 101 players) in 10 threads, set the input json file like this:

{
  "jsonFilesRootDir" : "D:/kg/json",
  "threadsCount" : 10,
  "minPlayerId" : 30000,
  "maxPlayerId" : 30100,
  "statisticsPagesRootDir" : "C:/java/kgparser/kgstats/src/main/webapp/"
}

Execution with overriding the log4j2.xml configuration file:

java -Dlog4j.configurationFile=log4j2.xml -jar kgstatsSrv/target/kgstats-srv-1.0.jar DOWNLOAD_PLAYER_DATA c:/java/config-input.json c:/java/config-output.json

Saved output config file will look like this:

{
  "jsonFilesRootDir" : "D:/kg/json",
  "threadsCount" : 100,
  "minPlayerId" : 30000,
  "maxPlayerId" : 30100,
  "dataDownloadStartDate" : "2021-01-17T21:39:19.0911347+01:00",
  "dataDownloadEndDate" : "2021-01-17T21:39:30.0225525+01:00",
  "statisticsPagesRootDir" : "C:/java/kgparser/kgstats/src/main/webapp/",
  "totalPlayers" : 101,
  "dataDownloadStartDateString" : "2021-01-17 21-39-19"
}

How to execute StatisticsApplication to import json files save by PlayerDataDownloader to the database

Database must already exist before the execution.

Pass the output json config file saved by PlayerDataDownloader as an <inputConfigFilePath> for StatisticsApplication.

Spring profile "database" must be set to turn on the JPA, Spring repositories etc.

This example passes the alternative Spring application properties file to be able to override the database name from the default application.properties.

log4j2.xml configures the logging.

java -Dlog4j.configurationFile=log4j2.xml -cp kgstats-srv-1.0.jar -Dspring.profiles.active=database -Dspring.config.name=application.actions.properties -Dspring.config.location=kgstatsSrv/src/main/resources/ IMPORT_JSON_TO_DATABASE c:/java/config-output.json 

How to execute StatisticsApplication to generate statistics files from the database

Database must already exist before the execution.

Database must be filled with data on the previous step.

Pass the output json config file saved by PlayerDataDownloader as an <inputConfigFilePath> for StatisticsApplication.

Pass the statistics generation config file as a <statisticsGeneratorConfigFilePath> for StatisticsApplication.

Spring profile "database" must be set to turn on the JPA, Spring repositories etc.

This example passes the alternative Spring application properties file to be able to override the database name from the default application.properties.

log4j2.xml configures the logging.

❗ If you have encoding problems in logs and saved files on Windows, also set a -Dfile.encoding=UTF8 option.

java -Dlog4j.configurationFile=log4j2.xml -cp kgstats-srv-1.0.jar -Dspring.profiles.active=database -Dspring.config.name=application.actions.properties -Dspring.config.location=kgstatsSrv/src/main/resources/ GENERATE_STATISTICS_FROM_DATABASE c:/java/config-output.json c:/java/generator-config.json

Какие графики и таблицы можно сделать на текущих данных

  • Количество игроков по рангам
  • Количество игроков по годам регистрации
  • Количество игроков по месяцам регистрации
  • Топ N (например, топ-100) игроков по:
    • абсолютному рекорду в обычном
    • по количеству друзей
    • по общему пробегу
    • по количеству используемых словарей
    • по рейтинговому уровню
    • по количеству достижений
    • по количеству машин в гараже
  • Пользователи без логина ("login": "")
  • Пользователи со скрытым профилем ("err": "hidden profile")
  • Заблокированные пользователи ("blocked": 1 и вообще blocked != 0)
  • Пользователи с невалидной датой регистрации
  • Клавомеханики ("title": "Клавомеханик")
  • Пользователи с одинаковыми никами (case-sensitive)
  • Пользователи, для которых get-summary работает, а get-index-data возвращает ошибку
    • https://klavogonki.ru/u/#/161997/
    • https://klavogonki.ru/u/#/498727/ — ошибка на ачивках в MongoDB.
    • Возможно, это какой-то баг в базе. Например, при импорте текстов из старой базы.
    • (!) Таких юзеров нужно специально парсить для отчётов, так как нет данных, например, по рекордам.
  • Количество юзеров без набранных текстов
  • Количество юзеров без рекорда в обычном
    • Вообще без текстов
    • С текстами (это значит, что весь пробег был в других режимах)
      • Такие спешиал юзеры можно прям списком
  • Машины — использующее количество игроков
    • Нужны коды машин
    • Это будут только текущие машины, а НЕ машины в гараже.
  • Уровень рейтинга — использующее количество игроков
  • Количество действующих id и недействующих id
    • Минимальный действительный id
    • Максимальный действительный id
  • Минимальная дата регистрации
  • Максимальная дата регистрации
  • Самый короткий логин
  • Самый длинный логин
  • Корреляция общего пробега и рекорда
    • TODO: а как выбирать данные для корреляции?
  • Группировка по общему пробегу: 0, 1-99, 100-999, 1000-9999, 10000-99999, >100000

MySQL

Create a read-only user

See https://kodejava.org/how-to-create-a-read-only-mysql-user/

User name: report, user password secret:

CREATE USER 'report'@'%' IDENTIFIED BY 'secret';

GRANT SELECT ON kgparser.* TO 'report'@'%';

FLUSH PRIVILEGES;

Dump the database

See https://phoenixnap.com/kb/how-to-backup-restore-a-mysql-database

mysqldump -u root -p kgparser > c:\java\kg\kgparser.sql

Restore the database from dump

See https://alvinalexander.com/blog/post/mysql/how-restore-mysql-database-from-backup-file/ To restore the dump, we first need to create the database.

mysqladmin -u root -p create kgparser_from_dump
mysql -u root -p kgparser_from_dump < c:\java\kg\kgparser.sql

Drop the database

See https://linuxize.com/post/how-to-delete-a-mysql-database/

mysqladmin -u root -p drop kgparser-from-dump

Maven

Install main modules without tests and without javadoc generation

From root directory, run

mvn install -DskipTests=true -Dmaven.javadoc.skip=true

Execute MapStruct generation in kgstatsSrv

From kgstatsSrv directory, run

mvn compile

❗ Now after making changes in kgparserSrv, you have to mvn install this module before running MapStruct in kgstatsSrv.

kgparser's People

Contributors

1anna2020 avatar dependabot[bot] avatar dievri avatar divinityai avatar dmitry-weirdo avatar p-h-e-m-m-e-r avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

kgparser's Issues

Оживить старый универсальный парсер

  • Убрать зависимость от kefir!
  • Переделать на SpringBoot
  • Сменить базу на MySQL.
  • Адаптировать современные парсеры — кроме Voidmain, есть как минимум парсеры от DIgorevich и Voidmain. — тянет на отдельную задачу

Когда по заданному критерию игроки занимают одно и то же место в топе, отображать их место как M-N

Например, если два игрока занимают 2-3 место в топе по скорости с результатом 967, то нужно показывать не 2 для одного игрока и 3 для другого игрока, а 2-3 для обоих игроков.

Для этого PlayerDto#orderNumber нужно будет сделать строкой, и поменять логику её заполнения в PlayerDtoMapper#fillOrderNumbers. Аналогично и для всех остальных топов, ведь они тоже будут генерироваться.

Поменять же TopTable.COLUMNS.NUMBER может быть сложновато, лучше там использовать готовую колонку, заполненную на сервере, а не просто index).

В сводку по игрокам добавить фильтры по минимальному пробегу

Запрос здесь: http://klavogonki.ru/forum/software/59/page1/#post15.

Сейчас взяты все актуальные юзеры с пробегом >= 1.

Добавить фильтры по общему пробегу: >=1, >= 100, >=1000, >=1000
Изменение фильтра должно перезагружать диаграммы и сводную таблицу.

Лучше сгенерить диаграммы сразу, а по фильтру просто менять показываемый контейнер (<div> или что-то подобное).

Extract statistics web module from kgparserWeb

  • Старый парсер содержит ненужные в статистике jsp страницы, скрипты, web.xml итд.
  • В статическом модуле свои скрипты и стили, а все страницы будут автогенерироваться.
  • Также копирование в S3 Bucket тоже только для статистики.
  • Нужно выделить статистику в отдельный веб-модуль.
  • Удалить всё из S3 бакета, задеплоить только файлы из нового выделенного модуля.
  • Это также позволит убрать префикс stats- из названия каждого хтмл-файла.
  • Корневую страницу переименовать из stats.html в index.html. Тогда прямая ссылка на https://kghackers.github.io/ будет сразу работать.

TODO:

  • Грохнуть все текущие страницы в продовом бакете.
  • Передеплоить в прод, поменять корневую страницу на index.html, перезагрузить dns.

В хинты в диаграммах добавить не только число, но и процент ранга от выборки (как в таблице)

Идея от Doctorisimus, @gaben-s-agent на GitHub.

Вот в эти хинты добавить и проценты, чтобы получалось что-то вроде 742 | 32,08%.
image

TODO: Изучить, как можно менять эти хинты в Chart.js. Сейчас они out-of-the-box, а надо кастомизировать. Это должно быть возможно стандартными средствами библиотеки.

Set up https for klavostat.com

В #27 настроен прямолинейный роутинг домена klavostat.com на S3-бакет klavostat.com согласно https://docs.aws.amazon.com/AmazonS3/latest/dev/website-hosting-custom-domain-walkthrough.html.
Таким образом невозможно настроить https.

Судя по всему, для https нужно настраивать AWS CloudFront.
См. https://aws.amazon.com/premiumsupport/knowledge-center/cloudfront-serve-static-website/.

https://towardsdatascience.com/static-hosting-with-ssl-on-s3-a4b66fb7cd00 — выглядит как более понятный туториал.

При получении сертификата через AWS Certificate Manager столкнулся с проблемой про, видимо, 0 лимит. Жду ответа от саппорта.

Добавить топы по словарям

  • Собирать статистику из /profile/get-stats-overview, а также, возможно /profile/get-stats-details и /profile/get-stats-details-data
  • Статистика юзеров может быть скрыта.
    • Есть предложение парсить их из запросов вида http://klavogonki.ru/ajax/profile-popup?user_id=242585&gametype=chars, но это потребует одного запроса на каждый словарь (то есть много запросов на каждого юзера), а список всех словарей юзера будет неизвестен.
    • Эту фичу предлагаю оставить до донатных времён.
  • Сгенерировать топы по крайней мере по стандартным словарям.
  • Показать в UI не только пробег, но также скорость и точность
  • Подумать над разными сортировками. По крайней мере нужны сортировки по рекорду в словаре desc и по пробегу в словаре desc.
  • Помимо стандартных словарей, нужен топ по «Обычному in English», чтобы был возможен топ билингвальных RU-EN.
  • ❗ На главную добавить, как минимум, количество актуальных юзеров со скрытой статистикой.
    • Вообще изучить, какие ошибки могут возвращаться из статы.
  • Добавить ссылку на «Создать игру по режиму», например: http://klavogonki.ru/create/?submit%3D1%26gametype%3Dvoc%26voc%3D1670%26type%3Dnormal%26level_from%3D1%26level_to%3D9%26timeout%3D10&sa=D&ust=1608136053145000&usg=AFQjCNHbZu2dkDS5ZXA6o0eW2TEG_iTycw

Дополнительные фишки: — лучше в отдельную задачу

  • Сделать ссылку не только на профиль, а на статистику по словарю
  • Сделать всплывающий ajax-профиль по словарю — это точно на отдельную задачу тянет.

Открытые вопросы

  • Исключать ли заблокированных пользователей из топов по словарям?
  • Какие ещё поля добавить в таблицу?

[parser] [legacy] На графике в рамках одного ранга использовать разные маркеры

Чтобы лучше различать игроков одного 
цвета, нужно назначать им наиболее разные 
маркеры точек.

Уставливать нужно параметры в series.data.marker, 
включая series.data.marker.hover:

        data.series = [
            {
                  "rank":"cyberracer"
                , "rankDisplayName":"Кибергонщик"
                , "color":"#00037C"
                , "name":"AvtandiLine"

                ,"data":[
                      null
                    , null
                    , null
                    , {
                          y: 527
                        , marker: {
//                            fillColor: '#000000'
                             symbol: 'square'

                            , states: {
                                hover: {
//                                    fillColor: '#FF0000'
                                     symbol: 'square'
                                }
                            }
                        }
                    }
                    , 533
                    , 530
                    , null
                    , null
                    , 525
                    , 565
                ]

            }
        ];

Original issue reported on code.google.com by [email protected] on 13 Feb 2014 at 4:03

Добавить топ игроков по суммарному времени по всем словарям

Запрос от plytishka см. https://klavogonki.ru/forum/software/59/page4/#post67.

Суммируем haul по всем словарям с группировкой по игроку, упорядочиваем по убыванию сумму.
Логично будет ограничить нижней границей, т.к. куча игроков, которые играли совсем мало. Поэкспериментировать с общей границей.

Также таблица должна содержать общий пробег.

Будет по сути аналогичен топу по общему пробегу, но более интересная метрика. К сожалению, только игроки с открытой статой. Собрать все словари по всем скрытым игрокам, не представляется возможным / адекватным по времени.

Сводки по словарям

Возможно, стоит разделить на "данные по одному словарю", и "данные по всем словарям".

  • Общее число текстов, набранных всеми игроками в словаре.
  • Общее время всех игроков в словаре
  • Для книг: число игроков, прошедших книгу
  • Число игроков с пробегом по словарю:
    • 1+
    • 10+
    • 100+
    • 1000+
    • 10000+
  • Средние показатели для игроков с пробегом по словарю ( 1+, 10+, 100+, 1000+, 10000+):
    • лучшая скорость
    • средняя скорость
    • ошибочность
    • затраченное время
    • на сколько пройдена квалификация

Топ по книгам: число игроков, прошедших книгу.

Топ по количеству симолов (возможно, имеет смысл только для книг).

Агрегация по типу словаря.

Агрегация по стандартным критериям (непопулярные словари объединить как "все остальные"):

  • Общий пробег
  • Общее затраченное время
  • ❗ возможно, сделать опцию "исключить обычный", так как он занимает слишком гигантскую долю среди всех словарей.

GitHub Actions: follow-up ticket

В #9 реализован простейший CI, что уже хорошо.

Судя по всему, CodeQL — это ещё очень сырой продукт, совсем не GitLab, не Jenkins итд.

Этот тикет для того, чтобы собрать дальнейшую работу по теме CI.

  • Добавить документацию о том, как работает то, что сейчас сделано.
  • Убрать запуск CodeQL по: сгенерированным файлам (MapStruct, AssertJ Generator usw), тестам (он считает их "неиспользуемыми классами"), html файлам, сохранённым с КГ.
  • Прикрутить code coverage.
  • Как-то публиковать отчёт по тестам.
  • Прикрутить SonarQube.
  • ❗ Прикрутить все остальные возможные воркфлоу, см. https://github.com/dmitry-weirdo/kgparser/security/code-scanning/setup.

Document technologies and processes

Нужно описать:

Work on batch insertion of data into the database

Для #19 вроде бы установлен батчевый insert согласно https://www.baeldung.com/spring-data-jpa-batch-inserts, все строки статистики одного игрока вставляются через CrudRepository#saveAll.

Тем не менее, всё равно вставка данных 628000 пользователей занимает значительное время (много часов). Если бы инсёрт был полностью батчевым (как при восстановлении батча базы, будто мы сгенерировали все insert into, а потом запустили их. Можно вручную создавать id или вообще использовать playerId и gametype.info.id в качестве айдишников), он был бы точно намного быстрей.

Автоматизация процесса деплоя

  • Разобраться, как аплоадить в S3 один зип-файл, а не 100500 отдельных, что длится немалое время.
  • Генерация и деплой текущей должны выполняться автоматически и в пайплайне, а не с меня локально. Дамп базы где-то должен лежать, разворачиваться и запускаться KgApplication, где надо сде
  • Как минимум исторические версии должны храниться в зип-файлах, а не всеми файлами в Гит. При деплое должны распаковываться.
  • Разобраться, можно ли реализовать ручной степ деплоя (по нажатию кнопки) в GitHub Actions. Если нет, сделать в AWS Code Build (там можно указывать гитХабовский репозиторий в качестве исходников).
  • Разобраться, как безопасно хранить AWS-credentials в Гит. Для начала пойдут и переменные окружения в CI, но вообще это нежелательный подход.
  • Настроить специальную роль в AWS, которая сможет только деплоить в S3, и никаких больше прав. Использовать только пользователя с этими пермишшнами для деплоя.
  • Сделать скрипт, который копирует из тестового бакета в продуктовый и инвалидирует кэши.

Сделать нормальный дизайн

  • Реорганизовать меню в что-то удобоваримое.
  • Сделать тёмную тему, или вообще только тёмную тему
  • Строку ввода центрировать и увеличить. Чтобы и с мобилок можно было нормально вводить.
  • Сделать нормальные иконки донатов.
  • https://codepen.io/WildLion/pen/wvzxPzN — пример пейжинга от Панчера.

[needs-community-approval] Overall changes in the application

Решения нужно обсудить с коммьюнити:
❗ ❗ ❗ сделать опрос на какой-нибудь бесплатной опросной платформе, там и собрать мнение коммьюнити.

❓ Изменить формат поля "Дата регистрации" на формат без времени
❗ Текущий формат позволяет сортировать по датам как по строкам, что удобно.

Текущий формат: 2009-07-31 12:31:23
Предлагаемый формат: 2009.07.31 — оставим обратную сортировку, чтобы можно было сортировать как строку.

❓ При наличии страницы "Игроки по рангам" с фильтрами стоит ли убрать график с главной страницы?
Я бы не убирал, ибо новая страница тяжёлая, а титульная странича содержит выборки, а не данные по всем игрокам.

❓ Убрать ли старый ТОП-500 по рекорду в "Обычном" (в нём нет фильтрации по минимальному пробегу, так как есть уже большой топ (но там есть фильтрация по минимальному общему пробегу, сейчас это 1000+ текстов)

❓ Какие новые диаграммы нужны, а какие не нужны?

❓ Нужно ли менять позиции с диапазонов на одинаковое место для всех игроков с одинаковым результатом?
Я бы оставил как есть, диапазон используем и достаточно нагляден, хотя визуально и перегружает таблицы.

❓ Какая точность нужна для дробных значений: процент ошибок, средняя скорость. На самих КГ средняя округляется до целого, а процент ошибок — до 2 знаков после запятой.

❓ Будет ли достаточно, если старые топы не будут храниться целыми страницами, а будет скачиваться зип-файл со всеми страницами топа?

Implement OAS, at least for /api endpoints

  • Добавить параметры запросов.
  • Добавить модели результатов.
  • Сгруппировать по тэгам. Например, некоторые запросы являются private.
  • Также существуют эндпойнты вне /api (список игр, задачи дня итд). Но они не так важны.
  • Добавить генерацию клиента через Open API Generator и тесты для клиента (на моём профиле, на специальных профилях вроде Artch итд) — это достойно отдельной задачи, в принципе.
  • ❗ ❗ По-хорошему, классы вроде PlayerIndexData и PlayerSummary должны генерироваться из OAS, а не писаться вручную.

Проставить макс длины в полях ввода

Для логина юзера: от 0 до 21 символов (легальный ник до 15, но в БД присутствуют ники длиной до 21).

Для пробега: от 0 до 6 символов (миллионов пока нет ни у кого)

Добавить в пейджинг ссылки на предыдущую и следующую страницу

  • Модифицировать класс Paging в stats-top-table.js.
  • На первой и последней странице ссылки должны быть недоступными.
  • На остальных страницах должны вести на currentPage - 1 и currentPage + 1.
  • Символы < и > должны подойти.
  • Добавить в генератор топа (хотя тут вроде ничего делать не надо, весь пейджинг создаётся джаваскриптом).

Generate all the htmls with Freemarker

  • Сделать инклюд заголовка (https://freemarker.apache.org/docs/ref_directive_include.html). Тогда его можно будет менять в одном а не нескольких файлах.
  • Все текущие страницы должны генериться аналогично новому топу.
  • Ссылка на css-файлы должна содержать параметр с таймстепом его изменения. Это позволит автообновлять файл на стороне юзеров, чтобы он не брался из кэша. См. http://klavogonki.ru/forum/software/59/page3/#post47.
  • Все имена файлов должны храниться в джава-коде и передавать в FTL.
  • Также нужно генерить файлы в подпапку с именем, соответствующим дате/времени выгрузки.
    • Таким образом, перезаписываться файлы не буде
  • Приватный внутренний класс Config нужно перенести в общий класс типа ParserContext, который будет использоваться для генерации всех страниц через FTL.
    • В том числе будут содержаться: время выгрузки (старт и стоп), мин/макс playerId, на котором запускалось, записей на странице в топе, записей в Топ-500, минимальный пробег для топа по лучшей скорости итд.
  • ❗ ❗ Подумать, а нужно ли грузить данные через JSON-файлы, ведь можно всю html-ку статически сгенерировать.
    • Для топов это так, а вот для статистики нужен именно JSON, так как его мы будем использовать в chart.js диаграммах.
  • ❗ ❗ ❗ Полная автоматическая генерация позволит не хранить кучу сгенерированные страницы в исходниках. Можно будет просто зиповать их под нужной датой (датой загрузки данных). А в скрипте аплоада в S3 просто раззиповывать и деплоить раззипованные.

Автоматизировать создание индексов в БД

Таблица с данными по словарях уже в текущей загрузке содержит 3 464 639 записей, что делает запросы по ней достаточно медленными.
Можно просто запускать нативные скрипты после вставки данных.

Точно нужны:

alter table player_vocabulary_stats add index (vocabulary_code);
alter table player_vocabulary_stats add index (vocabulary_code, races_count);

todo: также подумать над:

  • именованными индексами
  • созданием через Liquibase. Непонятно, насколько будет тормозиться вставка данных при наличии индексов. Хорошо бы это измерить.

Add links to other KG-related projects, at least into README.md

Добавить ссылки на другие открытые проекты по КГ:
Лучше, наверное, в вики.

❗ ❗ ❗ https://github.com/topics/klavogonki — вот так можно будет найти проекты, связанные с КГ, на ГитХабе, если в About проставить топик klavogonki. Нужно сделать это во всех проектах, которые есть тут.

Также можно добавить список известных игроков-разработчиков:
Полезная ссылка для поиска связанных проектов — https://github.com/search?q=klavogonki

Многословарные топы

Окончательный формат пока не ясен.
Сделать какой-то формат и предложить комьюнити.

Известные наборы словарей, суммарные топы по которым имеют смысл:

  • Мультилингва
  • Обычный + Обычный in English
  • Упражнения Хруста
  • Упраженения Кащея

Добавить график игроков по рангам с регулируемыми границами минимального и максимального общего пробега

Запрос от Doctorisimus.

  • Попробуем реализовать в текущей статической схеме. Для этого нужно выгрузить данные для всех актуальных (с рейтингом и незаблокированных) на одну страницу.
    • Выгружаем Примерный формат данных: [ {"rank": 1, "totalRacesCount": 666}, {"rank": 6, "totalRacesCount": 123456} ]
      • ❗ Есть смысл назвать поля покороче, чтобы страница весила меньше. Вплоть до r (rank) и c (count).
      • ✔️ Сделал вообще минималистичный вариант — двумерный массив вида [[rankLevel1: totalRacesCount1], [rankLevel2: totalRacesCount2]].
    • При выборе фильтра minRaces / maxRaces выполняем по полному списку игроков:
    • Ввод должен быть minRaces <= maxRaces, иначе ошибка валидации.
    • Можно не вводить одно значение фильтра или оба, тогда применения нижней/верхней границы по totalRacesCount
    • https://stackoverflow.com/questions/8864430/compare-javascript-array-of-objects-to-get-min-max
  • Делаем на отдельной странице, пусть тяжёлой будет только она.
  • Перерисовка одной диаграммы с новыми данными уже выполнена на главной странице для свитча 1+ / 10+ / 100+ / 1000+ / 10000+.
  • TODO: неясно, нужны ли игроки с 0 пробгеом. Они всё равно всегда имеют ранг "Новичок". Думаю, что для экономии размера страница на 170621 юзеров имеет смысл их не выбирать.
    • Для минимизации размера страницы — выбрал юзеров только с минимум 1 текстом пробега. Файл с данными и так весит 2,3 Мб.

[donate-only] Добавить выгрузку данных топов напрямую в Google Sheets вместо XLSX

[parser] [legacy] Некорректное поведение, когда нет заездов в загруженном файле.

При заходе на страницу соревнование падает 
NPE при создании CompetitionBasicInfo.

Нужно сразу при парсинге выдавать ошибку, 
если нет ни одного заезда в загруженном 
соревновании (это может быть, например, 
если в zip-файле json-ы расположены не в корне.

Original issue reported on code.google.com by [email protected] on 27 Feb 2014 at 8:01

Make SpringBoot module a child of root module, switch to BOM

Добавить выгрузку топов в XLSX и/или CSV

  • См. https://klavogonki.ru/forum/software/59/page3/#post46 и https://klavogonki.ru/forum/software/59/page3/#post51.
  • Сгенерировать на тех же данных статические xls-файлы, содержащие те же данные.
    • todo: какую библиотеку используем, POI?
  • Для многостраничных топов постраничной выгрузки не делаем, только все страницы целиком.
    • todo: или кому-то таки нужны постраничные выгрузки в Excel? Не думаю.
  • Отсортировать по-другому юзеры смогут уже сами в Экселе итд.
  • На генерируемые страницы топов добавить ссылки «скачать в Excel», которые будту вести на статические XLSX файлы.
  • todo: подумать над расцветкой фона ячеек.
  • ❗ Для экономии места / ускорения загрузки может иметь смысл загружаемые файлы зазиповать.
  • ❗ В долбаном Excel не работают ссылки, содержащие #. Но если экспортировать тот же файл в Google Sheets, то там тот же Hyperlink работает. Если же заэксейпить # как %23, то ссылка вида https://klavogonki.ru/u/%23/242585 будеот открываться из Excel, но вызывать ошибку на Клавогонках.
  • ✔️ Неработающие из Excel линки обойдены с помощью синонимичных линков без #https://klavogonki.ru/profile/242585/.
  • ❗ ❗ ❗ Если сгенерированные XLSX-файлы будут очень большими (особенно для большого топа), то лучше их зазиповать, чтобы юзеры скачивали меньший объём.
  • Колонка "Зарегистрирован" должна быть в Excel с датовым форматом. Для этого нужно будет добавить в PlayerDto не только строку, но и скопированный LocalDateTime из PlayerEntity.registered.
  • В каждом экспортере генерировать не только HTML через FreeMarker, но и XLS через POI. Видимо, нужно будет зиповать Эксели. Нужно будет ввести класс типа FreemarkerTemplate, но для экселя, который будет принимать имя файла и определять набор/порядок колонок (вынести это из ExcelExporter. Имя Экселя нужно передавать в FTL для ссылки.
  • генерировать в FTL → HTML ссылки на скачивание соответственного Экселя. Для многостраничного топа — экспортируем все страницы в один Excel.

Сообщение об обновлении в теме
http://klavogonki.ru/forum/software/59/page5/#post98

Out of scope

  • Генерация прямо в гугл-док. Это дополнительные разборки с API, так что это только за донаты. — выделил в #33.
  • Генерация chart.js диаграмм прямо в Excel. Даже не знаю, как это можно сделать. Возможно, проще будет сохранить страницу как html. Не знаю, насколько хорошо там работают canvas.
  • Выгрузку всех топов в один Excel — пока не делаем. Возможно, запросят. Тогда можно будет и сделать.

[pref] add average columns for ratings tables

В результирующие рейтинги добавить 
колонки средних значений (4 знака после 
запятой): в среднем очков за пулю, в среднем 
вистов за пулю, среднее место в пуле.


по форматированию дробного числа в js см. 
ссылку:
http://stackoverflow.com/questions/6134039/format-number-to-always-show-2-decima
l-places

Original issue reported on code.google.com by [email protected] on 20 Feb 2015 at 1:08

Set up the simplest GitHub Action pipeline

See https://docs.github.com/en/free-pro-team@latest/actions/guides/building-and-testing-java-with-maven.

  • Run mvn install.
  • Expect tests to pass.
  • If possible: describe in README.md how to access the test report .
  • ❗ Сейчас SpringBoot модуль нужно собирать отдельно, он не входит в иерархическую структуру, и наследует от spring-boot-starter-parent. Причём для его генерации нужен инсталлированный kgparserSrv

Добавить другие способы доната

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

  • Виртуальная карта Тинькофф — создал, лимиты установил, нужно добавить в шапку.
  • Yoomoney (экс-Яндекс.Деньги) — зарегался, жду подтверждения аккаунта, чтобы на него можно было принимать деньги. По — добавить в шапку наряду с ПэйПалом
  • Кнопку ПэйПала сделать другим дизайном, чтобы было понятно, что это PayPal.
  • TODO: изучить возможные другие способы, типа той же xsolla.

Execute data loading from API in multiple threads

  • Разделить загрузку в PlayerSummaryDownloader на загрузку отдельных частей в разных тредах.
    • Как минимум, можно загружать каждый запрос в своём треде.
    • Также можно загрузить группы айдишников юзеров на разные треды (допустим, по 10к юзеров).
  • Скорее всего, через ExecutorService.
  • ❗ Не факт, что это даст значительный буст на free-tier-available EC2, где мало ядер. Но всё равно какой-то буст должен быть.

Рефакторинг конфигов

Задача, чтобы было где излагать мысли и под чем коммитить.

Сейчас конфиги используются в

  • PlayerDataDownloader
  • PlayerJsonParser
  • KgParserApplication
    • Тот же конфиг для импорта данных (передаётся в PlayerJsonParser)
    • ExportContext для генерации
      • фактически те же поля, только context.dataDownloadEndDate — надо заполнить уже после завершения экспорта, то есть после работы PlayerDataDownloader.
      • startDate тоже заполняется в PlayerDataDownloader, когда он начинает загрузку данных.
  • Для генерации нужен свой конфиг, который будет настраивать:
    • Какие экспортеры (aka генераторы) запускать.
    • Желательно также добавить minRacesCount по экспортерам, чтобы можно было перегружать его для каждого экспортера.

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

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.