Это один из способов повторного использования кода в объектно-ориентированном программировании. Они представляют собой классы или функции, которые предоставляют методы для других классов, без необходимости быть основой для этих классов. Миксины позволяют «подмешивать» функциональность в другие классы, обеспечивая гибкость и модульность кода.
Миксины позволяют избежать дублирования кода путем инкапсуляции общих методов и свойств, которые могут быть использованы в различных классах.
В языках, поддерживающих множественное наследование (например, Python), миксины могут быть использованы как базовые классы для других классов, предоставляя дополнительные методы и свойства. Это позволяет создавать классы, комбинируя несколько миксинов для расширения функциональности.
В языках, где множественное наследование не поддерживается или нежелательно (например, в JavaScript), миксины могут быть применены через композицию, где функциональность миксина добавляется к целевому объекту или классу.
Миксины позволяют изолировать и инкапсулировать определенное поведение или функциональность, что упрощает тестирование и поддержку кода.
Миксины часто используются через множественное наследование.
class LoggableMixin:
def log(self, message):
print(f"Log: {message}")
class Database(LoggableMixin):
def save(self, data):
self.log("Saving data")
# Код для сохранения данных
db = Database()
db.save({"key": "value"})
Миксины могут быть применены через композицию.
const loggableMixin = {
log(message) {
console.log(`Log: ${message}`);
}
};
class Database {
save(data) {
this.log("Saving data");
// Код для сохранения данных
}
}
Object.assign(Database.prototype, loggableMixin);
const db = new Database();
db.save({ key: 'value' });Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
ROC AUC (Receiver Operating Characteristic - Area Under Curve) является популярной метрикой для оценки качества бинарного классификатора. Однако, в некоторых ситуациях использование ROC AUC может быть неэффективным или вводящим в заблуждение.
При сильном дисбалансе классов, где один класс существенно преобладает над другим, ROC AUC может давать завышенные оценки качества модели. Это происходит потому, что ROC AUC учитывает как истинно положительные, так и ложно положительные сработки, но при этом не всегда отражает способность модели предсказывать редкий класс.
Если ошибки различных типов (ложно положительные и ложно отрицательные) имеют разную стоимость, ROC AUC может неадекватно отражать качество модели. В таких случаях более подходящей метрикой может быть Precision-Recall Curve или специфическая метрика, учитывающая стоимость ошибок.
При малом количестве положительных примеров (класса 1), ROC AUC может стать менее надежной, так как небольшое изменение в предсказаниях может существенно повлиять на значение метрики. В таких случаях Precision-Recall Curve и PR AUC могут предоставить более надежную оценку.
Может быть нестабильной и сильно зависеть от конкретного набора данных, особенно при небольших выборках. Это может привести к значительным колебаниям в оценках качества модели.
import numpy as np
import pandas as pd
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score, precision_recall_curve, auc
# Создание несбалансированного набора данных
X, y = make_classification(n_samples=1000, n_features=20, n_informative=2, n_redundant=10,
n_clusters_per_class=1, weights=[0.99], flip_y=0, random_state=42)
# Разделение на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Обучение модели логистической регрессии
model = LogisticRegression()
model.fit(X_train, y_train)
# Предсказание вероятностей
y_scores = model.predict_proba(X_test)[:, 1]
# Вычисление ROC AUC
roc_auc = roc_auc_score(y_test, y_scores)
# Вычисление Precision-Recall AUC
precision, recall, _ = precision_recall_curve(y_test, y_scores)
pr_auc = auc(recall, precision)
print(f"ROC AUC: {roc_auc}")
print(f"Precision-Recall AUC: {pr_auc}")
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
В Linux есть несколько команд для проверки свободного места на диске.
Эта команда отображает информацию о файловых системах, включая общий объём, использованное и свободное пространство.
df -h
Чтобы посмотреть только свободное место на корневом (
/) разделе: df -h /
Если нужно узнать место на конкретном диске или разделе:
df -h /dev/sda1
Команда
du показывает, сколько места занимает конкретная директория du -sh /путь/к/папке
lsblk — информация о дисках и разделах lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT
Если нужно увидеть структуру разделов диска
sudo fdisk -l
или
sudo parted -l
Если
du неудобен, можно установить и использовать ncdu: sudo apt install ncdu # Для Debian/Ubuntu
sudo yum install ncdu # Для CentOS/RHEL
ncdu
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это два типа соединений (joins) в языке SQL, которые используются для объединения строк из двух или более таблиц на основе связанных столбцов. Основное различие между ними заключается в том, какие строки включаются в результирующий набор данных.
Возвращает только те строки, которые имеют совпадающие значения в обеих таблицах, участвующих в соединении. Возвращает строки, где существует совпадение значений в обоих таблицах. Если нет совпадающих значений, строка не будет включена в результирующий набор.
SELECT Employees.name, Departments.department_name
FROM Employees
INNER JOIN Departments ON Employees.department_id = Departments.id;
Возвращает все строки из левой таблицы (первой таблицы в запросе) и соответствующие строки из правой таблицы. Если в правой таблице нет совпадающих строк, в результирующем наборе будут NULL значения для столбцов правой таблицы. Возвращает все строки из левой таблицы и соответствующие строки из правой таблицы. Если в правой таблице нет соответствия, возвращаются NULL значения для правой таблицы.
SELECT Employees.name, Departments.department_name
FROM Employees
LEFT JOIN Departments ON Employees.department_id = Departments.id;
Возвращает только совпадающие строки. Если нет совпадений, строки не включаются в результат.
Возвращает все строки из левой таблицы. Включает совпадающие строки из правой таблицы. Если нет совпадений, строки из правой таблицы будут заполнены NULL значениями.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это два типа данных в SQL, которые используются для хранения строковых данных. Основные различия между ними касаются способа хранения данных и управления памятью.
CHAR(n) хранит строки фиксированной длины n. Если строка короче, она дополняется пробелами до указанной длины.Использует фиксированное количество памяти, равное указанной длине
n, независимо от фактической длины строки.Может быть быстрее в некоторых случаях, так как длина строк фиксирована и известна заранее, что упрощает управление памятью.
Подходит для хранения данных, которые всегда имеют одинаковую длину, например, коды стран, идентификаторы и т.д.
CREATE TABLE example (
fixed_char CHAR(10)
);
VARCHAR(n) хранит строки переменной длины, где n — это максимальная длина строки. Реальная длина строки определяется по количеству символов в ней.Использует только столько памяти, сколько необходимо для хранения фактической длины строки, плюс дополнительные байты для хранения информации о длине строки.
Может быть менее эффективным в некоторых случаях по сравнению с
CHAR, так как длина строки не фиксирована и требует дополнительной обработки для управления памятью.Подходит для хранения данных, длина которых может варьироваться, например, имена, адреса, описания и т.д.
CREATE TABLE example (
variable_char VARCHAR(50)
);
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Термин «Ошибка на миллиард долларов» (
The Billion Dollar Mistake) был введён Тони Хоаром (Tony Hoare), создателем NULL, который в 2009 году на конференции признался, что введение NULL было его крупнейшей ошибкой. Название связано с тем, что NULL стал причиной множества багов, сбоев в программах и уязвимостей, что привело к огромным финансовым потерям в индустрии.- Попытка вызвать метод у
NULL приводит к ошибке NullPointerException в Java, NullReferenceException в C# и аналогичным сбоям в других языках.- Это одна из самых распространённых ошибок в программировании.
- Из-за
NULL приходится постоянно писать проверки if (x != null), что раздувает код и делает его менее читаемым.- Если забыть такую проверку, можно получить неожиданный сбой.
-
NULL можно передавать в любую функцию или объект, что ломает строгую типизацию.- Код становится менее предсказуемым.
-
NULL в SQL ведёт себя неинтуитивно (NULL != NULL, сравнение может давать UNKNOWN).- Может приводить к некорректным вычислениям в агрегатных функциях.
- Некоторые атаки используют
NULL для взлома систем (например, null dereference в C/C++ может привести к DoS-атаке).-
NULL может скрывать ошибки и приводить к утечке данных.- Использование обёрток вроде
Optional<T> (Java) или Option<T> (Rust) позволяет явно указывать возможность отсутствия значения.- Вместо возврата
NULL можно выбрасывать осмысленные исключения (IllegalArgumentException, NotFoundException).- Вместо
NULL можно использовать дефолтные объекты (EmptyList, GuestUser и т. д.).- Например, в Haskell и Rust применяют
Either<T, E>, Option<T>, что делает обработку NULL-подобных случаев более явной.Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM