From f0f22f51eb66ea48ae4671cb60ac1c52be90d59a Mon Sep 17 00:00:00 2001 From: Michael Kapelko Date: Mon, 4 May 2020 18:05:38 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=B8=D0=B7=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BC=D0=BE=D0=B1=D0=B8=D0=BB=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- en/game/index.html | 4 ---- en/game/index.template | 4 ---- en/game/item.template | 4 ---- en/game/mahjong.html | 4 ---- en/game/ogs-mahjong-1.html | 4 ---- en/news/2014-another-year-passed.html | 4 ---- en/news/2015-roadmap.html | 4 ---- en/news/2016-august-recap.html | 4 ---- en/news/2016-november-recap.html | 4 ---- en/news/2016-october-recap.html | 4 ---- en/news/2016-roadmap.html | 4 ---- en/news/2016-september-recap.html | 4 ---- en/news/2016-tech-showcases.html | 4 ---- en/news/2017-happy-new-year.html | 4 ---- en/news/2017-summary.html | 4 ---- en/news/2019-year-of-rethinking.html | 4 ---- en/news/2020-05-03_git-budget.md | 15 ++++++++++----- en/news/back-to-social-networks.html | 4 ---- en/news/back-to-the-static.html | 4 ---- en/news/bye-desura-hello-humblebundle.html | 4 ---- en/news/defending-availability.html | 4 ---- en/news/editor-0.4.0-and-0.5.0-plans.html | 4 ---- en/news/editor-0.4.0-plans.html | 4 ---- en/news/editor-06-roadmap.html | 4 ---- en/news/editor-06.html | 4 ---- en/news/example-driven-development.html | 4 ---- en/news/examples-and-dependencies.html | 4 ---- en/news/git-budget.html | 14 +++++--------- en/news/ideal-gamedev.html | 4 ---- en/news/index.html | 4 ---- en/news/index.template | 4 ---- en/news/index2.html | 4 ---- en/news/index3.html | 4 ---- en/news/index4.html | 4 ---- en/news/index5.html | 4 ---- en/news/index6.html | 4 ---- en/news/index7.html | 4 ---- en/news/ios-tutorial.html | 4 ---- en/news/item.template | 4 ---- en/news/its-all-fine.html | 4 ---- en/news/january-live-session-announcement.html | 4 ---- en/news/january-live-session-decision.html | 4 ---- en/news/lets-go.html | 4 ---- en/news/livesession-editor-07.html | 4 ---- en/news/livesession-materials-editor-07.html | 4 ---- en/news/mahjong-demo2.html | 4 ---- en/news/mahjong-recreation-start.html | 4 ---- en/news/mahjong-techdemo1-gameplay.html | 4 ---- en/news/may-live-session-announcement.html | 4 ---- en/news/may-live-session-decision.html | 4 ---- en/news/mjin-world-birth.html | 4 ---- en/news/ogs-editor-0.10.html | 4 ---- en/news/ogs-editor-0.9.html | 4 ---- .../on-the-way-to-durable-applications.html | 4 ---- en/news/once-mahjong-always-mahjong.html | 4 ---- .../openscenegraph-cross-platform-guide.html | 4 ---- en/news/openscenegraph-examples.html | 4 ---- en/news/osg-sample.html | 4 ---- en/news/rolling-ball-live-session-pt2.html | 4 ---- en/news/rolling-ball.html | 4 ---- en/news/scripting-research.html | 4 ---- ...ber-live-session-announcement-tomorrow.html | 4 ---- .../september-live-session-announcement.html | 4 ---- en/news/soon-game-creation-editor-07.html | 4 ---- en/news/teaching-kids-to-program.html | 4 ---- en/news/teaching-to-program-2019.html | 4 ---- en/news/test-chamber-for-everyone.html | 4 ---- ...os-and-cons-of-restarting-from-scratch.html | 4 ---- en/news/the-year-of-challenges.html | 4 ---- en/news/the-year-of-lessons.html | 4 ---- en/news/user-servey-finish-promise.html | 4 ---- ...yesterdays-live-session-short-overview.html | 4 ---- en/page/about.html | 4 ---- en/page/item.template | 4 ---- en/tool/index.html | 4 ---- en/tool/index.template | 4 ---- en/tool/item.template | 4 ---- en/tool/lfsa.html | 4 ---- en/tool/pskov.html | 4 ---- en/tool/zipbase64.html | 4 ---- images/2020-05-06_гит-бюджет.jpg | Bin 38815 -> 0 bytes images/2020-05-06_гит-бюджет.png | Bin 0 -> 118743 bytes ...5-06_гит-бюджет_заметки.jpg | Bin 158608 -> 0 bytes ...5-06_гит-бюджет_заметки.png | Bin 0 -> 428382 bytes ...юджет_календарь-день.jpg | Bin 68166 -> 0 bytes ...юджет_календарь-день.png | Bin 0 -> 248114 bytes ...жет_календарь-запись.jpg | Bin 55448 -> 0 bytes ...жет_календарь-запись.png | Bin 0 -> 158980 bytes ru/game/index.html | 4 ---- ru/game/index.template | 4 ---- ru/game/item.template | 4 ---- ru/game/mahjong.html | 4 ---- ru/game/ogs-mahjong-1.html | 4 ---- ru/news/2014-another-year-passed.html | 4 ---- ru/news/2015-roadmap.html | 4 ---- ru/news/2016-august-recap.html | 4 ---- ru/news/2016-november-recap.html | 4 ---- ru/news/2016-october-recap.html | 4 ---- ru/news/2016-roadmap.html | 4 ---- ru/news/2016-september-recap.html | 4 ---- ru/news/2016-tech-showcases.html | 4 ---- ru/news/2017-happy-new-year.html | 4 ---- ru/news/2017-summary.html | 4 ---- ru/news/2019-year-of-rethinking.html | 4 ---- ru/news/2020-05-03_git-budget.md | 16 +++++++++++----- ru/news/back-to-social-networks.html | 4 ---- ru/news/back-to-the-static.html | 4 ---- ru/news/bye-desura-hello-humblebundle.html | 4 ---- ru/news/defending-availability.html | 4 ---- ru/news/editor-0.4.0-and-0.5.0-plans.html | 4 ---- ru/news/editor-0.4.0-plans.html | 4 ---- ru/news/editor-06-roadmap.html | 4 ---- ru/news/editor-06.html | 4 ---- ru/news/example-driven-development.html | 4 ---- ru/news/examples-and-dependencies.html | 4 ---- ru/news/git-budget.html | 14 +++++--------- ru/news/ideal-gamedev.html | 4 ---- ru/news/index.html | 4 ---- ru/news/index.template | 4 ---- ru/news/index2.html | 4 ---- ru/news/index3.html | 4 ---- ru/news/index4.html | 4 ---- ru/news/index5.html | 4 ---- ru/news/index6.html | 4 ---- ru/news/index7.html | 4 ---- ru/news/ios-tutorial.html | 4 ---- ru/news/item.template | 4 ---- ru/news/its-all-fine.html | 4 ---- ru/news/january-live-session-announcement.html | 4 ---- ru/news/january-live-session-decision.html | 4 ---- ru/news/lets-go.html | 4 ---- ru/news/livesession-editor-07.html | 4 ---- ru/news/livesession-materials-editor-07.html | 4 ---- ru/news/mahjong-demo2.html | 4 ---- ru/news/mahjong-recreation-start.html | 4 ---- ru/news/mahjong-techdemo1-gameplay.html | 4 ---- ru/news/may-live-session-announcement.html | 4 ---- ru/news/may-live-session-decision.html | 4 ---- ru/news/mjin-world-birth.html | 4 ---- ru/news/ogs-editor-0.10.html | 4 ---- ru/news/ogs-editor-0.9.html | 4 ---- .../on-the-way-to-durable-applications.html | 4 ---- ru/news/once-mahjong-always-mahjong.html | 4 ---- .../openscenegraph-cross-platform-guide.html | 4 ---- ru/news/openscenegraph-examples.html | 4 ---- ru/news/osg-sample.html | 4 ---- ru/news/rolling-ball-live-session-pt2.html | 4 ---- ru/news/rolling-ball.html | 4 ---- ru/news/scripting-research.html | 4 ---- ...ber-live-session-announcement-tomorrow.html | 4 ---- .../september-live-session-announcement.html | 4 ---- ru/news/soon-game-creation-editor-07.html | 4 ---- ru/news/teaching-kids-to-program.html | 4 ---- ru/news/teaching-to-program-2019.html | 4 ---- ru/news/test-chamber-for-everyone.html | 4 ---- ...os-and-cons-of-restarting-from-scratch.html | 4 ---- ru/news/the-year-of-challenges.html | 4 ---- ru/news/the-year-of-lessons.html | 4 ---- ru/news/user-servey-finish-promise.html | 4 ---- ...yesterdays-live-session-short-overview.html | 4 ---- ru/page/about.html | 4 ---- ru/page/item.template | 4 ---- ru/tool/index.html | 4 ---- ru/tool/index.template | 4 ---- ru/tool/item.template | 4 ---- ru/tool/lfsa.html | 4 ---- ru/tool/pskov.html | 4 ---- ru/tool/zipbase64.html | 4 ---- 168 files changed, 31 insertions(+), 652 deletions(-) delete mode 100644 images/2020-05-06_гит-бюджет.jpg create mode 100644 images/2020-05-06_гит-бюджет.png delete mode 100644 images/2020-05-06_гит-бюджет_заметки.jpg create mode 100644 images/2020-05-06_гит-бюджет_заметки.png delete mode 100644 images/2020-05-06_гит-бюджет_календарь-день.jpg create mode 100644 images/2020-05-06_гит-бюджет_календарь-день.png delete mode 100644 images/2020-05-06_гит-бюджет_календарь-запись.jpg create mode 100644 images/2020-05-06_гит-бюджет_календарь-запись.png diff --git a/en/game/index.html b/en/game/index.html index 61ff54d..6b53009 100644 --- a/en/game/index.html +++ b/en/game/index.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/game/index.template b/en/game/index.template index c6b48ea..1fde085 100644 --- a/en/game/index.template +++ b/en/game/index.template @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/game/item.template b/en/game/item.template index 77c50e7..b46beaf 100644 --- a/en/game/item.template +++ b/en/game/item.template @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/game/mahjong.html b/en/game/mahjong.html index 8c82d24..4d0718d 100644 --- a/en/game/mahjong.html +++ b/en/game/mahjong.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/game/ogs-mahjong-1.html b/en/game/ogs-mahjong-1.html index ef55fee..88d96d2 100644 --- a/en/game/ogs-mahjong-1.html +++ b/en/game/ogs-mahjong-1.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/news/2014-another-year-passed.html b/en/news/2014-another-year-passed.html index 86ba068..04646d2 100644 --- a/en/news/2014-another-year-passed.html +++ b/en/news/2014-another-year-passed.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/news/2015-roadmap.html b/en/news/2015-roadmap.html index 9c2e04b..fd27d19 100644 --- a/en/news/2015-roadmap.html +++ b/en/news/2015-roadmap.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/news/2016-august-recap.html b/en/news/2016-august-recap.html index 1ca53a5..478d8f9 100644 --- a/en/news/2016-august-recap.html +++ b/en/news/2016-august-recap.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/news/2016-november-recap.html b/en/news/2016-november-recap.html index d589a58..f24029e 100644 --- a/en/news/2016-november-recap.html +++ b/en/news/2016-november-recap.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/news/2016-october-recap.html b/en/news/2016-october-recap.html index 93f659d..3aff905 100644 --- a/en/news/2016-october-recap.html +++ b/en/news/2016-october-recap.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/news/2016-roadmap.html b/en/news/2016-roadmap.html index a41c376..af2fc2d 100644 --- a/en/news/2016-roadmap.html +++ b/en/news/2016-roadmap.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/news/2016-september-recap.html b/en/news/2016-september-recap.html index db36ee3..98097c3 100644 --- a/en/news/2016-september-recap.html +++ b/en/news/2016-september-recap.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/news/2016-tech-showcases.html b/en/news/2016-tech-showcases.html index 1402b8e..1075ca6 100644 --- a/en/news/2016-tech-showcases.html +++ b/en/news/2016-tech-showcases.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/news/2017-happy-new-year.html b/en/news/2017-happy-new-year.html index 0f14469..ce7178c 100644 --- a/en/news/2017-happy-new-year.html +++ b/en/news/2017-happy-new-year.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/news/2017-summary.html b/en/news/2017-summary.html index bbf1b52..7e13db5 100644 --- a/en/news/2017-summary.html +++ b/en/news/2017-summary.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/news/2019-year-of-rethinking.html b/en/news/2019-year-of-rethinking.html index d906220..6b24a23 100644 --- a/en/news/2019-year-of-rethinking.html +++ b/en/news/2019-year-of-rethinking.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/news/2020-05-03_git-budget.md b/en/news/2020-05-03_git-budget.md index f56d1e3..3ec19fa 100644 --- a/en/news/2020-05-03_git-budget.md +++ b/en/news/2020-05-03_git-budget.md @@ -16,7 +16,7 @@ Hi, folks, let me share my experience of creating an application to keep track o **1. Why keep track of spendings in an application?** -I, like many people out there, wanted to become rich and [successful][успех]. To become rich, one is often advised to run a personal budget, that's what I started to do several years ago. I'd like to point out that running my personal budget hasn't made me rich and successful, and I increased income simply by moving to the capital of my home country. +I, like many people out there, wanted to become rich and [successful][успех]. To become rich, one is often advised to run a personal budget, that's what I started to do several years ago. I'd like to point out that running my personal budget hasn't made me rich and successful, and I increased income simply by moving to Moscow. I think I started to run the budget somewhere around 2012. By that time I already had a professional programmer deformation, which can be described as "made by someone else = bad" formula and is usually manifested by a strong desire to rewrite everything from scratch. However, I had no experience with budgeting back then, so I decided to try a "professional" solution and purchased [YNAB][ynab] (You Need A Budget) to use the application on both PC and mobile. @@ -39,13 +39,13 @@ This was a very disappointing situation for me, so I stopped tracking my spendin This time I decided not to repeat my mistake of giving all my data to someone with the risk of losing it, so I started to track my spendings with simple phone notes. The format was simple and looked like this: -Notes +![Notes][снимок-заметки] I used the notes solely on the phone until mid-2018. Then, a new need arose: I wanted to be able to **work on my spendings from a PC** to analyze them. I took the time to see through the solutions that would allow me to work with my spendings on both PC and mobile **free of charge**. A calendar turned out to be such a solution: -Calendar +![Calendar][снимок-календарь-день] -New record +![New record][снимок-календарь-запись] I used a Google account to access [Apps Script][apps-script] (a clone of JavaScript) to analyze the spendings. Working with spendings in Apps Script turned out to be quite daunting because calendar records are not designed to host spendings. Data ownership question was still unresolved: my data was still dusting on an unknown server I don't control, and I could only access my data through an API, **which might change in the future by someone else's decision**. @@ -60,7 +60,7 @@ Autumn 2019 I discovered [Isomorphic-Git][isomorphic-git], which allows JavaScri That's how the spendings look like on my phone now: -GitBudget +![GitBudget][снимок-гит-бюджет] Git data looks like this: [https://gitlab.com/kornerr/git-budget-sample-data/-/blob/me/gb.log](https://gitlab.com/kornerr/git-budget-sample-data/-/blob/me/gb.log) @@ -115,6 +115,11 @@ GitBudget is the first attempt to see what Git+JS can do. I can only imagine the [снимок]: ../../images/2020-05-06_гит-бюджет_снимок.png +[снимок-заметки]: ../../images/2020-05-06_гит-бюджет_заметки.png +[снимок-календарь-день]: ../../images/2020-05-06_гит-бюджет_календарь-день.png +[снимок-календарь-запись]: ../../images/2020-05-06_гит-бюджет_календарь-запись.png +[снимок-гит-бюджет]: ../../images/2020-05-06_гит-бюджет.png + [успех]: https://youtu.be/7RchntYFtSE [ynab]: https://www.youneedabudget.com [apps-script]: https://developers.google.com/apps-script diff --git a/en/news/back-to-social-networks.html b/en/news/back-to-social-networks.html index 69001d0..6290377 100644 --- a/en/news/back-to-social-networks.html +++ b/en/news/back-to-social-networks.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/news/back-to-the-static.html b/en/news/back-to-the-static.html index f7e1831..5157cd4 100644 --- a/en/news/back-to-the-static.html +++ b/en/news/back-to-the-static.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/news/bye-desura-hello-humblebundle.html b/en/news/bye-desura-hello-humblebundle.html index e2d3adb..b5225e1 100644 --- a/en/news/bye-desura-hello-humblebundle.html +++ b/en/news/bye-desura-hello-humblebundle.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/news/defending-availability.html b/en/news/defending-availability.html index 2a3bda5..cd435db 100644 --- a/en/news/defending-availability.html +++ b/en/news/defending-availability.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/news/editor-0.4.0-and-0.5.0-plans.html b/en/news/editor-0.4.0-and-0.5.0-plans.html index cff998b..137e767 100644 --- a/en/news/editor-0.4.0-and-0.5.0-plans.html +++ b/en/news/editor-0.4.0-and-0.5.0-plans.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/news/editor-0.4.0-plans.html b/en/news/editor-0.4.0-plans.html index 3c970b9..920428a 100644 --- a/en/news/editor-0.4.0-plans.html +++ b/en/news/editor-0.4.0-plans.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/news/editor-06-roadmap.html b/en/news/editor-06-roadmap.html index ca5eb42..1651e83 100644 --- a/en/news/editor-06-roadmap.html +++ b/en/news/editor-06-roadmap.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/news/editor-06.html b/en/news/editor-06.html index 6adcd0e..3b3731c 100644 --- a/en/news/editor-06.html +++ b/en/news/editor-06.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/news/example-driven-development.html b/en/news/example-driven-development.html index 6daea35..28cec4b 100644 --- a/en/news/example-driven-development.html +++ b/en/news/example-driven-development.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/news/examples-and-dependencies.html b/en/news/examples-and-dependencies.html index 3e50f8a..2c2ebc0 100644 --- a/en/news/examples-and-dependencies.html +++ b/en/news/examples-and-dependencies.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/en/news/git-budget.html b/en/news/git-budget.html index 9392218..8318c8a 100644 --- a/en/news/git-budget.html +++ b/en/news/git-budget.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; @@ -113,7 +109,7 @@
  • Why does the project use Git+JS?
  • 1. Why keep track of spendings in an application?

    -

    I, like many people out there, wanted to become rich and successful. To become rich, one is often advised to run a personal budget, that's what I started to do several years ago. I'd like to point out that running my personal budget hasn't made me rich and successful, and I increased income simply by moving to the capital of my home country.

    +

    I, like many people out there, wanted to become rich and successful. To become rich, one is often advised to run a personal budget, that's what I started to do several years ago. I'd like to point out that running my personal budget hasn't made me rich and successful, and I increased income simply by moving to Moscow.

    I think I started to run the budget somewhere around 2012. By that time I already had a professional programmer deformation, which can be described as "made by someone else = bad" formula and is usually manifested by a strong desire to rewrite everything from scratch. However, I had no experience with budgeting back then, so I decided to try a "professional" solution and purchased YNAB (You Need A Budget) to use the application on both PC and mobile.

    I tried to do my best to set out budget plans and fulfill them in the course of three years. However, somewhere around 2015 the authors released a new application version and demanded money for the upgrade, the old version was no longer functioning. I had to choose one of the options:

      @@ -131,10 +127,10 @@

      so I stopped the ripoff and lost my history of spendings.

      This was a very disappointing situation for me, so I stopped tracking my spendings for about a year. However, I was once experiencing a "painful synchronization" (also known as "figuring things out" with a wife). I failed to defend myself against a financial vocal attack like "you're a waster, you always waste money on junk". Then I realized I really need to keep track of my spendings.

      This time I decided not to repeat my mistake of giving all my data to someone with the risk of losing it, so I started to track my spendings with simple phone notes. The format was simple and looked like this:

      -

      Notes

      +

      Notes

      I used the notes solely on the phone until mid-2018. Then, a new need arose: I wanted to be able to work on my spendings from a PC to analyze them. I took the time to see through the solutions that would allow me to work with my spendings on both PC and mobile free of charge. A calendar turned out to be such a solution:

      -

      Calendar

      -

      New record

      +

      Calendar

      +

      New record

      I used a Google account to access Apps Script (a clone of JavaScript) to analyze the spendings. Working with spendings in Apps Script turned out to be quite daunting because calendar records are not designed to host spendings. Data ownership question was still unresolved: my data was still dusting on an unknown server I don't control, and I could only access my data through an API, which might change in the future by someone else's decision.

      While I was using a calendar, I've had the following ideas frequently visiting me:

        @@ -144,7 +140,7 @@

        Autumn 2019 I discovered Isomorphic-Git, which allows JavaScript to work with Git, quickly verified the ability to work with Git, and realized I found my Holy Grail. Recently I've finished creating the first version of GitBudget application, you can see its functionality here:

        That's how the spendings look like on my phone now:

        -

        GitBudget

        +

        GitBudget

        Git data looks like this: https://gitlab.com/kornerr/git-budget-sample-data/-/blob/me/gb.log

        Let me highlight a few important issues:

      1. Зачем мне приложение учёта трат?

      -

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

      +

      Как и многие другие люди я давно хотел стать богатым и практиковать успешный успех. Одной из рекомендаций в таких случаях часто выступает предложение вести собственный бюджет, чем я и занялся несколько лет назад. Скажу сразу, что ведение бюджета не сделало меня богатым и успешным, а своё материальное положение я улучшил обычным переездом в Москву.

      Вести бюджет я начал, если не изменяет память, где-то в 2012-м году. В то время у меня уже была профессиональная деформация программиста, выражающаяся формулой "сделано не мной" и попыткой написать всё самому. Тем не менее, по неопытности я решил начать с "проверенных" решений и приобрёл YNAB (You Need A Budget), т.к. приложение позволяло работать и с ПК, и с телефона.

      Я честно пытался задавать план трат на месяц и укладываться в него года три. Однако, где-то в 2015-м году авторы выпустили новую версию приложения, за которую опять хотели денег, старую же версию эти недальновидные капиталисты выкинули на обочину истории. В итоге мне пришлось выбирать из двух вариантов:

        @@ -138,10 +134,10 @@

        и выбрал второй вариант: послал их нафиг и потерял историю трат.

        Эта ситуация меня довольно сильно разочаровала, поэтому я забросил ведение бюджета где-то на год. Однако, в один из дней "болезненной синхронизации" (также известной как "выяснение отношений") я не смог отбить финансовый наброс вида "ты транжира, вечно тратишь деньги на ерунду", после чего ясно осознал важность учёта трат.

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

        -

        Заметки

        +

        Заметки

        Заметки продержались у меня до середины 2018-го, пока я всё-таки не захотел иметь возможность работать с тратами на ПК, чтобы анализировать их. Я решил поискать решение, которое позволит мне бесплатно работать с историей трат и на ПК, и на телефоне. Таким решением оказался обычный календарь:

        -

        Календарь

        -

        Новая запись

        +

        Календарь

        +

        Новая запись

        В календаре я использовал учётку Google, чтобы иметь доступ к Apps Script (фактически JavaScript) для анализа записей. Делать скрипты оказалось не очень удобно, т.к. формат хранения календарных записей мало подходит для трат. Вопрос владения данными также оставался нерешённым: мои данные опять пылились на неизвестном и неподконтрольном мне сервере, а доступ к ним был лишь через неподконтрольный мне и изменяющийся по чужой прихоти API.

        Во время использования календаря меня периодически посещали две мысли:

          @@ -151,7 +147,7 @@

          Осенью 2019-го я наткнулся на проект Isomorphic-Git, позволяющий работать с Git из JavaScript, бегло проверил его работоспособность и понял, что нашёл свой Святой Грааль. Недавно я завершил создание первой версии приложения ГитБюджет, функциональность которого можно увидеть в следующем видео:

          В итоге, сейчас учёт трат на телефоне у меня выглядит следующим образом:

          -

          ГитБюджет

          +

          ГитБюджет

          Данные в Git выглядят cледующим образом: https://gitlab.com/kornerr/git-budget-sample-data/-/blob/me/gb.log

          Отмечу некоторые важные моменты:

            diff --git a/ru/news/ideal-gamedev.html b/ru/news/ideal-gamedev.html index 3531b61..bb38313 100644 --- a/ru/news/ideal-gamedev.html +++ b/ru/news/ideal-gamedev.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/index.html b/ru/news/index.html index 9019e34..a86cd23 100644 --- a/ru/news/index.html +++ b/ru/news/index.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/index.template b/ru/news/index.template index 86e8e18..58626ff 100644 --- a/ru/news/index.template +++ b/ru/news/index.template @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/index2.html b/ru/news/index2.html index a00c91b..f096287 100644 --- a/ru/news/index2.html +++ b/ru/news/index2.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/index3.html b/ru/news/index3.html index 2ccc4da..dda1f6e 100644 --- a/ru/news/index3.html +++ b/ru/news/index3.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/index4.html b/ru/news/index4.html index 2da5ca7..3022ed5 100644 --- a/ru/news/index4.html +++ b/ru/news/index4.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/index5.html b/ru/news/index5.html index 37a8b7c..a9463ae 100644 --- a/ru/news/index5.html +++ b/ru/news/index5.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/index6.html b/ru/news/index6.html index 5da2907..7b2b5cc 100644 --- a/ru/news/index6.html +++ b/ru/news/index6.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/index7.html b/ru/news/index7.html index e99849a..b36b254 100644 --- a/ru/news/index7.html +++ b/ru/news/index7.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/ios-tutorial.html b/ru/news/ios-tutorial.html index 58cbe89..78a88b6 100644 --- a/ru/news/ios-tutorial.html +++ b/ru/news/ios-tutorial.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/item.template b/ru/news/item.template index 988ed0b..53423c8 100644 --- a/ru/news/item.template +++ b/ru/news/item.template @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/its-all-fine.html b/ru/news/its-all-fine.html index 82af5a1..80b2d63 100644 --- a/ru/news/its-all-fine.html +++ b/ru/news/its-all-fine.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/january-live-session-announcement.html b/ru/news/january-live-session-announcement.html index 40f4a0c..73581d6 100644 --- a/ru/news/january-live-session-announcement.html +++ b/ru/news/january-live-session-announcement.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/january-live-session-decision.html b/ru/news/january-live-session-decision.html index 70a5921..e0343a1 100644 --- a/ru/news/january-live-session-decision.html +++ b/ru/news/january-live-session-decision.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/lets-go.html b/ru/news/lets-go.html index 62cd6a3..6b4a893 100644 --- a/ru/news/lets-go.html +++ b/ru/news/lets-go.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/livesession-editor-07.html b/ru/news/livesession-editor-07.html index 2b07aa8..4e371f7 100644 --- a/ru/news/livesession-editor-07.html +++ b/ru/news/livesession-editor-07.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/livesession-materials-editor-07.html b/ru/news/livesession-materials-editor-07.html index f8fc82d..2893931 100644 --- a/ru/news/livesession-materials-editor-07.html +++ b/ru/news/livesession-materials-editor-07.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/mahjong-demo2.html b/ru/news/mahjong-demo2.html index 636542b..d2ffbe7 100644 --- a/ru/news/mahjong-demo2.html +++ b/ru/news/mahjong-demo2.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/mahjong-recreation-start.html b/ru/news/mahjong-recreation-start.html index a95e06f..976e785 100644 --- a/ru/news/mahjong-recreation-start.html +++ b/ru/news/mahjong-recreation-start.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/mahjong-techdemo1-gameplay.html b/ru/news/mahjong-techdemo1-gameplay.html index 3635ebe..e604d5c 100644 --- a/ru/news/mahjong-techdemo1-gameplay.html +++ b/ru/news/mahjong-techdemo1-gameplay.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/may-live-session-announcement.html b/ru/news/may-live-session-announcement.html index 52c12b4..a6637bd 100644 --- a/ru/news/may-live-session-announcement.html +++ b/ru/news/may-live-session-announcement.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/may-live-session-decision.html b/ru/news/may-live-session-decision.html index bea8eb0..ebfaf7b 100644 --- a/ru/news/may-live-session-decision.html +++ b/ru/news/may-live-session-decision.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/mjin-world-birth.html b/ru/news/mjin-world-birth.html index 0e3f52d..7206dc7 100644 --- a/ru/news/mjin-world-birth.html +++ b/ru/news/mjin-world-birth.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/ogs-editor-0.10.html b/ru/news/ogs-editor-0.10.html index 0531d74..456c066 100644 --- a/ru/news/ogs-editor-0.10.html +++ b/ru/news/ogs-editor-0.10.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/ogs-editor-0.9.html b/ru/news/ogs-editor-0.9.html index 002c502..a4b5e39 100644 --- a/ru/news/ogs-editor-0.9.html +++ b/ru/news/ogs-editor-0.9.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/on-the-way-to-durable-applications.html b/ru/news/on-the-way-to-durable-applications.html index d2da110..dcf3218 100644 --- a/ru/news/on-the-way-to-durable-applications.html +++ b/ru/news/on-the-way-to-durable-applications.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/once-mahjong-always-mahjong.html b/ru/news/once-mahjong-always-mahjong.html index ddac8f8..634ff12 100644 --- a/ru/news/once-mahjong-always-mahjong.html +++ b/ru/news/once-mahjong-always-mahjong.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/openscenegraph-cross-platform-guide.html b/ru/news/openscenegraph-cross-platform-guide.html index 7952d89..16c16ef 100644 --- a/ru/news/openscenegraph-cross-platform-guide.html +++ b/ru/news/openscenegraph-cross-platform-guide.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/openscenegraph-examples.html b/ru/news/openscenegraph-examples.html index c77b220..911918a 100644 --- a/ru/news/openscenegraph-examples.html +++ b/ru/news/openscenegraph-examples.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/osg-sample.html b/ru/news/osg-sample.html index e7c6e17..88544af 100644 --- a/ru/news/osg-sample.html +++ b/ru/news/osg-sample.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/rolling-ball-live-session-pt2.html b/ru/news/rolling-ball-live-session-pt2.html index dc514ad..aeb22ae 100644 --- a/ru/news/rolling-ball-live-session-pt2.html +++ b/ru/news/rolling-ball-live-session-pt2.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/rolling-ball.html b/ru/news/rolling-ball.html index ddc5abc..f9d5b47 100644 --- a/ru/news/rolling-ball.html +++ b/ru/news/rolling-ball.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/scripting-research.html b/ru/news/scripting-research.html index 999bcae..8a6d2a4 100644 --- a/ru/news/scripting-research.html +++ b/ru/news/scripting-research.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/september-live-session-announcement-tomorrow.html b/ru/news/september-live-session-announcement-tomorrow.html index 59d4bc2..0117d31 100644 --- a/ru/news/september-live-session-announcement-tomorrow.html +++ b/ru/news/september-live-session-announcement-tomorrow.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/september-live-session-announcement.html b/ru/news/september-live-session-announcement.html index 4a62a10..9f576c8 100644 --- a/ru/news/september-live-session-announcement.html +++ b/ru/news/september-live-session-announcement.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/soon-game-creation-editor-07.html b/ru/news/soon-game-creation-editor-07.html index b0ebdc3..a9f5af4 100644 --- a/ru/news/soon-game-creation-editor-07.html +++ b/ru/news/soon-game-creation-editor-07.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/teaching-kids-to-program.html b/ru/news/teaching-kids-to-program.html index 488bd1c..d398ec5 100644 --- a/ru/news/teaching-kids-to-program.html +++ b/ru/news/teaching-kids-to-program.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/teaching-to-program-2019.html b/ru/news/teaching-to-program-2019.html index 501bc43..f333b14 100644 --- a/ru/news/teaching-to-program-2019.html +++ b/ru/news/teaching-to-program-2019.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/test-chamber-for-everyone.html b/ru/news/test-chamber-for-everyone.html index 6223cbd..c8efa09 100644 --- a/ru/news/test-chamber-for-everyone.html +++ b/ru/news/test-chamber-for-everyone.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/the-pros-and-cons-of-restarting-from-scratch.html b/ru/news/the-pros-and-cons-of-restarting-from-scratch.html index f50b8d6..f3ef7dd 100644 --- a/ru/news/the-pros-and-cons-of-restarting-from-scratch.html +++ b/ru/news/the-pros-and-cons-of-restarting-from-scratch.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/the-year-of-challenges.html b/ru/news/the-year-of-challenges.html index 55e93f9..21f20ef 100644 --- a/ru/news/the-year-of-challenges.html +++ b/ru/news/the-year-of-challenges.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/the-year-of-lessons.html b/ru/news/the-year-of-lessons.html index 0d542d0..c72509b 100644 --- a/ru/news/the-year-of-lessons.html +++ b/ru/news/the-year-of-lessons.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/user-servey-finish-promise.html b/ru/news/user-servey-finish-promise.html index ab732e1..0679a23 100644 --- a/ru/news/user-servey-finish-promise.html +++ b/ru/news/user-servey-finish-promise.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/news/yesterdays-live-session-short-overview.html b/ru/news/yesterdays-live-session-short-overview.html index 6607f23..00478f1 100644 --- a/ru/news/yesterdays-live-session-short-overview.html +++ b/ru/news/yesterdays-live-session-short-overview.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/page/about.html b/ru/page/about.html index f28b008..3cb3ffa 100644 --- a/ru/page/about.html +++ b/ru/page/about.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/page/item.template b/ru/page/item.template index 80ea416..2e559ec 100644 --- a/ru/page/item.template +++ b/ru/page/item.template @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/tool/index.html b/ru/tool/index.html index 0e68537..02a10b5 100644 --- a/ru/tool/index.html +++ b/ru/tool/index.html @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/tool/index.template b/ru/tool/index.template index 4727624..49e7206 100644 --- a/ru/tool/index.template +++ b/ru/tool/index.template @@ -60,10 +60,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/tool/item.template b/ru/tool/item.template index d2b701e..16c7393 100644 --- a/ru/tool/item.template +++ b/ru/tool/item.template @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/tool/lfsa.html b/ru/tool/lfsa.html index b375ac5..3ddd26d 100644 --- a/ru/tool/lfsa.html +++ b/ru/tool/lfsa.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/tool/pskov.html b/ru/tool/pskov.html index 65c7295..99af745 100644 --- a/ru/tool/pskov.html +++ b/ru/tool/pskov.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB; diff --git a/ru/tool/zipbase64.html b/ru/tool/zipbase64.html index 0ca84d9..442d280 100644 --- a/ru/tool/zipbase64.html +++ b/ru/tool/zipbase64.html @@ -67,10 +67,6 @@ { width: 720px; } - .mobile - { - width: 320px; - } a { color: #3A91CB;