diff --git a/en/game/index.html b/en/game/index.html index c79ce13..61ff54d 100644 --- a/en/game/index.html +++ b/en/game/index.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/game/index.template b/en/game/index.template index 87cd551..c6b48ea 100644 --- a/en/game/index.template +++ b/en/game/index.template @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/game/item.template b/en/game/item.template index 45934d5..77c50e7 100644 --- a/en/game/item.template +++ b/en/game/item.template @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/game/mahjong.html b/en/game/mahjong.html index a3bcc7e..8c82d24 100644 --- a/en/game/mahjong.html +++ b/en/game/mahjong.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/game/ogs-mahjong-1.html b/en/game/ogs-mahjong-1.html index 2f9f180..ef55fee 100644 --- a/en/game/ogs-mahjong-1.html +++ b/en/game/ogs-mahjong-1.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/2014-another-year-passed.html b/en/news/2014-another-year-passed.html index e4df340..86ba068 100644 --- a/en/news/2014-another-year-passed.html +++ b/en/news/2014-another-year-passed.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/2015-roadmap.html b/en/news/2015-roadmap.html index f9e92bc..9c2e04b 100644 --- a/en/news/2015-roadmap.html +++ b/en/news/2015-roadmap.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/2016-august-recap.html b/en/news/2016-august-recap.html index 4cdc6a1..1ca53a5 100644 --- a/en/news/2016-august-recap.html +++ b/en/news/2016-august-recap.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/2016-november-recap.html b/en/news/2016-november-recap.html index 48104b4..d589a58 100644 --- a/en/news/2016-november-recap.html +++ b/en/news/2016-november-recap.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/2016-october-recap.html b/en/news/2016-october-recap.html index 549d301..93f659d 100644 --- a/en/news/2016-october-recap.html +++ b/en/news/2016-october-recap.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/2016-roadmap.html b/en/news/2016-roadmap.html index a3d6222..a41c376 100644 --- a/en/news/2016-roadmap.html +++ b/en/news/2016-roadmap.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/2016-september-recap.html b/en/news/2016-september-recap.html index b6c0187..db36ee3 100644 --- a/en/news/2016-september-recap.html +++ b/en/news/2016-september-recap.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/2016-tech-showcases.html b/en/news/2016-tech-showcases.html index e1d68c2..1402b8e 100644 --- a/en/news/2016-tech-showcases.html +++ b/en/news/2016-tech-showcases.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/2017-happy-new-year.html b/en/news/2017-happy-new-year.html index 79eb581..0f14469 100644 --- a/en/news/2017-happy-new-year.html +++ b/en/news/2017-happy-new-year.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/2017-summary.html b/en/news/2017-summary.html index c0f595b..bbf1b52 100644 --- a/en/news/2017-summary.html +++ b/en/news/2017-summary.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/2019-year-of-rethinking.html b/en/news/2019-year-of-rethinking.html index 72e1175..d906220 100644 --- a/en/news/2019-year-of-rethinking.html +++ b/en/news/2019-year-of-rethinking.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/2020-05-03_git-budget.md b/en/news/2020-05-03_git-budget.md new file mode 100644 index 0000000..f56d1e3 --- /dev/null +++ b/en/news/2020-05-03_git-budget.md @@ -0,0 +1,126 @@ +Title: Why I keep track of spendings in a personal app made with Git+JS +Date: 2020-05-03 00:00 +Category: News +Slug: git-budget +Lang: en + +![GitBudget][снимок] + +In this article Michael shares his experience of using Git+JS. + +Hi, folks, let me share my experience of creating an application to keep track of my spendings. Specifically, let me do it by answering the following questions: + +1. Why keep track of spendings in an application? +1. Why did I create the application as a personal project? +1. 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 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. + +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: + +1. Pay for the upgraded version and use a completely new "shiny" user interface. +1. Stop their ripoff, keep my money and lose the history of spendings. + +I concluded that: + +1. I already paid for the application; +1. the old version was suitable for me; +1. I did not ask for an upgrade; +1. if I would know I have to pay for each upgrade, I would have never purchased their application in the first place; +1. I didn't want to sponsor this boorishness; + +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 + +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 + +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**. + +While I was using a calendar, I've had the following ideas frequently visiting me: + +1. it would be nice to keep all my data in Git to be able to easily analyze the spendings; +1. it would be nice to have a convenient user interface without all the noise that prevents me from quickly adding a record. + +Autumn 2019 I discovered [Isomorphic-Git][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 + +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) + +Let me highlight a few important issues: + +* Git repository above reflects actions performed in the video above; +* I keep my spendings in a private repository, you should do the same; +* the application runs completely on the device and has no back-end: GitHub Pages hosting is used; +* the application talks to the outside world only during synchronization with Git; +* password is kept by a browser, the application only uses it for synchronization with Git; +* the application should be loaded over HTTP because the currently used Isomorphic-Git version (0.70.0) makes some requests (metadata) to Git over HTTP, and browsers prohibit HTTP requests from HTTPS nowadays. + +**2. Why did I create the application as a personal project?** + +I spent 40 hours of my life during the first quarter of 2020, i.e., on average, I worked for about half an hour each day. + +Personal projects have the following benefits over those done at work: + +1. You can do whatever you want and learn from your mistakes. +1. Nobody's breathing down your neck and restricting your fantasy. +1. The above two points keep you calm and give you the strength to perform any stupid activity that might be required at work. +1. Mistakes you own drastically widen your horizons. + +Personal projects have drawbacks, too: + +1. Nobody in the world cares about your project but you. +1. Nobody would pay you for your project. +1. You have to find time to do the project every day. +1. Your wife won't thank you for the project, even if she would use it herself. + +It's easy to note that all drawbacks of the personal project are balanced with the benefits of the work project. And all drawbacks of the work project are balanced with the benefits of the personal project. Yin and Yang. + +**3. Why does the project use Git+JS?** + +Keeping data in Git instead of an unknown back-end/API has the following benefits: + +1. Git is the most widespread solution for decentralized source version control among developers, i.e., almost every developer has experience with Git. +1. You don't need a new API to work with Git: you just work with files. +1. There are numerous services offering Git free of charge if you're not too crazy about security and don't want to pay for the service. +1. Of course, a Git service provider might be [acquired by a large corporation][поглощение] one day, however, it's easy to move your Git data wherever you want. +1. For maximum security you can always host your own Git server. + +Usage of JS with HTML/CSS over Swift/Kotlin/C#/Python has the following benefits: + +1. Your application runs everywhere: PC, tablet, mobile phone. +1. You don't need to pass AppStore reviews to get to every device. +1. HTML/CSS/JS standards are international, so [no single company may stop supporting it][opengl] or [change its API][swift]; this may result in backward compatibility of [20 years][долговечные-приложения] or more. +1. Since there's no back-end, all logic resides in JS executed on the client, so you can save the version of the application that best suits you and forget about recurrent updates that [usually only hamper usability][обновления]. + +GitBudget is the first attempt to see what Git+JS can do. I can only imagine the possibilities lying ahead. + + +[снимок]: ../../images/2020-05-06_гит-бюджет_снимок.png + +[успех]: https://youtu.be/7RchntYFtSE +[ynab]: https://www.youneedabudget.com +[apps-script]: https://developers.google.com/apps-script +[isomorphic-git]: https://isomorphic-git.org/ +[поглощение]: https://github.blog/2018-06-04-github-microsoft/ +[opengl]: https://arstechnica.com/features/2018/09/macos-10-14-mojave-the-ars-technica-review/12/ +[swift]: https://medium.com/@DoorDash/tips-and-tricks-for-migrating-from-swift-2-to-swift-3-c67a8520dbac +[долговечные-приложения]: on-the-way-to-durable-applications.html +[обновления]: https://hardforum.com/threads/anyway-to-turn-off-the-damn-automatic-driver-updates-in-windows-10.1948410/ diff --git a/en/news/back-to-social-networks.html b/en/news/back-to-social-networks.html index 6898e9a..69001d0 100644 --- a/en/news/back-to-social-networks.html +++ b/en/news/back-to-social-networks.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/back-to-the-static.html b/en/news/back-to-the-static.html index 3bd8910..f7e1831 100644 --- a/en/news/back-to-the-static.html +++ b/en/news/back-to-the-static.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/bye-desura-hello-humblebundle.html b/en/news/bye-desura-hello-humblebundle.html index 86c277f..e2d3adb 100644 --- a/en/news/bye-desura-hello-humblebundle.html +++ b/en/news/bye-desura-hello-humblebundle.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/defending-availability.html b/en/news/defending-availability.html index a6f22bd..2a3bda5 100644 --- a/en/news/defending-availability.html +++ b/en/news/defending-availability.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table 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 e31b68e..cff998b 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,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/editor-0.4.0-plans.html b/en/news/editor-0.4.0-plans.html index 35501e2..3c970b9 100644 --- a/en/news/editor-0.4.0-plans.html +++ b/en/news/editor-0.4.0-plans.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/editor-06-roadmap.html b/en/news/editor-06-roadmap.html index 789a7b5..ca5eb42 100644 --- a/en/news/editor-06-roadmap.html +++ b/en/news/editor-06-roadmap.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/editor-06.html b/en/news/editor-06.html index 32b3c3a..6adcd0e 100644 --- a/en/news/editor-06.html +++ b/en/news/editor-06.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/example-driven-development.html b/en/news/example-driven-development.html index 95b9434..6daea35 100644 --- a/en/news/example-driven-development.html +++ b/en/news/example-driven-development.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/examples-and-dependencies.html b/en/news/examples-and-dependencies.html index ff7b242..3e50f8a 100644 --- a/en/news/examples-and-dependencies.html +++ b/en/news/examples-and-dependencies.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/git-budget.html b/en/news/git-budget.html new file mode 100644 index 0000000..9392218 --- /dev/null +++ b/en/news/git-budget.html @@ -0,0 +1,201 @@ + + + + + + + + +
+

