Чистый код — простые концепции

Чистый код хорошо пахнет

Что такое “Чистый код”

Нету простого определения понятию “Чистый код”. Но можно тезисно описать некоторые подходы к пониманию:

  • Не содержит дубликатов
  • Четкий, простой и прямолинейный
  • Минимально-необходимое количество сущностей: классов, зависимостей, методов, функций, строк кода и т.д.
  • Понятный и выразительный
  • Продуманный. Создает впечатление, что автор кода над ним усердно потрудился
  • Реализованы все требования к продукту

Почти все это абстрактно, поэтому ниже будет конкретика

Почему важно писать чистый код

  • “Грязный код” накапливается. Это приводит к ошибкам. Количество ошибок растет лавинообразно. В конечном счете проект становится очень дорого поддерживать
  • Вы сами будете не раз возвращаться к своему предыдущему коду. Нужно будет вносить правки или улучшения. Чистый код проще поддерживать. Скорость разработки с чистым кодом выше
  • Не только вы будете изучать предыдущий код, но и ваши коллеги. Они почувствуют уважение и благодарность, если столкнуться с чистым кодом
  • Написание чистого кода так же будет развивать в вас такие положительные черты, как аккуратность, внимательность и предусмотрительность

Начало — простые концепции

Несмотря на кажущуюся простоту, они очень важные:

  1. Правило бойскаута

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

Этот принцип формируем в нас характер и стремление к чистоте

  1. Содержательные имена

Имена должны передавать намерения программиста. При удачном именовании переменных, методов и класса, комментарии к коду не будут нужны. Сам код будет легко читаться и пониматься

Что следует избегать:

  • Короткие названия, которые слабо описывают смысл
grnp109, a1, pf
  • Однобуквенных переменных, где можно заложить смысл
$items = $this->userOrdersFromLastVisit($date);
foreach($items as $i) {
   $i->date = Date.now();
}

Может быть

$userOrders = $this->userOrdersFromLastVisit($dateOfLastVisit);
foreach($userOrders as $userOrder) {
    $userOrder->updatedDate = Date.now();
}
  • Сокращения и неудобно-читаемые имена

Было

mngmnt, len, datefromlastupdate

стало

management, length, dateFromLastUpdate

Другие рекомендации

  • Имена классов — обычно имена существительные: Product, UserPage, OrderParser
  • Имена методов — глаголы или глагольные словосочетания: deleteProduct, save, getName
  • Писать имена на английском языке без ошибок. Перевод любого слова можно получить в онлайн-переводчике
  • Быть последовательным. Если для получения данных в классе несколько раз использовался термин get, в похожем контексте слово fetch будет выбиваться

Впечатление о книге Пиши, сокращай — Максима Ильяхова

Книга Пиши, сокращай Максима Ильяхова и Людмилы Сарычевой

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

Книгу можно найти только в печатном формате. В электроном виде книгу не выпускали намерено. Меня это очень удивило.

В нескольких моих статьях об полезных книгах упоминается, что навык правильно писать — важен для программиста (здесь я добавлю ссылки на эти статьи).

Все это и побудило меня в прочтению и конспектированию основных идей книги:

  • Первая мысль в книге, которая поменяла мой подход в написании текстов: заумные формулировки и красивые обороты не красят текст, а скорее, наоборот, мешают его пониманию. Смысл важнее слов. Лучше писать проще
  • Самый важное в тексте — это создать пользу для того, кто его читает. Противоположность этому — красивые обороты, маскирующие мотивы писателя. Необходимо быть честным и полезным читателю
  • Сделать сообщения понятными поможет сокращение текста. В книге можно найти много рекомендаций, как это сделать. Все они структурированы и подробно поясняются. Что-то стоит убрать, что заменить, что оставить
  • Примеры и короткие истории отлично подойдут для донесения своих мыслей или пояснений
  • С критикой нужно быть тактичным. Критиковать работу можно, человека — нельзя
  • Сложно воспринимаются предложения, в которых заложено несколько мыслей. Такие предложения длинные. В них много знаков препинания. Лучше, если в одном предложении будет содержаться одна мысль.
  • Чтобы исправить текст — необходимо читать его в слух. Так мы выявим как его упростить, улучшить.
  • Абзацы в нашем тексте создают структуру. Структура облегчает понимание.
  • В первое предложение абзаца важно вложить побольше смысла.
  • Как и с предложением, в один абзац вкладываем одну мысль. Разбиваем ее на предложения.
  • Если в тексте много абзацев — необходимо его структурировать. Модуль — это заголовок с несколькими абзацами, которые являются мини-статьей. Что подразумевает в структуре модуля: введение, основную часть и заключение.
  • Чтобы привлечь внимание к статье — она должна быть полезной. Громкие заголовки с пустой статьей навредят читателю. Тем самым, навредят и автору.
  • Все абстрактное имеет мало пользы. Необходимо заменить конкретным.
  • Последняя глава в книге подробно описывает как рекламировать себя. Даже если вы — компания или корпорация.

Главный вопрос, который следует задать себе перед написанием текста — это “Чем вы полезны читающему?”. И ответ на него: честный и конкретный

Защита аккаунта от взлома на веб-сайтах и соцсетях

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

Итак, тезисно:

  • Пароли. Существует мнение, что пароли должны быть сложными для того чтобы их не взломали. На самом деле, даже супер-сложный пароль могут подобрать. Особенно, если вы используете один и тот же пароль на разных сайтах. Некоторые сайты (со слабой защитой) могут взломать и базы данных логинов и паролей «утекут» в открытый доступ. Далее, злоумышленники обязательно попробуют именно этот логин и пароль на других популярных сервисах.

Конечно, пароль должен быть не из тех, что простые и распространенные. Но главное, все таки, это количество символов — не менее 10. И самое главное — не использовать один и тот же пароль для различных сервисов. Но чтобы не усложнять вам жизнь, существует такой лайфхак — добавлять к вашему «сложному паролю» несколько символов (систему) в зависимости от сервиса.

Предположим, ваш обычный пароль есть «ParOLb83561». Для YouTube вы можете использовать такой пароль «ParOLb83561-YT» (черточка как разделитель и две буквы, которыми можно зашифровать сервис), для TWitter такой «ParOLb83561-TW». И тогда сложный пароль становится уникальным

  • Двух-факторная авторизация. Этим понятием, уже не удивить, это не диковинка. Многие сервисы и соцсети предлагают ее, как дополнительную меру безопасности. Это не сложно, советую ее использовать в тех сервисах, где взлом будет очень болезненный (или потерей денег или других ценностей).

Наиболее распространённые разновидности: с помощью СМС и подтверждающих кодов Google Authenticator.

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

Далее вы переходите по ссылке на этот сайт, вводите свой логин и пароль и получаете сообщение, что введено неверно. А на самом деле, ваши данные уже скомпрометированы и сохранены в базе хакеров.

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

Разумеется, нужно немного подготовиться и добавить соцсети, сайты магазины, банков, бирж и т.д. в Избранное

Защита сайта от брутфорс и ддос атак

Чтобы понять, как защитить веб-систему от брутфорс или ддос атак, необходимо разобраться, что они из себя представляют.

Подробно о брутфорсах было раскатано ранее.

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

Так же «ддосить» эффективнее всего страницы, которые потребляют больше всего ресурсов вашего сервиса, а брутфорсят форму авторизации/восстановления пароля или же аналогичные АПИ для авторизации или восстановления пароля. При этом, злоумышленникам выгоднее, если ваш сайт, все таки доступен, так что они, скорее всего позаботятся, чтобы нагрузка была равномерная.

Итак, общие методы защиты и от брутфорса и от ддоса будут следующие:

  • Выставление лимитов на количество запросов в секунду/минут на уровне веб-сервера
  • Использование инструментов, которые автоматизируют блокировки айпи-адресов или user-agent клиентов, если количество запросов или ошибок блокировки превышает пороговое значение (например, fail2ban)
  • Косвенным инструментом, так же, являются панели мониторинга, настроенные на количество запросов или ошибок, которые позволят оперативно реагировать на параметры, отличные от нормальной ситуации
Пример одного из даш-бордов из Grafana со статусами ответов и ошибок
  • Настроенные уведомления, при изменении поведения вашей системы, т.е. потенциальных атаках
  • Так же важны обновления операционной системы и настройки веб-сервера на соответствующие нагрузки

Что еще можно добавить по бтурфорсам, отдельно

  • Собственные лимиты на формы и АПИ авторизации, восстановления паролей, которые могут быть строже, чем на «любую» страницу
  • На веб-формы можно повесить капчи (google recaptcha) и CSRF-защиту
  • Дву-факторная авторизация (например, с помощью СМС-шлюза или же Google Authenticator)
  • Уведомления пользователям, в случае, если произошла авторизация из неизвестного устройства или локации

Из косвенных методов зашиты:

  • Дополнительные слои анализа и защиты в местах, где выводятся вашим реальным пользователем выводятся деньги или другие ценности, чтобы сделать сложнее жизнь злоумышленнику, даже, если ему удасться взломать пару-тройку аккаунтов
  • Возможность временной блокировки скомпрометированных аккаунтов пользователей

Атака на наш веб-сайт — брутфорс — как и зачем

Один из самых распространённых типов атак на веб-сайт — это брутфорс (brute force).

Брут форс — это атака на веб систему, с целью взломать аккаунты. Чаще всего атакуются или форма авторизации или апи авторизации.

Так как же взламывают?

Для этого, злоумышленнику нужно или хорошо подготовится, или же найти готовые скрипты / инструкции по брутфорсу на конкретный веб сайт. Подготовка, в этом контексте, заключается в том, чтобы узнать входную точку запросов авторизации (адрес для ввода логина, чаще всего — адреса электронной почты, и пароля) и параметров запроса (ведь кроме логина и пароля могут потребоваться и другие параметры). Готовые инструкции злоумышленники находят на специализированных форумах, закрытых группах в соц сетях или заказывают у других злоумышленников.

Так же хакеру нужна база емэйл адресов и паролей для перебора. И тут есть различные подходы:

  • первый подход: набор емэйл адресов (часто, это адреса, которые были «хакнуты» ранее или же слиты/проданы не-добропорядочными организациями) и перебор паролей, которые чаще всего используются большинством людей, например qweqwe, 123123 и иже с ними
  • второй, более прогрессивный подход опишем далее. Многие люди используют один и тот же емэйл и пароль для регистрации на различных веб-сайтах. Это происходит, потому что так проще запомнить пароль. А теперь, представим, что на одном из таких сайтов была слабая защита и его взломали и «забрали» базу емэйлов-паролей, а пароли еще и не были защищены шифрованием… Теперь можно использовать эти «беспроигрышные» комбинации и на других сервисах. Самое неприятное здесь, что для защиты не помогает сложный пароль, каким бы сложным он не был. Что уж таить, взламывают и крупные сервисы, такие как соц сети и получают огромную базу, готовую к брутфорсу

Прежде чем углубляться в вопрос «Как», давайте осветим «Зачем» брутфорсят Ваш сайт.

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

Если же деньги вывести не удается, аккаунты можно продать другим злоумышленникам, особенно если средства/ценности есть на счету взломанных пользователей (тогда можно доказать ценности учетных записей скриншотами балансов).

Закрытые группы в фейсбуке, где продают учетные данные с сайтов или конфигурации для автоматизации взломов

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

Вернемся к вопросу «как» поподробнее.

Никто (или почти никто) не перебирает логины-пароли вручную. Для этого используют автоматизацию. Думаю, что инструментов для брутфорса множество. Один из самых популярных и известных мне, например SilverBullet. В ней можно выставлять различные параметры атаки, например количество запросов в секунду.

Пример конфигураций из закрытых групп в соц сетях

Так же, хакеры используют базу прокси-адресов (выделенных IP адресов) для того, чтобы их было сложнее заблокировать. Один IP адрес просто заблокировать средствами операционной системы или веб-сервера, а вот меняющиеся адреса — сложнее. Какое то количество IP адресов на относительно короткое время можно получить бесплатно (далее, по моим прикидкам один IP адрес будет стоить примерно 0.1 доллара в месяц). Регистрируются они на специализированных сайтах, которые их (прокси) продают легальным образом для безобидных целей. Но, как видите, часто используются для целей злоумышленников. Это базы прокси-адресов подключаются к программе брутфорса (той же SilverBullet). Так же туда подключаются другие параметры атаки, упомянутые ранее.

И атака запускается.

Простейшие методы XSS защиты

В мире веб разработки очень важно рассматривать свой код с точки зрения безопасности от взлома и инъекций.

Особенно если это работа с web запросами и(или) куками
Особенно если есть работа и запись в базу данных
Особенно если проект работает с деньгами

Работу (особенно эту “рутину”) облегчают фреймворки. В любом современной фреймворке есть методы очищающие или защищающие параметры запроса от инъекций или вредоносного кода. Их преимущества в универсальности. Их недостатки в производительности.

Кстати, один из видов вредоносного вектора атаки — это эксплуатировать время очистки параметров от скриптов (для упрощения будем называть это XSS). Т.е., злоумышленник посылает множество запросов в ту область которая будет долго обрабатывать запросы и тормозить сервер. Ведь под капотом стандартных методов защиты от XSS различные сложные регулярные выражения с заменами.

Альтернативой являются простейшие методы защиты от XSS, там, где это применимо

  1. Приведение к простейшему типу.
    Если мы знаем, что получаемый GET параметр должен быть целочисленным — мы просто можем привести его к целочисленному перед дальнейшем обработкой или же отклонять запросы, если этот параметр не целочисленный.
    Так же можно поступать, если, например, мы знаем, что получаемый параметр может принимать только определенные значения.
$cleanParam = (int)$_GET["dirtyParam"];
  1. Простые регулярные выражения, заточенные под получаемый параметр
    Обрабатываемый параметр может, например, состоять только из цифр и букв английского алфавита. Незачем “прогонять” его по всем кругам регулярно стандартной защиты от XSS. Можно написать простую регулярку.
if( preg_match("/^[a-zA-Z\d]+$/", $_COOKIE["dirtyParam"]) )

MySQL — проблема запросов с limit и offset к очень большим таблицам и ее решение

Представим, что у нас есть таблица пользователей (users) или заказов (orders) на десятки миллионов записей и больше. И у нас стоит задача их перебора в любом контексте.

Я представляю себе это в виде цикла, в котором порционно забираем разумное количество записей, что-то вроде:

select * from users order by id limit 1000 offset 0;

Такой запрос выполняется очень быстро, моментально.

Рано или поздно мы приходим к offset, например 40 млн:

select * from users order by id limit 1000 offset 40000000;

И тут запрос может выполняться несколько минут.

Происходит это из-за того, что mysql не может гарантировать, что все элементы будут на своих порядковых местах, ведь может так статься, что элемент 40 000 099 был ранее удален и алгоритмам приходится сканировать все 40 млн элементов для получения выборки.

Решением этой проблемы может стать видоизменение запроса из limit-offset на where-limit:

 select * from users where id > 40000000 order by id limit 1000;

Выполняется моментально!

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

Поиск, подготовка и установка windows 11 без активации и без TPM

Подразумевается, что вы — счастливый обладатель более ранней виндовс. 

Это может быть 7я, Vista, 8я, или 10я версия.

1). Находим установочный образ с Виндовс 11

Можно пойти по простому пути, если у вас современный компьютер.

Дело в том, что какое то время, Microsoft, для установки Windows 11, требует довольно таки серьезное железо и поддержку технологии TPM у вашего процессора. 

Если вы уверены, что эти требования выполнены, можно скачать образ с сайта Майкрософта по ссылке

Загрузка образа виндовс с официального сайта

В случае, если вы не уверены, что ваше железо достаточно современно (или же планируете установить винду на виртуальной машине), то можно скачать заранее заготовленный под это дело образ используя AveYo’s Universal MediaCreationTool. 

В частности, скачиваем MediaCreationTool.zip  от сюда следующим образом:

Скачиваем тулу для нахождения образа windows 11

Распаковываем и запускаем файл MediaCreationTool.bat

Интерфейс тулы для скачивания образа 11 виндовс

Выбираем пункт “11” как на скриншоте

Тут же можно выбрать действие, например скачать ISO (Make ISO) или создать загрузочную флешку (Make USB).

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

Конечный образ занимает приблизительно 4 гигабайта.

2). Создаем загрузочных флешку

Разумеется, нужна сама USB флешка. Не менее 8 гигабайт. Вставьте ее в USB-разъем вашего компьютера.

Для создания загрузочной флешки можно использовать специализированную программу, которую скачаем тут

скачиваем последнюю версию программы для загрузочных флешек

… Скачиваем, запускаем, выбираем ранее созданный образ Винды и выставляем настройки на на скриншоте (для загрузочной флешки):

Настройки программы по формированию загрузочной флешки виндовс 11

Схема раздела: MBR.

Нажимаем старт и ожидаем окончания операции.

Загрузочная флешка готова. Осталось с нее поставить Windows 11.

3). Установка Windows 11 с загрузочной флешки

По факту, далее, процесс установки Виндовс 11 принципиально ничем не отличается от установки любой другой виндовс. 

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

Чтобы запустить процесс установки с USB флешки, эта флешка должна быть вставлена в разъем USB 🙂

Далее перезагружаем компьютер и прежде чем загрузилась операционная система, входим в биос (обычно нужно нажимать на кнопку DEL).

В биосе (обычно в разделе Advance) меняем порядок загрузки — подымаем наверх USB Flash. Сохраняем (обычно F10). Система перезагружается и, через какое то время появляется окно установки Windows 11.

Далее, читаем, выбираем язык, региона указываем имя, пароль для учетки.

На окне активации, где предлагают ввести ключ активации, если у вас его нету, Выбираем соответствующий пункт (что-то вроде “У меня нету ключа активации” или “I don’t have a product key”). 

Если вам понравится эксплуатация новой Виндовс, позже сможете ее активировать, для лучшего пользовательского опыта

Microsoft SQL Server Express Edition — автоматические бекапы базы данных

Microsoft SQL Server Express Edition — бесплатная версия Microsoft SQL Server, в которой многий функционал порезан.

Например отсутствует SQL Server Agent или Maintenance Plans, которые облегчают создание автоматических бэкапов баз данных.

В связи с этим, приходится выбирать другие пути. Один из них описан ниже.

Исходные данные для наших настроек:

  • имя базы данных: db_name
  • путь для хранения скриптов и бэкапов базы данных db_name: «d:\projects\db_backups»
  • периодичность создания бэкапов: раз в 1 день
  • срок хранения бекапов: 3 дня

Разделим скрипт бекапов на 2 шага:

  1. создание и сохранение бекапа
  2. очистка папки от старых бэкапов

Для первого шага:

a) Запускаем нижеследующий скрипт, например в Management Studio, чтобы записалась хранимая процедура на master базе данных

