Наши услуги

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

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 разработчик
Смотреть все

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

Блог

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

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

Статьи

15.09.2026
Как начать карьеру в программировании: XML для новичка Середина сентября — отличное время, чтобы начать новую карьеру. Летний отдых позади, а до новогодних праздников ещё достаточно времени, чтобы освоить базу и собрать первое портфолио. Если вы только задумываетесь о входе в IT, не стоит гнаться за модными фреймворками. Начните с фундамента — и XML станет одним из самых недооценённых, но полезных инструментов на старте. Почему именно XML для новичка Многие считают XML устаревшим. Это заблуждение. XML до сих пор используется в конфигурациях, обмене данными между сервисами, документации, Android-разработке, веб-сервисах и системах автоматизации. Для начинающего программиста XML ценен тем, что учит структурировать информацию и работать с древовидными данными. Простой синтаксис: теги, атрибуты, вложенность. Строгие правила — сразу приучают к дисциплине в коде. Логичное продолжение: после XML легче понять HTML, JSON, YAML. Востребованность в интеграциях, тестировании и DevOps. С чего начать осенью Осенний ритм располагает к системной учёбе. Не пытайтесь охватить всё сразу — двигайтесь маленькими шагами по 30–40 минут в день. Установите редактор кода: VS Code или Notepad++. Изучите базовую структуру документа: пролог, корневой элемент, вложенные теги. Разберитесь с атрибутами, комментариями и пространствами имён. Напишите первый XML-файл — например, список книг или заметок. Проверьте его на валидность с помощью онлайн-валидатора или xmllint. Практическое задание на неделю Создайте файл library.xml, в котором опишете пять книг: название, автор, год издания, жанр. Добавьте атрибут id для каждой книги. Затем попробуйте прочитать этот файл с помощью Python или JavaScript — так вы сразу увидите, как XML превращается в реальные данные. Как превратить навык в карьеру Осень — время стажировок и набора в учебные программы. XML сам по себе редко бывает отдельной вакансией, но он открывает двери в смежные направления. Тестирование ПО — работа с XML-отчётами и тестовыми данными. Интеграция систем — обмен сообщениями между сервисами. Android-разработка — разметка интерфейсов на XML. Техническая документация — DITA и DocBook построены на XML. Составьте резюме уже в октябре: укажите учебные проекты, даже небольшие. К ноябрю у вас будет несколько файлов на GitHub, а к зиме — реальный шанс на первую стажировку. Главное — не откладывать старт на январь: именно осенью формируется привычка учиться регулярно. Итог XML — это не цель, а трамплин. Он даёт новичку понимание структуры данных, дисциплину синтаксиса и уверенность перед более сложными технологиями. Начните сегодня, осенью, и к концу сезона у вас будет не только база, но и первый шаг в профессию.
09.09.2026
Интеграция Java-инструмента: объяснение для стоматолога Когда разработчик говорит об интеграции Java-инструмента, стоматологу это может показаться сложным и непонятным. Однако если провести аналогию с привычными процессами в стоматологической практике, всё становится гораздо яснее. Представьте, что вы устанавливаете новую цифровую панорамную томограмму в своей клинике. Сам аппарат — это готовый Java-инструмент, а интеграция — это подключение его к вашей системе учёта пациентов, чтобы снимки автоматически попадали в карточки. В этой статье мы разберём, как происходит такой процесс, простыми словами и с примерами из вашей сферы. Что такое Java-инструмент и зачем его интегрировать Java — это язык программирования, на котором написаны тысячи готовых программных решений. Инструмент в контексте программирования — это некая библиотека или модуль, который выполняет конкретную задачу: обрабатывает данные, генерирует отчёты, связывается с базами данных. Для стоматолога это можно сравнить с готовым набором бор-инструментов: вы не создаёте сами сверло, вы берёте готовое и подключаете его к наконечнику. Интеграция означает встраивание этого готового инструмента в вашу существующую информационную систему. Например, у вас есть программа для записи пациентов, и вы хотите, чтобы она автоматически отправляла напоминания о визитах через SMS-шлюз. Вместо того чтобы писать весь код с нуля, вы берёте готовый Java-модуль для работы с SMS и интегрируете его. Основные этапы интеграции Процесс интеграции любого Java-инструмента всегда состоит из нескольких последовательных шагов. Понимание этих этапов поможет вам грамотно общаться с разработчиками и контролировать процесс, даже если вы не знаете кода. Анализ требований. Сначала разработчик выясняет, что именно должен делать инструмент в вашей системе. В стоматологии это похоже на сбор анамнеза: врач спрашивает о жалобах, прежде чем назначать лечение. Вы описываете, какие данные должны передаваться, в каком виде и с какой периодичностью. Выбор версии и совместимости. Java-инструменты бывают разных версий, и они должны соответствовать вашей операционной системе и другим программам. Если у вас в клинике старый компьютер, а инструмент требует новую версию Java, могут возникнуть конфликты. Это как если бы новый цифровой датчик не подходил к старому рентген-аппарату по разъёму. Написание кода-обвязки. Сам инструмент — это «чёрный ящик». Чтобы он заработал в вашей системе, разработчик пишет специальный код-адаптер, который переводит данные из вашей системы в формат, понятный инструменту, и обратно. Это как переводчик между врачом и пациентом, говорящим на разных языках. Тестирование. После подключения инструмент проверяют на тестовых данных. В стоматологии это аналог пробного препарирования на фантоме перед работой с реальным пациентом. Важно убедиться, что инструмент не ломает существующую систему и корректно обрабатывает все возможные ситуации. Запуск в эксплуатацию. Финальный этап — это перенос инструмента в рабочую среду и наблюдение за его работой. Если возникают ошибки, разработчик оперативно их исправляет. Типичные сложности и как их избежать Даже при идеальном планировании интеграция может столкнуться с препятствиями. Зная о них заранее, вы сможете минимизировать риски и время простоя вашей клиники. Несовместимость версий. Самая частая проблема. Инструмент может требовать более новую версию Java, чем установлена у вас. Решение — заранее проверить все системные требования и обновить окружение до начала работ. Разница в форматах данных. Ваша система хранит даты в одном формате (например, 09.09.2026), а инструмент ожидает другой (2026-09-09). Без правильной настройки это приведёт к ошибкам. Разработчик должен явно прописать правила преобразования. Потеря производительности. Иногда интеграция замедляет работу всей системы. Это похоже на то, как если бы новый модуль в стоматологическом кресле потреблял слишком много энергии и другие функции начинали работать хуже. Чтобы избежать этого, проводят нагрузочное тестирование. Отсутствие документации. Если инструмент плохо документирован, разработчику приходится разбираться методом проб и ошибок, что увеличивает сроки. Выбирайте инструменты с хорошей технической документацией или закладывайте дополнительное время на исследование. Практический пример из стоматологии Рассмотрим конкретную ситуацию. В вашей клинике есть программа для ведения электронных карт пациентов, и вы хотите подключить Java-инструмент для автоматического распознавания рентгеновских снимков и выявления кариеса. Инструмент уже обучен на тысячах изображений и умеет выделять проблемные зоны. Интеграция будет выглядеть так: разработчик подключает этот инструмент к вашей программе. Когда врач загружает новый снимок в карту пациента, программа автоматически отправляет его в Java-модуль. Модуль обрабатывает изображение, возвращает результат с подсвеченными областями, и программа сохраняет этот результат в карте. Врачу остаётся только посмотреть на выделенные зоны и принять решение. Вся операция занимает несколько секунд и не требует от врача никаких дополнительных действий. Без интеграции врачу пришлось бы вручную открывать отдельную программу, загружать туда снимок, ждать обработки, а затем вручную переносить результат в карту. Это занимало бы несколько минут и создавало риск ошибок при переносе данных. Интеграция экономит время и снижает нагрузку на персонал. Ключевые вопросы, которые стоит задать разработчику Чтобы интеграция прошла успешно и не превратилась в долгий и болезненный процесс, перед началом работ задайте разработчику следующие вопросы. Они помогут вам оценить сложность
08.09.2026
Очереди в больших скриптах PL/I: практическое руководство для джуна Когда вы начинаете работать с большими скриптами на PL/I, одной из первых структур данных, с которой вы столкнетесь, будет очередь. В отличие от простых массивов, очереди позволяют эффективно управлять потоком данных, особенно когда порядок обработки критичен. В этой статье мы разберем, как реализовать очереди в PL/I, какие подводные камни вас ждут и как избежать типичных ошибок новичка. Что такое очередь и зачем она нужна в PL/I Очередь — это структура данных, работающая по принципу FIFO (First In, First Out). Представьте обычную очередь в магазине: кто пришел первым, тот и обслуживается первым. В программировании на PL/I очереди используются для буферизации задач, обработки событий, передачи данных между подпрограммами и организации асинхронных процессов. В больших скриптах очереди становятся незаменимыми, когда вы имеете дело с потоками данных, которые не могут быть обработаны мгновенно. Например, вы читаете записи из файла, но обрабатываете их медленнее, чем читаете. Без очереди вы либо потеряете данные, либо заблокируете чтение. Основные операции с очередью Любая очередь, независимо от реализации, должна поддерживать как минимум три базовые операции: Добавление элемента (enqueue) — помещает элемент в конец очереди. Извлечение элемента (dequeue) — забирает элемент из начала очереди и удаляет его. Проверка состояния — пуста ли очередь, сколько элементов в ней находится. В PL/I нет встроенного типа "очередь", поэтому вы будете реализовывать её через массивы или связные списки. Для джуна важно понять оба подхода, так как каждый имеет свои преимущества. Реализация очереди на основе массива Самый простой способ — использовать массив с двумя индексами: один указывает на начало очереди, другой на конец. Вот базовая структура: DECLARE 1 QUEUE_CTL, 2 Q_ARRAY(100) CHAR(100), 2 Q_HEAD BIN FIXED INIT(1), 2 Q_TAIL BIN FIXED INIT(1), 2 Q_COUNT BIN FIXED INIT(0); Здесь Q_HEAD — индекс первого элемента, Q_TAIL — индекс следующего свободного места, Q_COUNT — текущее количество элементов. Операция добавления выглядит так: ENQUEUE: PROCEDURE(ITEM); DECLARE ITEM CHAR(100); IF Q_COUNT = 100 THEN CALL HANDLE_OVERFLOW; /* Очередь полна */ ELSE DO; Q_ARRAY(Q_TAIL) = ITEM; Q_TAIL = MOD(Q_TAIL, 100) + 1; Q_COUNT = Q_COUNT + 1; END; END ENQUEUE; Обратите внимание на использование MOD — это создает так называемое "кольцевое" поведение. Когда индекс достигает конца массива, он перескакивает на начало. Это позволяет использовать массив многократно, не сдвигая элементы. Извлечение элемента происходит аналогично: DEQUEUE: PROCEDURE RETURNS(CHAR(100)); DECLARE RESULT CHAR(100); IF Q_COUNT = 0 THEN CALL HANDLE_UNDERFLOW; /* Очередь пуста */ ELSE DO; RESULT = Q_ARRAY(Q_HEAD); Q_HEAD = MOD(Q_HEAD, 100) + 1; Q_COUNT = Q_COUNT - 1; RETURN(RESULT); END; END DEQUEUE; Проблема фиксированного размера Главный недостаток массивной реализации — ограничение по размеру. В большом скрипте вы не всегда знаете заранее, сколько элементов попадет в очередь. Если вы зададите слишком маленький массив, произойдет переполнение. Если слишком большой — вы зря потратите память, что в PL/I критично, так как память выделяется статически. Решение для джуна: используйте динамические массивы через ALLOCATE. Например: DECLARE 1 QUEUE_CTL BASED(Q_PTR), 2 Q_ARRAY(1) CHAR(100), 2 Q_HEAD BIN FIXED, 2 Q_TAIL BIN FIXED, 2 Q_COUNT BIN FIXED; DECLARE Q_PTR POINTER; При добавлении элемента, если массив заполнен, вы выделяете новую память большего размера и копируете данные. Это сложнее, но дает гибкость. Реализация очереди через связный список Для больших скриптов, где размер очереди непредсказуем, лучше использовать связный список. Каждый элемент очереди — это структура, содержащая данные и указатель на следующий элемент. DECLARE 1 NODE BASED(NODE_PTR), 2 NODE_DATA CHAR(100), 2 NODE_NEXT POINTER; DECLARE HEAD_PTR POINTER INIT(NULL); DECLARE TAIL_PTR POINTER INIT(NULL); Добавление элемента в конец списка: ENQUEUE_LIST: PROCEDURE(ITEM); DECLARE ITEM CHAR(100); DECLARE NEW_NODE POINTER; ALLOCATE NODE SET(NEW_NODE); NODE_DATA = ITEM; NODE_NEXT = NULL; IF HEAD_PTR = NULL THEN HEAD_PTR = NEW_NODE; ELSE NODE_NEXT = NEW_NODE; /* Ошибка! Так нельзя */ TAIL_PTR = NEW_NODE; END ENQUEUE_LIST; Стоп! Здесь я допустил типичную ошибку джуна. Вы не можете просто присвоить NODE_NEXT, потому что нужно сначала перейти по указателю к последнему узлу. Правильная логика: ENQUEUE_LIST: PROCEDURE(ITEM); DECLARE ITEM CHAR(100); DECLARE NEW_NODE POINTER; ALLOCATE NODE SET(NEW_NODE); NODE_DATA = ITEM; NODE_NEXT = NULL; IF HEAD_PTR = NULL THEN HEAD_PTR = NEW_NODE; ELSE NODE_NEXT = NEW_NODE; /* Здесь NODE_NEXT относится к новому узлу, а не к старому */ TAIL_PTR = NEW_NODE; END ENQUEUE_LIST; Правильный вариант требует временного указателя на последний узел. Но поскольку мы храним TAIL_PTR, мы можем обратиться к его полю NODE_NEXT: ENQUEUE_LIST: PROCEDURE(ITEM); DECLARE ITEM CHAR(100); DECLARE NEW_NODE POINTER; ALLOCATE NODE SET(NEW_NODE); NODE_DATA = ITEM; NODE_NEXT = NULL; IF HEAD_PTR = NULL THEN HEAD_PTR = NEW_NODE; ELSE NODE_NEXT = NEW_NODE; /* Это все еще неверно! */ TAIL_PTR = NEW_NODE; END ENQUEUE_LIST; Я специально повторяю
Открыть все статьи
bg_1
Остались вопросы? Задавайте их немедленно.
мы проконсультируем совершенно бесплатно