Рассказ о грехопадении начинается с

Javascript это фантастический язык для серверного программирования, так как он поддерживает асинхронное выполнение кода. но это ещ и усложняет

JavaScript — это фантастический язык для серверного программирования, так как он поддерживает асинхронное выполнение кода. Но это ещё и усложняет его использование.

Асинхронность означает возможность написания кода, который не подвержен обычным проблемам, связанным с потокобезопасностью, и поддерживает выполнение множества задач в «параллельном» режиме. Например — ожидание считывания файла не блокирует другие вычисления.

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

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

Эти соединения что-то захватывало.

Речь идёт о кодовой базе в миллионы строк кода, которой в течение нескольких лет занимались десятки программистов. Может — проблема заключается в неразрешённых промисах? Я решил исследовать этот вопрос.

Проблема останова поднимает голову

Поиск неразрешённых промисов — это пример попытки решения проблемы останова, а известно, что не существует общего алгоритма решения этой проблемы.

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

Google выдал мне несколько страниц, где обсуждают неразрешённые промисы. Эти обсуждения всегда сводятся к тому, что не надо писать изначально некачественный код.

Типичное решение проблемы останова заключается в том, чтобы добавить в систему временные ограничения. Если функция не завершает работу в пределах N секунд — мы считаем, что она где-то застопорилась. Может, это и не так, но мы решаем, что это так, и «убиваем» программу.

Именно поэтому и существуют тайм-ауты соединений. Если сервер остановился — мы не собираемся ждать его вечно. Это важно при разработке распределённых систем.

Но «убийство» процесса сервера при каждом недоразумении — это решение не идеальное. И, кроме того, оснащение каждого промиса в кодовой базе тайм-аутом — это, в лучшем случае, очень сложно.

Но не так всё плохо! Проблему останова можно решить для подмножества распространённых паттернов.

Паттерны проблемных промисов

В прочитанной мной публикации «Нахождение проблемных промисов в асинхронных JavaScript-программах» Алимадади с соавторами выделили распространённые паттерны, которые приводят к появлению неразрешённых промисов, и представили программу PromiseKeeper. Эта программа находит потенциально неразрешаемые промисы с использованием графа промисов.

▍Краткий рассказ о JavaScript-промисах

Та публикация начинается с обзора JavaScript-промисов.

Промисы представляют асинхронные вычисления и могут пребывать в трёх состояниях: pending (ожидание), fulfilled (успешное разрешение) и rejected (отклонение). Вначале они оказываются в состоянии pending.

Код, реагирующий на результат работы промиса (обработчик определённого события), регистрируют с помощью метода .then().

// Немедленно разрешается со значением 17
const promise = Promise.resolve(17)
promise.then(
  function fulfilledReaction(value) {
    console.log({ value })
  },
  function rejectedReaction(error) {
    console.log({ error })
    throw error
  }
)

В коде, на практике, опускают второй параметр для того чтобы сосредоточиться на коде, который выполняется при успешном разрешении промиса (fulfilledReaction). Обычно так поступают при построении цепочек промисов:

// Немедленно разрешается со значением 17
const promise = Promise.resolve(17)
promise.then(value => value + 1)
       .then(value => value + 1)
       .then(function (value) => { console.log(value) })

Каждый вызов .then() приводит к созданию нового промиса, который разрешается возвращаемым значением кода, реагирующего на завершение работы предыдущего промиса. Обратите внимание на то, что последний вызов неявно разрешается со значением undefined. Дело в том, что в JavaScript функция, которая не возвращает что-либо, неявным образом возвращает undefined.

Важная деталь.

В цепочку промисов можно добавить механизм обработки ошибок с использованием .catch():

// Немедленно разрешается со значением 17
const promise = Promise.resolve(17)
promise.then( ... )
       .then( ... )
       .then( ... )
       .catch(err => ...)

Каждый промис, созданный .then(), неявно определяет код, реагирующий на отклонение промиса, аналогичный конструкции err => throw err. Это значит, что .catch() в конце цепочки промисов может отреагировать на ошибки, возникшие в любом из предыдущих промисов.

На практике редко полагаются на стандартный механизм обработки успешно разрешённых промисов, но следующий код корректен:

// Немедленно разрешается со значением 17
const promise = Promise.resolve(17)
promise
  .then(undefined) // используется стандартный механизм value => value
  .then((value) => console.log(value))

Полагаю, подобное чаще происходит случайно, чем намеренно.

Промисы можно связывать, используя один промис для разрешения другого промиса:

const p0 = Promise.resolve(17) // Немедленно разрешается
const p1 = Promise.reject("foo") // Немедленно отклоняется
p0.then(function (v) {
  return p1
})