In the news...

+
+

+ Why I keep track of spendings in a personal app made with Git+JS +

+

+ 2020-05-03 00:00 +

+
+

GitBudget

+

In this article Michael shares his experience of using Git+JS.

+

Hi, folks, let me share my experience of creating an application to keep track of my spendings. Specifically, let me do it by answering the following questions:

+
    +
  1. Why keep track of spendings in an application?
  2. +
  3. Why did I create the application as a personal project?
  4. +
  5. Why does the project use Git+JS?
  6. +
+

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 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:

+
    +
  1. Pay for the upgraded version and use a completely new "shiny" user interface.
  2. +
  3. Stop their ripoff, keep my money and lose the history of spendings.
  4. +
+

I concluded that:

+
    +
  1. I already paid for the application;
  2. +
  3. the old version was suitable for me;
  4. +
  5. I did not ask for an upgrade;
  6. +
  7. if I would know I have to pay for each upgrade, I would have never purchased their application in the first place;
  8. +
  9. I didn't want to sponsor this boorishness;
  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

+

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

+

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:

+
    +
  1. it would be nice to keep all my data in Git to be able to easily analyze the spendings;
  2. +
  3. it would be nice to have a convenient user interface without all the noise that prevents me from quickly adding a record.
  4. +
+

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

+

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

+

Let me highlight a few important issues:

+
    +
  • Git repository above reflects actions performed in the video above;
  • +
  • I keep my spendings in a private repository, you should do the same;
  • +
  • the application runs completely on the device and has no back-end: GitHub Pages hosting is used;
  • +
  • the application talks to the outside world only during synchronization with Git;
  • +
  • password is kept by a browser, the application only uses it for synchronization with Git;
  • +
  • the application should be loaded over HTTP because the currently used Isomorphic-Git version (0.70.0) makes some requests (metadata) to Git over HTTP, and browsers prohibit HTTP requests from HTTPS nowadays.
  • +
+

2. Why did I create the application as a personal project?

+

I spent 40 hours of my life during the first quarter of 2020, i.e., on average, I worked for about half an hour each day.

+

Personal projects have the following benefits over those done at work:

+
    +
  1. You can do whatever you want and learn from your mistakes.
  2. +
  3. Nobody's breathing down your neck and restricting your fantasy.
  4. +
  5. The above two points keep you calm and give you the strength to perform any stupid activity that might be required at work.
  6. +
  7. Mistakes you own drastically widen your horizons.
  8. +
+

Personal projects have drawbacks, too:

+
    +
  1. Nobody in the world cares about your project but you.
  2. +
  3. Nobody would pay you for your project.
  4. +
  5. You have to find time to do the project every day.
  6. +
  7. Your wife won't thank you for the project, even if she would use it herself.
  8. +
+

It's easy to note that all drawbacks of the personal project are balanced with the benefits of the work project. And all drawbacks of the work project are balanced with the benefits of the personal project. Yin and Yang.

+

3. Why does the project use Git+JS?

+

Keeping data in Git instead of an unknown back-end/API has the following benefits:

+
    +
  1. Git is the most widespread solution for decentralized source version control among developers, i.e., almost every developer has experience with Git.
  2. +
  3. You don't need a new API to work with Git: you just work with files.
  4. +
  5. There are numerous services offering Git free of charge if you're not too crazy about security and don't want to pay for the service.
  6. +
  7. Of course, a Git service provider might be acquired by a large corporation one day, however, it's easy to move your Git data wherever you want.
  8. +
  9. For maximum security you can always host your own Git server.
  10. +
+

Usage of JS with HTML/CSS over Swift/Kotlin/C#/Python has the following benefits:

+
    +
  1. Your application runs everywhere: PC, tablet, mobile phone.
  2. +
  3. You don't need to pass AppStore reviews to get to every device.
  4. +
  5. HTML/CSS/JS standards are international, so no single company may stop supporting it or change its API; this may result in backward compatibility of 20 years or more.
  6. +
  7. Since there's no back-end, all logic resides in JS executed on the client, so you can save the version of the application that best suits you and forget about recurrent updates that usually only hamper usability.
  8. +
+

GitBudget is the first attempt to see what Git+JS can do. I can only imagine the possibilities lying ahead.

+
+
+ +
+ + diff --git a/en/news/ideal-gamedev.html b/en/news/ideal-gamedev.html index 8c1d9ed..19547aa 100644 --- a/en/news/ideal-gamedev.html +++ b/en/news/ideal-gamedev.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/index.html b/en/news/index.html index aaee9df..c7e9f52 100644 --- a/en/news/index.html +++ b/en/news/index.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table @@ -94,6 +97,22 @@

News

+
+

+ Why I keep track of spendings in a personal app made with Git+JS +

+

+ 2020-05-03 00:00 +

+
+

GitBudget

+

In this article Michael shares his experience of using Git+JS.

+

Hi, folks, let me share my experience of creating an application to keep track of my spendings. Specifically, let me do it by answering the following questions:. . .

+
+ +

Teaching folks to program 2019, a.k.a. in the search of an ideal program: Sequence @@ -228,23 +247,6 @@ Continue reading

-
-

- Examples and dependencies -

-

- 2018-08-21 00:00 -

-
-

Cloud

-

This article describes two new OpenSceneGraph cross-platform examples and the change in handling dependencies.

-

Examples of HTTP client and node selection

-

Once we finished working on the remote debugging example and reported its completion, we were surprised by the fact that secure HTTP connection between a debugged application and debug broker was only working in the web version of the example. Desktop and mobile versions only worked with insecure HTTP.. . .

-
- -

Page 1 of 7

diff --git a/en/news/index.template b/en/news/index.template index 42ed0ef..de78598 100644 --- a/en/news/index.template +++ b/en/news/index.template @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/index2.html b/en/news/index2.html index 16bee9c..ac38853 100644 --- a/en/news/index2.html +++ b/en/news/index2.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table @@ -94,6 +97,23 @@

News

+
+

+ Examples and dependencies +

+

+ 2018-08-21 00:00 +

+
+

Cloud

+

This article describes two new OpenSceneGraph cross-platform examples and the change in handling dependencies.

+

Examples of HTTP client and node selection

+

Once we finished working on the remote debugging example and reported its completion, we were surprised by the fact that secure HTTP connection between a debugged application and debug broker was only working in the web version of the example. Desktop and mobile versions only worked with insecure HTTP.. . .

+
+ +
-
-

- Scripting research -

-

- 2017-08-16 00:00 -

-
-

Textbook with a text

-

This article describes scripting research in July 2017.

-

Our first goal of using a scripting language was to have a platform-independent code that runs unchanged on every supported platform.. . .

-
- -

Page 2 of 7

