Cвязный список

Однажды мне захотелось обойти список и с каждым элементом сделать что-то полезное. Но проблема была в том, что «полезное» для текущего элемента зависело от значения предыдущего элемента. Городить полновесный связный список не хотелось, поэтому на свет был рождён вот такой генератор, чем-то напоминающий встроенный enumerate(). Он принимает на вход последовательность и на каждой итерации возвращает кореж из трёх элементов: предыдущий, текущий, следующий. Очевидно, что предыдущий элемент для первого и следующий для последнего не определены, то есть None.

def linked(sequence):
    """Function yelds tuples with previous, current and next elements
    of sequense. Previous for first element and next for last one are None.
    >>> list(linked([1]))
    [(None, 1, None)]
    >>> list(linked([1, 2]))
    [(None, 1, 2), (1, 2, None)]
    >>> list(linked([1, 2, 3]))
    [(None, 1, 2), (1, 2, 3), (2, 3, None)]
    """
    index = 0
    while index < len(sequence):
        yield (sequence[index - 1] if index else None,
               sequence[index],
               sequence[index + 1] if index + 1 < len(sequence) else None)
        index += 1
    raise StopIteration
Рубрика: Python | Добавить комментарий

Калькулятор в консоли

Для питонщика-линуксоида, подумал я однажды, использовать гуёвый калькулятор ради нескольких арифметических действий — не комильфо. Тогда полчаса скриптования привели вот к такой конструкции в .bashrc

=() {
    if calc=`python3 -c "from math import *; print(${@//x/*})" 2>/dev/null`
    then
        echo $calc
    else
        echo Error >&2
    fi
}

И voilà, вся мощь пайтона на кончиках пальцев! :-)

$ = 9 / 98
0.09183673469387756
$ = pi
3.141592653589793
$ = 'sin(2 x pi)'
-2.4492935982947064e-16
$ = 2 xx 64
18446744073709551616
$ = 2 xx 32
4294967296

Жаль, только, что шелл трактует на свой лад скобки и звёздочки. Вопрос со звёздочками решился конструкцией ${@//x/*} (вместо них для умножения теперь используется икс), а вот выражения со скобками приходится брать в кавычки.

Заморочку с ветвлением добавил для того, чтобы в случае ошибки не вываливать весь вывод питоновского трассировщика, а показать скромное error.

Рубрика: Скрипты | Добавить комментарий

Валидация ИНН

Для собственных нужд понадобилось соорудить на Python функцию для проверки корректности ИНН. Собственно, вот результат. Работает и со второй, и с третьей версиями Python.

def is_valid_inn(inn):
    '''функция проверяет корректность ИНН
    (длина, набор символов, контрольная сумма)
    :param inn: строка с ИНН (10 или 12 символов)
    :type inn: str or unicode
    :returns: True если ИНН корректный
    :rtype: bool
    '''
    multiplier = [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8]
    try:
        inn = [int(i) for i in inn]
    except ValueError:
        return False
 
    def checksum(digit):
        _inn = [0] * (12 - digit) + inn
        s = sum([multiplier[i] * _inn[i] for i in range(11)])
        return _inn[11] == s % 11 % 10
 
    if len(inn) == 12:
        return checksum(11) and checksum(12)
    elif len(inn) == 10:
        return checksum(10)
    return False
Рубрика: Скрипты | Добавить комментарий

Многоточие

В HTML есть вагон и маленькая тележка разнообразных сущностей, которые дают возможность довольно легко отразить в HTML документе символы, которых нет на клавиатуре.

Помимо прочих, есть и сущность для горизонтального многоточия (…), которое в народе более известно как просто многоточие. С момента моего первого знакомства с мнемониками, я наивно выделил в сочетании &hellip; знакомое слово hell и, искренне недоумевая как многоточие связано с адом, запомнил этот мнемоник как адский IP. И вот недавно я узнал, что hellip — это сокращение от… барабанная дробь… Horizontal ellipsis! Горизонтальное многоточие, то бишь.

С уважением, ваш Кэп.

Рубрика: Разное | Добавить комментарий

To GET or not to GET?

В моём маленьком уютненьком мирке стало на одного единорога меньше :-(

Вот смотрите, открываем мы раздел 9.3 в RFC 2616 и читаем:

The GET method means retrieve whatever information (in the form of an entity) is identified by the Request-URI.

То бишь, сущность, получаемая GET-запросом, должна однозначно идентифицирована URL-ом. Это называется умным словом идемпотентность.

Далее, открываем письмо многоуважаемого Роя Филдинга, на которое часто ссылаются при обсуждении данного вопроса, и не менее отчётливо читаем:

…a body, if any, has no semantic meaning to the request. <…> So, yes, you can send a body with GET, and no, it is never useful to do so.

То бишь, отправляйте тело в GET-запросе, сколько вам вздумается, да как нефиг. Вот только толку от этого никакого, серверу нельзя его обрабатывать. Казалось бы, куда уж однозначнее? Но нет же, есть, есть в этом мире злые и мерзкие людишки!

Elastic английским по белому пишет в своей документации, что «Since», видите ли, «not all clients support GET with body, POST is allowed as well». Поскольку очень многие клиенты достаточно умны, чтобы соблюдать стандарты, мы, так уж и быть, снизойдём до их частичного соблюдения. Охренеть.

Рубрика: Разное | Добавить комментарий

INI-файлы для бедных

Чтение INI-файлов для бедных. Немного bash и крупица sed. Отлично подойдёт для конфигов на десяток параметров. Если параметр встречается в конфиге несколько раз, используется только последнее значение.

Умеет

  • игнорировать комментарии (всё, что после октото́рпа и точки с запятой),
  • длинные значения, в том числе с пробелами (будьте аккуратнее с пробелами в шелле, не забывайте экранировать),
  • игнорировать незнакомые имена и ошибки синтаксиса.

Не умеет

  • различать секции,
  • указывать на незнакомые имена,
  • следить за синтаксисом.
while read I ; do
    I=`(echo $I | sed "s/[#;\[].\+$//; s/^ \+//; s/ \+$//;
                       /^ \+$/d; /[^=]\+=[^=]\+/!d; s/\s\+=\s\+/=/")`
    case `echo $I | cut -d= -f1` in
        'some_value')
            SOME=`echo $I | cut -d= -f2` ;;
        'another_value')
            ANOTHER=`echo $I | cut -d= -f2` ;;
        'yet_another_value')
            YET_ANOTHER=`echo $I | cut -d= -f2` ;;
	esac