Здесь состояние промиса p0 связано с p1. То есть — неименованный промис, созданный в строке 3, отклоняется со значением foo.

В реальном коде можно видеть много подобных конструкций. Часто они устроены не так понятно, как эти.

▍Паттерн №1: необработанное отклонение промиса

Обычным источником ошибок при работе с промисами являются необработанные отклонения промисов.

Это происходит, когда неявно отклоняют промис, выдавая ошибку в коде, реагирующем на успешное завершение промиса:

promise.then(function (val) {
  if (val > 5) {
    console.log(val)
  } else {
    throw new Error("Small val")
  }
})

Так как код, реагирующий на успешное завершение промиса, выполняется в отдельном асинхронном контексте, JavaScript не передаёт эту ошибку в главный поток. Ошибка «проглатывается» и разработчик никогда не узнает о том, что она произошла.

Исправить это можно, использовав метод .catch():

promise
  .then(function (val) {
    if (val > 5) {
      console.log(val)
    } else {
      throw new Error("Small val")
    }
  })
  .catch((err) => console.log(err))

Теперь у нас появляется возможность обработать ошибку.

Но мы не перевыбросили эту ошибку! Если другой промис, связанный с этим, или объединённый с ним в цепочку, полагается на этот код, ошибка будет оставаться «проглоченной». Код продолжит выполняться.

Попробуйте следующее в консоли браузера:

const p = Promise.resolve(17)
p.then(function (val) {
  throw new Error("Oops")
  return val + 1
})
  .catch(function (err) {
    console.log(err)
  })
  .then(function (val) {
    console.log(val + 1) // prints NaN
  })

Можно ожидать, что в этом коде выполняются вычисления 17 + 1 = 18, но, из-за неожиданной ошибки, мы получаем NaN. Промис, неявно созданный .catch(), неявно разрешается (а не отклоняется) со значением undefined.

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

▍Паттерн №2: незавершённые промисы

Новые промисы пребывают в состоянии pending до тех пор, пока не будут успешно разрешены или отклонены (то есть — завершены). Но если промис не завершается, его можно назвать остановившимся промисом. Он навсегда останется в состоянии pending, не давая выполняться коду, полагающемуся на его завершение.

Речь идёт о незавершённых промисах, которые крайне сложно обнаружить. Извне нельзя узнать о том, остановился ли промис, или он просто медленно работает.

Авторы вышеупомянутой публикации показывают пример проблемы из node-promise-mysql, где connection.release() возвращает промис, который никогда не разрешается.

Этот пример сложно свести к нескольким строкам кода, поэтому вот — кое-что попроще:

const p0 = new Promise((resolve, reject) => null)
const p1 = Promise.resolve(17)
p0.then((result) => p1)
  .then((value) => value + 1)
  .then((value) => console.log(value)) // ожидается 18

Последний промис соединён цепочкой из .then() с промисом p0, который никогда не разрешается и не отклоняется. Этот код может выполняться вечно, но он никогда не выведет никакого значения.

Это, опять же, простейший пример, но представьте себе огромную кодовую базу, над которой работают десятки программистов. Совсем неочевидным может быть то, что функция в некоторых случаях бесконечно долго держит некий промис в состоянии pending.

▍Паттерн №3: неявные возвраты и код, реагирующий на результаты работы промиса

Цепочка из промисов прерывается без выдачи каких-либо ошибок в том случае, если разработчик забывает о включении в код выражения return.

Эта проблема похожа на ту, связанную с «проглатыванием» ошибок, о которой я уже рассказывал. Вот фрагмент кода из Google Assistant, который приводят Алимадади с соавторами:

handleRequest (handler) {
    if (typeof handler === 'function') {
        const promise = handler(this)
        if (promise instanceof Promise) {
            promise.then(result => {
                debug(result)
                return result
            }).catch(reason => {
                this.handleError('function failed')
                this.tell(!reason.message ? ERROR_MESSAGE : reason.message)
                return reason
            })
        }
    }
}

Метод handleRequest() использует объект Map с обработчиками, предоставленными разработчиком, для организации асинхронной работы с запросами Assistant. Объект handler (обработчик) может быть либо коллбэком, либо промисом.

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

Но все эти возвраты выполняются внутри кода, реагирующего на разрешение или отклонение промиса. Промис не осуществляет возврата значения. Результат реакции на промис handler теряется.

Пользователь этой библиотеки не может обработать результат разрешения или отклонения промисов, возвращённых его собственными обработчиками.

Поиск антипаттернов с помощью графа промисов

