Don't wanna be here? Send us removal request.
Text
Создать случайный пароль по regex
Например, пароль только из цифр:
LC_CTYPE=C tr -dc 0-9 < /dev/random | head -c 7 | xargs
При использовании спец. символов их нужно экранировать:
LC_CTYPE=C tr -dc 0-9\!\#\@ < /dev/random | head -c 7 | xargs
0 notes
Text
psql: полезные команды
\c my_database - выбрать БД
\d+ - список таблиц с размером на диске
\d table_name - список колонок указанной таблицы с типами, индексами и ключами
0 notes
Text
pandas: удаление связанных таблиц при перезаписывании
При использовании метода DataFrame.to_sql(if_exists='replace') в PostgreSQL, при наличии у таблицы внешних ключей получим ошибку: sqlalchemy.exc.InternalError: (psycopg2.InternalError) cannot drop table session because other objects depend on it. Чтобы её исправить, можно использовать следующий хак:
from sqlalchemy.schema import DropTable from sqlalchemy.ext.compiler import compiles @compiles(DropTable, "postgresql") def _compile_drop_table(element, compiler, **kwargs): return compiler.visit_drop_table(element) + " CASCADE"
Теперь при генерации запросов DROP TABLE SQLAlchemy будет добавлять CASCADE, что вызовет каскадное удаление всех связанных таблиц.
На мой взгляд, такой подход, хоть он и интересен, стоит использовать только при разработке. Для практических нужд лучше написать SQL-запрос, положить его в SQL-файл и выполнять прямо перед сохранением. Так в программе будет меньше магии, что упростит дальнейшую её поддержку.
0 notes
Text
postgres: получить описание таблицы
psql:
\c my_db \d+ my_table_name
Описание конкретной колонки через SQL:
SELECT DATA_TYPE FROM information_schema.columns WHERE table_name = 'tbl_name' AND COLUMN_NAME = 'col_name'
Constraints:
SELECT * FROM information_schema.table_constraints WHERE table_name = 'my_table'
0 notes
Text
postgresql: добавить пользователя с правами только на чтение
Создаём пользователя:
CREATE ROLE readonly_user password 'readonly_user';
Разрешаем пользователю подключаться к серверу:
ALTER ROLE readonly_user WITH LOGIN;
Выбираем БД, к которой хотим дать доступ:
\c mydb
Даём права на чтение всех таблиц:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_user;
Изменяем права по-умолчанию, чтобы таблицы, созданные в будущем, тоже были доступны для чтения:
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly_user;
Разрешаем пользователю подключиться к БД:
GRANT CONNECT ON DATABASE mydb TO readonly_user;
0 notes
Text
Python: сравнение relativedelta
В текущей версии dateutil (2.6.0) разрешено сравнение двух объектов relativedelta. Кроме того, что это невозможно в принципе (что больше, relativedelta(days=30) или relativedelta(months=1) - зависит от того, какой взять месяц), полученный результат внезапно оказывается неоднозначным:
import dateutil from dateutil.relativedelta import relativedelta from datetime import date next_date = date(2016, 1, 1) birth_date = date(2010, 1, 1) give_before_months = 60 print 'dateutil.__version__', dateutil.__version__ print relativedelta(next_date, birth_date) print relativedelta(months=give_before_months) hren = 0 ok = 0 for i in xrange(10000): if relativedelta(next_date, birth_date) < relativedelta(months=give_before_months): hren += 1 else: ok += 1 print hren, ok print '-' * 10 a = relativedelta(next_date, birth_date) b = relativedelta(months=give_before_months) print a print b hren = 0 ok = 0 for i in xrange(10000): if a < b: hren += 1 else: ok += 1 print hren, ok
Вывод:
dateutil.__version__ 2.6.0 relativedelta(years=+6) relativedelta(years=+5) 5000 5000 ---------- relativedelta(years=+6) relativedelta(years=+5) 0 10000
Вместо этого нужно сравнивать даты:
birth_date + relativedelta(months=give_before_months) > next_date
0 notes
Text
Django: сделать dev-сервер общедоступным
python manage.py runserver ${PUBLIC_ID}:8000
0 notes
Text
Django Admin: reverse action url
reverse(’admin:myappname_myappmodelname_actions’, args=[model_id, action_name])
0 notes
Text
postgres: получить список значений поля, которые не на арабском
select field from my_table where field ~ '[^[\u0600-\u06FF ]]*'
Больше информации о пространствах Unicode для арабского языка
0 notes
Text
python: получить имя файла вызывающего модуля
Для этого можно использовать модуль inspect.
def print_calling_module_name(): frame = inspect.stack()[1] module = inspect.getmodule(frame[0]) print 'Called from module %s (module path: %s)' % ( module.__name__, module.__path__ )
0 notes
Text
bash: значение по-умолчанию для переменной
В примере ниже хотим взять текущую дату если дата не указана:
TARGET_DATE=${TARGET_DATE:-`date --iso-8601`}
0 notes
Text
Немного секретов less
источник
Кроме того, что вместо tail -f можно использовать less +F, оказывается, прямо из less можно открыть файл на редактирование, нажав v.
Небольшое преимущество для хакера: этот вызов не останется в истории команд :)
0 notes
Text
Параллельное выполнение команд в bash
источник
Для параллельного запуска используется &, а команда wait нужна для ожидания завершения:
((sleep 5 && echo "Slow complete") & (sleep 2 && echo "Fast complete") & wait) && echo "Completed"
Запускаем параллельно два "процесса": sleep 5 && echo "Slow complete" и sleep 2 && echo "Fast complete" и ждём. После того, как оба "процесса" завершатся, срабатывает следующая команда (echo "Completed")
0 notes
Text
Удалённое выполнение команды в ssh
источник
Когда нужно выполнить одну команду, просто передаём её параметром:
ssh user@host "ls -lah"
Если необходимо выполнить несколько команд, можно использовать следующий синтаксис:
ssh user@host <<'ENDSSH' # команды для запуска на удалённом хосте ENDSSH
Можно вкладывать команды и выравнивать скрипт для лучшей читаемости
ssh user@host <<-'ENDSSH' # команды для запуска на host ssh user@host2 <<-'END2' # команды для запуска на host2 wall <<-'ENDWALL' Error: Out of cheese ENDWALL ftp [email protected] <<-'ENDFTP' test test ls ENDFTP END2 ENDSSH
Параметр -t - чтобы прерывать удалённую команду при завершении ssh-сессии, на��ример, по ^C.
0 notes