YeaHub Tech
412 subscribers
343 photos
15 videos
2 files
450 links
Новые технологии, советы и обучающие материалы

YeaHub — это платформа для IT-специалистов, объединяющая обучение, карьерный рост, развитие и сообщество единомышленников.

Платформа: https://yeahub.ru

Для связи: @ruslan_kuyanets
Download Telegram
#Vibecoding

🔖 Вайб-кодинг глазами разработчика с 20-летним стажем

Опытный разработчик провел эксперимент: за 4 часа создал полноценное веб-приложение с интеграцией Bitrix24, не написав ни строчки кода вручную — только через диалог с ИИ.

В статье он честно рассказывает о граблях, на которые наступил, сравнивает GPT-4.1, Claude Sonnet 3.7 и Grok на реальных задачах, объясняет когда нужна экспертиза разработчика, а когда справится и новичок, и делится опасениями о влиянии вайб-кодинга на профессиональные навыки программистов ⬇️


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#BigO

🔖 Big O: почему ваш код тормозит в продакшене

Код работает мгновенно на тестах, но ползёт как черепаха на реальных данных? Дело в Big O — нотации, которая предсказывает поведение алгоритма при росте нагрузки. O(1) работает всегда быстро, O(n) растёт линейно, а O(n²) превращается в кошмар на больших объёмах.

В отличие от замеров времени, Big O показывает закономерности роста сложности. Понимание четырёх основных категорий — константной, логарифмической, линейной и квадратичной — помогает писать код, который выдержит любую нагрузку.

Разберём на примерах: как превратить O(n²) в O(1), почему indexOf в цикле убивает производительность, и как бинарный поиск находит число среди миллиарда за 31 попытку. Готовы понять, что творится под капотом?⬇️


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
#github

🔖lightweight-charts: мощные финансовые графики для веба

Библиотека от TradingView для создания интерактивных финансовых графиков в веб-приложениях. Одна из самых маленьких и быстрых HTML5 финансовых библиотек.


🔸Что умеет:

- Свечные графики — классические японские свечи
- Линейные и площадные графики — для трендов
- Гистограммы — анализ объемов и метрик
- Кастомные плагины — расширяемая функциональность


🔸Преимущества:

✅Высокая производительность — размер близок к статическим изображениям
✅Без зависимостей — standalone версия "из коробки"
✅HTML5 Canvas — нативная отрисовка без DOM
✅Простое API — 3 строки кода для первого графика
✅Интерактивность — замена статических изображений


🔸Установка:
npm install lightweight-charts

Или через CDN: unpkg.com


🔸Идеально для:
- Финансовых приложений и дашбордов
- Замены статических графиков интерактивными
- Страниц с множественными диаграммами
- Высоконагруженных приложений


📎 Ссылка

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#GraphSAGE

🔖GraphSAGE: как масштабировать графовые нейросети до миллиардов связей

Знали ли вы, что рекомендации в UberEats и Pinterest работают на графовых нейросетях с миллиардами узлов? Разбираем GraphSAGE — архитектуру, которая решает проблему масштабирования GNN.


🔹Масштабы впечатляют:

- Pinterest (PinSAGE): 3 млрд узлов, 18 млрд связей
- UberEats: 600K ресторанов, 66 млн пользователей


🔹 Главная проблема GNN:

Обычные графовые сети не могут работать с большими данными — нужно обрабатывать ВСЕ соседние узлы, что становится катастрофически медленно.


🔹 Решение GraphSAGE:

1. Выборка соседей
- Берем только фиксированное количество случайных соседей
- Создаем мини-батчи из подграфов
- Избегаем "популярных" узлов-хабов

2. Быстрая агрегация
- Агрегатор средних значений (самый простой)
- LSTM-агрегатор (лучшая точность)
- Max-pooling агрегатор


🔹 Результаты теста:

На датасете PubMed (20K узлов):
- GCN: 78.4% точность за 52.6 сек
- GAT: 77.1% точность за 18 мин
- GraphSAGE: 77.2% точность за 12.4 сек

GraphSAGE в 88 раз быстрее GAT при почти той же точности!


🔹Компромисс:

- ❌ Теряем информацию из-за обрезки графа
- ✅ Можем обрабатывать графы любого размера
- ✅ Масштабируемость важнее идеальной точности


🔹Применение:

- Рекомендательные системы
- Социальные сети
- Анализ знаний
- Биоинформатика


GraphSAGE доказывает: иногда "достаточно хорошо, но быстро" лучше чем "идеально, но медленно".


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
#VectorDatabase

🔖Векторные базы данных: как LLM понимает мир

Знаете, как ChatGPT сочиняет сказки про единорогов за секунды? Секрет в векторных базах данных — технологии, которая превращает слова в числа и находит смысл в хаосе данных.


🔸Как это работает:

1. Эмбеддинг
Слова → векторы (списки чисел)
"единорог" = [0.2, -0.8, 1.3, ...]

2. Кодирование
Векторы проходят через нейросеть (линейное преобразование + ReLU)

3. Объединение
Усреднение по столбцам → один вектор предложения

4. Индексирование
Сжатие размерности для быстрого поиска

5. Поиск по сходству
Скалярное произведение находит "похожие" векторы


🔸Проблема масштаба:
- Миллиарды предложений в базе
- Тысячи измерений в каждом векторе
- Десятки тысяч токенов

Решение: Векторные БД хранят готовые эмбеддинги вместо их генерации на лету.


🔸Применение:
- RAG-системы (поиск + генерация)
- Рекомендательные системы
- Семантический поиск
- Чат-боты и ассистенты


🔸Алгоритмы поиска:
- Линейное сканирование — точно, но медленно
- HNSW — приблизительно, но быстро для миллиардов векторов


✔️Итог:
Векторные БД превращают "понимание" ИИ в математическую задачу. Похожие концепции получают близкие векторы в многомерном пространстве.


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
#CSS

🔖CSS-магия: создаем супергеройский комикс-макет

Забудьте про скучные прямоугольные макеты! Показываю, как CSS Grid + clip-path превращают обычную страницу в панели комикса Marvel.

🔸Что получаем:
- Нестандартные формы панелей (треугольники, многоугольники, эллипсы)
- Перекрывающиеся слои с реалистичной глубиной
- Кастомные "рамки" вокруг изображений
- Адаптивная сетка с поворотом всего макета


🔸Технический состав:

CSS Grid Foundation:
.panels {
display: grid;
grid-template-columns: 3fr repeat(4, 1fr) 2fr;
transform: rotate(-20deg) translateY(100px);
}


Clip-path Magic:
.panel-3 {
clip-path: polygon(0 18%, 20% 20%,
78% 71%, 63% 100%, 5% 80%);
}



🔸Секреты реализации:

1. Границы панелей
Обычные CSS-границы не работают с clip-path, поэтому:
- Белый фон для контейнера
- Уменьшенное изображение внутри (scale 0.95)
- Тот же clip-path для изображения

2. Инструменты разработки
Firefox Shape Path Editor — интерактивное создание polygons прямо в браузере!

3. Совместимость
IE11 не поддерживает clip-path, но современные браузеры работают отлично.


🔸Вдохновение из реальных комиксов:
- Marvel's Generations: Phoenix & Jean Grey
- Detective Comics 876
- Flash Comics series


🔸Возможности безграничны:
- Макеты журналов
- Креативные портфолио
- Интерактивные лендинги
- Игровые интерфейсы

Кто сказал, что веб должен быть прямоугольным?


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
#webdevelopment

🔖 Высокотехнологичные ресурсы для веб-разработчиков

Веб-разработка не стоит на месте. Собрал подборку малоизвестных, но мощных инструментов, которые поднимут ваши проекты на новый уровень.


🔹UI/UX & Design

Chakra UI — React-библиотека с готовыми компонентами
Тематическое оформление + доступность из коробки

Framer — интерактивные прототипы с реальным кодом
Мост между дизайном и разработкой

Midjourney — AI для генерации визуальных концепций
Уникальные дизайн-решения по текстовому описанию


🔹Фуллстек & Backend

RedwoodJS — React + Prisma в одном фреймворке
Единая экосистема для фронта и бэка + GraphQL API

Deno Deploy — безопасное развертывание TypeScript
Альтернатива AWS Lambda с фокусом на безопасность


🔹Технологии

Alchemy — инструменты для Web3 и dApps
Полный стек для блокчейн-разработки

Three.js — 3D-графика в браузере через WebGL
VR/AR и интерактивные 3D-конфигураторы


🔹Совет от автора:

- Начинайте с малого — выберите 1-2 инструмента
- Присоединяйтесь к сообществам
- Вносите вклад в open source проекты


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
#golang

🔖Паттерн «Стратегия» в Go: от хаоса к порядку

Надоели бесконечные if-else и switch в коде? Паттерн «Стратегия» превращает спагетти-код в элегантную архитектуру с взаимозаменяемыми алгоритмами.


Когда использовать:


Было:
switch operation {
case "add": return a + b
case "subtract": return a - b
case "multiply": return a * b
// ... еще 20 кейсов
}


Стало:
calculator.SetStrategy(AddStrategy{})
result := calculator.Calculate(10, 5)



©️Три простых шага:

1. Интерфейс стратегии — общий контракт для алгоритмов
2. Конкретные реализации — каждый алгоритм в отдельном классе
3. Контекст — управляет выбором и выполнением стратегий


©️Реальные применения:

- Платежи: PayPal, карта, крипта — одним переключением
- Сортировка: быстрая, пузырьковая, слиянием — по размеру данных
- Сжатие: ZIP, RAR, GZIP — динамический выбор
- ML алгоритмы: линейная регрессия vs случайный лес


©️Преимущества:

✅ Принцип открытости/закрытости — новые стратегии без изменения кода
✅ Тестируемость — каждый алгоритм изолированно
✅ Читаемость — прощай, огромные switch'и
✅ Масштабируемость — добавляй стратегии на лету


©️Вместо цирка из условий:

Паттерн «Стратегия» использует отношение has-a (композиция), делая код гибким и расширяемым. Каждая стратегия — самостоятельная единица, которую можно тестировать и переиспользовать.


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
#sysadmin

🔖Цифровая энтропия: почему сервер с аптаймом в 1000 дней — это бомба замедленного действия

Сисадмин со стажем рассказал историю про сервер «Феникс» с аптаймом 986 дней. Гордость команды. Пример для новичков. После планового выключения-включения не взлетел — RAID-контроллер решил, что с него хватит. Тогда автор осознал: цифровой мир подчиняется тем же законам распада, что и физический.

В теории код и данные вечны. На практике любая система деградирует. Это цифровая энтропия — медленный скат в беспорядок. Долгий аптайм не показатель стабильности, а тикающая бомба. Система годами не проверяла собственные процедуры запуска.


Примеры из жизни: vSphere-хост после перезагрузки не нашел загрузочный USB — он был поврежден. SAN с аптаймом 1400 дней никто не трогал, боясь массового отказа дисков. Сервер выключили заменить диск в RAID — при включении умер еще один. Debian с аптаймом 1300+ дней — репозитории для этой версии уже не существуют.

Причины страха перезагрузки рациональны: файлы загрузки могут быть повреждены, железо деградирует (смазка густеет, конденсаторы высыхают), обновления безопасности не установлены годами.

Призраки в системе: утечки памяти в Apache/PHP/PostgreSQL, зомби-процессы исчерпывают PID, протухший DNS-кэш на всех уровнях, разросшиеся логи съедают диск. Долгий аптайм усугубляет все это.

Решение — смена философии. От «серверов-питомцев» (их лечат) к «серверам-стаду» (их заменяют). Неизменяемая инфраструктура: золотой образ, регулярная замена серверов, никаких ручных правок. Проблема долгого аптайма исчезает, утечки сбрасываются, дрейф конфигурации невозможен.

Главное правило: если боитесь перезагружать сервер — вы уже потеряли над ним контроль.


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
#webdev

🔖 Что если не отправлять HTML вообще?

Знаете, что делает большинство фреймворков? Они генерируют HTML на сервере, отправляют его вам, а потом начинают танцы с бубном под названием "гидратация". Тяжело, медленно, дорого.

А разработчик Neo.mjs подумал: "А что если вообще не отправлять HTML?"

И сделал приложение, которое стартует с пустым body. Звучит дико?


🔸Вот как это происходит:

Браузер получает крошечные JS-генераторы, кэширует их один раз, и всё. Дальше с сервера летит только лёгкий JSON с данными — никакого HTML-мусора. Генераторы строят интерфейс на лету, и навигация работает так быстро, что кажется, будто страницы уже загружены.

Внутри этого приложения живёт редактор Monaco — 3 мегабайта кода из VSCode. Обычно такой монстр хоронит любые метрики производительности. Но здесь он летает. Более того — вы пишете код прямо в нём, импортируете модули, и они вживую встраиваются в приложение. Без перезагрузки. Магия? Нет, SharedWorker.


