Нотатки про програмування, музику, подорожі та плівку
Про мене  •  Список нотаток  •  Плівка

Пізніше Ctrl + ↑

Эксперименты над пленкой

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

Идея в следующем:

  1. берем пленку
  2. берем разную химию и мешаем по вкусу (зеленка, марганцовка, доместос, лак для ногтей, вода с солью и т. д.)
  3. замачиваем пленку
  4. сушим
  5. отдаем на сканирование
  6. смотрим на результат

В итоге получаются очень интересные эффекты:

Автоматизация релизов Github с помощью Powershell и Teamcity

Совсем недавно о одном open-source проекте, в котором я участвую, потребовалось автоматизировать создание релизов на Github. В моем распоряжении есть TeamCity. Решил написать небольшой план, который состоит из следующих шагов:

  1. Выкачать проект.
  2. Скомпилировать.
  3. Опубликовать Release версию в папку.
  4. Собрать артефакт Teamcity.
  5. Упаковать билд в архив.
  6. Создать страницу релиза на Github с описанием.
  7. Выгрузить на страницу архив с билдом.

Для решения 5-6 пунктов был написан простой powershell скрипт, который можно посмотреть по этой ссылке.

P.S. В дальнейшем, в репозиторий буду добавлять друге полезные скрипты.
Ссылка на репозиторий: https://github.com/teamkiller7112/PowerShellScriptsArchive

Парадигмы ООП

Инкапсуляция

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

Википедия

Наследование

С помощью наследования один объект может приобретать свойства другого. Это позволяет нам строить иерархию классов.

Полиморфизм

Возможность дополнять объект функционалом. Возможность выступать объекту в разных формах. Классический полиморфизм — замещение, переопределение методов. Ad hoc полиформизм — перегрузка методов, поведение в зависимости от данных. Подмена объектов во время выполнения программы с одинаковыми методами через интерфейс.

Абстракция

Абстракция — в ООП это придание объекту характеристик, которые четко выделяет его на фоне остальных, определяя его концептуальные границы. Абстрагирование — В ООП это способ выделить набор значимых характеристик объекта, исключая из рассмотрения не значимые. Соответственно абстракция это набор таких характеристик.

Посылка сообщений

Посылка сообщения это вызов метода. Так же события и их обработчики.

Повторное использование

Все что перечислено выше работает на повторное использование кода.

Объект это сущность, которая хранит в себе состояние и поведение. Должно быть соответствие между состоянием объекта и его поведением.

Объект должен делать только то, что на него возложено и ему соответствует.

Все объекты привязаны к прототипам из реального мира. ООП и повседневная жизнь не могут существовать раздельно.

Лучшие практики использования PowerShell c TeamCity

Данная статья является переводом. Оригинальная статья.

Правильная обработка ошибок

Наиболее распространенная проблема заключается в том, что TeamCity игнорирует ошибки Powershell, по крайней мере, в конфигурации по умолчанию. Если шаг со сценарием PowerShell завершится неудачно, TeamCity по-прежнему считает билд успешным. Это может привести к серьезным ошибкам, которые могут быть незаметны длительное время. Это происходит потому что значение настройки Format stderr output as установлено в warning. Для того чтобы TeamCity видел ошибки, необходимо переключить настройку в error.

Но это еще не все. Может возникнуть ситуация что шаг PowerShell упал но весь пайплайн признан успешным. Для этого нужно перейти в раздел Failure Conditions и установить флаг error message is logged by build runner.

Теперь все ошибки буду корректно обрабатываться и влиять на статус билда.

Также надо понимать модель ошибок в PowerShell. Они могут поделятся на 2 группы:

  1. Завершающие (зачастую синтаксические ошибки).
  2. Не завершающие.

Если возникло не завершающее исключение, то выполнение скрипта продолжится. Этот эффект может быть крайне нежелательным для сценариев, выполняющих взаимосвязанные операции, зависящие друг от друга. Конечно, мы можем изменить это поведение и превратить все «не завершающиеся» ошибки в «завершающиеся», установив переменную $ErrorActionPreference в начале наших скриптов:

#Error Action Preference:
#
# SilentlyContinue – error messages are suppressed and execution continues.
# Stop – forces execution to stop, behaving like a terminating error.
# Continue - the default option. Errors will display and execution will continue.
# Inquire – prompt the user for input to see if we should proceed.
# Ignore – (new in v3) – the error is ignored and not logged to the error stream. Has very restricted usage scenarios.

$ErrorActionPreference = "Stop"

Защита от случайных ошибок

Для начала необходимо превратить все наши функции в настоящие командлеты. Для этого нужно определять входящие параметры с помощью блока param() и пометить его атрибутом [CmdletBinding()]:

function Verb-Noun {
    [CmdletBinding()]
    param (
     #parameters go here   
    )    
}

Этот атрибут защищает вызов метода с не определенными параметрами. Каждый раз как кто-то использует не определенный/удаленный параметр или делает ошибку в его названии, PowerShell выбросит ошибку. Если метод не помечен атрибутов, имена параметров не проверяются, что затрудняет обнаружение проблемы.

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

Set-StrictMode -Version Latest

Детальнее можно почитать тут.

Вообще советую использовать VS Core и плагином PowerShell. Он превращает вашу в IDE в аналог PowerShell ISE. Также этот плагин поставляется с PSScriptAnalyzer, что позволяет обнаруживать разные ошибки.

Использование скриптов

Teamcity дает возможность запускать скрипты не только из файла, но и из встроенного редактора. Но лучшей практикой считается использование файлов. Это позволит держать скрипты в системе контроля версий, вместе с вашим проектом.

Всегда помните о чистом коде.

Ваши скрипты как и код вашего проекта должен лежать в системе контроля версий, покрыт тестами и пройти ревью. Здесь вы можете найти лучшие практики и стили кодирования для PowerShell. Для тестирования кода можете использовать — Pester.

Итог

Связка PowerShell и Teamcity позволяет создать действительно мощный CI/CD. Но без понимания базовых принципов и механизмов вы не достигните максимального профита. Настройки по умолчанию часто могут приводить к непредвиденным ошибкам.

Ссылки

  1. Практики и стили кодирования для PowerShell скриптов.
  2. ((https://github.com/pester/Pester Pester — тест и мок фреймворк для PowerShell.)
  3. PowerShell strict mode.

Документация

Ох сколько проблем вызывает документация. И зачастую эти проблемы связаны с ее отсутствием. Почти всегда разработчики считаю что написание документации это: лишнее, бюрократия, скучно. Также часто разработчики приводят в пример цитату из скрам гайда: работающий продукт важнее исчерпывающей
документации.

Я считаю что документация в том или ином виде должна присутствовать. Зачастую ее ценность понимается не сразу, а по прошествию времени. Например так случилось и в нашей команде, когда старые разработчики ушли и новеньким было очень сложно делать экскурс по системе, а она очень большая!

Но я против детально и огромной документации. Для себя и своих личных проектов я придерживаюсь следующего шаблона. Он достаточно компактный и простой в написании. Да это не ГОСТ, не ISO и не IEEE. Но она понятная и ее написание не занимает много времени.

Какие проблемы я пробую решить своим шаблоном:

  1. Для чего нужен данный модуль или архитектура?
  2. Как ее использовать?
  3. Как вносить изменения?
  4. Как осуществлять диагностику или проверку состояния?
  5. Какие были связаны с ней проблемы?
  6. Какими тестами покрыто? (Проблема очень важная, так как часто при планировании изменений приходилось вспоминать/идти проверять какими тестами покрыт функционал, что отнимало иногда много времени).

Шаблон документации

Назначение: для чего нужен этот модуль, какую задачу решает?

Основная задача: ссылка на задачу в трекере в рамках которой разрабатывалась данный модуль.

Диаграмма: графическое отображение архитектуры. Позволит понять что от кого зависит и как взаимодействует с другими частями системы.

Зоны ответственности: кратко описать элементы модуля и за что они отвечают. Смысл приёма в том, чтобы явно выделить назначение класса. Идеальный результат — получить класс, который можно описать одной фразой или даже одним словом.

Пример использования: небольшой пример того как использовать данный функционал.

Обработка ошибок: как обрабатываются ошибки.

Логирование:

  1. В какой файл пишутся логи.
  2. Уровни логирования и какую они могут дать информацию.

Тесты: каким типом тестов покрыта данная функциональность.

FAQ: вопросы и ответы по данной функциональности. Например: как объединить 2 объекта в сущности?

Инциденты и баги: ссылки на баги, которые были найдены в данной функциональности и исправленные.

Статьи по теме

  1. Еще раз о документации.
  2. 7 правил написания технической документации мирового класса.

Логирование

Для чего вообще нужно логирование в приложении:

  1. Сказать, что делать система, не прибегая к отладчику.
  2. Найти причины возникновения той или иной ситуации внутри приложения.
  3. Анализ того на что тратится больше всего ресурсов.

Какие есть требования к логерам?

  1. Уровни логирования и фильтрация сообщений.
  2. Ротация лог файлов.
  3. Возможность писать сообщения не только в файл.
  4. Thread safety.
  5. Асинхронное логирование.
  6. Формат и конфигурация логов.

Уровни логирования

  • TRACE — вывод всего подряд. На тот случай, если Debug не позволяет локализовать ошибку. В нем полезно отмечать вызовы разнообразных блокирующих и асинхронных операций.
  • DEBUG — журналирование моментов вызова «крупных» операций. Старт/остановка потока, запрос пользователя и т. п.
  • INFO — обычные сообщения, информирующие о действиях системы. Реагировать на такие сообщения вообще не надо, но они могут помочь, например, при поиске багов, расследовании интересных ситуаций итд.
  • WARNING — нештатные ситуации. Например непредвиденные параметры, странные форматы запроса. Любая информация, которая должна привлечь внимание. Некритичные ошибки.
  • ERROR — ошибка в работе системы, требующая вмешательства. Что-то не сохранилось, что-то отвалилось.
  • FATAL — критическая ситуация, которая требует немедленной реакции. Обычно значит что система в неработоспособном состоянии. Пишем в лог все до чего можем дотянутся.

Замечание! Никогда не отправляйте пустое исключение в лог. Так как обычно не понятно к чему принадлежит этот стэк-трейс, как программа отреагировала на ошибку. Чтобы избежать этого, в дополнение к трейсам прикладывайте и сообщение, которое обьясняет что именно произошло.

Интересные статьи на тему

  1. Архитектура логирования.
  2. Application logging principles.
Раніше Ctrl + ↓