Алимадади с соавторами создали программу PromiseKeeper, которая динамически анализирует кодовую базу на JavaScript и рисует графы промисов.

Граф промисов

Мне не удалось запустить эту программу, поэтому передам то, о чём рассказали авторы публикации.

▍Графы промисов

Асинхронный код можно представить в виде графа, вершины которого (промисы, функции, значения, механизмы синхронизации) соединены рёбрами (разрешение промиса, регистрация обработчиков, связь, return или throw).

  • Вершины-промисы (p) представляют собой случаи запуска промисов.
  • Вершины-значения (v) представляют значения, с которыми разрешаются или отклоняются промисы. Это могут быть функции.
  • Вершины-функции (f) — это функции, зарегистрированные для обработки разрешения или отклонения промиса.
  • Вершины-механизмы синхронизации (s) представляют собой все использованные в коде вызовы Promise.all() или Promise.race().
  • Рёбра разрешения или отклонения промиса (v)->(p) указывают на связи вершин-значений с вершинами-промисами. Они помечены как resolve или reject.
  • Рёбра регистрации обработчиков (p)->(f) указывают на связи между промисом и функцией. Они помечены как onResolve или onReject.
  • Рёбра связей (p1)->(p2) показывают взаимоотношения между связанными промисами.
  • Рёбра return или throw (f)->(v) показывают связи функций и значений. Они помечены как return или throw.
  • Рёбра механизмов синхронизации указывают на связи, идущие от множества промисов к одному механизму синхронизации промисов. Они помечаются как resolved, rejected или pending на основании того, как ведёт себя новый промис.

Вот аннотированная версия вышеприведённого графа.

beo3RPTAZulNEa80tRBZ7Z 3RyDdXs44oIJ6plwoJZlZEMxdgKRG3mJ s9lzrEtaZQ4bt92m3N6PdEHdQrEwYKJJ1EjWOR8PM33KAYySMFIN5lOQ ypmYbFsvUXF7YRFJBegvGky

Аннотированный граф промисов

▍Использование PromiseKeeper для поиска анти-паттернов

Программа PromiseKeeper направлена на конструирование и визуализацию графа промисов кода. Она анализирует код динамически, по мере выполнения тестов. Динамический контекст выполнения кода позволяет находить анти-паттерны, которые не видны при анализе самого кода.

Вот на какие анти-паттерны обращает внимание программа:

  • Пропущенные обработчики отклонения промисов — это ведёт к «проглатыванию» ошибок.
  • Попытки многократного завершения работы промисов — это происходит, когда пытаются разрешить или отклонить промис, работа которого уже была завершена.
  • Незавершённые промисы, то есть такие, которые не разрешены, но и не отклонены в то время, когда PromiseKeeper строит граф.
  • Недостижимые обработчики — то есть код, зарегистрированный для обработки разрешения или отклонения промисов, который не выполняется во время динамического анализа кода, выполняемого PromiseKeeper.
  • Неявные возвраты и стандартные обработчики — это может привести к неожиданному поведению промисов, расположенных ниже в цепочке промисов.
  • Ненужные промисы — когда намеренно создают новый промис в функции, которая уже обёрнута в промис.

Так как PromiseKeeper полагается на динамическое выполнение кода — качество анализа напрямую зависит от того, насколько хорошо код покрыт тестами. В ходе этого анализа нельзя исследовать невыполненный код, что может вести к ложноположительным результатам.

Реализация PromiseKeeper основана на фреймворке для динамического анализа JavaScript-кода Jalangi. В нём имеются коллбэки, которые реагируют на события жизненного цикла промисов.

Мне не удалось заставить работать PromiseKeeper на моём компьютере, но Алимадади с соавторами сообщают о том, что не вполне благополучные промисы встречаются почти во всех кодовых базах, в которых используется JavaScript.

77c7fb53726b48d333344bdd386b9fcb

Отчёт по выявленным анти-паттернам

Интересно то, что 1012 экземпляров незавершённых промисов встречаются всего в 17 местах кода Node Fetch.

Авторы сообщили, что в ходе их эксперимента 43% промисов оказались неразрешёнными. Это, вероятнее всего, указывает на неполноту тестов, а не на то, что популярные программные продукты, которые они исследовали, безнадёжно «поломаны».

Что делать?

Для того чтобы улучшить работу с промисами в своих проектах, стоит помнить об анти-паттернах и постараться не писать код, который изначально является некачественным. Применение async/await снижает вероятность появления в коде рассмотренных здесь анти-паттернов.

