# Консольный менеджер задач

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

И вот тут на помощь приходят текстовые файлы и новый, довольно обширный круг менеджеров задач. Остановил свой выбор на [sjl/t](https://github.com/sjl/t "A command-line todo list manager for people that want to finish tasks, not organize them."), менеджере от Steve Losh.

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

1. Написан на Python, и то есть работает только там, где установлен интерпретатор и где подготовлена система зависимостей. С одной стороны это не проблема, но установка потребует дополнительных телодвижений, особенно если вы работаете на Windows.

1. Для идентификации задач используется хеширование SHA-1, что приводит к возможным колизиям и что потребовало от Стива добавление дополнительных проверок на корректность расчетов.

1. Формат текстового файла подразумевает наличие как текста, так и его хеша, что не совсем удобно, если нужно поправить список задач напрямую через файл.

В результате решил написать свою версию менеджера задач. Во-первых, это должен был быть бинарный файл. Чтобы можно было просто скопировать его на свой компьютер и начать использовать. Бинарник, который не зависит от его окружения. Во-вторых, использовать для хеширования более надежное решение в виде SHA-256. И в-третьих, убрать из файла сам хеш.

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

После того, как определился с тем, что решаю и как, стал выбирать язык программирования. Всегда очень любил C++, восхищался им. Поэтому написал первую версию [juev/t](https://github.com/juev/t/releases/tag/v1.0) именно на нем.

Но мне нужно было не только написать программу, но и собрать ее для различных систем, чтобы была полноценная кросс-платформенность. Вот тут мне пришлось изрядно попотеть.

Как оказалось, C++17 стандарт сложно использовать в Github Actions, по крайней мере потратив изрядное количество времени мне так и не удалось собрать программу на ubuntu и windows. Если правильно понимаю, проблема заключалась именно в параметрах запуска Cmake. И нужно было дополнительно определять используемый компилятор, размещение его запускныз файлов. Кое-как собрал бинарники для macOS и Linux, опубликовал и задумался.

Думал не долго, и решил переписть менеджер на Rust. Почему не на Golang спросите вы? Golang простой язык и писать программы на нем одно удовольствие. Но бинарники при этом получаются довольно объемные. В случае с этим менеджером получал бинарные файлы в несколько мегебайт. Для прикладных программ имхо это перебор.

Итак, Rust. Версию [2.0.0](https://github.com/juev/t/releases/tag/2.0.0) реализовал полностью на Rust, немного доработал процесс публикации и в версии [2.0.1](https://github.com/juev/t/releases/tag/2.0.1) реализовал сборку для всех основных операционных систем с оптимизацией по размеру бинарника. При этом на доработку процесса сборки потратил немного времени, совсем немного, если сравнивать со временем, которое потратил на разборки со сборкой C++17 проекта.

Помимо всех возможностей оригинальной [sjl/t](https://github.com/sjl/t "A command-line todo list manager for people that want to finish tasks, not organize them."), моя версия так же умеет работать с группой задач, которые передаются через запятую. При этом изменился формат файла, как писал выше, убрал из файла описание хеша. Что поломало совместимость с оригинальным менеджером. И если у вас есть файлы созданные с его помощью, не удаться их использовать с моей программой. Но по сути, это единственный недостаток, который быстро решается ручной правкой.

Надеюсь, что мой менеджер задач [juev/t](https://github.com/juev/t) окажется полезным и вам. И если у вас будут возникать вопросы, или предложения, смело заводите [issue](https://github.com/juev/t/issues).
