Из-за того, что у калькулятора ограничена память программ, производилась какая-то дичайшая оптимизация, поэтому она выглядит так запутанно. Но, к моему сожалению, ни толковой литературы, ни описания, как это делалось, мне не удалось найти.
Ребятишки узнали про аппаратные ограничения и возможности/способы эти ограничения обойти.
Искра-1256 нашлась в поиске. Сам не сразу вспомнил, как она звалась. Я на такой фортран мучил и какой-то странный фортрано-подобный язык по названием "символьно-скобочный язык".
select *
from #Movements
where EventCode <> 'EMI'
or EventCode = 'EMI'
and CreateDate = (
select min(CreateDate)
from #Movements
where EventCode = 'EMI'
)
Второе задание. Сколько его я ни перечитывал, так и не понял, как описание, согласуется с видимым результатом.
В целом: на супер-пупер сборник задач не тянет, но порешать можно.
Команда ls по умолчанию сортирует результат своего выполнения. Вероятно, сортировка производится в памяти. Однажды я столкнулся с проблемой падения ls * на нескольких десятках тысяч файлов. В таких случаях ls -U или find спасают ситуацию.
Есть переменная $PATH, которая содержит список путей, где искать файлы на исполнение. Например:
PATH=/bin:/usr/bin:/usr/local/bin
Когда в командой строке пишете что-то вроде:
$ какая-то-команда с какими-то ключами
то оболочка (bash, sh, zsh или, прости господи, cmd) ищет файл, перебирая все пути из переменной $PATH. То есть оболочка ищет исполнимый файл, один из:
Как только будет найден файл для запуска (исполнения), поиск прекращается и вызывается команда с параметрами, например:
/какой/то/путь/какая-то-команда с какими-то ключами
Если вы явно описываете путь
./какая-то-команда с какими-то ключами
то поиск не производится, а делается попытка запустить такую команду.
Здесь описана упрощенная схема. Здесь не описаны особые случаи для псевдонимов (alias), функций, которые обрабатываются в первую очередь. Также не сказано про очень особый случай с cmd.exe, который а) дополнительно смотрит на расширение файла (сравнивает с переменной %PATHEXT%, ищет ассоциации по расширению, выполняет еще какие-то магические действия), б) игнорирует переменную %PATH%, если в текущем каталоге имеется исполнимый файл с таким именем и в) некоторые его подводные камни.
Нууу. Сильный акцент, часто повторяющиеся слова, быстрая речь, но очень живая - он не монотонно долбит, как перфоратор, но использует интонацию. Конечно, очень широкую улыбку вызывает. Но речь-то очень и очень грамотная. Аригатин?
Забыл сказать. Хранить временные файлы в текущем каталоге - не есть хорошо. Если вы рут, то вы просто засоряете ФС. Если рядовой - у вас может не быть прав на текущий каталог и результат вашего скрипта - не предсказуем.
Почему это важно. Скрипт можно завершить разными способами: клавишами CTRL-C, командой kill. В результате - команды rm FILE в конце скрипта могут быть и не выполнены. А в ФС вы оставите следы выполнения скрипта в произвольном месте.
Лучшее решение для этого (но этого не гарантирует от полной очистки ФС и, тем более, от авадакедавры типа kill -9) - в начале скрипта описать что-то вида:
# Какой-то временный файл, который нужен только на время выполнения скрипта
# $$ - PID текущего процесса в имени файла, обеспечивает уникальность файла
TMPFILE="${TMP:-/tmp}/certmgr-list-$$.out"
# ловушка - код, который будет выполнен по выходу (`EXIT`) из скрипта
# может быть внешней или внутренней командой или шелл-функцией
trap 'rm -f "$TMPFILE"' EXIT
И вам уже не надо писать отдельные команды для удаления временных файлов.
Сразу скажу, что #!/bin/sh и конструкции вида [[ ... ]] или (( ... <= ... )) (которые назыаются башизмами) - несовместимые вещи. Такой шебанг в начале скрипта предполагает, что это будет классифеский шелл, который не поддерживает удобные, расширенные возможности баша.
Поэтому: или #!/usr/bin/env bash и используйте всю мощь баша или откажитесь от башизмов.
2
Выхлоп команды всегда оборачивайте в двойные кавычки. Хотя это уже давно не так, но не каждый шелл понимает, что строка вида "слово слово слово" это одна цельная строка а не одно слово как значение переменной, а все остальное это некоторая команда, которую шелл может и выполнить.
3
Надо оптимизировать скрипт: я насчитал 5 вызовов команды certmgr -list. При этом в трех местах используется grep -E "Subject ". Понятно, что в каждый момент вы собираете разную информацию, но это очень не рационально.
4
Ваш скрипт построен по принципу
команда1 > FILE
команда2 >> FILE
cat FILE
Вероятно нет смысла вначале все сохранять в файл, а потом этот файл выводить. надо сразу писать в STDOUT. Если промежуточный результат надо еще как-то дополнительноо обработать, то можно сделать примерно так:
Простите, но cat FILE | tail -n $COUNTER | head -n 1 - это ужасно. Определенно, требуется оптимизация в части пунктов 3 и 4.
Я понимаю, что оно уже работает и чего его трогать. Но неоптимально написанный код в будущем порождает "неоптимальную оптимизацию".
6. Резюме
Я не знаю, как работает certmgr и каков его выхлоп, но смею предположить, что однократный вызов certmgr -list | grep -e 'Subject ' -e 'Not valid after' > "$TMP/certmgr-$$.out" уже будет существенной оптимизацией. А дальше работать с файлом "$TMP/certmgr-$$.out".
Выразительных средств awk/perl будет достаточно, чтобы оптимизировать скрипт, поддерживать его в дальнейшем и даже, при необходимости, с легкостью улучшать.
Вот так выглядят простейшие арифметические действия
Это на простейших примерах. А вот V + W = Г (2 + 4 = 6, записанное с помощью более-менее похожих символов). И здесь надо учитывать "внутренний перенос разряда" при переходе между 4 и 5.
Наверно, при сложении 5 вертикальных преобразовать в 1 горизонтальную. Как в подобных случаях с другими операциями еще не сообразил.
А вот, например, как 3 + 18 = 21? Наверно, дело привычки. 6 вертикальных это 1 горизонтальная и 1 вертикальная, получается 4 горизонтальных и 1 вертикальная. А 4 горизонтальных это 1 вертикальная рядом (новый разряд).
прослушивание коротких <...> намного эффективнее для обучения, чем просмотр кинофильмов или сериалов.
прокачивать свой английский на основе прослушивания песен <...> - лучше не делайте этого.
Ну наконец-то хотя бы еще один выражает схожее с моим мнение. Помнится, учителя одной школы советовали, и говорящие головы другой популярной обучающей платформы, нет-нет, да и посоветуют тоже слушать любимые песни и смотреть любимые сериалы. И в качестве "хорошего" примера предлагают сериал "Друзья". А я его и в переводе-то смотреть не хочу - у каждого свои фломастеры.
Нет. Не выругается и не завершится с ошибкой. Единственное, что я поправил бы в своем предыдущем ответе - переписать в виде ${var:+$var:} - выполнить подстановку, если переменная существует и не пустая строка (в отличие от первого варианта, который подразумевает только проверку на существование переменной).
А еще есть historical present, "историческое настоящее". Это когда
Послала мама Красную Шапочку в лес к бабушке. Шла девочка по лесу, цветочки собирала, да песенки пела. А тут вдруг из-за кустов появляется волк и говорит...
Я тут еще немного поупражнялся: улучшил команды, так чтобы одинаковый набор и без цикла для второй переменной:
для ETCD_SERVERS:
seq 0 $(( MASTER_COUNT-1 )) \
| awk -v fmt="https://master-%s.$BASE_CLUSTER_DOMAIN:$ETCD_SERVER_PORT" \
'{ s && s = s "," ; s = s sprintf(fmt, $0) } END { print s }'
для ETCD_INITIAL_CLUSTER:
seq 0 $(( MASTER_COUNT-1 )) \
| awk -v fmt="master-%s.$BASE_CLUSTER_DOMAIN=https://master-%s.$BASE_CLUSTER_DOMAIN:$ETCD_PEER_PORT" \
'{ s && s = s "," ; s = s sprintf(fmt, $0, $0) } END { print s }'
18% * 50 = 18 * 50% = 9
ГОСТ 16876-71 таблица 2
https://en.wikipedia.org/wiki/GOST_16876-71
Ребятишки узнали про аппаратные ограничения и возможности/способы эти ограничения обойти.
Искра-1256 нашлась в поиске. Сам не сразу вспомнил, как она звалась. Я на такой фортран мучил и какой-то странный фортрано-подобный язык по названием "символьно-скобочный язык".
Нууу...
Первое задание. Можно было бы решить проще:
Второе задание. Сколько его я ни перечитывал, так и не понял, как описание, согласуется с видимым результатом.
В целом: на супер-пупер сборник задач не тянет, но порешать можно.
Команда
ls
по умолчанию сортирует результат своего выполнения. Вероятно, сортировка производится в памяти. Однажды я столкнулся с проблемой паденияls *
на нескольких десятках тысяч файлов. В таких случаяхls -U
илиfind
спасают ситуацию.Есть переменная
$PATH
, которая содержит список путей, где искать файлы на исполнение. Например:Когда в командой строке пишете что-то вроде:
то оболочка (bash, sh, zsh или, прости господи, cmd) ищет файл, перебирая все пути из переменной
$PATH
. То есть оболочка ищет исполнимый файл, один из:Как только будет найден файл для запуска (исполнения), поиск прекращается и вызывается команда с параметрами, например:
Если вы явно описываете путь
то поиск не производится, а делается попытка запустить такую команду.
Здесь описана упрощенная схема. Здесь не описаны особые случаи для псевдонимов (alias), функций, которые обрабатываются в первую очередь. Также не сказано про очень особый случай с
cmd.exe
, который а) дополнительно смотрит на расширение файла (сравнивает с переменной%PATHEXT%
, ищет ассоциации по расширению, выполняет еще какие-то магические действия), б) игнорирует переменную%PATH%
, если в текущем каталоге имеется исполнимый файл с таким именем и в) некоторые его подводные камни.Нууу. Сильный акцент, часто повторяющиеся слова, быстрая речь, но очень живая - он не монотонно долбит, как перфоратор, но использует интонацию. Конечно, очень широкую улыбку вызывает. Но речь-то очень и очень грамотная. Аригатин?
Забыл сказать. Хранить временные файлы в текущем каталоге - не есть хорошо. Если вы рут, то вы просто засоряете ФС. Если рядовой - у вас может не быть прав на текущий каталог и результат вашего скрипта - не предсказуем.
Почему это важно. Скрипт можно завершить разными способами: клавишами
CTRL-C
, командойkill
. В результате - командыrm FILE
в конце скрипта могут быть и не выполнены. А в ФС вы оставите следы выполнения скрипта в произвольном месте.Лучшее решение для этого (но этого не гарантирует от полной очистки ФС и, тем более, от авадакедавры типа
kill -9
) - в начале скрипта описать что-то вида:И вам уже не надо писать отдельные команды для удаления временных файлов.
1
Сразу скажу, что
#!/bin/sh
и конструкции вида[[ ... ]]
или(( ... <= ... ))
(которые назыаются башизмами) - несовместимые вещи. Такой шебанг в начале скрипта предполагает, что это будет классифеский шелл, который не поддерживает удобные, расширенные возможности баша.Поэтому: или
#!/usr/bin/env bash
и используйте всю мощь баша или откажитесь от башизмов.2
Выхлоп команды всегда оборачивайте в двойные кавычки. Хотя это уже давно не так, но не каждый шелл понимает, что строка вида "слово слово слово" это одна цельная строка а не одно слово как значение переменной, а все остальное это некоторая команда, которую шелл может и выполнить.
3
Надо оптимизировать скрипт: я насчитал 5 вызовов команды
certmgr -list
. При этом в трех местах используетсяgrep -E "Subject "
. Понятно, что в каждый момент вы собираете разную информацию, но это очень не рационально.4
Ваш скрипт построен по принципу
Вероятно нет смысла вначале все сохранять в файл, а потом этот файл выводить. надо сразу писать в STDOUT. Если промежуточный результат надо еще как-то дополнительноо обработать, то можно сделать примерно так:
5
Простите, но
cat FILE | tail -n $COUNTER | head -n 1
- это ужасно. Определенно, требуется оптимизация в части пунктов 3 и 4.Я понимаю, что оно уже работает и чего его трогать. Но неоптимально написанный код в будущем порождает "неоптимальную оптимизацию".
6. Резюме
Я не знаю, как работает
certmgr
и каков его выхлоп, но смею предположить, что однократный вызовcertmgr -list | grep -e 'Subject ' -e 'Not valid after' > "$TMP/certmgr-$$.out"
уже будет существенной оптимизацией. А дальше работать с файлом"$TMP/certmgr-$$.out"
.Выразительных средств awk/perl будет достаточно, чтобы оптимизировать скрипт, поддерживать его в дальнейшем и даже, при необходимости, с легкостью улучшать.
Вот ведь как оно все повернулось - вначале жабры видоизменились в ухо-горло-нос, а потом хлеборезкой мы научились транслировать мысли.
Вот еще... Целая игровая площадка с разными песочницами
https://onecompiler.com
Это на простейших примерах. А вот V + W = Г (2 + 4 = 6, записанное с помощью более-менее похожих символов). И здесь надо учитывать "внутренний перенос разряда" при переходе между 4 и 5.
Наверно, при сложении 5 вертикальных преобразовать в 1 горизонтальную. Как в подобных случаях с другими операциями еще не сообразил.
А вот, например, как 3 + 18 = 21? Наверно, дело привычки. 6 вертикальных это 1 горизонтальная и 1 вертикальная, получается 4 горизонтальных и 1 вертикальная. А 4 горизонтальных это 1 вертикальная рядом (новый разряд).
Ну наконец-то хотя бы еще один выражает схожее с моим мнение. Помнится, учителя одной школы советовали, и говорящие головы другой популярной обучающей платформы, нет-нет, да и посоветуют тоже слушать любимые песни и смотреть любимые сериалы. И в качестве "хорошего" примера предлагают сериал "Друзья". А я его и в переводе-то смотреть не хочу - у каждого свои фломастеры.
На самом деле, рекомендуют, все-таки,
[ foo ] || [ bar ]
вместо[ foo -o bar ]
.Например, http://www.oilshell.org/blog/2017/08/31.html
Нет. Не выругается и не завершится с ошибкой. Единственное, что я поправил бы в своем предыдущем ответе - переписать в виде
${var:+$var:}
- выполнить подстановку, если переменная существует и не пустая строка (в отличие от первого варианта, который подразумевает только проверку на существование переменной).Глубоко не всматривался, но сразу бросилось в газа - красивые, строго структурированные строки.
Можно заменить строки вида
на следующую
А еще есть historical present, "историческое настоящее". Это когда
Послала мама Красную Шапочку в лес к бабушке. Шла девочка по лесу, цветочки собирала, да песенки пела. А тут вдруг из-за кустов появляется волк и говорит...
Берите все сейчас, а то еще накидаю вариантов на чистом шелле, без внешних команд )))
Я тут еще немного поупражнялся: улучшил команды, так чтобы одинаковый набор и без цикла для второй переменной:
для
ETCD_SERVERS
:для
ETCD_INITIAL_CLUSTER
:Можно было бы еще, но я думаю - хватит.