Giter Club home page Giter Club logo

fatmotorbot's People

Contributors

pongo avatar

Stargazers

 avatar  avatar

Watchers

 avatar  avatar

fatmotorbot's Issues

Показывать имт в /weight

Для расчета имт нужны вес, пол и рост.

  • выбрать и реализовать алгоритм. в отдельном файле, но в папке imt.
  • написать модуль info, возвращающий информацию о пользователе. #8

если пользователь вызывает /weight, а у него не указаны инфо, то в конце ответа абзац сообщает об этом (реализация /info в #8):

Для расчета ИМТ не хватает данных. Укажи их при помощи /info


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

  • Выбрать краткие объяснения.
  • Разобраться как определять сколько скинуть до след. "уровня".

ИМТ: xx.xx — у тебя здоровый вес. Твоя граница здорового веса: от xx до yy кг. А идеальный вес: xx кг.


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

ИМТ в вики

http://cmpmos.ru/vychislenie-indeksa-massy-tela-onlajn/
https://www.msdmanuals.com/medical-calculators/BodyMassIndex-ru.htm
https://calcus.ru/calculator-imt

https://calculator-imt.com/
https://herbalife.ru/calculator-bmi/

http://diet.neolove.ru/calc/ideal_ves_imt/
https://just-fit.ru/kalkuljator-imt

https://cont.ws/@fkmrf123/835024
https://www.infoniac.ru/news/Tablica-pravil-nogo-vesa-Kakoi-vash-DEAL-NY-ves.html

http://people.maths.ox.ac.uk/trefethen/bmi_calc.html
http://www.grandars.ru/college/medicina/indeksy-massy-tela.html
https://beachschool.ru/sovety/harvard-formula-body-mass-index/
https://woman.rambler.ru/health/41421648-formula-idealnogo-vesa-dlya-zhenschin-i-muzhchin/

Хранить старые графики, а не генерировать каждый раз на лету

  • допустим используем https://elements.heroku.com/addons/cloudinary
  • бот генерит ссылку для zeit, хеширует ее sha256 и ищет в cloudinary. если нашел — отдает ссылку.
  • если не нашел, то скачивает график из zeit и загружает его на cloudinary, отдавая ссылку. в cloudinary добавлять userId как тег, а ссылку для zeit как описание.

  • взять cloudinary в хероку, но всю работу делать в самом zeit
  • ну и добавить опцию типа &direct=true, чтобы отдавал напрямую без загрузки в облако

Интеграционные тесты

Весь процесс работы с ботом:

  • /check и /check ...
  • юзер впервые работает с ботом и вызывает /weight, /weight 55, затем /info, /info ..., затем /weight
  • юзер уже работал с ботом (в бд есть его данные) и он вносит новый вес

Тесты контроллеров: сделать хэндлер публичным методом и отправлять туда dto команды, мокнув телегу.

  • Заодно можно будет удалить какие-то лишние тесты?
  • Проверить какое будет покрытие одними лишь этими тестами
  • Проверить какое покрытие дают тесты юзкейсов

Тестировать на реальной базе или мокнутой?

  • в тесты репозиториев добавить моки и проверять, что моки возвращают такие же результаты

Типизация result

type OksOfT<T extends unknown[]> = { [P in keyof T]: Ok<T[P]> };

заменить на type OksOfT<T extends unknown[]> = { [P in keyof T]: T[P] extends Result<infer U> ? Ok<U> : never };


type OksOfT<T extends unknown[]> = { [P in keyof T]: T[P] extends Result<infer U> ? Ok<U> : never };
type ValuesOf<T extends unknown[]> = { [P in keyof T]: T[P] extends Ok<infer U> ? U : never };

function comb2<T1, T2>(results: [Result<T1>, Result<T2>]) {
  for (const result of results) {
    if (result.isErr) return result;
  }
  const oks = results as OksOfT<typeof results>;
  const values = oks.map(x => x.value);
  return ok(values as ValuesOf<typeof oks>);
}

посмотреть как типизирован Promise.all https://github.com/microsoft/TypeScript/blob/master/lib/lib.es2015.promise.d.ts


кажется рабочее Playground Link

type OksTupleOfT<T extends Result<unknown>[]> = { [P in keyof T]: T[P] extends Result<infer O, infer _> ? O : never }
type ErrsUnionOfT<T extends Result<unknown>[]> = T extends Array<infer R> ? R extends Err<infer E> ? E : never : never

function combine<T extends Result<unknown>[]>(...results: T): Result<OksTupleOfT<T>, ErrsUnionOfT<T>> {
  for (const result of results) {
    if (result.isErr) return result as Err<ErrsUnionOfT<T>>;
  }
  return ok((results as Ok<unknown>[]).map(x => x.value) as OksTupleOfT<T>);
}

graceful exit

следить за сигналом завершения работы.

  • выйти из телеги, снять вебхук
  • дождаться сохранения всех данных

  • какие есть лучшие практики для этого? библиотеки? вроде у меня было что-то сохранено в закладках...

/help

Сначала укажите свой вес и пол: /info ...

Теперь вы можете добавлять свой вес: /weight 45

Узнать текущий вес можно командой /weight или /w

Объединить проект d3-learn и *-svgexport

  • сделать копию проекта fatmotorbot-chart, чтобы и в zeit старый домен был, пока не обновлю бота
  • index.html, load.js, measures.json → переместить в папку public
  • все библиотеки перенести в public/lib
  • составить .nowignore
  • renderChart должен работать: в браузере, в jest, в ноде.

/info — добавляет информацию о пользователе

/info без параметров

Если данные указаны — показывает их.

Если не указаны — пишет:

Укажи свои данные командой: /info <пол> <рост>, где:
<пол> — м или ж
<рост> — 185

Пример: /info ж 164


/info с параметрами

Сохранил твои данные: женщина, 155 см.

Не могу разобрать твои каракули. Пиши точно как я указал.

Тестирование при помощи Stryker

https://stryker-mutator.io автоматически изменяет код, чтобы проверить, упали ли тесты (а они должны падать).


У него есть разные мутаторы:

  • typescript — будет менять не только код, но и типы.
  • javascript — транспилированный код из тс будет давать много ложных срабатываний, но надо бы сравнить результат с мутатором тс, вдруг больше найдет? в конфиге нужно убрать транспиляцию и мутировать dist
// striker.conf.js
/**
 * @type {import('@stryker-mutator/api/core').StrykerOptions}
 */
module.exports = {
  mutator: 'typescript',
  packageManager: 'npm',
  reporters: ['html', 'clear-text', 'progress'],
  testRunner: 'mocha',
  transpilers: ['typescript'],
  testFramework: 'mocha',
  coverageAnalysis: 'perTest',
  tsconfigFile: 'tsconfig.json',
  mutate: [
    //'dist/src/**/*.js',
    'src/**/*.ts',
    '!src/**/*.d.ts',
  ],
  files: [
    //'dist/**/*.*',
    '*',
    'package.json',
    '{src,test}/**/*.ts',
  ],
  mochaOptions: {
    spec: ['dist/test/nodb/**/*.test.js'],
    extension: ["js"],
    require: [],
  },
};

у меня используется module-alias, но вот беда — страйкер ни в какую не хочет с ними работать. есть два пути:

  1. трансформеры. "compilerOptions": { "plugins": [{ "transform": "@zerollup/ts-transform-paths" }] }. запуск или через ts-patch, или через ttcs (нужно будет npm run build изменить).
  2. "stryker_run": "cross-env NODE_PATH=dist stryker run"

не знаю который путь лучше. вроде оба работают.

Сравнить производительность EAV схем

Я вижу два варианта EAV схемы для нашей базы. (ну, это не совсем eav...)

1. Вариант с одной таблицей:

  • measure_id, user_id, value_type (string), value, date.

2. Две таблицы:

  • value_id, value_type
  • measure_id, user_id, value_id, value, date

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

  • получить все записи user_id и указанного value_type.
  • получить все записи указанного value_type.

Не забыть про индексы.


Я ожидаю, что второй вариант будет быстрее, возможно будет занимать меньше памяти.

Но он же сложнее в использовании:

  • для добавления нового value_type придется делать миграцию?
  • а как делать выборку по value_type? мне же нужно узнать ее value_id.

Обновить графики

  • общий вес нужно сделать понятнее. добавить надпись "итого" или размещать под последним весом.
  • в верхний/нижний край здоровой зоны нужно добавить toHealthy. только нужно разобраться как добавлять с правым выравниваем.

Рисовать график замеров

Полноценный или спарклайн?

  • в конце графика должен отображаться текущий вес
  • шкала слева должна иметь минимальный и максимальный вес
  • шкала снизу должна быть по месяцам
  • на графике должен быть обозначен текстом и кружком минимальный и максимальный вес
  • на графике должна быть область здорового веса
  • область идеального веса
  • справа должны быть обозначены границы ИМТ категорий. и прочерчены горизонтальные линии на них
  • линия должна содержать изменения веса +1, -2 и т.п. https://observablehq.com/@joakimdalen/makeovermonday-week-47-the-story-v2
  • линия тренда? регрессия?

https://bl.ocks.org/mbostock/4b66c0d9be9a0d56484e
https://observablehq.com/@harrystevens/directly-labelling-lines

https://www.d3-graph-gallery.com/line
https://github.com/d3/d3/wiki/Tutorials

sparklines

https://www.essycode.com/posts/create-sparkline-charts-d3/
https://bl.ocks.org/mph006/20f76a764fd5ed2ff37f
https://jarrettmeyer.com/2018/07/17/sparklines-in-d3
https://github.com/DKirwan/reusable-d3-sparkline
http://dataviztalk.blogspot.com/search/label/Tufte
http://dataviztalk.blogspot.com/2016/01/how-to-make-tuftes-discrete-sparklines.html

https://s3.amazonaws.com/edwardtufte.com/sparkline_twitter.png
http://interventions.onlinejacc.org/content/8/8/1018
https://www.edwardtufte.com/bboard/q-and-a-fetch-msg?msg_id=0001OR

google images: d3 sparklines

http://prag.ma/code/sparky/


http://plottablejs.org/examples/baseball/
https://williaster.github.io/data-ui/?selectedKind=sparkline&selectedStory=Kitchen%20sink&full=0&addons=0&stories=1&panelRight=0
https://lepisma.xyz/tufte.js/

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.