diff --git a/en/news/index3.html b/en/news/index3.html index a71006d..9dbc0db 100644 --- a/en/news/index3.html +++ b/en/news/index3.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table @@ -94,6 +97,22 @@

News

+
+

+ Scripting research +

+

+ 2017-08-16 00:00 +

+
+

Textbook with a text

+

This article describes scripting research in July 2017.

+

Our first goal of using a scripting language was to have a platform-independent code that runs unchanged on every supported platform.. . .

+
+ +
-
-

- October 2016 recap -

-

- 2016-11-19 00:00 -

-
-

Gaining Android support was like climbing a mountain for us

-

This article describes how we spent a month building OpenSceneGraph (OSG) for Android: the first attempt to build OSG, the search for OSG alternatives, and the success in building OSG.. . .

-
- -

Page 3 of 7

diff --git a/en/news/index4.html b/en/news/index4.html index 90de962..6d4692d 100644 --- a/en/news/index4.html +++ b/en/news/index4.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table @@ -94,6 +97,21 @@

News

+
+

+ October 2016 recap +

+

+ 2016-11-19 00:00 +

+
+

Gaining Android support was like climbing a mountain for us

+

This article describes how we spent a month building OpenSceneGraph (OSG) for Android: the first attempt to build OSG, the search for OSG alternatives, and the success in building OSG.. . .

+
+ +

Technology showcases @@ -219,20 +237,6 @@ Continue reading

-
-

- Once Mahjong – always Mahjong -

-

- 2016-08-10 00:00 -

-
-

We started Opensource Game Studio project a long time ago. We wanted to provide open source community with tools to create games. However, it was unclear what tools' purpose was. So we decided to start small: create a game first.. . .

-
- -

Page 4 of 7

diff --git a/en/news/index5.html b/en/news/index5.html index 5b940a6..33fb4d7 100644 --- a/en/news/index5.html +++ b/en/news/index5.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table @@ -94,6 +97,20 @@

News

+
+

+ Once Mahjong – always Mahjong +

+

+ 2016-08-10 00:00 +

+
+

We started Opensource Game Studio project a long time ago. We wanted to provide open source community with tools to create games. However, it was unclear what tools' purpose was. So we decided to start small: create a game first.. . .

+
+ +
-
-

- Live session video and downloads -

-

- 2015-11-15 00:00 -

-
-

If you missed the live session, you can watch it here: -https://www.livecoding.tv/video/kornerr/playlists/whac-a-mole-from-scratch/. . .

-
- -

Page 5 of 7

diff --git a/en/news/index6.html b/en/news/index6.html index 6370d15..1c37795 100644 --- a/en/news/index6.html +++ b/en/news/index6.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table @@ -94,6 +97,21 @@

News

+
+

+ Live session video and downloads +

+

+ 2015-11-15 00:00 +

+
+

If you missed the live session, you can watch it here: +https://www.livecoding.tv/video/kornerr/playlists/whac-a-mole-from-scratch/. . .

+
+ +
-
-

- Editor roadmap for 0.4.0 -

-

- 2015-01-13 00:00 -

-
-

The development of Editor 0.3.0 showed us, that usage of custom GUI was not a perfect idea. A few months ago, custom GUI seemed as a simpler way to do things, but it turned out to lack many little features, that are crucial if you're planning to make a convenient tool.. . .

-
- -

Page 6 of 7

diff --git a/en/news/index7.html b/en/news/index7.html index 16b6d44..6bd399b 100644 --- a/en/news/index7.html +++ b/en/news/index7.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table @@ -94,6 +97,20 @@

News

+
+

+ Editor roadmap for 0.4.0 +

+

+ 2015-01-13 00:00 +

+
+

The development of Editor 0.3.0 showed us, that usage of custom GUI was not a perfect idea. A few months ago, custom GUI seemed as a simpler way to do things, but it turned out to lack many little features, that are crucial if you're planning to make a convenient tool.. . .

+
+ +

