ПиксельСинтез
Самобытно про разработку, devops, linux, скрипты, тестирование, сисадминство, техдирство, пиэмство и за айтишную жизу.
Ko'proq ko'rsatish1 953
Obunachilar
-824 soatlar
-1177 kunlar
-1 31130 kunlar
- Kanalning o'sishi
- Post qamrovi
- ER - jalb qilish nisbati
Ma'lumot yuklanmoqda...
Obunachilar o'sish tezligi
Ma'lumot yuklanmoqda...
ДА или НЕТ? Давай разберемся!
Запускай:
cd /tmp
touch bashdays.txt
rm -i bashdays.txt
Получаем интерактивный запрос:
rm: remove regular empty file 'test.txt'?Выбор зависит от потребности. Либо да, либо нет. Но что вводить? Очевидно же — y или n. Справедливо. Но что если… Запускаем:
locale -k noexpr yesexprВыхлоп:
noexpr="^[-0nNНн]" yesexpr="^[+1yYДд]"Это все возможные варианты, которыми ты можешь воспользоваться. Если вместо «y» ты введешь знак «+» — файл удалится. Аналогично можно ввести 0 или 1. Либо «Д» или «Н». Не везде из коробки прописаны такие регулярки, например на англоязычной убунте хуй с маслом.
noexpr="^[nN]" yesexpr="^[yY]"Функция оценивающая ответ пользователя, учитывает локализацию. ㅤ Для подтверждения, или отмены может быть использован любой символ в квадратных скобках из вывода вышеприведённой команды. А любой символ не совпадающий с символами из набора
yesexpr
будет равносилен отмене, в том числе и пустой ввод.
Как на это можно повлиять?
Всё это забиндино в файлах которые лежат в папке: /usr/share/i18n/locales
Например, в файле ru_RU есть такое:
LC_MESSAGES yesexpr "^[+1yY<U0414><U0434>]" noexpr "^[-0nN<U041D><U043D>]" yesstr "<U0434><U0430>" nostr "<U043D><U0435><U0442>" END LC_MESSAGESТут присутствует как раз «0» и «1» / «+» и «-». Если хочется упороться, можешь собрать свою локаль и добавить свои символы в регулярку:
cp /usr/share/i18n/locales/ru_RU ~/my_ru_RU
localedef -f UTF-8 -i ~/my_ru_RU ru_RU.UTF-8
После первой команды, нужно отредактировать файл ~/my_ru_RU
и затем запускать вторую команду.
Такие вот перлы и приколы. Изучай.
👉 Многие этого ждали, завтра закину анонс про личное наставничество и обучение в рамках проекта Linux Factory.
tags: #linux
—
🔔Photo unavailableShow in Telegram
Всем привет!
14 июля Selectel организует атмосферный летний ИТ-фестиваль Selectel Day Off🔥
О чем?
Тема мероприятия — ностальгия по будущему🤪
Выступят спикеры из Циана, Realiste, Сбера, Альфа-Банка, Яндекса 360, SETTERS EDUCATION и МГУ.
Темы докладов:
— Платформы данных и как они будут развиваться в будущем.Обсудим эволюцию паттернов в обработке данных, тренды в индустрии и то, как платформа данных устроена в Циане.
— Квантовые вычисления. Обсудим экспериментальный прогресс в области создания квантовых процессоров, а также порассуждаем о потенциале их применения в задачах ИИ.
— ИИ-разработки в недвижимости. Рассмотрим, какие есть проблемы у самого большого рынка в мире по объему активов и как они решаются с помощью ИИ.
— Креативность решений от нейросетей. Вы узнаете, какие задачи типичного сотрудника сможет взять на себя ИИ. Обсудим, будут ли нейросети помогать закрывать задачи, связанные с креативными решениями.
— Поговорим про технические сообщества и многое другое.
А еще в рамках фестиваля в...
С утра успешно победил всех антагонистов и теперь самое время сделать что-то полезное.
Сегодня разбираем проблемный Bash скрипт.
#!/bin/bash
i=0
for name in `ls *.txt`
do
i=$[i+1]
mv $name `printf "%02d" $i`.txt
done
А проблема заключается в том, что скрипт удаляет файлы, которые содержат в именах цифры.
За качество скрипта тереть не будем. Нам нужно задебажить проблему, ведь явных команд на удаление в этом скрипте — нет.
Для начала, давай создадим вводные, чтобы было с чем работать.
mkdir /tmp/test
cd /tmp/test
touch {001..003}.txt {01..03}.txt
Так, создали 6 файлов с разными именами:
01.txt 02.txt 03.txt 001.txt 002.txt 003.txtМодифицируем проблемный скрипт, чтобы он выводил строку с командой
mv
перед её выполнением:
#!/bin/bash
i=0
for name in `ls *.txt`
do
i=$[i+1]
echo 'DEBUG: mv' $name `printf "%02d" $i`.txt
mv $name `printf "%02d" $i`.txt
done
exit 0
Запускаем и получаем красивое:
DEBUG: mv 001.txt 01.txt
DEBUG: mv 002.txt 02.txt
DEBUG: mv 003.txt 03.txt
DEBUG: mv 01.txt 04.txt
DEBUG: mv 02.txt 05.txt
DEBUG: mv 03.txt 06.txt
Смотрим что у нас осталось, хуяк и вместо 6 файлов, у нас осталось всего лишь 3 штук.
ls 04.txt 05.txt 06.txtКуда блядь делось остальное? Вокруг да около ходить не будем. Дело в том, что в одном каталоге не может быть двух файлов с одинаковым названием. Очевидно? Да! Как работает
mv
:
mv <старое имя> <новое имя>
Если <новое имя> это существующее имя файла, тогда оно будет удалено, а <старое имя> получит имя <новое имя>.
ㅤ
Если взять нашу ситуацию, то произошло следующее:
1. DEBUG: mv 001.txt 01.txt 2. DEBUG: mv 002.txt 02.txt 3. DEBUG: mv 003.txt 03.txt 4. DEBUG: mv 01.txt 04.txt 5. DEBUG: mv 02.txt 05.txt 6. DEBUG: mv 03.txt 06.txt1. Удалено 01.txt. и 001.txt -> 01.txt 2. Удалено 02.txt. и 002.txt -> 02.txt 3. Удалено 03.txt. и 003.txt -> 03.txt ✔ Итого потеряли 3 файла, печаль. Теперь давай более наглядно. Удаляем подопытные файлы и создаем новые. Плюс запишем в каждый файл его имя.
for i in {001..003}.txt {01..03}.txt; do echo $i > $i;done
Получилось 6 файлов, в каждом файле содержится имя самого файла.
Смотрим что получилось:
ls -la
8 Jul 10 08:05 001.txt
8 Jul 10 08:05 002.txt
8 Jul 10 08:05 003.txt
7 Jul 10 08:05 01.txt
7 Jul 10 08:05 02.txt
7 Jul 10 08:05 03.txt
Снова модифицируем скрипт и задаем опцию -b
для утилиты mv
. Теперь для существующего файла будет создаваться резервная копия. Бекап ёпта!
#!/bin/bash
i=0
for name in `ls *.txt`
do
i=$[i+1]
echo 'DEBUG: mv' $name `printf "%02d" $i`.txt
mv -b $name `printf "%02d" $i`.txt
done
exit 0
Выполняем скрипт и смотрим что у нас осталось от файлов.
ls -la
7 Jul 10 08:05 01.txt~
7 Jul 10 08:05 02.txt~
7 Jul 10 08:05 03.txt~
8 Jul 10 08:05 04.txt
8 Jul 10 08:05 05.txt
8 Jul 10 08:05 06.txt
Теперь смотрим содержимое самих файлов и преисполняемся.
По итогу, если нужно пронумеровать файлы, позаботься об уникальности имён и заранее протестируй на тестовых данных. Чтобы случайно к херам не снести все ассетсы с продакшена.
Ну и всегда обрабатывай исключения если файл уже существует, чтобы не остаться без штанов.
Изучай, всего тебе самого наилучшего!
tags: #linux #bash
—
🔔Photo unavailableShow in Telegram
😱 👉 Важное событие для всех, кто хочет повысить производительность своих серверов!
🔆 Присоединяйтесь к открытому уроку «Оптимизация Nginx и Angie под высокие нагрузки»
На занятии вы:
- поймёте, какие параметры влияют на производительность;
- научитесь оптимизировать серверную часть;
- узнаете, как работать с клиентской производительностью.
🏆 Спикер Николай Лавлинский — технический директор в Метод Лаб, PhD Economic Science, опытный руководитель разработки и преподаватель.
👉 Регистрируйтесь для участия: https://vk.cc/cygpJS
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
И снова здравствуйте. Давай сегодня немного в кишках покопаемся.
Запускаем бессмысленную команду:
dd if=/dev/zero of=/dev/null status=progress
И наблюдаем как строка статистики постоянно меняется.
В простонародье — рефрешится.
4254480896 bytes (4.3 GB, 4.0 GiB) copied, 4.77966 s, 890 MB/sБесполезная? Ну не скажи, с её помощью можно протестировать скорость чтения и записи. ㅤ Эта команда копирует блоками нули из спец-файла в другой. Записывая статистику на стандартный вывод ошибок stderr. Строка статистики постоянно меняется. Но как dd это делает? Давай разберемся ниже. Запускаем страшную кишку и немного ждем
dd if=/dev/zero of=/dev/null status=progress |& { read -t 4; echo "${REPLY}"; }
По итогу получаем, что-то подобное:
$'\r927888896 bytes (928 MB, 885 MiB) copied, 1 s, 928 MB/s\r1851585024 bytes (1.9 GB, 1.7 GiB) copied, 2 s, 926 MB/s\r2749514752 bytes (2.7 GB, 2.6 GiB) copied, 3 s, 917 MB/s'Портянка с read означает — ждем 4 секунды, считываем первую строчку ввода и сохраняем ее в переменную REPLY, а далее выводим содержимое переменной на экран. ✔ Не так уж и страшно, правда? Ааа, херовина
|&
нужна, чтобы объединить stdout и stderr и затем направить его в read.
Ну дак вот.
Получается утилита dd, пишет статистику за секунду в стандартный поток ошибок и затем суёт символ «\r»
.
Который означает - возврат каретки.
Вот и вся магия.
Делаем хак, чтобы избавиться от возврата каретки:
dd if=/dev/zero of=/dev/null status=progress |& tr '\r' '\n'
Теперь статистика выводится в столбик:
1836032000 copied, 2 s, 918 MB/s 2793336832 copied, 3 s, 931 MB/s 3726170624 copied, 4 s, 932 MB/s 4655933440 copied, 5 s, 931 MB/sНагляднее? Конечно! Что с этим можно сделать? Ну например протестировать скорость чтения и записи, используя разный размер буферов. Херачим Bash скрипт:
#!/bin/bash
for i in {9..20}
do
bs=$((2**i))
dd bs="$bs" if=/dev/zero of=/dev/null status=progress |& {
mapfile -d$'\r' -n 2; printf '%-8s : %s\n' "$bs" "${MAPFILE[1]}"; }
done
exit
Запускаем и получаем:
512 : 878647296 copied, 1 s, 879 MB/s 1024 : 1618295808 copied, 1 s, 1.6 GB/s 2048 : 3096260608 copied, 1 s, 3.1 GB/s 4096 : 5056294912 copied, 1 s, 5.1 GB/s 8192 : 8047247360 copied, 1 s, 8.0 GB/sКруто? Да охуеть! Ну а если нужна статистика за пять секунд. Делаем 5+1 к количеству записей и индексу массива. Массив начинается с нуля. Но можешь это изменить с помощью опции -O.
#!/bin/bash
for i in {9..20}
do
bs=$((2**i))
dd bs="$bs" if=/dev/zero of=/dev/null status=progress |& {
mapfile -d$'\r' -n 6; printf '%-8s : %s\n' "$bs" "${MAPFILE[5]}"; }
done
exit
По итогу имеем статистику за 5 секунд:
512 : 4667945472 copied, 5 s, 934 MB/s 1024 : 8693190656 copied, 5 s, 1.7 GB/s 2048 : 15988561920 copied, 5 s, 3.2 GB/s 4096 : 27510878208 copied, 5 s, 5.5 GB/s 8192 : 39937343488 copied, 5 s, 8.0 GB/sВот такие пироги. Теперь можешь тестировать VPSки и писать статью на хабру с бенчмарками. Давай, увидимся завтра! tags: #linux #bash — 🔔
00:04
Video unavailableShow in Telegram
Как стать DevOps-инженером за 4 месяца? 🐳 Об этом расскажут аж на 2-х бесплатных уроках от Merion Academy!
Забирай целый набор из бесплатных полезностей:
📍2 бесплатных урока, где расскажут, кто такой DevOps-инженер, какие инструменты использует, куда и как развивает карьеру, познакомят с Docker и контейнирезацией.
📍 В дополнение бесплатный интенсив по развитию карьеры, где HR-эксперты расскажут лайфхаки, как создавать сильные резюме и проходить собеседования, так, чтобы вас взяли на работу.
📍Гайд по командам Docker и Курс по английскому для IT.
👉 Регистрируйтесь по ссылке чтобы забирать бесплатные уроки, интенсив по карьере и гайд.
Что еще важно знать:
1. У ребят одна из самых доступных цен, которая в 4-5 раз ниже, чем в других известных школах, но качество обучения на том же уровне. Это достигается за счет того, что в Мерионе не тратят миллионы на продвижение, а рекламируются только на собственных ресурсах и в тематических телеграм-каналах. Кроме этого у них также отсутствуют расходы на младших ме...
!!!DevOps.mp43.98 KB
Так, самое время подвести итоги с картами «Релиз».
Больше всего реакций набрал комментарий Алексея Агафонова (supmea), по итогу 39 огоньков.
Привести в порядок всё, чтоб не стыдно перед последователями было. А доступы и так оставят и почту. Ещё и докучают что-либо сделать. А мы идём на большие деньги смотреть как у других всё сделано не так как нужноНа втором месте Александр Смирнов (wddingo) с 38 лайками за комментарий:
Самое гадкое, что можно было им сделать - я сделал, я ушел с этой работы. Пусть теперь сами с этим говном разбираются. А пакостить - это считаю слишком мелочнымНу и третье место занял Максим (Rosssich), набрав 30 респектов за комментарий:
а вообще - ключевое слово "не заплатили". поэтому заявление в трудовую инспекцию, суд и т.д. там можно урона нанести больше чем от всяких там chaosmonkey )На этой неделе к вам придет Макс и узнает куда засылать призы. Ждите. Нюансы. На руках у меня всего одна колода, она отправится в приоритете Алексею, остальные две вышлем в ближайшее время, как получим их от организатора. Ну либо закинем рублей на карту, чтобы вы самостоятельно заказали их через Авито и не парились на почте. Всем спасибо за участие, вы все лучшие!
Photo unavailableShow in Telegram
🎲 Высокая доступность в Kubernetes: бесплатный вебинар
Привет! Мы — команда Слёрма, учебный центр для айти-специалистов middle+ и фанаты k8s.😎
11 июля в 18:00 мы приглашаем вас на вебинар «Высокая доступность в Kubernetes: пробы, реквесты/лимиты, HPA».
На встрече обсудим:
❓ Можно ли не делать рединесс пробы и лить трафик сразу на сервер?
❓ Что будет, если выставить неправильные пробы?
И еще много интересного!
Спикеры:
➡️ Кирилл Борисов, SRE Lead в MTS Digital
➡️ Всеволод Севостьянов, Staff engineer в Lokalise
➡️ Дмитрий Будаков, Системный инженер в интеграторе
Зарегистрироваться на вебинар можно с помощью нашего бота-помощника. Подключайтесь!
🔗 ХОЧУ НА ВЕБИНАР
Реклама ООО «Слёрм» ИНН 3652901451 erid: 2Vtzqummakq
Ёхохо. Не пить алкашку по выходным конечно круто, по итогу все это время компенсируешь работой. Продуктивность зашкаливает. НО, скучно пиздец!
Поэтому приходится отвлекаться игрульками. Гоняя Зельду, невольно задумался, а квесты то очень похожи на алгоритмы в программировании. Порой что аж жопа горит. И их можно давать на собеседованиях. Без знания паттернов хер чо пройдешь.
Ладно, теперь по теме: Реврайтим CTRL+C.
Как прерывать запущенные программы и скрипты тут каждый знает. А как работает изнутри
CTRL+C
я напишу в следующих постах.
ㅤ
Сегодня что-то вроде на изи потыкать. Понедельник как-никак.
Где применяется реврайт CTRL+C
? Да практически нигде, но то, что его можно зареврайтить это факт.
✔ А вообще причины для реврайта разные:
- Избежание конфликтов с программным обеспечением
- Удобство и предпочтения пользователя
- Специальные рабочие процессы
- Случайные нажатия
- Ограниченные возможности клавиатуры
- и т.п.
Давай теперь на практике.
Смотрим дефолтное сочетание
stty -a
stty - утилита, которая настраивает параметры терминала.Получаем портянку вида:
speed 38400 baud; rows 57; columns 237; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0; -parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8 opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extprocСмотрим параметр intr, он и указывает на сочетание, которое будет слать SIGINT. По умолчанию как видим оно =
CTRL+C
.
Давай теперь поменяем эту штуку:
stty intr ^KТеперь запускаем для теста
sleep 1000
и пробуем нажать CTRL+C
. Опа и нихуя не происходит.
Поздравляю, реврайт прошел успешно. А теперь нажми CTRL+K
и sleep
завершится. Клёва? Клёва!
Можешь теперь издеваться над коллегами и ломать им рабочие процессы.
Чтобы сохранить эти настройки, выполняем:
echo 'stty intr ^K' >> ~/.bashrc
Ну либо в .zshrc, тут уже сам смотри где у тебя первоначальные настройки валяются.
А можно сделать CTRL+ALT+K ?
Через stty увы такое провернуть не получится.
Но используя xbindkeys такое возможно.
vim ~/.xbindkeysrc
и добавить туда:
"pkill -SIGINT -f ."
Control+Alt + k
Но xbindkeys со своими подводными камнями, оно для Иксов. А если у тебя Wayland то смотри в сторону sway или gnome-keybinding.
Такие дела. Ладно, пошли дальше мир спасать. Хорошего понедельника!
tags: #linux
—
🔔Тут персонаж один пристал, говорит что у него в Java есть какой-то «мусожор», а вот в Bash такого нет и поэтому от наших скриптов одни проблемы.
Термин «Мусожор» видимо профессиональный и является пресловутым «Garbage Collector».
ㅤ
К Java я отношусь ровно, оно меня не трогает и я его тоже.
Как говорится — Одно гавно другому не равно. Поэтому хуисосить не буду.
Давай проведем эксперимент:
1. ps -o rss -p $$ 2. var=$(printf "%s\n" {1..100000}) 3. ps -o rss -p $$ 4. var="bashdays" 5. ps -o rss -p $$В первой строчке выводится количество физической памяти в килобайтах, используемой текущим процессом оболочки. У меня выдало 4348. Во второй строчке записываем в переменную
var
содержимое от 1-100000 с переносом на новую строку.
В третьей строчке снова выводим количество физической памяти, у меня 5276.
Ага, оно стало больше. Было 4348 стало 5276.
В четвертой строчке, перезаписываем var
на строку «bashdays» и снова проверяем память.
На этот раз пятая строчка вновь показывает: 4348.
Что и требовалось доказать. Использование памяти увеличивается, а затем снова уменьшается.
Все манипуляции с памятью выполняются на уровне Linux ядра. И нет никакой необходимости рвать жопу и греть голову.
Bash не работает с памятью и объектами, так же как обычные языки программирования.
tags: #bash
—
🔔Boshqa reja tanlang
Joriy rejangiz faqat 5 ta kanal uchun analitika imkoniyatini beradi. Ko'proq olish uchun, iltimos, boshqa reja tanlang.