О компьютерной грамотности-2
hardsign — 04.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
Вот такие россыпи в одном маленьком скриптике. А у меня их десятки...
|
|
</> |
Apple Watch SE: оптимальный выбор умных часов для здоровья и повседневной жизни
Огонь
Керчь. Крым. Часть 18 (последняя)
Октябрь 2018 года. 23-летняя Фиона Симпсон ехала по шоссе Д’Агилар рядом с
Авиашоу в Мочище ч14: выступление заводского Су-34.
Сара Чатто с мужем, сыном и его подругой на выставке Уэйна Макгрегора
Самое эффективное предприятие в истории человечества
Небольшая тематическая подборка: котики, еда и ЗОЖ
Воскресенье и Карта дня.

