Обновление
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Struchkov Mark 2024-11-03 13:46:19 +03:00
parent 2199e79016
commit 1f55f5c949
No known key found for this signature in database
GPG Key ID: A3F0AC3F0FA52F3C
7 changed files with 147 additions and 11 deletions

View File

@ -0,0 +1,28 @@
---
aliases:
- JVM
tags:
- maturity/🌱
date: "[[2023-11-07]]"
---
JVM (Java Virtual Machine) — это виртуальная машина, которая выполняет программы, написанные на языке Java, а также другие языки платформы Java, такие как Kotlin и Scala. Её основная задача — выполнение [[Java байт-код|байт-кода]], промежуточного представления между исходным кодом и машинным кодом конкретного устройства. JVM также управляет памятью, сборкой мусора, безопасностью и многопоточностью, создавая надёжную среду для выполнения приложений.
**Основные функции JVM**
- **Платформонезависимость**. Java-программы компилируются в байт-код, который может выполняться на любой системе с установленной JVM, что позволяет запускать один и тот же код на различных операционных системах и аппаратных платформах без изменений.
- **Управление памятью**. JVM управляет памятью через кучу (heap), автоматически выделяя и освобождая память, что устраняет необходимость ручного управления и снижает риск утечек.
- [[gc/Garbage Collector|Сборка мусора]] (Garbage Collection). JVM использует сборщик мусора для автоматического освобождения памяти, занятой объектами, которые больше не используются. Это предотвращает утечки памяти и улучшает производительность приложения.
- **Безопасность**. JVM обеспечивает безопасное выполнение кода с помощью системы управления доступом, проверяющей разрешения для выполнения определённых операций, таких как доступ к файловой системе, что помогает предотвратить выполнение вредоносного кода.
- **Многопоточность**. JVM поддерживает [[../fundamental/Multithreading|многопоточность]], позволяя разрабатывать многопоточные приложения на уровне языка. Она управляет созданием, синхронизацией и выполнением потоков.
- **Управление исключениями**. JVM предоставляет механизм обработки исключений, который позволяет программам Java надёжно обрабатывать ошибки во время выполнения, повышая стабильность и устойчивость приложений.
**Как работает JVM**
1. **Компиляция исходного кода в байт-код**
Исходный код (.java файлы) компилируется компилятором Java (javac) в байт-код (.class файлы), который является платформонезависимым промежуточным представлением.
2. **Загрузка байт-кода**
Класс-загрузчики JVM (Class Loaders) загружают байт-код в память. Существуют различные типы загрузчиков, такие как Bootstrap Class Loader, Extension Class Loader и Application Class Loader.
3. **Проверка байт-кода**
JVM проверяет байт-код для обеспечения его корректности и безопасности, чтобы предотвратить выполнение некорректного или вредоносного кода.
4. **Интерпретация или компиляция JIT**
JVM может интерпретировать байт-код или использовать Just-In-Time (JIT) компиляцию, которая преобразует байт-код в машинный код во время выполнения, улучшая производительность.
5. **Выполнение кода**
После загрузки и проверки байт-кода JVM выполняет его, управляя памятью, потоками и исключениями, обеспечивая надёжное выполнение программы.

View File

@ -9,7 +9,7 @@ linked:
---
Важной особенностью [[../../../../garden/ru/dev/other/Динамическое связывание|динамического связывания]] в Java является использование **виртуальных методов** — методов, которые могут быть переопределены в наследуемых классах, и выбор нужного метода происходит в зависимости от типа объекта, а не ссылки на него.
Динамическое связывание в Java обеспечивается [[../../../../knowledge/dev/java/JVM|JVM]] через таблицы виртуальных методов (vtable). Когда создается объект, JVM строит таблицу, содержащую указатели на методы, которые могут быть вызваны для данного объекта. Если метод переопределён в подклассе, JVM заменяет соответствующую запись в таблице. Это позволяет JVM выбрать нужный метод во время выполнения, основываясь на фактическом типе объекта.
Динамическое связывание в Java обеспечивается [[Java Virtual Machine|Java Virtual Machine]] через таблицы виртуальных методов (vtable). Когда создается объект, JVM строит таблицу, содержащую указатели на методы, которые могут быть вызваны для данного объекта. Если метод переопределён в подклассе, JVM заменяет соответствующую запись в таблице. Это позволяет JVM выбрать нужный метод во время выполнения, основываясь на фактическом типе объекта.
Ключевые шаги, которые выполняет JVM:
1. Когда вызывается метод через ссылку, JVM проверяет vtable для конкретного типа объекта.

View File

@ -2,12 +2,10 @@
aliases:
- куче
- кучей
- heap
tags:
- maturity/🌱
date: 2024-10-19
zero-link:
parents:
linked:
---
Куча — это область памяти, используемая для динамического распределения во время выполнения программы. В отличие от стека, ==данные в куче могут существовать дольше, чем отдельные вызовы функций, а объёмы памяти, выделяемой в куче, обычно гораздо больше, чем в стеке.==