done < /path/to/file.ini
Рубрика: Скрипты | Добавить комментарий

Объявление

Граждане! При артобстреле эта сторона улицы наиболее опасна!Ты, кстати, никогда не вслушивался в это «В связи с угрозой террористических актов просим…» на вокзалах? А у меня оно ассоциируется с надписями на Невском и Литейном «При артобстреле эта сторона улицы наиболее опасна», с военным положением и голодом, с будничной и въевшейся беззащитностью. Бомба падает, а ты отряхиваешь от пыли и дальше идёшь. И волосы не встают дыбом, когда переступаешь через тех, кто уже не встанет и не отряхнётся. Война, мол, а вы что хотели? И будто до линии фронта рукой подать, и нет мирного неба над головой. Как же хочется верить, что призраки прошлого не обрастут плотью.

Рубрика: Мысли | Добавить комментарий

Штиль

Радиопьеса. Слова Маргариты Пушкиной. Найти бы умелых людей, чтоб это записать.

Читать далее

Рубрика: Разное | Комментарии (2)

Фашизм — это очень просто

Эпидемиологическая памятка

Чума в нашем доме. Лечить ее мы не умеем. Более того, мы сплошь да рядом не умеем даже поставить правильный диагноз. И тот, кто уже заразился, зачастую не замечает, что он болен и заразен.

Читать далее

Рубрика: Разное | Добавить комментарий

На Земле безжалостно маленькой…

На Земле
безжалостно маленькой
жил да был человек маленький.
У него была служба маленькая.
И маленький очень портфель.
Получал он зарплату маленькую…
И однажды —
прекрасным утром —
постучалась к нему в окошко
небольшая,
казалось,
война…
Автомат ему выдали маленький.
Сапоги ему выдали маленькие.
Каску выдали маленькую
и маленькую —
по размерам —
шинель.

…А когда он упал —
некрасиво, неправильно,
в атакующем крике вывернув рот,
то на всей земле
не хватило мрамора,
чтобы вырубить парня
в полный рост!

Роберт Рождественский, 1969.

Рубрика: Разное | Добавить комментарий