Наши услуги

Мы предлагаем

serv2
Сайт визитка - лендинг
Одна шаблонная страница - когда надо сегодня
serv2
Сайт магазин с CRM
Главная страница, каталог товаров/услуг, личный кабинет продавца
serv2
Дизайн для своего сайта
Нарисуем вам новый дизайн
serv2
Доработка существующего сайта
Когда что-то сломалось
serv2
Дизайн печатной продукции
Визитки, баннеры, стикеры и прочее нецифровое, что можно будет потрогать :)
serv2
Не знаю как объяснить - посмотрите сами
И такое делаем :)

Почему мы?

Минимум взаимодействий
Минимум взаимодействий
Из материалов только ваша страница или сайт
Всегда на связи
Всегда на связи
Голосовые, текст, видео - как удобно :)
Бывает и дорого, но есть бесплатно
Бывает и дорого, но есть бесплатно
Качество не зависит от цены
Индивидуальный подход
Индивидуальный подход
Разумеется :)
business
Коротко

О нас

wow5
2015
работаем успешно с
wow3
5
Реализованных проектов

Это начало интересного текста обо мне

Чуть позже напишу тут интересный текст

Партнёров пока нет
Но, ты пиши если что :)

Наши работы

Работа 1
Работа 2

Ознакомьтесь с нашим сервисом и комфортным сотрудничеством

Тарифы

Сайтик фри
0
Точно такой лендинг
checkedВаши фото, контакты и тексты
checkedИмя сайта имя.dencompany.ru
checkedБез мелкого шрифта и камней
Лайт
от
5 000
₽/год
Когда сайт пробник понравился и надо расширяться
checkedСамостоятельное имя сайта
checkedИндивидуальные настройки
checkedCRM (личный кабинет продавца)
checkedБез мелкого шрифта и камней
Хочу всё
от
15 000
₽/мес
Когда налажен процесс или не очень, но надо много и не хочется вникать
checkedСамостоятельное имя сайта
checkedИндивидуальный дизайн
checkedCRM (личный кабинет продавца)
checkedПеренос товаров с текущего сайта
checkedБез мелкого шрифта и камней

Профессионалы своего дела

Наша команда

Фото
Fullstack ведущий программист
Денис

О нас говорят

Отзывы клиентов

Фото отзыв
Я — специалист по SMM
Linda
Дизайнер
Фото отзыв
Отзыв 1
Mark
Backend разработчик
Смотреть все

Все, что нужно знать о бизнесе

Блог

Читать блог
Фото блог
11
08.2026
5 основных инструментов для продвижения интернет-бизнеса
Я — специалист по SMM.
Фото блог
11
08.2026
5 основных инструментов для продвижения интернет-бизнеса
Раньше работала дома.
Фото блог
11
08.2026
5 основных инструментов для продвижения интернет-бизнеса
Я работала дома.

Все, что нужно знать о создании сайтов

Статьи

11.08.2026
Решаем проблему фреймворка в QBasic: руководство для джуна Когда мы слышим слово «фреймворк», мы обычно представляем Django, Spring или Laravel. Но в мире QBasic, где царит процедурное программирование и прямое обращение к памяти, понятие фреймворка трансформируется в нечто иное. Здесь фреймворк — это не библиотека классов, а набор соглашений, модулей и макросов, которые позволяют структурировать код и избавляют от хаоса. Для джуна, который привык к современным IDE, QBasic покажется архаизмом, но именно здесь можно понять фундаментальные принципы организации кода, не отвлекаясь на сложный синтаксис. Почему в QBasic возникает проблема «фреймворка»? QBasic не имеет встроенной поддержки объектно-ориентированного программирования, исключений или пакетов. Весь код — это последовательность строк, выполняемых интерпретатором. Когда проект разрастается, возникает классическая проблема: глобальные переменные и перекрестные вызовы превращают программу в «спагетти». Джуны часто пытаются решить эту проблему, создавая подобие фреймворка, но терпят неудачу из-за отсутствия дисциплины. Суть проблемы в том, что QBasic не навязывает структуру. В отличие от строгих компиляторов, он позволяет писать код как угодно. Это свобода, которая убивает проект. Поэтому «фреймворк» здесь — это свод правил, которые вы сами себе устанавливаете. Основные компоненты самодельного фреймворка Чтобы решить проблему, нужно разбить её на три кита: модульность, управление состоянием и единая точка входа. Рассмотрим каждый пункт с точки зрения джуна. 1. Модульность через SUB и FUNCTION В QBasic нет классов, но есть SUB (процедуры) и FUNCTION (функции). Это ваш единственный инструмент для создания модулей. Проблема джуна в том, что он пытается сделать одну гигантскую процедуру, которая делает всё. Правильный подход — разбить программу на маленькие кирпичики. Каждая SUB должна выполнять ровно одну задачу (принцип единственной ответственности). Имена процедур должны быть глаголами: DrawMenu, CalculateScore, SaveGame. Избегайте GOTO — это убивает структуру. Используйте циклы DO...LOOP и IF...THEN...ELSE. Пример правильной структуры: SUB Main CALL Initialize DO CALL ProcessInput CALL Update CALL Render LOOP UNTIL GameOver CALL Shutdown END SUB Это и есть каркас вашего фреймворка. Он напоминает игровой цикл, но подходит для любого приложения. 2. Управление состоянием: избегаем глобальных переменных Глобальные переменные в QBasic — это зло. Они доступны отовсюду, и любая процедура может их изменить. Это приводит к трудноотловимым багам. Решение — использовать общие блоки данных через COMMON SHARED или, что лучше, передавать параметры по ссылке. Для джуна важно понять: состояние программы должно быть инкапсулировано. Создайте один тип данных (например, TYPE PlayerState) и передавайте его в процедуры как параметр. TYPE Player X AS INTEGER Y AS INTEGER Health AS INTEGER END TYPE DIM SHARED CurrentPlayer AS Player SUB MovePlayer (P AS Player, DX AS INTEGER, DY AS INTEGER) P.X = P.X + DX P.Y = P.Y + DY END SUB Такой подход позволяет тестировать процедуры изолированно и не бояться, что кто-то случайно перезапишет чужую переменную. 3. Единая точка входа и инициализация Фреймворк должен иметь чёткую точку старта. В QBasic это обычно метка Main или первая строка кода. Проблема джуна в том, что он начинает писать код сразу, без плана. Правильно — создать процедуру Initialize, которая настраивает все параметры: экран, переменные, файлы. Сначала объявите все типы и константы. Затем вызовите Initialize для установки начальных значений. Только потом запускайте основной цикл. Это похоже на конструктор в ООП, но реализовано процедурно. Такой подход гарантирует, что вы не обратитесь к переменной до её инициализации. Практический пример: мини-фреймворк для игры Представьте, что вы пишете змейку. Без фреймворка код будет состоять из 500 строк с перемешанными выводами на экран и логикой. С фреймворком — из 5 модулей. Структура: Init.bas — настройка экрана и переменных. Input.bas — обработка нажатий клавиш. Logic.bas — движение змейки, проверка столкновений. Draw.bas — отрисовка всех объектов. Main.bas — связующий код, который вызывает остальные модули. Каждый модуль — это отдельный файл, который вы подключаете через '$INCLUDE. Это и есть ваш фреймворк. Он не универсален, но решает конкретную задачу и легко расширяется. Типичные ошибки джуна и как их избежать Первая ошибка — преждевременная оптимизация. Джуны пытаются написать универсальный движок, который решает все проблемы сразу. В итоге получается абстрактный код, который не работает ни для одной задачи. Начните с конкретной программы, а потом выделите общие части в процедуры. Вторая ошибка — игнорирование обработки ошибок. В QBasic нет try-catch, но есть ON ERROR GOTO. Используйте его в критических местах: чтение файлов, деление на ноль. Это часть фреймворка — защита от сбоев. Третья ошибка — отсутствие комментариев. Джуны считают, что код говорит сам за себя. Но в QBasic, где нет автодополнения и подсветки синтаксиса, комментарии — это единственный способ не запутаться. Пишите комментарии к каждой процедуре: что она делает,
08.08.2026
Сравнение фреймворков для Clipper: взгляд сеньора Когда речь заходит о Clipper, большинство современных разработчиков пожимают плечами. Однако для сеньора, заставшего эпоху DOS-приложений и миграции на Windows, эта тема — не археология, а практическая инженерия. Clipper (Summer'87, 5.x, а затем и его наследники вроде Clip, FlagShip, xBase++) — это не просто язык, а целая парадигма работы с данными. Сравнивать здесь «фреймворки» нужно не как React и Vue, а как слои абстракции над терминальным вводом-выводом и драйверами баз данных. Для сеньора критично понимать, что выбор фреймворка в 2026 году — это выбор стратегии поддержки легаси и цены миграции. Ключевые игроки на поле Clipper Прежде чем углубляться в сравнение, стоит разделить инструменты на три условные категории, потому что сравнивать их напрямую — методологическая ошибка. Для сеньора это разделение — база для принятия архитектурного решения. Классические библиотеки визуальных компонентов (например, FiveWin, Clip4Win) — это обёртки над Windows API, дающие окна, кнопки и гриды. Терминальные фреймворки (Say/Get, TBrowse, а также их расширенные версии вроде Jet.dll от Alaska Software) — работают в консоли, эмулируя текстовый интерфейс. Современные гибриды (xHarbour + HWGUI, или FlagShip с собственным рантаймом) — пытаются объединить скорость разработки на xBase с современными контролами. Сеньор должен понимать: выбор фреймворка здесь — это выбор уровня риска. Ни один из них не даст той плавности разработки, что даёт C# или Java. Но они дают то, что критично для бизнеса — сохранение бизнес-логики, написанной 20 лет назад. Сравнение по критериям для сеньора Ниже приведено сравнение по параметрам, которые важны не для новичка, а для архитектора, отвечающего за жизненный цикл системы. 1. Управление памятью и утечки Классический Clipper (до 5.3) использовал ручное управление памятью с пулами. Современные фреймворки (Harbour, xHarbour) имеют сборщик мусора, но он не детерминированный. FiveWin в этом плане капризен: при работе с объектами Windows (HWND) часто возникают утечки, если не вызывать Release() явно. HWGUI (построенный на Harbour) более предсказуем, но его сборщик мусора может «подвисать» при интенсивной работе с массивами. Для сеньора это означает, что нельзя полагаться на RAII или using-блоки — нужен строгий аудит кода на предмет освобождения ресурсов. 2. Работа с базами данных Это ахиллесова пята всех наследников Clipper. Родные драйверы (DBFNTX, DBFCDX) работают быстро, но не поддерживают современные транзакции на уровне сервера. FlagShip предлагает встроенную поддержку SQL через ODBC, но его реализация далека от идеала: курсоры часто «съезжают» при параллельном доступе. xHarbour с библиотекой RDD (Replaceable Database Drivers) позволяет подключать MySQL и PostgreSQL, но требует от сеньора глубокого понимания внутреннего устройства RDD, чтобы настроить пул соединений. В отличие от них, FiveWin для работы с SQL требует сторонних библиотек (например, FWH's ADO), что добавляет уровень сложности и непредсказуемости. 3. Модель событий и потоки Классический Clipper был однопоточным. Современные фреймворки пытаются добавить потоки, но делают это неуклюже. Harbour имеет нативную поддержку потоков (HB_THREAD), но работа с GUI из фоновых потоков — это боль. FiveWin требует, чтобы все обращения к контролам происходили в главном потоке, иначе — мгновенный краш. Clip4Win (более старый) вообще не имеет понятия потоков, что вынуждает сеньора использовать асинхронные паттерны на основе таймеров. Вывод: если ваша система требует реальной многопоточности (например, для фоновой обработки отчётов), ни один из этих фреймворков не даст вам удобной модели. Придётся писать костыли через внешние DLL. 4. Совместимость с современными API Здесь лидирует xHarbour в связке с HWGUI. Эта связка позволяет вызывать любые функции WinAPI напрямую, что даёт сеньору возможность интегрировать современные библиотеки (например, для работы с JSON или HTTP-запросами). FiveWin также предоставляет доступ к API, но его синтаксис перегружен макросами, что усложняет чтение кода. FlagShip — самый закрытый вариант: он компилируется в промежуточный код, и вызов нативных функций требует специальных обёрток, что снижает гибкость. Практические рекомендации для сеньора Если вы пришли в проект, где уже есть код на Clipper, не пытайтесь переписать всё на C#. Это экономически нецелесообразно. Вместо этого оцените, какой фреймворк позволит вам постепенно мигрировать. Мой опыт подсказывает, что оптимальным выбором для долгосрочной поддержки является Harbour + HWGUI. Причины: Harbour активно развивается, имеет открытый исходный код и поддерживает современные стандарты C++ (через компилятор MinGW). HWGUI предоставляет достаточно стабильный набор контролов, а его исходники доступны для модификации. Вы можете писать новые модули на C или C++ и вызывать их из Harbour, сохраняя старый код на Clipper нетронутым. В то же время, если проект заморожен и не требует новых фич, а бюджет ограничен — оставьте FiveWin на старой версии, но обязательно зафиксируйте окружение (виртуальная машина с Windows 7) и не пытайтесь обновлять библиотеку, так как это может сломать существующий код. Заключение Сравнение фреймворков для Clipper — это не выбор «лучшего», а выбор «наименее худшего» для конкретной бизнес-задачи. Сеньор должен трезво оценивать риски: ни один из этих инструментов не даст вам современного DX, но они дают возможность сохранить работающий бизнес-процесс. Гла
04.08.2026
Интеграция AI/ML в Dart: простое объяснение для новичков Уважаемый читатель, если вы решили разобраться в том, как работают современные программы, которые умеют распознавать лица, переводить тексты или предсказывать погоду, то вы обратились по адресу. Сегодня мы поговорим о языке программирования Dart и о том, как в него встраивают искусственный интеллект (AI) и машинное обучение (ML). Не пугайтесь сложных слов — я объясню всё простым языком, как для пенсионера, который впервые сел за компьютер. Что такое Dart и зачем он нужен? Dart — это язык программирования, созданный компанией Google. Представьте себе, что программа — это рецепт приготовления борща. Язык программирования — это тот язык, на котором написан рецепт. Dart — это такой «кулинарный язык», на котором пишут инструкции для компьютера. Главная особенность Dart в том, что он позволяет создавать приложения, которые работают на разных устройствах: на телефонах, планшетах, компьютерах и даже на холодильниках с экраном. Самый известный пример — это приложения, написанные с помощью фреймворка Flutter, который тоже создан на базе Dart. Что такое AI и ML простыми словами? Искусственный интеллект (AI) — это способность компьютера выполнять задачи, которые обычно требуют человеческого ума. Например, отличать кошку от собаки на фотографии или отвечать на вопросы. Машинное обучение (ML) — это метод, с помощью которого компьютер учится выполнять эти задачи. Вместо того чтобы писать точные инструкции «если видишь уши — это кошка», мы даем компьютеру много примеров (фотографий кошек и собак), и он сам находит закономерности. Это как учить внука отличать яблоко от груши: вы показываете ему много разных фруктов, и он постепенно запоминает их признаки. Как интегрировать AI/ML в Dart? Теперь самое главное. Как же соединить язык Dart и искусственный интеллект? Есть несколько способов, и я расскажу о них подробно, чтобы вам было понятно. Способ 1. Использование готовых библиотек Представьте, что вы хотите испечь пирог, но не знаете, как замесить тесто. Вы идете в магазин и покупаете готовую смесь. В мире программирования такие «смеси» называются библиотеками. Для Dart есть несколько библиотек, которые уже содержат готовые алгоритмы машинного обучения. Вам не нужно самому писать сложные математические формулы — всё уже сделано за вас. Например, библиотека tflite_flutter позволяет запускать модели TensorFlow Lite прямо в вашем приложении на Dart. TensorFlow — это мощная система машинного обучения от Google, а Lite — её облегченная версия для телефонов. С помощью этой библиотеки вы можете добавить в своё приложение распознавание изображений, голоса или даже жестов. Как это работает на практике? Вы берёте готовую модель (это файл с уже обученными «правилами»), кладёте её в папку вашего проекта, и ваша программа на Dart может «спрашивать» у модели: «Что на этой картинке?» Модель отвечает: «Это кошка», — и ваша программа показывает этот ответ на экране. Способ 2. Обучение моделей прямо в Dart Если вы хотите не просто использовать готовую модель, а обучить свою собственную, то это тоже возможно. Правда, это сложнее, и для больших задач лучше использовать другие языки, например Python. Но для небольших экспериментов есть библиотека ml_algo. Она позволяет создавать простые модели машинного обучения прямо в коде на Dart. Например, вы можете обучить модель предсказывать цену на квартиры по площади и количеству комнат. Вы даёте модели таблицу с примерами, и она находит зависимость. Для пенсионера это можно объяснить так: вы учите компьютер, как бабушка учит внука считать сдачу в магазине. Вы показываете много примеров: «2 яблока стоят 50 рублей, 5 яблок стоят 125 рублей». Компьютер запоминает закономерность и потом сам может посчитать, сколько будут стоить 10 яблок. Способ 3. Общение с внешними сервисами Самый простой и часто используемый способ — это не встраивать искусственный интеллект прямо в программу на Dart, а обращаться к внешнему сервису через интернет. Представьте, что вы звоните по телефону в справочную службу и спрашиваете: «Какая завтра погода?» Вам отвечает оператор, который находится в другом здании. Так и здесь: ваша программа на Dart отправляет запрос в облачный сервис (например, Google Cloud AI или OpenAI), а сервис возвращает ответ. Для этого в Dart есть специальные средства для работы с интернетом. Вы пишете код, который отправляет картинку в сервис распознавания, ждёт ответа и получает текст: «На фото изображён кот породы мейн-кун». Этот способ очень удобен, потому что вам не нужно разбираться в сложных алгоритмах — всё делает мощный сервер. Пошаговый план для начинающего Давайте составим простой план действий, если вы хотите попробовать интегрировать AI/ML в свой проект на Dart. Не бойтесь, если что-то не получится с первого раза — это нормально. Установите Flutter. Это самый простой способ начать работать с Dart. Flutter — это набор инструментов, который позволяет создавать красивые приложения. Установка похожа на установку обычной программы на компьютер. Создайте новый проект. В терминале напишите команду flutter create my_ai_app. Это создаст папку с готовым шаблоном. Добавьте библиотеку. Откройте файл pubspec.yaml (это как список продуктов для рецепта) и добавьте туда название нужной библиотеки, например tflite_flutter. Напишите простой код. Начните с малого: загрузите модель и попросите её распознать текст на картинке. Даже если это займёт несколько дней, вы получите бесценный опыт. Тестируйте и улучшайте. Запустите приложение на телефоне или в эмуляторе. Посмотрите, как оно работает, и попробуйте изменить что-то в коде. Важные советы для новичка Пре
Открыть все статьи
bg_1
Остались вопросы? Задавайте их немедленно.
мы проконсультируем совершенно бесплатно