Токенмаксинг делает разработчиков менее продуктивными Разрабы начали меряться не аптаймом или оптимизацией, а размером выделенных лимитов на ИИ-токены. Эффективные менеджеры радостно хлопают в ладоши, глядя на красивые графики: агенты типа Cursor и Claude Code генерируют тонны кода, а первоначальный апрув пулл-реквестов доходит до 80-90%. Кажется, вот она, сингулярность и х10 продуктивность. Но есть один нюанс. Аналитики из контор типа Waydev и GitClear копнули метрики и выдали: этот ИИ-код потом приходится неистово переписывать. Выяснилось, что реальный процент выживаемости сгенерированных строк болтается на уровне жалких 10-30%. Чурн (удаление и переписывание уже принятого кода) вырос на дикие 861%. Особенно страдают джуны, которые слепо апрувят всё, что выплевывает нейронка, а потом синьор с дергающимся глазом разгребает этот технический долг на ревью.
Программирование — страница 5
Лента темы
Задача: 507. Perfect NumberСложность: easyСовершенное число — это положительное целое число, которое равно сумме своих положительных делителей, исключая само число. Делитель целого числа x — это целое число, которое может делить x нацело.Дано целое число n, верните true, если n является совершенным числом, в противном случае верните false.Пример:Input: num = 28Output: trueExplanation: 28 = 1 + 2 + 4 + 7 + 141, 2, 4, 7, and 14 are all divisors of 28.👨💻 Алгоритм:1⃣ИнициализацияЕсли число num меньше или равно 0, вернуть false. Инициализируйте переменную sum значением 0.2⃣Поиск делителей и вычисление суммыПереберите числа от 1 до квадратного корня num. Если число является делителем num, добавьте его к sum. Если делитель не равен квадратному корню num, добавьте к sum также результат деления num на делитель.3⃣Проверка на совершенное числоВычтите num из sum. Если результат равен num, вернуть true, иначе вернуть false.😎 Решение: class Solution {public: bool checkPerfectNumber(int num) { if (num <= 0) return false; int sum = 0; for (int i = 1; i * i <= num; ++i) { if (num % i == 0) { sum += i; if (i * i != num) { sum += num / i; } } } return sum - num == num; }};Ставь 👍 и забирай 📚 Базу знаний
🤔 Чем отличаются STL контейнеры vector и array?Это контейнеры из стандартной библиотеки, но у них есть важные различия в управлении памятью, гибкости и производительности.🟠Различия в управлении памятьюstd::vector использует динамическую память, выделяемую в куче (heap). Его размер может изменяться во время выполнения.std::array использует статическую память, выделяемую в стеке (stack) или в статической области памяти, и его размер фиксирован на этапе компиляции.#include <vector>#include <array>#include <iostream>int main() { std::vector<int> vec = {1, 2, 3}; // Размер может изменяться динамически vec.push_back(4); // Добавляем новый элемент std::array<int, 3> arr = {1, 2, 3}; // Размер фиксирован, нельзя добавить новый элемент std::cout << "Vector size: " << vec.size() << std::endl; // Выведет 4 std::cout << "Array size: " << arr.size() << std::endl; // Выведет 3 return 0;}🟠Гибкость и изменение размераstd::vector позволяет изменять размер в процессе работы, автоматически выделяя новую память при необходимости.std::array имеет фиксированный размер, который нельзя изменить после создания.std::vector<int> v = {1, 2, 3};v.push_back(4); // Увеличиваем размерstd::array<int, 3> a = {1, 2, 3};// a.push_back(4); // Ошибка! У std::array нет метода push_back🟠Производительностьstd::array работает быстрее, так как все данные хранятся в непрерывном участке памяти и нет затрат на динамическое выделение.std::vector может требовать дополнительное время при изменении размера, так как может потребоваться новое выделение памяти и копирование элементов.#include <vector>#include <array>#include <chrono>#include <iostream>int main() { constexpr int N = 1'000'000; std::vector<int> vec(N, 1); // Динамический массив std::array<int, N> arr{}; // Статический массив auto start = std::chrono::high_resolution_clock::now(); for (int i = 0; i < N; ++i) vec[i] += 1; auto end = std::chrono::high_resolution_clock::now(); std::cout << "Vector time: " << std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() << " us" << std::endl; start = std::chrono::high_resolution_clock::now(); for (int i = 0; i < N; ++i) arr[i] += 1; end = std::chrono::high_resolution_clock::now(); std::cout << "Array time: " << std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() << " us" << std::endl; return 0;}🟠Совместимость с C-APIstd::array хранит данные как обычный C-массив, поэтому можно легко передавать его в функции, ожидающие int*.std::vector использует динамическую память, но можно получить указатель на внутренний буфер с помощью data().void processArray(int* arr, size_t size) { for (size_t i = 0; i < size; ++i) { std::cout << arr[i] << " "; }}int main() { std::array<int, 3> arr = {1, 2, 3}; std::vector<int> vec = {4, 5, 6}; processArray(arr.data(), arr.size()); // std::array можно передавать в C-функции processArray(vec.data(), vec.size()); // std::vector тоже можно передавать return 0;}🟠Итераторы и стандартные алгоритмыОба контейнера поддерживают итераторы и совместимы со стандартными алгоритмами из #include <algorithm>#include <iostream>#include <vector>#include <array>#include <algorithm>int main() { std::vector<int> vec = {3, 1, 4, 1, 5}; std::array<int, 5> arr = {3, 1, 4, 1, 5}; std::sort(vec.begin(), vec.end()); std::sort(arr.begin(), arr.end()); for (int n : vec) std::cout << n << " "; // 1 1 3 4 5 std::cout << std::endl; for (int n : arr) std::cout << n << " "; // 1 1 3 4 5 return 0;}Ставь 👍 и забирай 📚 Базу знаний
«Моя жена — самая умная женщина из всех, что я встречал. Именно после встречи с ней я понял, что умницы невероятно привлекательные», – говорил Патрик Суэйзи о Лизе Ниеми.Они оставались вместе более З8 лет, полюбив друг друга совсем юными. И так было до последнего момента, когда Патрика не стало.Лизе было 15, когда она познакомилась с 18-летним красавцем в балетной школе его мамы. Молодые люди начали встречаться. Патрик и Лиза часто вместе выступали и, казалось, понимали друг друга с полуслова и полувзгляда.Через 4 года со дня встречи сыграли свадьбу. Их семейную жизнь нельзя было назвать легкой. Слава Патрика кружила ему голову, женщины буквально не давали прохода. Нередко красавец отвечал им флиртом. Лиза ревновала, отношения становились напряженными, у Суэйзи начались проблемы с алкоголем. Однажды девушка не выдержала и ушла от него на время.Лизу мучило и то, что её муж мечтал стать отцом, а она не могла исполнить это желание: «Мы оба любили и всегда хотели детей. Иногда случалось, что я была беременна, но у меня всегда были выкидыши. Они... разбивали сердце нам обоим».Несмотря ни на что, для всего мира они продолжали быть идеальной парой: всегда и везде были вместе и держались за руки.Когда у Патрика обнаружили рак, Лиза как могла помогала сохранять веру в лучшее. Она получила лицензию пилота, чтобы иметь возможность возить мужа на лечение на вертолёте с их ранчо. В 2009-м Патрика не стало. Всю свою жизнь он прожил с одной женщиной.«Мы постоянно говорили, что любим друг друга, снова и снова, – вспоминает Лиза. – Я никогда не выходила из комнаты, пока не произнесу эту фразу. И до сих пор у меня такое чувство, что я не сказала ему достаточно этих слов».Какие фильмы с Патриком Суэйзи смотрели? Какие ещё знаете истории любви на всю жизнь?🤍🤍🌹🤍🤍Мир Светланы Ткачёвой Подписывайтесь на мой канал в МАХ📲
👀 Смотрим внутрь любой .NET-сборкиБывает, что нужно понять, что делает библиотека без исходников, разобраться в чужом коде или проверить, что именно скомпилировал компилятор. ILSpy решает эту задачу это открытый декомпилятор .NET-сборок, который превращает IL-байткод обратно в читаемый C#.ILSpy открывает любой .dll или .exe и показывает декомпилированный C#-код с навигацией по типам, методам и свойствам. Поддерживает поиск по всей сборке, переходы по гиперссылкам между типами и историю навигации.Visual Studio 2022 и 2026 используют движок ILSpy внутри для F12-навигации по декомпилированным источникам, так что если вы нажимали «Go to Definition» на тип из NuGet-пакета, вы уже работали с ILSpy.CLI-инструмент для Linux, Mac и Windows:dotnet tool install -g ilspycmdПосле установки можно декомпилировать прямо из терминала:ilspycmd MyLibrary.dllИспользование как библиотекиДвижок декомпилятора доступен отдельным NuGet-пакетом ICSharpCode.Decompiler. Его можно встроить в собственные инструменты:var decompiler = new CSharpDecompiler("MyLibrary.dll", new DecompilerSettings());var code = decompiler.DecompileWholeModuleAsString();Console.WriteLine(code);➡️ Репозиторий📍 Навигация: Вакансии • Задачи • Собесы🐸 Библиотека шарписта#sharp_view
Valve выпустила новую версию Proton под ARM64.Это значит, что теперь можно запускать x86 приложения на ARM-процессорах. И скоро Steam OS начнут накатывать на устройства с мобильными чипами. Правда это бета и Proton 11 не очень стабильный, поэтому на разных девайсах многое может не работать.Один чел уже запустил Steam OS на Switch. 👀
Qwen3.6-35B-A3B в 2-bit режиме провела полный bug hunt:• нашла баги • собрала доказательства • создала repro • написала фиксы • добавила тесты • и оформила PR И всё это локально.13GB RAM. Без облаков.За время работы модель:• сделала 30+ tool calls • прошерстила 20 сайтов • исполняла Python код Топ для такой крохи!GitHub: https://github.com/unslothai/unsloth
🤔 Может ли абстрактный метод быть вне абстрактного класса?Нет, абстрактный метод не может существовать вне абстрактного класса. В C# это ограничение встроено в язык, чтобы поддерживать строгую логику наследования и полиморфизма.🚩Почему абстрактный метод требует абстрактного класса?Абстрактный метод — это метод, который объявлен, но не имеет реализации. Он выступает как "контракт", который обязан быть реализован в производном классе. public abstract class Shape{ public abstract double CalculateArea();}Абстрактные методы имеют следующие особенности:Они не могут содержать тело (реализацию).Их цель — заставить производные классы реализовать конкретную функциональность.Они всегда принадлежат абстрактным классам.🚩Пример ошибкиЕсли попытаться объявить абстрактный метод в обычном классе, компилятор выдаст ошибкуpublic class RegularClass{ public abstract void SomeMethod(); // Ошибка: абстрактный метод может быть только в абстрактном классе}🚩Логика дизайнаC# требует, чтобы абстрактные методы находились только в абстрактных классах, потому что:Абстрактные классы могут содержать как абстрактные, так и обычные методы. Это позволяет определять базовое поведение в абстрактном классе и оставлять специфическую реализацию производным классам.Обычные классы не могут содержать абстрактные методы, так как они предназначены для создания объектов, а объект не может содержать "незавершённый" метод.Ставь 👍 и забирай 📚 Базу знаний
Привет всем спецам по безопасным РНК-вакцинам.В комментариях стандартно беснуются пфайзеробесы, обзывая плоскоземельщиками тех, кто сомневается в безопасности РНК-вакцин и еще сильней сомневается в чистоте помыслом еврочиновников и руководства фармгигантов.Вот сам черновик статьи на Нэйче. Это реально черновик, статья дописывается, но уже выложена.
Уже полтора года арендую выделенный сервер в Selectel. Использую его для трёх задач: вычисления, файлохранилище (2 ТБ) и личные проекты (Python + Streamlit + обработка данных). Выходит около 5000 рублей в месяцА ещё с ~2012 года у меня есть старый виртуальный хостинг — чисто под PHP-сайты. Там уже смешные деньги: сейчас 3–4 тысячи рублей в годС учетом того, как регулируют интернет, приходит мысль: а не проще ли всё перевезти на зарубежные сервера? Как оно там с ценами? А для сервисов с персональными данными оставить тот самый «древний» и пресловутый виртуальный хостинг на PHP. Тем более, с учетом нейросетей, можно навайбокодить перенос
Задача: 532. K-diff Pairs in an ArrayСложность: mediumДан массив целых чисел nums и целое число k. Верните количество уникальных пар с разницей k в массиве.Пара с разницей k — это пара целых чисел (nums[i], nums[j]), для которой выполняются следующие условия:0 <= i, j < nums.lengthi != j|nums[i] - nums[j]| == kОбратите внимание, что |val| обозначает абсолютное значение val.Пример:Input: nums = [3,1,4,1,5], k = 2Output: 2Explanation: There are two 2-diff pairs in the array, (1, 3) and (3, 5).Although we have two 1s in the input, we should only return the number of unique pairs.👨💻 Алгоритм:1⃣ Создайте частотный хэш-словарь для подсчета количества каждого уникального числа в массиве nums.2⃣ Для каждого ключа в хэш-словаре проверьте, можно ли найти пару, удовлетворяющую условиям:Если k > 0, проверьте, существует ли ключ, равный x + k.Если k == 0, проверьте, есть ли более одного вхождения x.3⃣ Увеличьте счётчик результатов, если условие выполняется.😎 Решение:func findPairs(nums []int, k int) int { counter := make(map[int]int) for _, num := range nums { counter[num]++ } result := 0 for x, val := range counter { if k > 0 { if _, exists := counter[x + k]; exists { result++ } } else if k == 0 && val > 1 { result++ } } return result}Ставь 👍 и забирай 📚 Базу знаний
Воспоминание разблокировано.Я в школе в тетрадке на листиках писал паскалевские программки, которые одноклассник дома набирал и приносил на следующий день ошибки. Я их исправлял и он нес домой фиксы и апдейты)Серега Яценко, я помню! 92я школа.
#производительность #оптимизацияДолг оптимизацией красен: как мы в МойОфис объединили борьбу с легаси и увеличение производительности таблиц⭐️◽️◽️◽️◽️📖 Читать
🔐 python-jose — работа с JWT-токенами в Pythonpython-jose — библиотека, которая создаёт, подписывает и верифицирует JWT в пару строк.📌 Что умеет python-jose?🔵 Создание и подпись JWT-токенов🔵 Декодирование и проверка подписи🔵 Автоматическая проверка срока жизни (exp)🔵 Поддержка HS256, RS256 и других алгоритмов✔️ Установкаpip install "python-jose[cryptography]"⚙️ Пример: создаём → декодируем → ловим протухшийfrom jose import jwt, JWTError, ExpiredSignatureErrorfrom datetime import datetime, timedeltaSECRET = "my-secret-key"ALG = "HS256"# 1. Создаём токенtoken = jwt.encode( {"sub": "user_42", "role": "admin", "exp": datetime.utcnow() + timedelta(hours=1)}, SECRET, algorithm=ALG,)print(token)# eyJhbGciOiJIUzI1NiIs...# 2. Декодируем — всё окdata = jwt.decode(token, SECRET, algorithms=[ALG])print(data["sub"]) # user_42print(data["role"]) # admin# 3. Протухший токен — ловим ошибкуold_token = jwt.encode( {"sub": "user_42", "exp": datetime.utcnow() - timedelta(hours=1)}, SECRET, algorithm=ALG,)try: jwt.decode(old_token, SECRET, algorithms=[ALG])except ExpiredSignatureError: print("Токен протух — иди логинься заново")except JWTError: print("Токен невалиден")❔ Что произойдёт:🟢 Валидный токен → получаем payload с данными🟢 Протухший → ExpiredSignatureError🟢 Подделанный → JWTErrorИспользуйте для авторизации в FastAPI, Flask, любых API-сервисах.Ждём ваших реакций, друзья — 👍😎 PyLinux | #python
Еще раз скажу про вайб-код, хотя я не собирался возвращаться к этой теме. Я буду очень точечно.На личном примере убедился, что эта штука очень хорошо помогает делать вспомогательные инструменты.Предыстория:Нам для одного проекта потребовалось усилить тестирование. И усилить не просто людей добавить, а именно сделать, чтобы тестирование было быстрее и качественнее.Что мы сделали?Мы очень быстро, буквально за один день, собрали механизм, который частично на PHP, частично на Node.js выполняет ряд ключевых вопросов тестирования, реализует ряд ключевых тестирований по сайту.А именно:➖ поиск 404-х страниц➖битые картинки➖ошибки в JavaScript➖сквозные сценарии➖конверсионные сценарии➖пентест безопасности➖SEO-аудитВажный момент про качество:Вот всё это было не очень с высоким качеством, то есть это всё требует доводки. Но буквально за один день была собрана платформа, которая всё это считает, собирает отчёты, документирует сама себя, как она работает. И Заказчику это ничего не стоило, мы сделали это как инструмент для себя. Я уже говорил и повторю: вспомогательные инструменты не надо делать круто. Их надо делать быстро, чтобы они давали результат. Результат для бизнеса в данном случае — это отчет об ошибках, который обновляется один раз в час. А не какая-то суперсистема тестирования, которой вы будете гордиться и рассказывать на конференциях.Мир меняют технологии быстрой разработки.Если ты программист — проснись и начни этим пользоваться, ты сможешь приносить больше пользы.Если заказчик — пойми: возможности разработчиков выросли в разы.Нужно сделать такой же инструмент под вашу боль? Напишите лично мне — я бережно передам в правильные руки. Поговорим.Я в 💬MAX и 💙VK. Подписывайтесь😉
Петербургский дом, в котром с 1916 г. жил знаменитый историк, академик С.Ф. Платонов. Здесь же в 1930 г. его арестовали по "Академическому делу". Его сослали в Самару, где он и скончался в 1933 г.
РКН: загрузка и выгрузку данных в 1С или Microsoft Excel с участием человека - автоматизированная обработка ПДн. Должны приниматься меры по ст. 19 152-ФЗ.Вопрос, поставленный Роскомнадзору:Обработка ПДн предполагает загрузку и выгрузку данных в 1С или Microsoft Excel с участием человека (например, ручной ввод или экспорт из других систем, например, из электронной вычислительной техники – персональный компьютер. Будет ли такая обработка считаться автоматизированной по смыслу положений 152-ФЗ, учитывая Постановление Правительства РФ от 15.09.2008 № 687? Полный ответ РКН по этому вопросу:Согласно п. 4 ст. 3 Закона автоматизированная обработка персональных данных - обработка персональных данных с помощью средств вычислительной техники.Таким образом, указанная Вами обработка персональных данных относится к автоматизированной обработке, поскольку осуществляется с помощью средств вычислительной техники.Меры по обеспечению безопасности персональных данных при их обработке установлены ст. 19 Закона.P.S. Спасибо что делитесь ответами. Если есть интересные позиции РКН/МЦ, пишите в личку.
❓ Как ведут себя срезы в Go на граничных значенияхСрез это не массив, а заголовок из трёх полей: указатель на данные, длина и ёмкость. Это важно понимать, прежде чем говорить о границах.Правило границ. При нарезке a[low:high] должно выполняться 0 <= low <= high <= cap(a). Примечательно, что high ограничен именно cap, а не len — это позволяет «заглянуть» вперёд за текущую длину, если базовый массив это допускает.Нарушение границ — паника в рантайме. Компилятор не проверяет корректность индексов — это делает рантайм. a[0:len(a)+1] скомпилируется, но упадёт с slice bounds out of range при выполнении.Пустой срез — не nil. a[2:2] — валидный срез с длиной 0. Он инициализирован и указывает на память. var s []int — другое: nil-срез, у которого указатель равен nil. len и cap у обоих равны нулю, но s == nil вернёт true только для первого.Разделяемая память. Срезы, нарезанные от одного массива, указывают на те же данные. Запись через один срез изменит то, что видит другой — до тех пор, пока не произошёл рост.Трёхиндексная нарезка. a[low:high:max] задаёт ёмкость результата явно: cap = max - low. Используется, чтобы append не «прорвался» за нужный регион и не затронул соседние данные в исходном массиве.Рост при append. Когда len == cap, Go создаёт новый массив, копирует данные и возвращает срез с новым указателем. С этого момента два среза больше не делят память — и это один из самых частых источников неожиданного поведения на практике.🐸 Библиотека Go для собеса
📌 Оформляем текстДля этого нам нужен textwrap. В модуле довольно много функций, но вот эти основные:wrap(text, width=70, ...) — Оборачивает текст так, чтобы длина каждой строки не превышала width. fill(то же, что и wrap) — сокращение для "n".join(wrap(text, ...)).indent(text, prefix) — Добавляет prefix к каждой новой строке. shorten(text, width, ..., placeholder=' [...]') — Ограничивает текст до width и добавляет в конце placeholder.#урок
Я пишу в поддержку банка: - Уберите ваши долбаные пуши! Оставьте только пуши по операциям! Банк: - Да, конечно, убрали ✌️Я: - Точно убрали? Подтвердите плз что убрали все пуши кроме тех, что по операциям. Банк: - Подтверждаем 👍Пуш через 10 минут: Оцените работу нашей поддержки 🙏
Сколько живут ошибки в ядре Linux?Ошибки в ядре Linux часто живут годами. По разбору исправлений видно, что среднее время между появлением уязвимости и ее устранением — около двух лет, а отдельные баги сохранялись почти двадцать лет. Речь идёт не о единичных инцидентах, а о массиве исправлений. Автор статей по теме информационной безопасности Дженни Гуанни Ку разобрала историю исправления багов в ядре и попыталась ответить два вопроса: как долго ошибки остаются незамеченными и кто вносит в код недостатки. Материал опирается на крупный массив изменений и даёт редкий взгляд на уязвимости через историю кода, а не через отдельные CVE.Дженни Гуанни Ку сопоставила исправления с моментом внесения ошибки. Если патч явно указывает на дефектный фрагмент, можно через историю репозитория найти коммит, где ошибка появилась впервые. Так измеряют «возраст» бага. Метод не идеален, но для больших выборок он показывает устойчивую картину: значительная доля дефектов исправляется спустя очень долгое время после появления.Вторая часть анализа касается авторства. Вопрос сформулирован провокационно: «кто пишет баги?». В исследовании проанализированы 125 тысяч уязвимостей и дефектов в коде ядра и связаны с типом изменений, подсистемами и вкладом разработчиков.Ядро — это код с длинным сроком жизни, множеством архитектур, драйверов и режимов выполнения. Многие дефекты проявляются только при редком сочетании условий. Формальная корректность сборки и прохождение тестов здесь мало что гарантируют. Именно поэтому уязвимости в ядре так сложно обнаружить.Полный разбор можно прочитать в блоге Дженни Гуании Ку в первой и во второй частях.#уязвимости #Linux
36к звезд за два дня набрал репозиторий с единственным файлом CLAUDE.mdЭто один единственный скилл для агента, в котором автор воплотил советы по программированию от Андрея Карпаты. Скилл, кстати, так и называется в честь Андрея: github.com/forrestchang/andrej-karpathy-skillsВ файле всего 65 строк и расписаны четыре принципа: думай и спрашивай перед кодингом, упрощай, меняй только то что просят, работай над четкой целью. Все эти принципы основаны вот на этом посте Андрея (мы частично переводили его тут), в котором он делился наблюдениями о кодинге с агентами. Пользователи пишут, что файлик действительно бустит поведение моделей: PR становятся чистыми и минималистичными, исчезают ненужные диффы, агенты меньше путаются и лучше следуют инструкциям. Видимо все, в чем фигурирует имя Карпаты, обречено на успех
Xylem – XML парсер на чистом SwiftXylem – новый XML парсер на Swift. Он очень минималистичный, модульный, быстрый и безопасный – ну и не тащит за собой вообще никаких зависимостей. Благодаря этому он кроссплатформенный, так что будет работать везде, где есть Swift.
нода сэмулирована, параметры открыла в сессию вошлана этом пока остановлюсь, так как с нпу и пультами все гораздо сложнее а мне надо бы от этого отдожнуть немного))но главное это то что я придумал на счет программы, а точнее программтак как идей по софту много хочу сделать набор разных программ с одним usb ключем-флешкойна данный момент я уже могу реализовать вот что1 софтина для ма2 и по открытию параметров и по конвертированию манет в atnet/sacn даже без параметров2 софтина для ма3 по открытию параметров3 софтина по синхронизации ableton link и prodjlink с ма2 и ма3 (через web remote)возможно еще какие нибудь софтины-инструменты, может какие нибудь удобные мониторы разных протоколов или еще какие нибудь кконвертерыеще есть идея если быстро получится сделать то реализовать мост ndi-citp чтоб с той же резы можно было видео просматривать в ма2все открывается одним ключем флэшкой где будет часть кода программ и криптографическая защитасофт ломать будет бессмысленно, так как часть кода, без которого программы работать не смогут будут внутри ключа, а ключ-флэшку сломать нельзя и при любой попытке он сам сотрет себе памятьтаким образом это и не разлетится по миру и без техподдержки, и у меня будет интерес это развивать улучшать и дополнять новыми возможностямивсем кто отписал ma2_artnet_256 спасибо, я получил обратную связь, с учетом количество отписавших прога бы вышла по 10к для каждого, но я все же сделаю как описал выше и ключ на это будет стоить не дороже
Сегодня я покажу вам одну фишку, которую часто недооценивают — как упростить управление глобальным состоянием с помощью Context + useReducer.🧠 Многие сразу тянут в проект Redux или Zustand, но это не всегда нужно. Если у вас приложение небольшое или средней сложности — useReducer + Context может закрыть все ваши нужды.Вот пример мини-хранилища:// counterContext.tsximport { createContext, useReducer, useContext, ReactNode } from 'react';const CounterContext = createContext<any>(null);const initialState = { count: 0 };function reducer(state: typeof initialState, action: { type: string }) { switch (action.type) { case 'increment': return { count: state.count + 1 }; case 'decrement': return { count: state.count - 1 }; default: return state; }}export const CounterProvider = ({ children }: { children: ReactNode }) => { const [state, dispatch] = useReducer(reducer, initialState); return ( <CounterContext.Provider value={{ state, dispatch }}> {children} </CounterContext.Provider> );};export const useCounter = () => useContext(CounterContext);А вот как использовать:// App.tsximport { CounterProvider, useCounter } from './counterContext';function Counter() { const { state, dispatch } = useCounter(); return ( <div> <p>Count: {state.count}</p> <button onClick={() => dispatch({ type: 'increment' })}>+</button> <button onClick={() => dispatch({ type: 'decrement' })}>-</button> </div> );}export default function App() { return ( <CounterProvider> <Counter /> </CounterProvider> );}🎯 Такой подход помогает:- Локализовать логику- Избежать лишних зависимостей- Делать масштабирование более контролируемымЕсли в будущем нужно будет вынести логику в отдельные модули или добавить middlewares — это тоже можно сделать!А вы как решаете глобальное состояние в небольших проектах? Используете кастомные хуки, Zustand или всё же Redux?📲 Мы в MAX✍️ @React_lib
🧠 Зачем использовать @Transactional(readOnly = true)?Многие добавляют @Transactional(readOnly = true) на сервисные методы просто по привычке. Но давайте разберёмся, что на самом деле даёт этот флаг, и где он реально ускоряет выполнение.📌 Что делает readOnly = true?* Подсказывает JPA провайдеру (например, Hibernate), что изменения в сущностях можно не отслеживать (skip dirty checking).* В некоторых БД может выставить read-only transaction flag, который предотвращает нежелательные изменения (например, в PostgreSQL).* Может ускорить выборки, особенно при больших графах сущностей.💡 Пример:@Service@RequiredArgsConstructorpublic class UserService { private final UserRepository userRepository; @Transactional(readOnly = true) public UserDto getUser(Long id) { User user = userRepository.findById(id) .orElseThrow(() -> new EntityNotFoundException("User not found")); return UserDto.from(user); }}⚠️ Важно:* readOnly = true не блокирует изменения в БД, если вы явно вызываете save() — это НЕ защита от дурака.* Hibernate всё равно создаст транзакцию — это не аннотация "без транзакций".✅ Когда использовать:* Методы, которые только читают данные и не модифицируют сущности.* Большие выборки без нужды в lazy-инициализации через сессию.* Там, где критична производительность чтения.❌ Когда НЕ нужно:* Если вы всё равно модифицируете сущности внутри метода.* Если работаете с @Modifying запросами — Spring их игнорирует при readOnly = true.📎 Документация Spring @Transactional👉 @java_geek
🛠 QRazyBox: Восстанавливаем «убитые» QR-кодыБывало, что QR-код затерт, обрезан или плохо пропечатан, и обычный сканер его не берет? QRazyBox — это веб-инструмент именно для таких случаев.Что умеет сервис?➡️ Редактор-пиксельарт: Вы можете буквально перерисовать поврежденные части кода в интерфейсе, похожем на Paint.➡️ Магия восстановления: Использует декодер Рида-Соломона для исправления ошибок и восстановления данных, даже если значительная часть кода утеряна.➡️ Глубокий анализ: Декодирует то, что не под силу камере смартфона.📎 ссылка на ресурс👉 Подписывайтесь на OSINT Беларусь
Редактирую расшифровку аудио про Иверскую икону. "После прибытия иконы на iphone"...
В чем разница между Convert.ToString() и ToString()?👾 — Convert.ToString() обрабатывает значения null, а ToString() — нет👍 — ToString() выводит данные в соответствии с предоставленным форматом🥰 — Convert.ToString() обрабатывает только значения null ⚡️ — ToString() обрабатывает значения null, а Convert.ToString() — нет🐸Библиотека задач по C#
Ну ладно, вру, г*овно-продукты тоже могут приносить прибыль…Есть разработчик, который выпустил 169 трэшёвых приложений😑Он опубликовал их в App Store и Google Play. Вместе они приносят ему, по данным AppMagic – $3.365.Можно и так конечно, но лучше сделать одно нормальное, которое будет годами приносить столько же или даже больше.Что выбираете?❤️ – одно хорошее🔥 – много средних