USE [master]
GO
/****** Object:  StoredProcedure [dbo].[sp_BackupDatabases]    Script Date: 8/12/2021 6:26:34 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================  
-- Author: Microsoft  
-- Create date: 2010-02-06 
-- Description: Backup Databases for SQLExpress 
-- Parameter1: databaseName  
-- Parameter2: backupType F=full, D=differential, L=log 
-- Parameter3: backup file location 
-- ============================================= 
CREATE PROCEDURE [dbo].[sp_BackupDatabases]   
            @databaseName sysname = null, 
            @backupType CHAR(1), 
            @backupLocation nvarchar(200)  
AS  
       SET NOCOUNT ON;  
            DECLARE @DBs TABLE 
            ( 
                  ID int IDENTITY PRIMARY KEY, 
                  DBNAME nvarchar(500) 
            ) 
             -- Pick out only databases which are online in case ALL databases are chosen to be backed up 
             -- If specific database is chosen to be backed up only pick that out from @DBs 
            INSERT INTO @DBs (DBNAME) 
            SELECT Name FROM master.sys.databases 
            where state=0 
            AND name= ISNULL(@databaseName ,name)
            ORDER BY Name
            -- Filter out databases which do not need to backed up 
            IF @backupType='F' 
                  BEGIN 
                  DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','AdventureWorks') 
                  END 
            ELSE IF @backupType='D' 
                  BEGIN 
                  DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','master','AdventureWorks') 
                  END 
            ELSE IF @backupType='L' 
                  BEGIN 
                  DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','master','AdventureWorks') 
                  END 
            ELSE 
                  BEGIN 
                  RETURN 
                  END 
            -- Declare variables 
            DECLARE @BackupName nvarchar(100) 
            DECLARE @BackupFile nvarchar(300) 
            DECLARE @DBNAME nvarchar(300) 
            DECLARE @sqlCommand NVARCHAR(1000)  
	        DECLARE @dateTime NVARCHAR(20) 
            DECLARE @Loop int                   
            -- Loop through the databases one by one 
            SELECT @Loop = min(ID) FROM @DBs 
      WHILE @Loop IS NOT NULL 
      BEGIN 
-- Database Names have to be in [dbname] format since some have - or _ in their name 
      SET @DBNAME = '['+(SELECT DBNAME FROM @DBs WHERE ID = @Loop)+']' 
-- Set the current date and time n yyyyhhmmss format 
      SET @dateTime = REPLACE(CONVERT(VARCHAR, GETDATE(),101),'/','') + '_' +  REPLACE(CONVERT(VARCHAR, GETDATE(),108),':','')   
-- Create backup filename in path\filename.extension format for full,diff and log backups 
      IF @backupType = 'F' 
            SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_FULL_'+ @dateTime+ '.BAK' 
      ELSE IF @backupType = 'D' 
            SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_DIFF_'+ @dateTime+ '.BAK' 
      ELSE IF @backupType = 'L' 
            SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_LOG_'+ @dateTime+ '.TRN' 
-- Provide the backup a name for storing in the media 
      IF @backupType = 'F' 
            SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' full backup for '+ @dateTime 
      IF @backupType = 'D' 
            SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' differential backup for '+ @dateTime 
      IF @backupType = 'L' 
            SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' log backup for '+ @dateTime 
-- Generate the dynamic SQL command to be executed 
       IF @backupType = 'F'  
                  BEGIN 
               SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT' 
                  END 
       IF @backupType = 'D' 
                  BEGIN 
               SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH DIFFERENTIAL, INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'         
                  END 
       IF @backupType = 'L'  
                  BEGIN 
               SET @sqlCommand = 'BACKUP LOG ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'         
                  END 
-- Execute the generated SQL command 
       EXEC(@sqlCommand) 
-- Goto the next database 
SELECT @Loop = min(ID) FROM @DBs where ID>@Loop 
END 

b) В папке бэкапов создаем исполняемый файл с расширение bat (например, sql_db_backup.bat) и содержимым

sqlcmd -S .\SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='d:\projects\db_backups', @databaseName='db_name', @backupType='F'"

где ‘d:\projects\db_backups‘ — здесь будем хранить бэкапы, db_name — имя базы данных (из условий выше)

с) создаем в Расписании Виндовс (Task Scheduler) задачу для выполнения скрипта c параметрами

  • Create Basic Task…
  • Run whether user is logged on or not’ выбранный, затем выбираем ‘Do not store password…
  • Trigger: Daily, и время, когда будет выполняться скрипт
  • Actions: Start a program — и указываем путь к bat файлу, созданному ранее — sql_db_backup.bat
  • Остальные параметры второстепенны

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

Для второго шага:

a) создадим скрипт с расширением bat (например, sql_clean_backups.bat) и содержимым

forfiles -p d:\projects\db_backups\ -m *.bak* /D -3 /C "cmd /c del /q @path"

который будет удалять файлы с расширением .bak старше 3х дней

b) создаем в Расписании Виндовс (Task Scheduler) задачу для выполнения скрипта c параметрами аналогичными пункту (c) первого шага.

На этом все…

Впечатления о книге — Чистый Agile — Роберта Мартина

Чистый Agile — Роберт Мартин

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

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

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

Мысли автора описаны в неформально-разговорном стиле, поэтому некоторые выражения могут показаться не совсем корректными. 

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

Вся суть Agile в четырех предложениях Манифеста:

  • Люди и взаимодействия важнее процессов и инструментов
  • Работающий продукт важнее исчерпывающей документации
  • Сотрудничество с заказчиком важнее согласования условий контракта
  • Готовность к изменениям важнее следования первоначальному плану

Автор отмечает интересный факт, что некоторые думают, что Agile способствует скорости выполнения проекта. Это не так. Agile никогда не ставил своей целью выполнить и сдать проект поскорее. Agile помогает вовремя понять то, где и насколько мы облажались. Другими словами, главная цель Agile — защита от самообмана, мы применяем Agile, точны избавиться от ложных надежд, которые в итоге приведут проект к краху.

По мнению Роберта Мартина наиболее подходящий метод Agile — метод экстремального программирования. Из всех методологий Agile это наиболее определенная, исчерпывающая и наименее запутанная методология. В книге этой методологии уделяется, непосредственно, много страниц. Некоторые другие важные методы: метафора, 40-часовая рабочая неделя, коллективное владение и непрерывная интеграция.

Один из наиболее важных методов экстремального программирования — разработка через тестирование. Ее можно описать тремя простыми правилами:

  • Не пишите готовый код до того, как напишите тест, который не получится пройти из-за нехватки этого кода
  • Не пишите тестов больше, чем это необходимо для неудачи, — сбой при компиляции также считается неудачей
  • Не пишите рогового кода больше, чем достаточно для прохождения теста, который был провален до этого

Еще один важный метод экстремального программирования — парное программирование. Многие отрицательно воспринимают мысль о том, что два (или более) человека могут плодотворно работать над одной и той же задачей. Однако, работа в паре не обязательна. Никого не стоит принуждать. А еще, работа в паре не обязательно постоянна. Существует много веских причин работать в одиночестве. Право выбора сколько времени работать в паре принадлежит членам команды, самим программистам.

В финале, хотелось бы отметить мысли автора по поводу нового Манифеста Agile, который дополняет оригинальный манифест и расширяет его с точки гения подхода Высшего мастерства разработки.

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

Занимаясь этой деятельностью, мы прежде всего научились ценить:

  • Не только работающий продукт, но также и искусно разработанный продукт.
  • Не только готовность к изменениям, но также и постоянное увеличение ценности.
  • Не только людей и взаимодействие, но также и содружество профессионалов.
  • Не только сотрудничество с заказчиком, но также и плодотворное партнерство.