Пролог.
Маленькая сморщенная старушка грустно качала головой. Вокруг неё стояло несколько девиц, и они внимательно слушали то, что она им говорила.
— Ох, гибнут бабы, гибнут бедненькие, в муках родовых. Как же помочь-то им всем хочется. Жалко, мало нас, повитух, девоньки. Так вот науку я вам передала свою, вы уж меня не посрамите, берегите баб, младенчикам помогайте народиться со всем усердием. А завещаю я вам вот что. Каждая из вас одну — две сиротки должна обучить повивальному делу, а лучше три! Три сиротки! А теперь ступайте. По дальним городам — деревням идите, туда, где нет бабам помощи лекарской да повивальной.
— А ты, матушка, как же? – спросила одна из девиц. – Как ты одна тут управишься.
— Я-то, я-то управлюсь, — улыбнулась беззубым ртом старушка, — мне чай ещё несколько девчонок приведут скоро из разных деревень.
Старушка очень надеялась, что в новой партии будущих повитух будет та, которую она ждет. Видела Агафья, что девочку в путь собирают. А у нее для ученицы дорогой все уже готово. Узелок давно припасен. Абы кому его в руки давать нельзя, иначе беда будет. В неумелые руки узелок попасть не должен, так лекарь придворный, наставник ее, приговоренный к казни, говорил. Чудом сумел он сунуть Агафье этот узелок много лет назад, и сгинул сам в царской тюрьме.
—
В палате отделения интенсивной терапии и реанимации лежала молодая женщина. Куча трубочек от разных приборов тянулась к ее телу. Приборы эти пикали, гудели, пищали, и только женщина не подавала признаков жизни. Рядом с ней на кровати сидела девушка, она нежно поглаживала руку женщины и приговаривала:
— Марфа, вернись. Не покидай меня Марфа! Олег, когда же она очнется?
Доктор, вошедший в палату, грустно улыбнулся.
— Мы делаем все возможное, чтобы Марфа пришла в себя. Ты же знаешь, Соня, как я отношусь к твоей сестре, я задействовал все возможности нашего Центра. Марфу оперировал лучший нейрохирург, ведущие ортопеды собирали ее по кусочкам. Чудо, что после такой аварии она вообще жива осталась. Ты же понимаешь, что теперь нам остается только ждать.
— Но она уже месяц так лежит, — Соня, понимала, что Олег делает для Марфы невозможное, но смириться не могла. – Почему вы не попытаетесь вывести ее из комы?
Олег не ответил. Что он мог сказать. Он несколько раз пытался это сделать, и каждый раз попытка оказывалась неудачной. Еще немного, и он, Олег во всякую мистическую чепуху поверит, которую любит рассказывать его друг, коллега и вечный напарник Вениамин, их с Марфой однокурсник.
В одну из таких попыток Вениамин сказал:
— Кажется, мы с тобой впустую над ней колдуем. Ее душа где-то застряла, и возвращаться не хочет. Видно, что-то не пускает ее к нам. Или кто-то.
— Где застряла? – не понял друга Олег.
— Ну, где-то между жизнью и смертью, — пояснил поклонник спиритизма и всяких оккультных наук. – Может у нее миссия там, и она к нам не вернется, пока ее не выполнит.
В первой части мы разобрали общие технические принципы функционирования кодов платформы Spotify, и в завершении я написал, что неуверенность в некоторых деталях не позволила мне реализовать собственный конвертер штрихкодов в URI. Однако благодаря дополнительному исследованию и активной помощи от участников StackOverflow теперь я это преобразование выполнить могу.
Если вы первую статью не читали, то стоит начать с нее. Я опубликовал ее, в том числе, на Reddit, где она породила интересную дискуссию. Случилось так, что сам Людвиг Стригеус, ключевой разработчик Spotify, который и придумал эти коды, заглянул на огонек и поделился дополнительной информацией по их созданию и стоящей за ними логикой.
Текущая статья будет немного более технической, нежели предыдущая, поскольку здесь я постараюсь объяснить, как конкретно создаются коды Spotify. Для тех же, кто заинтересуется дальнейшим изучением темы, я перечислю в конце список полезных материалов.
Кодирование URI в штрихкод Spotify
На мой взгляд, проще всего понять штрихкоды, начав с URI и проследовав по всему процессу кодирования.
Медиа-ссылка
Сначала Spotify генерирует медиа-ссылку для URI. Эта ссылка кодируется в штрихкод и связывает его с URI. Spotify поддерживает базу данных сопоставлений медиа-ссылок с URI.
Медиа-ссылки позволяют ресурсу отслеживать сканирование кодов, в теории дают возможность пересопоставлять их и просто выглядят в кодированном виде красивее. Если бы Spotify кодировал весь URI, то выглядел бы он примерно как показано ниже, и сканировать его в таком виде было бы уже сложнее.
Начнем с медиа-ссылки 57639171874
, указывающей на следующий плейлист: spotify:user:spotify:playlist:37i9dQZF1DWZq91oLsHZvy
(Indie x Running).
Эту медиа-ссылку можно выразить в виде 37-битного двоичного числа:
57639171874 -> 0100010011101111111100011101011010110
Вычисление CRC
Далее для медиа-ссылки вычисляются биты циклической проверки избыточности. Делается это для оценки целостности данных. (Еще одним инструментом проверки контрольных сумм, используемым нами повседневно для проверки номеров кредитных карт, является алгоритм Луна).
Spotify использует CRC-8, которому соответствует следующий полином:
x^8 + x^2 + x + 1
В полной записи он выглядит так:
1x^8 + 0x^7 + 0x^6 + 0x^5 + 0x^4 + 0x^3 + 1x^2 + x + 1
[1, 0, 0, 0, 0, 0, 1, 1, 1]
Вычисление CRC происходит по следующим этапам:
1. Заполнение тремя битами справа.
01000100 11101111 11110001 11010110 10110000
2. Реверсирование байт.
00100010 11110111 10001111 01101011 00001101
3. Стандартное вычисление CRC (старший бит слева).
11001100
4. Реверсирование CRC.
00110011
5. Инвертирование бит.
11001100
6. Присоединение к результату из шага 1.
01000100 11101111 11110001 11010110 10110110 01100
|----------Media Ref--------------------||--CRC--|
Вот простая версия калькулятора crc (шаг 3):
def crc(data, polynomial):
# выполнить операцию xor для данных с полиномом в каждом вхождении 1.
# Остаток вернуть в виде контрольной суммы.
n = len(polynomial) - 1
initial_length = len(data)
check_bits = data + [0] * n
for i in range(initial_length):
if check_bits[i] == 1:
for j, p in enumerate(polynomial):
check_bits[i + j] = check_bits[i + j] ^ p
return check_bits[-n:]
С помощью проверки бит можно удостовериться в том, что полученные данные соответствуют переданным «отправителем»:
def check_crc(data, polynomial, check_bits):
full_data = data + check_bits
for i in range(len(data)):
if full_data[i] == 1:
for j, p in enumerate(polynomial):
full_data[i + j] = full_data[i + j] ^ p
return 1 not in full_data
data = [0,0,1,0,0,0,1,0,1,1,1,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,1,0,1,0,1,1,0,0,0,0,1,1,0,1]
check = [1,1,0,0,1,1,0,0]
poly = [1,0,0,0,0,0,1,1,1]
print(check_crc(data, poly, check))
# True
Сверточное кодирование
Далее эти 45 бит проходят этап сверточного кодирования. Сверточные коды добавляют в данные избыточность, делая возможным их декодирование в случае появления ошибок при передаче. Для более подробного знакомства с данной технологией рекомендую ознакомиться с этими конспектами лекций MIT.
Патент Spotify не очень ясен относительно того, какое сверточное кодирование выполняется:
Затем код можно преобразовать в код, исправляющий ошибки, например, упреждающую коррекцию ошибок. При этом в качестве упреждающей коррекции ошибок может использоваться, к примеру, сверточный код.
Однако участник StackOverflow под ником «Doyle» определил, что Spotify использует следующие генераторные полиномы:
g0 = 1011011
g1 = 1111001
Этот полином представляет, какие биты входных данных должны быть проXORены вместе в скользящем окне.
Откусывание хвоста (tail_bite)
Прежде, чем мы начнем вычислять биты четности, нужно добавить в начало потока последние 6 бит данных:
01000100 11101111 11110001 11010110 10110110 01100
|-----|
001100 01000100 11101111 11110001 11010110 10110110 01100
|----|
В виде альтернативы можно дополнить выходные данные нулями, но разработчики Spotify решили пойти по пути «откусывания хвоста».
Кодирование
Одновременно можно фокусироваться только на одном генераторе. Ниже представлен пошаговый проход по процессу генерации бит четности для g0
. Полином я развернул наоборот, потому что в этом примере его проще отобразить справа налево.
Bit #0
001100010001001110111111110001110101101011011001100
1101101 <- generator polynomial (mask)
-------
0001000 = 1 (xor the bits together)
Bit #1
001100010001001110111111110001110101101011011001100
1101101 <- generator polynomial (mask)
-------
0100001 = 0 (xor the bits together)
Bit #2
001100010001001110111111110001110101101011011001100
1101101 <- generator polynomial (mask)
-------
1100000 = 0 (xor the bits together)
Bit #3
001100010001001110111111110001110101101011011001100
1101101 <- generator polynomial (mask)
-------
1000100 = 0 (xor the bits together)
Bit #4
001100010001001110111111110001110101101011011001100
1101101 <- generator polynomial (mask)
-------
0001000 = 1 (xor the bits together)
Продолжаем до конца потока входных бит:
Bit #45
001100010001001110111111110001110101101011011001100
1101101 <- generator polynomial (mask)
-------
1001100 = 1 (xor the bits together)
Результат кодирования с помощью первого генератора, g0
:
100011100111110100110011110100000010001001011
Результат кодирования с помощью g1
:
110011100010110110110100101101011100110011011
Ниже приведен (простой) алгоритм для вычисления бит четности:
def encode(bits: List[int], polynomial: List[int], tail_bite=False):
"""Сверточное кодирование потока бит с помощью генераторного полинома.
Если tail_bite == True, добавляем хвост входных данных. В противном случае заполняем нулями. """
if tail_bite:
tail = bits[-(len(polynomial) - 1):]
else:
tail = [0 for i in range(len(polynomial) - 1)]
full = tail + bits
polynomial.reverse() # Реверсируем полином, так как работаем в обратном направлении
parity_bits = []
for i in range(len(bits)):
parity = 0
for j in range(len(polynomial)):
parity ^= full[i + j] * polynomial[j]
parity_bits.append(parity)
return parity_bits
Затем эти две последовательности битов четности чередуются (abab…):
1 0 0 0 1 1 1 0 0 1 1 1 1 1 0 1 0 0 1 1 0 0 1 1 1 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 1
1 1 0 0 1 1 1 0 0 0 1 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 1 1 1 0 0 1 1 0 0 1 1 0 1 1
result:
110100001111110000101110111100110100111100011010111001110001000101011000010110000111001111
Перфорирование
На этом этапе мы перешли от 45 к 90 бит. Скорость этого сверточного кода равна ½ (на один входной бит генерируется 2 бита четности).
Скорость ½ в данном контексте маловата (рекомендую почитать статью о скорости работы QR-кодов). Ее можно повысить путем «перфорирования» кода, подразумевающего удаление каждого третьего бита. Так мы увеличим скорость до ¾:
110100001111110000101110111100110100111100011010111001110001000101011000010110000111001111
11 10 00 11 11 00 10 11 11 10 11 10 11 10 01 01 11 00 11 00 00 10 01 00 01 11 00 11 00 11
result:
111000111100101111101110111001011100110000100100011100110011
Это равнозначно перфорированию последовательностей двух бит четности с паттернами 101
и 110
перед их чередованием. Перфорирование – это красивый и простой способ увеличить скорость кода после оценки частоты ожидаемых ошибок.
Пермутация
После этого Spotify перемешивает данные, чтобы в случае утраты всего штриха ошибки распределились по всей структуре:
Процесс перемешивания используется для распределения потенциальных ошибок (например, если утрачивается целый штрих/интервал). В итоге утраченные биты в кодовом слове идут непоследовательно, что увеличивает эффективность упреждающей коррекции ошибок, когда утрачивается целый штрих или интервал. Далее, чтобы отсканировать оптический код после того, как длины найденных штрихов достоверно конвертированы в биты, эти биты перемешиваются обратно в правильном порядке.
Источник
Перемешивание бит происходит путем выбора из входных данных каждого 7-го (по модулю 60).
def permute(bits, step=7):
for i in range(len(bits)):
yield bits[(i * step) % len(bits)]
Вход и результат:
111000111100101111101110111001011100110000100100011100110011
111100110001110101101000011110010110101100111111101000111000
Сопоставление с высотами штрихов
В завершении с помощью кода Грея биты сопоставляются с высотами штрихов, чьи значения варьируются от от 0 до 7:
Десятичный Двоичный Грей
0 000 000
1 001 001
2 010 011
3 011 010
4 100 110
5 101 111
6 110 101
7 111 100
111 100 110 001 110 101 101 000 011 110 010 110 101 100 111 111 101 000 111 000
5 7 4 1 4 6 6 0 2 4 3 4 6 7 5 5 6 0 7 0
В качестве точек привязки добавляются три дополнительных штриха: в начале, в конце и в 12-й позиции:
[0]5741466024[7]3467556070[0]
В результате получается итоговый код Spotify:
Декодирование
Еще раз повторим, зачем мы прошли через процесс вычисления CRC и сверточного кодирования данных:
- Сверточные коды позволяют нам исправлять ошибки в сообщении путем отправки вместе с этим сообщением «избыточных» бит.
- CRC позволяет клиенту проверять достоверность декодированного кода Spotify. Если контрольные биты оказываются не верны, клиент может просканировать код повторно. Если же они сходятся, тогда клиент может обратиться к серверам Spotify. Как говорит Людвиг: «Я решил включить CRC, чтобы позволить клиенту с легкостью отклонять неверные коды без необходимости обращения к бэкенду».
Процесс преобразования изображения кода Spotify в медиа-ссылку следует примерно тем же шагам, что и кодирование в обратном направлении. Однако по декодированию сверточного кода есть немаловажная теоретическая часть.
Сверточное декодирование
Глубокое знакомство с различными алгоритмами, используемыми для декодирования сверточного кода, выходит за рамки текущей статьи. Однако я настоятельно рекомендую вам ознакомиться с этими конспектами MIT, посвященными алгоритму Витерби, чтобы сформировать отчетливое понимание об одном из таких алгоритмов.
Если коротко, то он предоставляет способ определения более вероятной исходной последовательности на основе потоков бит четности. Эта треллис-диаграмма является визуальным представлением алгоритма – нахождение пути с наименьшим числом ошибок через потоки бит четности.
Треллис-диаграммы представляют удобный способ просмотра задачи декодирования и помогают понять эволюцию конечного автомата во времени
Рабочее решение
Если вы хотите увидеть рабочий декодер, то можете ознакомиться с этим кодом. Вам понадобится получить от Spotify личный токен доступа, потому что код должен обращаться к их серверу поиска соответствий media_ref -> uri
. Отмечу, что в коде задействуется решение Дойла из разряда линейной алгебры.
Я проверил это решение еще на нескольких кодах Spotify:
heights: [0, 6, 6, 0, 7, 6, 0, 2, 2, 3, 1, 7, 0, 7, 6, 4, 6, 1, 4, 7, 4, 1, 0]
media ref: 26560102031
uri: spotify:track:1ykrctzPhcSS9GS3aHdtMt
heights: [0, 2, 6, 7, 1, 7, 0, 0, 0, 0, 4, 7, 1, 7, 3, 4, 2, 7, 5, 6, 5, 6, 0]
uri: spotify:user:jimmylavallin:playlist:2hXLRTDrNa4rG1XyM0ngT1
media ref: 67775490487
heights: [0, 5, 7, 4, 1, 4, 6, 6, 0, 2, 4, 7, 3, 4, 6, 7, 5, 5, 6, 0, 5, 0, 0]
uri: spotify:user:spotify:playlist:37i9dQZF1DWZq91oLsHZvy
media ref: 57639171874
Думаю, будет уместно поделиться показавшимся мне забавным предложением из статьи об алгоритме Витерби:
Вскоре после этого, в работе, вышедшей 23 мая 1968 года, Джим Омура заметил, что VA (алгоритм Витерби) был просто стандартным решением прямого динамического программирования для декодирования по максимальному правдоподобию динамической системы с дискретным временем и конечным состоянием, наблюдаемой в шуме без запоминания.
Не знаю как вы, но я бы не стал описывать «стандартное решение прямого динамического программирования для декодирования по максимальному правдоподобию динамической системы с дискретным временем и конечным состоянием, наблюдаемой в шуме без запоминания» словом «простое».
Целью моей статьи было попытаться объяснить процесс кодирования Spotify доступным образом. Надеюсь, что мне это удалось.
Дополнительные материалы
Как спрятать мусор в базе Spotify и превратить это в квест
CRC Rocksoft
Reed-Solomon Codes and the Exploration of the Solar System
High-Rate Punctured Convolutional Codes for Soft Decision Viterbi Decoding
Viterbi Decoding of Convolutional Codes
Convolutional codes (MIT lecture notes)
Viterbi Decoder
Punctured Convolutional Encoding
Performance of concatenated codes for deep space missions
Convolutional Codes and State Machine View/Trellis (MIT Slides)
The Error Correcting Codes Page
Explanation on Math Stack Exchange
Со слов одной пожилой женщины…
Маланью в нашей деревне знали как первоклассную повитуху. Почти все местные детишки с ее помощью на свет появились. До районной-то больницы несколько часов езды, пока доберешься — десять раз родить успеешь, а Маланьюшка тут, под боком, всегда помочь готовая. Детей своих у нее не было, Бог не дал, муж помер давно, вроде как ничего, кроме любимого ремесла у нее в жизни и не осталось. А дело свое она знала.
Случилась в нашей семье беда. Сестрица моя девятнадцатилетняя, Сонюшка, забеременела от женатого мужчины. «Нагуляла», — как тогда говорили. Мужик тот видный был, в деревне его уважали, да и в колхозе человек не последний. Семья у него к тому моменту немалая была: шестеро детишек подрастали. В общем, обрушился на нашу Соню народный гнев. Пальцем в нее в ту пору только ленивый, да глухой не тыкал. Жена того мужчины так и вовсе за волосы драть приходила. А она ничего, держалась. Да и что же тут поделаешь, полюбила, доверилась, а оно вон как вышло-то. Благо, батька с мамкой у нас добрые были, со двора не прогнали, жалели даже, поддерживали.
Вот пришла Сонюшке пора рожать. На дворе вечер поздний, темнотища, хоть глаз выколи, да и зима, вьюга свирепствует — в общем, о больнице и речи не шло. Пригласили Маланью. Та явилась быстро со всем своим оборудованием, всех нас из комнаты прогнала (хочу, мол, с роженицей одна остаться, чтобы вы тут не мешались!). Соня за стенкой кричит, надрывается, а мы все в горнице столпились. Ждем.
И тут слышу я, что в дверь входную кто-то стучит. Громко так, отчетливо, ни с чем не спутаешь. Кого это, думаю, принесло на ночь глядя? Не иначе жена отца ребеночка опять скандалить заявилась, вот уж нашла время, ничего не скажешь! А семейство мое сидит как ни в чем не бывало, будто окромя меня и не слышит никто стука этого. Ладно, встала, пошла открывать. Отпираю, значит, дверь-то, а за ней никого. Темно, холодно, снег валом валит, и ни души. Стою, рот раскрыла, не знаю, чего и думать… И вдруг чувствую, как мимо меня кто-то прошел. Вот ей-богу не поверите: нет вроде никого, а ощущение такое, что кто-то невидимый в дом проходит, даже как будто меня слегка коснулся. Страшно мне стало как никогда в жизни! Я дверь заперла и со всех ног обратно, в горницу, к своим. Рассказывать, конечно, ничего не стала, не до того им было, чтобы мои сказки слушать.
Сидим дальше, ожидаем. И тут вбегает к нам Маланья, вся взъерошенная, напуганная, глаза безумные. Забежала, и сразу в угол к иконам. Рухнула на колени и давай кричать: «Господи, прости… Не убивеца я… Не убивеца…. Не буду, не могу… Господи, спаси, сохрани и помилуй!». Мы к ней, давай расспрашивать, что приключилось. А она на ноги вскочила и снова в комнату к Сонечке.
У сестры мальчик родился. Крупный, голосистый — настоящий богатырь! Как все успокоилось, мы Маланью в горнице посадили, чарочку ей поднесли и снова спрашивать начали, чего это она к иконам ринулась. Тут уж она не сдержалась и рассказала:
«Была я тогда совсем еще молодая. Мать меня повивальному делу обучила. Поначалу я ей помогала, а как она померла, сама стала детишек принимать. То ли Боженька меня каким талантом наградил, то ли мамка постаралась, но получалось у меня это очень хорошо. Бабы даже шутили, что тебе, Маланьюшка, на доктора бы выучиться.
Так вот, жила тогда в нашей деревне девка Варвара, которая, ну вот вроде вашей Соньки, от женатого понесла. Мужичок был зажиточный, семейство большое. Позорили все Варьку, мать дите вытравлять заставляла, а она ни в какую: рожу и все тут. И вот однажды, когда у девки-то уж пузо на нос лезло, заявилась ко мне жена мужика того.
— Ну, — говорит, — Маланья, ребенка Варвариного поди ты принимать будешь?
— А что ж, хоть бы и я, — отвечаю, — мне то что, я вон скольким помогла народиться, и этому, даст Бог, помогу!
Она глазами от злости сверкает и говорит:
— Не надо ему родиться, ох, не надо! Муж говорит, что Варьку любит. Уйти к ней грозится, как только дите появится. Я тебе сколь хошь заплачу, только сделай так, чтобы ни потаскухи этой, ни ребенка ее на свете не было.
Я поначалу испугалась, прогнать ее хотела в три шеи, а потом задумалась. Ведь я же в ту пору замуж собиралась, деньги на свадьбу ой как нужны были. А сделаю все, как она просит, никто ж не дознается: мало ли, от чего баба при родах помереть может. Да и кто разбираться-то станет? Родителям может и легче, избавятся от позора на свои головы.
В общем, согласилась я. Вышло все благополучно, никто даже не подумал, что я к Варвариной смерти руку приложила. Только, видать, права пословица — как аукнется, так и откликнется. В жизни моей все с тех пор кувырком пошло. Жили с мужем чуть не с самой свадьбы как кошка с собакой. Я надеялась, что как детишки пойдут, все наладится, да куда там, не рождались у меня детки, как не старалась. Муж корил меня за это, говорил, что не нужна я ему пустая. Уйти собирался, но не успел, погиб — грозой его убило.
Осталась я вдовой. Мужики сватались ко мне, конечно, но я их всех гнала. Решила: поделом мне, буду одна век вековать, может хоть грех свой искуплю. Работала по-прежнему, никому в помощи не отказывала, стольким малюткам родиться помогла, уж и не сосчитать. А Варвара у меня из головы все не шла. В снах часто мне являлась, а иногда проснусь средь ночи и вижу будто она передо мной стоит. Не знаю, казалось ли, нет ли.
Спросите, чего я об этом? А вот чего… Притащилась ко мне с месяц назад Настасья — ну, жена того, что Софью вашу обрюхатил. Зашла и прям с порога мне в ноги кинулась: помоги, мол, Маланьюшка, сил моих больше нет. Сказала, что Егор, муж-то, ее с дитями бросить хочет, к Соньке уйти. Жить де без нее не может, извелся весь. В общем, стала просить, чтобы я разлучницу и ребенка ее извела. Уж какие слова говорила, как плакала, и не передать! Даже не знаю, как ей и убедить-то удалось, но уболтала она меня, дуру старую. Вот истинный крест, казалось тогда, что правильно это, что сама Сонька виноватая — нечего мужика чужого из семьи уводить.
И вот, осталась я, значит, с девкой вашей в комнате одна. Софья по кровати мечется, в схватках заходится, а я тряпку взяла и думаю: сейчас лицо ей накрою, подержу и сделано дело — задохнется она. Склонилась уж над ней, и тут вдруг слышу будто дверь позади меня скрипнула. Испугалась, обернулась и обомлела: стоит передо мной Варвара. Белая вся, как полотно. Глазищами своими на меня таращится и шипит сквозь зубы: «Не смей! Не смей!». Бросила я тряпку и вон из комнаты. В голове прям в секунду все перевернулось: как я могу, что я делаю… Зареклась ведь зло творить, а сама…»
Не стали мы Маланью корить. Покаялась все-таки, не загубила живую душу. И про ту, старую, историю смолчали, не рассказали никому. Сделанного не воротишь, а ей до конца дней и так маяться. Сонечка наша быстро оклемалась, сынишкой занялась, мать из нее хорошая получилась. Егор к ней долго еще ходил, в любви клялся, обещал из семьи уйти, да не приняла она его, не хотела счастья ворованного. А через два года посватался к ней один молодой вдовец, хороший человек. Вышла Соня замуж и уехала от нас в соседнее село. Ну, а я думаю: слава Богу, что я тогда Варвару в дом впустила…
Самые жуткие истории из реальной жизни читать. Эта история одной повитухи, которая возомнила себя богом-решая кому жить, а кому нет..
Зинаида склонилась над стонущей роженицей. «Тужься сильнее, кому говорю»,- прикрикнула она на молодую женщину.
Повитухой Зинаида была много лет. Практически каждая семья из окрестных деревень в брянской глубинке хоть раз обращалась к ней за помощью.
До райцентра далеко, из транспорта — автомобиль председателя колхоза, да лошади. Не каждая рискнет ехать на повозке в город, когда схватки уже начались. Кроме того все знали, что местная повитуха не только помогает новорожденным приходить в этот мир, но и тайно избавляет женщин от нежеланных детей, прижитых от внебрачных связей.
Поэтому без работы Зинаида не сидела. Хотя в деревне ее недолюбливали. Считали чудачкой, а некоторые и вовсе ведьмой. Поговаривали, что она занимается колдовством и лучше держаться от нее подальше.
«Будешь ты наконец тужиться? — Зинаида опять накинулась на роженицу.
«Я не могу, не могу», — простонала женщина.
«А с Натальиным мужем могла? Значит сможешь родить то, что у вас получилось», — огорошила повитуха.
«Боже мой, откуда она узнала? Точно ведьма», — в ужасе подумала роженица.
Наконец все закончилось. На свет появилась не одна, а сразу две малютки. Обе малышки, завернутые в белые пеленки, лежали у матери на груди.
Убедившись, что уставшая женщина заснула, повитуха на цыпочках подошла к ней и потихоньку вытащила одну из девочек. Зажав маленький носик пальцами, она опустила головку в таз с водой.
Малышка пыталась кричать, но только заглатывала воду. Через две минуты все было кончено. Зинаида положила остывающее тельце обратно к матери, собрала свои вещи и подошла к зеркалу, чтобы надеть платок.
В отражении она вновь увидела свое лицо, обезображенное шрамами. Из глаз потекли слезы.
«Сколько лет прошло, а я все не могу смириться с судьбой», — горько подумала Зинаида.
Воспоминания нахлынули на нее липкой волной. Вот она, первая красавица на селе, возвращается домой через лес. Черная тень преграждает ей дорогу. Дальше — дикая боль, стыд.
Ужас и отчаяние от непоправимых последствий. Когда отец узнал, что изуродованное лицо — это еще не все, отвел Зинаиду к знахарке, которая избавила ее от постыдного плода, а заодно навсегда лишила возможности иметь желанных детей.
Она вновь остро почувствовала жгучую обиду на весь белый свет, на злую судьбу и на Бога, который не был к ней справедлив.
«Теперь я сама могу распоряжаться судьбами людей — решать кому жить, а кто покинет этот мир, не успев в него прийти», — торжествующе подумала Зинаида.
Она надела валенки, тулуп, голову повязала пуховым платком. Сев в сани, запряженные гнедой кобылой, она отправилась в обратный путь в свою деревню.
Дорога была неблизкая и вела через лес. Уже совсем стемнело, когда Зинаида оказалась в самой чаще. Вдруг за спиной она услышала тихий плач.
Повитуха обернулась, но никого не разглядела в темноте. На всякий случай хлестнула коня, чтобы тот прибавил ходу. Зинаида почти выехала из чащи, когда перед санями что-то мелькнуло.
Конь испугался, встал на дыбы, сбросил хозяйку с саней и помчался галопом прочь. Женщина упала на накатанную дорогу и почувствовала острую боль в ноге.
Идти дальше было невозможно, поэтому Зинаида решила доползти на четвереньках хотя бы до крайнего дома в своей деревне, где ей наверняка помогут.
Но всего через несколько метров, она вдруг почувствовала, как маленькие холодные ручки трогают ее за плечи.
«Это невозможно, здесь никого нет, — пронеслось у нее в голове. — Никто не может проникнуть под толстый тулуп».
Зинаида медленно обернулась и в ужасе застыла. В холодном лунном свете она увидела сотни новорожденных младенцев, стоящих каким-то чудом на своих маленьких неокрепших ножках.
Среди них она сразу узнала девочку, которую утопила всего пару часов назад. Звук, который повитуха поначалу приняла за шум ветра, нарастал и окружал ее со всех сторон. Постепенно Зинаида разобрала слова. Маленькие губки громко шептали:
«Мы имели право жить».
Не обращая внимания на боль, повитуха вскочила и побежала. Но почти сразу же упала в сугроб. Зинаида пыталась выбраться, плакала, кричала, но маленькие ручки с удивительной силой удерживали ее в снегу.
Утром односельчанин обнаружил валенки, торчащие из сугроба. Потянув за них, он вытащил Зинаиду. Рот, нос и уши были залеплены снегом, лицо посинело, на нем застыла гримаса отчаяния.
И только присмотревшись, мужчина заметил вокруг сотни следов маленьких ножек.
Вы можете читать самые жуткие истории на сайте Мир Фантастики и Фэнтези, абсолютно бесплатно, а если поделитесь статьёй в соцсетях, то очень поможете сайту, а мы в свою очередь, постараемся писать больше интересных историй для вас.
Автор Роман Кац
Также наши рассказы можно почитать на Яндекс Дзен, ссылка на канал в Дзене:
Капучино
Дорогой читатель, если понравился рассказ, если не сложно, поделись в соцсетях. Это нужно для развития сайта. Спасибо, что читаете.
Глава 8. Повитуха и роженица
Повитухой была Бородиниха, мать одной из подруг Марии, ей было за шестьдесят лет, вредная, грубая и строгая женщина. Находиться с ней в одном обществе, было неуютно и неприятно.
Мария с детства боялась ее и не любила, к тому же, она была матерью «горбуна», его прозвали горбуном из-за большого горба на всю спину и грудь, он всюду совал свой нос и доносил начальству, в деревне его все боялись и ненавидели.
— Нюрочка, милая, не хочу ехать к Бородинихе! Там тятя с мамой узнают, убьют меня, или выгонят из дома! Не поеду, лучше умру здесь, но не поеду! — И снова схватки и снова невыносимая боль, и душераздирающие крики.
Видя страдание молодой роженицы, Семен вспомнил свою жену. Он рассказал, как она при родах мучилась и не могла разродиться, повитухи тогда не было, ребенок шел ножками, так вот и похоронил и жену, и не родившегося ребенка.
— Василий, нельзя везти роженицу, это очень опасно! Я сам привезу повитуху сюда, отсюда не далеко, а там спрошу, где она проживает!
— Ах, Семен, сам Бог тебя направил сегодня сюда, только не задерживайся, измучилась девчонка!
— Я быстро! — на ходу крикнул он, запрыгнув в телегу, мотнул хлыстом, лошадь тронулась с места и через пару минут скрылась за зарослями.
Пасечник разжег печку, налил воды в большой котел, и поставил на плиту, — горячая вода нужна будет повитухе! — объяснил он.
Нюра сидела рядом с Марией и поглаживала ее живот.
— Как хорошо ты гладишь, Нюр, так кажется легче!
— Я согласна гладить тебя, подруга, сколько угодно, лишь бы ты не кричала!
— Чтобы я делала без тебя, Нюр? — прелестные губы ее затряслись, а из глаз скатились слезинки.
— Да ладно, подруга, ты лучше расскажи, где сейчас отец твоего ребенка, какой он?
— Нюрочка, если бы ты видела его, он такой! — глаза ее остановились в одной точке, будто она видит его и рассказывает. — Он высокий, стройный, лицо смуглое, нежное. Глаза темно-серые с поволокой, ресницы густые и пушистые, брови черные, строго очерченные губы. Военная форма ему очень идет, а еще ремень через плечо, ну, глаз не оторвать!
— Он, что офицер?
— Да, офицер, в чине капитана! Мы хотели пожениться с ним, когда он узнал, что я беременна, приходил к моей тетке, просил моей руки! Но она… выставила его за двери! А меня… на следующий день отправила к маме, даже попрощаться не дала и, адресами мы не обменялись! Я знаю, он приходил к ней, просил мой адрес, но она, чтобы ей пусто было! Вот так, мы потеряли друг друга.
Ой, Нюрочка, опять началось, если бы ты знала, как больно!
— Потерпи подруга, потерпи, cкоро мучения твои закончатся!
— Все равно, — продолжала Мария через боль, — я найду его, приеду к нему с дочкой или сыном, вот уж будет рад мой Ванечка!
— Я представляю, Мария, вашу встречу и рада за вас, только ты не сдавайся, ищи его, и обязательно встретишься с ним!
Внезапно залаяли собаки.
— Тррр. Вот и приехали, — послышался мужской голос.
— Мария, Бородиниху привезли, — сказала Нюрка и вскочила с топчана.
— Не уходи, я боюсь её, сейчас будет, матюгать, ты же знаешь, какая она матерщинница?
— Не уйду, Мария, не бойся! — и крепко сжала её руку.
Еще с крыльца, Бородиниха прогремела басистым, звучным голосом.
— Ну, где тут роженица? — она как приведение, мгновенно оказалась в доме и остановилась у топчана, на котором корчилась от боли Мария. На голове повитухи белый платок, завязанный узлом под тонкой морщинистой бородой, серая кофта обтягивала ее упитанную фигуру, напольная широкая юбка скрывала её обувь.
Изумленно посмотрев на роженицу, она широко раскрыла глаза. Прикусив тонкие губы, она несколько секунд молчала, затем с нескрываемым удивлением спросила: — Мария, ты что ли?
— Я, бабушка, — стыдливо ответила она, закрыв ладонями лицо.
— Не плачь, милая, с кем не бывает? Не бойся меня, все будет хорошо! — она оглянулась на мужчин.
— А вы, мужики, идите на улицу, нечего вам тут глазеть!
Мужчины виновато переглянулись и вышли, закрыв за собой дверь.
— Ну, вот порядок! — удовлетворенно сказала повитуха и повернулась к Марии, — ты не стесняйся меня, я перевидела на своем веку всяких и продольных, и поперечных, так что твоя красавица меня не удивит! Теперь слушай только меня, я буду тебе говорить, а ты исполнять, поняла?
— Да, бабушка, поняла, — смущенно ответила Мария.
— Вот и хорошо! «Подними подол повыше и раздвинь шире ноги, вот так, молодец!» Ну, что мы имеем? — спросила она себя, засовывая свои пальцы в промежность Марии.
— Хорошо, хорошо, — пробасила она.
От прикосновения рук отвратительной старухи, Марию передернуло, но в ее положении выбора не было.
— Кого ждешь дочь, или сына?
— Не знаю, — почти беззвучно ответила она.
— А кого бы ты хотела?
— Никого!
— Как никого? — изумленно выкрикнула повитуха.
— Я тятю с мамой боюсь, они убьют меня!
Бородиниха сжала свои губы, поправила платок на своей седой голове и туже завязала концы.
— Бояться надо было, когда ноги раздвигала перед отцом ребенка, теперь никуда не денешься, ребенок у тебя будет, и не бойся родителей, не ты первая так рожаешь!.. — А таких родителей, как у тебя, редко встретишь, повезло тебе с ними!
— Бабушка, мне на двор хочется, пустите меня! — она резко приподнялась, ее светло-русые волосы рассыпались на подушке.
— Эге нет, Мария, вставать нельзя, это потуги, а не то, что ты думаешь! — сказала она, убрав пряди её волос с подушки, — лежи спокойно!
Она еще заглянула под подол, пощупала. Марию снова передернуло.
— Ничего, Мария, потерпи, ты думаешь, я не знаю, как тебе неприятны мои прикосновения? Ну, что поделаешь? Все роженицы проходят через это! Ну, вот твоя красавица подготовилась к родам, ребенок идет правильно головкой к выходу!
Через несколько минут, Мария ощутила, как из нее потекло что-то горячее.
— Что это? — испуганно выкрикнула она.
— Вот и воды отошли! — пояснила повитуха.
И вдруг Марию резанула пронизывающая боль, она пыталась сдержать крик, но не смогла. На ее крик забежали собаки, сели у порога и стали жалостно скулить.
Повитуха оглянулась на них, — что и вы такое испытали? Не скулите, все уже хорошо! Нюр, неси воду и тряпки, мы рожаем!
А Нюрка давно уже стоит за её спиной и ждет указаний.
— О-о-о-ой! — закричала Мария. — Ой, бабушка, больно!
— А ты кричи, дочка, кричи! Это отвлечет боль.
Лицо Марии покрыли капельки пота, у нее усилились потуги. — У-у, — сдерживая крик, произнесла она.
— Тихо, Мария, не тужься, отдохни! — Через мгновение: — теперь давай еще немного!
И так несколько раз пока из неё не выскользнуло, что-то большое и живот сразу же исчез. От изнурительной боли и напряжения она, наконец, почувствовала облегчение.
— Ну, слава Тебе, Господи! — пробасила повитуха, — все прошло отлично! Поздравляю, Мария, у тебя дочка! Молодец, помощницу себе родила!
От растерянности Мария не знала, что ей сказать и смотрела на неё, как она держит на руках ее девочку, она напоминала живую куклу.
Повитуха, вдруг поддала шлепок по её ягодице, и она пискливо закричала.
Мария впервые услышала крик младенца, сердце у нее сжалось от жалости, — зачем вы ее ударили, бабушка?
Повитуха тут же объяснила: — Это для того, чтобы ребенок закричал, тогда из него выйдет воздух, и он задышит своими легкими, поняла, мамочка?
— Поняла, — робко ответила Мария.
Затем повитуха обработала малышку, запеленала и подложила ее к Марии. — Корми, худенькая она у тебя! Вставать не торопись, отлежись вначале! А — я поеду домой, пора мне! Тебе я больше не нужна!
Мария взяла её за руку, умоляюще посмотрела ей в глаза, — спасибо, бабушка, и, пожалуйста, не говорите в деревне, что я.
— Да нет, не переживай, я все понимаю, за меня не бойся, я никому не скажу!
За труды повитухи, пасечник налил трехлитровую глиняную крынку меда. Бородиниха была довольна щедростью пасечника и шутливо сказала: — Если еще, Василий, надумаешь рожать, зови, всегда помогу!
— Непременно позову! — тоже в шутку сказал он.
После родов Мария уснула.
Нюра не отходила от нее, переживала, куда пойдет она с ребенком, перебрала все варианты, все было не так. — К отцу с матерью не пойдет, на пасеке тоже не останется, кто он ей дядя Вася? Чужой человек, спасибо, что приютил, если бы не он, что было бы с ней, страшно даже представить! Может, на гурты? Там будем, помогать ей, а дальше будет видно!
Проснувшись, Мария обрадовалась Нюрке, что не бросила ее, не ушла.
— Тебе же коров доить, Нюр! Ты иди, а я попрошу дядю Васю, чтобы разрешил мне побыть у него дня два, сейчас я не смогу дойти!
— Куда тебе? Лежи! Я сама попрошу его, чтобы присмотрел за тобой! За коров не переживай, я сама буду доить, и девчата помогут! А за тобой мы придем, жди!
— Ну, пока, подруга, — она обняла Марию, — не вешай нос, все будет хорошо! В обиду тебя не дам!
Мария с благодарностью посмотрела на неё, — спасибо тебе!
— Да, что уж там? Не стоит, отдыхай! Она вышла из дома и быстро скрылась за кустарниками.
— Она умерла… Она таблеток наглоталась, врачам не удалось спасти её…
- Истории из жизни
- 0 Комментарий
— Дашка! Иди сюда!- позвал жену Денис, а когда она появилась на пороге комнаты, недовольно проворчал. — Скоро ты свои котлеты дожаришь? Уже вся квартира провоняла! — Денис, милый, — улыбнулась Даша, — ну потерпи немного, я уже заканчиваю. Третья партия почти готова. Осталось только упаковать всё и отвезти. Ты поможешь мне? — Извини, не …
— Папа, папка, папочка! — шептал парень на могиле, — Отец, прости меня за всё !
- Истории из жизни
- Aрина
- 0 Комментарий
За спиной Андрея глухо лязгнула тяжелая железная дверь. От этого звука Андрей вздрогнул и обернулся – всё, он на свободе! От звонка до звонка отсидел три года… И, казалось бы, за что? Просто связался Андрюха после школы с дурной компанией. И однажды они взяли его с собой на дело. Он даже ничего не делал – …
— Я знаю, как доставить мужчине настоящее удовольствие. Тебе понравится
- Истории из жизни
- Aрина
- 0 Комментарий
Антон взглянул на Романа, склонившегося над компьютером и, улыбнувшись, позвал его: — Ромка, пошли пообедаем. Все ушли на перерыв… Или перед Пал Палычем выслуживаешься? Думаешь, шеф за это тебе премию подкинет? Роман никак не отреагировал на его слова, он был полностью погружён в работу и очнулся только тогда, когда Антон хлопнул его по плечу: — …
— Мы ничего не можем сделать, ваша девочка умрёт в течение года, — сообщил врач
- Истории из жизни
- Aрина
- 0 Комментарий
Анна с Сергеем мечтали о большой и дружной семье — чтобы детей не менее трёх, а лучше четверо. Два мальчика и две девочки… А что? Финансы им позволяют! У Сергея автомобильный бизнес, приносящий неплохой доход. У Анны отец — владелец небольшого мясоперерабатывающего комбината. Когда Анна с Сергеем поженились, Владимир Николаевич им подарил шикарный особняк в …
— Вот скажи, зачем девочке такая большая квартира? А нам самый раз
- Истории из жизни
- Aрина
- 0 Комментарий
— Ну и что будем делать? — Что-что. Ты уверена, что получится всё с квартирой? — Да тут даже не переживай. Нинка сразу завещание написала. В случае, если я удочеряю Валентину, то квартира переходит мне. — Неплохо. То есть накладок никаких быть не должно? — Вроде нет. — Тогда нечего и думать, а то найдётся …
Короткие и самые интересные рассказы из жизни на любые темы. Яндекс Дзен лета читать лёгкое чтение славные рассказы. Читаем новые, короткие на дзен разные рассказ о любви, истории из жизни, реальные деревенские истории, юмор, смешные случаи, странички из жизни! Здесь вы найдётся для мужчин и женщин.Читать онлайн бесплатно в хорошем качестве. Мир рассказов служанки и людей 1. Лёгкое чтение мавридика де монбазон.