🔸Самое безумное:

Вы можете открыть компонент и буквально вытащить его в другое окно браузера. Не создать копию. Не открыть iframe. А переместить тот же самый JS-объект! Открыли три окна? Они все синхронизированы, делят состояние, работают как один организм.

И вот кульминация: production-версия приложения (минифицированная, оптимизированная) и development-код из редактора работают одновременно в одном SharedWorker, не конфликтуя. До недавнего времени это было технически невозможно.


🔸Почему это важно?

Потому что main thread свободен. Пока другие фреймворки душат браузер вычислениями, Neo.mjs спокойно выдаёт 60 FPS, потому что вся тяжёлая работа в воркере. Плюс экономия трафика — для корпораций с тысячами пользователей это реальные деньги.

Откройте демо, покликайте по навигации. Переходы мгновенные. А ведь страницы генерируются прямо сейчас, на ваших глазах.

Код открыт, MIT-лицензия. И да, там спрятан секретный режим "cube layout". Просто потому что можно 😎

Демо | GitHub


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
#Cloudflare

🔖Cloudflare запустила свой стейблкоин для AI-агентов

Cloudflare представила Net Dollar — криптовалюту, привязанную к доллару 1:1. Но это не очередной стейблкоин для трейдеров, а инфраструктура для "экономики агентов".


🔸Зачем это нужно?
Идея в том, что AI-агенты смогут совершать платежи автоматически: покупать билеты, когда цена упала, оплачивать API-запросы или заказывать продукты. Всё это — без участия человека и мгновенно.

Cloudflare считает, что традиционные банковские переводы слишком медленные для такого сценария. Net Dollar обещает:
• Платежи из любой точки мира
• Мгновенные микротранзакции
• Новую модель монетизации для разработчиков


🔸Что говорит CEO:
"Десятилетиями интернет жил на рекламе и банковских переводах. Следующая эра — это оплата по факту использования и микротранзакции", — Мэтью Принс.

🔸Скептически:
Вопрос в том, нужен ли для этого ещё один стейблкоин, или это решение в поисках проблемы. Пока что AI-агенты с кошельками звучат как концепция из далёкого будущего.


🔸Бонус: на прошлой неделе Cloudflare также анонсировала свой email-сервис — Cloudflare Email Service, который объединит отправку и маршрутизацию писем в одном интерфейсе.


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#GitHub

🔖Рабочий процесс на GitHub: как работать профессионально

Работа в команде требует чёткой организации. Разбираем ключевые этапы GitHub workflow — от создания issue до слияния кода.

🔸1. Issues — начало всего

Формулируем задачи по шаблону:
[FIX]: Fix auth flow
[STYLE]: Improve login page styling
[FEATURE]: Implement admin dashboard


Крупные задачи разбиваем на подзадачи с префиксом [SUB-FEAT].

🔸2. Ветки

Создаём ветку отдельно от main, чтобы ошибки не попали в продакшн. GitHub позволяет привязать issue к ветке — после мержа проблема закроется автоматически.

Формат именования:
<type>/<issue-number>/<short-description>
fix/92/fix_auth_flow
feature/15/implement_dashboard


🔸3. Коммиты

Правила хорошего коммита:
• Коммитим часто, не ждём завершения всей фичи
• Пишем понятные сообщения до 50 символов
• Используем настоящее время и повелительное наклонение

Примеры:
feat: implement dashboard header
fix: fix data fetching
refactor: improve API readability


Для монорепозиториев добавляем scope:
feat(front): implement dashboard header
feat(back): implement dashboard APIs


🔸4. Pull Request

После пуша создаём PR. Название должно отражать ветку без номера issue:
feature/implement-dashboard
style/improve-login-page-styling


Добавляем описание, связываем с issue, назначаем ревьюверов, ставим метки (bug, feature, enhancement).

🔸5. Code Review

Рекомендуется минимум 2 ревьювера на каждый PR. Это помогает найти больше проблем и делиться знаниями внутри команды.

🔸6. Merge

После аппрува мержим PR — связанная issue закроется автоматически. Не забываем удалить ветку, чтобы держать репо в чистоте.

✔️ Итого:
Issue → Branch → Commits → PR → Review → Merge

