Рубрика «Проектирование и рефакторинг» - 15

Классическая модель разработки любых приложений подразумевает наличие хорошей документации по пользовательскому интерфейсу и API, а также, при необходимости, хорошего покрытия исходного кода комментариями. В этом случае, доработка системы начинается с изучения документации, затем непосредственно изменяется код и, наконец, обновляется вся необходимая информация.

Однако, одна из проблем такого подхода заключается в том, что это значительно удорожает и замедляет сам процесс разработки. Что если всего этого нет? Тогда на помощь приходит IDE, благодаря которой можно изучить текущую логику по “голому” коду.

Когда мы разрабатывали платформу lsFusion со встроенным языком, то у нас было несколько вариантов. Либо изобретать велосипед, и писать с нуля свою собственную IDE, как сделал в свое время 1С, или реализовать плагин к уже существующей. Мы пошли по второму пути, и в этой статье я покажу, что получилось.
Читать полностью »

Существует несколько кодировок символов кириллицы.

При создании сайтов в Интернете обычно используют:

  • utf-8
  • windows-1251
  • koi8-r

Еще популярные кодировки:

  • iso-8859-5
  • ibm866
  • mac-cyrillic

Вероятно это не весь список, это те кодировки с которыми я часто сталкиваюсь.

Иногда появляется необходимость определить кодировку текста. И в PHP даже функция для этого есть:

mb_detect_encoding

но как писал m00t
в статье Определение кодировки текста в PHP — обзор существующих решений плюс еще один велосипед

Если кратко — он не работает.

Прочитав статьи m00t я не вдохновился его методом и нашел вот такое решение: Определение кодировки текста в PHP и Python
Как сказал m00t

опять коды символов

Я протестировал функцию определения кодировки по кодам символов, результат меня удовлетворил и я использовал эту функцию пару лет.

Недавно решил переписать проект где использовал эту функцию, нашел готовый пакет на packagist.org cnpait/detect_encoding, в котором кодировка определяется методом m00t

При этом указанный пакет был установлен более 1200 раз, значит не у меня одного периодически возникает задача определения кодировки текста.

Мне бы установить этот пакет и успокоиться, но я решил «заморочиться».
Читать полностью »

Тех, кого раньше бы окрестили киберпанками, сегодня величают себя более политкорректно: DevSecOps. Помните «весь спектр радуги», из легендарного фильма «Хакеры»? 1) Зелёная (всемирная среда UNIX); 2) ярко-оранжевая (критерии защиты данных компьютера по стандартам DOD); 3) розовая рубашка (справочник IBM; прозвали так из-за дурацкой розовой рубашки на мужике с обложки); 4) книга дьявола (библия UNIX); 5) книга дракона (разработка компилятора); 6) красная книга (сети национального управления безопасности; известна как мерзкая красная книга, которой нет места на полке).

Пересмотрев в очередной раз этот легендарный фильм, я задался вопросом: а что бы сегодня читали киберпанки прошлого, ставшие в наше время DevSecOps’ами? И получился обновлённый, более современный вариант этого радужного спектра:

– Фиолетовая (руководство APT-хакера)
– Чёрная (корпоративная кибер-не-безопасность)
– Красная (справочник красноармейца)
– Книга бизона (культивирование DevOps-культуры в сообществе разработчиков; названа так из-за зверя с обложки)
– Жёлтая паутина (жёлтая, в смысле злободневная, подборка уязвимостей всемирной паутины)
– Коричневая (книга багоборца)
– Книга возмездия (библия безопасной разработки кода)

От киберпанка до DevSecOps: 7 книг, ради которых DevSecOps-инженеру английский выучить всё-таки стоит - 1

Читать полностью »

История одного монолита. Часть 2 - 1

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

История одного монолита - 1

Часть первая, в которой читатель познакомится с краткой историей появления внутренних продуктов 2ГИС и эволюцией системы доставки данных от нескольких скриптов до полноценного приложения.

