Tags: tips

nyaload

bash: kill service on port

updated: от blog.vnaum.com:
Эдакие сложности.
Так проще и надёжнее:
fuser -n tcp [port number] -k


netstat -lntp | grep -E '^tcp +[^ ]+ +[^ ]+ +[^ ]+:2013 ' | awk '{print $7}' | grep '^[0-9]\+' -o | xargs -r kill

netstat -lntp - listening, numeric output, TCP, show processes
xargs, флаг -r ... - не звать аргумент, если stdin пустой.

находим в выводе pid процесса, и грохаем его. А то повадились матчить имена процесса по строкам в ps и grep -v grep. Вот не повезло пользователю с ником grepulya!
nyaload

how to manage data files

http://software-carpentry.org/4_0/data/mgmt/ - советы как хранить огромные бинарники в файловой системе. Разные их версии, и не запутаться во всём этом через полтора года. Нет, это не разработчиков игр, не про миллион взаимосвязанных анимаций с моделями с видеороликами лапками тысячи китайцев. А про файлы с простой организацией, но зато которых появляется по терабайту в день.

В названии файла или в пути до него - должна быть дата создания файла.

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

info-файл может быть скриптом или конфигом для скрипта.

Бэкапьте.

nyaload

save me

Есть хорошая тулза для сохранения ЖЖ, http://sourceforge.net/projects/ljarchive/
Автор похоже её забросил, но она простая и клёвая. Скачивает шустро, быстро ищет по постам, можно экспортировать в читабельный XML.

В ней была бага, не дающая скачивать комментарии, со странной XML-ошибкой. Стороние люди поправили, можно забрать здесь - http://www.acidqueen.de/lja/LJa.html
nyaload

bash: save command line

Давно в bash мучался с тем, как сконструированную в cmd-line команду сохранить в .sh файл. Для простых команд работает echo, для сложных уже нет, из-за кавычек и прочего. Раньше выцеплял такое из ~/.history

bash: Ctrl+X+E - отредактировать/сохранить строку под курсором в текстовом редакторе $EDITOR , там же можно и сохранить.
nyaload

Выравнивание кода

Сижу, читаю код.

Увидел кусок:
python filter.py -p filter2.txt -m 1 -f 3 -F $F -L filter |
python filter.py -p filter2.nokb.other.txt -m 2 -f 3 -F $F -L filter |
python filter.py -p filter.txt -m 3 -f 3 -F $F -L filter_txt |
python filter.py -p filter3.txt -m 4 -f 1 -F $F -L filter_txt_except


Решил чиста из чувства эстетики выровнять его:
python filter.py -p filter2.txt            -m 1 -f 3 -F $F -L filter |
python filter.py -p filter2.nokb.other.txt -m 2 -f 3 -F $F -L filter |
python filter.py -p filter.txt             -m 3 -f 3 -F $F -L filter_txt |
python filter.py -p filter3.txt            -m 4 -f 1 -F $F -L filter_txt_except


Сразу бросилась в глаза хрень.

Капитан очевидность рекомендует: выравнивайте код!
nyaload

log4shell

Если программа пишет лог в stdout/stderr, то можно к каждой строчке лога добавить время/дату не меняя программу:

программа 2>&1 | while read -r line; do echo "$(date '+%F %T'): $line"; done

2>&1 - приклеивает stderr к stdout
date '+%F %T' - распечатывает время

И в простых случаях - можно не использовать энтерпрайзные Логгеры-Форматтеры-Аппендеры-Корпоративную-Культуру-Совещания-Тимбилдинг-Скрам только для добавления времени (grep может фильтровать ERROR/INFO/DEBUG, команда tee может распечатать фильтры в несколько разных файлов).

Могут быть грабли с буферизацией, я в своём случае не наткнулся.

Помню молодого человека, доказывающего мне что в python-скриптах надо обязательно использовать модуль logging (аналог log4j), а пайп считающего страшным извращением. Вопросы "а что если подпроцесс моего скрипта не использует мою библиотеку логгинга" игнорировал :)

PS. спасибо gegmopo4 за более простой/быстрый/корректный вариант форматирования даты.
nyaload

Как делать графики в питоне

Для графиков я использую matplotlib

Когда мне нужна какая-то фича, но я не знаю какую функцию с какими параметрами позвать - то иду на http://matplotlib.sourceforge.net/gallery.html и копипащу оттуда код (по клику на картинке).

Вот тут есть туториалы на русском языке:
часть 1 http://koldunov.net/?p=275 ,
часть 2 http://koldunov.net/?p=290

Простой пример (без numpy, с обычными списками)-


import matplotlib.pyplot as plt
import math

xs = xrange(1000)
ys = [math.sin(x/50.0) for x in xs]
plt.plot(xs, ys)
plt.show()

nyaload

Кусочек голограммы. Обработка логов.

Закон больших чисел - какое-то волшебство.

Взять две московские школы - в обоих будет 2% Александров и 2% Маш, плюс-минус несколько человек. Хотя школы разные! Что бы узнать сотношение мнений толпы людей - достаточно опросить случайную сотню из толпы. Причем сотни будут каждый раз разные, а пропорции мнений - одинаковые!

При обработке логов - не обязательно использовать мега-кластер что бы обработать логи. Достаточно взять случайную выборку в 1млн элементов, и все события которые происходят хотя бы раз на тысячу - там будут. Можно с точностью до долей процентов получить разбиение на типы событий. Если интересует бинарный признак, можно вообще только 100 записей выдернуть.

Случайная выборка - очень мощный инструмент в обработке данных. Можно взять кусочек голограммы, и в ней будет полное изображение, только более размытое. Что бы посчитать количество рук и ног - достаточно фотографии человека 20x15 пикселей, а не 1024x768. Точно так же можно взять кусочек логов в 1000, 1млн записей - и часто этого достаточно что бы посчитать нужную статистику. Причем на локальном компьютере, любым скриптом, в любой програме и операционной системе без лагов доступа к общему кластеру. При социологическом опросе страны с населением в сотню миллионов человеков - этот инструмент использутся постоянно, а иначе никак. А вот при обработке данных из логов - почему-то часто обрабатываются целиком все логи, вместо малой части.

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

Рассмотрим два типа логов:
1) события в логах не сгруппированы, одно событие - одна запись:

Выборку можно сделать так: awk 'rand() < 0.0001'

2) события сгруппированы по признаку, и посчитаны, напр.
Маш: 3 штуки
Александров: 2 штуки
Степанов: 1 штука
Зинаид: 1 штука
Алексеев: 1 штука

Из такого лога выборку можно сделать таким скриптом: Collapse )
nyaload

numbers sort, lexicographic order

Лексикографическая("алфавитная") сортировка чисел расставляет их в неправильном порядке:
1000000
20
21
3
3.14159
4

Миллион стоит перед 20 потому что первая цифра 1 меньше 2.

Что бы лексикографическая сортировка для строковых представлений положительных чисел была правильной, можно дописать перед числом достаточно много нулей, напр. 20 нулей (коллега расказал про хак: использовать пробелы вместо нулей).
00000000000000000003
00000000000000000003.14159
00000000000000000004
00000000000000000020
00000000000000000021
00000000000001000000


Придумал ещё способ. Для сохранения зрения и места в файлах - дописать перед числом количество цифр в нем, а не нули. Двумя цифрами, 01, 02, 03, .. 99. Числа с 10-ю цифрами иногда попадаются в измерениях (миллиарды), а с сотней - уже нет.
01|3
01|3.14159
01|4
02|20
02|21
07|1000000


Можно заменить на букву, от а до z, ещё более сжато получается:
b 3
b 3.14159
b 4
c 20
c 21
h 1000000


Ну и оставить от второго числа только нужные значащие цифры, напр. 3.

b3
b314
b4
c2
c21
h1


Что бы не слишком сильно шокировать окружающих, можно писать в виде, похожем на стандартный экспоненциальный:
e06*1.0
e00*3.14
nyaload

Рисуем буквы мышкой ዋኖᕿኞඈሞጭ⦽

Я когда-то кидал ссылку на сайт, на котором можно было найти TEX-символ, нарисовав его мышкой.
Многие пожалели, что нельзя найти просто unicode-символ.
Сейчас такой сайт появился: http://shapecatcher.com/index.html

Единственное что парит, это то что часто мною используемые математические значки - на 5-10 месте после экзотических букв индокитайских народов.



Collapse )