Полезные типы:
feat, style, fix, enhance, refactor, docs

Scope'ы для монорепо:
front, back, api, db, docs, test, chore

Лайфхак: используйте Git-хук pre-commit для автоматической проверки формата коммитов.

Поначалу кажется сложно, но быстро входит в привычку.


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
This media is not supported in your browser
VIEW IN TELEGRAM
#Video

🔖Улучшение воспроизведения видео с помощью ExoPlayer

Команда Reddit поделилась практическими советами по оптимизации видео на Android, подкреплёнными реальными production-данными. Разбираем ключевые находки.


🔸Доставка контента: MP4 vs DASH

75% видео на Reddit длятся менее 45 секунд. Команда провела эксперимент: для коротких роликов заменили адаптивный DASH на обычный MP4.

Результаты для видео < 45 сек:
• Ошибки воспроизведения: -5,5%
• Выход до старта видео: -2,5%
• Общие просмотры: +1,7%

Вывод: для короткого контента адаптивные протоколы избыточны — MP4 быстрее и надёжнее.


🔸Кэширование: подводные камни

Проблемы SimpleCache:
• ExternalDir недоступен везде (например, на OPPO) — лучше использовать internalDir
• Может удалять другие файлы — нужна отдельная папка
• Бьёт по диску в конструкторе — создавайте в фоновом потоке
• URL как ключ — если у вас разные сигнатуры, нужна своя фабрика ключей


🔸Предзагрузка контента

Протестировали варианты: следующее видео, два параллельно, только MP4. Лучше всего сработала предзагрузка только следующего видео:

• Загрузка < 500ms: +1,9%
• Загрузка > 1000ms: -0,872%

Попытка учитывать пропускную способность (2-20 Мбит/с) провалилась — метрики ухудшились.


🔸LoadControl: настройка буферизации

По умолчанию значения буфера в ExoPlayer слишком большие для коротких видео. Reddit снизил:
• bufferForPlaybackAfterRebufferMs: 1000ms
• minBuffer и maxBuffer: 20000ms

Результаты:
• Загрузка < 250ms: +2,7%
• Загрузка < 500ms: +4,4%
• Загрузка > 1000ms: -11,9%
• Ребуферинг: -4,8%
• Общие просмотры: +1,5%

Самый впечатляющий эксперимент!


🔸BandwidthMeter и адаптивный битрейт

Проблема: предзагрузка через DownloadManager не учитывалась в общей пропускной способности. После фикса:

• Разрешение видео: +1,4%
• Просмотры в цепочке: +0,5%
• Смена битрейта: -0,5%
• Загрузка > 1000ms: +0,3% (компромисс)


🔸Декодеры

Ошибка 4001 (декодер недоступен) — частая проблема. Решения:
• Включить fallback на программный декодер
• Запрашивать audio focus явно
• Рассмотреть пул плееров или один экземпляр

Fallback снизил ошибки на 0,9%.


🔸Рендеринг: SurfaceView vs TextureView

SurfaceView эффективнее (рендерит на GPU напрямую), но до Android N были проблемы с анимациями.

В Compose постоянное re-inflation занимало до 30ms. Решение — собственный ViewPool:

• Загрузка < 250ms: +1,7%
• Просмотренные минуты: +1,4%
• P50 создания: улучшено в 30 раз (1ms)


🔸Ключевой вывод

Всё упирается в аналитику и A/B-тесты. Обязательные метрики:
• Время до первого кадра
• Ребуферинг
• Старт/стоп воспроизведения
• Ошибки

ExoPlayer предоставляет AnalyticsListener для трекинга.


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Forwarded from YeaHub
🚀 Прокачиваем подготовку к собеседованиям на максимум!

Если ты ещё не заглядывал(а) в 👍 «Авось Прорвёмся» — самое время.
Это проект Ани для самостоятельной подготовки, где есть:
- 1000+ записей реальных собеседований с разбором задач и вопросов;
- контакты рекрутеров;
- гайды по резюме, трудоустройству и стратегиям поиска работы.
- задачи и вопросы с собеседований

Мы в YeaHub продолжаем добавлять собеседования из этих чатов — теперь их можно проходить в тренажёре, тренируя ответы на реальные вопросы работодателей.

🎧 Сначала слушай, как проходят настоящие собесы,
💡 потом — разбирай и практикуй те же кейсы в тренажёре.