View File

@ -9,7 +9,7 @@ zero-link:
parents:
linked:
---
Нативные сборки в контексте Java относятся к процессу компиляции Java-приложений в нативный машинный код, специфичный для конкретной операционной системы и архитектуры процессора. Это отличается от традиционного подхода Java, где приложения компилируются в байт-код и выполняются на Java Virtual Machine ([JVM](JVM.md)). Основным инструментом для создания нативных сборок в Java является GraalVM Native Image.
Нативные сборки в контексте Java относятся к процессу компиляции Java-приложений в нативный машинный код, специфичный для конкретной операционной системы и архитектуры процессора. Это отличается от традиционного подхода Java, где приложения компилируются в байт-код и выполняются на Java Virtual Machine ([Java Virtual Machine](Java%20Virtual%20Machine.md)). Основным инструментом для создания нативных сборок в Java является GraalVM Native Image.
**Плюсы:**
1. **Быстрый Старт и Низкое Расходование Ресурсов**: Нативные сборки могут значительно ускорить время запуска приложения и уменьшить потребление ресурсов (например, памяти), поскольку они не требуют запуска JVM и загрузки классов ([Class Loader Subsystem](Class%20Loader%20Subsystem.md)) во время выполнения.

64
dev/linux/iptables.md Normal file
View File