Мы, решая проблемы промисов, добились серьёзных успехов, логируя сведения о необработанных отклонениях промисов, снабжённые полной трассировкой стека. Делается это с помощью такого кода:

// Выводит полезное сообщение об ошибке когда
// отклонение промиса оказывается необработанным
process.on("unhandledRejection", (err, promise) => {
  const stack = err instanceof Error ? err.stack : ""
  const message = err instanceof Error ? err.message : err

  Logger.error("Unhandled promise rejection", {
    message,
    stack,
    promise,
  })
})

Ещё можно попробовать Node.js-модуль async_hooks, который позволяет наблюдать за жизненным циклом промисов, и попытаться выявлять промисы, которые выполняются слишком долго. Можно, например, сравнивать время работы промиса с заданным тайм-аутом и выводить в консоль предупреждение.

У меня была интересная попытка использования async_hooks для выявления промисов, выполняющихся слишком долго, но особого толку из этого не вышло. Нельзя получить ссылку на контекст выполнения (только — C-указатель). То есть — можно увидеть, что что-то работает медленно, но о том, что это такое, узнать нельзя.

Меня привлекает идея превращения PromiseKeeper в нечто вроде плагина для Jest. Представьте себе, что после каждого запуска тестов формируется граф промисов, вроде того, который вы здесь видели.

Сталкивались ли вы с проблемами, вызванными неправильной работой промисов?

oug5kh6sjydt9llengsiebnp40w

logohttps://www.znak.com/2021-10-05/glava_gulagu_net_rasskazal_o_soderzhanii_i_proishozhdenii_strashnogo_arhiva_s_pytkami

2021.10.05

Руководитель правозащитного проекта «Гулагу.нет» Владимир Осечкин на своем канале в YouТube подробно рассказал об обстоятельствах получения 40-гигабайтного архива ФСИН и ФСБ с пытками и бесчеловечными издевательствами над заключенными, который удалось вывезти из страны. Сейчас, говорит Осечкин, материалы уже переданы в международные организации против пыток и изучаются экспертами. «Мы находимся в историческом моменте, когда все человечество узнает страшную правду о том, что происходило в РФ последние пять лет», — говорит Осечкин. 

Часть материалов архива правозащитники будут поэтапно направлять в СМИ. По словам Осечкина, двое изучавших архив правозащитников запросили помощь психолога, поскольку кадры с издевательствами оказались слишком чудовищными. 

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

Этот человек, по словам Осечкина, на протяжении долгого периода времени работал на ФСИН, выполнял приказы и поручения. Он не имеет прямого отношения к пыткам и изнасилованиям, но являлся частью механизма российских спецслужб, которые регистрировали факты пыток на служебные видеокамеры. 

Источник «Гулагу.нет» готов давать подробные показания. Несмотря на то что фактически он работал на ФСИН, у него нет даже паспорта России, это не гражданин нашей страны. Он бывший заключенный, которого принудили к работе с компьютерами, поскольку он хорошо разбирается в них. 

Российские спецслужбы, по словам правозащитника, пытались вменить им разглашение государственной тайны и обвиняли в шпионаже. «В режиме Путина огласка кадров пыток является разглашением тайны», — иронизирует Осечкин.  

Gulagu.net опубликовал первые видео пыток и изнасилований заключенных из увезенного архива

«Самое страшное, что это было организовано государством, должностными лицами ФСИН и ФСБ, которые утверждали пыточные схемы, которые снимали это все, документировали и архивировали. Эти видео использовались в качестве оперативной работы. Пострадавшего человека, в отношении которого совершали насильственные половые акты, который проходил через пытки, потом шантажировали, вербовали, заставляли сотрудничать с оперативным управлением ФСИН и ФСБ, угрожая переводом в касту «униженных»», — говорит Осечкин. 

Он рассказал, как системе удалось долгое время скрывать факты пыток. «Родственники, жены пострадавших писали жалобы. Но все эти обращения приходили в эти же самые учреждения. Источник говорит, что ему приходилось участвовать в фальсификациях материалов проверок, чтобы скрыть тяжкие насильственные преступления. Он рассказал, как пострадавших заставляли подписывать ложные объяснения. Если кто-то отказывался это делать, то из личного дела заключенного сканировалась подпись. В целом ряде регионов есть огромный массив документов, где содержатся объяснения — «меня не били, не пытали»», — рассказывает правозащитник. 

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

Пытка производилась так: из Москвы или из регионального управления приходил сигнал, сообщались данные, чтобы человека «опустить». По этой команде подбиралась бригада из числа осужденных. Начальник оперотдела звонил ответственному за видеорегистраторы (в данном случае — источнику «Гулагу.нет»). Тот выдавал регистратор. 

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