Направления: iOS, Android, Frontend, Python, Go, Java, C#, QA, Analytics.

👉 Обучайтесь, общайтесь, растите вместе с YeaHub и Авось Прорвемся
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🔥3🤝3
#MachineLearning

🔖 Как Random Forest вычисляет продавцов-мошенников на маркетплейсах

Автор столкнулась с обманом на маркетплейсе и решила разобраться: можно ли с помощью ML выявлять мошенников до того, как они обманут покупателей?


🔸 Данные

Набор данных с Kaggle содержит информацию о продавцах C2C-платформы: подписчики, активность, количество товаров, давность входа. Целевая переменная Fraud (1 = мошенник) добавлена на основе несоответствия отправленного товара описанию.

Проблема: датасет несбалансирован — среднее значение Fraud меньше 0.5, что означает перекос в сторону честных продавцов.


🔸 Построение модели

Используется Random Forest с GridSearchCV для подбора гиперпараметров. Ключевой момент — параметр class_weight: ['balanced', 'balanced_subsample'] для борьбы с дисбалансом классов.

Метрика оптимизации — ROC AUC score.

Первый запуск:
paramdict = {
'criterion': ['gini','entropy'],
'min_samples_leaf': range(1,5),
'class_weight': ['balanced','balanced_subsample'],
...
}


Результат показал, что min_samples_leaf=4 (верхняя граница диапазона) — нужно расширить поиск.

Второй запуск:
'min_samples_leaf': range(4,10)


Лучшие параметры оказались внутри диапазона — модель найдена.

Результат: Recall для класса 1.0 (мошенники) = 69.77%

Недостаточно для production!


🔸 Оптимизация порога

Автор предлагает сместить акцент с точности на полноту (Recall). Логика:

Два типа ошибок:
- False Negative: пропустили мошенника (опасно!)
- False Positive: заблокировали честного продавца (менее критично)

Лучше заблокировать несколько честных продавцов, чем пропустить мошенника — на маркетплейсе всегда много альтернатив.

ROC-кривая в 3D

Построена интерактивная 3D ROC-кривая с осями:
- X: False Positive Rate
- Y: True Positive Rate
- Z: Probability Threshold

Автор отмечает три точки компромисса:

Красная черта: FPR ≈ 36%, порог = 0.35
Оранжевая: FPR ≈ 50%, порог = 0.25
Зелёная: FPR ≈ 60%, порог = 0.20

Выбор зависит от толерантности к ложным срабатываниям. Автор выбрала зелёную (порог 0.20) как оптимальную.


🔸 Финальные результаты

После сдвига порога до 0.20:

Recall для класса 1.0 = 90.11%

Прирост с 69.77% до 90.11% — модель теперь обнаруживает 9 из 10 мошенников!


🔸 Ключевые выводы

1. Дисбаланс классов решается через class_weight='balanced'
2. GridSearchCV помогает найти оптимальные гиперпараметры
3. Сдвиг порога критически важен для несбалансированных задач
4. ROC-кривая в 3D — удобный инструмент для выбора порога
5. Бизнес-логика важнее технических метрик: лучше больше FP, чем FN

Практическое применение:

Маркетплейс может использовать эту модель для:
- Автоматической проверки новых продавцов
- Дополнительной верификации подозрительных аккаунтов
- Приоритизации ручных проверок

Конечно, 10% мошенников всё равно проскочат, но это огромный прогресс для защиты покупателей.


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🔖 Распознавание речи в реальном времени с Python и AssemblyAI

Создаём систему, которая транскрибирует речь с микрофона в текст в режиме реального времени, с автоматической расстановкой знаков препинания и заглавных букв.


🔸 Цель проекта

Каждую секунду микрофон передаёт аудио в AssemblyAI, которая распознаёт речь пословно. По завершении предложения ИИ понимает смысл и добавляет пунктуацию.


🔸 Установка

pip install pyaudio
pip install websockets


Mac: brew install portaudio — всё настроится автоматически