User survey ends today diff --git a/en/news/ios-tutorial.html b/en/news/ios-tutorial.html index ea1e409..b5343a1 100644 --- a/en/news/ios-tutorial.html +++ b/en/news/ios-tutorial.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/item.template b/en/news/item.template index e78d408..66bcde3 100644 --- a/en/news/item.template +++ b/en/news/item.template @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/its-all-fine.html b/en/news/its-all-fine.html index 74f5e40..9df6406 100644 --- a/en/news/its-all-fine.html +++ b/en/news/its-all-fine.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/january-live-session-announcement.html b/en/news/january-live-session-announcement.html index fc388e4..8f49d3a 100644 --- a/en/news/january-live-session-announcement.html +++ b/en/news/january-live-session-announcement.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/january-live-session-decision.html b/en/news/january-live-session-decision.html index d9cd74c..35149a9 100644 --- a/en/news/january-live-session-decision.html +++ b/en/news/january-live-session-decision.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/lets-go.html b/en/news/lets-go.html index 760a1a7..fca5009 100644 --- a/en/news/lets-go.html +++ b/en/news/lets-go.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/livesession-editor-07.html b/en/news/livesession-editor-07.html index f13030f..b9aa482 100644 --- a/en/news/livesession-editor-07.html +++ b/en/news/livesession-editor-07.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/livesession-materials-editor-07.html b/en/news/livesession-materials-editor-07.html index a9095a2..a6823b0 100644 --- a/en/news/livesession-materials-editor-07.html +++ b/en/news/livesession-materials-editor-07.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/mahjong-demo2.html b/en/news/mahjong-demo2.html index 3fb8a0e..dd27697 100644 --- a/en/news/mahjong-demo2.html +++ b/en/news/mahjong-demo2.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/mahjong-recreation-start.html b/en/news/mahjong-recreation-start.html index 6dfb45d..6e6ba2f 100644 --- a/en/news/mahjong-recreation-start.html +++ b/en/news/mahjong-recreation-start.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/mahjong-techdemo1-gameplay.html b/en/news/mahjong-techdemo1-gameplay.html index 8de5665..49db7d7 100644 --- a/en/news/mahjong-techdemo1-gameplay.html +++ b/en/news/mahjong-techdemo1-gameplay.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/may-live-session-announcement.html b/en/news/may-live-session-announcement.html index e921408..765a723 100644 --- a/en/news/may-live-session-announcement.html +++ b/en/news/may-live-session-announcement.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/may-live-session-decision.html b/en/news/may-live-session-decision.html index 181c050..ffebf26 100644 --- a/en/news/may-live-session-decision.html +++ b/en/news/may-live-session-decision.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/mjin-world-birth.html b/en/news/mjin-world-birth.html index e951c86..7dab3ec 100644 --- a/en/news/mjin-world-birth.html +++ b/en/news/mjin-world-birth.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/ogs-editor-0.10.html b/en/news/ogs-editor-0.10.html index d2a4993..c9a4675 100644 --- a/en/news/ogs-editor-0.10.html +++ b/en/news/ogs-editor-0.10.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/ogs-editor-0.9.html b/en/news/ogs-editor-0.9.html index 0268b20..ebbdd98 100644 --- a/en/news/ogs-editor-0.9.html +++ b/en/news/ogs-editor-0.9.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/on-the-way-to-durable-applications.html b/en/news/on-the-way-to-durable-applications.html index fc72f3b..b9ba087 100644 --- a/en/news/on-the-way-to-durable-applications.html +++ b/en/news/on-the-way-to-durable-applications.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/once-mahjong-always-mahjong.html b/en/news/once-mahjong-always-mahjong.html index df25bb3..8a1a691 100644 --- a/en/news/once-mahjong-always-mahjong.html +++ b/en/news/once-mahjong-always-mahjong.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/openscenegraph-cross-platform-guide.html b/en/news/openscenegraph-cross-platform-guide.html index 6b34bfc..e0140ec 100644 --- a/en/news/openscenegraph-cross-platform-guide.html +++ b/en/news/openscenegraph-cross-platform-guide.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/openscenegraph-examples.html b/en/news/openscenegraph-examples.html index 1413b8e..6ec6022 100644 --- a/en/news/openscenegraph-examples.html +++ b/en/news/openscenegraph-examples.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/osg-sample.html b/en/news/osg-sample.html index 9ce722d..0630778 100644 --- a/en/news/osg-sample.html +++ b/en/news/osg-sample.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/rolling-ball-live-session-pt2.html b/en/news/rolling-ball-live-session-pt2.html index 7ea54d1..9eb5fc0 100644 --- a/en/news/rolling-ball-live-session-pt2.html +++ b/en/news/rolling-ball-live-session-pt2.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/rolling-ball.html b/en/news/rolling-ball.html index 5cc85bc..6415714 100644 --- a/en/news/rolling-ball.html +++ b/en/news/rolling-ball.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/scripting-research.html b/en/news/scripting-research.html index 30dc783..10f7516 100644 --- a/en/news/scripting-research.html +++ b/en/news/scripting-research.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/september-live-session-announcement-tomorrow.html b/en/news/september-live-session-announcement-tomorrow.html index ab793d4..7e17b80 100644 --- a/en/news/september-live-session-announcement-tomorrow.html +++ b/en/news/september-live-session-announcement-tomorrow.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/september-live-session-announcement.html b/en/news/september-live-session-announcement.html index 6f5cb0b..8cbc3ee 100644 --- a/en/news/september-live-session-announcement.html +++ b/en/news/september-live-session-announcement.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/soon-game-creation-editor-07.html b/en/news/soon-game-creation-editor-07.html index 5ca0ef0..26cc4e7 100644 --- a/en/news/soon-game-creation-editor-07.html +++ b/en/news/soon-game-creation-editor-07.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/teaching-kids-to-program.html b/en/news/teaching-kids-to-program.html index 8a6b909..e893b2e 100644 --- a/en/news/teaching-kids-to-program.html +++ b/en/news/teaching-kids-to-program.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/teaching-to-program-2019.html b/en/news/teaching-to-program-2019.html index f58acd3..520d380 100644 --- a/en/news/teaching-to-program-2019.html +++ b/en/news/teaching-to-program-2019.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/test-chamber-for-everyone.html b/en/news/test-chamber-for-everyone.html index ed117ed..abf965b 100644 --- a/en/news/test-chamber-for-everyone.html +++ b/en/news/test-chamber-for-everyone.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/the-pros-and-cons-of-restarting-from-scratch.html b/en/news/the-pros-and-cons-of-restarting-from-scratch.html index 2dc71f6..2115664 100644 --- a/en/news/the-pros-and-cons-of-restarting-from-scratch.html +++ b/en/news/the-pros-and-cons-of-restarting-from-scratch.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/the-year-of-challenges.html b/en/news/the-year-of-challenges.html index 4b2ca87..63ba177 100644 --- a/en/news/the-year-of-challenges.html +++ b/en/news/the-year-of-challenges.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/the-year-of-lessons.html b/en/news/the-year-of-lessons.html index 1191273..294bba0 100644 --- a/en/news/the-year-of-lessons.html +++ b/en/news/the-year-of-lessons.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/user-servey-finish-promise.html b/en/news/user-servey-finish-promise.html index ec370a9..d73247c 100644 --- a/en/news/user-servey-finish-promise.html +++ b/en/news/user-servey-finish-promise.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/news/yesterdays-live-session-short-overview.html b/en/news/yesterdays-live-session-short-overview.html index 3a1ba36..e38d781 100644 --- a/en/news/yesterdays-live-session-short-overview.html +++ b/en/news/yesterdays-live-session-short-overview.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/page/about.html b/en/page/about.html index 7189711..966b12d 100644 --- a/en/page/about.html +++ b/en/page/about.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/page/item.template b/en/page/item.template index 442979d..2fda0bf 100644 --- a/en/page/item.template +++ b/en/page/item.template @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/tool/index.html b/en/tool/index.html index 3267605..b22880c 100644 --- a/en/tool/index.html +++ b/en/tool/index.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/tool/index.template b/en/tool/index.template index 26d113c..e9fa9b4 100644 --- a/en/tool/index.template +++ b/en/tool/index.template @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/tool/item.template b/en/tool/item.template index ea7233d..89d62b9 100644 --- a/en/tool/item.template +++ b/en/tool/item.template @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/tool/lfsa.html b/en/tool/lfsa.html index 8195e34..0c1ed0a 100644 --- a/en/tool/lfsa.html +++ b/en/tool/lfsa.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/tool/pskov.html b/en/tool/pskov.html index 655be17..c4f209d 100644 --- a/en/tool/pskov.html +++ b/en/tool/pskov.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/en/tool/zipbase64.html b/en/tool/zipbase64.html index dbded93..510030c 100644 --- a/en/tool/zipbase64.html +++ b/en/tool/zipbase64.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/images/2020-05-06_гит-бюджет.jpg b/images/2020-05-06_гит-бюджет.jpg new file mode 100644 index 0000000..93e988b Binary files /dev/null and b/images/2020-05-06_гит-бюджет.jpg differ diff --git a/images/2020-05-06_гит-бюджет_заметки.jpg b/images/2020-05-06_гит-бюджет_заметки.jpg new file mode 100644 index 0000000..e6cdad8 Binary files /dev/null and b/images/2020-05-06_гит-бюджет_заметки.jpg differ diff --git a/images/2020-05-06_гит-бюджет_календарь-день.jpg b/images/2020-05-06_гит-бюджет_календарь-день.jpg new file mode 100644 index 0000000..c2e2739 Binary files /dev/null and b/images/2020-05-06_гит-бюджет_календарь-день.jpg differ diff --git a/images/2020-05-06_гит-бюджет_календарь-запись.jpg b/images/2020-05-06_гит-бюджет_календарь-запись.jpg new file mode 100644 index 0000000..9cf9d15 Binary files /dev/null and b/images/2020-05-06_гит-бюджет_календарь-запись.jpg differ diff --git a/images/2020-05-06_гит-бюджет_снимок.png b/images/2020-05-06_гит-бюджет_снимок.png new file mode 100644 index 0000000..c409c19 Binary files /dev/null and b/images/2020-05-06_гит-бюджет_снимок.png differ diff --git a/ru/game/index.html b/ru/game/index.html index 0f633a9..d3fb679 100644 --- a/ru/game/index.html +++ b/ru/game/index.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/game/index.template b/ru/game/index.template index 4f70370..374cf3f 100644 --- a/ru/game/index.template +++ b/ru/game/index.template @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/game/item.template b/ru/game/item.template index 36b1100..d73d616 100644 --- a/ru/game/item.template +++ b/ru/game/item.template @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/game/mahjong.html b/ru/game/mahjong.html index 1b8bd0c..9e02ea2 100644 --- a/ru/game/mahjong.html +++ b/ru/game/mahjong.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/game/ogs-mahjong-1.html b/ru/game/ogs-mahjong-1.html index c744d8c..c3b714e 100644 --- a/ru/game/ogs-mahjong-1.html +++ b/ru/game/ogs-mahjong-1.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/2014-another-year-passed.html b/ru/news/2014-another-year-passed.html index 3a8822f..e119dc1 100644 --- a/ru/news/2014-another-year-passed.html +++ b/ru/news/2014-another-year-passed.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/2015-roadmap.html b/ru/news/2015-roadmap.html index a0bd13b..044a73f 100644 --- a/ru/news/2015-roadmap.html +++ b/ru/news/2015-roadmap.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/2016-august-recap.html b/ru/news/2016-august-recap.html index c259b66..7481185 100644 --- a/ru/news/2016-august-recap.html +++ b/ru/news/2016-august-recap.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/2016-november-recap.html b/ru/news/2016-november-recap.html index febc273..02b26e7 100644 --- a/ru/news/2016-november-recap.html +++ b/ru/news/2016-november-recap.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/2016-october-recap.html b/ru/news/2016-october-recap.html index 94a5f7c..3ea6594 100644 --- a/ru/news/2016-october-recap.html +++ b/ru/news/2016-october-recap.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/2016-roadmap.html b/ru/news/2016-roadmap.html index 740e4a1..fc5d6a8 100644 --- a/ru/news/2016-roadmap.html +++ b/ru/news/2016-roadmap.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/2016-september-recap.html b/ru/news/2016-september-recap.html index 67f0790..dce96de 100644 --- a/ru/news/2016-september-recap.html +++ b/ru/news/2016-september-recap.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/2016-tech-showcases.html b/ru/news/2016-tech-showcases.html index bbf7cbb..374cfec 100644 --- a/ru/news/2016-tech-showcases.html +++ b/ru/news/2016-tech-showcases.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/2017-happy-new-year.html b/ru/news/2017-happy-new-year.html index da0d15c..a40dd53 100644 --- a/ru/news/2017-happy-new-year.html +++ b/ru/news/2017-happy-new-year.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/2017-summary.html b/ru/news/2017-summary.html index 5cbbcda..9827e57 100644 --- a/ru/news/2017-summary.html +++ b/ru/news/2017-summary.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/2019-year-of-rethinking.html b/ru/news/2019-year-of-rethinking.html index 0c8b6ae..72e5f92 100644 --- a/ru/news/2019-year-of-rethinking.html +++ b/ru/news/2019-year-of-rethinking.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/2020-05-03_git-budget.md b/ru/news/2020-05-03_git-budget.md new file mode 100644 index 0000000..3404b2a --- /dev/null +++ b/ru/news/2020-05-03_git-budget.md @@ -0,0 +1,124 @@ +Title: Почему я сделал личный проект учёта трат на Git+JS +Date: 2020-05-03 00:00 +Category: News +Slug: git-budget +Lang: ru + +![ГитБюджет][снимок] + +В этой статье Михаил поделится опытом использования Git+JS. + +Здравствуйте, господа, в этой статье я поделюсь опытом создания приложения учёта трат, в частности отвечу на следующие вопросы: + +1. Зачем мне приложение учёта трат? +1. Почему это личный проект? +1. Почему проект на Git+JS? + +**1. Зачем мне приложение учёта трат?** + +Как и многие другие люди я давно хотел стать богатым и практиковать [успешный успех][успех]. Одной из рекомендаций в таких случаях часто выступает предложение вести собственный бюджет, чем я и занялся несколько лет назад. Скажу сразу, что ведение бюджета не сделало меня богатым и успешным, а своё материальное положение я улучшил обычным переездом в столицу. + +Вести бюджет я начал, если не изменяет память, где-то в 2012-м году. В то время у меня уже была профессиональная деформация программиста, выражающаяся формулой "сделано не мной" и попыткой написать всё самому. Тем не менее, по неопытности я решил начать с "проверенных" решений и приобрёл [YNAB][ynab] (You Need A Budget), т.к. приложение позволяло работать и с ПК, и с телефона. + +Я честно пытался задавать план трат на месяц и укладываться в него года три. Однако, где-то в 2015-м году авторы выпустили новую версию приложения, за которую **опять хотели денег**, старую же версию эти недальновидные капиталисты выкинули на обочину истории. В итоге мне пришлось выбирать из двух вариантов: + +1. Заплатить за новую версию и пользоваться "совершенно новым" приложением с другим интерфейсом. +1. Послать их нафиг, сохранить деньги, но потерять текущую историю трат. + +Я рассудил, что: + +1. приложение уже оплачивал; +1. старая версия меня устраивала; +1. новую версия я не просил; +1. если бы они мне до покупки сказали, что будут каждый раз драть с меня деньги, я бы им не заплатил и первый раз; +1. спонсировать такое хамство я не буду; + +и выбрал второй вариант: послал их нафиг и **потерял историю трат**. + +Эта ситуация меня довольно сильно разочаровала, поэтому я забросил ведение бюджета где-то на год. Однако, в один из дней "болезненной синхронизации" (также известной как "выяснение отношений") я **не смог отбить финансовый наброс** вида "ты транжира, вечно тратишь деньги на ерунду", после чего ясно осознал важность учёта трат. + +В этот раз я решил не повторять ошибку и не отдавать свои данные неизвестно куда с потенциальной возможностью их потерять, поэтому начал вести учёт трат в самых обычных заметках телефона. Формат был довольно простым и выглядел следующим образом: + +Заметки + +Заметки продержались у меня до середины 2018-го, пока я всё-таки не захотел иметь возможность **работать с тратами на ПК**, чтобы анализировать их. Я решил поискать решение, которое позволит мне **бесплатно работать** с историей трат и на ПК, и на телефоне. Таким решением оказался обычный календарь: + +Календарь + +Новая запись + +В календаре я использовал учётку Google, чтобы иметь доступ к [Apps Script][apps-script] (фактически JavaScript) для анализа записей. Делать скрипты оказалось не очень удобно, т.к. формат хранения календарных записей мало подходит для трат. Вопрос владения данными также оставался нерешённым: мои данные опять пылились на неизвестном и неподконтрольном мне сервере, а доступ к ним был лишь через неподконтрольный мне и **изменяющийся по чужой прихоти** API. + +Во время использования календаря меня периодически посещали две мысли: + +1. как здорово было бы все свои данные хранить в Git, чтобы легко анализировать траты; +1. как здорово было бы использовать интерфейс без всего лишнего, чтобы ускорить запись трат. + +Осенью 2019-го я наткнулся на проект [Isomorphic-Git][isomorphic-git], позволяющий работать с Git из JavaScript, бегло проверил его работоспособность и понял, что нашёл свой Святой Грааль. Недавно я завершил создание первой версии приложения ГитБюджет, функциональность которого можно увидеть в следующем видео: + + + +В итоге, сейчас учёт трат на телефоне у меня выглядит следующим образом: + +ГитБюджет + +Данные в 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) + +Отмечу некоторые важные моменты: + +* по ссылке представлено хранилище Git, отражающее действия из видео; +* свои траты я храню в отдельном закрытом хранилище, так следует делать каждому; +* приложение работает полностью на устройстве и не имеет сервера: используется хостинг GitHub Pages; +* приложение общается с внешним миром лишь в момент синхронизации с Git; +* пароль хранит браузер, приложение использует его лишь в момент синхронизации с Git; +* приложение необходимо загружать по HTTP, т.к. используемая версия Isomorphic-Git (0.70.0) некоторые запросы (метаданные) к Git выполняет по HTTP, а браузеры нынче запрещают обращения к HTTP из HTTPS. + +**2. Почему это личный проект?** + +На ГитБюджет я потратил 40 часов своей жизни в течение первого квартала 2020-го, т.е. в среднем каждый день я тратил около получаса. + +Личный проект обладает следующими преимуществами по сравнению с рабочим: + +1. Можно делать всё, что угодно, и учиться на своих ошибках. +1. Никто не стоит над душой и не ограничивает фантазию. +1. Предыдущие два пункта дают душевный покой и возможность совершенно спокойно принимать и исполнять самые идиотские решения на работе. +1. Шишки, набитые в личном проекте, колоссально расширяют кругозор. + +У личного проекта также есть и недостатки: + +1. На твой проект пофиг всем в мире, кроме тебя. +1. Никто не даст тебе ни гроша. +1. Нужно умудряться выкраивать время на личный проект каждый день. +1. Жена не скажет тебе "спасибо", даже если сама потом будет использовать приложение. + +Легко заметить, что все недостатки личного проекта перекрываются преимуществами рабочего проекта. А все недостатки рабочего проекта перекрываются преимуществами личного проекта. Инь и янь. + +**3. Почему проект на Git+JS?** + +Хранение данных в Git вместо неизвестного сервера/API даёт следующие преимущества: + +1. Git является самым распространённым решением для децентрализованного хранения проектов среди разработчиков, т.е. практически каждый разработчик умеет работать с Git. +1. Для работы с Git не нужен очередной API: вы просто работаете с файлами. +1. Есть много сервисов, предоставляющих хранилище Git бесплатно, если вы не помешаны на безопасности или не хотите платить денег за сервис. +1. Владелец сервиса Git, конечно, может через несколько лет [быть выкуплен крупной корпорацией][поглощение], однако, вы легко сможете перенести свои данные Git. +1. Для максимальной безопасности данных вы всегда можете поднять свой Git. + +Использование JS с HTML/CSS вместо Swift/Kotlin/C#/Python даёт следующие преимущества: + +1. Ваше приложение будет работать и на телефоне, и на планшете, и на ПК. +1. Вам не нужно проходить никаких проверок вроде AppStore, для того чтобы попасть в каждое устройство. +1. Ввиду того, что стандарты HTML/CSS/JS согласуются огромным количеством компаний, ни одна из компаний не может [в одностороннем порядке прекратить поддерживать какую-либо технологию][opengl] или [в очередной раз поменять API][swift], так что обратная совместимость может достигать [20 лет][долговечные-приложения] и больше. +1. Ввиду отсутствия сервера вся логика размещается в JS, исполняемый на клиенте, что даёт возможность сохранить ту версию приложения, которая устраивает лично вас, и забыть про обновления, зачастую [приводящие лишь к увеличению тормозов][обновления]. + +ГитБюджет является лишь первым испытанием возможностей Git+JS. Посмотрим, что удастся сделать ещё. + +[снимок]: ../../images/2020-05-06_гит-бюджет_снимок.png +[успех]: https://успешный-успех.рф +[ynab]: https://www.youneedabudget.com +[apps-script]: https://developers.google.com/apps-script?hl=ru +[isomorphic-git]: https://isomorphic-git.org/ +[поглощение]: https://habr.com/ru/post/413215/ +[opengl]: https://habr.com/ru/post/413335/ +[swift]: https://arm1.ru/blog/pro-perehod-na-swift-3-i-swift-2-4 +[долговечные-приложения]: on-the-way-to-durable-applications.html +[обновления]: https://pikabu.ru/story/android_skoree_vsego_stanet_platnyim_6052457?cid=118211967 diff --git a/ru/news/back-to-social-networks.html b/ru/news/back-to-social-networks.html index b7e1313..704b3a4 100644 --- a/ru/news/back-to-social-networks.html +++ b/ru/news/back-to-social-networks.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/back-to-the-static.html b/ru/news/back-to-the-static.html index 9f1af7b..cfbd021 100644 --- a/ru/news/back-to-the-static.html +++ b/ru/news/back-to-the-static.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/bye-desura-hello-humblebundle.html b/ru/news/bye-desura-hello-humblebundle.html index 7d0c4e2..65a14e9 100644 --- a/ru/news/bye-desura-hello-humblebundle.html +++ b/ru/news/bye-desura-hello-humblebundle.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/defending-availability.html b/ru/news/defending-availability.html index d36fcdc..07f817c 100644 --- a/ru/news/defending-availability.html +++ b/ru/news/defending-availability.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/editor-0.4.0-and-0.5.0-plans.html b/ru/news/editor-0.4.0-and-0.5.0-plans.html index 470011d..5b1564d 100644 --- a/ru/news/editor-0.4.0-and-0.5.0-plans.html +++ b/ru/news/editor-0.4.0-and-0.5.0-plans.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/editor-0.4.0-plans.html b/ru/news/editor-0.4.0-plans.html index 432b059..ed320c7 100644 --- a/ru/news/editor-0.4.0-plans.html +++ b/ru/news/editor-0.4.0-plans.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/editor-06-roadmap.html b/ru/news/editor-06-roadmap.html index 051c88c..4fdb678 100644 --- a/ru/news/editor-06-roadmap.html +++ b/ru/news/editor-06-roadmap.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/editor-06.html b/ru/news/editor-06.html index 2ae18c4..901d2c1 100644 --- a/ru/news/editor-06.html +++ b/ru/news/editor-06.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/example-driven-development.html b/ru/news/example-driven-development.html index bcf4d94..3b92e9f 100644 --- a/ru/news/example-driven-development.html +++ b/ru/news/example-driven-development.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/examples-and-dependencies.html b/ru/news/examples-and-dependencies.html index fce1c0b..8aa6352 100644 --- a/ru/news/examples-and-dependencies.html +++ b/ru/news/examples-and-dependencies.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/git-budget.html b/ru/news/git-budget.html new file mode 100644 index 0000000..f9f72d3 --- /dev/null +++ b/ru/news/git-budget.html @@ -0,0 +1,208 @@ + + + + + + + + +
+

В новостях...

+
+

+ Почему я сделал личный проект учёта трат на Git+JS +

+

+ 2020-05-03 00:00 +

+
+

ГитБюджет

+

В этой статье Михаил поделится опытом использования Git+JS.

+

Здравствуйте, господа, в этой статье я поделюсь опытом создания приложения учёта трат, в частности отвечу на следующие вопросы:

+
    +
  1. Зачем мне приложение учёта трат?
  2. +
  3. Почему это личный проект?
  4. +
  5. Почему проект на Git+JS?
  6. +
+

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

+

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

+

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

+

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

+
    +
  1. Заплатить за новую версию и пользоваться "совершенно новым" приложением с другим интерфейсом.
  2. +
  3. Послать их нафиг, сохранить деньги, но потерять текущую историю трат.
  4. +
+

Я рассудил, что:

+
    +
  1. приложение уже оплачивал;
  2. +
  3. старая версия меня устраивала;
  4. +
  5. новую версия я не просил;
  6. +
  7. если бы они мне до покупки сказали, что будут каждый раз драть с меня деньги, я бы им не заплатил и первый раз;
  8. +
  9. спонсировать такое хамство я не буду;
  10. +
+

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

+

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

+

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

+

Заметки

+

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

+

Календарь

+

Новая запись

