vault backup: 2026-05-18 21:11:52

This commit is contained in:
Dmitry
2026-05-18 21:11:52 +03:00
parent 969ef896bc
commit 6a5af63bb5
66 changed files with 1646 additions and 210 deletions
+1 -1
View File
@@ -39,6 +39,6 @@
"repelStrength": 6.34095634095634,
"linkStrength": 0.504158004158004,
"linkDistance": 250,
"scale": 0.21784264238625786,
"scale": 0.21784264238625775,
"close": true
}
+178 -13
View File
@@ -33,6 +33,7 @@
"displaySVGInPreview": false,
"previewImageType": "SVG",
"renderingConcurrency": 3,
"imageCacheRetentionDays": 30,
"allowImageCache": true,
"allowImageCacheInScene": true,
"displayExportedImageIfAvailable": false,
@@ -109,13 +110,14 @@
"addDummyTextElement": false,
"zoteroCompatibility": false,
"fieldSuggester": true,
"enableOnloadScripts": false,
"compatibilityMode": false,
"drawingOpenCount": 0,
"library": "deprecated",
"library2": {
"type": "excalidrawlib",
"version": 2,
"source": "https://github.com/zsviczian/obsidian-excalidraw-plugin/releases/tag/2.22.3",
"source": "https://github.com/zsviczian/obsidian-excalidraw-plugin/releases/tag/2.23.0",
"libraryItems": []
},
"imageElementNotice": true,
@@ -126,7 +128,7 @@
"mdBorderColor": "Black",
"mdCSS": "",
"scriptEngineSettings": {},
"previousRelease": "2.22.3",
"previousRelease": "2.23.0",
"showReleaseNotes": true,
"excalidrawMasteryPromoCollapsed": false,
"compareManifestToPluginVersion": false,
@@ -489,15 +491,178 @@
"canvasImmersiveEmbed": true,
"startupScriptPath": "",
"aiEnabled": true,
"openAIAPIToken": "",
"openAIDefaultTextModel": "gpt-5-mini",
"openAIDefaultTextModelMaxTokens": 4096,
"openAIDefaultVisionModel": "gpt-5-mini",
"openAIDefaultImageGenerationModel": "gpt-image-1",
"openAIURL": "https://api.openai.com/v1/chat/completions",
"openAIImageGenerationURL": "https://api.openai.com/v1/images/generations",
"openAIImageEditsURL": "https://api.openai.com/v1/images/edits",
"openAIImageVariationURL": "https://api.openai.com/v1/images/variations",
"aiVerboseLogging": false,
"aiProviderProfiles": {
"OpenAI": {
"provider": "openai",
"apiKey": "",
"baseURL": "https://api.openai.com/v1"
},
"Anthropic": {
"provider": "anthropic",
"apiKey": "",
"baseURL": "https://api.anthropic.com/v1"
},
"Google Gemini": {
"provider": "google",
"apiKey": "",
"baseURL": "https://generativelanguage.googleapis.com/v1beta"
},
"xAI": {
"provider": "xai",
"apiKey": "",
"baseURL": "https://api.x.ai/v1"
},
"OpenAI-compatible": {
"provider": "openai-compatible",
"apiKey": "",
"baseURL": "https://api.openai.com/v1"
}
},
"aiTextModelConfigs": {
"gpt-5-mini": {
"providerId": "OpenAI",
"model": "gpt-5-mini",
"endpoint": "",
"multimodalSupport": true
},
"claude-sonnet-4-5": {
"providerId": "Anthropic",
"model": "claude-sonnet-4-5",
"endpoint": "",
"multimodalSupport": true
},
"gemini-2.5-pro": {
"providerId": "Google Gemini",
"model": "gemini-2.5-pro",
"endpoint": "",
"multimodalSupport": true
},
"grok-4-fast": {
"providerId": "xAI",
"model": "grok-4-fast",
"endpoint": "",
"multimodalSupport": true
}
},
"aiImageModelConfigs": {
"dall-e-2": {
"providerId": "OpenAI",
"model": "dall-e-2",
"supportedSizes": [
"256x256",
"512x512",
"1024x1024"
],
"supportsPromptImageTransforms": true,
"supportsMaskImageEdits": true
},
"dall-e-3": {
"providerId": "OpenAI",
"model": "dall-e-3",
"supportedSizes": [
"1024x1024",
"1792x1024",
"1024x1792"
],
"supportsPromptImageTransforms": false,
"supportsMaskImageEdits": false
},
"gpt-image-1": {
"providerId": "OpenAI",
"model": "gpt-image-1",
"supportedSizes": [
"1024x1024",
"1536x1024",
"1024x1536"
],
"supportsPromptImageTransforms": true,
"supportsMaskImageEdits": true
},
"gpt-image-1-mini": {
"providerId": "OpenAI",
"model": "gpt-image-1-mini",
"supportedSizes": [
"1024x1024",
"1536x1024",
"1024x1536"
],
"supportsPromptImageTransforms": true,
"supportsMaskImageEdits": true
},
"gpt-image-1.5": {
"providerId": "OpenAI",
"model": "gpt-image-1.5",
"supportedSizes": [
"1024x1024",
"1536x1024",
"1024x1536"
],
"supportsPromptImageTransforms": true,
"supportsMaskImageEdits": true
},
"gpt-image-2": {
"providerId": "OpenAI",
"model": "gpt-image-2",
"supportedSizes": [
"1024x1024",
"1536x1024",
"1024x1536",
"2048x2048"
],
"supportsPromptImageTransforms": true,
"supportsMaskImageEdits": true
},
"gemini-2.5-flash-image": {
"providerId": "Google Gemini",
"model": "gemini-2.5-flash-image",
"supportedSizes": [
"1024x1024"
],
"supportsPromptImageTransforms": true,
"supportsMaskImageEdits": false
},
"gemini-3.1-flash-image-preview": {
"providerId": "Google Gemini",
"model": "gemini-3.1-flash-image-preview",
"supportedSizes": [
"1024x1024"
],
"supportsPromptImageTransforms": true,
"supportsMaskImageEdits": false
},
"gemini-3-pro-image-preview": {
"providerId": "Google Gemini",
"model": "gemini-3-pro-image-preview",
"supportedSizes": [
"1024x1024"
],
"supportsPromptImageTransforms": true,
"supportsMaskImageEdits": false
},
"grok-imagine-image-quality": {
"providerId": "xAI",
"model": "grok-imagine-image-quality",
"supportedSizes": [
"1024x1024"
],
"supportsPromptImageTransforms": true,
"supportsMaskImageEdits": false
},
"grok-imagine-image-pro": {
"providerId": "xAI",
"model": "grok-imagine-image-pro",
"supportedSizes": [
"1024x1024"
],
"supportsPromptImageTransforms": true,
"supportsMaskImageEdits": false
}
},
"aiDefaultTextModel": "gpt-5-mini",
"aiDefaultImageGenerationModel": "gpt-image-1",
"aiDefaultMaxOutgoingTokens": 0,
"aiDefaultMaxResponseTokens": 4096,
"modifierKeyConfig": {
"Mac": {
"LocalFileDragAction": {
@@ -787,7 +952,6 @@
"longPressDesktop": 500,
"longPressMobile": 500,
"doubleClickLinkOpenViewMode": true,
"isDebugMode": false,
"rank": "Bronze",
"modifierKeyOverrides": [
{
@@ -819,5 +983,6 @@
"alignment": "center",
"margin": "normal"
},
"disableContextMenu": false
"disableContextMenu": false,
"isDebugMode": false
}
+2 -2
View File
@@ -1,9 +1,9 @@
{
"id": "obsidian-excalidraw-plugin",
"name": "Excalidraw",
"version": "2.22.3",
"version": "2.23.0",
"minAppVersion": "1.5.7",
"description": "Sketch Your Mind. An Obsidian plugin to edit and view Excalidraw drawings. Enter the world of 4D Visual PKM.",
"description": "Sketch Your Mind. Edit and view Excalidraw drawings. Enter the world of 4D Visual PKM.",
"author": "Zsolt Viczian",
"authorUrl": "https://excalidraw-obsidian.online",
"fundingUrl": "https://ko-fi.com/zsolt",
File diff suppressed because one or more lines are too long
+29 -34
View File
@@ -8,18 +8,13 @@
"type": "tabs",
"children": [
{
"id": "85ff070f2dda5843",
"id": "f669bd78b6310606",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "00 Inbox/КР - Персептрон.md",
"mode": "source",
"source": false,
"backlinks": false
},
"type": "empty",
"state": {},
"icon": "lucide-file",
"title": "КР - Персептрон"
"title": "New tab"
}
}
]
@@ -257,11 +252,31 @@
"obsidian-excalidraw-plugin:New drawing": false
}
},
"active": "85ff070f2dda5843",
"active": "f669bd78b6310606",
"lastOpenFiles": [
"99 System/Cache/Pasted image 20260515090441.png",
"99 System/Cache/Pasted image 20260515090401.png",
"99 System/Cache/Pasted image 20260515090322.png",
"99 System/Archive/Ruby - массивы.md",
"90 Library/06 Programming/Ruby - массивы.md",
"99 System/Cache/Pasted image 20260517203352.png",
"99 System/Cache/Pasted image 20260517203317.png",
"99 System/Cache/Pasted image 20260517203304.png",
"99 System/Cache/Pasted image 20260517203259.png",
"99 System/Cache/Pasted image 20260517203252.png",
"99 System/Cache/Pasted image 20260517203235.png",
"99 System/Cache/Pasted image 20260517203218.png",
"99 System/Cache/Pasted image 20260517203153.png",
"99 System/Cache/Pasted image 20260517203130.png",
"99 System/Cache/Pasted image 20260517200426.png",
"99 System/Archive/Ruby - основы языка.md",
"90 Library/06 Programming/Ruby - основы языка.md",
"00 Inbox/Infrastructure.md",
"99 System/Cache/infra.excalidraw.md.md",
"99 System/Archive/КР - Хопфилд.md",
"99 System/Archive/КР - Персептрон.md",
"99 System/Archive/КР - Кохонен.md",
"99 System/Cache/Drawing 2026-05-17 13.43.55.excalidraw.md",
"99 System/Cache/Drawing 2026-05-17 14.13.00.excalidraw.md",
"00 Inbox/КР - Персептрон.md",
"00 Inbox/Лайфхак для NPM. Как проксировать не на поддомен а на под путь.md",
"КР - Все темы.md.tmp.122479.370c365f038f",
"КР - Все темы.md.tmp.122479.c53da0b5a00d",
"КР - Все темы.md",
@@ -279,32 +294,12 @@
"00 Inbox/КР - Хопфилд.md",
"90 Library/11 Machine Learning/Персептрон.md",
"00 Inbox/КР - Кохонен.md",
"00 Inbox/КР - Персептрон.md",
"99 System/Cache/Drawing 2026-05-14 17.24.16.excalidraw.md",
"99 System/Cache/Drawing 2026-05-14 17.10.42.excalidraw.md",
"99 System/Cache/Drawing 2026-05-14 17.02.08.excalidraw.md",
"99 System/Cache/Pasted image 20260514152547.png",
"99 System/Cache/Pasted image 20260514152232.png",
"99 System/Cache/Drawing 2026-05-14 15.21.19.excalidraw.md",
"99 System/Cache/Drawing 2026-05-14 15.06.37.excalidraw.md",
"00 Inbox/Алгоритм обучения персептрона.md",
"00 Inbox/Untitled.canvas",
"00 Inbox/Untitled Diagram.svg",
"90 Library/11 Machine Learning/Сеть Хэмминга.md",
"90 Library/11 Machine Learning/Сеть Хопфилда.md",
"90 Library/11 Machine Learning/Обратное распространение ошибки.md",
"90 Library/11 Machine Learning/Нейронные сети.md",
"01 Ideas/Идея от 2026-05-14.md",
"CLAUDE.md",
"99 System/Cache/Pasted image 20260514123429.png",
"90 Library/09 Sport/L-карнитин.md",
"00 Inbox/Нейронная сеть хемминга.md",
"99 System/Archive/Функционирование сети Хопфилда.md",
"99 System/Archive/Нейронная сеть хемминга.md",
"99 System/Cache/Pasted image 20260514120654.png",
"99 System/Cache/Pasted image 20260514115340.png",
"00 Inbox/Функционирование сети Хопфилда.md",
"99 System/Cache/Pasted image 20260512225511.png",
"99 System/Cache/Pasted image 20260512225452.png"
"00 Inbox/Untitled.canvas"
]
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
-158
View File
@@ -1,158 +0,0 @@
---
status: seed
type: concept
tags: []
created: 2026-05-14
updated: 2026-05-15
title: КР - Хэмминг
---
# КР - Хэмминг
## Что могут спросить
1. Что такое сеть Хэмминга и для чего она нужна?
2. Что такое расстояние Хэмминга?
3. Какая архитектура у сети Хэмминга?
4. Как задаются веса первого слоя?
5. Зачем нужен второй слой?
6. Как работает взаимное торможение нейронов?
7. Почему сеть Хэмминга экономнее сети Хопфилда?
8. Чем сеть Хэмминга отличается от сети Хопфилда?
## Краткий ответ
**Сеть Хэмминга** - нейронная сеть ассоциативной памяти, которая выбирает ближайший эталонный образ. Она не восстанавливает образ полностью, а определяет, какому эталону или классу соответствует вход.
Идея: найти эталон с минимальным расстоянием Хэмминга до входного вектора.
## Расстояние Хэмминга
Расстояние Хэмминга - число позиций, в которых два бинарных вектора отличаются.
Пример:
$$
X=(1,0,1,1),\quad Y=(1,1,0,1)
$$
Отличаются 2 позиции, значит:
$$
d_H(X,Y)=2
$$
Для бинарных векторов:
$$
d_H(X,Y)=\sum\limits_{i=1}^{n}[x_i\neq y_i]
$$
## Архитектура
Сеть состоит из двух слоёв:
1. **Первый слой** - сравнивает входной образ со всеми эталонами.
2. **Второй слой** - реализует конкуренцию между эталонами и оставляет одного победителя.
Если есть $m$ эталонов, то в первом и втором слоях по $m$ нейронов.
Нейроны первого слоя имеют $n$ входов, где $n$ - размерность образа.
Во втором слое:
- связь нейрона с самим собой имеет вес $+1$;
- связи с другими нейронами имеют отрицательный вес $-\varepsilon$;
- параметр $\varepsilon$ выбирают так:
$$
0<\varepsilon<\frac{1}{m}
$$
![[Pasted image 20260515090441.png]]
## Инициализация
Пусть $x_i^k$ - $i$-й элемент $k$-го эталонного образа.
Веса первого слоя:
$$
w_{ik}=\frac{x_i^k}{2}
$$
Порог:
$$
T_k=\frac{n}{2}
$$
Сдвигает диапазон выхода в $[0, n]$: при полном совпадении с эталоном $y_k^{(1)}=n$, при полном несовпадении — $0$.
где:
- $i=0,\dots,n-1$;
- $k=0,\dots,m-1$;
- $n$ - размерность входного образа;
- $m$ - число эталонов.
## Алгоритм функционирования
1. На вход подаётся неизвестный вектор:
$$
X=\{x_i:i=0,\dots,n-1\}
$$
2. Первый слой вычисляет начальную близость входа к каждому эталону:
$$
y_j^{(1)}=s_j^{(1)}=\sum\limits_{i=1}^{n-1}w_{ij}x_i+T_j,\ j=\overline{0,m-1}
$$
3. Эти значения передаются во второй слой:
$$
y_j^{(2)}=y_j^{(1)}
$$
4. Во втором слое запускается конкуренция:
$$
s_j^{(2)}(p+1)=y_j^{(2)}(p)-\varepsilon\sum\limits_{\substack{k=0\\k\neq j}}^{m-1}y_k^{(2)}(p)
$$
5. Затем применяется пороговая функция:
$$
y_j^{(2)}(p+1)=f(s_j^{(2)}(p+1))
$$
6. Итерации продолжаются, пока выходы второго слоя не стабилизируются.
В конце активным должен остаться один нейрон. Его номер соответствует ближайшему эталону.
## Смысл второго слоя
Второй слой нужен для выбора победителя. Нейроны взаимно тормозят друг друга: чем сильнее активен один кандидат, тем сильнее он подавляет остальных.
В итоге остаётся нейрон, соответствующий эталону с наибольшей похожестью и минимальным расстоянием Хэмминга.
## Почему первый слой условный
Первый слой используется только один раз - чтобы посчитать начальные значения похожести. После этого сеть работает только со вторым слоем.
Поэтому первый слой можно заменить матрицей весов и обычным вычислением близости.
## Отличие от сети Хопфилда
| Сеть | Что делает | Результат |
|---|---|---|
| Хопфилда | восстанавливает образ | полный эталонный вектор |
| Хэмминга | сравнивает с эталонами | номер ближайшего эталона |
Сеть Хэмминга обычно требует меньше памяти и вычислений, потому что ей не нужно восстанавливать весь образ через полную рекуррентную динамику.
## Мини-ответ на контрольной
Сеть Хэмминга - сеть ассоциативной памяти для выбора ближайшего эталонного образа. Она основана на расстоянии Хэмминга, то есть числе несовпадающих битов. Первый слой вычисляет близость входа к каждому эталону, второй слой через отрицательные обратные связи подавляет слабые варианты. В результате активным остаётся один выходной нейрон, соответствующий ближайшему образцу.
@@ -0,0 +1,58 @@
---
status: seed
type: guide
tags:
- admin
- nginx
- reverse-proxy
- homelab
created: 2026-05-18
updated: 2026-05-18
title: Nginx Proxy Manager под path
source: "[[Лайфхак для NPM. Как проксировать не на поддомен а на под путь]]"
---
# Nginx Proxy Manager под path
Кейс: сервис нужно опубликовать не на отдельном поддомене вида `service.domain.ru`, а в подкаталоге основного домена: `domain.ru/<path>`.
## Решение
В Nginx Proxy Manager нужно добавить `location` для нужного маршрута и в дополнительных настройках срезать prefix перед проксированием:
```nginx
rewrite ^/<path>/?(.*)$ /$1 break;
```
Смысл правила:
- пользователь открывает `domain.ru/<path>/...`;
- Nginx убирает `/<path>` из URI;
- upstream получает путь так, будто сервис открыт в корне `/`.
## Когда это нужно
Подход полезен, если:
- не хочется заводить отдельный поддомен под мелкий сервис;
- сервис живет за reverse proxy в homelab;
- внешний URL должен быть компактным;
- нужно спрятать несколько внутренних сервисов за одним доменом.
## Ограничения
Не каждый сервис нормально работает под path-prefix. Возможные проблемы:
- абсолютные ссылки на `/assets`, `/api`, `/static`;
- WebSocket-маршруты;
- OAuth/callback URL;
- hardcoded base URL внутри приложения;
- редиректы на `/`, из-за которых пользователь выпадает из `/<path>`.
Если приложение поддерживает настройку base path/base URL, лучше указать ее явно. Rewrite в proxy — рабочий хак, но не полноценная замена поддержке subpath внутри приложения.
## Связанные заметки
- [[Infrastructure — ada-dev]] — где NPM используется как публичный и локальный reverse proxy.
- [[CA и NGINX]] — TLS и базовая настройка Nginx.
- [[Docker - Дополнительные знания]] — эксплуатация сервисов в контейнерах.
@@ -0,0 +1,97 @@
---
status: seed
type: knowledge
tags:
- programming
- ruby
created: 2026-05-17
updated: 2026-05-17
title: Ruby - массивы
source: "[[Ruby - массивы]]"
---
# Ruby — массивы
Массив в Ruby — экземпляр класса `Array`. Поскольку массивы являются объектами со своими методами, работа со списками данных упрощается.
Связанные темы: [[Ruby - основы языка]]
## Создание массива
```ruby
a1 = [1, 2, 3] # литерал
a2 = %w{word1 word2} # массив строк без кавычек
a3 = ['start', nil, 5, [1, 2]] # разнотипные элементы, вложенный массив
a4 = Array.new # пустой массив
a5 = Array.new(3) # [nil, nil, nil]
a6 = Array.new(5, "Test") # ["Test", "Test", ...]
a7 = Array.new(5) { |i| i * i } # [0, 1, 4, 9, 16]
a8 = Array.[](1, 'a', /^A/) # через метод класса
```
Ruby поддерживает многомерные массивы с элементами разной размерности.
## Индексация
```ruby
a[0] # первый элемент
a[-1] # последний элемент
a[-2] # предпоследний
```
### Размер
```ruby
a.size # количество элементов
a.length # синоним size
```
## Поиск элементов
```ruby
a.include?(obj) # => true / false
a.index(obj) # индекс первого вхождения или nil
```
## Добавление элементов
```ruby
a << 4 # в конец
a += [5] # объединение
a.push(6) # в конец (синоним: append)
a.unshift(0) # в начало (сдвигает остальные вправо)
a.insert(2, x) # вставить перед элементом с индексом 2
```
## Удаление элементов
```ruby
a.delete(obj) # удалить все вхождения obj
a.delete_at(index) # удалить по индексу
a.delete_if { |x| block } # удалить все, подходящие под условие
a.shift # удалить и вернуть первый элемент
a.pop # удалить и вернуть последний элемент
```
## Срезы
```ruby
a[1..3] # диапазон индексов
a[1, 3] # начиная с индекса 1, длиной 3
a.values_at(0, 2, 4) # элементы по перечисленным индексам или диапазонам
a.first(n) # первые n элементов
a.last(n) # последние n элементов
```
## Полезные методы
```ruby
a.flatten # развернуть многомерный массив в одномерный
a.flatten! # то же, но изменяет сам массив
a.sample # случайный элемент
a.sample(n) # n случайных элементов
a.select { |x| block } # массив элементов, для которых block == true
```
@@ -0,0 +1,121 @@
---
status: seed
type: knowledge
tags:
- programming
- ruby
created: 2026-05-17
updated: 2026-05-17
title: Ruby - основы языка
source: "[[Ruby - основы языка]]"
---
# Ruby — основы языка
Ruby — объектно-ориентированный язык, но допускает процедурный стиль написания кода. Всё является объектом, включая числа и булевы значения.
Связанные темы: [[Ruby On Rails]]
## Синтаксис
- Знак препинания в конце строки не нужен
- Отступы не несут синтаксического смысла (в отличие от Python)
- Несколько команд в одной строке разделяются через `;`
```ruby
puts "Hello World!"
puts 42; puts "next line"
```
## Комментарии
```ruby
# однострочный комментарий
=begin
многострочный
комментарий
=end
```
## Типы данных
```ruby
"Hello".class # => String
true.class # => TrueClass
5.class # => Integer
6.4.class # => Float
nil.class # => NilClass
```
### Именование
- Переменные — с маленькой буквы: `my_var`
- Классы — с большой буквы: `MyClass`
- Ключевые слова языка использовать нельзя
### Преобразование типов
**Явное:**
| Метод | Что делает |
|--------|-----------------------------------------|
| `to_i` | к целому числу (дробная часть отсекается) |
| `to_f` | к вещественному числу |
| `to_s` | к строке |
**Неявное:** при математических операциях `Integer + Float``Float`.
## Управляющие конструкции
```ruby
# if без ветвления
if a > 0
action
end
# if-elsif-else
if a > 0
...
elsif a == 0
...
else
...
end
# unless — выполнится, если условие ложно
unless a > 0
action
end
# case
case a
when 1 then puts "один"
when 2 then puts "два"
else puts "другое"
end
```
## Циклы
| Оператор | Назначение |
|----------|-----------|
| `loop` | бесконечный цикл; выход через `break` |
| `while` | цикл с условием выполнения |
| `until` | цикл, пока условие ложно |
| `for` | итератор по перечислимому объекту |
| `next` | пропустить текущий шаг |
| `redo` | повторить текущий шаг заново |
**Диапазоны в `for`:**
```ruby
for i in 1..5 # от 1 до 5 включительно
for i in 1...5 # от 1 до 4 (5 не входит)
```
**Деление с остатком:**
```ruby
x, r = x.divmod(n)
```
@@ -0,0 +1,118 @@
---
status: seed
type: concept
tags:
- homelab
- infrastructure
- devops
created: 2026-05-18
updated: 2026-05-18
title: Infrastructure — ada-dev
source: "[[Infrastructure]]"
---
# Infrastructure — ada-dev
Заметка фиксирует текущую схему homelab-инфраструктуры `ada-dev`: публичный VPS, домашние узлы, reverse proxy, overlay-сеть и пользовательские сервисы.
![[infra.excalidraw.md.md|950]]
## Общая схема
Инфраструктура состоит из трех ключевых зон:
- `Internet` — внешний доступ пользователей.
- `ru-vps` с белым IP — публичная точка входа.
- локальные узлы `mini-pc` и `cloud-pc`, связанные с VPS через ZeroTier overlay network.
VPS принимает внешний трафик и проксирует его дальше. Домашние сервисы не обязаны напрямую светиться в интернет: доступ к ним можно строить через публичный [[CA и NGINX|Nginx]]/NPM и приватную overlay-сеть.
## Узлы
### ru-vps
`ru-vps` — публичный сервер с белым IP. На схеме он выполняет роль внешнего шлюза:
- `NPM (публичный)` — reverse proxy для публичных доменов и маршрутов;
- `Nginx (80, 443)` — входная точка HTTP/HTTPS;
- `ufw` — базовый firewall;
- `ZeroTier` — связь с домашним сегментом;
- `Portainer Agent` — управление контейнерной средой через Portainer.
Практический смысл VPS — держать наружу только минимальный набор портов и не раскрывать домашнюю сеть напрямую.
### mini-pc
`mini-pc` описан как `N150 / 12 GB / 256 GB`. По схеме это небольшой домашний узел для инфраструктурных сервисов:
- `AdGuard Home`;
- `NPM (локальный)`;
- `Vaultwarden`;
- `ZeroTier`;
- `Portainer Agent`.
Логика узла: локальная инфраструктура и сервисы, которым полезно быть рядом с домашней сетью.
### cloud-pc
`cloud-pc` описан как `i5 / 16 GB / 256 GB + 5 TB`. Это более крупный узел для сервисов и хранения:
- `Portainer Server`;
- `Cockpit`;
- `Gitea + Registry`;
- `Gitea Actions Runner`;
- `Nextcloud`;
- `SMB/BU/Files (5 TB HDD)`;
- `ZeroTier`.
Логика узла: сервисы разработки, файлы, backup/storage и управление контейнерами.
## Сетевой слой
ZeroTier используется как overlay-сеть между VPS и домашними узлами. Это позволяет:
- проксировать трафик с публичного VPS на локальные сервисы;
- не открывать сервисные порты домашней сети наружу;
- держать управление и межузловые соединения в приватном сегменте;
- упростить маршрутизацию между VPS, `mini-pc` и `cloud-pc`.
`ufw` на VPS должен ограничивать внешний периметр. Базовая модель: наружу открыты только необходимые публичные порты, а внутренние сервисы доступны через ZeroTier и reverse proxy.
## Reverse proxy
На схеме есть два уровня NPM:
- `NPM (публичный)` на VPS — отвечает за публичный доступ;
- `NPM (локальный)` на `mini-pc` — может обслуживать локальные маршруты и внутренние сервисы.
Такой подход полезен, если нужно разделить внешний и внутренний контуры. Публичный NPM принимает домены из интернета, локальный NPM может маршрутизировать сервисы внутри homelab.
Смежная заметка: [[Nginx Proxy Manager под path]].
## Сервисы
Ключевые пользовательские сервисы:
- `Vaultwarden` — self-hosted password manager;
- `Gitea + Registry` — Git-сервер и container registry;
- `Gitea Actions Runner` — CI runner;
- `Nextcloud` — файловая синхронизация;
- `SMB/BU/Files` — файловое хранилище и backup на 5 TB HDD;
- `AdGuard Home` — DNS/ad blocking;
- `Cockpit` — web-управление сервером;
- `Portainer Server/Agent` — управление контейнерами.
## Замечания по устойчивости
- Публичный VPS — критическая точка входа. Если он падает, внешний доступ к сервисам пропадает, даже если домашние узлы живы.
- ZeroTier — критическая зависимость для связности между VPS и домашними узлами.
- `cloud-pc` несет сразу несколько ролей: Git, registry, runner, Nextcloud и storage. Для важных данных нужен отдельный backup-контур.
- `Vaultwarden` стоит держать максимально изолированным: отдельный volume, backup, HTTPS, минимальный доступ к админке.
## Связанные заметки
- [[CA и NGINX]] — TLS-сертификаты и Nginx как входной HTTP/HTTPS-слой.
- [[VPN]] — близкая идея приватного сетевого контура.
- [[Docker - Дополнительные знания]] — контейнерная эксплуатация сервисов.
- [[Основы - Docker]] — базовая модель контейнеризации.
- [[DevOps - основы]] — инфраструктура, автоматизация и эксплуатация.
@@ -0,0 +1,381 @@
---
status: seed
type: guide
tags:
- finance
- investments
- bonds
- funds
- gold
created: 2026-05-18
updated: 2026-05-18
title: База инвестора
source:
- "[[78e94a8b-66be-410f-8618-0345ff3918e5]]"
- "[[8e65f8ca-b8eb-4e10-97e1-fde245b1c9c4]]"
- "[[a2713c5f-1e6b-429c-98cc-710b179bc017]]"
- "[[a5d627bd-c616-43bb-8490-bdeef3f27d15]]"
- "[[b280330d-7651-4a92-856c-869ab2b317db]]"
- "[[b4100a43-8a47-4dad-923f-39fb309c849e]]"
- "[[b63b403c-1855-498f-8866-2052120fff61]]"
- "[[be737cd3-f448-4b6c-b765-8097229f153f]]"
- "[[db7c2cfc-acde-4abe-a59e-87ab4a232034]]"
- "[[e74de470-d705-4000-80d0-5daecd564267]]"
---
# База инвестора
Инвестиционный портфель строится от цели, горизонта и риск-профиля. Отдельные инструменты — облигации, фонды, золото, акции — имеют смысл только внутри структуры портфеля.
Не является индивидуальной инвестиционной рекомендацией.
## Базовый алгоритм
1. Определить цель и горизонт: зачем инвестировать и когда нужны деньги.
2. Определить риск-профиль: какую просадку портфеля реально выдержать без паники.
3. Выбрать стиль: пассивный, активный или трейдинг.
4. Выбрать стратегию: индексная, дивидендная, value, growth, облигационная, защитная.
5. Собрать портфель из классов активов, а не из случайных идей.
6. Проверить налоги, комиссии, ликвидность, валютные и кредитные риски.
7. Периодически ребалансировать портфель, но не дергать его из-за каждого рыночного шума.
## Риск-профиль
Риск-профиль складывается из трех блоков:
- готовность к риску: отношение к волатильности, прошлый опыт, эмоциональная устойчивость;
- возможность риска: стабильность дохода, финансовая подушка, обязательства и долги;
- цель: горизонт инвестирования и требуемая доходность.
Типовые профили:
| Профиль | Цель | Комфортная просадка | Типовая структура |
|---|---|---:|---|
| Консервативный | сохранность капитала | просадка больше 5% уже дискомфортна | облигации 85-90%, акции 10-15% |
| Умеренный | баланс риска и доходности | 15-20% без паники | акции 60%, облигации 40% |
| Агрессивный | максимальный рост | готовность к просадкам больше 30% | акции 80-100% |
Из другого источника: консервативный инвестор может ориентироваться на просадку до 15%, умеренный — до 35%, агрессивный — до 60%. Это не противоречие, а разные шкалы грубости. Практический вывод: риск-профиль лучше задавать не красивым названием, а конкретной максимальной просадкой в рублях и процентах.
## Стили инвестирования
- Долгосрочный/пассивный инвестор — тратит до пары часов в месяц, держит качественные активы и фонды.
- Активный инвестор — тратит несколько часов в неделю, следит за макроэкономикой, секторами и идеями.
- Трейдер — работает с рынком почти ежедневно, зависит от графиков, новостей, дисциплины и риск-менеджмента.
Риск-профиль должен ограничивать стиль. Консерватору логичнее пассивная база и надежные инструменты. Умеренный профиль допускает пассивную базу и часть активных идей. Агрессивный профиль может использовать активные стратегии и трейдинг, если есть время и навык.
## Психологические ловушки
- стадное чувство;
- FOMO и эмоциональный трейдинг;
- отсутствие диверсификации;
- инвестирование на заемные средства;
- погоня за максимальной доходностью без понимания риска;
- вера, что знакомая компания автоматически надежна.
## Макроэкономика и портфель
Цены активов зависят от будущих доходов, ставок, роста экономики, инфляции, курса рубля и геополитической премии за риск.
Ключевые индикаторы:
- ВВП, бизнес-настроения, безработица, зарплаты и спрос;
- инфляция годовая и текущая;
- ключевая ставка, доходности ОФЗ и корпоративных облигаций;
- курс рубля;
- нефть, газ, золото, промышленные металлы, удобрения;
- бюджетная политика и налоги.
Для российского рынка после ухода значительной части нерезидентов важнее стали внутренние драйверы: прибыль компаний, ставки, инфляция, бюджет, розничные инвесторы. Доля экспортеров в капитализации снизилась примерно до 50%, но сырье и курс рубля все еще важны.
Практические зависимости:
- снижение ставок обычно поддерживает акции и длинные облигации;
- рост ставок давит на длинные облигации и повышает привлекательность денежного рынка;
- ослабление рубля поддерживает экспортеров и валютные/квазивалютные инструменты;
- высокая инфляция повышает значимость флоатеров, линкеров и защитных активов;
- геополитическая неопределенность увеличивает риск-премию и волатильность.
## Облигации
Облигация — долговой инструмент: инвестор дает деньги эмитенту, получает купоны и возврат номинала при погашении. Главная идея: доход предсказуемее, чем в акциях, но риск не нулевой.
Базовые понятия:
- эмитент — государство, регион, муниципалитет или компания;
- номинал — сумма, которую вернут при погашении;
- купон — процентное вознаграждение;
- дата погашения — момент возврата номинала;
- доходность к погашению — ожидаемая доходность при удержании до погашения и реинвестировании купонов;
- дюрация — средний срок возврата денег и чувствительность цены к изменению доходности;
- оферта — возможность досрочного выкупа.
Важный принцип: смотреть нужно не только на купон, а на доходность к погашению/оферте. Большой купон не означает хорошую сделку, если бумага куплена сильно выше номинала.
## Виды облигаций
По эмитенту:
- ОФЗ — федеральные облигации, базовый надежный рублевый инструмент;
- муниципальные облигации — выше доходность, ниже ликвидность и выше риск, чем у ОФЗ;
- корпоративные облигации — выше доходность за счет кредитного риска компании.
По погашению номинала:
- обычное погашение в конце срока;
- амортизация — номинал возвращается частями, купонная база постепенно уменьшается;
- индексируемый номинал — номинал растет вместе с инфляцией.
По купону:
- фиксированный купон — предсказуемые выплаты;
- плавающий купон/флоатер — купон зависит от RUONIA, ключевой ставки, инфляции или другого индикатора;
- флоатеры полезны при риске роста ставки, но при снижении ставки купоны уменьшаются.
По валюте:
- рублевые облигации;
- замещающие и квазивалютные облигации — выплаты в рублях, но привязка к валюте;
- юаневые облигации — валютная диверсификация в российской инфраструктуре.
Отдельные рискованные типы:
- субординированные облигации — ниже в очереди кредиторов, возможна отмена выплат;
- ипотечные облигации — обеспечены ипотечными платежами, есть риск досрочного погашения;
- ВДО — высокодоходные облигации с повышенным риском дефолта;
- золотые облигации — номинал и купон привязаны к цене золота.
## Дюрация и ставка
Цена облигации обратно зависит от рыночной доходности и ключевой ставки:
- ставка растет — старые облигации дешевеют;
- ставка падает — старые облигации дорожают;
- чем выше дюрация, тем сильнее реакция цены.
Пример логики: ОФЗ с дюрацией 5 лет может дать около 5% переоценки при снижении доходности на 1 п.п. Поэтому длинные облигации — это не просто "надежно", а ставка на снижение ставок. Если ставка неожиданно вырастет, длинная бумага даст временную просадку.
## Как выбирать облигации
Чек-лист:
1. Оценить доходность к погашению или оферте.
2. Сравнить доходность с ОФЗ сопоставимого срока через кредитный/G-spread.
3. Проверить кредитный рейтинг: на старте разумнее AAA-AA, для более рискованных идей не ниже A.
4. Проверить долговую нагрузку эмитента: Net Debt/EBITDA, динамику выручки, прибыли и процентного покрытия.
5. Выбрать срок под свой горизонт. Деньги нужны через 2 года — не покупать 10-летнюю бумагу только ради доходности.
6. Проверить ликвидность через объем торгов.
7. Диверсифицировать по эмитентам и отраслям.
8. Не пропускать оферты и пересмотр купона.
Красные флаги:
- рейтинг BB и ниже;
- отсутствие рейтинга;
- доходность сильно выше рынка без понятной причины;
- маленький выпуск до 1 млрд рублей;
- высокая долговая нагрузка;
- долги по налогам;
- странные сделки;
- оборотный капитал растет быстрее выручки;
- бизнес непонятен инвестору.
## Стратегии в облигациях
### Держать до погашения
Покупать облигации со сроком, близким к финансовой цели. Это снижает риск вынужденной продажи по плохой цене. Кредитный риск остается, поэтому важен надежный эмитент.
### Лестница облигаций
Покупать выпуски с разными сроками погашения. Деньги от погашений направлять в новые длинные выпуски. Плюсы: часть портфеля регулярно высвобождается, доходность фиксируется на долгий срок, купоны приходят регулярно.
### Золотовалютный доход
Использовать замещающие, квазивалютные, юаневые или золотые облигации для защиты от слабости рубля.
### "Зарплата" на облигациях
Идея — собрать портфель так, чтобы купоны приходили каждый месяц. Это не покупка одной бумаги с большим купоном, а структурирование денежных потоков.
Варианты:
- 1.0: фиксированные купоны — максимальная предсказуемость;
- 2.0: фиксированные купоны + флоатеры — регулярность и защита от роста ставки;
- 3.0: фиксированные купоны + флоатеры + валютные облигации — добавляется валютная диверсификация.
Пример принципа сборки:
- фиксированные — 40%;
- флоатеры — 30%;
- валютные — 30%.
Адаптация под задачу:
- процентный баланс: фиксированные 40%, флоатеры 40%, валютные 20%;
- двойная фиксация ставок: фиксированные 50%, валютные 50%;
- следование за циклом: флоатеры 50%, валютные 50%.
Вывод: регулярный доход требует структуры и дисциплины. Погоня за максимальным купоном часто заканчивается концентрацией кредитного риска.
## Высокодоходные облигации
ВДО — облигации компаний с рейтингом BBB+ и ниже, небольших бизнесов, компаний с высокой долговой нагрузкой или нестабильной моделью.
Для начинающего инвестора чаще всего не подходят. Причина простая: высокая доходность — компенсация за высокий риск, а не подарок рынка.
Что проверять в ВДО:
- чем занимается компания;
- рынок и устойчивость бизнес-модели;
- история бенефициаров;
- выручка и ее динамика;
- долговая нагрузка;
- долги по налогам;
- странные сделки;
- качество оборотного капитала.
Главная задача начинающего инвестора — не максимальная доходность, а предсказуемый и стабильный портфель.
## Фонды
Фонд — коллективный портфель активов. Инвестор покупает пай и получает долю в портфеле, которым управляет управляющая компания.
Плюсы фондов:
- диверсификация внутри одного инструмента;
- низкий порог входа;
- профессиональное управление;
- ликвидность биржевых фондов;
- налоговая эффективность внутри фонда;
- автоматическое реинвестирование купонов и дивидендов, если фонд не делает выплаты;
- доступ к инструментам, которые сложно собрать самому.
Минусы:
- комиссия управления;
- риск ошибки слежения;
- зависимость от качества УК;
- один фонд редко решает все задачи портфеля.
## Как выбирать фонд
Чек-лист:
- комиссия фонда;
- ошибка слежения за индексом;
- способ репликации: физическая предпочтительнее сложной двойной структуры;
- размер активов под управлением;
- состав и веса активов;
- история фонда и поведение в кризисы;
- ликвидность паев;
- соответствие фонда текущей фазе экономического цикла.
Типы фондов:
| Тип | Когда полезен | Риск | Горизонт |
|---|---|---|---|
| Денежный рынок | временное размещение денег, высокая ставка | низкий | до года |
| ОФЗ | снижение ставки, надежная облигационная база | низкий/средний из-за дюрации | от года |
| Корпоративные облигации | премия за кредитный риск, стабильная экономика | средний | 1-3 года |
| Валютные облигации | защита от ослабления рубля | средний | от года |
| Золото | защитный актив и валютный риск | средний | от года |
| Российские акции | рост капитала | высокий | от 3 лет |
| Недвижимость | альтернативный доход | средний | от 3 лет |
| Венчур | ставка на быстрый рост частных компаний | высокий | от 5 лет |
## Фонды и ставка
Фонд денежного рынка хорош, когда ставка высокая или растет: он дает ликвидность и ежедневный положительный доход, но не фиксирует высокую доходность на годы.
Фонды ОФЗ и длинных облигаций интереснее при ожидании снижения ставки: цена облигаций растет, но дюрация добавляет волатильность.
Корпоративные облигационные фонды дают премию за кредитный риск. Их логичнее использовать в стабильные периоды и при горизонте от года.
Валютные облигационные фонды нужны для снижения риска ослабления рубля, но результат зависит от курса и рублевых ставок.
## Золото
Золото — защитный актив, который используют для снижения риска портфеля в кризисы, периоды высокой инфляции, геополитической нестабильности и валютных шоков.
Драйверы золота:
- ослабление доллара;
- реальные процентные ставки;
- высокая инфляция;
- геополитическая нестабильность;
- спрос центробанков;
- ювелирный и промышленный спрос;
- инвестиционный спрос.
После 2022 года мировые центробанки заметно нарастили покупки золота, снижая долю резервов в государственных облигациях США. Доля центробанков в мировом спросе стала выше прежней.
Практическое правило из материалов: около 10% золота в портфеле может улучшать соотношение доходности и риска. Это не жесткая норма, а ориентир для защитной доли.
## Как инвестировать в золото
Инструменты:
- слитки и монеты;
- биржевое золото;
- фонды на золото;
- акции и облигации золотодобытчиков;
- золотые облигации.
Сравнение:
| Инструмент | Плюсы | Минусы |
|---|---|---|
| Слитки и монеты | независимость от брокера, нет НДС при покупке | спред покупки/продажи, хранение, повреждения снижают цену |
| Биржевое золото | высокая ликвидность, быстро купить/продать | комиссия брокера/хранения |
| Фонд на золото | низкий порог входа, ликвидность | комиссия управления |
| Акции/облигации золотодобытчиков | потенциально выше доходность, дивиденды/купоны | риск компании и фондового рынка |
Налоговая логика из материалов:
- налог платится с дохода от продажи золотого инструмента;
- при владении золотом, биржевым золотом и фондами больше 3 лет может применяться освобождение;
- для акций и облигаций применимы стандартные правила налогообложения и льгота долгосрочного владения.
## ИИС-3
ИИС-3 — налоговая оболочка для инвестиций.
Ключевые параметры из материалов:
- комбинированная льгота: вычет на взнос и вычет на доход;
- можно открыть до трех ИИС-3;
- нет лимита на пополнение;
- минимальный срок владения для счетов 2024-2026 годов — 5 лет, далее срок поэтапно увеличивается;
- можно вывести деньги на дорогостоящее лечение с сохранением права на льготы;
- можно выводить дивиденды на банковский счет;
- с 2026 года активы на ИИС-3 застрахованы до 1,4 млн рублей у брокеров и УК, участвующих в системе возмещения.
## Практическая структура портфеля
Для старта разумнее строить не "портфель идей", а портфель ролей:
- ликвидная часть: денежный рынок, короткие ОФЗ, кэш;
- защитная часть: ОФЗ, надежные облигации, золото;
- доходная часть: корпоративные облигации инвестиционного уровня;
- ростовая часть: акции или фонды акций;
- валютная защита: замещающие/квазивалютные/юаневые облигации, золото.
Минимальный здравый подход:
- не брать плечи;
- не начинать с ВДО;
- не концентрироваться в одном эмитенте;
- не покупать длинные облигации без понимания дюрации;
- не держать весь портфель в одном классе активов;
- фиксировать причину покупки до сделки.
## Связанные заметки
- [[Производные финансовые инструменты]] — отдельный класс финансовых инструментов с другой природой риска.
- [[Налог на доходы физических лиц (НДФЛ)]] — налогообложение инвестиционного дохода.
- [[Налоговые вычеты]] — налоговые льготы, включая инвестиционные вычеты.
- [[Экономическая безопасность - база]] — макроэкономический контекст: инфляция, ВВП, финансовая устойчивость.
- [[Бухгалтерский баланс]] — анализ долговой нагрузки и финансового состояния компании.
- [[Отчет о финансовых результатах]] — прибыль, выручка и показатели бизнеса.
+11
View File
@@ -0,0 +1,11 @@
---
status: seed
type: concept
tags: []
created: 2025-12-17
updated: 2026-05-17
title: Infrastructure
---
# Infrastructure
![[infra.excalidraw.md|950]]
@@ -0,0 +1,88 @@
---
status: seed
type: concept
tags: []
created: 2025-12-17
updated: 2026-05-17
title: Ruby - массивы
---
# Ruby - массивы
Массив в Ruby - эксземпляр класса **Array**
Поскольку массивы являются объектами со своими методами, то это позволяет облегчить работу со списками данных.
Массив задается с использованием квадратных скобок, но не только.
```ruby
a1 = [...]
a2 = %w{word1 word2}
a3 = ['start', nil, 5, [...]]
a4 = Array.new
a5 = Array.new(3)
a6 = Array.new(5, "Test")
a7 = Array.new(5) { |i| i*i }
a8 = Array.[](1, 'a', /^A/)
a9 = Array[1, 'a', /^A/]
```
Ruby позволяет создавать многомерные массивы, элементы которого могут иметь разную размерность.
![[Pasted image 20260517200426.png]]
## Индексация массива
Доступ к элементам массива в Ruby осуществляется путем указщания его индекса, при этом, есть поддержка отрицательных индексом для индексации с конца.
### Размеры массива
```ruby
size == length - синонимы, позволяют узнать количество элементов в массиве
```
### Поиск элементов массива
Метод `array.include?(obj)` возвращает `true`, если объект является элементом массива `array`. Иначе - `false`.
Метод `array.index(obj)` возвращает индекс первого вхождения элемента в массив `array`, который равен искомому. Возврат `nil`, если такой элемент не был найден.
### Добавление элементов в массив
```ruby
a = [1,2,3]
a << 4
a += [5]
a.push(6)
```
Метод `array.unshift(obj)` добавляет элемент в начало массива (со сдвигом вправо уже существующих).
Метод `array.push(obj)` добавляет элемент в конец массива (синоним - `append`).
`array.index(index, obj)` вставляет полученные значения перед элементом с индексом `index`.
### Разворачивание многомерного массива в одномерный
```ruby
array.flatten()
array.flatten!() # преобразует в одномерный, заменяя первоначальный
```
### Срезы массивов
1) Использование диапазонов при индексации
2) Использование индекса и длины подмассива
3) `array.values_at(selector)` - возвращает массив, который состоит из элементов массива `array`, которые соответствуют передаеваемым селекторам.
Селекторы могут быть целыми числами (индексами) или диапазонами.
4) `array.first(n)` и `array.last(n)`, которые возвращают первые (последние) `n` элементов.
### Операции с массивом
1) `array.sample(n)` выбор случайного элемента (или `n` элементов)
2) `array.select{ |item| block }` выполняет выражение `block` для каждого элемента массива и возвращает массив, состоящий из элементов, для которых выражение принимает значение true
### Удаление из массива
1) `array.delete(obj)` - удаляет все элементы массива, которые равны `obj`. Если ничего не было удалено, то -> `nil`
2) `array.delete_at(index)` удаляет элемент с индексом `index`.
3) `array.delete_if{ |item| block }` удаляет все элементы, полходящие под условие.
4) `array.shift` удаляет первый элемент из массива и возвращает его, если нет такого, то `nil`.
5) `array.pop` удаляет *последний* элемент из массива и возвращает его.
### Полезные методы
![[Pasted image 20260517203130.png]]
![[Pasted image 20260517203153.png]]![[Pasted image 20260517203218.png]]
![[Pasted image 20260517203235.png]]
![[Pasted image 20260517203252.png]]
![[Pasted image 20260517203317.png]]
![[Pasted image 20260517203352.png]]
@@ -0,0 +1,75 @@
---
status: seed
type: concept
tags: []
created: 2025-12-17
updated: 2026-05-17
title: Ruby - основы языка
---
# Ruby - основы языка
Пусть Ruby и объектно-ориентированный язык, можно с ним работать, как с обычным процедурным языком.
```ruby
puts "Hello World!"
```
Команда `puts` выводит что-угодно в консоль.
- В конце строк ставить знаки препинания не нужно
- Пробелы в начале строки ничего не значит, никакой табуляции
- Если нужно написать несколько команд в одной строке, то `;` заменит перенос строки по смыслу
## Комментарии
- Два вида комментариев:
- Однострочный - символ `#`
- Многострочный - конструкция =begin =end
## Типы данных
```ruby
puts "Hello".class -> String
puts true.class -> TrueClass
puts 5.class -> Integer
puts 6.4.class -> Float
putl nil.class -> NilClass
```
### Именование
- Переменные называются с маленькой буквы
- Классы, обратно, именуются с большой буквы
- Нельзя называть классы и переменные, используя ключевые слова языка
### Преобразование типов
- Явное (с помощью функций)
- `to_i` - к целому числу (отсечение дробной части для *float*)
- `to_s` - к строке
- `to_f` - к вещественному числу
- Неявное (преобразование в ходе работы программы) - авто преобразование при мат.операциях (int + float = float)
![[Pasted image 20260517175400.png]]
![[Pasted image 20260517175655.png]]
## Управляющие конструкции
В Ruby есть три основных оператора:
- if - без ветвления
`if a > 0 <action> end`
- if-elsif-else
- unless - сработает, если условие ложно
- case
![[Pasted image 20260517181450.png]]
### Операторы цикла
1) loop - бесконечный цикл (с условиями выхода break)
2) while - цикл с условием выполнения
3) next - прерывание шага цикла и моментальный переход на следующий шаг
4) until - цикл, пока условие ложно
5) redo - прерывание текущего шага и повторение его же
6) for - итератор перебора перечислимого объекта
- самый распространенный вариант - диапазоны:
- `n..m` - все целые от `n` до `m` *включительно*
- `n...m` - все числа не включая `m`
> ```ruby
> x, r = x.divmod
> ```
@@ -0,0 +1,14 @@
---
status: seed
type: concept
tags: []
created: 2025-12-17
updated: 2026-05-18
title: Лайфхак для NPM. Как проксировать не на поддомен а на под путь
---
# Лайфхак для NPM. Как проксировать не на поддомен а на под путь
Если нужно проксировать NPM не на поддомен, а на под "локацию" `domain.ru/<path>`, то нужно в location добавить нужный маршрут, но в доп.настройках укзать срез
```
rewrite ^/<path>/?(.*)$ /$1 break;
```
@@ -0,0 +1,227 @@
---
excalidraw-plugin: parsed
tags: [excalidraw]
---
==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== You can decompress Drawing data with the command palette: 'Decompress current Excalidraw file'. For more info check in plugin settings under 'Saving'
# Excalidraw Data
## Text Elements
Infrastructure — ada-dev ^VEaxMcZ9
Internet ^lkuFPfoY
ru-vps (белый IP) ^NrxGORQ0
NPM (публичный) ^DBp2U44i
Portainer Agent ^JtZ97off
ZeroTier ^lBDCIlzR
ufw ^Y2T0g0I8
Nginx (80, 443) ^eLuodDGv
ZeroTier overlay network ^WGOH8B3E
mini-pc N150 / 12 GB ^LTn3F3JW
AdGuard Home ^DLVQXQFf
NPM (локальный) ^hDXqqb6l
Vaultwarden ^eRsI074Q
ZeroTier ^B2kvJiQD
Portainer Agent ^xyaV3sGD
Cockpit ^ICBimDwY
Gitea Actions Runner ^MW2XuP5o
cloud-pc i5 / 16 GB / 5 TB ^CovPF4A1
Gitea + Registry ^ARo7afZk
Nextcloud ^pMLchFjl
ZeroTier ^xOh6rG9M
SMB/BU/Files (5 TB HDD) ^TgT6LjCy
Portainer Server ^jFHt0emi
Cockpit ^XPG4GRxG
управление ^jmHwNbIG
%%
## Drawing
```compressed-json
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
```
%%
@@ -0,0 +1,30 @@
---
excalidraw-plugin: parsed
tags: [excalidraw]
---
==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== You can decompress Drawing data with the command palette: 'Decompress current Excalidraw file'. For more info check in plugin settings under 'Saving'
# Excalidraw Data
## Text Elements
%%
## Drawing
```compressed-json
N4KAkARALgngDgUwgLgAQQQDwMYEMA2AlgCYBOuA7hADTgQBuCpAzoQPYB2KqATLZMzYBXUtiRoIACyhQ4zZAHoFAc0JRJQgEYA6bGwC2CgF7N6hbEcK4OCtptbErHALRY8RMpWdx8Q1TdIEfARcZgRmBShcZQUebR4AZm0ABho6IIR9BA4oZm4AbXAwUDBSiBJuCABWemIATSMAaVwABTTSyFhESsDsKI5lYPayzG5nAEYANgB2bSqAFgBORYAO
aenFnkXJtar+Mpgx8fnJ/cgKEnVuBIXtBOXthITplcXkyZ49oshJBEJlaTccZPbSTZLg97jZI3cZVD5nCDWQbiVDJBHMKCkNgAawQAGE2Pg2KRKgBicYICkU4aQTS4bDY5RYoQcYgEokkiSY6zMOC4QI5GkQABmhHw+AAyrAhhJBB4hRisbiAOqXSTcPjfCCKnEIKUwGXoOUVBHMgEccJ5NDjBFsPnYNSHa3ghFM4RwACSxCtqHyAF0EcLyFkvdw
OEJxQjCKysJVcKlTcJWRbmD6Sh1oPAUQlvgBfdEIBDEIEJca7ZKLJYIxgsdhcZ3VpisTgAOU4YiBiwS8yWu2mUeYABEMlAi9xhQQwgjNEniABRYJZHI+8ORrVCODEXCj4vW9ZvKYJFY8KHzBFEDjYsMR/DntgMsdoCf4MJFXPgAN0XBwOBS7co9NoF+LJKiIAEoGGBhCAQCgACF6UZZlWXZYkyWFdCMMg7ARAFKAPVHfQpSVfFCVQiRyUpSisJw7
I8II+CGTdFk2VIzl0G5DheX5WjqNIXD8MyAAxMVJWlFFtUJE0iggbC+NogTCMxXVVWIK40E1MpZP4giiN1fVDQk+V9hkmicgUgAlYRzUtIFjK0+SCIAeXtR0gRdaT7LMgjBM4KBBNwfQxSdVAvk00y6KE3yJUIIwUR4NEPPChSABUsCgABBMD63QYJhQguykp0qJSAyvi2AoX5cF3VBV1vRK5K8zI51ZdKyoqkJqsRNreO0zJWqxChkqzHpZx6hy
hODBBLMNWrjOYbAsXFAANbgFnmeJQoEBbCXwOprgWYyjDYAxuHTSB6AIIQUXGN8CoaiL9Es5iUx9CAkOLYymRIaLYo1BKyi+4gpQQOBVs+0gSAAWTYYgEGa3BNGCarnynaTAZQtizogWDCU60hlDpAAKE9+14cZSZJ6hUTmABKIVzIQZQI35HoCdwYmEjRXhOapxIueSWmIFu+rcN03FnKgOsVxvYygwCqbslhiGBlOrVsgRpHuExK6EWwIhQbQb
WEARDh5a10gda1YQoAvFEjYRfR+VxUgWzNw2LeNrVHdIZ34cRx9UCN4WyjsAArBA+mYCVTbgaHYb9zWn0nT2ynpSXGGS478FVjMunEsJgj6OshWwjEDCG7o0FmrUiQfZHk8DLFCIyIvOHHBua9CDKi4zrPr3FYPIEcZgNZInI0sh7IhHbl8U9paNHAGFpAmFJhsg7CR1f9j7pMIZhYIX6NlATgP7d35hIZIOA2GjKBo+/OAj5P6qz7KGdMAlFvJc
4OPxL0HJcDRiFmAfMdBRTBDTO+XMQA==
```
%%
Binary file not shown.