Иногда файлы записи оказывались битыми, «из-за того, что ФСИН часто закупает устаревшее оборудование». В этом случае изнасилование и пытки повторялись, чтобы получить новую запись. 

Осечкин призвал сотрудников ГУФСИН не участвовать в пыточных конвейерах. «Мы все равно всех разоблачим. У вас есть выбор — можете не прийти на работу, заболеть», — правозащитник призвал помогать разоблачать подобные схемы.  

«Мы давно знали о том, что творится в тюрьмах, но нам не хватало доказательств. «Мы сами не можем туда пойти. Всех коллег-наблюдателей из системы выкинули», — объясняет Осечкин. 

По его словам, речь идет не только о пытках и изнасилованиях, но и ликвидации отдельных заключенных. «Теперь мы понимаем, что произошло с Пшеничным (бизнесмен Валерий Пшеничный, замучен и убит в СИЗО), Владимиром Евдокимовым (топ-менеджер госкорпорации «Роскосмос» Владимир Евдокимов был найден в СИЗО с ножевыми ранениями и перерезанным горлом)», — говорит Осечкин. 

Также пыткам подвергались криминальные авторитеты. Запись с одним из таких людей также содержится в архиве. «На видео он потом говорит: я теперь никто», — рассказывает правозащитник.

«Как бы в дальнейшем ни сложилась моя судьба, правды уже не утаить. Материалы уже переданы в Международный Комитет по предотвращению пыток. Видеоархив находится в Страсбурге, — говорит Владимир. — Если и сейчас общество заснет и посчитает, что лучше ничего не менять, — дальше, мне кажется, спецслужбы легализуют эти пресс-хаты и реформы по демократизации будут отодвинуты на десятилетия».

«Я готов лично свою жизнь положить на то, чтобы в России никого не били и не пытали», — говорит правозащитник. 

Часть видеороликов была передана редакции «Медиазоны», которая составила описание роликов. 

На первом видео (18 февраля 2020 года) мужчина в черной одежде засовывает швабру, обмотанную пластиковой лентой, в задний проход осужденному. Его руки в это время привязали к койке, а ноги связали и запрокинули наверх. 

Другой мужчина на видео поддерживает ноги заключенного, а другой — закрывает ему рот. Они обращаются к нему со словами: «Есть че сказать? Давай, вспоминай, гандон ** * [чертов, блин]. Здесь три дня будешь лежать со [шваброй] в жопе». В ответ тот кричит от боли: «За что?» 

На второй записи от апреля 2020 года раздетый заключенный лежит на животе с перемотанными скотчем руками. Затем автор видео встает ногой ему на лопатки и требует назвать свое имя. Мужчина также спрашивает заключенного, «кто он по жизни», а потом давит ему ногой на голову со словами: «От какого вора ты бродяга? <…> Какой вор в законе?».

На третьем видео, сделанном 25 июня того же года, видно, как заключенный лежит с привязанными к койке рукам и поднятыми наверх ногами. Один из мужчин за кадром заставляет его представиться, а второй — держит за ноги. Затем еще один мужчина начинает насиловать заключенного.

Ранее в сентябре Gulagu.net уже публиковал пять фото со сценами насилия в тюремной больнице Саратова. Пострадавшие говорили, что их насиловали «активисты», оформленные санитарами.

На момент написания материала стало известно, что ФСИН начала служебную проверку сведений «Гулагу.нет» о пытках в больнице Саратовской области. Пресс-службу цитирует «Интерфакс». 

«В сети Интернет была опубликована видеозапись с противоправными действиями в отношении неустановленного мужчины. Автор публикации утверждает, что данная видеозапись была сделана в ФКУ ОТБ-1 УФСИН России по Саратовской области. Для проверки достоверности информации в Саратовскую область директором ФСИН России Александром Калашниковым была направлена группа сотрудников центрального аппарата ФСИН России», — говорится в сообщении. 

Проверка находится на особом контроле руководства ФСИН России, подчеркнули там.

Правозащитный проект Gulagu.net прекратил работу в России 25 мая текущего года. Он был основан в 2011 году для защиты прав заключенных. Представители портала неоднократно сообщали о давлении со стороны властей и DDoS-атаках. 

Екатеринбургский ТЮЗ — театр с богатыми традициями и славной репутацией. В разные годы им руководили такие режиссеры, как Владимир Мотыль, Дмитрий Астрахан, Юрий Жигульский, Анатолий Праудин, здесь зажглись такие звезды, как Елена Юнгер, Леонид Неведомский, Галина Умпелева, Борис Плотников, его мастера не раз награждались премиями «Золотая маска» и «Арлекин»…

Недавняя премьера — «Питер Пэн в Кенсингтонском саду» по мотивам Джеймса Мэтью Барри. Сценическое открытие ранее никем не поставленного текста может стать событием в отечественном театре для детей. Драматурги Роман Ильин (псевдоним Романа Феодори) и Ярослава Пулинович уходят от пьесы «Питер и Венди», предложив как бы предысторию сюжета. Рассказ о явлении «мальчика, который не хотел взрослеть» начинается задолго до знакомства с Венди, на страницах первого романа Барри «Белая птичка». Спектакль о том, как герой, застрявший между мирами, «ни то, ни сё», не птица и не человек, дух, соединивший материнское имя с подаренным феями именем Пэн (в некоторых переводах Пан — чертик, заклинающий духов игрой на дудочке) становится Питером Пэном.

Лауреат «Золотой маски» режиссер Роман Феодори умеет собрать вокруг себя замечательную команду мастеров. Его постоянный соавтор театральный кудесник Даниил Ахмедов создал сказочно красивое оформление и костюмы. Композитор Евгения Терехина сочинил партитуру, воплотившую магический Кенсингтонский сад в сплетении голосов эльфов, птиц и заблудившихся человеческих душ. Художник по свету Тарас Михалевский наполнил его воздух бликами летней ночи, грозовыми зарницами и световыми завесами, отделяющими мир людей от мира духов. Хореограф Татьяна Баганова, чей коллектив «Провинциальные танцы» занят в спектакле плотнее, чем артисты ТЮЗа, наделяет обитателей сада языком умопомрачительной пластики.

Рассказ о грехопадении начинается с

Фото: Татьяна Шабунина

Жанр мистерии оправдывает поэтическое двоемирие сказки: мир людей, где герои говорят своими голосами, и потусторонний «фейный» мир, опетый безупречным хоровым многоголосием Квартета (хормейстер — Александр Жемчужников). Изобразительный строй восходит к кельтской мифологии и рождественским традициям. Феи из цветов превращаются в бабочек, птицеголовые жители Птичьего острова в траурных костюмах грозят Питеру скорой расправой, продавщица воздушных шаров парит в серебристом мареве, словно королева Маб, а золотая пыльца, возвращающая Питеру способность летать, напоминает о подарочных новогодних шарах.

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

Рассказ о грехопадении начинается с

Фото: Татьяна Шабунина

Будущая мама Питера (Ольга Медведева) просит у ворона сына — особенного ребенка, которому она отдаст всю свою любовь. Бедняжка не понимает, о чем просит, и чего стоят ее обещания. Быть матерью Питера трудно, и она не выдержит испытания, досадуя на непослушного сына. Непоседа Питер не желает лежать в кроватке, и, улучив момент, когда мама выйдет из комнаты, вывалится в окно. В человеческом мире Питер представлен «душой» в виде планшетной куклы с ангельскими крыльями, которую водят четверо танцоров. Оказавшись в потустороннем мире, Питер теряет крылья и обретает человеческий облик (Сергей Молочков), не сразу избавляясь от кукольных снастей. Танцоры учат его заново двигаться и владеть собственным телом. Своенравный задира Питер освобождается от опеки и отправляется в путешествие по Кенсингтонскому саду, чтобы стать его полноправным обитателем, завоевать благосклонность фей и получить от них дар летать между мирами.

Рассказ о грехопадении начинается с

Фото: Татьяна Шабунина

А мама, обнаружив пропажу дорогого сына, обреченно закрывает окно и снимает белье с кроватки в знак утраты. Такое решение вынуждает понимать уход Питера как гибель для мира людей. Питер уверен, что мама ждет его, но, вернувшись, обнаруживает, что заветное окно забрано решетками, а на руках у его мамы новый ребенок — нормальный человеческий младенец. Впрочем, Питер быстро утешится, когда рядом откроет окошко девочка Венди. «Так будет продолжаться все время, пока дети не разучатся быть веселыми, непонимающими и бессердечными» (Джеймс Барри. «Питер и Венди»).

В спектакле два героя — Кенсингтонский сад и Питер Пэн. Но главным содержанием становится то, как он сделан. В театральной технологии есть термин «чистая перемена», когда смена декораций и обстановки происходит на глазах у зрителей. Волшебные трансформации героев и предметов обретают убедительность благодаря театральной иллюзии, достигнутой почти без использования видео, которое тоже работает как театральное превращение: когда Питер покидает детскую через окно, вслед за ним улетают птички с оживших обоев (автор видео-контента — Яна Новикова). Плотность действенной ткани напоминает плетение персидского ковра, описывать калейдоскоп превращений так же непродуктивно, как сравнивать скорость восприятия визуального и вербального текста. Ежесекундные изменения картинки занимают все внимание зрителя, не давая ему опомниться. Постановщики нашли беспроигрышный способ удержать подростковую аудиторию в театральном зале, максимально нагрузив зрительное восприятие.

Исчерпывающих ответов, как и положено волшебной сказке, спектакль не даст

Авторы спектакля предлагают зрителю задуматься, почему Питер решает не взрослеть? На этот вопрос каждый отвечает самостоятельно в меру собственной фантазии. Мнения не совпадают, а спектакль, как и положено волшебной сказке, не дает исчерпывающих ответов.

Рассказ о грехопадении начинается с

Фото: Татьяна Шабунина

Доброе утро!

В Новосибирске произошел взрыв на автозаправке, пострадали 35 человек. В остальном новости такие:

  • Любовь Соболь отказалась от участия в думских выборах.
  • По чеченскому телевидению показали репортаж с участием похищенной из шелтера в Махачкале Халимат Тарамовой; власти Беларуси привезли Романа Протасевича на пресс-конференцию.
  • На пресс-конференции в Брюсселе президент США сказал, что если Навальный умрет в тюрьме, это испортит отношения России со всем миром и с ним лично.
  • По данным Росстата, в 2020 году убыль населения в некоторых российских регионах выросла в десятки раз, в целом по стране – более чем вдвое.

Ложь, повторенная много раз

Чеченский телеканал «Грозный ТВ» выпустил 35-минутный спецрепортаж «о попытке похищения» Халимат Тарамовой – 22-летней женщины, похищенной ранее из кризисной квартиры для жертв насилия в Махачкале. В нем утверждается, что это не чеченская полиция похитила Тарамову из шелтера, а правозащитники и некие психологи похитили ее из счастливой чеченской семьи. В репортаже показали и саму Халимат: она говорит, что сейчас с ней все хорошо, а как она оказалась в шелтере, она якобы не помнит. Здесь адвокаты объясняют, что доказательств похищения Тарамовой и ее насильственного удержания родственниками более чем достаточно, а данное под давлением интервью опровержением считаться не может.

В Беларуси происходит то же самое: на организованный МИД Беларуси брифинг привезли Романа Протасевича, арестованного после принудительной посадки самолета Ryanair в Минске. Он сказал, что его никто не бил и не пытал, что он чувствует себя прекрасно и сотрудничает со следствием. Журналист ВВС ушел с брифинга в знак протеста против использования заложников в целях пропаганды. На этой же пресс-конференции белорусские чиновники и военные заявили, что истребитель МИГ-29 не принуждал самолет Ryanair, в котором летел Протасевич, сесть в Беларуси.

Следственный комитет Беларуси позже добавил, что члены Союза поляков Беларуси выехали в Польшу добровольно – вот, например, рассказ Ирены Бернацкой о том, как ее везли из тюрьмы на белорусско-польскую границу, а она думала, что везут в лес расстреливать.

Российские будни

В Москве задержали корреспондента издания Readovka, снимавшего акцию Петра Крисевича с «самоубийством» на Красной площади. Ему пытались вменить распитие спиртного в общественном месте, но так и не вменили – просто покатали на автобусе по городу и подержали в полиции.

Проект «Агит Россия», который публиковал информацию об уличных протестах и занимался политической агитацией, объявил о закрытии из-за угрозы уголовного дела.

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

Три разговора:

  • С бывшим машинистом московского метро об исках, поданных в связи с увольнением за участие в акциях в поддержку Навального;
  • С отстраненным от служения священником Андреем Винарским (он недавно вышел из-под ареста в Хабаровске, отсидев 25 суток за участие в апрельской акции в поддержку Навального).
  • С новгородским активистом Романом Максимовым, который собирался участвовать в выборах в Новгородскую гордуму, но после того, как Госдума приняла закон о запрете участия в выборах для «экстремистов», а на него самого стали давить силовики, шантажируя службой в армии и предложениями «сотрудничать», он от этой идеи отказался.

Перед встречей с Путиным

По итогам саммита НАТО в Брюсселе было принято довольно грозное в отношении России коммюнике, где упомянута не только российская военная мощь, но разного рода «гибридные» поползновения, на которые теперь решено давать ответ.

