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

Пізніше Ctrl + ↑

Надворная, Март 2019

Решил съездить к мой любимой бабушке в гости и заодно посмотреть места где я родился и провел первую половину своих школьных лет.

Надворная это небольшой городок, который размещен между Ивано-Франковском и Буковелем.

Тут я народился и жил до 8 класса школы, потом поступил в Ивано-Франковский лицей и уже там учился и жил в общежитии до 11 класса.

  1. Моя первая школа, там я проучился до 3 класса включительно.
  1. Городской стадион. Тут играют разные сборные района по футболу. Также здесь проводят концерты.
  1. Моя вторая школа, тут я доучился до 7 класса.
  1. Центр города.
  1. Мини плотина, тут часто купаются дети и взрослые, отличное место, так как находится на окраине города под горой. Очень тихо и уютно.
  1. Одна из улиц где я жил.
  1. Мой старый дом, жил на первом этаже.
  1. Трамплин, давно заброшенный и нерабочий.
  1. В лесу за городом можно часто встретить как ребята «увековечивали» свою любовь.
  1. Водохранилище.
  1. ЖД вокзал.
  1. Случайно фото из окна поезда, между Надворной и Ивано-Франковском.

Изучение SQL: триггеры

Сегодня на работе была задача по созданию триггеров на таблицу БД.
Суть заключалась в том, что надо сделать механизм, при котором update/insert в одну таблицу, переносил данные в другую таблицу, а предыдущую удалял.

Так как я раньше не работал с триггерами, пришлось немного почитать и сделать для себя эту заметку.

Типы триггеров.

  1. AFTER — выполняется после выполнения действия. Определяется только для таблиц. Можно определять несколько действий через запятую.
  2. INSTEAD OF — выполняется вместо действия (то есть по сути действие — добавление, изменение или удаление — вообще не выполняется). Определяется для таблиц и представлений. Можно определять только одно действие.

Создание простого триггера

CREATE TRIGGER User_Insert_Update_TR
ON Users
AFTER INSERT, UPDATE -- сработает как для INSERT так и для UPDATE скриптов.
AS
BEGIN
    INSERT UsersLog (UserId)
    SELECT Id FROM inserted
END

Управление триггером

Удаление

DROP TRIGGER User_Insert_Update_TR

Отключение

DISABLE TRIGGER User_Insert_Update_TR ON Users

Включение

ENABLE TRIGGER User_Insert_Update_TR ON Users

Работа со значениями запроса

Внутри каждого триггера можно работать с данными, которые изменяет тот или иной триггер.

  1. Добавление — виртуальная табличка INSERTED.
  2. Удаление — виртуальная табличка DELETED.
  3. Изменение — содержит 2 таблички.
    INSERTED хранит строки после обновления.
    DELETED до обновления.

INSTEAD OF

Данный тип триггеров работает вместо операций с данными. Также его можно применять не только для таблиц но и для представлений.

Пример
Данный триггер не будет удалять данный из таблицы Users, он просто деактивирует запись

CREATE TRIGGER User_Delete_TR
ON Users
INSTED OF DELETE
AS
BEGIN
    UPDATE Users
    SET IsActive = 0
    WHERE Id = (SELECT Id FROM deleted)
END

Sublime Merge

В ходе прохождения курса по гиту решил посмотреть какие есть GUI клиенты помимо SourceTree. И нашел sublime merge.

Решил попользоваться им неделю и посмотреть как приживется. Теперь это мой основной клиент после cli.

Что зацепило:

  1. Простой и удобный UI
  2. Можно выполнять команды гита в самом клиенте
  3. Очень удобный поиск, в котором можно писать свои запросы

Приложение для фото — NOMO

Решил сделать обзор на очередное приложение для фотографирования — NOMI.

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

Что меня в нем зацепило?

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

Результаты получаются весьма интересные.

Интерфейс

Примеры фото

Больше результатов тут.

Конспект: работа с командной строкой

Данная статья это конспект по пройденному курсу: Основы командной строки.

Обозначения пути

  • / — самый верхний уровень файловой системы
  • ~ — домашняя директория

Сайт на котором можно посмотреть что делает та или иная команда. Ссылка
Иформация о стандартных директориях *nix систем. FHS

Работа в файловой системе

  • pwd — отображает путь рабочей (текущей) директории
  • ls — показывает все файлы и директории в текущему или указанному пути
  • cd — служит для перемещения по директориям. Если выполнить без параметров — переместит нас в домашнюю директорию.
  • stat — показывает дополнительную информацию о папке или файле

Чтение файла

  • сat — Отображает содержимое файла
  • head — Отображает первые 10 строк файла, можно вывести больше с помощью флага -n 20
  • tail — Отображает последние 10 строк файла, можно вывести больше с помощью флага -n 20
  • less — Представляет из себя пейджер. С его помощью можно перемещайся и искать в файле. Также он может открыть файл любого размера, так как отображает только те строки, которые может поместить в окно консоли и при перемещении по файлу — дочитывать нужную информацию.

Может быть такая ситуация что файл очень интенсивно изменяется, например логи, и нужно постоянно выводить содержимое файла. Для этого у команд head и tail есть флаг -f. Данный файл сразу выводит на экран добавленные строки.

Grep

Grep — консольная утилита, которая производит поиск в файле или файлах по заданному шаблону.
Пример:

grep services Startup.cs  # выведет по очередно строчки, которые содержат services.

Иногда нужно посмотреть не только сами строчки содержащие текст, но и текст вокруг.
Для этого есть несколько дополнительных флагов:

  • -B — количество строк до искомой строки
  • -A — после искомой строки
  • -C — до и после одновременно
  • -R — рекурсивный поиск по директориям и под директориям
  • -n — отобразит номер строки, возле каждого результата поиска

Примеры:

grep -R .getUsers() . - найдет все файлы в которых есть строчка .getUsers(), начиная с текущей.
grep -C 10 text file.txt - найдет строку text и отобразит ее и 10 соседних строк с каждой стороны

Текстовые редакторы

Для редактирования файлов в командной строке используют редакторы Nano, Vim и Emacs. Первые два, обычно, установлены по умолчанию.

Nano
Самый простой текстовый редактор. Удобно редактировать небольшие файлы.

Vim
Данный редактор имеет очень много возможностей и особенностей.
Работа в Vim состоит из разных режимов.
Когда только открыли файл, редактор работает в режиме команд. Любое нажатие выполняет какую-то определенную команду.

В Vim есть четыре основных режима работы:

  1. Командный режим (обычный режим) — это режим по умолчанию. Перемещение по файлу, быстрое (при помощи команд, комбинаций клавиш) редактирование, удаление, поиск текста.
  2. Режим вставки (режим ввод) — ввод текста с клавиатуры. То, как вы привыкли это делать в обычных редакторах.
  3. Визуальный режим — выделение произвольных участков текста.
  4. Режим командной строки — собственная командная строка для редактора текста, из которой можно выполнять великое множество разнообразных команд.

Для перехода в режим вставки — нажать i.
Для перехода в режим команд — нажать ESC.

Как выйти с Vim? :-)
Для начала нужно перейти в режим команд.

  • :q! — Закрывает файл без сохранения изменений
  • :wq — Сохраняет и закрывает файл
  • :w — Просто сохраняет файл

Хороший гайд по Vim — https://guides.hexlet.io/vim/

Перенаправление потоков

В *nix системах есть такое понятие как потоки. В начале работы программы ОС связывает ее с тремя потоками: STDIN, STDOUT и STDERR.
Для всех приложений они выглядят как обычные файлы.
Что же делает каждый из них?
* STDIN — отвечает за ввод программы.
* STDOUT — отвечает за вывод программы.
* STDERR — отвечает за вывод ошибок.

По умолчанию вывод всех команд отображается на экране. Но с мощью параметра > можно перенаправить вывод в указанный файл.

ls -l > output.txt

На экране ничего не отобразится, но в текущей директории появится файл output со всем выводом команды ls -l. Данную операцию можно сделать с любой программой, которая что-либо выводит на экран. Но есть одна особенность данного оператора, он перезаписывает все данные в файле, для того чтобы дописать используйте >>.

echo Hello_World > output.txt
# Hello_World
echo Hello_World1 > output.txt
# Hello_World1
echo Hello_World2 >> output.txt
# Hello_World1
# Hello_World2

Также можно перенаправлять в другую сторону поток. Например у нас есть файл и мы ходим посмотреть сколько в нем строк. Для этого существует команда wc. Она принимает на вход текст, но с помощью оператора < мы можем передать в нее содержимое файла.

wc -l < result.txt
# 2432

Также можно как читать так и писать в файл:

wc -l < result.txt > output.txt

Пайплайн (Конвейер)

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

Например нам нужно найти строку в которой есть несколько слов и нам не важно как они расположены внутри, главное чтобы были на одной строчке.

grep alias .bashrc | grep color

Алгоритм такой команды очень прост:

  1. Выбираем строки, которые содержат alias
  2. Потом в строчках, которые получили на выходе первой команды, ищем слово color

| — этот символ называется пайп, он указывает шелу взять STDOUT одного процесса и соединяет его с STDIN другого процесса. 

Также команду выше можно переписать на такую:

cat .bashrc | grep alias | grep color

Манипулирование файловой структурой

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

Команды:

  1. touch filename — изменяет время последнего доступа к файлу, если его нету — создает
  2. rm — удалить файл
    • -r  — удаляет папку
    • -f — не спрашивает подтверждение пользователя
  3. mv — переименовывает файл. В *nix системах не существует понятия «переименовать файл». Переименование всегда равносильно перемещению, которое выполняется командой mv.
  4. cp — копирует файл.
    • -r — позволяет скопировать директории
  5. mkdir — создание директории
    • -p — позволяет создать вложенные директории. mkdir /folder/subfolder

Переменные окружения

Для просмотра переменных окружения используют команду env.
Формат вывода очень простой: слева от знака равно имя переменной, справа — значение.

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

Для вывода переменной используется echo, а перед самой переменной ставится знак $.

echo $HOME

Существует два способа задавать значение переменной окружения: локальный и глобальный.
Локальные переменные живут для конкретной программы:

HOME=/var cd

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

export HOME=/var

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

История комнад

Для просмотра команд можно использовать клавиши вверх и вниз. Но все введенные команды хранятся в файле .bash_history, который лежит в домашней директории пользователя.

Посмотреть историю можно и более простым способом, достаточно выполнить команду history.

Последнее, и самое интересное — реверсивный поиск. Если нажать комбинацию Ctrl + r, то запустится специальный поиск по истории. Он ожидает ввода символов и сразу отображает ближайшую команду, в которой эти символы встречаются. Если найденное соответствие вас не устроило, то повторное нажатие Ctrl + r выберет следующее соответствие из истории.

Sudo

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

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

Основной способ повышать привилегии в современных системах — утилита sudo.
По умолчанию она пытается повысить права до суперпользователя.

Пакетный менеджер

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

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

Digital Ocean

Уже пол года использую Digital Ocean для хостинга собственных проектов и проектов моих заказчиков.

Что меня зацепило?
Я не большой специалист в разворачивании и настройке виртуальный Linux машин. В этом деле мне помогаю пресеты. С их помощью можно в один клик развернуть машинку с подготовленным MySQL.
Недавно DO зарелизил маркетплейс для пресетов, тем самым каждый может создать для себя готовый пресет и поделится им.

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

Дополнительные фичи
За последние нескольких месяцев добавили возможность создавать свой Kubernetes кластер. Кроме этого зарелизили создание серверов БД (пока только PostgreSQL), что тоже существенно облегчает жизнь.

Самое приятное — ценовая политика.
Цены в Digital Ocean как по мне самые приятные. Всего за 5 долларов в месяц, можно получить виртуальную машину. Самый простой сервер БД обойдется в 15 долларов.

Оставлю здесь свою реферальную ссылку (получите 100$ на 60 дней для тестирования).

Кэширование

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

Кэширование очень активно используют во множестве систем. Например:

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

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

Что можно кэшировать?

  • Запросы в базу данных.
  • Пользовательские сессии.
  • Медленные операции внутри приложения (расчеты, какие-то итоговые данные и т. д.)
  • Запросы к внешним системам.

Алгоритм работы

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

Стратегии кэширования

Cache Aside

Самый простой способ кэширования, зачастую множество фреймворков уже имеют встроенную реализацию.

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

Плюсы:

  • Отлично подходит для тяжелых операций чтения.
  • Обычно система устойчива к отказу кэша. Если он упадет всегда можно пойти напрямую в базу данных.
  • Возможно использовать разные структуры данных для кэша и базы данных. Особенно полезно когда нам нужно закешировать результат какой-то сложной выборки

Минусы:

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



Read Through

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

Плюсы:

  • Отлично работает с тяжелыми операциями чтения.
  • Данные всегда в консистентном виде.

Минусы:

  • Модель данных в кэше и в базе данных не могут отличатся.
  • Первый запрос в кэш всегда будет приводить к промаху и последующему запросу в БД. Эту проблему можно — решить с помощью “прогревания” кэша.



Write Through

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

Лучше всего использовать эту стратегию вместе с read-through подходом. В таком случае мы получаем плюсы двух стратегий.

Плюсы:

  • Гарантирует полною консистентность данных.
  • Отлично работает с тяжелыми операциями записи.

Минусы:

  • Добавляет дополнительную задержку для операций записи.



Write Back

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

Плюсы:

  • Позволяет сильно оптимизировать сложные операции записи.
  • Данные всегда в консистентном виде.

Минусы:

  • Сложность реализации.
  • Есть шанс потерять данные если произойдет сбой кэша до того как данные запишутся в основное хранилище.

Алгоритмы вытеснения

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

  • LRU (Least recently used) — алгоритм, который находит и вытесняет данные, которые не использовались дольше всех.
  • MRU (Most Recently Used) — вытесняются последние используемые данные.
  • LFU (Least Frequently Used) — вытесняются редко запрашиваемые данные.

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

Проблемы с кэшированием

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

  • Деление данных между кэширующими серверами.
  • Параллельные запросы на обновление данных.
  • “Холодный” старт приложения.

Деление данных между кэширующими серверами
Для повышения надежности и производительности системы кеширования приходится разделять ее на несколько серверов. Поэтому возникает вопрос как делить данные между серверами.

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

Проблема такого подхода заключается в том, что в случае падения сервера мы теряем почти 80% данных из-за изменения месторасположения ключей.

Вариант 2. Логическое разделение данных на основе какого-то признака. Например мы можем разделять данные на основании пользователя. Так данные одного пользователя будут лежать рядом на одном сервере.
Примеры проблем и их решения отлично описаны в статье “Проблемы при работе с кэшем и способы их решения”

Параллельные запросы на обновление данных

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

Решение 1. Блокировка перед обновлением кеша. Первый запрос получает уникальную блокировку на загрузку данных в кэш, все остальные ожидают блокировку. Это решает проблему с обновлением, но порождает новые: как обрабатывать таймауты, как правильно подобрать время блокировки и т. д.

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

Решение 3. Вероятностное обновление данных. Обновляем не только данные, которых нет в кэше, но и с какой-то вероятностью те что уже есть. Это позволит обновить данные, до того как они протухнут и будут удалены.

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

«Холодный» старт приложения
В момент запуска приложения данных в кэше может не быть. Как только пойдут запросы от пользователей все они пойдут массово в базу данных и начнуть одновременно обновлять кэш. Такая ситуация может привести к резкому падению производительности всей системы.

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

Итого

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

Ссылки

  1. Кэширование данных
  2. Обзор кэширования от amazon
  3. Кэширование и производительность веб-приложений
  4. 11 видов кэширования для современного сайта
  5. Тяжелое кэширование
  6. Проблемы при работе с кэшем и способы их решения
  7. Проблема одновременного перестроения кэшей
Раніше Ctrl + ↓