Блог
Практические статьи KomuraSoft LLC о разработке сайтов, SEO, Google Ads, разработке для Windows, использовании существующих систем и расследовании сбоев.
ИИ-поиск по всему сайту
Поисковые запросы передаются в Cloudflare AI Search для формирования результатов. Не вводите персональные данные.
-
CSV — не «просто текст». Практика CSV в бизнес-приложениях на C# (кодировки, совместимость с Excel, защита от инъекций)
Разбираем типичные сбои ввода-вывода CSV в бизнес-приложениях — самописный разбор через Split(','), искажение текста в Excel из-за UTF-8 без BOM, потерю нача...
-
Не создавайте HttpClient в using на каждый запрос — создание, тайм-ауты и повторные попытки в C#
Если создавать HttpClient через using на каждый запрос, исчерпываются сокеты; static-экземпляр не отслеживает смену DNS. Разбираем схемы через PooledConnecti...
-
Как найти причину «тормозов» с PerfView и dotnet-trace — практика анализа производительности .NET
Когда бизнес-приложение тормозит или ЦП постоянно на максимуме, какой инструмент взять и на что смотреть. Разделение ролей PerfView и dotnet-trace, чтение сэ...
-
Google Ads для B2B с небольшим бюджетом — как получать обращения при нескольких десятках тысяч иен в месяц
Практическое руководство для B2B-компаний, которые запускают Google Ads с бюджетом в несколько десятков тысяч иен в месяц. Разбираем средний дневной бюджет и...
-
Как попадать в выдачу по названию города — локальное SEO для малого и среднего бизнеса (страницы территорий и Профиль компании в Google)
Для малых и средних компаний, которых не находят по запросу «название города + отрасль», разбираем, в каком порядке действовать в локальном SEO. Практические...
-
Журнал событий Windows и ETW: как вывести логи бизнес-приложения в стандартные механизмы ОС
Журнал событий и ETW — отдельный слой записей, который видят специалисты по эксплуатации и стандартные средства ОС. Разбираем, как разделить роли трёх механи...
-
Не только appsettings.json — практика конфигурации бизнес-приложений Windows (среды, секреты, куда писать)
Разбираем управление конфигурацией бизнес-приложений Windows. Показываем слои appsettings.json, когда брать IOptions, а когда IOptionsMonitor, настройки по с...
-
Почему KomuraSoft создаёт сайты на дизайн-системе Цифрового агентства Японии — цена и качество совместимы
Разбираем, почему разработка сайтов в KomuraSoft опирается на опубликованную Цифровым агентством Японии дизайн-систему. Объясняем, почему стандартизация этап...
-
Как увеличить обращения с BtoB-сайта — полная карта порядка исправлений от привлечения до формы
Чтобы увеличить обращения с BtoB-сайта, сначала измерениями находят узкое место, затем готовят страницы услуг, исправляют путь к форме и только потом добавля...
-
Печать и PDF в Windows-приложениях: PrintDocument, WPF и библиотеки отчётов
Печать WinForms через PrintDocument, печать WPF через FlowDocument и FixedDocument и варианты вывода PDF сведены в таблицу по требованиям. Разбираются разрыв...
-
Кейс обновления сайта: транспортная компания Douzu Carry Service из Миядзаки — что и как перенесли со старого сайта
На примере обновления сайта транспортной компании Douzu Carry Service из Миядзаки разбираем, как до дизайна составить инвентаризацию URL, спроектировать 301-...
-
Стоимость сайта для малого и среднего бизнеса — таблица цен и как читать смету
Перед запросом сметы на сайт малому и среднему бизнесу полезно знать ориентиры по цели и масштабу, как читать разбивку сметы и чего ждать — и чего не ждать —...
-
Как ясно представить модель OSI — разбираем один HTTP-запрос по семи уровням
Разбираем модель OSI на реальном кадре. Собираем на C# Ethernet-кадр с HTTP GET, разбираем его и в Wireshark видим, как уровни вложены друг в друга. Сопостав...
-
Как устроена изоляция сеансов Windows — Session 0, RDP и одновременная работа нескольких пользователей
Разбираем понятие «сеанса», которое часто путает разработчиков Windows-приложений. С практической стороны объясняем, почему изоляция Session 0 не даёт службе...
-
Продление эксплуатации и миграция приложений VB6 / Access — таблица решений: оставить, обернуть или заменить
Как решить, оставить ли бизнес-приложение на VB6 или Access как есть, продлить ему эксплуатацию или заменить. Таблица решений собирает состояние рантайма, пр...
-
Как читать аварийные дампы в WinDbg + SOS — практика анализа после сбора
Разбираем, как читать аварийный дамп Windows в WinDbg с расширением SOS: настройка пути к символам, поиск исключений и утечек через !clrstack и !dumpheap, ко...
-
Защита Windows-приложения от повторного запуска — именованный Mutex и активация окна при втором старте
Разбираем, как в бизнес-приложении Windows запретить повторный запуск через именованный Mutex. Разберём ловушку RDP из-за разницы Global\ и Local\, Abandoned...
-
Безопасный вызов Win32 API из C# — практическое руководство по P/Invoke (DllImport / LibraryImport / CsWin32)
Разбираем, как на практике вызывать Win32 API из C# через P/Invoke: чем DllImport отличается от LibraryImport, как CsWin32 генерирует сигнатуры, ловушки марш...
-
Аутентификация Entra ID в WinForms и WPF: MSAL.NET и брокер WAM
Как добавить вход через Entra ID в десктопное приложение WinForms или WPF: общедоступный клиент, регистрация приложения, AcquireTokenSilent в MSAL.NET, броке...
-
Дата, время и часовые пояса в бизнес-приложениях — ловушки DateTime, хранение в UTC и тесты
После переноса сервера время сдвигается на 9 часов. Разбираем, откуда берутся такие сбои: Kind у DateTime и неявные преобразования. Дальше — когда брать Date...
-
UI-автотесты десктопных приложений Windows — UI Automation и устойчивые тесты на FlaUI
Разбираем UI-автотесты WinForms и WPF с устройства Windows UI Automation. Минимальная реализация на FlaUI, AutomationId и ожидание по условию, чтобы тесты не...
-
Высокий DPI в WPF — почему «к DPI должен быть готов», а на деле всё размывается
WPF по умолчанию System DPI Aware, но при переносе окна на монитор с другим DPI всё изображение размывается, а растр теряет резкость. Разбираем диагностику, ...
-
Почему после работы с Excel из C# остаётся EXCEL.EXE — освобождение COM-ссылок и решение о замене
Разбираем, почему при автоматизации Excel из C# через COM остаётся процесс EXCEL.EXE: счётчик ссылок COM, RCW, ловушка «правила двух точек», паттерны освобож...
-
Поддержка высокого DPI в WinForms — почему на 4K размывается или ломается макет
Разбираем, почему WinForms-приложение на 4K-мониторе размывается или ломается: виртуализация DPI и режимы осведомлённости о DPI (System Aware / Per-Monitor V...
-
Как выбрать межпроцессное взаимодействие в Windows — таблица: именованные каналы, TCP, gRPC, разделяемая память, COM
Как выбрать способ связи между Windows-приложениями. В таблице решений разобраны сильные стороны и типичные ошибки именованных каналов, локального TCP, gRPC,...
-
SQLite в бизнес-приложениях на C# — режим WAL, блокировки записи, защита от повреждений и выбор EF Core
Практические сведения о встраивании SQLite в бизнес-приложение через Microsoft.Data.Sqlite: режим WAL, SQLITE_BUSY и сведение записи к одному пути, ловушки с...
-
Как создать и эксплуатировать службу Windows — от выбора между Планировщиком заданий и службой до превращения BackgroundService в службу
Стоит ли держать постоянно работающую обработку как службу Windows или хватит Планировщика заданий. Практический разбор: таблица выбора, создание службы на ....
-
После режима IE — подойдёт ли WebView2? Ограничение ActiveX и реалистичный план миграции
С точки зрения внутренних корпоративных систем разбираем устройство WebView2, стратегии распространения Evergreen и Fixed Version, типичную ошибку с папкой п...
-
Где хранить данные Windows-приложения: таблица решений SQLite / JSON / реестр / Access
Куда и в каком виде хранить данные настольного Windows-приложения. Разбираем выбор между AppData и ProgramData, сильные стороны и ловушки SQLite, JSON-файлов...
-
Планировщик заданий не запускается или завершается с 0x1 — диагностика и надёжная эксплуатация
Разбираем, как вывести периодические задания Windows в стабильную эксплуатацию: учётная запись выполнения и тип входа, типичные причины завершения с 0x1, вкл...