Кирилл Артёменко

Личный блог для заметок и публикаций.

Тормозит Docker на Mac?

Проблема: volume подключенные на Mac в режиме чтения и записи очень долгие подробнее
Решение: достаточно добавить :cached к volumes — узнать как это работает

docker run -v /Users/mb/code/docker-project/app:/project-app:cached alpine command

При использовании docker-compose

services:
  php:
    image: php:fpm
    volumes:
      - ./app:/usr/local/app:cached

Самый простой способ ускорить работу в несколько раз без танцев с бубном (плясал 3 дня).

Примеры ускорения наглядно

15 сентября   IP   Комманды   Консоль   Терминал

Используемый софт

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

iTerm2

Отличная замена стандартного терминала, существенно расширяет возможности стандартного терминала. Работает на компьютерах Mac с MacOS 10.8+.

Также по скриншоту видно, что я предпочитаю оболочку Oh My Zsh.

PyCharm

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

Это относиться ко всей линейке продуктов компании, таких как WebStorm, PhpStorm, RubyMine или Goglang.

Dash

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

Foobar

Очень простая песочница для быстрого тестирования кода с поддержкой различных языков программирования для Mac.

Список поддерживаемых языков: Apple Script, Apple JavaScript, Bash, Shell, PHP, Perl, Python, Ruby, DOM (CoffeeScript, JavaScript, jQuery), HTML, Markdown, Processing.js, WebGL (CoffeeScript, JavaScript), Swift, Objective-C, Go, C/C++, Node.js.

Postico

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

Sequel Pro

Такой-же легкий и простой клиент, но уже для MySQL.

Продолжение следует...

Медленные запросы в PostgreSQL

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

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

SELECT
    pid, client_addr, usename, datname, state, waiting,
    to_char(current_timestamp - state_change, 'SSSS.MS') AS runtime,
    query
FROM
    pg_stat_activity
WHERE
    pid <> pg_backend_pid()
    AND state = 'active'
    AND state_change < current_timestamp - INTERVAL '3' SECOND
ORDER BY
    runtime DESC;

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

-- вычисляет длительность выполнения запроса и форматирует его в простой читаемый вид 1.234 (сек)
    to_char(current_timestamp - state_change, 'SSSS.MS') AS runtime,

-- исключает из выдачи текущий запрос
    pid <> pg_backend_pid()

-- отображает только активные запросы
    AND state = 'active'

-- отображает только запросы которые выполняются более 3-х секунд
    AND state_change < current_timestamp - INTERVAL '3' SECOND

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

track_activity_query_size=16384

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

Отмена или уничтожение запросов

После обнаружения медленного запроса, можно отменить его используя pg_cancel_backend(pid) или уничтожить при помощи pg_terminate_backend(pid).

Пример запроса уничтожающего все запросы зависшие на более чем 1 минуту в указанной БД:

SELECT
    pg_terminate_backend(pid)
FROM
    pg_stat_activity
WHERE
    pid <> pg_backend_pid()
    AND datname = 'ИМЯ_ВАШЕЙ_БД'
    AND state = 'idle'
    AND state_change < current_timestamp - INTERVAL '1' MINUTE;

Успешного обнаружения!

PythonTree

Сегодня, я читал статьи про деревья в БД и случайно в картинках наткнулся на изображение красиво отображающее в консоли иерархическое дерево директории:

В этот момент, мной овалдело непреодолимое желание написать свою версию на Python.

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

── TestFolder
   ├─── go
   │    └ image-resizer
   │      ├── handlers.go
   │      └── image_server.go
   │
   └─── scripts
        ├── configure_elasticsearch.py
        ├── email_resend.py
        └── image_upload.py

В терминале:

Интересный факт, благодаря использованию os.walk() основная функция получилась НЕ рекурсивной и формирует дерево в один проход.

Первая версия уже умеет:

  1. отображать дерево красивыми Unicode символами — про это читал здесь
  2. добавляет пустое пространство после последнего файла в директории (spacing_after_last_file=True)
  3. подсвечивать цветом имена файлов, диретории и линии ( colors=True ) — читал тут
  4. отображать дерево в компактном виде ( compact=True )

Планы на будущие версии:

  1. оформить в виде полноценного модуля
  2. добавить возможность отображать стандартными символами ( ` — | )

На неделе, найду время и более подробно опишу процесс здесь.

Ссылка на репозиторий: PythonTree на GitHub

Hello, world!

Bash

echo "Hello, world!"

Basic

PRINT "Hello, world!"​

CoffeeScript

console.log "Hello, world!"

Go

package main
import "fmt"
func main() {
    fmt.Println("Hello, world!")
}

JavaScript

console.log("Hello, world!");

PHP

<?php echo 'Hello, world!'; ?>

Python

print("Hello, world!")

Ruby

puts "Hello, world!"

SQL

SELECT 'Hello, world!';