After

Width:  |  Height:  |  Size: 630 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 558 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 575 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 391 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 449 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 KiB

+213
View File
@@ -0,0 +1,213 @@
---
excalidraw-plugin: parsed
tags: [excalidraw]
---
==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== You can decompress Drawing data with the command palette: 'Decompress current Excalidraw file'. For more info check in plugin settings under 'Saving'
# Excalidraw Data
## Text Elements
mini-pc N150 / 12 GB / 256 GB ^mini_lbl
cloud-pc i5 / 16 GB / 256 GB + 5 TB ^gihc0eNQ
Internet ^JF8gyxg7
NPM (публичный) ^De5FvlCO
Portainer Agent ^aa6HjhlV
ZeroTier ^m9o2XfZR
ufw ^irwhPywz
Nginx (80, 443) ^3YCkaaEW
ZeroTier overlay network ^5VEs4mhQ
AdGuard Home ^14mDr3CI
NPM (локальный) ^Oynv3oBy
Vaultwarden ^0uUIYjrp
ZeroTier ^8m3hcPU4
Portainer Agent ^O5TryriF
Cockpit ^YY7Tjxu0
Gitea Actions Runner ^bC30cure
Gitea + Registry ^K59um5ww
Nextcloud ^suNAEYqI
ZeroTier ^WzKFf7RD
SMB/BU/Files (5 TB HDD) ^HZKjRf2E
Portainer Server ^7rAi7eTS
Cockpit ^aVjmA1Ms
^Jq0JkEPn
Infrastructure — ada-dev ^title
ru-vps (белый IP) ^vps_lbl
%%
## Drawing
```compressed-json
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=
```
%%
+2 -1
View File
@@ -1,6 +1,6 @@
---
created: 2026-04-20
updated: 2026-05-14
updated: 2026-05-17
title: Агент — контекст и инструкции для этого хранилища
---
@@ -116,6 +116,7 @@ Vault — второй мозг владельца. Агент помогает
Триггер: команда `ingest` или новые файлы в `00 Inbox/`.
Если ingest запрошен для файла в `01 Ideas/`, не переносить его в `90 Library/` и не архивировать. Нужно оформить саму идею на месте: сохранить авторскую формулировку, выделить основную мысль, добавить структуру и релевантные ссылки на существующие заметки.
- если в исходнике есть картинки, изучить их и принять решение - вынести из них информацию в заметку или оставить картинку в конечной заметке.
Перед выполнением вывести план: