Уведомления

Группа в Telegram: @pythonsu

#1 Май 11, 2021 13:00:41

Ocean
Зарегистрирован: 2021-03-14
Сообщения: 131
Репутация: +  9  -
Профиль   Отправить e-mail  

ДОПОМОЖІТЬ БУДЬ ЛАСКА

py.user.next
О, поняла! Спасибо
А то я подумала еще, что зря в переменную сохраняю, если требуется только вывести и отобразить.

py.user.next
Ворота делаются для того, чтобы в случае импорта этого модуля для простого взятия функций из него, как из любого другого импортированного модуля (типа math, itertools и других) функция main() не запускалась на выполнение и ничего не вычислялось и не выводилось ни на какой экран. А при выполнении этого файла, когда он запускает на выполнение сам по себе как программа, ворота видят, что файл запущен как программа, и пропускают интерпретатор внутрь к вызову функции main(). Функция main() вызывается и всё работает.
Поняла, буду делать правильно в других задачах.
Не хочу технического долга копить)

py.user.next
Видишь да, ещё твой код слитный, а мой раздельный? Это я в начале пустых строк поставил один пробел. Секрет форума.
Еще одно спасибо, я боялась добавлять, чтобы потом при переносе не ломалось.
И есть еще баг похоже.
Иногда двойные отступы в код делает внезапно и смещает блок.
Пока не поняла паттерн для этого

Офлайн

#2 Май 11, 2021 14:01:28

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9731
Репутация: +  843  -
Профиль   Отправить e-mail  

ДОПОМОЖІТЬ БУДЬ ЛАСКА

Ocean
А что взамен используешь? Open office online? Или вообще ничего?
Не, я просто скрипты в Google Sheets перестал использовать и всё. Они там предлагают язык этот их учить, чтобы функции писать в документах, а я просто на него забил - пускай сами учат свой язык, который нафиг не нужен. А в LibreOffice скрипты на JavaScript снаружи лежат, это тоже неудобно. Хочется, чтобы оно внутри файла хранилось, потому что он же гуляет туда-сюда, где-то он в бэкап идёт и так далее. Это его надо бэкапить, потом скрипты надо бэкапить - ну, такое.

Так что я просто делаю базу данных и клиент к ней. Ничего сложного. Базу данных можно экспортировать в документ, пригодный для LibreOffice. Скачанный документ какой-то откуда-то можно влить в базу данных. Если у него формат неподходящий, можно его переформатировать. Вот я переформатировал документ из одного вида в другой. Это было задание на форуме. Вот там довольно сложное переделывание было. Но, как видишь, скрипты эти короткие довольно. Это в 2016 году было, с тех пор-то я поднялся ещё выше. Несколько языков выучил ещё. Вот я в прошлом году AWK выучил наконец-то, теперь им владею и очень много уже функций понаписал с ним в рабочих скриптах.

Вот из последних:
Скрипт качает фильмы с YouTube или VK или OK, то есть он сам определяет, откуда ссылка, и подбирает правильный способ скачивания. Так вот там применён AWK (инфа, если не знаешь wiki.en.awk wiki.ru.awk)

Это Bash-функция, внутри которой AWK-код
  
load_file_ok_get_vformat()
{
    local url=$1
 
    Ytl "$url" | awk '
state == 0 {
    if ($1 ~ "^(sd|hd)$")
        state = 1
}
state == 1 {
    if ($1 ~ "^hls-[0-9]+$") {
        vformat = $1
        state = 0
    }
}
END {print vformat}
'
}
Когда ссылка определена как одноклассниковая, скрипт спускается в эту фукнцию и отыскивает наилучший формат видео по критерию качество-размер. Так вот Ytl - это функция, которая получает простыню из форматов для этого видео. Там много всяких строк, среди которых много всяких форматов и много всяких псевдоформатов.

Допустим, фильм “Грань будущего”, ссылка https://ok.ru/video/794300844679
[guest@localhost ~]$ Ytl https://ok.ru/video/794300844679                                  
mobile mp4 unknown
mpd-0 mp4 256x144 DASH video 122k , mp4_dash container, avc1.64000C, 30fps, mp4a.40.2 (44100Hz)
hls-162 mp4 256x144 162k
lowest mp4 unknown
mpd-1 mp4 426x240 DASH video 359k , mp4_dash container, avc1.640015, 30fps, mp4a.40.2 (44100Hz)
hls-409 mp4 426x240 409k
low mp4 unknown
mpd-2 mp4 640x360 DASH video 765k , mp4_dash container, avc1.64001E, 30fps, mp4a.40.2 (44100Hz)
hls-837 mp4 640x360 837k
sd mp4 unknown
mpd-3 mp4 852x480 DASH video 1361k , mp4_dash container, avc1.64001F, 30fps, mp4a.40.2 (44100Hz)
hls-1466 mp4 852x480 1466k
hd mp4 unknown
mpd-4 mp4 1280x720 DASH video 2952k , mp4_dash container, avc1.64001F, 30fps, mp4a.40.2 (44100Hz)
hls-3148 mp4 1280x720 3148k (best)
[guest@localhost ~]$
[guest@localhost ~]$
[guest@localhost ~]$ load_file_ok_get_vformat https://ok.ru/video/794300844679
hls-3148
[guest@localhost ~]$
Мы сначала смотрим все форматы, а потом выбираем из них либо hd, либо sd. Но сначала нам нужно понять, кто из них кто. Мы видим сначала sd и сохраняем его код hls-1466. Но потом мы видим hd и сохраняем его код hls-3148. Больше мы ничего не видим и поэтому выводим на экран то, что сохранено последним.

Допустим, фильм “Чужие”, ссылка https://ok.ru/video/91577387571
[guest@localhost ~]$ Ytl https://ok.ru/video/91577387571
mobile mp4 unknown
mpd-0 mp4 256x138 DASH video 114k , mp4_dash container, avc1.42c01e, 24fps, mp4a.40.2 (44100Hz)
hls-147 mp4 256x138 147k
lowest mp4 unknown
mpd-1 mp4 426x230 DASH video 305k , mp4_dash container, avc1.42c01e, 24fps, mp4a.40.2 (44100Hz)
hls-349 mp4 426x230 349k
low mp4 unknown
mpd-2 mp4 640x346 DASH video 649k , mp4_dash container, avc1.64001e, 24fps, mp4a.40.2 (44100Hz)
hls-710 mp4 640x346 710k
sd mp4 unknown
mpd-3 mp4 852x462 DASH video 1155k , mp4_dash container, avc1.64001e, 24fps, mp4a.40.2 (44100Hz)
hls-1240 mp4 852x462 1240k
hd mp4 unknown
mpd-4 mp4 1280x692 DASH video 2566k , mp4_dash container, avc1.64001f, 24fps, mp4a.40.2 (44100Hz)
hls-2718 mp4 1280x692 2718k
full mp4 unknown
mpd-5 mp4 1920x1040 DASH video 5484k , mp4_dash container, avc1.640028, 24fps, mp4a.40.2 (44100Hz)
hls-5760 mp4 1920x1040 5760k (best)
[guest@localhost ~]$
[guest@localhost ~]$
[guest@localhost ~]$ load_file_ok_get_vformat https://ok.ru/video/91577387571
hls-2718
[guest@localhost ~]$
Мы сначала смотрим все форматы, а потом выбираем из них либо hd, либо sd. Но сначала нам нужно понять, кто из них кто. Мы видим сначала sd и сохраняем его код hls-1240. Но потом мы видим hd и сохраняем его код hls-2718. Больше мы ничего не видим и поэтому выводим на экран то, что сохранено последним.

И вот представь, в “Грани будущего” нет формата full, а в “Чужих” есть формат full. И вот этот формат full в “Чужих” весит 5.08 Gb. При этом формат hd в “Чужих” весит 2.38 Gb. То есть при просмотре на телевизоре разницы между этими форматами вообще нет, а для флешки, с которой смотришь это дело, разница как раз есть. Там же не один фильм лежит, а много. И, как видишь, эти коды форматов для hd одного фильма и для hd другого фильма различаются по числам.

И вот эту всю проблему (не трогать full, если он там есть; брать hd, если он там есть; брать sd, если там нет hd; не брать ничего, если там нет ни sd, ни hd, а если только full, например, есть) решает вот этот короткий код на AWK. Ну, если эту функцию на чистом Shell'е написать (нативный язык в Bash), то она будет раз в пять длиннее и раза в три непонятнее. А AWK, благодаря своему устройству, даёт делать какие-то такие забубённые вещи очень короткими кодами. Он очень плотно упакован, как бы сам себя пронизывает. Так вот в названии AWK эти буквы A - это Ахо, а K - это Керниган. Ахо написал книжку про компиляторы (как создавать компиляторы), классическая книжка. А Керниган - это буква K в K&R2, то есть он соавтор главной книги по языку C. Вот эти мужики сделали AWK.

