Не понимаю айтишников, которые приезжают куда-то на пляж и лежат там весь отпуск или бухают. Ладно если б ты был физически измотанный грузчик, но ты ж блин выгоревший айтишник который сидит 80% времени жопой в стуле.
Я обычно езжу куда-то в горы, беру с собой вел и спускаю какие-то ендуро трассы. Иногда хожу в походы. Это ваще очень сильно перезагружает. Море как-то совсем не то, хотя 20 лет своей жизни жил у моря, и даже ходил на судне через океаны.
А так, если бы было можно ездить без ограничений, которые сейчас из-за ковида, я б наверное слетал куда-то в Бразилию. Был там два раза, мега круто. Либо в Непал.
Рутина, иными словами. Но, такое везде есть. Причем, существенная, наверное часть. "+/- " есть у всех языков, тут только вздохнуть: "такова селяви".
Не, рутина есть везде, но в разных языках есть разные инструменты для её решения. В Go из-за отсутствия дженериков нет нормального способа для работы с коллекциями данных (filter, map).
Например есть условные логи, и нужно получить топ 2 самых популярных айпи.
Тут сама структура и данные.
struct LogRecord { ip: String, user: String,}let log = vec![ LogRecord::new("1.2.3.4", "John"), LogRecord::new("0xc00lhack3r", "Mike"), // bad ip, will be filtered out LogRecord::new("1.2.3.4", "John"), LogRecord::new("4.5.6.7", "Hacker"), LogRecord::new("1.2.3.4", "John"), LogRecord::new("8.9.10.11", "Alice"),];
А тут сама логика.
// тут начинается магияlet hits: Vec<_> = log .iter() // получаем итератор .sorted_unstable_by_key(|&v| &v.ip) // сортируем для дедупликации .filter_map(|v| IpAddr::from_str(&v.ip).ok()) // выковыриваем из LogRecord только IP, и только те что парсятся .dedup_with_count() // дедуплицируем данные со счетчиком .sorted_unstable_by_key(|v| -(v.0 as i32)) // сортируем, те что чаще - выше .take(2) // берем два верхних .collect(); // собираем в массив// на выходе массив из двух айпишников и количество хитовfor (count, ip) in hits { println!("{} => {}", ip, count)}
На го такой код даже лень писать, ибо я уже проходил это, знаю примерно сколько символов на это уйдет. Но можешь попробовать, задачки ради)
Да и за последнее время как-то начал ценить языки, которые собираясь в конечный артефакт имеют меньше всего шансов упасть в рантайме.
У меня хелловорлд проще
ListenAndServe всегда возвращает non-nil ошибку, поэтому лучше заменить на log.Print. log.Fatal - это по сути вызов os.Exit после записи в лог, поэтому если в функции есть какие-то defer функции (например, закрытие коннектов к базе, и т.д.), то они не выполнятся.
Почему?
Потому что язык по сути слишком прост, и когда доходишь до решения какой-то задачи, то большая часть кода начинает становиться слишком императивной. У меня наверное уже с 20 проектов на нем написано, суммарно строк кода наверное перевалило за 400k (хотя я не считал, может привираю), один из проектов держит 2млн/рпс. Язык без дженериков (обещают завести), без тайп-сум, с не очень удачной обработкой ошибок (но на порядок лучше чем эксепшены). Конечно, пока пишешь хело ворлды или байтики по сети гонять, то это все быстро и просто, а когда проект разрастается, то начинаешь тянуть кучу бойлерплейта из проекта в проект.
Уж лучше тогда hey
Порт менять необязательно - оставляете только авторизацию по ключу и настраиваете (в свежей версии !) fail2ban так называемый "прогрессивный" бан (с каждой попытки с одного IP время бана растёт в геометрической прогрессии).
У меня так сейчас:
Какой смысл от fail2ban для защиты ssh в случае аутентификации по ключу? Забивать таблицу нетфильтра айпи адресами бот ферм? Пусть долбятся себе, все равно безуспешно.
Я обычно меняю порт и если слишком параною, то knockd со списком портов для простукивания, прежде чем откроется доступ для конкретного айпи на порт ссш.
Как правило, потребление памяти и скорость работы - это как две чаши весов. Если что-то жрет меньше, то скорее всего оно будет медлительнее. В случае с gentoo, там почти все собирается ручками, из-за этого система получается более легкая. Плюс, можно подергать ручки при компиляции, оптимизировав под конкретное железо (нужно знать какие дергать, с пониманием, собрать с -O9 не получится). Но сомневаюсь что на 25%, скорее 3-5%.
Тех же результатов можно достичь, например, собрав PHP с jemalloc или tcmalloc аллокатором.
ebpf, auditctl, watch netstat -pt
А я уже свой хелло ворлд посмотрел🤣. Работает.
Там осваивается за месяц. Первый год пишешь - кайфуешь, а потом начинаешь плакать.
Я питончик уже давно хочу выучить, но времени никак нет, да и в свой стек я его никак не воткну. Выучить хочу чисто чтобы писать всяких ботов в телеге и скрипты-однодневки под свои нужды.