IT Ready
Качественные IT ресурсы, сайты, репозитории, курсы и инструменты для обучения. Информация ежедневно пополняется! Cотрудничество: @energy_c Реклама на бирже: https://telega.in/channels/+oQDlPHBPTg82MmU6/card РКН: https://clck.ru/3NJE9E
Больше📈 Аналитический обзор Telegram-канала IT Ready
Канал IT Ready языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 17 220 подписчиков, занимая 7 556 место в категории Технологии и приложения и 37 989 место в регионе Россия.
📊 Показатели аудитории и динамика
С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 17 220 подписчиков.
Согласно последним данным от 14 ноября, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило 88, а за последние 24 часа — -10, при этом общий охват остаётся высоким.
- Статус верификации: Не верифицирован
- Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 8.73%. В первые 24 часа после публикации контент обычно набирает 4.63% реакций от общего числа подписчиков.
- Охват публикаций: В среднем каждый пост получает 1 503 просмотров. В течение первых суток публикация набирает 797 просмотров.
- Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 19.
- Тематические интересы: Контент сосредоточен на ключевых темах, таких как github, api, habr, собеседование, хабре.
📝 Описание и контентная политика
Автор описывает ресурс как площадку для выражения субъективного мнения:
“Качественные IT ресурсы, сайты, репозитории, курсы и инструменты для обучения.
Информация ежедневно пополняется!
Cотрудничество: @energy_c
Реклама на бирже: https://telega.in/channels/+oQDlPHBPTg82MmU6/card
РКН: https://clck.ru/3NJE9E”
Благодаря высокой частоте обновлений (последние данные получены 15 ноября, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.
firewall не показывает явных блокировок. В таких случаях полезно посмотреть, что происходит с пакетами на самом деле.
Например, запрос завершается ошибкой:
curl https://api.example.com
Получаем Connection timed out, но непонятно, где именно возникает проблема. Для диагностики используем tcpdump, который позволяет перехватывать сетевые пакеты прямо на интерфейсах Linux.
Посмотрим весь TCP-трафик на HTTPS-порту:
sudo tcpdump -nn -i any 'tcp port 443'
Параметр -nn отключает преобразование адресов и портов в имена, а -i any захватывает трафик со всех доступных интерфейсов.
Если в выводе видим:
IP 10.0.0.15.42310 > 203.0.113.10.443: Flags [S]
Это SYN-пакет — попытка установить TCP-соединение. Если SYN повторяется, но ответа нет, стоит проверить маршрутизацию, сетевую фильтрацию и доступность удалённого сервера.
Если приходит ответ:
IP 203.0.113.10.443 > 10.0.0.15.42310: Flags [S.]
Это SYN-ACK — сервер отвечает на запрос соединения. Если клиент затем отправляет ACK, TCP handshake завершён, и дальнейшую диагностику можно сосредоточить на TLS или приложении.
На production удобнее фильтровать пакеты по конкретному адресу и порту. Например, при проверке соединения с PostgreSQL:
sudo tcpdump -nn -i any 'host 10.0.0.5 and tcp port 5432'
Так можно увидеть попытки подключения, повторные передачи и сбросы соединений, не анализируя посторонний трафик.
Для просмотра содержимого незашифрованных HTTP-запросов:
sudo tcpdump -A -s 0 -i any 'tcp port 80'
Флаг -A отображает данные в ASCII, а -s 0 захватывает пакеты целиком. Для HTTPS содержимое HTTP-запросов останется зашифрованным.
Если нужно сохранить трафик для последующего анализа в Wireshark:
sudo tcpdump -i any 'tcp port 443' -c 100 -w capture.pcap
Команда запишет первые 100 подходящих пакетов в файл, который можно изучить отдельно.
🔥 tcpdump помогает быстро определить, на каком этапе возникает сетевая проблема: при отправке пакетов, получении ответа или уже после установки TCP-соединения. Особенно полезно, когда логи приложения не дают никаких зацепок.
➡️ IT Ready | #практика• Узнаете, почему акции Intel, Alphabet и Amazon резко упали, несмотря на сильные финансовые показатели и рост ИИ-направлений;
• Разберётесь, как дефицит оперативной памяти, нехватка электроэнергии и задержки строительства дата-центров тормозят развитие ИИ;
• Поймёте, почему миллиардные инвестиции в нейросети пока не обеспечивают ожидаемой отдачи и чем нынешняя ситуация отличается от пузыря доткомов.
🔊 Продолжай читать на Habr!➡️ IT Ready | #статья
sudo и получили ошибку доступа. Вместо повторного ввода достаточно написать:
apt install nginx
sudo !!
Bash подставит вместо !! предыдущую команду целиком и выполнит её с повышенными правами.
А если нужно повторить команду, которую запускали несколько шагов назад, используйте относительный номер:
!-2
Bash выполнит команду, находящуюся на две позиции раньше в истории текущей оболочки.
Если помните только начало команды, можно найти последнее совпадение:
!docker
!grep
Bash найдёт последнюю команду, начинающуюся с указанного текста, и сразу выполнит её.
Команду можно сначала посмотреть, не выполняя. Для этого добавьте :p:
!docker:p
!grep:p
Так Bash покажет найденную команду, чтобы вы могли проверить её перед запуском.
🔥 Подстановка команд из истории Bash экономит время при работе с длинными командами и избавляет от постоянного поиска уже введённых инструкций. Главное помнить, что без :p найденная команда выполняется сразу.
➡️ IT Ready | #советОставляю ссылочку: GitHub 📱➡️ IT Ready | #репозиторий
nftables могут привести к блокировке SSH-доступа, особенно при использовании политики drop или изменении разрешённых портов. Перед применением новой конфигурации полезно проверить её и изучить действующие правила, не изменяя firewall.
Практика рассчитана на линукс с установленным nftables. Все команды ниже не изменяют активные правила фильтрации. Сначала посмотрим текущий набор правил:
sudo nft list ruleset
Команда покажет таблицы, цепочки, правила и другие объекты nftables.
Сохраним снимок текущих правил для диагностики:
sudo sh -c 'umask 077; nft list ruleset > /root/nft-rules-snapshot.conf'
Файл будет доступен только root. Это диагностический снимок, а не гарантированная резервная копия для восстановления динамических правил.
Теперь проверим подготовленную конфигурацию, например /etc/nftables.conf:
sudo nft -c -f /etc/nftables.conf
Параметр -c проверяет конфигурацию без применения изменений. Если обнаружены ошибки, nft выведет диагностическое сообщение. Успешная проверка не гарантирует сохранения SSH-доступа после применения правил.
Дополнительно посмотрим действующие цепочки, политики и идентификаторы правил:
sudo nft -a list ruleset
Особое внимание уделим базовым цепочкам с hook input, их приоритетам и политикам accept или drop.
Проверим, на каких TCP-портах сервер принимает подключения:
sudo ss -ltnp
Найдём SSH-сервер в выводе и убедимся, что его порт учтён в планируемой конфигурации. Прослушивание порта само по себе не гарантирует доступность через firewall.
Команды не изменяют действующие правила. Для их применения на удалённом сервере необходимы отдельный механизм отката и резервный консольный доступ.
🔥 Предварительная проверка через nft -c помогает обнаружить ошибки конфигурации без риска заблокировать SSH из-за её применения.
➡️ IT Ready | #практикаfaulthandler.
Он позволяет вывести стеки вызовов Python-потоков по истечении заданного времени.
import faulthandler
faulthandler.dump_traceback_later(5)
while True:
pass
Через пять секунд Python выведет текущие стеки вызовов в stderr с указанием файлов и номеров строк. Это работает даже тогда, когда программа продолжает выполняться без исключений.
Для наблюдения за длительными зависаниями можно включить периодический вывод.
faulthandler.dump_traceback_later(5, repeat=True)
Теперь стеки будут выводиться каждые пять секунд, помогая определить, на каком участке кода находится каждый поток.
После завершения проверяемой операции запланированный вывод можно отменить.
faulthandler.cancel_dump_traceback_later()
Важно учитывать, что faulthandler не определяет зависание автоматически: вывод происходит по таймеру независимо от состояния программы.
🔥 faulthandler.dump_traceback_later() помогает диагностировать зависания без отладчика, показывая стеки Python-потоков с указанием файлов и номеров строк.
➡️ IT Ready | #советpip install -U openai pydantic
export OPENAI_API_KEY="your_api_key"
Опишем структуру ответа через Pydantic. Поле need_search отвечает за выбор маршрута, а query содержит поисковую строку:
from openai import OpenAI
from pydantic import BaseModel
client = OpenAI()
class SearchDecision(BaseModel):
need_search: bool
query: str
Создадим функцию классификации. responses.parse() обеспечивает структурированный вывод согласно заданной схеме без ручного разбора JSON:
def route(question: str) -> SearchDecision:
response = client.responses.parse(
model="gpt-4.1-mini",
instructions=(
"Определи, нужен ли интернет-поиск. "
"Для актуальных данных используй поиск. "
"Для общих вопросов поиск не нужен. "
"Если поиск не нужен, query пустой."
),
input=question,
text_format=SearchDecision,
)
if response.output_parsed is None:
raise RuntimeError("No routing decision")
return response.output_parsed
Проверим маршрутизатор на двух запросах. Первый не требует актуальных данных, второй предполагает проверку последнего релиза библиотеки:
for question in [
"Что такое декоратор в Python?",
"Что изменилось в последней версии FastAPI?",
]:
print(route(question).model_dump())
Один из возможных результатов показывает, что модель выбирает разные маршруты. Конкретная поисковая строка может отличаться между запусками:
{'need_search': False, 'query': ''}
{'need_search': True, 'query': 'FastAPI latest release changes'}
Результат классификации используется в обработчике агента. При необходимости приложение выполняет поиск и передаёт найденные данные модели. Ниже показан фрагмент интеграции; search_web() и answer_with_llm() реализуются отдельно:
def handle(question: str):
decision = route(question)
if decision.need_search:
results = search_web(decision.query or question)
return answer_with_llm(question, context=results)
return answer_with_llm(question)
Маршрутизация не гарантирует правильного выбора и требует тестирования на реальных запросах. Дополнительный LLM-вызов также имеет стоимость, поэтому эффективность определяется экономией на поиске и общей задержкой обработки.
🔥 LLM-маршрутизация позволяет управлять вызовами внешних инструментов и исключать избыточный поиск там, где достаточно знаний модели.
➡️ IT Ready | #практика• Узнаете, как команда восстановила критичные сервисы на новой площадке менее чем за сутки после масштабной аварии;
• Разберёте, какую роль сыграли Terraform, Ansible, GitOps, документация и заранее проверенные бэкапы;
• Поймёте, почему для аварийного восстановления недостаточно просто сохранить данные и как правильно учитывать зависимости между сервисами.
🔊 Продолжай читать на Habr!➡️ IT Ready | #статья
scikit-learn её можно экспортировать в ONNX и выполнять предсказания через ONNX Runtime. Это позволяет запускать модель без установленного scikit-learn в окружении инференса, а в некоторых случаях — ускорить обработку данных за счёт оптимизированного выполнения.
Разберём, как конвертировать обученную модель в ONNX, запустить инференс и проверить корректность предсказаний. Для начала установим зависимости:
pip install scikit-learn skl2onnx onnxruntime numpy
Обучим классификатор RandomForestClassifier на встроенном датасете Iris. Он содержит характеристики цветков трёх видов ириса, а наша модель будет определять вид по четырём числовым признакам:
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
X, y = load_iris(return_X_y=True)
model = RandomForestClassifier(
n_estimators=100,
random_state=42
)
model.fit(X, y)
Теперь экспортируем обученную модель в ONNX с помощью skl2onnx. Конвертер преобразует структуру Random Forest в операции ONNX, сохраняя обученные параметры. Переданный массив задаёт тип входных данных float32 и количество признаков, а размер батча остаётся переменным:
from skl2onnx import to_onnx
import numpy as np
onnx_model = to_onnx(
model,
X[:1].astype(np.float32),
target_opset=12
)
with open("model.onnx", "wb") as f:
f.write(onnx_model.SerializeToString())
Получили файл model.onnx, содержащий всё необходимое для выполнения модели. Теперь создадим сессию ONNX Runtime, которая загрузит вычислительный граф и подготовит его к инференсу. Через CPUExecutionProvider явно укажем выполнение на процессоре:
import onnxruntime as ort
session = ort.InferenceSession(
"model.onnx",
providers=["CPUExecutionProvider"]
)
input_name = session.get_inputs()[0].name
Имя входного тензора получаем непосредственно из модели, поэтому его не нужно прописывать вручную. Передадим сразу пять объектов одним батчем, предварительно приведя данные к float32 — именно такой тип ожидает экспортированная модель:
samples = X[:5].astype(np.float32)
predictions = session.run(
None,
{input_name: samples}
)
print(predictions[0])
Метод session.run() выполняет инференс и возвращает список выходных значений. Для нашего классификатора первый элемент содержит предсказанные классы, а второй — вероятности классов.
Осталось проверить, что конвертация не изменила результат классификации. Получим предсказания исходной модели на тех же данных и сравним их с результатом ONNX Runtime:
sklearn_preds = model.predict(samples)
onnx_preds = predictions[0]
print(np.array_equal(
sklearn_preds,
onnx_preds
))
Ожидаемый результат — True. Предсказанные классы совпадают, но для других моделей после конвертации возможны численные расхождения.
ONNX Runtime может ускорить инференс за счёт оптимизаций, однако результат зависит от модели, размера батча и оборудования. Не все операции scikit-learn поддерживают конвертацию, а прирост скорости стоит проверять бенчмарками.
🔥 ONNX Runtime позволяет запускать ML-модели без зависимости от обучающего фреймворка, что удобно при развёртывании API и сервисов инференса.
➡️ IT Ready | #практикаscikit-learn её можно экспортировать в ONNX и выполнять предсказания через ONNX Runtime. Это позволяет запускать модель без установленного scikit-learn в окружении инференса, а в некоторых случаях — ускорить обработку данных за счёт оптимизированного выполнения.
Разберём, как конвертировать обученную модель в ONNX, запустить инференс и проверить корректность предсказаний. Для начала установим зависимости:
pip install scikit-learn skl2onnx onnxruntime numpy
Обучим классификатор RandomForestClassifier на встроенном датасете Iris. Он содержит характеристики цветков трёх видов ириса, а наша модель будет определять вид по четырём числовым признакам:
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
X, y = load_iris(return_X_y=True)
model = RandomForestClassifier(
n_estimators=100,
random_state=42
)
model.fit(X, y)
Теперь экспортируем обученную модель в ONNX с помощью skl2onnx. Конвертер преобразует структуру Random Forest в операции ONNX, сохраняя обученные параметры. Переданный массив задаёт тип входных данных float32 и количество признаков, а размер батча остаётся переменным:
from skl2onnx import to_onnx
import numpy as np
onnx_model = to_onnx(
model,
X[:1].astype(np.float32),
target_opset=12
)
with open("model.onnx", "wb") as f:
f.write(onnx_model.SerializeToString())
Получили файл model.onnx, содержащий всё необходимое для выполнения модели. Теперь создадим сессию ONNX Runtime, которая загрузит вычислительный граф и подготовит его к инференсу. Через CPUExecutionProvider явно укажем выполнение на процессоре:
import onnxruntime as ort
session = ort.InferenceSession(
"model.onnx",
providers=["CPUExecutionProvider"]
)
input_name = session.get_inputs()[0].name
Имя входного тензора получаем непосредственно из модели, поэтому его не нужно прописывать вручную. Передадим сразу пять объектов одним батчем, предварительно приведя данные к float32 — именно такой тип ожидает экспортированная модель:
samples = X[:5].astype(np.float32)
predictions = session.run(
None,
{input_name: samples}
)
print(predictions[0])
Метод session.run() выполняет инференс и возвращает список выходных значений. Для нашего классификатора первый элемент содержит предсказанные классы, а второй — вероятности классов.
Осталось проверить, что конвертация не изменила результат классификации. Получим предсказания исходной модели на тех же данных и сравним их с результатом ONNX Runtime:
sklearn_preds = model.predict(samples)
onnx_preds = predictions[0]
print(np.array_equal(
sklearn_preds,
onnx_preds
))
Ожидаемый результат — True. Предсказанные классы совпадают, но для других моделей после конвертации возможны численные расхождения.
ONNX Runtime может ускорить инференс за счёт оптимизаций, однако результат зависит от модели, размера батча и оборудования. Не все операции scikit-learn поддерживают конвертацию, а прирост скорости стоит проверять бенчмарками.
🔥 ONNX Runtime позволяет запускать ML-модели без зависимости от обучающего фреймворка, что удобно при развёртывании API и сервисов инференса.
➡️ IT Ready | #практикаОставляю ссылочку: GitHub 📱➡️ IT Ready | #репозиторий
data = [1, 2, 3]
data.append(data)
После такой операции последний элемент не становится копией исходного списка. Он ссылается на тот же объект, что легко проверить с помощью оператора is.
print(data[-1] is data) # True
Интересно, что Python умеет корректно отображать подобные структуры. При выводе механизм repr() списка обнаруживает рекурсивную ссылку и обозначает её многоточием, предотвращая бесконечный вывод.
print(data) # [1, 2, 3, [...]]
Подобные связи встречаются в графах, объектных моделях и структурах с обратными ссылками. Однако при самостоятельном обходе таких данных необходимо учитывать циклы, иначе рекурсивный алгоритм может зациклиться.
Например, поверхностное копирование создаёт новый список, но сохраняет ссылки на исходные элементы:
copy = data.copy()
print(copy[-1] is data) # True
print(copy[-1] is copy) # False
При работе с циклическими структурами важно различать копирование контейнера и копирование всей связанной структуры объектов.
🔥 Понимание самоссылочных объектов помогает избегать ошибок при копировании, рекурсивном обходе и обработке графовых структур, где один объект может встречаться несколько раз.
👉 IT Ready | #совет