После публикации полного интервью Путина американскому телеканалу NBC выяснилось, что у Путина не только нет «привычки убивать», но и что он не решился гарантировать корреспонденту, что Навальный выйдет на свободу живым. Ну потому что в колонии к Навальному относятся «как ко всем», а медицина там плохая. На пресс-конференции в Брюсселе президента США Джо Байдена спросили (англ.), что будет, если Навальный умрет в тюрьме. Байден ответил: «Это будет трагедией. Это ухудшит его [Путина] отношения со всем миром и со мной». Здесь политолог Дмитрий Орешкин объясняет, зачем Путин так рвется встретиться с Байденом и что он может ему предложить. В Женеве в преддверии российско-американского саммита появилось граффити с Навальным – такое же, какое в конце апреля закрасили в Петербурге.

Есть еще один вопрос, который мог бы решиться в Женеве: американец Пол Уилан, осужденный в России на 16 лет за шпионаж, просит Байдена забрать его домой.

Вокруг света

  • Беларусь. Руководитель Народного антикризисного управления Беларуси Павел Латушко объявил о прекращении акций протеста на польско-белорусской границе после полученного в субботу письма от представителя ЕC по международным делам Жозепа Борреля. Боррель пишет, что в ближайшее время ЕС введет санкции против режима Лукашенко. Вот репортаж о жительнице Гомеля Анастасии Перевощиковой, которая отсидела 105 суток под административным арестом, – это рекорд для Беларуси.
  • Российско-американское. Американский суд отказал российскому олигарху Олегу Дерипаске в удовлетворении иска с требованием отменить введенные против него санкции Минфина США. По данным Стокгольмского института исследования проблем мира, за минувший год Россия и США увеличили число развернутых ядерных боеголовок, хотя их общее количество сократилось.
  • В столице Венгрии прошла масштабная акция протеста против законопроекта, который запрещает любые обсуждения гомосексуальности в школах.

Хроники пандемии

По данным оперативного штаба на утро понедельника, суточный прирост новых случаев COVID-19 в России снизился до 13 721 (из них в Москве – 6590). Число инфицированных в стране с начала эпидемии – 5 млн 222 тысячи. Официальное число жертв достигло к утру понедельника 126 801 человека (+371 за сутки).

В Москве с сегодняшнего дня начинается «нерабочая неделя»: никакой поддержки бизнесу в связи с ней не предусмотрено, потому что «это же только неделя», а жителей города собираются штрафовать на 4 тысячи рублей за сидение на скамейках в закрытых зонах парков и посещение закрытых детских площадок.

Росстат обнародовал новые данные о смертности: в 2020 году естественная убыль населения в некоторых российских регионах выросла по сравнению с 2019 годом в десятки раз, а в среднем по России – более чем в два раза. В Татарстане естественная убыль увеличилась в 72 раза, в Петербурге – в 47 раз. Здесь эти данные комментирует независимый демограф Алексей Ракша. Главной причиной такого роста смертности он называет качество коммуникации властей с населением.

Вот очень хороший, но печальный репортаж из «красной зоны» Мариинской больницы в Петербурге, а вот рассказ о трудностях прививочной кампании на Северном Кавказе.

В Англии отложена полная отмена коронавирусных ограничений (правда, с этим решением правительства еще должен согласиться парламент).

Шесть ссылок

  • Культурная антропология. Рассказ о Марке Фишере (1968-2017) – британском авторе, которому удалось превратиться из академического философа и музыкального критика в главного на острове критика современности. Или отрывок из коллективной монографии «Зачарованное место. Медиапотребление, медиаграмотность и историческая память сельских жителей» (изд-во ВШЭ) – о том, как в деревне воспринимают китч.
  • Сценическое. Отрывок из книги Филлис Хартнолл «Краткая история театра» (изд-во Ad Marginem) – о том, как христианская церковь сначала запретила, а затем возродила театр в Средние века. Или фрагмент из монографии Линн Гарафолы «Русский балет Дягилева» (изд-во «КоЛибри») – об авангардном периоде антрепризы.
  • Наука. Отрывок из книги Бена Орлина «Время переменных. Математический анализ в безумном мире» (изд-во «Альпина нон-фикшн») – о матанализе. Или рассказ о «русском гриппе» 1977-1979 годов и его, по всей видимости, лабораторном происхождении.
  • Больше интересных текстов, интервью и репортажей вы всегда найдете в Telegram-канале Настоящего Времени. Читать эту рассылку тоже можно из Telegram.

Искренне Ваши,
Семь Сорок

  • Рассказ о группе животных 2 класс окружающий мир
  • Рассказ о графе из повести выстрел
  • Рассказ о городе санкт петербург 5 класс
  • Рассказ о городе россии для 2 класса окружающий мир
  • Рассказ о гостях обломова 2 4 глава