# Resize the file system in UI, under VM -> Hardware -> Click on the disk to resize, click "Resize disk" button
# Confirm increase in disk space (1TB in my case)
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 1T 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 1T 0 part| # Tutorial: https://blog.creekorful.com/2020/01/how-to-expose-traefik-2-dashboard-securely-docker-swarm/ | |
| version: '3' | |
| services: | |
| reverse-proxy: | |
| image: traefik:2.3 | |
| command: | |
| # - '--log.level=DEBUG' | |
| - '--api=true' | |
| - '--api.dashboard=true' |
| from django.contrib.admin import ModelAdmin | |
| from .paginator import LargeTablePaginator | |
| class MyTableAdmin(ModelAdmin): | |
| ... | |
| paginator = LargeTablePaginator | |
| show_full_result_count = False # Recommended to avoid another count() | |
| ... |
| # @ https://cheat.readthedocs.io/en/latest/python/mock.html | |
| obj.call_count # number of times it was called | |
| obj.called == obj.call_count > 0 | |
| obj.call_args_list # a list of (args,kwargs), one for each call | |
| obj.call_args # obj.call_args_list[-1] (args,kwargs from last call) | |
| obj.return_value # set to what it should return | |
| obj.side_effect # set to an exception class or instance that should be raised when its called | |
| obj.assert_called() # doesn't work with autospec=True? just assert obj.called | |
| obj.assert_called_with(*args, **kwargs) # last call was with (*args, **kwargs) |
| # test as follows: | |
| # 1. start logstash: | |
| # logstash -f ~/logstash.conf --config.reload.automatic | |
| # 2. send it data: | |
| # echo '{"container": "/spiff", "bleh": "blah"}' | nc localhost 6060 | |
| input { | |
| tcp { |
| FROM ubuntu:16.04 as base | |
| USER root | |
| ## Setting default environment variables | |
| ENV WEB_ROOT=/web_root | |
| # Root project folder | |
| ENV ARCHES_ROOT=${WEB_ROOT}/arches | |
| ENV WHEELS=/wheels | |
| ENV PYTHONUNBUFFERED=1 |
| """ | |
| Usage example: | |
| from logger import get_logger | |
| log = get_logger() | |
| log.info('my_event', my_key1='val 1', my_key2=5, my_key3=[1, 2, 3], my_key4={'a': 1, 'b': 2}) | |
| List of metadata keys in each log message: | |
| event | |
| _func |
| from typing import Optional | |
| import base64 | |
| from passlib.context import CryptContext | |
| from datetime import datetime, timedelta | |
| import jwt | |
| from jwt import PyJWTError | |
| from pydantic import BaseModel |
Репозиторий - это слой абстракции, инкапсулирующий в себе всё, что относится к способу хранения данных. Назначение: Разделение бизнес-логики от деталей реализации слоя доступа к данным.
Паттерн Репозиторий стал популярным благодаря DDD (Domain Driven Design). В противоположность к Database Driven Design в DDD разработка начинается с проектирования бизнес логики, принимая во внимание только особенности предметной области и игнорируя все, что связано с особенностями базы данных или других способов хранения данных. Способ хранения бизнес объектов реализуется во вторую очередь.
Применение данного паттерна не предполагает создание только одного объекта репозитория во всем приложении. Хорошей практикой считается создание отдельных репозиториев для каждого бизнес-объекта или контекста, например: OrdersRepository, UsersRepository, AdminRepository.
The set lines
- These lines deliberately cause your script to fail. Wait, what? Believe me, this is a good thing.
- With these settings, certain common errors will cause the script to immediately fail, explicitly and loudly. Otherwise, you can get hidden bugs that are discovered only when they blow up in production.
set -euxo pipefailis short for:
set -e
set -u