О компьютерной грамотности-2

топ 100 блогов hardsign04.06.2025

Сегодня кого ни почитай — все программы создаются при помощи генеративного ИИ, программисты скоро вообще станут не нужны и всё такое. Но такой подход работает только тогда, когда программа предусматривает абсолютно стандартное взаимодействие. Например, пользователь вводит данные — на экран выводятся остатки и обороты. Или пользователь давит стрелки — фигурка на экране бегает и прыгает.

Скрипт для автоматизации какой-нибудь домашней рутины — это всегда нестандартное взаимодействие. Каждый такой текст из полусотни строчек содержит россыпь жемчужин, которые приходится искать по всему интернету, и которые незаметны постороннему взгляду. Никакой искусственный интеллект никогда в жизни не поймёт, зачем эти странности, и не сможет их воспроизвести.

1. Bash умеет выполнять арифметические действия, но только над целыми числами. Если надо сложить два действительных числа, можно воспользоваться калькулятором bc:

$ A=13.5
$ B=12.7
$ echo $((A+B))
bash: 13.5: ошибка синтаксиса: недопустимый математический оператор (неверный маркер «.5»)
$ echo "${A}+${B}" | bc
26.2

2. Правда, если абсолютное значение результата меньше единицы, bc выдаёт число без ведущего нуля, а некоторые программы (например, ffmpeg) чисел, начинающихся с точки, не понимают. Товарищи со StackOverflow посмотрели исходный код bc и поняли, что заставить не получится. Но зато можно поправить вывод при помощи любого обработчика текста. Например, при помощи sed:

$ echo "1.2-0.5" | bc
.7
$ echo "1.2-1.6" | bc
-.4
$ echo "1.2+3.3" | bc
4.5
$ echo "1.2-0.5" | bc | sed -re "s/^(-?)\./\10./"
0.7
$ echo "1.2-1.6" | bc | sed -re "s/^(-?)\./\10./"
-0.4
$ echo "1.2+3.3" | bc | sed -re "s/^(-?)\./\10./"
4.5

3. Распоряжение «сделай чёрный прямоугольник формата FullHD, убедись, что слайд презентации помещается в прямоугольник 1280×1080, и при необходимости уменьши его, сохранив соотношение сторон, а потом помести этот слайд в левый нижний угол прямоугольника» выражается одной командой:

$ convert \( -size 1920x1080 canvas:black \) \( "${imgfile}" -resize "1280x1080>" \) -gravity SouthWest -composite "${imgfile}.slide.png"

4. ffmpeg очень медленно превращает статическую картинку в видео. Например, на моём пусть и стареньком, но всё же i7 он генерирует около сотни кадров в секунду. Получается, ролик, где в течение десяти минут на экране будет демонстрироваться единственный слайд, генерируется две с половиной минуты:

$ ffmpeg -hide_banner -loglevel error -y -loop 1 -framerate 25 -i slide.png -r 25 -vcodec libx264 -tune stillimage -pix_fmt yuv420p -t ${duration} "slide.mp4"

Гораздо быстрее сгенерировать ролик длиной в одну секунду, а потом размножить его:

$ ffmpeg -hide_banner -loglevel error -y -loop 1 -framerate 25 -i slide.png -r 25 -vcodec libx264 -tune stillimage -pix_fmt yuv420p -t 1 "slide.1.mp4"
$ ffmpeg -hide_banner -loglevel error -y -stream_loop -1 -i "slide.1.mp4" -c copy -t ${duration} "slide.mp4"

5. В bash есть команда mapfile, которая позволяет прочитать файл в массив. Но только файл, а не вывод другой команды. Вот так работает:

$ mapfile -t str $ echo ${#str[@]}
215

А вот так уже нет:

$ jq -r ".slides[].file" index.json | mapfile -t str1
$ echo ${#str1[@]}
0

Причину на каком-то форуме объяснили: команды выполняются в разных процессах, и в случае конвейера заполненный массив остаётся не в том процессе, который нужен (да, Unix — это весело). А чтобы массив оказался там, где нужно, вместо конвейера надо воспользоваться конструкцией «вывод как файл» <(...):

$ mapfile -t str2 < <(jq -r ".slides[].file" index.json)
$ echo ${#str2[@]}
50

Вот такие россыпи в одном маленьком скриптике. А у меня их десятки...

Оставить комментарий

Архив записей в блогах:
Оздоровительная косметика мирра созданная на основе натуральных, природных компонентов отличается безупречным качеством и высокой эффективностью. В состав входят растительные и эфирные масла, экстракты и соки растений, ...
материалы взяты из открытых источников ...
Аяцков, Дмитрий Фёдорович - 15.04.1996 (1.09.1996) - 02.04.2005 Ипатов, Павел Леонидович - 02.04.2005-23.03.2012. И.о. главы региона назначен Валерий Радаев – спикер регионального парламента. Станет ли Радаев ...
Одним из рекомендованных к посещению мест в Звенигороде значится музей "Назад в СССР", мы уже много подобных музеев посетили, но времени свободного было много, а сходить в городе особо и некуда, поэтому решили сходить. Сын в особенности интересуется этим временем. Я родился в 1985 ...
Есть у меня в камрадах очень интересный чел, автор и в чем то философ. Зовут его Александр. Мы с ним почти ровесники, поэтому во многом схожи во взглядах, но у него есть одно большое преимущество, он смотрит на мир с двух точек зрения, европейца и русского, потому как долго прожил в ...