Сегодня я расскажу вам историю, которая началась 9 лет назад в компании ДубльГИС.
Читать полностью »

Достойная пятницы история приключилась с американским исследователем в области безопасности Джозефом Тартаро (Joseph Tartaro). Захотелось ему выделиться, заказав не просто индивидуальный номер на авто, но и связав его со своим ремеслом. Первой мыслью было поиграться с SEGFAULT или чем-то вроде этого. Но в итоге он остановился на номере NULL для своей машины и VOID для своей жены. Почуяли неладное? О том, чем обернулась для него невинная шалость, о ещё одном курьёзном мистере Null и о поучительных багах при проверке типов данных в пользовательском вводе, читайте под катом.

Не шутите с NULL - 1Читать полностью »

Увидел публикацию о том, что PVS таки научился анализировать под Линуксами, и решил попробовать на своих проектах. И вот что из этого получилось.

Читать полностью »

Привет!

На днях мне в очередной раз на глаза попал код вида

if(someParameter.Volatilities.IsEmpty())
{
    // We have to report about the broken channels, however we could not differ it from just not started cold system.
    // Therefore write this case into the logs and then in case of emergency IT Ops will able to gather the target line
    Log.Info("Channel {0} is broken or was not started yet", someParameter.Key)
}

В коде есть одна довольно важная особенность: получателю крайне хотелось бы знать, что произошло на самом деле. Ведь в одном случае у нас проблемы с работой системой, а в другом — мы просто прогреваемся. Однако модель не дает нам этого (в угоду отправителю, который зачастую является автором модели).
Более того, даже факт "возможно, что-то не так" происходит из того, что коллекция Volatilities пуста. Что в некоторых случаях может быть и корректно.

Я уверен, что большинство опытных разработчиков встречало в коде строки, в которых заключалось тайное знание в стиле "если выставлена эта комбинация флажков, то от нас просят сделать A, B и C" (хотя по самой модели этого не видно).

С моей точки зрения, подобная экономия на структуре классов сказывается крайне негативно на проекте в будущем, превращая его в набор хаков и костылей, постепенно трансформируя более-менее удобный код в legacy.

Важно: в статье я привожу примеры, которые полезны для проектов, в которых несколько разработчиков (а не один), плюс которые будут обновляться и расширяться в течении хотя бы 5-10 лет. Всё это не имеет смысла, если в проекте один разработчик лет на пять, или же если после релиза никаких изменений не планируется. И логично, если проект необходим всего на пару месяцев, нет смысла вкладываться в четкую модель данных.

Однако если же вы занимаетесь долгоиграющим — добро пожаловать под кат.

Читать полностью »

Дружба навек

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

Многие ругают CMake, и часто заслуженно, но если разобраться, то не всё так плохо, а в последнее время очень даже неплохо, и направление развития вполне позитивное.

В данной заметке я хочу рассказать, как достаточно просто организовать заголовочную библиотеку на языке C++ в системе CMake, чтобы получить следующую функциональность:

  1. Сборку;
  2. Автозапуск тестов;
  3. Замер покрытия кода;
  4. Установку;
  5. Автодокументирование;
  6. Генерацию онлайн-песочницы;
  7. Статический анализ.

Кто и так разбирается в плюсах и си-мейке может просто скачать шаблон проекта и начать им пользоваться.
Читать полностью »

Tic Tac Toe, часть 0: Сравнение Svelte и React
Tic Tac Toe, часть 1: Svelte и Canvas 2D
Tic Tac Toe, часть 2: Undo/Redo с хранением состояний
Tic Tac Toe, часть 3: Undo/Redo с хранением команд
Tic Tac Toe, часть 4: Взаимодействие с бэкендом на Flask с помощью HTTP
Tic Tac Toe, часть 5: Бэкенд на С++ Boost.Beast, HTTP
Tic Tac Toe, часть 6: Flask и Celery/RabbitMQ

Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js