Обновить
5

Пользователь

Отправить сообщение

Сердце Змеи - очень грустная история. Миры не совместимы, что логично, но автор передал это так, что действительно чувствуешь грусть. В отличие от Проект Аве Мария, где несовместимость двух миров спрятана за бравадой ученого-около-космонавта. Хотя в конце милота дружбы отчасти сохранена. В книге. А в фильме очень гиперболизирована.

У Снегова меня поразили и продолжают поражать две технические вещи. Первая - аннигиляторы пространства (кажется, придуманные раньше варп-двигателей из мира Стартрека). Вторая - необычная физика в окрестности центра Галактики, которой непонятно как, но весьма лихо управляли рамиры. Возможно, чуть притянуто, но снеговское описание находит параллели с современным пониманием физики в окрестности сильной гравитации черных дыр (романе этого термина нет).

Обычный PCA

"Эр-эс-а", "пэ-цэ-а", "пи-си-эй". Как это читается? Что это такое? Почему приведена аббревиатура, но нет ее расшифровки?

Хорошая и правильная практика любой статьи при использовании аббревиатур - раскрывать их при первом упоминании и далее использовать аббревиатуру. Исключение - общеизвестные сокращения.

Из 5 описанных ситуаций действительной проблемой является только третья с (( x++ )).

Остальные - особенности любого шелла или особенность баша, которая задокументирована. Но когда что-то работает не так как задумано, надо хоть чуть-чуть знать, что и где искать. Можно было бы сказать, что это проблема шелла, но это касается любого инструмента, даже питон, го и т.д..

1) конвейеры и циклы. Вообще не проблема - то специфика любого шелла

some_cmd | while ...
do
    somevar=...
done
echo "$somevar"

Если переменная нужна по выходу из цикла, то лучше делать универсально (поддерживается большинством оболочек, включая posix shell):

while ...
do
    somevar=...
done <!
$( some_cmd )
!
echo "$somevar"

Почему так? Потому что конструкуция < <( ... ) является башизмом и работает надежно только в bash. Но если очень хочется в баш, то можно порекомендовать herestring: ... <<<"$( some_cmd )".

2) И снова не проблема. set -e работает так потому, что так определено (см. https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#set)

А комбинация вида set -e ; risky_cmd || another_cmd работает именно так, как и задумал автор: если первая команда облажалась, то запустить вторую без падения в ошибку.

3) (( x++ ))

А это действительно глючная команда и ею лучше не пользоваться.

4) Trap не наследуется в subshell
5) Глобы без совпадений возвращают сами себя

Об это по началу спотыкаешься, пока внимательно не почитаешь мануал конкретно по trap, shopt, set.

Если мне не изменяет память shopt, set -E и trap ERR - это чистые башизмы, часть которых перетекли в другие оболочки.

Вроде бы, в английском есть generic you, который очень хорошо соответствует русскому "ты", который, как раз, тоже безликий, но более разговорный. Типа "и ты такой сидишь задумчивый".

Есть такой мысленный эксперимент ...

... мыслительный эксперимент ...

С самого начала статьи разброд в терминах. Первое верно, второе - лишено смысла.

Вот это красивше будет:

while read -r enable command ; do
    case "$command" in
    enable | logout | exit | echo ) ;;
    * ) enable -n "$command" ;;
    esac
done <<<"$( enable )"

Но еще проще писать и читать в родных идиомах языка, например:

eval "$( enable | sed '/ \(enable\|logout\|exit\|echo\)$/! s/ / -n /' )"

Интересно, как отработает следующая команда? И аналогичные ей.

command ls.old /

например клеенный переплет

Без шампуров аккуратнее будет )))

Первый вариант

  1. Аккуратно снять обложку вместе с корешком

  2. Просверлить, как у вас, но без обложки

  3. Потом пропустить суровую нитку через отверстия туда-сюда, затянуть концы и связать (они будут торчать с одной стороны из двух соседних отверстий, поэтому проблем не будет)

  4. Приклеить обложку

Другой вариант

  1. Аккуратно снять обложку вместе с корешком

  2. Закрепить книжный блок и сделать равномерно пропилы на глубину примерно 3-5 мм

  3. Пропилы промазать клеем, суровую нитку нарезать по количеству пропилов, нарезку вкрутить в пропилы, натягивая нить с двух сторон, корешок зажать в пресс, смазать пропилы еще раз и дать подсохнуть

  4. Отрезать излишки ниток, торчащих из пропилов

  5. Приклеить обложку

Первый вариант крепче, но книгу будет не очень удобно читать (особенно толстую). Второй - чуть менее прочный, но вполне долговечный.

Второй вариант, кстати, упоминается в самом первом комментарии.