@ -0,0 +1,64 @@
---
aliases:
tags:
- maturity/🌱
date: 2024-11-03
---
**Проверка правил**
- `iptables -L` — Показать все правила.
- `iptables -L -v -n` — Показать правила с подробной информацией и числовыми адресами.
- `iptables -S` — Показать все правила в формате, который можно использовать повторно.
**Очистка правил**
- `iptables -F` — Очистить все правила во всех цепочках.
- `iptables -X` — Удалить все пользовательские цепочки.
- `iptables -Z` — Обнулить счетчики пакетов и байтов.
**Установка политики по умолчанию**
- `iptables -P INPUT ACCEPT` — Установить политику по умолчанию для цепочки INPUT.
- `iptables -P FORWARD ACCEPT` — Установить политику по умолчанию для цепочки FORWARD.
- `iptables -P OUTPUT ACCEPT` — Установить политику по умолчанию для цепочки OUTPUT.
**Разрешение и запрет трафика**
- `iptables -A INPUT -p tcp --dport <порт> -j ACCEPT` — Разрешить входящий трафик на определенный порт.
- `iptables -A INPUT -s <IP> -j ACCEPT` — Разрешить трафик с определенного IP-адреса
- `iptables -A INPUT -p tcp --dport <порт> -j DROP` — Запретить входящий трафик на определенный порт.
- `iptables -A INPUT -s <IP> -j DROP` — Запретить трафик с определенного IP-адреса.
**Условные разрешения и запреты трафика**
- `iptables -A INPUT -p tcp -s <IP> --dport <порт> -j ACCEPT` — Разрешить трафик с IP на конкретный порт.
- `iptables -A INPUT -p tcp -s <IP> --dport <порт> -j DROP` — Запретить трафик с IP на конкретный порт.
**Удаление правил**
- `iptables -D INPUT <номер-правила>` — Удалить правило по его номеру.
- `iptables -D INPUT -p tcp --dport <порт> -j ACCEPT` — Удалить конкретное правило.
**Работа с цепочками**
- `iptables -N <имя-цепочки>` — Создать новую цепочку.
- `iptables -X <имя-цепочки>` — Удалить пользовательскую цепочку.
- `iptables -A INPUT -j <имя-цепочки>` — Переход к пользовательской цепочке.
**NAT и перенаправление портов**
- `iptables -t nat -A POSTROUTING -o <интерфейс> -j MASQUERADE` — Включить NAT на интерфейсе.
- `iptables -t nat -A PREROUTING -p tcp --dport <порт> -j DNAT --to-destination <IP>:<порт>` — Перенаправление трафика с одного порта на другой.
**Сохранение и восстановление правил**
- `iptables-save > /etc/iptables/rules.v4` — Сохранить правила IPv4 в файл.
- `iptables-restore < /etc/iptables/rules.v4` — Восстановить правила IPv4 из файла.
**Логирование**
- `iptables -A INPUT -p tcp --dport <порт> -j LOG --log-prefix "IPTables-Dropped: " --log-level 4` — Логировать сброшенные пакеты.
***
## Мета информация
**Область**:: [[../../meta/zero/00 Linux|00 Linux]]
**Родитель**::
**Источник**::
**Создана**:: [[2024-11-03]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -6,17 +6,14 @@ tags:
- maturity/🌱
- content/opinion
date: 2024-10-20
zero-link:
parents:
linked:
---
Код — это не только набор инструкций для машины, но и средство общения между разработчиками. Большую часть времени программисты проводят, читая чужой код, поэтому ==каждый фрагмент кода должен быть понятен не только автору, но и другим членам команды==. Удобство чтения и понимания кода коллегами — один из ключевых факторов успешной [[../productivity/Эффективная команда разработки|командной работы]]. Это требует от разработчиков внимательного подхода к написанию кода: важно писать не только для себя, но и для своих коллег.
Код — это не только набор инструкций для машины, но и ==средство общения между разработчиками.== Большую часть времени программисты проводят, читая чужой код, поэтому ==каждый фрагмент кода должен быть понятен не только автору, но и другим членам команды==. Удобство чтения и понимания кода коллегами — один из ключевых факторов успешной [[../productivity/Эффективная команда разработки|командной работы]].
Если ваш код понятен только вам и не может быть поддержан другими, это сигнал того, что вы недостаточно эффективный разработчик.
==Любой дурак может написать код, понятный компьютеру. Хорошие программисты пишут код, понятный людям==. Если ваш код понятен только вам и не может быть поддержан другими, это сигнал того, что вы посредственный разработчик.
**Рекомендации**:
- **Пишите просто и ясно**. Используйте понятные и распространённые конструкции языка, которые легко читаются и понимаются коллегами.
- **Не усложняйте**. Не стремитесь использовать сложные или малоизвестные возможности языка, если они не приносят очевидной пользы. Простота всегда предпочтительнее.
- **Не усложняйте**. Не стремитесь использовать сложные или малоизвестные возможности языка, если они не приносят очевидной пользы. ==Простота всегда предпочтительнее.==
- **Комментируйте важные моменты**. Там, где логика может быть неочевидной, добавьте комментарии, которые объясняют цель или обоснование ваших решений.
- **Следуйте соглашениям по стилю**. Соблюдайте единые стандарты кодирования, принятые в команде, будь то соглашения о стиле, именовании или форматировании.
- **Используйте осмысленные имена**. Переменные, функции и классы должны иметь названия, которые чётко отражают их назначение. Избегайте сокращений, если они могут быть непонятны другим.

View File

@ -0,0 +1,49 @@
---
aliases:
tags:
- maturity/🌱
date: 2024-11-03
---
## Тезисы
- Стори поинты (Story Points) — единицы сложности для оценки трудоёмкости задач.
- Оценка задач в человекочасах не всегда точна из-за различий в скорости работы людей, их опыта и состояния.
- Стори поинты позволяют абстрагироваться от времени и оценивать только сложность задачи.
- Команда выбирает эталонные задачи, которым присваивает значения по шкале Фибоначчи (1, 2, 3, 5, 8, 13).
- Задачи, превышающие 13 стори поинтов, следует разбивать на более мелкие.
***
Оценка в человекочасах предполагает одинаковую продуктивность, но опытный сотрудник выполнит задачи быстрее новичка. Таким образом, оценка задач в человекочасах может давать неточные прогнозы. Для решения этой проблемы используются стори поинты, которые позволяют абстрагироваться от времени и оценивать только сложность задачи.
Стори поинты — это единицы сложности для оценки трудоёмкости задач, что помогает учитывать различия в скорости работы и условиях выполнения.
Основные факторы, влияющие на трудоёмкость задачи: опыт, состояние здоровья, личные особенности и внешние факторы.
## Как оценивать задачи в стори поинтах?
Для оценки задач в стори поинтах команда выбирает эталонные задачи, которым присваиваются значения 1, 2, 3, 5, 8 и 13 по шкале Фибоначчи. Эти эталонные задачи помогают определять сложность новых задач.
> [!NOTE] Числа Фибоначчи
> Числа Фибоначчи (1, 2, 3, 5, 8, 13) помогают учитывать нелинейное увеличение сложности и избегать недооценки сложных задач.
Примеры эталонных задач для разработки:
- **1 СП** — добавить настройку в приложение и обновить его.
- **5 СП** — разработать простой CRUD.
- **13 СП** — разработать логику нетривиального бизнес-сценария.
Если задача оценивается выше 13 стори поинтов, её следует разбивать на более мелкие части, так как выполнение таких задач требует значительно больше усилий и несёт высокий риск.
## Рекомендации
- **Определение эталонных задач**: Команда должна совместно определить эталонные задачи для того, чтобы иметь общее представление о сложности и говорить на одном языке при оценке.
- **Обучение команды**: Необходимо провести обучение по использованию стори поинтов, чтобы все члены команды одинаково понимали процесс оценки.
- **Использование ретроспектив**: После завершения спринта команда должна анализировать, насколько точно были оценены задачи, и вносить коррективы в процесс оценки.
- **Использование исторических данных**: Использование данных о предыдущих спринтах помогает уточнять оценки и повышать их точность.
***
## Мета информация
**Область**:: [[../meta/zero/00 Командная продуктивность|00 Командная продуктивность]]
**Родитель**::
**Источник**::
**Создана**:: [[2024-11-03]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->