From 1f55f5c9490423b2c5549f3b9b65c227eb49fc56 Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Sun, 3 Nov 2024 13:46:19 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dev/java/Java Virtual Machine.md | 28 ++++++++++ dev/java/Динамическое связывание в Java.md | 2 +- dev/java/Куча.md | 4 +- dev/java/Нативные сборки в Java.md | 2 +- dev/linux/iptables.md | 64 ++++++++++++++++++++++ dev/Читаемый код.md | 9 +-- productivity/Story Points.md | 49 +++++++++++++++++ 7 files changed, 147 insertions(+), 11 deletions(-) create mode 100644 dev/java/Java Virtual Machine.md create mode 100644 dev/linux/iptables.md create mode 100644 productivity/Story Points.md diff --git a/dev/java/Java Virtual Machine.md b/dev/java/Java Virtual Machine.md new file mode 100644 index 00000000..397fdd66 --- /dev/null +++ b/dev/java/Java Virtual Machine.md @@ -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 выполняет его, управляя памятью, потоками и исключениями, обеспечивая надёжное выполнение программы. diff --git a/dev/java/Динамическое связывание в Java.md b/dev/java/Динамическое связывание в Java.md index 90ff1dc2..4c83d435 100644 --- a/dev/java/Динамическое связывание в Java.md +++ b/dev/java/Динамическое связывание в Java.md @@ -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 для конкретного типа объекта. diff --git a/dev/java/Куча.md b/dev/java/Куча.md index 53e519bf..1355d084 100644 --- a/dev/java/Куча.md +++ b/dev/java/Куча.md @@ -2,12 +2,10 @@ aliases: - куче - кучей + - heap tags: - maturity/🌱 date: 2024-10-19 -zero-link: -parents: -linked: --- Куча — это область памяти, используемая для динамического распределения во время выполнения программы. В отличие от стека, ==данные в куче могут существовать дольше, чем отдельные вызовы функций, а объёмы памяти, выделяемой в куче, обычно гораздо больше, чем в стеке.== diff --git a/dev/java/Нативные сборки в Java.md b/dev/java/Нативные сборки в Java.md index 81c21cfb..d639c455 100644 --- a/dev/java/Нативные сборки в Java.md +++ b/dev/java/Нативные сборки в Java.md @@ -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)) во время выполнения. diff --git a/dev/linux/iptables.md b/dev/linux/iptables.md new file mode 100644 index 00000000..af843c3e --- /dev/null +++ b/dev/linux/iptables.md @@ -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 -j ACCEPT` — Разрешить трафик с определенного IP-адреса +- `iptables -A INPUT -p tcp --dport <порт> -j DROP` — Запретить входящий трафик на определенный порт. +- `iptables -A INPUT -s -j DROP` — Запретить трафик с определенного IP-адреса. + +**Условные разрешения и запреты трафика** +- `iptables -A INPUT -p tcp -s --dport <порт> -j ACCEPT` — Разрешить трафик с IP на конкретный порт. +- `iptables -A INPUT -p tcp -s --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 :<порт>` — Перенаправление трафика с одного порта на другой. + +**Сохранение и восстановление правил** +- `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]] +**Автор**:: +### Дополнительные материалы +- + +### Дочерние заметки + + diff --git a/dev/Читаемый код.md b/dev/Читаемый код.md index f851a846..ed583e3c 100644 --- a/dev/Читаемый код.md +++ b/dev/Читаемый код.md @@ -6,17 +6,14 @@ tags: - maturity/🌱 - content/opinion date: 2024-10-20 -zero-link: -parents: -linked: --- -Код — это не только набор инструкций для машины, но и средство общения между разработчиками. Большую часть времени программисты проводят, читая чужой код, поэтому ==каждый фрагмент кода должен быть понятен не только автору, но и другим членам команды==. Удобство чтения и понимания кода коллегами — один из ключевых факторов успешной [[../productivity/Эффективная команда разработки|командной работы]]. Это требует от разработчиков внимательного подхода к написанию кода: важно писать не только для себя, но и для своих коллег. +Код — это не только набор инструкций для машины, но и ==средство общения между разработчиками.== Большую часть времени программисты проводят, читая чужой код, поэтому ==каждый фрагмент кода должен быть понятен не только автору, но и другим членам команды==. Удобство чтения и понимания кода коллегами — один из ключевых факторов успешной [[../productivity/Эффективная команда разработки|командной работы]]. -Если ваш код понятен только вам и не может быть поддержан другими, это сигнал того, что вы недостаточно эффективный разработчик. +==Любой дурак может написать код, понятный компьютеру. Хорошие программисты пишут код, понятный людям==. Если ваш код понятен только вам и не может быть поддержан другими, это сигнал того, что вы посредственный разработчик. **Рекомендации**: - **Пишите просто и ясно**. Используйте понятные и распространённые конструкции языка, которые легко читаются и понимаются коллегами. -- **Не усложняйте**. Не стремитесь использовать сложные или малоизвестные возможности языка, если они не приносят очевидной пользы. Простота всегда предпочтительнее. +- **Не усложняйте**. Не стремитесь использовать сложные или малоизвестные возможности языка, если они не приносят очевидной пользы. ==Простота всегда предпочтительнее.== - **Комментируйте важные моменты**. Там, где логика может быть неочевидной, добавьте комментарии, которые объясняют цель или обоснование ваших решений. - **Следуйте соглашениям по стилю**. Соблюдайте единые стандарты кодирования, принятые в команде, будь то соглашения о стиле, именовании или форматировании. - **Используйте осмысленные имена**. Переменные, функции и классы должны иметь названия, которые чётко отражают их назначение. Избегайте сокращений, если они могут быть непонятны другим. diff --git a/productivity/Story Points.md b/productivity/Story Points.md new file mode 100644 index 00000000..ba3405a8 --- /dev/null +++ b/productivity/Story Points.md @@ -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]] +**Автор**:: +### Дополнительные материалы +- + +### Дочерние заметки + +