You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. Title: Почему я сделал личный проект учёта трат на Git+JS
  2. Date: 2020-05-03 00:00
  3. Category: News
  4. Slug: git-budget
  5. Lang: ru
  6. ![ГитБюджет][снимок]
  7. В этой статье Михаил поделится опытом использования Git+JS.
  8. Здравствуйте, господа, в этой статье я поделюсь опытом создания приложения учёта трат, в частности отвечу на следующие вопросы:
  9. 1. Зачем мне приложение учёта трат?
  10. 1. Почему это личный проект?
  11. 1. Почему проект на Git+JS?
  12. **1. Зачем мне приложение учёта трат?**
  13. Как и многие другие люди я давно хотел стать богатым и практиковать [успешный успех][успех]. Одной из рекомендаций в таких случаях часто выступает предложение вести собственный бюджет, чем я и занялся несколько лет назад. Скажу сразу, что ведение бюджета не сделало меня богатым и успешным, а своё материальное положение я улучшил обычным переездом в Москву.
  14. Вести бюджет я начал, если не изменяет память, где-то в 2012-м году. В то время у меня уже была профессиональная деформация программиста, выражающаяся формулой "сделано не мной" и попыткой написать всё самому. Тем не менее, по неопытности я решил начать с "проверенных" решений и приобрёл [YNAB][ynab] (You Need A Budget), т.к. приложение позволяло работать и с ПК, и с телефона.
  15. Я честно пытался задавать план трат на месяц и укладываться в него года три. Однако, где-то в 2015-м году авторы выпустили новую версию приложения, за которую **опять хотели денег**, старую же версию эти недальновидные капиталисты выкинули на обочину истории. В итоге мне пришлось выбирать из двух вариантов:
  16. 1. Заплатить за новую версию и пользоваться "совершенно новым" приложением с другим интерфейсом.
  17. 1. Послать их нафиг, сохранить деньги, но потерять текущую историю трат.
  18. Я рассудил, что:
  19. 1. приложение уже оплачивал;
  20. 1. старая версия меня устраивала;
  21. 1. новую версия я не просил;
  22. 1. если бы они мне до покупки сказали, что будут каждый раз драть с меня деньги, я бы им не заплатил и первый раз;
  23. 1. спонсировать такое хамство я не буду;
  24. и выбрал второй вариант: послал их нафиг и **потерял историю трат**.
  25. Эта ситуация меня довольно сильно разочаровала, поэтому я забросил ведение бюджета где-то на год. Однако, в один из дней "болезненной синхронизации" (также известной как "выяснение отношений") я **не смог отбить финансовый наброс** вида "ты транжира, вечно тратишь деньги на ерунду", после чего ясно осознал важность учёта трат.
  26. В этот раз я решил не повторять ошибку и не отдавать свои данные неизвестно куда с потенциальной возможностью их потерять, поэтому начал вести учёт трат в самых обычных заметках телефона. Формат был довольно простым и выглядел следующим образом:
  27. ![Заметки][снимок-заметки]
  28. Заметки продержались у меня до середины 2018-го, пока я всё-таки не захотел иметь возможность **работать с тратами на ПК**, чтобы анализировать их. Я решил поискать решение, которое позволит мне **бесплатно работать** с историей трат и на ПК, и на телефоне. Таким решением оказался обычный календарь:
  29. ![Календарь][снимок-календарь-день]
  30. ![Новая запись][снимок-календарь-запись]
  31. В календаре я использовал учётку Google, чтобы иметь доступ к [Apps Script][apps-script] (фактически JavaScript) для анализа записей. Делать скрипты оказалось не очень удобно, т.к. формат хранения календарных записей мало подходит для трат. Вопрос владения данными также оставался нерешённым: мои данные опять пылились на неизвестном и неподконтрольном мне сервере, а доступ к ним был лишь через неподконтрольный мне и **изменяющийся по чужой прихоти** API.
  32. Во время использования календаря меня периодически посещали две мысли:
  33. 1. как здорово было бы все свои данные хранить в Git, чтобы легко анализировать траты;
  34. 1. как здорово было бы использовать интерфейс без всего лишнего, чтобы ускорить запись трат.
  35. Осенью 2019-го я наткнулся на проект [Isomorphic-Git][isomorphic-git], позволяющий работать с Git из JavaScript, бегло проверил его работоспособность и понял, что нашёл свой Святой Грааль. Недавно я завершил создание первой версии приложения ГитБюджет, функциональность которого можно увидеть в следующем видео:
  36. <iframe width="720" height="405" src="https://www.youtube.com/embed/ii_cLXAy3S0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
  37. В итоге, сейчас учёт трат на телефоне у меня выглядит следующим образом:
  38. ![ГитБюджет][снимок-гит-бюджет]
  39. Данные в Git выглядят cледующим образом: [https://gitlab.com/kornerr/git-budget-sample-data/-/blob/me/gb.log](https://gitlab.com/kornerr/git-budget-sample-data/-/blob/me/gb.log)
  40. Отмечу некоторые важные моменты:
  41. * по ссылке представлено хранилище Git, отражающее действия из видео;
  42. * свои траты я храню в отдельном закрытом хранилище, так следует делать каждому;
  43. * приложение работает полностью на устройстве и не имеет сервера: используется хостинг GitHub Pages;
  44. * приложение общается с внешним миром лишь в момент синхронизации с Git;
  45. * пароль хранит браузер, приложение использует его лишь в момент синхронизации с Git;
  46. * приложение необходимо загружать по HTTP, т.к. используемая версия Isomorphic-Git (0.70.0) некоторые запросы (метаданные) к Git выполняет по HTTP, а браузеры нынче запрещают обращения к HTTP из HTTPS.
  47. **2. Почему это личный проект?**
  48. На ГитБюджет я потратил 40 часов своей жизни в течение первого квартала 2020-го, т.е. в среднем каждый день я тратил около получаса.
  49. Личный проект обладает следующими преимуществами по сравнению с рабочим:
  50. 1. Можно делать всё, что угодно, и учиться на своих ошибках.
  51. 1. Никто не стоит над душой и не ограничивает фантазию.
  52. 1. Предыдущие два пункта дают душевный покой и возможность совершенно спокойно принимать и исполнять самые идиотские решения на работе.
  53. 1. Шишки, набитые в личном проекте, колоссально расширяют кругозор.
  54. У личного проекта также есть и недостатки:
  55. 1. На твой проект пофиг всем в мире, кроме тебя.
  56. 1. Никто не даст тебе ни гроша.
  57. 1. Нужно умудряться выкраивать время на личный проект каждый день.
  58. 1. Жена не скажет тебе "спасибо", даже если сама потом будет использовать приложение.
  59. Легко заметить, что все недостатки личного проекта перекрываются преимуществами рабочего проекта. А все недостатки рабочего проекта перекрываются преимуществами личного проекта. Инь и янь.
  60. **3. Почему проект на Git+JS?**
  61. Хранение данных в Git вместо неизвестного сервера/API даёт следующие преимущества:
  62. 1. Git является самым распространённым решением для децентрализованного хранения проектов среди разработчиков, т.е. практически каждый разработчик умеет работать с Git.
  63. 1. Для работы с Git не нужен очередной API: вы просто работаете с файлами.
  64. 1. Есть много сервисов, предоставляющих хранилище Git бесплатно, если вы не помешаны на безопасности или не хотите платить денег за сервис.
  65. 1. Владелец сервиса Git, конечно, может через несколько лет [быть выкуплен крупной корпорацией][поглощение], однако, вы легко сможете перенести свои данные Git.
  66. 1. Для максимальной безопасности данных вы всегда можете поднять свой Git.
  67. Использование JS с HTML/CSS вместо Swift/Kotlin/C#/Python даёт следующие преимущества:
  68. 1. Ваше приложение будет работать и на телефоне, и на планшете, и на ПК.
  69. 1. Вам не нужно проходить никаких проверок вроде AppStore, для того чтобы попасть в каждое устройство.
  70. 1. Ввиду того, что стандарты HTML/CSS/JS согласуются огромным количеством компаний, ни одна из компаний не может [в одностороннем порядке прекратить поддерживать какую-либо технологию][opengl] или [в очередной раз поменять API][swift], так что обратная совместимость может достигать [20 лет][долговечные-приложения] и больше.
  71. 1. Ввиду отсутствия сервера вся логика размещается в JS, исполняемый на клиенте, что даёт возможность сохранить ту версию приложения, которая устраивает лично вас, и забыть про обновления, зачастую [приводящие лишь к увеличению тормозов][обновления].
  72. ГитБюджет является лишь первым испытанием возможностей Git+JS. Посмотрим, что удастся сделать ещё.
  73. [снимок]: ../../images/2020-05-06_гит-бюджет_снимок.png
  74. [снимок-заметки]: ../../images/2020-05-06_гит-бюджет_заметки.png
  75. [снимок-календарь-день]: ../../images/2020-05-06_гит-бюджет_календарь-день.png
  76. [снимок-календарь-запись]: ../../images/2020-05-06_гит-бюджет_календарь-запись.png
  77. [снимок-гит-бюджет]: ../../images/2020-05-06_гит-бюджет.png
  78. [успех]: https://успешный-успех.рф
  79. [ynab]: https://www.youneedabudget.com
  80. [apps-script]: https://developers.google.com/apps-script?hl=ru
  81. [isomorphic-git]: https://isomorphic-git.org/
  82. [поглощение]: https://habr.com/ru/post/413215/
  83. [opengl]: https://habr.com/ru/post/413335/
  84. [swift]: https://arm1.ru/blog/pro-perehod-na-swift-3-i-swift-2-4
  85. [долговечные-приложения]: on-the-way-to-durable-applications.html
  86. [обновления]: https://pikabu.ru/story/android_skoree_vsego_stanet_platnyim_6052457?cid=118211967