This commit is contained in:
parent
2199e79016
commit
1f55f5c949
28
dev/java/Java Virtual Machine.md
Normal file
28
dev/java/Java Virtual Machine.md
Normal 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 выполняет его, управляя памятью, потоками и исключениями, обеспечивая надёжное выполнение программы.
|
@ -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 для конкретного типа объекта.
|
||||
|
@ -2,12 +2,10 @@
|
||||
aliases:
|
||||
- куче
|
||||
- кучей
|
||||
- heap
|
||||
tags:
|
||||
- maturity/🌱
|
||||
date: 2024-10-19
|
||||
zero-link:
|
||||
parents:
|
||||
linked:
|
||||
---
|
||||
Куча — это область памяти, используемая для динамического распределения во время выполнения программы. В отличие от стека, ==данные в куче могут существовать дольше, чем отдельные вызовы функций, а объёмы памяти, выделяемой в куче, обычно гораздо больше, чем в стеке.==
|
||||
|
||||
|
@ -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
64
dev/linux/iptables.md
Normal 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) -->
|
||||
|
@ -6,17 +6,14 @@ tags:
|
||||
- maturity/🌱
|
||||
- content/opinion
|
||||
date: 2024-10-20
|
||||
zero-link:
|
||||
parents:
|
||||
linked:
|
||||
---
|
||||
Код — это не только набор инструкций для машины, но и средство общения между разработчиками. Большую часть времени программисты проводят, читая чужой код, поэтому ==каждый фрагмент кода должен быть понятен не только автору, но и другим членам команды==. Удобство чтения и понимания кода коллегами — один из ключевых факторов успешной [[../productivity/Эффективная команда разработки|командной работы]]. Это требует от разработчиков внимательного подхода к написанию кода: важно писать не только для себя, но и для своих коллег.
|
||||
Код — это не только набор инструкций для машины, но и ==средство общения между разработчиками.== Большую часть времени программисты проводят, читая чужой код, поэтому ==каждый фрагмент кода должен быть понятен не только автору, но и другим членам команды==. Удобство чтения и понимания кода коллегами — один из ключевых факторов успешной [[../productivity/Эффективная команда разработки|командной работы]].
|
||||
|
||||
Если ваш код понятен только вам и не может быть поддержан другими, это сигнал того, что вы недостаточно эффективный разработчик.
|
||||
==Любой дурак может написать код, понятный компьютеру. Хорошие программисты пишут код, понятный людям==. Если ваш код понятен только вам и не может быть поддержан другими, это сигнал того, что вы посредственный разработчик.
|
||||
|
||||
**Рекомендации**:
|
||||
- **Пишите просто и ясно**. Используйте понятные и распространённые конструкции языка, которые легко читаются и понимаются коллегами.
|
||||
- **Не усложняйте**. Не стремитесь использовать сложные или малоизвестные возможности языка, если они не приносят очевидной пользы. Простота всегда предпочтительнее.
|
||||
- **Не усложняйте**. Не стремитесь использовать сложные или малоизвестные возможности языка, если они не приносят очевидной пользы. ==Простота всегда предпочтительнее.==
|
||||
- **Комментируйте важные моменты**. Там, где логика может быть неочевидной, добавьте комментарии, которые объясняют цель или обоснование ваших решений.
|
||||
- **Следуйте соглашениям по стилю**. Соблюдайте единые стандарты кодирования, принятые в команде, будь то соглашения о стиле, именовании или форматировании.
|
||||
- **Используйте осмысленные имена**. Переменные, функции и классы должны иметь названия, которые чётко отражают их назначение. Избегайте сокращений, если они могут быть непонятны другим.
|
||||
|
49
productivity/Story Points.md
Normal file
49
productivity/Story Points.md
Normal 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) -->
|
||||
|
Loading…
Reference in New Issue
Block a user