Windows: Скачайте wheel-файл с [неофициального сайта Python](https://www.lfd.uci.edu/~gohlke/pythonlibs/), затем:
pip install pyaudio‑0.2.11‑cp39‑cp39‑win_amd64.whl


Импорты:
import websockets
import asyncio
import base64
import json
from configure import auth_key
import pyaudio


🔸 Настройка конфигурации

Создайте файл configure.py:
auth_key = 'ваш_API_ключ_из_AssemblyAI'


Ключ можно получить на сайте AssemblyAI. Для real-time транскрибации нужен платный план.

🔸 Параметры аудио

FRAMES_PER_BUFFER = 3200
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 16000

p = pyaudio.PyAudio()

stream = p.open(
format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=FRAMES_PER_BUFFER
)

URL = "wss://api.assemblyai.com/v2/realtime/ws?sample_rate=16000"


Частота дискретизации 16000 синхронизирована с AssemblyAI API.


🔸 Асинхронные функции

Главная функция подключения:
async def send_receive():
async with websockets.connect(
URL,
extra_headers=(("Authorization", auth_key),),
ping_interval=5,
ping_timeout=20
) as _ws:

session_begins = await _ws.recv()
print(session_begins)


Функция отправки аудио:
async def send():
while True:
try:
data = stream.read(FRAMES_PER_BUFFER)
data = base64.b64encode(data).decode("utf-8")
json_data = json.dumps({"audio_data": str(data)})
await _ws.send(json_data)
except websockets.exceptions.ConnectionClosedError as e:
break
await asyncio.sleep(0.01)
return True


Функция получения текста:
async def receive():
while True:
try:
result_str = await _ws.recv()
print(json.loads(result_str)['text'])
except websockets.exceptions.ConnectionClosedError as e:
break


🔸 Запуск

send_result, receive_result = await asyncio.gather(send(), receive())

while True:
asyncio.run(send_receive())


Запустите командой:
python speech_recognition.py



🔸 Как это работает

1. Микрофон захватывает аудио каждые 3200 фреймов
2. Аудио кодируется в base64 и отправляется через WebSocket
3. AssemblyAI транскрибирует в реальном времени
4. Получаете два типа результатов:
- Частичные: посекундная транскрипция
- Финальные: с заглавными буквами и пунктуацией

Пример вывода:
hello
hello world
hello world this
Hello world, this is a test.



🔸 Особенности

- ИИ автоматически форматирует предложения
- Добавляет знаки препинания
- Исправляет грамматику
- Работает в реальном времени с минимальной задержкой


🔸 Ключевые технологии

- pyAudio — захват аудио с микрофона
- websockets — двусторонняя связь с API
- asyncio — асинхронная обработка
- AssemblyAI — ML-движок для распознавания речи

С развитием ИИ создание таких систем стало гораздо проще. Раньше точное распознавание речи было сложной задачей, теперь это реализуется несколькими десятками строк кода.


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🔖 NPM-пакеты: что это, откуда взялись и когда их использовать

Пакеты NPM — компоненты многократно используемого кода, которые делают JavaScript-разработку более управляемой. Разбираемся в истории, преимуществах и сценариях использования.


🔸 Что такое NPM-пакеты?

Пакет NPM — многократно используемый код JavaScript, которым можно делиться через реестр NPM. От простых утилит до полноценных фреймворков.

Ключевые особенности:
• Многократное использование — написал один раз, используй везде
• Контроль версий через семантическое версионирование (1.0.0)
• Совместная работа через публичный реестр


🔸История: как было до NPM

Начальный период (до 2009):
• Copy-paste — копировали код с форумов, что вело к несоответствиям
• Ручная загрузка — скачивали jQuery с сайта и подключали через <script>
• Git-репозитории — клонировали вручную, управляли зависимостями самостоятельно
• Браузерные войны — адаптировали код под IE или Netscape

Рождение NPM (2009):

Выход Node.js позволил JavaScript работать на серверах. Появилась потребность в эффективном обмене кодом. NPM решил проблему:
• Централизованный реестр пакетов
• Простая установка: npm install <package-name>
• Автоматическое управление зависимостями


🔸 Когда СТОИТ создавать NPM-пакет

1. Многократное использование

Если код решает общую проблему в нескольких проектах:

// Валидатор email
function isValidEmail(email) {
const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return regex.test(email);
}

// Публикуем как пакет
npm install my-email-validator


2. Межкомандное сотрудничество

Для больших организаций, где фронтенд, бэкенд и мобильные команды используют общий код:

// Общие типы TypeScript
export type User = {
id: string;
name: string;
email: string;
};

npm install @company/shared-types


3. Вклад в open source

Публикация помогает другим разработчикам и укрепляет вашу репутацию.

4. Заполнение пробела

Если для вашей проблемы нет решения — создайте пакет, который интегрируется со сложным API или форматирует данные уникальным образом.


🔸 Когда НЕ стоит создавать пакет

1. Код слишком специфичен

Скрипт, работающий только с вашей уникальной схемой БД, не имеет смысла публиковать.

2. Слишком простой код

// Слишком просто для пакета
const reverseString = (str) => str.split('').reverse().join('');


Лучше поделиться как фрагментом или включить в существующую библиотеку.

3. Уже есть лучшее решение

Перед созданием проверьте реестр NPM. Зачем дублировать date-fns?

// Ваша функция
function formatDate(date) {
const d = new Date(date);
return `${d.getMonth() + 1}/${d.getDate()}/${d.getFullYear()}`;
}

// Уже есть date-fns
import { format } from "date-fns";
console.log(format(new Date("2023-01-01"), "MM/dd/yyyy"));


4. Нет ресурсов на поддержку

Публикация = обязательства: обновления, исправление багов, поддержка пользователей. Пакет с хакатона, который никто не будет поддерживать, лучше не публиковать.


🔸 Итого

NPM-пакеты — основа современной JavaScript-разработки. Они позволяют:
• Переиспользовать код
• Обеспечивать консистентность в командах
• Делиться решениями с сообществом

Но помните: не каждый код должен стать пакетом. Оцените масштаб задачи и готовность к долгосрочной поддержке.


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🔖 6 лайфхаков для улучшения JavaScript-кода

Современный JavaScript развивается стремительно. Разбираем 6 фич, которые делают код короче и чище.


1. Опциональные цепочки (?.)

Безопасная навигация по объектам без множественных проверок:

const someObject = {
profile: {
firstName: 'Nicky',
lastName: 'Christensen'
}
}

// ✅ С optional chaining
if (someObject?.profile?.firstName) {
console.log(someObject.profile.firstName)
}

// ❌ Старый способ
if (someObject && someObject.profile && someObject.profile.firstName) {
console.log(someObject.profile.firstName)
}

// Не выполнится, если свойства нет
if (someObject?.profile?.name) {
console.log('Not executed')
}


2. Оператор нулевого слияния (??)

Возвращает правый операнд только если левый null или undefined:

const falsy = false;
const emptyString = '';
const nullish = null;

console.log(falsy ?? 'Default'); // false
console.log(emptyString ?? 'Default'); // "" (не заменяется!)
console.log(nullish ?? 'Default'); // "Default"

// VS оператор ||
console.log(falsy || 'Default'); // "Default"
console.log(emptyString || 'Default'); // "Default"
console.log(nullish || 'Default'); // "Default"


Преимущество `??`: не заменяет false, 0 или "" — только null/undefined.

3. Динамический импорт

Асинхронная загрузка модулей (code splitting):

let someAsyncModule = await import('/modules/my-module.ts');


4. Promise.allSettled()

Узнать результат всех промисов, даже отклонённых:

const promise1 = Promise.resolve("OK");
const promise2 = Promise.reject("Error");
const promise3 = Promise.resolve("Done");

Promise.allSettled([promise1, promise2, promise3])
.then((results) => console.log(results));

// Результат:
// [
// { status: 'fulfilled', value: 'OK' },
// { status: 'rejected', reason: 'Error' },
// { status: 'fulfilled', value: 'Done' }
// ]


Отличие от `Promise.all()`: не падает при reject, показывает статус каждого промиса.

5. Spread-оператор (...)

Для массивов:
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const arr3 = [...arr1, ...arr2]; // [1,2,3,4,5,6]


Для объектов:
const basePerson = {
name: 'Nicky C',
country: 'DK'
}

const footballer = {
...basePerson,
team: 'Man UTD',
shirtNumber: '11'
}
// { name: 'Nicky C', country: 'DK', team: 'Man UTD', shirtNumber: '11' }


6. Деструктуризация объектов

Распаковка значений из объекта в переменные:

const footballer = {
name: 'Nicky C',
team: 'Man UTD',
shirtNumber: '11'
}

const { team, shirtNumber } = footballer;
console.log(team, shirtNumber); // "Man UTD" "11"



🔸Итог

- Сокращают код
- Улучшают читаемость
- Снижают количество багов
- Стандарт в современном JavaScript


Используйте уже сегодня!


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2