+

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

+

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

+
    +
  1. как здорово было бы все свои данные хранить в Git, чтобы легко анализировать траты;
  2. +
  3. как здорово было бы использовать интерфейс без всего лишнего, чтобы ускорить запись трат.
  4. +
+

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

+ +

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

+

ГитБюджет

+

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

+

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

+
    +
  • по ссылке представлено хранилище Git, отражающее действия из видео;
  • +
  • свои траты я храню в отдельном закрытом хранилище, так следует делать каждому;
  • +
  • приложение работает полностью на устройстве и не имеет сервера: используется хостинг GitHub Pages;
  • +
  • приложение общается с внешним миром лишь в момент синхронизации с Git;
  • +
  • пароль хранит браузер, приложение использует его лишь в момент синхронизации с Git;
  • +
  • приложение необходимо загружать по HTTP, т.к. используемая версия Isomorphic-Git (0.70.0) некоторые запросы (метаданные) к Git выполняет по HTTP, а браузеры нынче запрещают обращения к HTTP из HTTPS.
  • +
+

2. Почему это личный проект?

+

На ГитБюджет я потратил 40 часов своей жизни в течение первого квартала 2020-го, т.е. в среднем каждый день я тратил около получаса.

+

Личный проект обладает следующими преимуществами по сравнению с рабочим:

+
    +
  1. Можно делать всё, что угодно, и учиться на своих ошибках.
  2. +
  3. Никто не стоит над душой и не ограничивает фантазию.
  4. +
  5. Предыдущие два пункта дают душевный покой и возможность совершенно спокойно принимать и исполнять самые идиотские решения на работе.
  6. +
  7. Шишки, набитые в личном проекте, колоссально расширяют кругозор.
  8. +
+

У личного проекта также есть и недостатки:

+
    +
  1. На твой проект пофиг всем в мире, кроме тебя.
  2. +
  3. Никто не даст тебе ни гроша.
  4. +
  5. Нужно умудряться выкраивать время на личный проект каждый день.
  6. +
  7. Жена не скажет тебе "спасибо", даже если сама потом будет использовать приложение.
  8. +
+

Легко заметить, что все недостатки личного проекта перекрываются преимуществами рабочего проекта. А все недостатки рабочего проекта перекрываются преимуществами личного проекта. Инь и янь.

+

3. Почему проект на Git+JS?

+

Хранение данных в Git вместо неизвестного сервера/API даёт следующие преимущества:

+
    +
  1. Git является самым распространённым решением для децентрализованного хранения проектов среди разработчиков, т.е. практически каждый разработчик умеет работать с Git.
  2. +
  3. Для работы с Git не нужен очередной API: вы просто работаете с файлами.
  4. +
  5. Есть много сервисов, предоставляющих хранилище Git бесплатно, если вы не помешаны на безопасности или не хотите платить денег за сервис.
  6. +
  7. Владелец сервиса Git, конечно, может через несколько лет быть выкуплен крупной корпорацией, однако, вы легко сможете перенести свои данные Git.
  8. +
  9. Для максимальной безопасности данных вы всегда можете поднять свой Git.
  10. +
+

Использование JS с HTML/CSS вместо Swift/Kotlin/C#/Python даёт следующие преимущества:

+
    +
  1. Ваше приложение будет работать и на телефоне, и на планшете, и на ПК.
  2. +
  3. Вам не нужно проходить никаких проверок вроде AppStore, для того чтобы попасть в каждое устройство.
  4. +
  5. Ввиду того, что стандарты HTML/CSS/JS согласуются огромным количеством компаний, ни одна из компаний не может в одностороннем порядке прекратить поддерживать какую-либо технологию или в очередной раз поменять API, так что обратная совместимость может достигать 20 лет и больше.
  6. +
  7. Ввиду отсутствия сервера вся логика размещается в JS, исполняемый на клиенте, что даёт возможность сохранить ту версию приложения, которая устраивает лично вас, и забыть про обновления, зачастую приводящие лишь к увеличению тормозов.
  8. +
+

ГитБюджет является лишь первым испытанием возможностей Git+JS. Посмотрим, что удастся сделать ещё.

+
+
+ +
+ + diff --git a/ru/news/ideal-gamedev.html b/ru/news/ideal-gamedev.html index eccbd88..3531b61 100644 --- a/ru/news/ideal-gamedev.html +++ b/ru/news/ideal-gamedev.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/index.html b/ru/news/index.html index b4f283e..9019e34 100644 --- a/ru/news/index.html +++ b/ru/news/index.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table @@ -94,6 +97,22 @@

Новости

+
+

+ Почему я сделал личный проект учёта трат на Git+JS +

+

+ 2020-05-03 00:00 +

+
+

ГитБюджет

+

В этой статье Михаил поделится опытом использования Git+JS.

+

Здравствуйте, господа, в этой статье я поделюсь опытом создания приложения учёта трат, в частности отвечу на следующие вопросы:. . .

+
+ +

-
-

- Примеры и зависимости -

-

- 2018-08-21 00:00 -

-
-

Облако

-

Эта статья описывает два новых кросс-платформенных примера OpenSceneGraph и изменение в работе с зависимостями.

-

Примеры клиента HTTP и выбора узла сцены

-

После окончания работы над примером удалённой отладки и сообщения об этом мы с удивлением обнаружили, что безопасное соединение HTTPS между отлаживаемым приложением и брокером отладки работало лишь в веб-версии примера. Десктопная и мобильная версии работали лишь с помощью обычного соединения HTTP.. . .

-
- -

Страница 1 из 7

diff --git a/ru/news/index.template b/ru/news/index.template index 20b5e81..86e8e18 100644 --- a/ru/news/index.template +++ b/ru/news/index.template @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/index2.html b/ru/news/index2.html index a0f7f40..a00c91b 100644 --- a/ru/news/index2.html +++ b/ru/news/index2.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table @@ -94,6 +97,23 @@

Новости

+
+

+ Примеры и зависимости +

+

+ 2018-08-21 00:00 +

+
+

Облако

+

Эта статья описывает два новых кросс-платформенных примера OpenSceneGraph и изменение в работе с зависимостями.

+

Примеры клиента HTTP и выбора узла сцены

+

После окончания работы над примером удалённой отладки и сообщения об этом мы с удивлением обнаружили, что безопасное соединение HTTPS между отлаживаемым приложением и брокером отладки работало лишь в веб-версии примера. Десктопная и мобильная версии работали лишь с помощью обычного соединения HTTP.. . .

+
+ +
-
-

- Изучение скриптования -

-

- 2017-08-16 00:00 -

-
-

Тетрадка с текстом

-

Эта статья описывает изучение скриптования в июле 2017.

-

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

-
- -

Страница 2 из 7

diff --git a/ru/news/index3.html b/ru/news/index3.html index 6ac3547..2ccc4da 100644 --- a/ru/news/index3.html +++ b/ru/news/index3.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table @@ -94,6 +97,22 @@

Новости

+
+

+ Изучение скриптования +

+

+ 2017-08-16 00:00 +

+
+

Тетрадка с текстом

+

Эта статья описывает изучение скриптования в июле 2017.

+

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

+
+ +
-
-

- Октябрь 2016 кратко -

-

- 2016-11-19 00:00 -

-
-

Достижение поддержки Android было сродни покорению горы для нас

-

Эта статья описывает, как мы потратили месяц на сборку OpenSceneGraph (OSG) под Android: первая попытка собрать OSG, поиск альтернатив OSG и успех в сборке OSG.. . .

-
- -

Страница 3 из 7

diff --git a/ru/news/index4.html b/ru/news/index4.html index dc398d8..2da5ca7 100644 --- a/ru/news/index4.html +++ b/ru/news/index4.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table @@ -94,6 +97,21 @@

Новости

+
+

+ Октябрь 2016 кратко +

+

+ 2016-11-19 00:00 +

+
+

Достижение поддержки Android было сродни покорению горы для нас

+

Эта статья описывает, как мы потратили месяц на сборку OpenSceneGraph (OSG) под Android: первая попытка собрать OSG, поиск альтернатив OSG и успех в сборке OSG.. . .

+
+ +
-
-

- Раз Маджонг – всегда Маджонг -

-

- 2016-08-10 00:00 -

-
-

Мы начали проект Opensource Game Studio очень давно. Мы хотели дать сообществу свободного программного обеспечения средства для создания игр. Правда, тогда не было ясно, что они из себя должны представлять. Поэтому решили начать с малого: создать игру.. . .

-
- -

Страница 4 из 7

diff --git a/ru/news/index5.html b/ru/news/index5.html index 1139ec8..37a8b7c 100644 --- a/ru/news/index5.html +++ b/ru/news/index5.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table @@ -94,6 +97,20 @@

Новости

+
+

+ Раз Маджонг – всегда Маджонг +

+

+ 2016-08-10 00:00 +

+
+

Мы начали проект Opensource Game Studio очень давно. Мы хотели дать сообществу свободного программного обеспечения средства для создания игр. Правда, тогда не было ясно, что они из себя должны представлять. Поэтому решили начать с малого: создать игру.. . .

+
+ +
-
-

- Видеозапись живой сессии и материалы -

-

- 2015-11-15 00:00 -

-
-

Если вы пропустили живую сессию, вы можете посмотреть ее здесь: -https://www.livecoding.tv/video/kornerr/playlists/whac-a-mole-from-scratch/. . .

-
- -

Страница 5 из 7

diff --git a/ru/news/index6.html b/ru/news/index6.html index bb77592..5da2907 100644 --- a/ru/news/index6.html +++ b/ru/news/index6.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table @@ -94,6 +97,21 @@

Новости

+
+

+ Видеозапись живой сессии и материалы +

+

+ 2015-11-15 00:00 +

+
+

Если вы пропустили живую сессию, вы можете посмотреть ее здесь: +https://www.livecoding.tv/video/kornerr/playlists/whac-a-mole-from-scratch/. . .

+
+ +
-
-

- План задач для Editor 0.4.0 -

-

- 2015-01-13 00:00 -

-
-

Разработка Editor 0.3.0 показала нам, что использование кастомного GUI не было столь хорошей идеей, как показалось на первый взгляд. Несмотря на более простую реализацию, кастомный GUI лишен множества мелких достоинств, которые оказываются практически необходимы, если задаться целью сделать удобный инструмент.. . .

-
- -

Страница 6 из 7

diff --git a/ru/news/index7.html b/ru/news/index7.html index bca5c9e..e99849a 100644 --- a/ru/news/index7.html +++ b/ru/news/index7.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table @@ -94,6 +97,20 @@

Новости

+
+

+ План задач для Editor 0.4.0 +

+

+ 2015-01-13 00:00 +

+
+

Разработка Editor 0.3.0 показала нам, что использование кастомного GUI не было столь хорошей идеей, как показалось на первый взгляд. Несмотря на более простую реализацию, кастомный GUI лишен множества мелких достоинств, которые оказываются практически необходимы, если задаться целью сделать удобный инструмент.. . .

+
+ +

Окончание опроса diff --git a/ru/news/ios-tutorial.html b/ru/news/ios-tutorial.html index 56e2399..58cbe89 100644 --- a/ru/news/ios-tutorial.html +++ b/ru/news/ios-tutorial.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/item.template b/ru/news/item.template index 253504b..988ed0b 100644 --- a/ru/news/item.template +++ b/ru/news/item.template @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/its-all-fine.html b/ru/news/its-all-fine.html index 2353cc0..82af5a1 100644 --- a/ru/news/its-all-fine.html +++ b/ru/news/its-all-fine.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/january-live-session-announcement.html b/ru/news/january-live-session-announcement.html index f04aa0d..40f4a0c 100644 --- a/ru/news/january-live-session-announcement.html +++ b/ru/news/january-live-session-announcement.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/january-live-session-decision.html b/ru/news/january-live-session-decision.html index 85c0f03..70a5921 100644 --- a/ru/news/january-live-session-decision.html +++ b/ru/news/january-live-session-decision.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/lets-go.html b/ru/news/lets-go.html index 02c51f4..62cd6a3 100644 --- a/ru/news/lets-go.html +++ b/ru/news/lets-go.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/livesession-editor-07.html b/ru/news/livesession-editor-07.html index a6c8503..2b07aa8 100644 --- a/ru/news/livesession-editor-07.html +++ b/ru/news/livesession-editor-07.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/livesession-materials-editor-07.html b/ru/news/livesession-materials-editor-07.html index 0075e44..f8fc82d 100644 --- a/ru/news/livesession-materials-editor-07.html +++ b/ru/news/livesession-materials-editor-07.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/mahjong-demo2.html b/ru/news/mahjong-demo2.html index 452ba6f..636542b 100644 --- a/ru/news/mahjong-demo2.html +++ b/ru/news/mahjong-demo2.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/mahjong-recreation-start.html b/ru/news/mahjong-recreation-start.html index 8343e74..a95e06f 100644 --- a/ru/news/mahjong-recreation-start.html +++ b/ru/news/mahjong-recreation-start.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/mahjong-techdemo1-gameplay.html b/ru/news/mahjong-techdemo1-gameplay.html index 4be8c25..3635ebe 100644 --- a/ru/news/mahjong-techdemo1-gameplay.html +++ b/ru/news/mahjong-techdemo1-gameplay.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/may-live-session-announcement.html b/ru/news/may-live-session-announcement.html index 19ae781..52c12b4 100644 --- a/ru/news/may-live-session-announcement.html +++ b/ru/news/may-live-session-announcement.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/may-live-session-decision.html b/ru/news/may-live-session-decision.html index a88cd4b..bea8eb0 100644 --- a/ru/news/may-live-session-decision.html +++ b/ru/news/may-live-session-decision.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/mjin-world-birth.html b/ru/news/mjin-world-birth.html index 06780de..0e3f52d 100644 --- a/ru/news/mjin-world-birth.html +++ b/ru/news/mjin-world-birth.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/ogs-editor-0.10.html b/ru/news/ogs-editor-0.10.html index 2f99d14..0531d74 100644 --- a/ru/news/ogs-editor-0.10.html +++ b/ru/news/ogs-editor-0.10.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/ogs-editor-0.9.html b/ru/news/ogs-editor-0.9.html index 523bc97..002c502 100644 --- a/ru/news/ogs-editor-0.9.html +++ b/ru/news/ogs-editor-0.9.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/on-the-way-to-durable-applications.html b/ru/news/on-the-way-to-durable-applications.html index 510f5f7..d2da110 100644 --- a/ru/news/on-the-way-to-durable-applications.html +++ b/ru/news/on-the-way-to-durable-applications.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/once-mahjong-always-mahjong.html b/ru/news/once-mahjong-always-mahjong.html index 2229f5f..ddac8f8 100644 --- a/ru/news/once-mahjong-always-mahjong.html +++ b/ru/news/once-mahjong-always-mahjong.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/openscenegraph-cross-platform-guide.html b/ru/news/openscenegraph-cross-platform-guide.html index b122949..7952d89 100644 --- a/ru/news/openscenegraph-cross-platform-guide.html +++ b/ru/news/openscenegraph-cross-platform-guide.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/openscenegraph-examples.html b/ru/news/openscenegraph-examples.html index 42de15c..c77b220 100644 --- a/ru/news/openscenegraph-examples.html +++ b/ru/news/openscenegraph-examples.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/osg-sample.html b/ru/news/osg-sample.html index cd4175e..e7c6e17 100644 --- a/ru/news/osg-sample.html +++ b/ru/news/osg-sample.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/rolling-ball-live-session-pt2.html b/ru/news/rolling-ball-live-session-pt2.html index 204945d..dc514ad 100644 --- a/ru/news/rolling-ball-live-session-pt2.html +++ b/ru/news/rolling-ball-live-session-pt2.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/rolling-ball.html b/ru/news/rolling-ball.html index 5f91bd6..ddc5abc 100644 --- a/ru/news/rolling-ball.html +++ b/ru/news/rolling-ball.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/scripting-research.html b/ru/news/scripting-research.html index 539b55b..999bcae 100644 --- a/ru/news/scripting-research.html +++ b/ru/news/scripting-research.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/september-live-session-announcement-tomorrow.html b/ru/news/september-live-session-announcement-tomorrow.html index 52f5e0f..59d4bc2 100644 --- a/ru/news/september-live-session-announcement-tomorrow.html +++ b/ru/news/september-live-session-announcement-tomorrow.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/september-live-session-announcement.html b/ru/news/september-live-session-announcement.html index 5d67e61..4a62a10 100644 --- a/ru/news/september-live-session-announcement.html +++ b/ru/news/september-live-session-announcement.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/soon-game-creation-editor-07.html b/ru/news/soon-game-creation-editor-07.html index a84664b..b0ebdc3 100644 --- a/ru/news/soon-game-creation-editor-07.html +++ b/ru/news/soon-game-creation-editor-07.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/teaching-kids-to-program.html b/ru/news/teaching-kids-to-program.html index 471fc0e..488bd1c 100644 --- a/ru/news/teaching-kids-to-program.html +++ b/ru/news/teaching-kids-to-program.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/teaching-to-program-2019.html b/ru/news/teaching-to-program-2019.html index 4cc528e..501bc43 100644 --- a/ru/news/teaching-to-program-2019.html +++ b/ru/news/teaching-to-program-2019.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/test-chamber-for-everyone.html b/ru/news/test-chamber-for-everyone.html index 59ca8c6..6223cbd 100644 --- a/ru/news/test-chamber-for-everyone.html +++ b/ru/news/test-chamber-for-everyone.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table 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 c5caaa2..f50b8d6 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,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/the-year-of-challenges.html b/ru/news/the-year-of-challenges.html index 3c67d5b..55e93f9 100644 --- a/ru/news/the-year-of-challenges.html +++ b/ru/news/the-year-of-challenges.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/the-year-of-lessons.html b/ru/news/the-year-of-lessons.html index 18414e7..0d542d0 100644 --- a/ru/news/the-year-of-lessons.html +++ b/ru/news/the-year-of-lessons.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/user-servey-finish-promise.html b/ru/news/user-servey-finish-promise.html index 6828cd9..ab732e1 100644 --- a/ru/news/user-servey-finish-promise.html +++ b/ru/news/user-servey-finish-promise.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/news/yesterdays-live-session-short-overview.html b/ru/news/yesterdays-live-session-short-overview.html index 1bf97fe..6607f23 100644 --- a/ru/news/yesterdays-live-session-short-overview.html +++ b/ru/news/yesterdays-live-session-short-overview.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/page/about.html b/ru/page/about.html index fa0c319..f28b008 100644 --- a/ru/page/about.html +++ b/ru/page/about.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/page/item.template b/ru/page/item.template index 2432946..80ea416 100644 --- a/ru/page/item.template +++ b/ru/page/item.template @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/tool/index.html b/ru/tool/index.html index 635bb3b..0e68537 100644 --- a/ru/tool/index.html +++ b/ru/tool/index.html @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/tool/index.template b/ru/tool/index.template index 36ddd85..4727624 100644 --- a/ru/tool/index.template +++ b/ru/tool/index.template @@ -60,10 +60,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/tool/item.template b/ru/tool/item.template index 618c53f..d2b701e 100644 --- a/ru/tool/item.template +++ b/ru/tool/item.template @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/tool/lfsa.html b/ru/tool/lfsa.html index 8c68186..b375ac5 100644 --- a/ru/tool/lfsa.html +++ b/ru/tool/lfsa.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/tool/pskov.html b/ru/tool/pskov.html index c6e9c32..65c7295 100644 --- a/ru/tool/pskov.html +++ b/ru/tool/pskov.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table diff --git a/ru/tool/zipbase64.html b/ru/tool/zipbase64.html index 446d24d..0ca84d9 100644 --- a/ru/tool/zipbase64.html +++ b/ru/tool/zipbase64.html @@ -67,10 +67,13 @@ { width: 720px; } + .mobile + { + width: 320px; + } a { color: #3A91CB; - text-decoration: none; } table