А вот ещё одна функция. Посмотри, какая красавица
  
# Increment time in the file name;
# The file name "name123.ext" is set to 1 hour 23 minutes
# FileTimeInc(fname, minutes)
FileTimeInc()
{
    local fname=$1
    local mininc=$2
 
    [ $# -ne 2 ] && {
        echo "usage: $FUNCNAME filenameTIME.ext MIN"
        echo ""
        echo "Example: $FUNCNAME name50.ext 15 --> name105.ext"
        return 1
    } >&2
    awk -v fname="$fname" -v mininc="$mininc" '
# Split filename in form "file.ext" to ["file", "", ".ext"]
# or "file123.ext" to ["file", "123", ".ext"]
# return 0 if split is wrong
# return 1 if split is right and has 3 parts
function split_filename(fname, out) {
    if (fname ~ /[0-9]\.[^.]+$/) {
        sub(/[0-9]+\.[^.]+$/, "|&", fname)
        sub(/\.[^.]+$/, "|&", fname)
    } else {
        sub(/\.[^.]+$/, "||&", fname)        
    }
    return split(fname, out, "|") == 3
}
# Convert number in form 1 to 3 if increment is 2
# or number in form 59 to 101 if increment is 2
# return converted value
function convert_time(n, inc,    out, left, right, moved, reminder) {
    if (length(n) <= 2) {
        out = int((n + inc) / 60) * 100 + (n + inc) % 60
        return out
    }
    else {
        left = int(n / 100)
        right = n % 100
        moved = int((right + inc) / 60)
        reminder = (right + inc) % 60
        out = (left + moved) * 100 + reminder
        return out
    }
}
BEGIN {
    if (split_filename(fname, parts)) {
        newfname = parts[1] convert_time(parts[2], mininc) parts[3]
        print "mv \"" fname "\" \"" newfname "\""
    }
}' | sh
    return 0
}
Вот с помощью этой функции и обёртки над ней со sleep'ом я смотрю всякие конференции Путина четырёхчасовые. Не будешь же четыре часа сидеть и смотреть эту муть. Смотришь кусочками по 10-15-23-37 минут и так далее. А время нужно постоянно запоминать, докуда досмотрел, чтобы в следующий раз потом продолжить с того места, где отключился. Ну, и прямо в имени файла время это и сохраняется. Для каждого файла его время в его имени хранится. Раньше я руками всё это делал, а потом вот функцию написал. Сейчас вот смотрю концерт певца одного, врубаю свою эту систему - так кайфово. Ни за чем следить не надо, имя само тикает (через каждые две минуты переименовывается, повышая счётчик времени). Потом можешь просто видео выключить и точно знаешь, что там никакое время никуда не потерялось.

Это ты спросила, чем я пользуюсь. Я пользуюсь своими скриптами со своими функциями, которые пишу сам себе. Конечно, у меня их больше всяких, но, я думаю, тебе и этих хватит почитать.

Ocean
Там еще и шелуха от еды с перьями летит.
Знаешь, шелуха летит, конечно, но там тряпочка лежит под клеткой как раз для шелухи. Просто тряпочку поднимаешь и вся шелуха сползает к центру тряпочки. И она потом по комнате не летает и к одежде не прилипает, когда собираешься в город. Как собираешься в город, так сначала минут десять выковыриваешь перья зелёные из одежды.

Ocean
Чистится еще потом небось долго после паники, возмущается и недовольно на тебя смотрит.
Не, она чистится, когда она в спокойном состоянии. То есть я её когда выпускаю из клетки в комнате, она на люстру садится и может весь день сидеть и чиститься там. Чистюля такая. Это значит, что ей комфортно.

Короче, неудобно на ноутбуке заниматься. То одно, то другое мешает. В теории кажется, что ноутбук - это же классно, он такой удобный, перемещаемый, можно брать с собой в город, где-то там ещё сидеть с ним. По факту же самое удобное использование ноутбука - это когда ты его на стол ставишь, подключаешь к розетке и работаешь, как на обычном компе. И то, клава неудобная, все кнопки перенесены там куда-то, все кнопки сжаты ещё вплотную (неудобно для слепого набора десятипальцевым методом). Ещё когда набираешь текст, рука попадает на мышку (тачпэд) и эта мышка начинает там двигаться по экрану, нажимать и так далее. А ты не можешь руку поднимать, чтобы она не касалась мыши, потому что рука устаёт и синдром запястья начинает развиваться.



Отредактировано py.user.next (Май 11, 2021 14:10:53)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version