Озарения из прошлого, когда паскаль использовал: помню, что объявления переменных шли всегда вначале, отдельным блоком. Сейчас, наверно, уже можно смешивать в си-подобном стиле.

А у вас молоко убежало...

procedure bubble(a: array of Integer);
begin
  var n := Length(a);
  var i := 0;

К сожалению у них ничего не получится. Уже давно очень, жарким летом 1972-го, один астрофизик из Ленинграда разрабатывал фундаментальное исследование структур звездных скоплений. Но сама вселенная воспротивилась его продвижению в работе. Пришлось остановиться.

Кстати - да. Стек и очередь - две структуры данных (точнее - типа данных), реализующих разный способ извлечения элементов. Правильнее было бы назвать массивами или списками.

Здесь в комментариях-описаниях неверно изложена логика. Начиная со строк 4 и 5 некорректно отражены действия и состояния стека.

                     #              stack=()
<a>                  # push a;      stack=(a)
    <b>              # push b;      stack=(a b)
        <c>meow</c>  # push c;      stack=(a b c)
        <d>nya</d>   # pop; push d; stack=(a b d)
    </b>             # pop;         stack=(a b)
</a>                 # pop;         stack=(a)
                     # pop;         stack=()

Логичнее было бы так: каждому <tag> соответствует свой push tag , и каждому </tag> соответствует свой pop. Тогда состояние стека, выражаемое stack=(...), точно соотвествовало бы действиям.

                     #              stack=()
<a>                  # push a;      stack=(a)
    <b>              # push b;      stack=(a b)
        <c>meow</c>  # push c; pop; stack=(a b c) stack=(a b)
        <d>nya</d>   # push d; pop; stack=(a b d) stack=(a b)
    </b>             # pop;         stack=(a)
</a>                 # pop;         stack=()

В одной из сцен на агента Илью Курякина нападают два робота. Они методично стреляют в него ракетами, а герой отбивается крышкой от мусорного бака. Для современного зрителя сцена может показаться комичной, но для своего времени это был серьезный экшн.

Да ладно! Самая что ни на есть современная сцена - только представьте на их месте каких-нибудь роботов-доставщиков.

радиус порядка 1—5 ферми, что составляет миллионные доли нанометра

Как сложно-то для читателя. "Милионная" это 6, "нано" - 9, потом сложить. Не проще было бы сказать сразу про 10^-15 м? Или сказать, что сравнимо с размерами атомных ядер, что составляет порядка 10^-15 м?

print_and_execute

Сомнительно. Чем вам пара set -x/set +x не угодила? И название длинное.

xtrace() {
	set -x
	"$@"
	set +x
}

Конечно же будет выводится лишняя отладочная строка + set +x. Но это мелочи. Зато можно так писать, а отладку включать/выключать комметированием первой строки:

xtrace \
какая-то команда с кучей --разных --ключей и разных параметров

Разве этот код не вылетает по переполнению стека?

check_idle_time() {
    ...
    check_idle_time
}

check_idle_time

По п5. Все верно. Редактируете /etc/apt/sources.list и /etc/apt/sources.list.d/* - пишете туда все, что вам требуется, а потом apt update ; apt dist-upgrade -y ; apt install все что надо для счастья . Или вендор рекомендует другой путь?

Несколько замечаний

1.

#Получение короткого имени hostname
hostnamectl set-hostname DC_NAME.DOMAIN_NAME

В первом листинге: коммент не соответствует действию

2.

$IPADDR $SERVER_NAME.DOMAIN_NAME $PC_NAME

Во втором листинге используется необъявленная переменная PC_NAME

3.

ALDPRO_CHECK=`dpkg -l | grep aldpro-client`
if [[ -z $ALDPRO_CHECK ]];

это можно упростить до

if ! dpkg -l aldpro-client >/dev/null 2>&1

4.

-d "{
"data": {

Чтобы не мучиться с экранированием кавычек в кавычках, лучше вызватьcat в субшелле, например:

-d "$(
  cat - <<-DATA
  {
    "data": {
    ...
DATA
)"

5.

обновление ОС - первый скрипт

#Обновление ОС до актуальной версии
apt update -y
apt install astra-update -y && sudo astra-update -A -r -T

обновление ОС - второй скрипт

#Установка пакетов ALD Pro
apt update -y
DEBIAN_FRONTEND=noninteractive apt-get install -q -y aldpro-client

Получается на второй машине почему-то игнорируется обновление системы. И вообще в целом, обновление репозиториев выстроено нелогично. Лучше прописать все источники в sources.list и//или sources.list.d/, а потом выполнить обновления репо, системы и установку нужных пакетов.

Дальше уже читал по диагонали.

1
23 ...

Информация

В рейтинге
4 587-й
Зарегистрирован
Активность