первая задача быстрее/эффективнее решается через cat ... | awk '$8 == 500'
В awk нумерация начинается с 1, а не с 0, поэтому правильно вот так: cat ... | awk '$9 == 500'. Тут мы разобрали много способов решения первой задачи, в том числе и awk.
Что касаемо остального, то могу только сказать, что вы (как истинный любитель Perl) следуете главному девизу TMTOWTDI )))
По умолчанию print ставит перевод строки, поэтому я чуток поправил вот так print(line , end='')
real 0m19,840s
user 0m18,834s
sys 0m1,006s
9728 python ./script.py
9728 python ./script.py
9728 python ./script.py
Работа с базой
У меня ошибка (
Traceback (most recent call last):
File "/home/pasha/src_my/habr_perl_golang/./task2/script.py", line 11, in <module>
print(f"{row['deal_city_id']} {row['ShortName']} {row['FullName']}")
~~~^^^^^^^^^^^^^^^^
TypeError: tuple indices must be integers or slices, not str
Пришлось поправить вывод результата вот так print(row)
real 0m2,338s
user 0m0,061s
sys 0m0,053s
19284 python ./script.py
20308 python ./script.py
Получение информации о сертефикате
real 0m0,475s
user 0m0,054s
sys 0m0,011s
25668 python ./script.py
Тут я прям сильно удивился простоте скрипта. Вы, наверное, не поняли сути задачи, ибо в массиве developers явно находятся не строки, а какие-то структуры, т.к. каждая строка вывода скрипта не является валидным json объектом.
Ну почему же. В данном случае это оправдано, т.к. все развернуто локально и база в том числе, а это значит, что она в момент теста не была нагуржена от слова совсем и замеры проводились несколько раз чтобы прогреть всякие буферы, кеши и прочее.
Соглашусь с вами - это не конкуренты, я этого и не утверждал. Просто мне было интересно, можно ли использовать Golang (не слишком ли он сложен) как сриптовый язык для простых нужд сисадмина. Да, горутины классные, я пробовал, но скажу вам, что для рядового сисадмина горутины почти не нужны, да и на Perl есть куча модулей позволяющих так же элегантно породить (fork) кучу воркеров. Конечно же fork не сравнится с горутинами, но например для опроса кучи сайтов можно использовать не воркеры, а асинхронно это сделать.
И да, для всего нужен свой инструмент и правильный сисадмин умеет его выбирать под задачу )
Я знаю, что так можно, но как раз в этом-то и заключается ключевое отличие. В Perl ты получаешь сразу весь десериализованный json, а в Golang ты должен его описать настолько подробно, насколько тебе надо прежде чем десериализовать. Этот момент понять было сложнее всего.
Это все очень хорошо, ansible и т.п., но в данном конкретном случае имеется: один админ, один сервер, один контейнер на сервере. А вот про systemctl mask спасибо что напомнили, все время упускаю этот момент, а ведь в данном случае это необходимо сделать (как вы правильно сказали - защита от дурака).
Про riak не слышал. Бегло сейчас читанул - нам не подходит, т.к. нам нужен доступ к файлам на файловой системе. Да и файлы у нас разные, от 10kb до 100Mb.
Если перевести нашу схему на 10GBit/s, то мы упремся в диски на srv{1,2}, т.е. в 165. Для двух серверов с томом Replicate сеть в 10GBit/s излишне,а вот для фактора репликации 3 и с быстрыми дисками на серверах это уже вполне годится )
Хорашая мысль, но у нас весь проект в дата-центре и цены там на 10-гигабитную сеть не особо радуют. А вот вариант с объединением сетевух вполне реален с нашим бюджетом.
В awk нумерация начинается с 1, а не с 0, поэтому правильно вот так:
cat ... | awk '$9 == 500'
. Тут мы разобрали много способов решения первой задачи, в том числе и awk.Что касаемо остального, то могу только сказать, что вы (как истинный любитель Perl) следуете главному девизу TMTOWTDI )))
Полностью согласен. Однострочники Perl это вообще отдельная тема и я ее не упомянул лишь потому что в Golang нет онострочников.
По умолчанию print ставит перевод строки, поэтому я чуток поправил вот так
print(line , end='')
У меня ошибка (
Пришлось поправить вывод результата вот так
print(row)
вывод скрипта
Тут я прям сильно удивился простоте скрипта. Вы, наверное, не поняли сути задачи, ибо в массиве developers явно находятся не строки, а какие-то структуры, т.к. каждая строка вывода скрипта не является валидным json объектом.
вывод скрипта
Я access.log не генерил, а взял с рабочего сервера
У меня 500-х кодов 226 строк
Во всех тестах вывод был на терминал, никуда ничего не перенаправлял
уговорили )))
time rg "\s500\s" ./access.log
да, действительно, реактивный какой )
спасибо, за полезный инструмент!
поржал )))))
time grep -E "\s500\s" ./access.log
time awk '$9~500' ./access.log
если что, то в логе вот сколько строк
wc -l ./access.log
ripgrep
- не встречал такого (Ну почему же. В данном случае это оправдано, т.к. все развернуто локально и база в том числе, а это значит, что она в момент теста не была нагуржена от слова совсем и замеры проводились несколько раз чтобы прогреть всякие буферы, кеши и прочее.
Да, так работает быстрее
Но надо сделать оговорку, что в данной регулярке вы отбрасываете все, что идет после кода ответа сервера.
И если захватывать остаток строки вот так
то результат будет другой
Соглашусь с вами - это не конкуренты, я этого и не утверждал. Просто мне было интересно, можно ли использовать Golang (не слишком ли он сложен) как сриптовый язык для простых нужд сисадмина. Да, горутины классные, я пробовал, но скажу вам, что для рядового сисадмина горутины почти не нужны, да и на Perl есть куча модулей позволяющих так же элегантно породить (fork) кучу воркеров. Конечно же fork не сравнится с горутинами, но например для опроса кучи сайтов можно использовать не воркеры, а асинхронно это сделать.
И да, для всего нужен свой инструмент и правильный сисадмин умеет его выбирать под задачу )
Я знаю, что так можно, но как раз в этом-то и заключается ключевое отличие. В Perl ты получаешь сразу весь десериализованный json, а в Golang ты должен его описать настолько подробно, насколько тебе надо прежде чем десериализовать. Этот момент понять было сложнее всего.
И да, у Perl то же есть песочница )
точно, а вы ведь правы
я проверил и Golang отработал быстрее (везде он чуток, но быстрее, елки зеленые :-)), но по памяти проиграл
Кстати, а нет ли у вас желания воспроизвести такие же скрипты на питоне (можно без замеров), чтобы можно было наглядно сравнить?
А я в статье и не призываю никого учить Perl и ничего против питона не имею.
В точку про производительность!
Скорее всего соглашусь с вами
Это все очень хорошо, ansible и т.п., но в данном конкретном случае имеется: один админ, один сервер, один контейнер на сервере. А вот про
systemctl mask
спасибо что напомнили, все время упускаю этот момент, а ведь в данном случае это необходимо сделать (как вы правильно сказали - защита от дурака).Да было конечно. Можно и так сделать, но на мой взгяд, в данном случае удобней сделать отдельный сервис, т.к. изменение в запуске существенные.
Конечно пробовали, вот ситуации который мы тестировали:
тестирование отключения одного из серверов:
Запись не прекращается, когда выключенный сервер возвращается в строй, все файлы синхронизируются
тестирование замены одного из серверов:
Сначала нужно ввести новый сервер в кластер, затем заменить кирпичик (replace-brick) и уже после удалить старый сервер из кластера.
Про riak не слышал. Бегло сейчас читанул - нам не подходит, т.к. нам нужен доступ к файлам на файловой системе. Да и файлы у нас разные, от 10kb до 100Mb.
Если перевести нашу схему на 10GBit/s, то мы упремся в диски на srv{1,2}, т.е. в 165. Для двух серверов с томом Replicate сеть в 10GBit/s излишне,а вот для фактора репликации 3 и с быстрыми дисками на серверах это уже вполне годится )
Хорашая мысль, но у нас весь проект в дата-центре и цены там на 10-гигабитную сеть не особо радуют. А вот вариант с объединением сетевух вполне реален с нашим бюджетом.