Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

209 linhas
18KB

  1. <!DOCTYPE html>
  2. <html>
  3. <meta charset="utf-8">
  4. <head>
  5. <style>
  6. #header
  7. {
  8. background: #2BA6E3;
  9. padding: 0.7em;
  10. text-align: left;
  11. }
  12. #header a
  13. {
  14. color: white;
  15. text-decoration: none;
  16. padding: 0.5em 1em 0.5em 1em;
  17. }
  18. #lang
  19. {
  20. float: right;
  21. }
  22. .news_item
  23. {
  24. background: #FFFFFF;
  25. width: 720px;
  26. padding: 1em;
  27. margin-top: 2em;
  28. margin-bottom: 2em;
  29. border: 1px solid #E0E0E0;
  30. text-align: left;
  31. }
  32. .news_item_contents
  33. {
  34. color: #444;
  35. line-height: 1.5em;
  36. }
  37. .news_item_date
  38. {
  39. margin-bottom: 2em;
  40. color: #aaa;
  41. }
  42. html
  43. {
  44. font-family: sans-serif;
  45. }
  46. body
  47. {
  48. background: #FAFAFA;
  49. }
  50. code, pre
  51. {
  52. font-family: monospace, serif;
  53. font-size: 1em;
  54. color: #7f0a0c;
  55. }
  56. /*
  57. figure
  58. {
  59. margin: 0px;
  60. padding: 0px;
  61. }
  62. */
  63. img
  64. {
  65. width: 720px;
  66. }
  67. .mobile
  68. {
  69. width: 320px;
  70. }
  71. a
  72. {
  73. color: #3A91CB;
  74. }
  75. table
  76. {
  77. border-collapse: collapse;
  78. }
  79. table, th, td
  80. {
  81. border: 1px solid #aaa;
  82. padding: 0.5em;
  83. margin-top: 0.5em;
  84. margin-bottom: 0.5em;
  85. }
  86. </style>
  87. </head>
  88. <body>
  89. <div id="header">
  90. <strong id="title">Open Game Studio</strong>
  91. <a href="../../ru/news/index.html">Новости</a>
  92. <a href="../../ru/game/index.html">Игры</a>
  93. <a href="../../ru/tool/index.html">Инструменты</a>
  94. <a href="../../ru/page/about.html">О нас</a>
  95. <div id="lang">
  96. <a href="../../en/news/git-budget.html">EN</a>
  97. <a href="../../ru/news/git-budget.html">RU</a>
  98. </div>
  99. </div>
  100. <center>
  101. <h1>В новостях...</h1>
  102. <div class="news_item">
  103. <h2 class="news_item_title">
  104. <a href="git-budget.html">Почему я сделал личный проект учёта трат на Git+JS</a>
  105. </h2>
  106. <p class="news_item_date">
  107. 2020-05-03 00:00
  108. </p>
  109. <div class="news_item_contents">
  110. <p><img src="../../images/2020-05-06_гит-бюджет_снимок.png" alt="ГитБюджет" /></p>
  111. <p>В этой статье Михаил поделится опытом использования Git+JS.</p>
  112. <p>Здравствуйте, господа, в этой статье я поделюсь опытом создания приложения учёта трат, в частности отвечу на следующие вопросы:</p>
  113. <ol>
  114. <li>Зачем мне приложение учёта трат?</li>
  115. <li>Почему это личный проект?</li>
  116. <li>Почему проект на Git+JS?</li>
  117. </ol>
  118. <p><strong>1. Зачем мне приложение учёта трат?</strong></p>
  119. <p>Как и многие другие люди я давно хотел стать богатым и практиковать <a href="https://успешный-успех.рф">успешный успех</a>. Одной из рекомендаций в таких случаях часто выступает предложение вести собственный бюджет, чем я и занялся несколько лет назад. Скажу сразу, что ведение бюджета не сделало меня богатым и успешным, а своё материальное положение я улучшил обычным переездом в столицу.</p>
  120. <p>Вести бюджет я начал, если не изменяет память, где-то в 2012-м году. В то время у меня уже была профессиональная деформация программиста, выражающаяся формулой "сделано не мной" и попыткой написать всё самому. Тем не менее, по неопытности я решил начать с "проверенных" решений и приобрёл <a href="https://www.youneedabudget.com">YNAB</a> (You Need A Budget), т.к. приложение позволяло работать и с ПК, и с телефона.</p>
  121. <p>Я честно пытался задавать план трат на месяц и укладываться в него года три. Однако, где-то в 2015-м году авторы выпустили новую версию приложения, за которую <strong>опять хотели денег</strong>, старую же версию эти недальновидные капиталисты выкинули на обочину истории. В итоге мне пришлось выбирать из двух вариантов:</p>
  122. <ol>
  123. <li>Заплатить за новую версию и пользоваться "совершенно новым" приложением с другим интерфейсом.</li>
  124. <li>Послать их нафиг, сохранить деньги, но потерять текущую историю трат.</li>
  125. </ol>
  126. <p>Я рассудил, что:</p>
  127. <ol>
  128. <li>приложение уже оплачивал;</li>
  129. <li>старая версия меня устраивала;</li>
  130. <li>новую версия я не просил;</li>
  131. <li>если бы они мне до покупки сказали, что будут каждый раз драть с меня деньги, я бы им не заплатил и первый раз;</li>
  132. <li>спонсировать такое хамство я не буду;</li>
  133. </ol>
  134. <p>и выбрал второй вариант: послал их нафиг и <strong>потерял историю трат</strong>.</p>
  135. <p>Эта ситуация меня довольно сильно разочаровала, поэтому я забросил ведение бюджета где-то на год. Однако, в один из дней "болезненной синхронизации" (также известной как "выяснение отношений") я <strong>не смог отбить финансовый наброс</strong> вида "ты транжира, вечно тратишь деньги на ерунду", после чего ясно осознал важность учёта трат.</p>
  136. <p>В этот раз я решил не повторять ошибку и не отдавать свои данные неизвестно куда с потенциальной возможностью их потерять, поэтому начал вести учёт трат в самых обычных заметках телефона. Формат был довольно простым и выглядел следующим образом:</p>
  137. <p><img alt="Заметки" src="../../images/2020-05-06_гит-бюджет_заметки.jpg" class="mobile"></p>
  138. <p>Заметки продержались у меня до середины 2018-го, пока я всё-таки не захотел иметь возможность <strong>работать с тратами на ПК</strong>, чтобы анализировать их. Я решил поискать решение, которое позволит мне <strong>бесплатно работать</strong> с историей трат и на ПК, и на телефоне. Таким решением оказался обычный календарь:</p>
  139. <p><img alt="Календарь" src="../../images/2020-05-06_гит-бюджет_календарь-день.jpg" class="mobile"></p>
  140. <p><img alt="Новая запись" src="../../images/2020-05-06_гит-бюджет_календарь-запись.jpg" class="mobile"></p>
  141. <p>В календаре я использовал учётку Google, чтобы иметь доступ к <a href="https://developers.google.com/apps-script?hl=ru">Apps Script</a> (фактически JavaScript) для анализа записей. Делать скрипты оказалось не очень удобно, т.к. формат хранения календарных записей мало подходит для трат. Вопрос владения данными также оставался нерешённым: мои данные опять пылились на неизвестном и неподконтрольном мне сервере, а доступ к ним был лишь через неподконтрольный мне и <strong>изменяющийся по чужой прихоти</strong> API.</p>
  142. <p>Во время использования календаря меня периодически посещали две мысли:</p>
  143. <ol>
  144. <li>как здорово было бы все свои данные хранить в Git, чтобы легко анализировать траты;</li>
  145. <li>как здорово было бы использовать интерфейс без всего лишнего, чтобы ускорить запись трат.</li>
  146. </ol>
  147. <p>Осенью 2019-го я наткнулся на проект <a href="https://isomorphic-git.org/">Isomorphic-Git</a>, позволяющий работать с Git из JavaScript, бегло проверил его работоспособность и понял, что нашёл свой Святой Грааль. Недавно я завершил создание первой версии приложения ГитБюджет, функциональность которого можно увидеть в следующем видео: </p>
  148. <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>
  149. <p>В итоге, сейчас учёт трат на телефоне у меня выглядит следующим образом:</p>
  150. <p><img alt="ГитБюджет" src="../../images/2020-05-06_гит-бюджет.jpg" class="mobile"></p>
  151. <p>Данные в Git выглядят cледующим образом: <a href="https://gitlab.com/kornerr/git-budget-sample-data/-/blob/me/gb.log">https://gitlab.com/kornerr/git-budget-sample-data/-/blob/me/gb.log</a></p>
  152. <p>Отмечу некоторые важные моменты:</p>
  153. <ul>
  154. <li>по ссылке представлено хранилище Git, отражающее действия из видео;</li>
  155. <li>свои траты я храню в отдельном закрытом хранилище, так следует делать каждому;</li>
  156. <li>приложение работает полностью на устройстве и не имеет сервера: используется хостинг GitHub Pages;</li>
  157. <li>приложение общается с внешним миром лишь в момент синхронизации с Git;</li>
  158. <li>пароль хранит браузер, приложение использует его лишь в момент синхронизации с Git;</li>
  159. <li>приложение необходимо загружать по HTTP, т.к. используемая версия Isomorphic-Git (0.70.0) некоторые запросы (метаданные) к Git выполняет по HTTP, а браузеры нынче запрещают обращения к HTTP из HTTPS.</li>
  160. </ul>
  161. <p><strong>2. Почему это личный проект?</strong></p>
  162. <p>На ГитБюджет я потратил 40 часов своей жизни в течение первого квартала 2020-го, т.е. в среднем каждый день я тратил около получаса.</p>
  163. <p>Личный проект обладает следующими преимуществами по сравнению с рабочим:</p>
  164. <ol>
  165. <li>Можно делать всё, что угодно, и учиться на своих ошибках.</li>
  166. <li>Никто не стоит над душой и не ограничивает фантазию.</li>
  167. <li>Предыдущие два пункта дают душевный покой и возможность совершенно спокойно принимать и исполнять самые идиотские решения на работе.</li>
  168. <li>Шишки, набитые в личном проекте, колоссально расширяют кругозор.</li>
  169. </ol>
  170. <p>У личного проекта также есть и недостатки:</p>
  171. <ol>
  172. <li>На твой проект пофиг всем в мире, кроме тебя.</li>
  173. <li>Никто не даст тебе ни гроша.</li>
  174. <li>Нужно умудряться выкраивать время на личный проект каждый день.</li>
  175. <li>Жена не скажет тебе "спасибо", даже если сама потом будет использовать приложение.</li>
  176. </ol>
  177. <p>Легко заметить, что все недостатки личного проекта перекрываются преимуществами рабочего проекта. А все недостатки рабочего проекта перекрываются преимуществами личного проекта. Инь и янь.</p>
  178. <p><strong>3. Почему проект на Git+JS?</strong></p>
  179. <p>Хранение данных в Git вместо неизвестного сервера/API даёт следующие преимущества:</p>
  180. <ol>
  181. <li>Git является самым распространённым решением для децентрализованного хранения проектов среди разработчиков, т.е. практически каждый разработчик умеет работать с Git.</li>
  182. <li>Для работы с Git не нужен очередной API: вы просто работаете с файлами.</li>
  183. <li>Есть много сервисов, предоставляющих хранилище Git бесплатно, если вы не помешаны на безопасности или не хотите платить денег за сервис.</li>
  184. <li>Владелец сервиса Git, конечно, может через несколько лет <a href="https://habr.com/ru/post/413215/">быть выкуплен крупной корпорацией</a>, однако, вы легко сможете перенести свои данные Git.</li>
  185. <li>Для максимальной безопасности данных вы всегда можете поднять свой Git.</li>
  186. </ol>
  187. <p>Использование JS с HTML/CSS вместо Swift/Kotlin/C#/Python даёт следующие преимущества:</p>
  188. <ol>
  189. <li>Ваше приложение будет работать и на телефоне, и на планшете, и на ПК.</li>
  190. <li>Вам не нужно проходить никаких проверок вроде AppStore, для того чтобы попасть в каждое устройство.</li>
  191. <li>Ввиду того, что стандарты HTML/CSS/JS согласуются огромным количеством компаний, ни одна из компаний не может <a href="https://habr.com/ru/post/413335/">в одностороннем порядке прекратить поддерживать какую-либо технологию</a> или <a href="https://arm1.ru/blog/pro-perehod-na-swift-3-i-swift-2-4">в очередной раз поменять API</a>, так что обратная совместимость может достигать <a href="on-the-way-to-durable-applications.html">20 лет</a> и больше.</li>
  192. <li>Ввиду отсутствия сервера вся логика размещается в JS, исполняемый на клиенте, что даёт возможность сохранить ту версию приложения, которая устраивает лично вас, и забыть про обновления, зачастую <a href="https://pikabu.ru/story/android_skoree_vsego_stanet_platnyim_6052457?cid=118211967">приводящие лишь к увеличению тормозов</a>.</li>
  193. </ol>
  194. <p>ГитБюджет является лишь первым испытанием возможностей Git+JS. Посмотрим, что удастся сделать ещё.</p>
  195. </div>
  196. </div>
  197. <div id="footer">
  198. Сайт сгенерирован <a href="http://opengamestudio.org/pskov/ru">ПСКОВОМ</a>
  199. из <a href="http://github.com/ogstudio/site-opengamestudio">этого исходного кода</a>.
  200. Сайт размещён на <a href="https://pages.github.com">GitHub Pages</a>.
  201. </div>
  202. </center>
  203. </body>
  204. </html>