Руководство часть 10: Тестирование приложений Django — Изучение веб-разработки
Сайты, в процессе развития и разработки, становится все сложнее тестировать вручную. Кроме такого тестирования, сложными становятся внутренние взаимодействия между компонентами — внесение небольшого изменения в одной части приложения влияет на другие. При этом, чтобы все продолжало работать нужно вносить все больше и больше изменений и, желательно так, чтобы не добавлялись новые ошибки. Одним из способов который позволяет смягчить последствия добавления изменений, является внедрение в разработку автоматического тестирования — оно должно просто и надёжно запускаться каждый раз, когда вы вносите изменения в свой код. Данное руководство рассматривает вопросы автоматизации юнит-тестирования вашего сайта при помощи фреймворка Django для тестов.
LocalLibrary в настоящий момент содержит страницы для показа списков всех книг, авторов, подробной информации о книгах Book
и авторах Author
, а также страницу для обновления информации об экземпляре книги
и, кроме того, страницы для создания, обновления и удаления записей модели Author
(и модели Book
, в том случае, если вы выполнили домашнее задание в руководстве работа с формами). Даже в случае небольшого сайта, ручной переход на каждую страницу и беглая проверка того, что все работает как следует, может занять несколько минут. В процессе внесения изменений и роста сайта требуемое время для проведения проверок будет только возрастать. Если бы мы продолжили в том же духе, то в какой-то момент на проведение тестов мы тратили бы больше времени, чем на написание кода и внесение изменений.
Автоматические тесты могут серьёзно помочь нам справиться с этой проблемой! Очевидными преимуществами в таком случае являются значительно меньшие временные затраты на проведение тестов, их подробное выполнение, а кроме того, тесты имеют постоянную функциональность, или последовательность действий (человек никогда не сможет тестировать так надёжно!). В связи с быстротой их выполнения автоматические тесты можно выполнять более часто, а если они провалятся, то укажут на соответствующее место (где что-то пошло не так как ожидалось).
Кроме того, автоматические тесты могут действовать как первый «настоящий пользователь» вашего кода, заставляя вас строго следить за объявлениями и документированием поведения вашего сайта. Тесты часто являются основой для создания примеров вашего кода и документации. По этим причинам иногда некоторые процессы разработки программного обеспечения начинаются с определения тестов и их реализации, а уже после этого следует написание кода который должен иметь соответствующее поведение (так называемая разработка на основе тестов и на основе поведения).
Данное руководство показывает процесс создания автоматических тестов в Django при помощи добавления их к разработке сайта LocalLibrary.
Типы тестирования
Существует несколько типов, уровней, классификаций тестов и тестовых приёмов. Наиболее важными автоматическими тестами являются:
- Юнит-тесты
- Проверяют функциональное поведение для отдельных компонентов, часто классов и функций.
- Регрессионное тестирование
- Тесты которые воспроизводят исторические ошибки (баги). Каждый тест вначале запускается для проверки того, что баг был исправлен, а затем перезапускается для того, чтобы убедиться, что он не был внесён снова с появлением новых изменений в коде.
- Интеграционные тесты
- Проверка совместной работы групп компонентов. Данные тесты отвечают за совместную работу между компонентами, не обращая внимания на внутренние процессы в компонентах. Они проводятся как для простых групп компонентов, так и для целых веб-сайтов.
Примечание: К другим типам тестов относятся методы чёрного ящика, белого ящика, ручные, автоматические, канареечные (canary), дымные (smoke), соответствия (conformance), принятия (acceptance), функциональные (functional), системные (system), эффективности (performance), загрузочные (load) и стресс-тесты (stress tests).
Что Django предоставляет для тестирования?
Тестирование сайта это сложная задача, потому что она состоит их нескольких логических слоёв – от HTTP-запроса и запроса к моделям, до валидации формы и их обработки, а кроме того, рендеринга шаблонов страниц.
Django предоставляет фреймворк для создания тестов, построенного на основе иерархии классов, которые, в свою очередь, зависят от стандартной библиотеки Python unittest
. Несмотря на название, данный фреймворк подходит и для юнит-, и для интеграционного тестирования. Фреймворк Django добавляет методы API и инструменты, которые помогают тестировать как веб так и, специфическое для Django, поведение. Это позволяет вам имитировать URL-запросы, добавление тестовых данных, а также проводить проверку выходных данных ваших приложений. Кроме того, Django предоставляет API (LiveServerTestCase) и инструменты для применения различных фреймворков тестирования, например вы можете подключить популярный фреймворк Selenium для имитации поведения пользователя в реальном браузере.
Для написания теста вы должны наследоваться от любого из классов тестирования Django (или юниттеста) (SimpleTestCase, TransactionTestCase, TestCase, LiveServerTestCase), а затем реализовать отдельные методы проверки кода (тесты это функции-«утверждения», которые проверяют, что результатом выражения являются значения True
или False
, или что два значения равны и так далее). Когда вы запускаете тест, фреймворк выполняет соответствующие тестовые методы в вашем классе-наследнике. Методы тестирования запускаются независимо друг от друга, начиная с метода настроек и/или завершаясь методом разрушения (tear-down), определённом в классе, как показано ниже.
class YourTestClass(TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def test_something_that_will_pass(self):
self.assertFalse(False)
def test_something_that_will_fail(self):
self.assertTrue(False)
Самый подходящий базовый класс для большинства тестов это django.test.TestCase. Этот класс создаёт чистую базу данных перед запуском своих методов, а также запускает каждую функцию тестирования в его собственной транзакции. У данного класса также имеется тестовый Клиент, который вы можете использовать для имитации взаимодействия пользователя с кодом на уровне отображения. В следующих разделах мы сконцентрируемся на юнит-тестах, которые будут созданы на основе класса TestCase.
Примечание: Класс django.test.TestCase очень удобен, но он может приводить к замедленной работе в некоторых случаях (не для каждого теста необходимо настраивать базу данных, или имитировать взаимодействие с отображением). Когда вы познакомитесь с работой данного класса, то сможете заменить некоторые из ваших тестов на более простые классы тестирования.
Что вы должны тестировать?
Вы должны тестировать все аспекты, касающиеся вашего кода, но не библиотеки, или функциональность, предоставляемые Python, или Django.
Например, рассмотрим модель Author
, определённую ниже. Вам не нужно проверять тот факт, что first_name
и last_name
были сохранены в базу данных как CharField
, потому что за это отвечает непосредственно Django (хотя конечно, на практике в течение разработки вы косвенно будете проверять данную функциональность). Тоже касается и, например, проверки того, что поле date_of_birth
является датой, поскольку это тоже часть реализации Django.
Вы должны проверить текст для меток (First name, Last_name, Date of birth, Died), и размер поля, выделенного для текста (100 символов), потому что они являются частью вашей разработки и чем-то, что может сломаться/измениться в будущем.
class Author(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
date_of_birth = models.DateField(null=True, blank=True)
date_of_death = models.DateField('Died', null=True, blank=True)
def get_absolute_url(self):
return reverse('author-detail', args=[str(self.id)])
def __str__(self):
return '%s, %s' % (self.last_name, self.first_name)
Подобным же образом вы должны убедиться, что методы get_absolute_url()
и __str__()
ведут себя как требуется, потому что они являются частью вашей бизнес логики. В случае функции get_absolute_url()
вы можете быть уверены, что функция из Django reverse()
была реализована правильно и, следовательно, вы тестируете только то, чтобы соответствующий вызов в отображении был правильно определён.
Примечание: Проницательные читатели могут заметить, что мы можем некоторым образом ограничить дату рождения и смерти какими-то граничными значениями и выполнять проверку, чтобы дата смерти шла после рождения. В Django данное ограничение может быть добавлено к вашим классам форм (хотя вы и можете определить валидаторы для этих полей, они будут проявлять себя только на уровне форм, а не уровне модели).
Ну что же, усвоив данную информацию, давайте перейдём к процессу определения и запуска тестов.
Перед тем как мы перейдём к тому «что тестировать», давайте кратко взглянем на моменты где и как определяются тесты.
Django использует юнит-тестовый модуль — встроенный «обнаружитель» тестов, который находит тесты в текущей рабочей директории, в любом файле с шаблонным именем test*.py. Предоставляя соответствующие имена файлов, вы можете работать с любой структурой которая вас устраивает. Мы рекомендуем создать пакет для вашего тестирующего кода и, следовательно, отделить файлы моделей, отображений, форм и любые другие, от кода который будет использоваться для тестов. Например:
catalog/ /tests/ __init__.py test_models.py test_forms.py test_views.py
В проекте LocalLibrary создайте файловую структуру, указанную выше. Файл __init__.py должен быть пустым (так мы говорим Питону, что данная директория является пакетом). Вы можете создать три тестовых файла при помощи копирования и переименования файла-образца /catalog/tests.py.
Примечание: Скелет тестового файла /catalog/tests.py был создан автоматически когда мы выполняли построение скелета сайта Django. Является абсолютно «легальным» действием — поместить все ваши тесты в данный файл, тем не менее, если вы проводите тесты «правильно», то вы очень быстро придёте к очень большому и неуправляемому файлу тестирования.
Можете удалить данный файл, поскольку больше он нам не понадобится.
Откройте /catalog/tests/test_models.py
django.test.TestCase
, как показано ниже:from django.test import TestCase
Вы часто будете добавлять соответствующий тестовый класс для каждой модели/отображения/формы с отдельными методами проверки каждой отдельной функциональности. В каких-то случаях вы захотите иметь отдельный класс для тестирования какого-то особого варианта работы, или функциональности, с отдельными функциями тестирования, которые будут проверять элемент/элементы данного варианта (например, мы можем создать отдельный класс тестирования для проверки того, что поле валидно, — функции данного класса будут проверять каждый неверный вариант использования). Опять же, структура файлов и пакетов полностью зависит от вас и будет лучше если вы будете её придерживаться.
Добавьте тестовый класс, показанный ниже, в нижнюю часть файла. Данный класс демонстрирует как создать класс тестирования при помощи наследования от TestCase
.
class YourTestClass(TestCase):
@classmethod
def setUpTestData(cls):
print("setUpTestData: Run once to set up non-modified data for all class methods.")
pass
def setUp(self):
print("setUp: Run once for every test method to setup clean data.")
pass
def test_false_is_false(self):
print("Method: test_false_is_false.")
self.assertFalse(False)
def test_false_is_true(self):
print("Method: test_false_is_true.")
self.assertTrue(False)
def test_one_plus_one_equals_two(self):
print("Method: test_one_plus_one_equals_two.")
self.assertEqual(1 + 1, 2)
Этот класс определяет два метода которые вы можете использовать для дотестовой настройки (например, создание какой-либо модели, или других объектов, которые вам понадобятся):
setUpTestData()
вызывается каждый раз перед запуском теста на уровне настройки всего класса. Вы должны использовать данный метод для создания объектов, которые не будут модифицироваться/изменяться в каком-либо из тестовых методов.setUp()
вызывается перед каждой тестовой функцией для настройки объектов, которые могут изменяться во время тестов (каждая функция тестирования будет получать «свежую» версию данных объектов).
Примечание. Классы тестирования также содержат метод tearDown()
, который мы пока не используем. Этот метод не особенно полезен для тестирования баз данных, поскольку базовый класс TestCase
автоматически разрывает соединения с ними.
Далее идут несколько методов, которые используют функции Assert
, проверяющие условия «истинно» (true), «ложно» (false) или равенство (AssertTrue
, AssertFalse
, AssertEqual
). Если условия не выполняются как ожидалось, то это приводит к провалу теста и выводу соответствующего сообщения об ошибке на консоль.
Функции проверки утверждений AssertTrue
, AssertFalse
, AssertEqual
реализованы в unittest. В данном фреймворке существуют и другие подобные функции, а кроме того, специфические для Django функции проверки, например, перехода из/к отображению (assertRedirects
), проверки использования какого-то конкретного шаблона (assertTemplateUsed
) и так далее.
В обычной ситуации у вас нет необходимости вызывать функции print() из методов теста, как во фрагменте выше. Мы поступили так только для того, чтобы вы в консоле увидели порядок вызова тестовых функций класса.
Простейшим способом запуска всех тестов является применение следующей команды:
Таким образом мы найдём в текущей директории все файлы с именем test*.py и запустим все тесты (у нас имеются несколько файлов для тестирования, но на данный момент, только /catalog/tests/test_models.py содержит какие-либо тесты). По умолчанию, тесты сообщат что-нибудь, только в случае провала.
Запустите тесты из корневой папки сайта LocalLibrary. Вы должны увидеть вывод, который похож на следующий.
>python manage.py test
Creating test database for alias 'default'...
setUpTestData: Run once to set up non-modified data for all class methods.
setUp: Run once for every test method to setup clean data.
Method: test_false_is_false.
.setUp: Run once for every test method to setup clean data.
Method: test_false_is_true.
.setUp: Run once for every test method to setup clean data.
Method: test_one_plus_one_equals_two.
.
======================================================================
FAIL: test_false_is_true (catalog.tests.tests_models.YourTestClass)
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\Github\django_tmp\library_w_t_2\locallibrary\catalog\tests\tests_models.py", line 22, in test_false_is_true
self.assertTrue(False)
AssertionError: False is not true
----------------------------------------------------------------------
Ran 3 tests in 0.075s
FAILED (failures=1)
Destroying test database for alias 'default'...
Как видите, один тест провалился и мы можем точно увидеть в какой именно функции это произошло и почему (так и было задумано, поскольку False
не равен True
!).
Совет: Самая важная вещь, которую нужно извлечь из тестового выхода выше, заключается в том, что это гораздо более ценно, если вы используете описательные/информативные имена для ваших объектов и методов.
Текст выделенный жирным, обычно не должен появляться в тестовом выводе (это результат работы функций print()
в наших тестах). Он показывает, что вызов метода setUpTestData()
происходит один раз для всего класса в целом, а вызовыsetUp()
осуществляются перед каждым методом.
Следующий раздел показывает как запускать отдельные тесты и как контролировать процесс вывода информации.
Ещё больше тестовой информации
Если вы желаете получать больше информации о тестах вы должны изменить значение параметра verbosity. Например, для вывода списка успешных и неуспешных тестов (и всю информацию о том, как прошла настройка базы данных) вы можете установить значение verbosity равным «2»:
python3 manage.py test --verbosity 2
Доступными значениями для verbosity являются 0, 1 (значение по умолчанию), 2 и 3.
Запуск определённых тестов
Если вы хотите запустить подмножество тестов, тогда вам надо указать полный путь к вашему пакету, модулю/подмодулю, классу наследникуTestCase
, или методу:
python3 manage.py test catalog.tests
python3 manage.py test catalog.tests.test_models
python3 manage.py test catalog.tests.test_models.YourTestClass
python3 manage.py test catalog.tests.test_models.YourTestClass.test_one_plus_one_equals_two
Теперь, когда мы знаем как запустить наши тесты и что именно мы должны тестировать, давайте рассмотрим некоторые практические примеры.
Примечание: Мы не будем расписывать все тесты, а просто покажем вам пример того, как они должны работать и что ещё вы можете с ними сделать.
Модели
Как было отмечено ранее, мы должны тестировать все то, что является частью нашего кода, а не библиотеки/код, которые уже были протестированы командами разработчиков Django, или Python.
Рассмотрим модель Author
. Мы должны провести тесты текстовых меток всех полей, поскольку, даже несмотря на то, что не все они определены, у нас есть проект, в котором сказано, что все их значения должны быть заданы. Если мы не проведём их тестирование, тогда мы не будем знать, что данные метки действительно содержат необходимые значения. Мы уверены в том, что Django создаст поле заданной длины, таким образом наши тесты будут проверять нужный нам размер поля, а заодно и его содержимое.
class Author(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
date_of_birth = models.DateField(null=True, blank=True)
date_of_death = models.DateField('Died', null=True, blank=True)
def get_absolute_url(self):
return reverse('author-detail', args=[str(self.id)])
def __str__(self):
return '%s, %s' % (self.last_name, self.first_name)
Откройте файл /catalog/tests/test_models.py и замените все его содержимое кодом, приведённом во фрагменте для тестирования модели Author
(фрагмент представлен ниже).
В первой строке мы импортируем класс TestCase
, а затем наследуемся от него, создавая класс с описательным именем (AuthorModelTest
), оно поможет нам идентифицировать места провалов в тестах во время вывода информации на консоль. Затем мы создаём метод setUpTestData()
, в котором создаём объект автора, который мы будем использовать в тестах, но нигде не будем изменять.
from django.test import TestCase
from catalog.models import Author
class AuthorModelTest(TestCase):
@classmethod
def setUpTestData(cls):
Author.objects.create(first_name='Big', last_name='Bob')
def test_first_name_label(self):
author=Author.objects.get(id=1)
field_label = author._meta.get_field('first_name').verbose_name
self.assertEquals(field_label,'first name')
def test_date_of_death_label(self):
author=Author.objects.get(id=1)
field_label = author._meta.get_field('date_of_death').verbose_name
self.assertEquals(field_label,'died')
def test_first_name_max_length(self):
author=Author.objects.get(id=1)
max_length = author._meta.get_field('first_name').max_length
self.assertEquals(max_length,100)
def test_object_name_is_last_name_comma_first_name(self):
author=Author.objects.get(id=1)
expected_object_name = '%s, %s' % (author.last_name, author.first_name)
self.assertEquals(expected_object_name,str(author))
def test_get_absolute_url(self):
author=Author.objects.get(id=1)
self.assertEquals(author.get_absolute_url(),'/catalog/author/1')
Тесты полей проверяют значения текстовых меток (verbose_name
), включая их ожидаемую длину. Все методы имеют описательные имена, а их логика придерживается одной и той же структуры:
author=Author.objects.get(id=1)
field_label = author._meta.get_field('first_name').verbose_name
self.assertEquals(field_label,'first name')
Интересно отметить следующее:
- Мы не можем получить поле
verbose_name
напрямую черезauthor.first_name.verbose_name
, потому чтоauthor.first_name
является строкой. Вместо этого, нам надо использовать атрибут_meta
объекта автора для получения того экземпляра поля, который будет использоваться для получения дополнительной информации. - Мы выбрали метод
assertEquals(field_label,'first name')
вместоassertTrue(field_label == 'first name')
, потому что, в случае провала теста, в выводе будет указано какое именно значение содержит метка и это немного облегчит нам задачу по отладке кода.
Примечание: Тесты для текстовых меток last_name
и date_of_birth
, а также тест длины поля last_name
были опущены. Добавьте свою версию этих тестов, соблюдая соглашение об именовании и следуя структуре логики, представленной выше.
Кроме того, нам надо провести тесты наших собственных методов. Они просто проверяют, что имена объектов имеют следующие значения «Last Name, First Name» и что URL-адрес, по которому мы получаем экземпляр Author
, такой как ожидается.
def test_object_name_is_last_name_comma_first_name(self):
author=Author.objects.get(id=1)
expected_object_name = '%s, %s' % (author.last_name, author.first_name)
self.assertEquals(expected_object_name,str(author))
def test_get_absolute_url(self):
author=Author.objects.get(id=1)
self.assertEquals(author.get_absolute_url(),'/catalog/author/1')
Теперь запустите тесты. Если вы создали модель Author, в соответствии с разделом о моделях данного руководства, то весьма вероятно, что вы получите сообщение об ошибке для метки date_of_death
, как показано ниже. Тест провалился потому что, в соответствии с соглашением Django, первый символ имени метки должен быть в верхнем регистре (Django делает это автоматически).
Это несущественный баг, но он демонстрирует нам то, что написание тестов может более тщательно проверить все неточности, которые вы можете сделать.
Примечание: Измените значение метки для поля date_of_death (/catalog/models.py) на «died» и перезапустите тесты.
Тот же подход применяется к тестированию других моделей. Самостоятельно создайте свои собственные тесты для оставшихся моделей.
Формы
Смысл проведения тестов для форм тот же, что и для моделей; надо проверить весь собственный код и другие особенности проекта, но не то, что касается фреймворка, или сторонних библиотек.
В основном это означает, что вы должны протестировать то, что формы имеют соответствующие поля и что они показываются с соответствующими метками и вспомогательными текстами. Вам не надо проверять то, что Django правильно осуществляет валидацию полей (если только вы не создали своё собственное поле и валидацию) — то есть вам не надо проверять что, например, поле ввода электронного адреса принимает только электронного адреса. Но вы должны протестировать каждую дополнительную валидацию, которую вы добавляете для полей и любые сообщения, который ваш код генерирует в случае ошибок.
Рассмотрим форму для обновления книг. Она имеет только одно поле обновления даты, которое будет иметь текстовую метку и вспомогательный текст, который вам надо проверить.
class RenewBookForm(forms.Form):
"""
Форма обновления книг для библиотекарей
"""
renewal_date = forms.DateField(help_text="Enter a date between now and 4 weeks (default 3).")
def clean_renewal_date(self):
data = self.cleaned_data['renewal_date']
if data < datetime.date.today():
raise ValidationError(_('Invalid date - renewal in past'))
if data > datetime.date.today() + datetime.timedelta(weeks=4):
raise ValidationError(_('Invalid date - renewal more than 4 weeks ahead'))
return data
Откройте файл /catalog/tests/test_forms.py и замените весь существующий в нем код, следующим кодом теста для формы RenewBookForm
. Мы начали его с импорта нашей формы и некоторых библиотек Python и Django, которые помогут нам провести тесты. Затем, тем же способом как мы делали для моделей, объявляем тестовый класс нашей формы, то есть применяя описательное имя класс наследника TestCase
.
from django.test import TestCase
import datetime
from django.utils import timezone
from catalog.forms import RenewBookForm
class RenewBookFormTest(TestCase):
def test_renew_form_date_field_label(self):
form = RenewBookForm()
self.assertTrue(form.fields['renewal_date'].label == None or form.fields['renewal_date'].label == 'renewal date')
def test_renew_form_date_field_help_text(self):
form = RenewBookForm()
self.assertEqual(form.fields['renewal_date'].help_text,'Enter a date between now and 4 weeks (default 3).')
def test_renew_form_date_in_past(self):
date = datetime.date.today() - datetime.timedelta(days=1)
form_data = {'renewal_date': date}
form = RenewBookForm(data=form_data)
self.assertFalse(form.is_valid())
def test_renew_form_date_too_far_in_future(self):
date = datetime.date.today() + datetime.timedelta(weeks=4) + datetime.timedelta(days=1)
form_data = {'renewal_date': date}
form = RenewBookForm(data=form_data)
self.assertFalse(form.is_valid())
def test_renew_form_date_today(self):
date = datetime.date.today()
form_data = {'renewal_date': date}
form = RenewBookForm(data=form_data)
self.assertTrue(form.is_valid())
def test_renew_form_date_max(self):
date = timezone.now() + datetime.timedelta(weeks=4)
form_data = {'renewal_date': date}
form = RenewBookForm(data=form_data)
self.assertTrue(form.is_valid())
Первые две функции проверяют текст который должны содержать поля label
и help_text
. Доступ к полю мы получаем при помощи словаря (то есть, form.fields['renewal_date']
). Отметим, что мы должны проверять содержит ли метка значение None
, иначе в поле текста метки вы увидите «None
«.
Оставшиеся функции проверяют валидность дат, то есть их нахождение внутри определённого интервала, а также невалидность для значений, которые находятся вне заданного интервала. Для получения исходного значения мы использовали функцию получения текущей даты (datetime.date.today()
), а также функцию datetime.timedelta()
(которая принимает определённое число дней, или недель). Затем мы просто создали форму, передавая ей наши данные и проверяя её на валидность.
Примечание: В данном примере мы не использовали ни базу данных, ни тестовый клиент. Рассмотрите модификацию этих тестов при помощи класса SimpleTestCase.
Нам также надо бы проверять возникновение ошибок, которые появляются если форма не валидна. Но, обычно, это относится к процессу вывода информации, таким образом, мы позаботимся об этом в следующем разделе.
На этом с формами можно закончить; у нас имеются и другие тесты, но они были созданы обобщёнными классами отображения для редактирования! Запустите тесты и убедитесь, что наш код все ещё им соответствует!
Отображения
Для проверки поведения отображения мы используем тестовый клиент Django Client. Данный класс действует как упрощённый веб-браузер который мы применяем для имитации GET
и POST
запросов и проверки ответов. Про ответы мы можем узнать почти все, начиная с низкоуровневого HTTP (итоговые заголовки и коды статусов) и вплоть до применяемых шаблонов, которые используются для HTML-рендера, а также контекста, который передаётся в соответствующий шаблон. Кроме того, мы можем отследить последовательность перенаправлений (если имеются), проверить URL-адреса и коды статусов на каждом шаге. Все это позволит нам проверить, что каждое отображение выполняет то, что ожидается.
Давайте начнём с одного из простейших отображений которое возвращает список всех авторов. Вы можете его увидеть по URL-адресу /catalog/authors/ (данный URL-адрес можно найти в разделе приложения catalog, в файле настроек urls.py по имени ‘authors’).
class AuthorListView(generic.ListView):
model = Author
paginate_by = 10
Поскольку это обобщённое отображение списка, то почти все за нас делает Django. Если вы доверяете Django, то единственной вещью, которую вам нужно протестировать, является переход к данному отображению по указанному URL-адресу. Таким образом, если вы применяете методику TDD (test-driven development, разработка через тесты), то начните проект с написания тестов, которые будут проверять, что данное отображение выводит всех авторов и, к тому же, например, блоками по 10.
Откройте файл /catalog/tests/test_views.py замените все его содержимое на следующий код теста для класса AuthorListView
. Как и ранее, мы импортируем нашу модель и некоторые полезные классы. В методе setUpTestData()
мы задаём число объектов класса Author
которые мы тестируем при постраничном выводе.
from django.test import TestCase
from catalog.models import Author
from django.urls import reverse
class AuthorListViewTest(TestCase):
@classmethod
def setUpTestData(cls):
number_of_authors = 13
for author_num in range(number_of_authors):
Author.objects.create(first_name='Christian %s' % author_num, last_name = 'Surname %s' % author_num,)
def test_view_url_exists_at_desired_location(self):
resp = self.client.get('/catalog/authors/')
self.assertEqual(resp.status_code, 200)
def test_view_url_accessible_by_name(self):
resp = self.client.get(reverse('authors'))
self.assertEqual(resp.status_code, 200)
def test_view_uses_correct_template(self):
resp = self.client.get(reverse('authors'))
self.assertEqual(resp.status_code, 200)
self.assertTemplateUsed(resp, 'catalog/author_list.html')
def test_pagination_is_ten(self):
resp = self.client.get(reverse('authors'))
self.assertEqual(resp.status_code, 200)
self.assertTrue('is_paginated' in resp.context)
self.assertTrue(resp.context['is_paginated'] == True)
self.assertTrue( len(resp.context['author_list']) == 10)
def test_lists_all_authors(self):
resp = self.client.get(reverse('authors')+'?page=2')
self.assertEqual(resp.status_code, 200)
self.assertTrue('is_paginated' in resp.context)
self.assertTrue(resp.context['is_paginated'] == True)
self.assertTrue( len(resp.context['author_list']) == 3)
Все тесты используют клиент (принадлежащего классу TestCase
, от которого мы наследовались) для имитации GET
-запроса и получения ответа (resp
). Первая версия проверяет заданный URL-адрес (заметьте, — просто определённый путь без указания домена), в то время как второй генерирует URL-адрес при помощи его имени, указанного в настройках.
resp = self.client.get('/catalog/authors/')
resp = self.client.get(reverse('authors'))
Когда мы получаем ответ, то мы извлекаем код статуса, используемый шаблон, «включён» ли постраничный вывод, количество элементов в подмножестве (на странице) и общее число элементов.
Наиболее интересной переменной является resp.context
, которая является объектом контекста, который передаётся шаблону из отображения. Он (объект контекста) очень полезен для тестов, поскольку позволяет нам убедиться, что наш шаблон получает все данные которые ему необходимы. Другими словами мы можем проверить, что мы используем правильный шаблон с данными, которые проделывают долгий путь проверок чтобы соответствовать данному шаблону.
Отображения и регистрация пользователей
В некоторых случаях вам нужно провести тесты отображений к которым имеют доступ только зарегистрированные пользователи. Например, LoanedBooksByUserListView
очень похоже на наше предыдущее отображение, но доступно только для залогинившихся пользователей и показывает только те записи (BookInstance)
, которые соответствуют текущему пользователю, имеют статус ‘on loan’ (книга взята домой), а также забронированы.
from django.contrib.auth.mixins import LoginRequiredMixin
class LoanedBooksByUserListView(LoginRequiredMixin,generic.ListView):
"""
Обобщённый класс отображения списка взятых книг текущим пользователем
"""
model = BookInstance
template_name ='catalog/bookinstance_list_borrowed_user.html'
paginate_by = 10
def get_queryset(self):
return BookInstance.objects.filter(borrower=self.request.user).filter(status__exact='o').order_by('due_back')
Добавьте тестовый код следующего фрагмента в /catalog/tests/test_views.py. В нем, для создания нескольких аккаунтов и объектов BookInstance
которые будут использоваться в дальнейших тестах, мы используем метод SetUp()
(вместе с соответствующими книгами и другими записями). Половина книг бронируется тестовыми пользователями, но в начале для них всех мы устанавливаем статус «доступно». Использование метода SetUp()
предпочтительнее чем setUpTestData()
, поскольку в дальнейшем мы будем модифицировать некоторые объекты.
Примечание: Метод setUp()
создаёт книгу с заданным языком Language
, но ваш код может не включать в себя модель Language
, поскольку это было домашним заданием. В таком случае просто закомментируйте соответствующие строки. Поступите также и в следующем разделе, посвящённом RenewBookInstancesViewTest.
import datetime
from django.utils import timezone
from catalog.models import BookInstance, Book, Genre, Language
from django.contrib.auth.models import User
class LoanedBookInstancesByUserListViewTest(TestCase):
def setUp(self):
test_user1 = User.objects.create_user(username='testuser1', password='12345')
test_user1.save()
test_user2 = User.objects.create_user(username='testuser2', password='12345')
test_user2.save()
test_author = Author.objects.create(first_name='John', last_name='Smith')
test_genre = Genre.objects.create(name='Fantasy')
test_language = Language.objects.create(name='English')
test_book = Book.objects.create(title='Book Title', summary = 'My book summary', isbn='ABCDEFG', author=test_author, language=test_language)
genre_objects_for_book = Genre.objects.all()
test_book.genre.set(genre_objects_for_book)
test_book.save()
number_of_book_copies = 30
for book_copy in range(number_of_book_copies):
return_date= timezone.now() + datetime.timedelta(days=book_copy%5)
if book_copy % 2:
the_borrower=test_user1
else:
the_borrower=test_user2
status='m'
BookInstance.objects.create(book=test_book,imprint='Unlikely Imprint, 2016', due_back=return_date, borrower=the_borrower, status=status)
def test_redirect_if_not_logged_in(self):
resp = self.client.get(reverse('my-borrowed'))
self.assertRedirects(resp, '/accounts/login/?next=/catalog/mybooks/')
def test_logged_in_uses_correct_template(self):
login = self.client.login(username='testuser1', password='12345')
resp = self.client.get(reverse('my-borrowed'))
self.assertEqual(str(resp.context['user']), 'testuser1')
self.assertEqual(resp.status_code, 200)
self.assertTemplateUsed(resp, 'catalog/bookinstance_list_borrowed_user.html')
Если пользователь не залогирован то, чтобы убедиться в том что отображение перейдёт на страницу входа (логирования), мы используем метод assertRedirects
, что продемонстрировано в методе test_redirect_if_not_logged_in()
. Затем мы осуществляем вход для пользователя и проверяем что полученный статус status_code
равен 200 (успешно).
Остальные тесты проверяют, соответственно, что наше отображение показывает только те книги которые взяты текущим пользователем. Скопируйте код, показанный ниже, в нижнюю часть предыдущего класса.
def test_only_borrowed_books_in_list(self):
login = self.client.login(username='testuser1', password='12345')
resp = self.client.get(reverse('my-borrowed'))
self.assertEqual(str(resp.context['user']), 'testuser1')
self.assertEqual(resp.status_code, 200)
self.assertTrue('bookinstance_list' in resp.context)
self.assertEqual( len(resp.context['bookinstance_list']),0)
get_ten_books = BookInstance.objects.all()[:10]
for copy in get_ten_books:
copy.status='o'
copy.save()
resp = self.client.get(reverse('my-borrowed'))
self.assertEqual(str(resp.context['user']), 'testuser1')
self.assertEqual(resp.status_code, 200)
self.assertTrue('bookinstance_list' in resp.context)
for bookitem in resp.context['bookinstance_list']:
self.assertEqual(resp.context['user'], bookitem.borrower)
self.assertEqual('o', bookitem.status)
def test_pages_ordered_by_due_date(self):
for copy in BookInstance.objects.all():
copy.status='o'
copy.save()
login = self.client.login(username='testuser1', password='12345')
resp = self.client.get(reverse('my-borrowed'))
self.assertEqual(str(resp.context['user']), 'testuser1')
self.assertEqual(resp.status_code, 200)
self.assertEqual( len(resp.context['bookinstance_list']),10)
last_date=0
for copy in resp.context['bookinstance_list']:
if last_date==0:
last_date=copy.due_back
else:
self.assertTrue(last_date <= copy.due_back)
Если хотите, то вы, безусловно, можете добавить тесты проверяющие постраничный вывод!
Тестирование форм и отображений
Процесс тестирования отображений с формами немного более сложен, чем в представленных ранее случаях, поскольку вам надо протестировать большее количество кода: начальное состояние показа формы, показ формы и её данных в случае ошибок, а также показ формы в случае успеха. Хорошей новостью является то, что мы применяем клиент для тестирования практически тем же способом, как мы делали это в случае отображений, которые отвечают только за вывод информации.
В качестве демонстрации давайте напишем некоторые тесты для отображения, которые отвечают за обновление книг(renew_book_librarian()
):
from .forms import RenewBookForm
@permission_required('catalog.can_mark_returned')
def renew_book_librarian(request, pk):
"""
Функция отображения обновления экземпляра BookInstance библиотекарем
"""
book_inst=get_object_or_404(BookInstance, pk = pk)
if request.method == 'POST':
form = RenewBookForm(request.POST)
if form.is_valid():
book_inst.due_back = form.cleaned_data['renewal_date']
book_inst.save()
return HttpResponseRedirect(reverse('all-borrowed') )
else:
proposed_renewal_date = datetime.date.today() + datetime.timedelta(weeks=3)
form = RenewBookForm(initial={'renewal_date': proposed_renewal_date,})
return render(request, 'catalog/book_renew_librarian.html', {'form': form, 'bookinst':book_inst})
Нам надо проверить что к данному отображению имеют доступ только те пользователи, которые имеют разрешение типа can_mark_returned
, а кроме того, что пользователи перенаправляются на страницу ошибки HTTP 404 если они пытаются обновить экземпляр книги BookInstance
, который не существует. Мы должны проверить что начальное значение формы соответствует дате через 3 недели в будущем, а также то, что если форма прошла валидацию, то мы переходим на страницу отображения книг «all-borrowed» (забронированных). Для тестов, отвечающих за проверку «провалов», мы также должны удостовериться что они отправляют соответствующие сообщения об ошибках.
В нижнюю часть файла /catalog/tests/test_views.py добавьте класс тестирования (показан во фрагменте, ниже). Он создаёт двух пользователей и два экземпляра книги, но только один пользователь получает необходимый доступ к соответствующему отображению. Код, который «присваивает» соответствующий доступ, выделен в коде жирным:
from django.contrib.auth.models import Permission
class RenewBookInstancesViewTest(TestCase):
def setUp(self):
test_user1 = User.objects.create_user(username='testuser1', password='12345')
test_user1.save()
test_user2 = User.objects.create_user(username='testuser2', password='12345')
test_user2.save()
permission = Permission.objects.get(name='Set book as returned')
test_user2.user_permissions.add(permission)
test_user2.save()
test_author = Author.objects.create(first_name='John', last_name='Smith')
test_genre = Genre.objects.create(name='Fantasy')
test_language = Language.objects.create(name='English')
test_book = Book.objects.create(title='Book Title', summary = 'My book summary', isbn='ABCDEFG', author=test_author, language=test_language,)
genre_objects_for_book = Genre.objects.all()
test_book.genre=genre_objects_for_book
test_book.save()
return_date= datetime.date.today() + datetime.timedelta(days=5)
self.test_bookinstance1=BookInstance.objects.create(book=test_book,imprint='Unlikely Imprint, 2016', due_back=return_date, borrower=test_user1, status='o')
return_date= datetime.date.today() + datetime.timedelta(days=5)
self.test_bookinstance2=BookInstance.objects.create(book=test_book,imprint='Unlikely Imprint, 2016', due_back=return_date, borrower=test_user2, status='o')
В нижнюю часть класса тестирования добавьте следующие методы (из следующего фрагмента). Они проверяют, что только пользователь с соответствующим доступом (testuser2) имеет доступ к отображению. Мы проверяем все случаи: когда пользователь не залогинился, когда залогинился, но не имеет соответствующего доступа, когда имеет доступ, но не является заёмщиком книги (тест должен быть успешным), а также, что произойдёт если попытаться получить доступ к книге BookInstance
которой не существует. Кроме того, мы проверяем то, что используется правильный (необходимый) шаблон.
def test_redirect_if_not_logged_in(self):
resp = self.client.get(reverse('renew-book-librarian', kwargs={'pk':self.test_bookinstance1.pk,}) )
self.assertEqual( resp.status_code,302)
self.assertTrue( resp.url.startswith('/accounts/login/') )
def test_redirect_if_logged_in_but_not_correct_permission(self):
login = self.client.login(username='testuser1', password='12345')
resp = self.client.get(reverse('renew-book-librarian', kwargs={'pk':self.test_bookinstance1.pk,}) )
self.assertEqual( resp.status_code,302)
self.assertTrue( resp.url.startswith('/accounts/login/') )
def test_logged_in_with_permission_borrowed_book(self):
login = self.client.login(username='testuser2', password='12345')
resp = self.client.get(reverse('renew-book-librarian', kwargs={'pk':self.test_bookinstance2.pk,}) )
self.assertEqual( resp.status_code,200)
def test_logged_in_with_permission_another_users_borrowed_book(self):
login = self.client.login(username='testuser2', password='12345')
resp = self.client.get(reverse('renew-book-librarian', kwargs={'pk':self.test_bookinstance1.pk,}) )
self.assertEqual( resp.status_code,200)
def test_HTTP404_for_invalid_book_if_logged_in(self):
import uuid
test_uid = uuid.uuid4()
login = self.client.login(username='testuser2', password='12345')
resp = self.client.get(reverse('renew-book-librarian', kwargs={'pk':test_uid,}) )
self.assertEqual( resp.status_code,404)
def test_uses_correct_template(self):
login = self.client.login(username='testuser2', password='12345')
resp = self.client.get(reverse('renew-book-librarian', kwargs={'pk':self.test_bookinstance1.pk,}) )
self.assertEqual( resp.status_code,200)
self.assertTemplateUsed(resp, 'catalog/book_renew_librarian.html')
Добавьте ещё один тестовый метод, показанный ниже. Он проверяет что начальная дата равна трём неделям в будущем. Заметьте, что мы имеем возможность получить доступ к начальному значению из поля формы (выделено жирным).
def test_form_renewal_date_initially_has_date_three_weeks_in_future(self):
login = self.client.login(username='testuser2', password='12345')
resp = self.client.get(reverse('renew-book-librarian', kwargs={'pk':self.test_bookinstance1.pk,}) )
self.assertEqual( resp.status_code,200)
date_3_weeks_in_future = datetime.date.today() + datetime.timedelta(weeks=3)
self.assertEqual(resp.context['form'].initial['renewal_date'], date_3_weeks_in_future )
Следующий тест (тоже добавьте его в свой класс) проверяет что отображение, в случае успеха, перенаправляет пользователя к списку всех забронированных книг. Здесь мы показываем как при помощи клиента вы можете создать и передать данные в POST
-запросе. Данный запрос передаётся вторым аргументом в пост-функцию и представляет из себя словарь пар ключ/значение.
def test_redirects_to_all_borrowed_book_list_on_success(self):
login = self.client.login(username='testuser2', password='12345')
valid_date_in_future = datetime.date.today() + datetime.timedelta(weeks=2)
resp = self.client.post(reverse('renew-book-librarian', kwargs={'pk':self.test_bookinstance1.pk,}), {'renewal_date':valid_date_in_future} )
self.assertRedirects(resp, reverse('all-borrowed') )
Вместо перехода к отображению all-borrowed, добавленного в качестве домашнего задания, вы можете перенаправить пользователя на домашнюю страницу ‘/’. В таком случае, исправьте две последние строки тестового кода на код, показанный ниже. Присваивание follow=True
, в запросе, гарантирует что запрос вернёт окончательный URL-адрес пункта назначения (следовательно проверяется /catalog/
, а не /
).
resp = self.client.post(reverse('renew-book-librarian', kwargs={'pk':self.test_bookinstance1.pk,}), {'renewal_date':valid_date_in_future},follow=True )
self.assertRedirects(resp, '/catalog/')
Скопируйте две последние функции в класс, представленные ниже. Они тоже проверяют POST
-запросы, но для случая неверных дат. Мы используем функцию assertFormError()
, чтобы проверить сообщения об ошибках.
def test_form_invalid_renewal_date_past(self):
login = self.client.login(username='testuser2', password='12345')
date_in_past = datetime.date.today() - datetime.timedelta(weeks=1)
resp = self.client.post(reverse('renew-book-librarian', kwargs={'pk':self.test_bookinstance1.pk,}), {'renewal_date':date_in_past} )
self.assertEqual( resp.status_code,200)
self.assertFormError(resp, 'form', 'renewal_date', 'Invalid date - renewal in past')
def test_form_invalid_renewal_date_future(self):
login = self.client.login(username='testuser2', password='12345')
invalid_date_in_future = datetime.date.today() + datetime.timedelta(weeks=5)
resp = self.client.post(reverse('renew-book-librarian', kwargs={'pk':self.test_bookinstance1.pk,}), {'renewal_date':invalid_date_in_future} )
self.assertEqual( resp.status_code,200)
self.assertFormError(resp, 'form', 'renewal_date', 'Invalid date - renewal more than 4 weeks ahead')
Такие же способы тестирования могут применяться для проверок других отображений.
Шаблоны
Django предоставляет API для тестирования, которое проверяет что функции отображения вызывают правильные шаблоны, а также позволяют убедиться, что им передаётся соответствующая информация. Кроме того, в Django имеется возможность использовать сторонние API для проверок того, что ваш HTML показывает то, что надо.
Django фреймворк для тестирования помогает вам создавать эффективные юнит- и интеграционные тесты — мы рассмотрели только небольшую часть того, что может делать фреймворк unittest и совсем не упоминали дополнения Django (например, посмотрите на модуль unittest.mock, который подключает сторонние библиотеки тестирования).
Из всего множества сторонних инструментов тестирования, мы кратко опишем возможности двух:
- Coverage: Это инструмент Python, который формирует отчёты о том, какое количество кода выполняется во время проведения тестов. Это полезно для уточнения степени «покрытия» кода тестами.
- Selenium это фреймворк проведения автоматического тестирования в настоящем браузере. Он позволяет вам имитировать взаимодействие пользователя с вашим сайтом (что является следующим шагом в проведении интеграционных тестов).
Существуют другие модели и отображения, которые мы могли бы протестировать. В качестве простого упражнения, попробуйте создать тестовый вариант для отображения AuthorCreate
.
class AuthorCreate(PermissionRequiredMixin, CreateView):
model = Author
fields = '__all__'
initial={'date_of_death':'12/10/2016',}
permission_required = 'catalog.can_mark_returned'
Помните, — вам надо проверить все, что касается вашего кода, или структуры. Это включает в себя: кто имеет доступ к отображению, начальную дату, применяемый шаблон, а также перенаправление из отображения в случае успеха.
Написание тестов не является ни весельем, ни развлечением и, соответственно, при создании сайтов часто остаётся напоследок (или вообще не используется). Но тем не менее, они являются действенным механизмом, который позволяет вам убедиться, что ваш код в находится безопасности, даже если в него добавляются какие-либо изменения. Кроме того, тесты повышают эффективность поддержки вашего кода.
В данном руководстве мы продемонстрировали вам принципы написания тестов для ваших моделей, форм и отображений. Мы кратко перечислили что именно необходимо тестировать, что обычно сложно выявить в самом начале разработки. Существует много аспектов которые необходимо изучить, но даже с тем что мы уже узнали, вы имеете возможность создавать эффективные юнит-тесты для значительного улучшения процесса разработки.
Следующая и последняя часть руководства покажет вам как запустить ваш чудесный (и полностью протестированный!) веб-сайт Django.
Шойгу рассказал о джине и артефактах, найденных на затонувшем корабле
https://ria.ru/20200902/shoygu-1576619623.html
Шойгу рассказал о джине и артефактах, найденных на затонувшем корабле
Шойгу рассказал о джине и артефактах, найденных на затонувшем корабле — РИА Новости, 04.09.2020
Шойгу рассказал о джине и артефактах, найденных на затонувшем корабле
Ценные артефакты найдены на затонувшем в Балтийском море корабле XVIII века, сообщил в интервью РИА Новости и «Комсомольской правде» президент Русского… РИА Новости, 04.09.2020
2020-09-02T11:36
2020-09-02T11:36
2020-09-04T08:11
безопасность
сергей шойгу
александр пушкин
русское географическое общество
балтийское море
/html/head/meta[@name=’og:title’]/@content
/html/head/meta[@name=’og:description’]/@content
https://cdn22.img.ria.ru/images/07e4/09/02/1576624216_0:0:641:360_1920x0_80_0_0_6bb4801a33644e2053cc1b891fec0826.jpg
МОСКВА, 2 сен — РИА Новости. Ценные артефакты найдены на затонувшем в Балтийском море корабле XVIII века, сообщил в интервью РИА Новости и «Комсомольской правде» президент Русского географического общества Сергей Шойгу.В 2018 году моряки Балтийского флота случайно обнаружили на дне Финского залива недалеко от острова Мощный неизвестный деревянный объект. В 2019 году подводники РГО совершили первое погружение к объекту и убедились, что перед ними старинный корабль. Детальные исследования корабля стартовали в августе.»Мы исследуем затонувший корабль середины XVIII века. Торговое судно, судя по всему, голландское. На нём огромное количество бутылок разных форм, объёма. В части из них, судя по всему, был джин. Но там есть и маленькие флакончики из очень тонкого стекла. Возможно, в них перевозили компоненты для производства парфюмерии. Тогда была своя химия, без синтетических, искусственно выведенных материалов. Может быть, во флаконах что-то и сохранилось», — рассказал Шойгу.По словам президента РГО, в свое время его познакомили с воссозданными духами супруги поэта Александра Пушкина.»Я однажды держал в руках работу парфюмеров-химиков, которые расшифровали по следам, оставшимся то ли на шарфе, то ли на кашне, духи Натали — супруги Пушкина. И — я хочу в это верить — сделали аналогичный парфюм. Это действительно запахи того времени. Такие… очень насыщенные», — признался он.»Вот и у экспедиции может быть интересное продолжение — я про джин, если найдём… В общем, обсудим», — отметил Шойгу.Читайте полный текст интервью Сергея Шойгу >>
https://ria.ru/20200723/1574790448.html
балтийское море
РИА Новости
7 495 645-6601
ФГУП МИА «Россия сегодня»
https://xn--c1acbl2abdlkab1og.xn--p1ai/awards/
2020
РИА Новости
7 495 645-6601
ФГУП МИА «Россия сегодня»
https://xn--c1acbl2abdlkab1og.xn--p1ai/awards/
Новости
ru-RU
https://ria.ru/docs/about/copyright.html
https://xn--c1acbl2abdlkab1og.xn--p1ai/
РИА Новости
7 495 645-6601
ФГУП МИА «Россия сегодня»
https://xn--c1acbl2abdlkab1og.xn--p1ai/awards/
Останки затонувшего на Балтике корабля XVIII века. Кадры РГО
Шойгу рассказал о том, что удалось найти на борту затонувшего на Балтике корабля XVIII века, который был обнаружен два года назад. «На нем огромное количество бутылок разных форм, объема. В части из них, судя по всему, был джин. Но там есть и маленькие флакончики из очень тонкого стекла. Возможно, в них перевозили компоненты для производства парфюмерии», — сказал министр. Видео предоставлено РГО.
2020-09-02T11:36
true
PT1M31S
https://cdn22.img.ria.ru/images/07e4/09/02/1576624216_0:0:481:360_1920x0_80_0_0_db3aaeb4b5842f8f53d6801edf93ef51.jpgРИА Новости
7 495 645-6601
ФГУП МИА «Россия сегодня»
https://xn--c1acbl2abdlkab1og.xn--p1ai/awards/
РИА Новости
7 495 645-6601
ФГУП МИА «Россия сегодня»
https://xn--c1acbl2abdlkab1og.xn--p1ai/awards/
безопасность, сергей шойгу, александр пушкин, русское географическое общество, балтийское море
МОСКВА, 2 сен — РИА Новости. Ценные артефакты найдены на затонувшем в Балтийском море корабле XVIII века, сообщил в интервью РИА Новости и «Комсомольской правде» президент Русского географического общества Сергей Шойгу.В 2018 году моряки Балтийского флота случайно обнаружили на дне Финского залива недалеко от острова Мощный неизвестный деревянный объект. В 2019 году подводники РГО совершили первое погружение к объекту и убедились, что перед ними старинный корабль. Детальные исследования корабля стартовали в августе.
«Мы исследуем затонувший корабль середины XVIII века. Торговое судно, судя по всему, голландское. На нём огромное количество бутылок разных форм, объёма. В части из них, судя по всему, был джин. Но там есть и маленькие флакончики из очень тонкого стекла. Возможно, в них перевозили компоненты для производства парфюмерии. Тогда была своя химия, без синтетических, искусственно выведенных материалов. Может быть, во флаконах что-то и сохранилось», — рассказал Шойгу.
По словам президента РГО, в свое время его познакомили с воссозданными духами супруги поэта Александра Пушкина.23 июля 2020, 13:54
В Омской области обнаружили артефакты возрастом 12 тысяч лет«Я однажды держал в руках работу парфюмеров-химиков, которые расшифровали по следам, оставшимся то ли на шарфе, то ли на кашне, духи Натали — супруги Пушкина. И — я хочу в это верить — сделали аналогичный парфюм. Это действительно запахи того времени. Такие… очень насыщенные», — признался он.
«Вот и у экспедиции может быть интересное продолжение — я про джин, если найдём… В общем, обсудим», — отметил Шойгу.
Читайте полный текст интервью Сергея Шойгу >>Детальный разбор: Жива ли джинга?
«Я плакал, когда смотрел игру между Бразилией и Германией (1:7). Не только из-за счета. Я плакал, потому что не знал, что случилось с радостью бразильского футбола. Джинги нет» Пеле.
Что такое «бразильская джинга» и почему ее стоит считать вымершей? Как это вообще связано со спортом? Почему эту тему стоит обсуждать? Все эти вопросы будут рассмотрены в этой статье, но давайте сначала вернемся в прошлое и посмотрим это видео, в котором показывается невероятное мастерство бразильских футболистов. Наслаждайтесь!
То, что вы только что посмотрели и ЕСТЬ бразильская джинга. Это тот стиль, который мы все любили, стиль, по которому мы скучаем, стиль, который, к сожалению, молодое поколение нечасто видит в современном футболе. Но давайте разберем по порядку…
Бразильская джинга – очень старый стиль игры в футбол, и возник он в Бразилии еще в 19 веке. После того, как британцы (если быть точным, шотландцы) представили бразильцам новый для них вид спорта, через некоторое время он стал неотъемлемой частью жизни бразильцев. Однако в футбол они играли совершенно по-другому, нежели в Европе. Бразильцы использовали футбол как новый способ практики капоэйры – боевого искусства, сочетающего в себе элементы танца, который возник еще в эпоху рабства.
Итак, цепочка выглядит следующим образом: боевое искусство практиковалось как танец, и поэтому рабовладельцы напутали их с африканскими танцами. После того, как стало ясно, что это – боевое искусство, практика капоэйры была запрещена, и бразильцы начали использовать футбол для тайных практик капоэйры. Так и родилась джинга, которая позднее вошла в профессиональный футбол и завоевала ее…
Пеле сделал это! Лучший футболист 20 века представил джингу миру и выиграл ТРИ(!) Кубка мира для своей страны. Тогда бразильский футбол и начал завоевывать сердца зрителей, и уже с этого момента термины «бразильский футбол» и «красивый футбол» стали означать одно и то же…
Однако, в последнее время мы не видим мячей в воздухе, невероятный дриблинг или трюки в виде танцев с мячом. Европейским лигам явно не хватает того бразильского футбола, который мы любим. Пеле, Гарринча, Клодоалдо, Роналдо, Ривалдо, Роберто Карлос, Ромарио остались в прошлом. Одним из последних игроков, который показал миру джингу, был Роналдиньо в «Барселоне» и «Милане». Именно поэтому многие утверждают, что он является одним из последних футболистов, который ИГРАЛ в футбол и относился к нему как к ИГРЕ, а не работе.
Проблема, однако, не в том, что современному футболу не хватает джинги. Проблема в том, что сейчас БЛОКИРУЮТ развитие джинги в европейском футболе. В случае Неймара это было явно видно. Знаменитый нападающий показал свою истинную бразильскую душу, играя за «Сантос». «Барселона» уже думала о том, что он будет «еще одним Роналдиньо». Но что мы наблюдаем? Когда бразилец прибыл в Испанию, его стиль игры совершенно изменился. Он привык к европейскому быстрому ритму и сильной защите. Не поймите меня неправильно, Неймар и сейчас является отличным игроком, можно сказать, одним из лучших в мире, но мы видим в его исполнении все меньше и меньше джинги. Более того, всякий раз, когда он начинает «танцевать с мячом», его резко начинают критиковать оппоненты, тренеры, журналисты и фанаты.
Игра, которая раньше считалась красивой, теперь воспринимается как «унижение соперника». Искусство жонглирования мячом сейчас называют способом выпендриться. Эффективность ВСЕГДА ценится выше, чем красота. Таким образом, можно достаточно обоснованно считать, что профессиональный футбол последних лет просто убивает джингу. Это отчетливо видно в последних неудачных играх национальной сборной Бразилии, причем не только в плане трофеев, но и в плане духа. Однако, надежда все еще есть…
Еще в 1950-ых в футбол играли так, что мяч касался лишь о землю. Пеле был сильно раскритикован за то, что пытался внедрить джингу в футбол. Он боролся за свой стиль, он смог его приподнести, и у него это получилось. В последнее время бразильский футбол тоже достаточно критикуют. Так это конец, или нам стоит ожидать очередной «революции» на поле? Может, стоит просто набраться терпения, и дождаться нового… Пеле?
Джинга 2021 год….
Документация Django 3.1 на русском языке | Документация Django 3.1
Всё, что нужно знать о Django.
Первые шаги¶
Новичок в Django или в программировании? Начните изучение отсюда!
Получение помощи¶
Есть проблемы? Мы с радостью поможем!
Как организована документация¶
У Django большой объем документации. Общий обзор того, как она организована, поможет вам узнать, где искать необходимое:
- Учебники. Пройдите серию шагов по созданию веб-приложения. Начните с них, если вы новичок в Django или разработке веб-приложений. Также посмотрите «Первые шаги» ниже.
- Руководства объясняют ключевые темы и концепции на достаточно высоком уровне и предоставляют полезную справочную информацию и пояснения.
- Справочные руководства содержат техническую информацию по API и другим аспектам работы Django. Они описывают, как всё работает и как это использовать, но предполагают, что у вас есть базовое понимание ключевых понятий.
- Практические руководства являются рецептами. Они проведут вас через шаги, связанные с решением ключевых проблем и вариантов использования Django. Они более продвинуты, чем учебные пособия, и предполагают, что вы знаете как Django работает.
Уровень модели¶
Django предоставляет свой уровень абстракции («модели») для структурирования и управления данными вашего веб-приложения. Узнайте больше об этом ниже:
Представления¶
Django has the concept of «views» to encapsulate the logic responsible for processing a user’s request and for returning the response. Find all you need to know about views via the links below:
Шаблоны¶
Шаблоны обеспечивают удобный для дизайнера синтаксис для визуализации информации, которая будет представлена пользователю. Узнайте, как этот синтаксис может использоваться дизайнерами и как он может быть расширен программистами:
Формы¶
Django provides a rich framework to facilitate the creation of forms and the manipulation of form data.
Процесс разработки¶
Learn about the various components and tools to help you in the development and testing of Django applications:
Админка¶
Find all you need to know about the automated admin interface, one of Django’s most popular features:
Безопасность¶
Security is a topic of paramount importance in the development of Web applications and Django provides multiple protection tools and mechanisms:
Internationalization and localization¶
Django offers a robust internationalization and localization framework to assist you in the development of applications for multiple languages and world regions:
Performance and optimization¶
There are a variety of techniques and tools that can help get your code running more efficiently — faster, and using fewer system resources.
Geographic framework¶
GeoDjango intends to be a world-class geographic Web framework. Its goal is to make it as easy as possible to build GIS Web applications and harness the power of spatially enabled data.
Other core functionalities¶
Learn about some other core functionalities of the Django framework:
Django — проект с открытым исходным кодом¶
Learn about the development process for the Django project itself and about how you can contribute:
Коктейль на основе джина «Гимлет»: история и способ приготовления
История коктейляИстория коктейля «Гимлет» берет начало в XVIII веке, в период английской колонизации. Британский флот и мореплаватели во время длительных путешествий из-за кошмарных условий проживания, грязной воды и плохого питания болели цингой. Шотландский военный врач Джеймс Линд в 1747 году провел исследования и доказал, что цитрусовые положительно влияют на иммунитет. В рацион матросов, которые доставляли грузы из Лондона в Индию и обратно, ввели сок лимона, после чего уровень заболеваемости цингой значительно снизился. В начале XIX века сок лимона или лайма стал обязательной частью пайка во всем морском флоте Великобритании. Чтобы увеличить срок годности цитрусового сока, его размешивали с ромом или джином и пили в таком виде вплоть до 1867 года, когда Лаклин Роуз, поставщик оборудования и провизии для кораблей, запатентовал метод консервации фруктового нектара сахаром, а не алкоголем. Чтобы повысить спрос и узнаваемость своего напитка, Роуз продавал консервированный сок в красивых бутылках под названием Rose’s Lime Cordial. И пока салаги и сержанты пили ром с соком, офицеры смешивали джин именно с кордиалом Роуза. Так и появился напиток «Гимлет». Название отсылает к маленькому инструменту — буравчику, который на английском называется gimlet. Внешне он напоминает то ли штопор, то отвертку. Раньше буравчиком вскрывали все бочки с алкоголем на кораблях, поэтому к напитку он имел прямое отношение. Благодаря попыткам победить цингу и находчивости Лаклина, для всех моряков Великобритании этот коктейль стал культовым.
Где пьют «Гимлет» и когда он появился в России?Сейчас «Гимлет» готовят во многих лучших барах по всему миру. В России он появился относительно недавно. Наша коктейльная культура в принципе очень молодая — ей около 20 лет. Большинство рецептов в Россию привез известный ресторатор и бармен Бек Нарзи. Именно под его управлением московский City Space стал первым российским заведением, который попал в список лучших баров мира.
Как готовят «Гимлет»?Ингредиенты
- 60 мл джина
- 30 млн сока лайма или кордиала
Классический «Гимлет» — это кисло-сладкий напиток на джине с соком цитрусовых. Крепкую часть можно заменять на другие «белые» спирты: например, на текилу, водку, ром или кашасу. Почти всегда в барах вторым ингредиентом становится кордиал — это кисло-сладкий сироп на основе цитрусового сока или органических кислот. Главное его отличие от сока в чистом виде заключается в том, что он значительно слаще.
Как смешать «Гимлет» дома?Гимлет» довольно легко приготовить дома, даже если нет специального оборудования и сложных кордиалов. У меня есть мой любимый рецепт — Pineapple Gimlet. Для этого вам понадобится джин, сухое белое вино и банка консервированных ананасов. Смешиваем 40 мл джина, 20 мл сухого белого вина и 40 мл сока из под консервированных ананасов, охлаждаем в морозильнике. Бокал отправляем тоже охлаждаться. Делаем украшение из ананаса на шпажке. Переливаем в охлажденный бокал и украшаем. Наслаждаемся осторожно и ответственно.
Читайте также:
Коктейльная карта: классическая «Палома» на текиле и грейпфруте
Как актрису Джину Карано затравили и уволили за посты в соцсетях — Российская газета
Киностудия Lucasfilm указала на дверь американской актрисе Джине Карано из-за ее записей в соцсетях, в которых та выражала свои консервативные политические взгляды. Компания заявила, что больше не будет работать с Карано, стремительно набиравшей популярность за счет роли в сериале «Мандалорец». «Джина Карано больше не работает в Lucasfilm, и планов работы с ней в будущем нет, — прокомментировали ситуацию в компании. — Тем не менее ее записи в социальных сетях, которые оскорбляют людей на основе их культурной и религиозной идентичности, отвратительны и неприемлемы».
Такую резкую оценку киностудия дала недавней записи бывшей спортсменки в «Инстаграме», где та разместила фото еврейского погрома во Львове, совершенного в 1941 году, и написала: «Из-за переписывания истории сегодня большинство людей не понимают, что для того, чтобы дойти до той точки, когда нацисты легко устраивали облавы на тысячи евреев, власти сначала заставляли соседей ненавидеть их только за то, что они евреи. И чем это отличается от ненависти к кому-то на основании его политических взглядов?». Карано, таким образом провела параллели между преследованием евреев и тем давлением, которому в США сегодня постоянно подвергают сторонников республиканцев в прессе и соцсетях, где доминирует либеральное мировоззрение. Ее запись вызвала бурю негодования со стороны части пользователей, и вскоре Карано ее удалила. Но в «Твиттере» уже набрал популярность хэштег с призывом к ее увольнению. О том, насколько выглядит удачным сделанное актрисой сравнение, можно спорить, но с тем, что в стране «свободы слова» сегодня пышно расцветает нетерпимость к политическому инакомыслию, поспорить трудно.
«Евреев избивали на улице не нацистские солдаты, а их соседи, даже дети. Из-за переписывания истории сегодня большинство людей не понимают, что, чтобы дойти до точки, когда нацисты легко устраивали облавы на тысячи евреев, власти сначала заставили соседей ненавидеть их только за то, что они евреи. И как это отличается от ненависти к кому-то на основании его политических взглядов?».
Тем более, как утверждает The Hollywood Reporter, Lucasfilm уже давно искала удачный повод уволить Карано, а ее скандальная запись в «Инстаграме» лишь сыграла роль «последней капли». В немилость к руководству компании она угодила за многочисленные записи в соцсетях, где женщина высказывала взгляды, совпадавшие с линией Дональда Трампа и Республиканской партии. Карано критиковала постоянное ношение масок во время пандемии, подвергала сомнению результаты выборов президента в США и подшучивала над попыткой объявить импичмент Трампу. Скоропалительным увольнением актрисы в Lucasfilm лишний раз продемонстрировали, что, хотя на страницах законов Америка остается страной «свободы слова», на практике в соцсетях укрепляется запрет на профессию по политическим взглядам. За высказывания, не совпадающие с тоном, который задают левые, теперь не только увольняют, но и вообще ставят «черную метку». Ироничным выглядит тот факт, что Карано в прошлом была популярна у левых и феминисток, а ее бой против Джулии Кедзи в 2007 году стал первым женским боем в ММА, который показали по телевидению. После ухода из спорта Карано сумела найти себя на актерском поприще. Сериал «Мандалорец» с момента его дебюта в 2019 году стал главным хитом сервиса Disney+, в немалой степени благодаря яркой роли Карано, покорившей поклонников «Звездных войн» образом наемницы Карасинтии Дюн. Карано планировали предложить съемки в нескольких приквелах к сериалу, где ее персонаж был бы центральным.
Сотрудничество с талантливой актрисой сразу же прекратило и агентство United Talent Agency, которое помогает актерам в поисках работы, что ставит под большой вопрос ее будущее. Свое увольнение она не комментировала, но ранее заявляла, что лишь отстаивает свое право выражать мнение, поскольку ее раздражает, что «большую часть американцев заставляют молчать».
Между тем
Председатель оргкомитета Олимпийских и Паралимпийских игр в Токио, бывший премьер Японии Ёсиро Мори, официально объявил о решении уйти в отставку на фоне развернувшегося вокруг него скандала. Напомним, Мори стал объектом критики, когда неаккуратно увязал количество женщин в составе спортивных комитетов и федераций с продолжительностью консультаций в этих органах. По его мнению, если одна женщина высказывает свое мнение по какому-либо вопросу, то и другая считает своим долгом выступить. После этого замечания Мори подвергся обструкции в соцсетях. Волна недовольства быстро перешла в публичную сферу и сделала смещение Мори с должности неизбежным. Японец признал свою ошибку и принес извинения, что, впрочем, так и не смогло переломить ситуацию в его пользу. По некоторым сведениям, на освободившуюся должность могут поставить министра по делам Олимпиады и Паралимпиады Сэйко Хасимото — титулованную спортсменку с опытом работы в правительстве.
Мелодия вместо гудка — услуга Ди-Джингл для абонентов сети Киевстар
Услуга «Ди-Джингл» позволяет заменить обычные гудки соединения на популярную песню или шутку, чтобы ожидание на линии было более приятным.
При звонке к вам вместо обычных гудков ваши друзья и партнеры будут слышать выбранные музыкальные хиты или шутки. При этом не имеет значения, абонентами какого оператора они являются, где территориально находятся и каким телефоном пользуются (музыка вместо гудка слышна даже при звонке со стационарного телефона).
Мелодия вместо гудка
Общая информация об услугеДля активации услуги закажите любимую песню или прикольную шутку. Менять настройки в вашем телефоне при этом не требуется.
Установить гудок на телефон в виде ди-джингла можно несколькими способами:
Как пользоваться услугой- Выбор и покупка ди-джинглов. Вы можете выбирать и прослушивать ди-джинглы, позвонив по номеру 465 или воспользовавшись каталогом на сайте http://465.ua/. При покупке Ди-джингла вы можете настроить режим его проигрывания — для каких абонентов и в какое время он будет звучать, а также, при желании, поставить приветствие, которое будет звучать перед ди-джинглом.
- Настройки проигрывания ди-джинглов. Вы можете установить разные ди-джинглы для разных абонентов или групп абонентов, а так же установить время, когда эти ди-джинглы будут звучать. Сделанные настройки можно изменить при помощи меню «Мои настройки Ди-Джингл», пункт «Настройка проигрывания мелодий» по номеру 465 или в разделе «Мой профиль» на сайте http://465.ua/ .
- Управление купленными ди-джинглами: Все купленные вами ди-джинглы, у которых не истек срок действия, сохраняются в меню «Мои профиль», пункт раздел «Мои ди-джинглы» на http://465.ua/ или по номеру 465. Также уточнить информацию касательно купленных мелодий вы можете, позвонив по номеру 465. Если при покупке ди-джингла вы не настроили его проигрывание и он не звучит при входящем вызове, вы всегда можете его найти и настроить при помощи этого меню.
- Случайное проигрывание нескольких ди-джинглов. Порадуйте друзей разнообразием своих музыкальных вкусов! Установите произвольный режим проигрывания купленных рингтонов, отправив SMS-код 06 на номер 465 либо при помощи меню «Мои настройки Ди-Джингл» по номеру 465, либо выберите меню «Мой профиль» раздел «Настройки ди-джинглов» и нажмите кнопку «Случайный порядок проигрывания» на сайте услуги http://465.ua/. В этом случае звонящие к вам будут слушать разные ди-джинглы из вашей галереи при каждом звонке.
- Функция «Нравится». С помощью новой функции «Нравится» вы можете оценить мелодии ди-джингл, которые звучат у ваших друзей. Предложение оценить мелодию звучит во время ее проигрывания до момента соединения. Чтобы отметить понравившийся мотив, нужно во время прослушивания нажать клавишу «*» (звездочка) на мобильном телефоне. После этого на номер вашего друга поступит SMS о том, что вам понравилась его мелодия, также в сообщении будет указано название мелодии и исполнитель. Функция бесплатна.
- Функция «Поделиться». Теперь вы можете поделиться со своими друзьями новостью о только что купленной мелодию ди-джингл! На странице услуги http://465.ua/ или с помощью звонка на номер 465 после заказа мелодии ди-джингл, вы можете воспользоваться функцией Поделиться, после чего Ваши друзья узнают о новом приобретении с помощью текстового сообщения. В тексте SMS будет указан исполнитель и название композиции. Функция бесплатна. Список друзей, которые получат сообщение, формируется автоматически по заданным критериям: это могут быть только абоненты сети Киевстар. В список друзей автоматически добавляются номера абонентов, которые 6 (шесть) или более раз в течение последнего месяца общались с абонентом воспользовался новой функцией «Поделиться» и сообщил знакомых о своем новом ди-джингл.
- Ди-джингл в подарок. Сделайте приятное другу или коллеге – подарите ему ди-джингл. Если он пользователь услуги «Ди-Джингл», ди-джингл будет добавлен в его галерею и получатель подарка должен самостоятельно установить, кому и когда он будет проигрываться. Если же абонент не пользуется услугой «Ди-Джингл», то при получении ди-джингла в подарок абоненту нужно в течение суток отправить пустое SMS на номер 465 для добавления мелодии в свою галерею, после чего подаренный ди-джингл будет установлен для проигрывания при всех входящих звонках в любое время.
- Запись собственного ди-джингла. Вы можете записать свой собственный эксклюзивный ди-джингл, выбрав меню «Запись своей личной мелодии» (функция доступна только по номеру 465).
- Копирование ди-джингла другого абонента. Если вам понравился ди-джингл друга, вы можете быстро и просто получить такой же. Когда вы звоните другу и слышите его ди-джингл — нажмите # на клавиатуре телефона. Или выберите меню «Скопировать ди-джингл у другого абонента» по номеру 465 либо меню «Моя галерея» и пункт «Копирование ди-джингла» на сайте и введите номер друга: http://465.ua/.
- Заказ ди-джингла по SMS-коду. Если вы знаете SMS-код ди-джингла, например, увидели его в буклете, вы можете заказать его при помощи меню «Заказать мелодию при помощи SMS-кода» по номеру 465 либо при помощи функции поиска на сайте услуги, например, увидели его в буклете, вы можете заказать его при помощи меню «Заказать мелодию при помощи SMS-кода» по номеру 465.
- Запись личного приветствия перед ди-джинглом. Записав одно или несколько приветствий своим голосом, вы можете установить их перед мелодиями. Это можно сделать при покупке мелодии или при помощи меню «Мои настройки Ди-Джингл» пункта «Установить личное приветствие перед мелодией» (функция доступна только по номеру 465).
Для управления услугой при помощи SMS необходимо отправить указанные коды на номер 465 (SMS не оплачивается):
- Поиск ди-джингла по имени исполнителя: 011 ХХХХХХ
ХХХХХХ — имя исполнителя латинскими буквами. Обратите внимание, что сейчас поиск работает только для исполнителей, чье имя пишется латинскими буквами. - Купить ди-джингл: ХХХХХХ
ХХХХХХ — 6-значный SMS-код ди-джингла, который можно увидеть на сайте услуги при выборе ди-джингла. - Подарить ди-джингл: 03 380YYYYYYYYY XXXXXX
YYYYYYYYY — номер абонента, начиная с кода оператора. Например 671234567.
XXXXXX — 6-значный SMS-код ди-джингла, который можно увидеть на сайте услуги при выборе ди-джингла. - Установить ди-джингл по умолчанию 09 ХХХХХХ
ХХХХХХ — 6-значный SMS-код ранее купленного ди-джингла.
Выбранный ди-джингл будет звучать для всех звонящих абонентов в любое время, если для этих абонентов не сделаны другие настройки. - Удалить мелодию из «Моей галереи»: 013 ХХХХХХ
XXXXXX — 6-значный SMS-код ранее купленного ди-джингла. - Установитьслучайное проигрывание нескольких ди-джинглов: 06
- Отключение услуги: 012
- Помощь: 014
- Включить функцию «Нравится» (на фоне мелодии иногда будет играть предложение оценить вашу мелодию и вам поступать бесплатные SMS сообщения, если кому-то понравилась ваша мелодия) : 020
- Отключить функцию «Нравится» (предложение оценить вашу мелодию не будет проигрываться и не будут поступать сообщения, что кому-то понравилась ваша мелодия): 021
- Включить получения SMS сообщений функции «Поделиться»: 022
- Отключить получение SMS сообщений функции «Поделиться»: 023
плата за активацию услуги — 0,00 грн;
плата за использование услуги — 15 грн в месяц для абонентов контрактной формы обслуживания, 0,50 грн/день для абонентов предоплаченной формы обслуживания;
стоимость установки (копирования) и продления мелодии / шутки — от 0,05 до 0,85 грн в день;
стоимость подарка — от 0,37 до 5,95 грн на 7 дней, или от 1,60 до 25,50 грн на 30 дней (оплачивает отправитель). Далее (через 7 или 30 дней) использование мелодии оплачивает получатель подарка;
cтоимость звонка на номер 465 — 0 грн;
стоимость персональной мелодии — 7,97 грн
стоимость отправки сообщения на номер 465 — 0,00 грн.
Если на момент снятия платы за услугу на вашем лицевом счете есть сумма, меньше размера платы за услугу, со счета снимается сумма, что равна размеру остатка средств на лицевом счете. При следующем пополнении счета на сумму, которая больше суммы задолженности за услугу, с лицевого счета снимается сумма, что осталась к оплате в полном размере платы за полученную услугу.
Тарифы указаны с учетом всех налогов и сборов. Если на момент снятия платы за пользование услугой на вашем лицевом счете нет средств, услуга в этот день тарифицироваться не будет.
В случае неуплаты стоимости за пользование услугой в течение периода более 31 дня услуга может быть отключена.
Перевод в английском и испанском словаре LEO
Aktivieren Sie JavaScript für mehr Features und höhere Geschwindigkeit beim Abfragen.
Существительные :: Подобные ::Существительные | ||||||||
---|---|---|---|---|---|---|---|---|
el patriotero |
Другие действия
Начать новую тему Управление словарным запасом Просмотреть историю поиска
Es existiert derzeit keine Diskussion zu Ihremserenbegriff 9000 на английском языке 9000 ⇔ Испанский словарь — лев.org: Начальная страница
SUCHWORT — Перевод в англо-испанском словаре LEO
LEO.org: Ваш онлайн-словарь для англо-испанских переводов. Предлагаем форумы, словарный инструктор и языковые курсы. Также доступно как приложение!
Выучите перевод слова SUCHWORT в англо-испанском словаре LEO. С таблицами существительных / глаголов для разных падежей и времен ✓ ссылки на звуковое произношение и соответствующие обсуждения на форуме ✓ бесплатный тренажер словарного запаса ✓
Запись сохранена в трейнере.Добавить в список слов сейчас?
Ваш вклад был отправлен на форум.
Определение ура-патриотизма от Merriam-Webster
джин · го · изм | \ ˈJiŋ- (ˌ) gō-ˌi-zəm \ : крайний шовинизм или национализм, отмеченный особенно агрессивной внешней политикой.Купить дешево Jingo cd key
GG.deal объединяет игровые ключи из более чем 40 магазинов цифровой дистрибуции, поэтому вы можете найти лучших предложений по видеоиграм . Все предложения уже включают скидки от ваучеров, чтобы сэкономить ваше время и деньги. Проверьте историю цен игры, чтобы определить, насколько выгодна сделка по сравнению с исторически низкими предложениями. Если цена по-прежнему слишком высока, создайте уведомление о цене и получите уведомление по электронной почте, когда Jingo будет соответствовать вашему бюджету!
Активируется ли CD-ключ Jingo в моем регионе?
Мы всегда стараемся, чтобы цена, отображаемая в нашем сравнении, была назначена правильным регионам.Однако некоторые магазины не сообщают информацию о региональных блокировках в своих фидах товаров, и это может приводить к очень редким ошибкам. Перед покупкой Jingo проверьте страницу магазина, чтобы узнать об ограничениях на активацию в вашем регионе. Если вы заметили какой-либо продукт, относящийся к неправильному региону на GG.deals, , свяжитесь с нами , и мы исправим список как можно скорее.
Смогу ли я сразу загрузить игру Jingo?Все магазины, представленные на GG.Сделки доставят вашу игру сразу после подтверждения оплаты. Это будет либо прямая загрузка, либо ключ ПК — в зависимости от выбранного вами магазина. После активации ключа на соответствующей платформе вы сможете бесплатно скачать и играть в свою игру. Если вы не знаете, как активировать ключ, ознакомьтесь с разделом руководств по внизу страницы.
Иногда некоторые магазины могут задерживать покупку для проверки вашего заказа вручную.Эти проверки предназначены для предотвращения мошенничества в магазине. Если ваш заказ выбран для ручной проверки, и вы не хотите ждать или предоставлять дополнительную информацию, вы всегда можете запросить отмену заказа и вернуть свои деньги.
Могу ли я получить бесплатный ключ Steam от Jingo? Есть ли способ скачать Jingo бесплатно?Если у вас мало денег и вы хотите получить Jingo бесплатно, есть несколько способов попробовать:
- Вы можете создать ценовое оповещение в GG.сделок и установите цену « бесплатно ». Такие магазины, как Humble Bundle или Indie Gala, часто раздают бесплатные ключи Steam в рекламных целях. В Epic Games Store также регулярно проводятся розыгрыши. Если есть способ получить Jingo бесплатно, вы узнаете об этом первым!
- GG.deals иногда организует розыгрыши , где вы можете выиграть хорошие игры за выполнение коротких заданий. Следите за этими розыгрышами и активно участвуйте, чтобы повысить шансы на выигрыш приза!
Даже если бесплатная загрузка Jingo недоступна, вы всегда можете сэкономить и получить ключ по минимально возможной цене с помощью GG.двигатель сравнения сделок.
Какой магазин Jingo выбрать? В чем разница между официальными магазинами и магазинами ключей?
Цена — не единственный критерий, который следует учитывать при покупке компьютерных игр через GG.deals.
- При проверке предложений для Jingo убедитесь, что ключ активирован через DRM по вашему выбору. Вы найдете эту информацию на игровой карте в виде значка запуска. Например, если вы хотите получить Jingo Steam key и активировать его в Steam, выберите магазин, у которого есть значок Steam.
- Выбирайте между официальными магазинами и магазинами ключей. Официальные магазины продают ключи к играм в розницу, получая их напрямую через разработчика или издателя игры. Магазины ключей перепродают ключи от игр из неизвестных источников. Цены в магазинах с ключами часто ниже, чем в официальных магазинах, но здесь есть определенные риски, и покупка через неавторизованных реселлеров не окажет прямой поддержки разработчикам игр.
Джордж Оруэлл: Редьярд Киплинг
Было жаль, что г.Элиоту следовало бы занять такую оборонительную позицию в длинном эссе, которым он предваряет эту подборку стихов Киплинга (1) , но этого не следовало избегать, потому что прежде, чем можно будет говорить о Киплинге, нужно избавиться от легенды. это было создано двумя группами людей, которые не читали его работы. Киплинг находится в особом положении, будучи притчей во языцех на протяжении пятидесяти лет. В течение пяти литературных поколений каждый просветленный презирал его, и к концу этого времени девять десятых этих просветленных будут забыты, а Киплинг в каком-то смысле все еще там.Мистер Элиот никогда не объясняет этот факт удовлетворительно, потому что, отвечая на поверхностное и знакомое обвинение Киплинга в «фашисте», он впадает в противоположную ошибку, защищая его там, где он не может быть оправдан. Бесполезно делать вид, что взгляд Киплинга на жизнь в целом может быть принят или даже прощен любым цивилизованным человеком. Бесполезно, например, утверждать, что, когда Киплинг описывает британского солдата, избивающего «негра» с помощью чистящей палочки, чтобы получить от него деньги, он действует просто как репортер и не обязательно одобряет то, что описывает.Нигде в творчестве Киплинга нет ни малейшего признака того, что он не одобряет такого рода поведение — напротив, в нем есть определенный садизм, сверх жестокости, которой должен обладать писатель такого типа. Киплинг — это ура-империалист, он бесчувственен с моральной точки зрения и отвратителен с эстетической точки зрения. Лучше начать с признания этого, а затем попытаться выяснить, почему он выживает, в то время как утонченные люди, хихикающие над ним, выглядят так плохо.
И все же на «фашистское» обвинение необходимо ответить, потому что первым ключом к пониманию Киплинга, морально или политически, является тот факт, что он был , а не фашистом. Он был далек от того, чтобы быть самым гуманным или самым «прогрессивным» человеком в наши дни. Интересным примером того, как цитаты повторяются туда-сюда без всяких попыток взглянуть на их контекст или раскрыть их значение, является строка из «Рецессиональный», «Меньшие породы без Закона».Эта фраза всегда хороша для насмешек в кругах анютиных глазок. Само собой разумеется, что «низшие породы» являются «туземцами», и возникает мысленная картина, как какой-то пукка-сахиб в пробковом шлеме пинает кули. В этом контексте смысл линии почти прямо противоположен этому. Фраза «низшие породы» почти наверняка относится к немцам, и особенно к пангерманским писателям, которые «лишены Закона» в смысле беззакония, а не в смысле бессилия.Вся поэма, традиционно воспринимаемая как оргия хвастовства, является осуждением силовой политики, как британской, так и немецкой. Стоит процитировать две строфы (я цитирую это как политику, а не как поэзию):
Если, опьяненные видом силы, мы отпустим
диких языков, которые не испытывают благоговения перед Тебой,
Такие хвастовства, какие используют язычники,
Или меньшие породы без Закона —
Господь Бог Саваоф, да пребудет с нами еще,
Чтобы мы забудьте — чтобы не забыть!За языческое сердце, которое уповает на нее,
В вонючей трубке и железном осколке,
Вся храбрая пыль, строящаяся на прахе,
И охраняющая, не зовет Тебя на стражу,
За безумную хвастовство и глупые слова —
Милость Твоя к Народу Твоему, Господи !
Большая часть фразеологии Киплинга заимствована из Библии, и, несомненно, во второй строфе он имел в виду текст из Псалма CXXVII: «Если господин не строит дома, то напрасно трудятся строящие его; Если не хранит Господь город, сторож бодрствует, но напрасно.«Этот текст не производит большого впечатления на умы постгитлеровцев. В наше время никто не верит в какие-либо санкции, превосходящие военную мощь; никто не верит, что можно преодолеть силу, кроме как большей силой. Нет «Закона», есть только сила. Я не говорю, что это истинное убеждение, просто это убеждение, которого действительно придерживаются все современные люди. Те, кто притворяется иначе, являются либо интеллектуальными трусами, либо поклонниками власти под тонкой маской, либо просто не догнали возраст, в котором они живут.Мировоззрение Киплинга префашистское. Он по-прежнему считает, что гордость предшествует падению и что боги наказывают высокомерие . Он не предвидит ни танка, ни бомбардировщика, ни радио, ни секретную полицию, ни их психологические последствия.
Но, говоря это, разве нельзя отрицать то, что я сказал выше о шовинизме и жестокости Киплинга? Нет, просто говорят, что империалистическое мировоззрение девятнадцатого века и мировоззрение современного гангстера — это две разные вещи. Киплинг определенно относится к периоду 1885–1902 годов.Великая война и ее последствия озлобили его, но он не показывает никаких признаков того, что узнал что-либо из событий после англо-бурской войны. Он был пророком британского империализма в его экспансионистской фазе (даже больше, чем его стихи, его одиночный роман The Light that Failed передает атмосферу того времени), а также неофициальным историком британской армии, старым наемником. армия, которая начала менять свою форму в 1914 году. Вся его уверенность, его подпрыгивающая вульгарная жизненная сила возникли из ограничений, которых не разделяет ни один фашист или почти фашист.
Киплинг провел последние годы своей жизни в обиде, и, без сомнения, причиной этого было политическое разочарование, а не литературное тщеславие. Почему-то история пошла не по плану. После величайшей победы, которую она когда-либо знала, Британия была меньшей мировой державой, чем прежде, и Киплинг был достаточно проницателен, чтобы понять это. Добродетель ушла из классов, которые он идеализировал, молодые были гедонистами или разочарованы, желание раскрасить карту красным испарилось. Он не мог понять, что происходит, потому что никогда не имел представления об экономических силах, лежащих в основе имперской экспансии.Примечательно, что Киплинг, похоже, не понимает, как и средний солдат или колониальный администратор, что империя — это в первую очередь забота о прибылях. Империализм в его понимании — это своего рода насильственная евангелизация. Вы направляете пистолет Гатлинга на толпу безоружных «туземцев», а затем устанавливаете «Закон», который включает дороги, железные дороги и здание суда. Поэтому он не мог предвидеть, что те же самые мотивы, которые привели к возникновению Империи, в конечном итоге разрушат ее. По той же причине, например, в малайских джунглях были расчищены каучуковые плантации, а теперь эти владения передаются японцам в целости и сохранности.Современные тоталитаристы знают, что делают, а англичане девятнадцатого века не знают, что делают. У обоих подходов есть свои преимущества, но Киплингу никогда не удавалось перейти от одного к другому. Его мировоззрение, учитывая тот факт, что он в конце концов был художником, было мировоззрением наемного бюрократа, который презирает «box-wallah» и часто живет всю жизнь, не осознавая, что «box-wallah» требует мелодии.
Но поскольку он отождествляет себя с официальным классом, он действительно обладает одной вещью, которой «просвещенные» люди редко или никогда не обладают, а именно чувством ответственности.Левый средний класс ненавидит его за это не меньше, чем за жестокость и пошлость. Все левые партии в высокоиндустриальных странах — это, по сути, фикция, потому что они делают своим делом борьбу с тем, что они на самом деле не хотят разрушать. У них есть интернационалистские цели, и в то же время они изо всех сил пытаются поддерживать уровень жизни, с которым эти цели несовместимы. Мы все живем, грабя азиатских кули, и все те из нас, кто «просвещен», утверждают, что этих кули нужно освободить; но наш уровень жизни и, следовательно, наше «просвещение» требует, чтобы грабеж продолжался.Гуманист всегда лицемер, и понимание этого Киплинга, возможно, является главным секретом его способности создавать красноречивые фразы. Было бы трудно отбросить одноглазый пацифизм англичан меньшим количеством слов, чем во фразе «издеваться над униформой, которая охраняет вас, пока вы спите». Верно, что Киплинг не понимает экономического аспекта взаимоотношений между интеллектуалом и дирижаблем. Он не видит, что карта окрашена в красный цвет в основном для того, чтобы кули можно было использовать.Вместо кули он видит индийского государственного служащего; но даже на этом плане его понимание функции, кто кого защищает, очень здраво. Он ясно видит, что люди могут быть высоко цивилизованными, в то время как другие люди, неизбежно менее цивилизованные, должны охранять и кормить их.
Насколько Киплинг действительно отождествляет себя с администраторами, солдатами и инженерами, которым он восхваляет? Не так полно, как иногда предполагают. Он очень много путешествовал, когда был еще молодым человеком, он вырос с блестящим умом в основном в мещанском окружении, и некоторые черты в нем, которые, возможно, были отчасти невротичны, привели его к тому, что он предпочел активного человека чувствительному.Англо-индийцы девятнадцатого века, если назвать наименее симпатичных из его кумиров, в любом случае были людьми, которые что-то делали. Может быть, все, что они сделали, было злом, но они изменили лицо земли (поучительно взглянуть на карту Азии и сравнить железнодорожную систему Индии с железнодорожной системой соседних стран), тогда как они могли бы достичь ничто, не смогли бы удержаться у власти в течение одной недели, если бы нормальное англо-индийское мировоззрение было, скажем, взглядом Э. М. Форстера.Каким бы безвкусным и поверхностным он ни был, картина Киплинга — единственная литературная картина англо-Индии девятнадцатого века, которая у нас есть, и он смог сделать это только потому, что был достаточно грубым, чтобы существовать и держать язык за зубами в клубах и полковых кругах. беспорядки. Но он не очень походил на людей, которыми восхищался. Я знаю из нескольких частных источников, что многие англо-индийцы, бывшие современниками Киплинга, не любили его и не одобряли его. Они сказали, без сомнения, верно, что он ничего не знал об Индии, и, с другой стороны, он, с их точки зрения, был слишком высоколобым.Находясь в Индии, он имел тенденцию общаться с «неправильными» людьми, и из-за его смуглого цвета лица его ошибочно заподозрили в полосе азиатской крови. Многое в его развитии связано с тем, что он родился в Индии и рано бросил школу. Имея немного иное образование, он мог бы стать хорошим писателем или превосходным автором песен для мюзик-холла. Но насколько верно то, что он был вульгарным флагманом, своего рода рекламным агентом Сесила Роудса? Это правда, но неправда, что он был помощником или служителем времени.Если так, то после юных лет он никогда не ухаживал за общественным мнением. Г-н Элиот говорит, что против него возражают то, что он выражал непопулярные взгляды в популярном стиле. Это сужает проблему, предполагая, что «непопулярный» означает непопулярный среди интеллигенции, но факт, что «послание» Киплинга было тем, что большая публика не хотела и, по сути, никогда не принимала. Народные массы в 90-е годы, как и сейчас, были антимилитаристами, им наскучила Империя, и только подсознательно патриотично.Официальными поклонниками Киплинга являются и были представители «обслуживающего» среднего класса, люди, которые читали Blackwood’s . В первые глупые годы этого века дирижабли, наконец обнаружив кого-то, кого можно было назвать поэтом и который был на их стороне, поставили Киплинга на пьедестал, а некоторые из его наиболее сентенционных стихотворений, таких как «Если», получили почти библейский статус. Но сомнительно, чтобы дирижабли когда-либо читали его внимательно, как и Библию. Многое из того, что он говорит, они не могли одобрить.Немногие люди, критиковавшие Англию изнутри, говорили о ней более горькие вещи, чем этот грязный патриот. Как правило, он атакует британский рабочий класс, но не всегда. Эта фраза о «фланелевых дураках у калитки и грязных болванах у ворот» остаётся стрелой и по сей день, и она нацелена на матч Итона и Хэрроу, а также на финал Кубка. Некоторые из стихов, которые он написал о англо-бурской войне, имеют удивительно современное звучание, насколько это возможно.«Стелленбош», который, должно быть, был написан примерно в 1902 году, суммирует то, что каждый умный пехотный офицер говорил в 1918 году или говорит сейчас, если на то пошло.
Романтические представления Киплинга об Англии и Империи, возможно, не имели бы значения, если бы он мог их придерживаться, не имея классовых предрассудков, которые в то время шли вместе с ними. Если посмотреть на его лучшие и наиболее представительные работы, на его солдатские стихи, особенно на Баллады о казарме , то можно заметить, что больше всего на свете их портит скрытая атмосфера покровительства.Киплинг идеализирует армейского офицера, особенно младшего офицера, и это до идиотской степени, но рядовой, хотя и милый и романтичный, должен быть комиком. Его всегда заставляют говорить что-то вроде стилизованного кокни, не очень широкого, но с тщательно опущенными нюансами и заключительными буквами «g». Очень часто результат такой же неприятный, как юмористическая декламация на церковном приеме. И этим объясняется тот любопытный факт, что часто можно улучшить стихи Киплинга, сделать их менее шуточными и менее вопиющими, просто просматривая их и перенося из кокни в стандартную речь.Особенно это касается его припевов, которые зачастую имеют поистине лирический характер. Подойдут два примера (один о похоронах, а другой о свадьбе):
Так что выбей свои трубы и следуй за мной!
И это кончай свайпами и следуй за мной!
О, послушай зов большого барабана,
Следуй за мной — следуй за мной домой!
Болейте на свадьбу сержанта —
Подбодрите их еще раз!
Серые кони в ландо,
И негодяй женат на шлюхе!
Вот восстановил айчи и тд.Киплингу следовало бы знать лучше. Ему следовало видеть, что две заключительные строки первой из этих строф — очень красивые строки, и это должно было подавить его импульс высмеять акцент рабочего. В старинных балладах господин и крестьянин говорят на одном языке. Это невозможно для Киплинга, который смотрит вниз с искаженной классовой точки зрения, и благодаря поэтической справедливости одна из его лучших строк испорчена, потому что «следуй за мной» гораздо уродливее, чем «следуй за мной домой».Но даже там, где это не играет никакой роли в музыкальном плане, шутливость его сценического диалекта кокни раздражает. Однако его чаще цитируют вслух, чем читают на печатной странице, и большинство людей инстинктивно вносят необходимые изменения, цитируя его.
Можно ли представить, чтобы рядовой в девяностые или сейчас читал баллад о казарме и чувствовал, что здесь писатель говорит от его имени? Это сделать очень сложно. Любой солдат, способный прочитать книгу стихов, сразу заметит, что Киплинг почти не осознает классовую войну, которая идет в армии так же, как и в других местах.Он не только считает солдата комичным, но и считает его патриотом, феодалом, горячим поклонником своих офицеров и гордым быть солдатом Королевы. Конечно, отчасти это правда, иначе сражения невозможно было бы вести, но «Что я сделал для тебя, Англия, моя Англия?» — это, по сути, вопрос среднего класса. Практически любой рабочий сразу бы ответил: «Что Англия для меня сделала?» Поскольку Киплинг это понимает, он просто объясняет это «сильным эгоизмом низших классов» (его собственная фраза).Когда он пишет не о британцах, а о «верных» индийцах, он использует мотив «салам, сахиб» до иногда отвратительных размеров. Тем не менее, верно то, что он гораздо больше заинтересован в простом солдате, гораздо больше беспокоится о том, что он получит справедливую сделку, чем большинство «либералов» его времени или наших собственных. Он видит, что солдату пренебрегают, низко недоплачивают и лицемерно презирают люди, чьи доходы он охраняет. «Я осознал, — говорит он в своих посмертных мемуарах, — голые ужасы частной жизни и ненужные мучения, которые он пережил».Его обвиняют в прославлении войны, и, возможно, он делает это, но не в обычном порядке, делая вид, что война — это своего рода футбольный матч. Как и большинство людей, способных писать боевые стихи, Киплинг никогда не участвовал в битвах, но его видение войны реалистично. Он знает, что пули ранят, что под огнем все напуганы, что обычный солдат никогда не знает, из-за чего идет война или что происходит, кроме как в своем углу поля боя, и что британские войска, как и другие войска, часто убегают:
Я слышу ножи за собой, но я не собираюсь смотреть в лицо своему человеку,
И я не знаю, куда я пошел, потому что я не останавливался, чтобы посмотреть,
Пока я не услышу визг нищего ‘ вышел на четверть, когда он бежал,
А я думал, что знаю голос и — это был я!
Модернизируйте стиль этого, и он мог бы появиться из одной из разоблачающих военных книг двадцатых годов.Или еще раз:
И теперь крепкие пули пронзают пыль,
И никто не хочет сталкиваться с ними, но каждый нищий должен;
Итак, как человек в кандале, который не хочет идти,
Они уводят их от компании необычайно жесткой и медленной.
Сравните это с:
Вперед легкую бригаду!
Был ли встревоженный мужчина?
Нет! хотя солдат знал, что
Кто-то ошибся.
Во всяком случае, Киплинг переусердствует с ужасами, потому что войны его юности вряд ли вообще были войнами по нашим стандартам.Возможно, это связано с его невротическим напряжением, жаждой жестокости. Но, по крайней мере, он знает, что люди, которым приказано атаковать невыполнимые цели , встревожены , а также что четыре пенса в день — это не щедрая пенсия.
Насколько полной или правдивой оставил нам Киплинг картину многолетней наемной армии конца девятнадцатого века? Надо сказать об этом, как и о том, что Киплинг писал об англо-Индии девятнадцатого века, что это не только лучшая, но почти единственная литературная картина, которая у нас есть.Он зафиксировал огромное количество материала, который иначе можно было бы собрать только из устных традиций или из нечитаемых полковых историй. Возможно, его картина армейской жизни кажется более полной и точной, чем она есть на самом деле, потому что любой англичанин среднего класса, вероятно, знает достаточно, чтобы заполнить пробелы. В любом случае, читая эссе о Киплинге, которое г-н Эдмунд Уилсон только что опубликовал или вот-вот опубликует (2) , я был поражен количеством вещей, которые нам скучно знакомы и кажутся едва понятными для понимания. американец.Но из ранних работ Киплинга, кажется, вырисовывается яркая и не вводящая в заблуждение картина старой до пулеметной армии — душные казармы в Гибралтаре или Лакхнау, красные мундиры, покрытые пирогом пояса и шляпы для пилотов. пиво, драки, порка, повешение и распятия, звуки горна, запах овса и хрени, рев сержантов с длинными усами, кровавые стычки, неизменно неуправляемые, переполненные военные корабли, пораженные холерой лагеря , «родные» наложницы, окончательная смерть в работном доме.Это грубая, вульгарная картина, в которой патриотический поворот в мюзик-холле, кажется, смешан с одним из ужасных отрывков Золя, но из нее будущие поколения смогут составить некоторое представление о том, что собой представляла многолетняя добровольческая армия. как. Примерно на том же уровне они смогут узнать кое-что о Британской Индии в те дни, когда автомобили и холодильники были неслыханными. Ошибочно полагать, что у нас могли бы быть лучшие книги по этим предметам, если бы, например, Джордж Мур, или Гиссинг, или Томас Харди пользовались возможностями Киплинга.Это случай, которого не может произойти. Вряд ли Англия девятнадцатого века выпустила книгу вроде Война и мир или второстепенных рассказов Толстого об армейской жизни, таких как Севастополь или Казаки , не потому, что таланта обязательно не хватало, а потому, что нет. человек, обладающий достаточной чувствительностью, чтобы писать такие книги, когда-либо установил бы соответствующие контакты. Толстой жил в великой военной империи, в которой для почти любого молодого человека из семьи казалось естественным провести несколько лет в армии, в то время как Британская империя была и до сих пор демилитаризована до такой степени, что континентальные наблюдатели находят почти невероятным.Цивилизованные люди с трудом удаляются от центров цивилизации, и на большинстве языков существует огромная нехватка того, что можно было бы назвать колониальной литературой. Потребовалось невероятное стечение обстоятельств, чтобы создать яркую картину Киплинга, в которой рядовой Ортерис и миссис Хоксби позируют на фоне пальм под звуки храмовых колоколов, и одним необходимым обстоятельством было то, что сам Киплинг был лишь наполовину цивилизованным.
Киплинг — единственный английский писатель нашего времени, который добавил в язык фразы.Фразы и неологизмы, которые мы используем и используем, не запоминая их происхождения, не всегда исходят от писателей, которыми мы восхищаемся. Странно, например, слышать, как нацистские вещатели называют российских солдат «роботами», тем самым бессознательно заимствуя слово у чешского демократа, которого они бы убили, если бы могли наложить на него руки. Вот полдюжины фраз, придуманных Киплингом, которые можно встретить цитируемыми в водоворотах в газетах или подслушивать в барах салуна от людей, которые едва слышали его имя.Будет видно, что все они имеют некоторую общую характеристику:
.Восток — это Восток, а Запад — это Запад.
Бремя белого человека.
Что они знают об Англии, которую знает только Англия?
Самка этого вида более опасна, чем самец.
Где-то к востоку от Суэца.
Плата датчанину.
Есть множество других, в том числе те, которые пережили свой контекст на много лет. Фраза «убить Крюгера своим ртом», например, была актуальной до недавнего времени.Также возможно, что именно Киплинг первым позволил использовать слово «гунны» для немцев; во всяком случае, он начал использовать его, как только пушки открыли огонь в 1914 году. Но все перечисленные мною фразы объединяет то, что все они являются фразами, которые произносятся полусмешливо (например, «Ибо я Я буду королевой мая, мама, я стану королевой мая), но какой из них рано или поздно обязательно воспользуется. Ничто не могло превзойти презрение New Statesman , например, к Киплингу, но сколько раз за мюнхенский период New Statesman цитировал эту фразу о выплате датчанина (3) ? Дело в том, что Киплинг, помимо его мудрости в закусочной и его дара упаковки дешевой живописности в несколько слов («пальма и сосна» — «к востоку от Суэца» — «дорога в Мандалай»), обычно говорит о то, что вызывает срочный интерес.С этой точки зрения не имеет значения, что думающие и порядочные люди обычно оказываются по ту сторону забора от него. «Бремя белого человека» немедленно вызывает в воображении настоящую проблему, даже если вы чувствуете, что его следует заменить на «бремя черного человека». Можно до мозга костей не соглашаться с политической позицией, подразумеваемой в «Островитянах», но нельзя сказать, что это легкомысленное отношение. Киплинг имеет дело с мыслями, которые одновременно вульгарны и постоянны. Это поднимает вопрос о его особом статусе как поэта или стихотворца.
Г-н Элиот описывает метрическую работу Киплинга как «стихи», а не «поэзию», но добавляет, что это « великих стихов», и уточняет это, говоря, что писателя можно охарактеризовать только как «великого стихотворца». «если есть какие-то его произведения», о которых мы не можем сказать, стихи это или поэзия ». Очевидно, Киплинг был стихотворцем, который иногда писал стихи, и в этом случае было жаль, что г-н Элиот не назвал эти стихи поименно. Проблема в том, что всякий раз, когда возникает необходимость в эстетической оценке работы Киплинга, мистер Федорович.Элиот слишком защищается, чтобы говорить прямо. Чего он не говорит, и что, как мне кажется, следует начинать с того, чтобы сказать при любом обсуждении Киплинга, так это то, что большая часть стихов Киплинга настолько ужасно вульгарна, что вызывает у человека такое же ощущение, какое возникает от просмотра третьесортной музыки. исполнитель в зале декламирует «Косичку У Фан Фу» с фиолетовым центром внимания на лице, , и все же многое из этого способно доставить удовольствие людям, которые знают, что такое поэзия.В своих худших и наиболее важных для него стихах, таких как «Гунга Дин» или «Дэнни Дивер», Киплинг — это почти постыдное удовольствие, как пристрастие к дешевым сладостям, которое некоторые люди тайно переносят в средние века. Но даже с его лучшими отрывками чувствуешь себя соблазненным чем-то фальшивым, но, несомненно, соблазненным. Если человек не просто сноб и не лжец, то невозможно сказать, что никто, заботящийся о поэзии, не мог получить удовольствие от таких строк, как:
Ибо ветер дует в пальмах, и храмовые колокола говорят:
«Вернись, ты, британский солдат, вернись в Мандалай!»
, и все же эти строки не являются поэзией в том же смысле, что «Феликс Рэндал» или «Когда сосульки висят у стены» — это поэзия.Возможно, Киплинга удастся найти более удачно, чем жонглирование словами «стих» и «поэзия», если описать его просто как хорошего плохого поэта. Он как поэт, как писательница Гарриет Бичер-Стоу. И само существование такого рода произведений, которые поколение за поколением воспринимают как вульгарные, но продолжают читать, кое-что говорит о том возрасте, в котором мы живем.
В английском языке много хороших и плохих стихов, и все они, я бы сказал, после 1790 года.Примеры хороших плохих стихов — я сознательно выбираю разные — это «Мост вздохов», «Когда весь мир молод, парень», «Атака легкой бригады», «Диккенс в лагере» Брета Харта », Похороны сэра Джона Мура »,« Дженни поцеловала меня »,« Кейт Равельстон »,« Касабьянка ». Все это пахнет сентиментальностью, и все же — возможно, не эти конкретные стихи, а стихи такого рода способны доставить истинное удовольствие людям, которые могут ясно видеть, что с ними не так. Можно было бы заполнить приличную антологию хорошими плохими стихами, если бы не тот важный факт, что хорошие плохие стихи обычно слишком хорошо известны, чтобы их стоило перепечатывать.
Бесполезно делать вид, что в наше время «хорошая» поэзия может иметь хоть какую-то подлинную популярность. Это и должен быть культ очень немногих, наименее терпимых из искусств. Возможно, это утверждение требует определенной квалификации. Истинная поэзия иногда может быть приемлемой для массы людей, когда она маскируется под что-то еще. Пример этого можно увидеть в народной поэзии, которая все еще существует в Англии, например, в некоторых детских и мнемонических стишках, а также в песнях, которые сочиняют солдаты, включая слова, которые идут в некоторые из звуков горна.Но в целом в нашей цивилизации само слово «поэзия» вызывает враждебное хихиканье или, в лучшем случае, такое застывшее отвращение, которое испытывает большинство людей, когда слышит слово «Бог». Если вы хорошо играете на концертине, вы, вероятно, могли бы пойти в ближайший публичный бар и за пять минут получить к себе благодарную аудиторию. Но каково было бы отношение той же аудитории, если бы вы предложили прочитать им, например, сонеты Шекспира? Однако хорошие плохие стихи могут дойти до самой бесперспективной аудитории, если заранее создана нужная атмосфера.Несколько месяцев назад Черчилль произвел большой эффект, процитировав «Endeavour» Клафа в одном из своих выступлений по радио. Я слушал эту речь среди людей, которых никак нельзя обвинить в заботе о поэзии, и я убежден, что переход к стихам произвел на них впечатление, а не смутил. Но даже Черчиллю это не сошло бы с рук, если бы он процитировал что-то гораздо лучшее, чем это.
В той мере, в какой писатель стихов может быть популярен, Киплинг был и, вероятно, остается популярным.При его жизни некоторые из его стихов вышли далеко за пределы читающей публики, за пределы мира школьных призов, песен бойскаутов, изданий в мягкой коже, покерных работ и календарей, и в еще более обширный мир музыки. залы. Тем не менее, мистер Элиот считает, что стоит отредактировать его, тем самым признавшись во вкусе, который разделяют другие, но не всегда достаточно честны, чтобы упомянуть его. Тот факт, что может существовать такая вещь, как хорошая плохая поэзия, является признаком эмоционального совпадения между интеллектуалом и обычным человеком.Интеллигент отличается от обычного человека, но только в определенных частях его личности, да и то не всегда. Но в чем особенность хорошего плохого стихотворения? Хорошее плохое стихотворение — изящный памятник очевидному. Он записывает в запоминающейся форме — поскольку стих — это, помимо прочего, мнемонический прием — некоторые эмоции, которыми может поделиться почти каждый человек. Достоинство стихотворения вроде «Когда весь мир молод, парень» в том, что, каким бы сентиментальным оно ни было, его сентимент является «истинным» чувством в том смысле, что вы обязательно обнаружите, что думаете о той мысли, которую оно выражает, рано или поздно. ; а затем, если вы случайно узнаете стихотворение, оно вернется вам в голову и покажется лучше, чем раньше.Такие стихи представляют собой своего рода рифмованную пословицу, и это факт, что определенно популярная поэзия обычно бывает гномической или сентенциональной. Подойдет один пример от Киплинга:
Белые руки держатся за поводья уздечки,
Шпора соскользнула с каблука ботинка;
Нежнейшие голоса кричат: «Повернись снова!»
Красные губы тускнеют стальные ножны:
До Геенны или до Престола,
Он путешествует быстрее всех, кто путешествует один.
Здесь бурно высказывается пошлая мысль.Возможно, это неправда, но, во всяком случае, это мысль, которую думают все. Рано или поздно вам представится повод почувствовать, что он путешествует быстрее всех, кто путешествует один, и вот эта мысль уже готова и как бы ждет вас. Так что велика вероятность, что, однажды услышав эту строчку, вы ее запомните.
Одну из причин силы Киплинга как хорошего плохого поэта я уже предлагал — его чувство ответственности, которое позволило ему иметь мировоззрение, даже если оно оказалось ложным.Хотя Киплинг не имел прямого отношения к какой-либо политической партии, он был консерватором, чего сейчас не существует. Те, кто сейчас называют себя консерваторами, являются либо либералами, либо фашистами, либо пособниками фашистов. Он идентифицировал себя с правящей властью, а не с оппозицией. Для одаренного писателя это кажется нам странным и даже отвратительным, но у этого было то преимущество, что Киплинг получил определенную власть над реальностью. Правящая власть всегда сталкивается с вопросом: «Что бы вы сделали в таких-то и таких-то обстоятельствах? ’, в то время как оппозиция не обязана брать на себя ответственность или принимать какие-либо реальные решения.Там, где это постоянная и пенсионная оппозиция, как в Англии, качество ее мысли соответственно ухудшается. Более того, всякий, кто начинает с пессимистического, реакционного взгляда на жизнь, имеет тенденцию оправдываться событиями, поскольку Утопия никогда не наступает, а «боги заглавий из тетради», как выразился сам Киплинг, всегда возвращаются. Киплинг продался британскому правящему классу не в финансовом, а в эмоциональном плане. Это исказило его политическое суждение, поскольку британский правящий класс был не тем, что он себе представлял, и привело его в пучину глупости и снобизма, но он получил соответствующее преимущество, хотя бы попытавшись представить себе, что такое действие и ответственность.В его пользу хорошо то, что он не остроумен, не «дерзок», не хочет épater les bourgeois . Он в основном имел дело с банальностями, и, поскольку мы живем в мире банальностей, многое из того, что он сказал, остается неизменным. Даже его худшие глупости кажутся менее поверхностными и менее раздражающими, чем «просвещенные» высказывания того же периода, такие как эпиграммы Уайльда или сборник девизов-взломщиков в конце Человек и Супермен .
_____
1) Выбор из стиха Киплинга , сделанный Т.С. Элиот (Faber & Faber, 82. 6d.). [назад]
2) 1945. Опубликовано в сборнике очерков, Рана и лук (Секер и Варбург). [назад]
3) На первой странице своей недавней книги Адам и Ева г-н Миддлтон Мерри цитирует хорошо известные строки:
«Есть девять и шестьдесят способов
построения племенных кладбищ,
И каждый из них прав».
Он приписывает эти строки Теккерею.Вероятно, это то, что известно как «фрейдистская ошибка». Цивилизованный человек предпочел бы не цитировать Киплинга, то есть предпочел бы не думать, что это Киплинг выразил свою мысль за него. [назад]
Jingo (Discworld, # 21; City Watch, # 4) Терри Пратчетт
Теренс Дэвид Джон Пратчетт, сэр Терри Пратчетт, родился в 13 лет, продал свой первый рассказ, что принесло ему достаточно денег, чтобы купить подержанную пишущую машинку. Его первый роман, юмористический фэнтези под названием The Carpet People , появился в 1971 году издателем Колином Смайтом.Терри много лет проработал журналистом и пресс-атташе, в свободное время писал и издавал несколько романов.
Теренс Дэвид Джон Пратчетт, сэр Терри Пратчетт продал свой первый рассказ, когда ему было тринадцать, что принесло ему достаточно денег. купить подержанную машинку. Его первый роман, юмористический фэнтези под названием The Carpet People , появился в 1971 году издателем Колином Смайтом.Терри много лет работал журналистом и пресс-секретарем, в свободное время писал и опубликовал ряд романов, в том числе свой первый роман Плоского мира, The Color of Magic , в 1983 году.В 1987 году он занялся писательской деятельностью на полную ставку.
В серии «Плоский мир» более 40 книг, четыре из которых написаны для детей. Первый из них, «Удивительный Морис и его образованные грызуны », был удостоен медали Карнеги.
Книга, не относящаяся к Небесному миру, Good Omens , его сотрудничество в 1990 году с Нилом Гейманом, была давним бестселлером и была переиздана в твердом переплете Уильямом Морроу в начале 2006 года (она также доступна в мягкой обложке для массового рынка — Harper Torch, 2006 — и торговля в мягкой обложке — Harper Paperbacks, 2006).
В 2008 году Harper Children’s опубликовала отдельный роман Терри, не относящийся к Небесному миру, « Nation ». Терри опубликовал Snuff в октябре 2011 года.
Считающийся одним из самых значительных англоязычных сатириков современности, Пратчетт получил множество литературных наград и был удостоен звания офицера Британской империи (OBE) «за заслуги перед литературой» в 1998 году. и получил почетные докторские степени Уорикского университета в 1999 г., Портсмутского университета в 2001 г., Университета Бата в 2003 г., Бристольского университета в 2004 г., Нового университета Бакингемшира в 2008 г., Дублинского университета в 2008 г., Брэдфордского университета в 2009 году, Университет Винчестера в 2009 году и Открытый университет в 2013 году за его вклад в государственную службу.
В декабре 2007 года Пратчетт сообщил, что у него была диагностирована болезнь Альцгеймера. 18 февраля 2009 года он был посвящен в рыцари королевой Елизаветой II.
В 2010 году он был награжден премией World Fantasy Life Achievement Award.
Сэр Терри Пратчетт скончался 12 марта 2015 года.
Здравствуйте. . . Привет . . . Привет . . . — WSJ
(Best of the Tube Tonight: Мы планируем появиться на «Hannity» сегодня вечером как часть «Великого американского жюри».»Fox News Channel, 9–10 вечера по восточному времени, с повторным показом в полночь по восточному времени.)
Брент Будовски, либеральный эксперт, пишущий для веб-сайта Hill’s, на днях опубликовал провокационный пост под названием «Мэтт Драдж и республиканское заблуждение»:
Позвольте мне предположить, что сила Драджа может оказаться скорее проклятием, чем благословением для республиканцев и консерваторов, потому что, на мой взгляд, она порождает заблуждения, которые могут привести к поражению. Недавно проведенный институтом Гэллапа опрос, который, конечно же, был посвящен Drudge, показал, что цифры Обамы (тогда) стали скорее неблагоприятными, чем благоприятными.Ситуация (сейчас) резко изменилась, о чем Драдж не сообщил, и теперь благосклонность Обамы намного превышает его отрицательные. В последнем опросе, проведенном Институтом Гэллапа на выборах в Конгресс, общее голосование за демократов лидирует среди республиканцев. Законопроект о здравоохранении принят, а результаты президентских опросов выросли. Демократические числа подкрались. Внимание СМИ к угрозам смерти со стороны правых отталкивает независимых политических деятелей и мотивирует демократическую базу. Но читатели Мэтта Драджа, слушатели Раша Лимбо и зрители Гленна Бека получают ложную дозу республиканского триумфализма и мегафон для того, что большинство избирателей может рассматривать как экстремизм, который является одновременно иллюзией и наносит политический ущерб республиканцам.
В своем широко обсуждаемом посте «Ватерлоо», в котором он критиковал республиканцев за то, что они выступают против ObamaCare вместо того, чтобы поддерживать его в обмен на улучшения, бывший исследователь Американского института предпринимательства Дэвид Фрум привел аналогичный аргумент:
Были лидеры, которые знали лучше, и которые хотели иметь дело. Но они оказались в ловушке. Консервативные болтуны на Fox и ток-радио довели республиканскую базу для голосования до такого безумия, что заключение сделок стало невозможным.Как вести переговоры с тем, кто хочет убить вашу бабушку? Или, точнее, с кем-то, кого убедили поверить в то, что ваших избирателей хотят убить их бабушку?
Эту колонку обычно не убеждают аргументы Будовского и Фрума. Но мы с некоторым интересом отмечаем, что конкретный аргумент в процитированных нами отрывках аналогичен аргументу, который мы уже давно приводили в отношении либеральных СМИ. Боб Тиррелл из журнала American Spectator назвал это «принципом Таранто»: «Согласно принципу Таранто, неспособность прессы привлечь левых к ответственности за плохое поведение лишь поощряет плохое поведение левых до такой степени, что их кандидаты отталкивают простых американцев. .«
Это работает посредством механизма обратной связи. Пример. Кандидат Джон Керри, надменный, на вид французского на тот момент младший сенатор от Массачусетса, который, кстати, служил во Вьетнаме, бесконечно хвастается своей службой во Вьетнаме. Сочувствующие журналисты пишут легковерные истории о его военном героизме, побуждая его хвастаться еще больше. Затем появляются ветераны быстрых лодок за правду, и весь миф развенчан. Керри входит в историю как постоянный объект насмешек — и пока он этим занимается, он проигрывает выборы.
Traicionera (Самба 50) | Латинская музыка 15 | Каган | 3:25 | € 1,49 | ||
Бахо Ла Луна (Самба 50) | Латинская музыка 15 | Паулина Рубино | 3:49 | Только альбом | ||
Те Сиго Пенсандо (Самба 50) | Латинская музыка 15 | Тадео | 3:38 | € 1,49 | ||
Акапелла (Самба 50) | Латинская музыка 15 | Миколас Йозеф | 2:29 | Только альбом | ||
Сонриса (Самба 50) | Латинская музыка 15 | Удай | 3:10 | € 1,49 | ||
Эль Бано (Самба 50) | Латинская музыка 15 | Ласаро | 3:24 | € 1,49 | ||
Касате Конмиго (Самба 50) | Латинская музыка 15 | Рафаль | 2:44 | € 1,49 | ||
3 часа ночи (Самба 51) | Латинская музыка 15 | Валерия | 3:03 | € 1,49 | ||
Ла Либертад (Самба 51) | Латинская музыка 15 | Диджей Рамос | 3:33 | € 1,49 | ||
Me Gusta (Самба 50) | Chartbreaker Vol.22 | Танцорчестер Клаус Халлен | 3:02 | € 1,49 | ||
Вуэло де Амор (Самба 50) | Латинский восход 2 | Стефания Морина | 2:58 | € 1,49 | ||
Сеньорита (Самба 51) | Латинские мега-хиты 6 | ДокторБеллидо | 3:52 | € 1,49 | ||
Ла Вида Каминандо (Самба 51) | Латинские мега-хиты 6 | Маркиз | 3:18 | Только альбом | ||
Негра (Самба 51) | Латинские мега-хиты 6 | Efecto Pasillo | 3:24 | Только альбом | ||
Аллегро Вентиго (Самба 50) | Латинские мега-хиты 6 | Исполнитель: Dan Balan feat.Маттео | 3:07 | Только альбом | ||
Сицилия Бедда (Самба 51) | Латинская бесконечность | Olivato Dancesport Orchestra | 2:26 | € 1,49 | ||
Con Calma (Самба 50) | Латинские ночи 4 | Диджей Рамос | 2:51 | € 1,49 | ||
Привет, ди-джей (Samba 50) | Латинские ночи 4 | Фраско | 3:15 | € 1,49 | ||
1, 2, 3 (Самба 50) | Латинские ночи 4 | Диджей Рико Латино | 3:06 | € 1,49 | ||
Ло Мало (Самба 50) | Латинские ночи 4 | Диджей дези | 2:50 | € 1,49 | ||
Байламе (Самба 50) | Латинские ночи 4 | Аламо | 3:07 | € 1,49 | ||
Байла Конмиго (Samba 50) | Латинские ночи 4 | Диджей Рико Латино | 3:16 | € 1,49 | ||
Йо Контиго, Ту Конмиго (Samba 50) | Латинские ночи 4 | Диджей Рико Латино | 2:55 | € 1,49 | ||
Эль Мисмо Соль (Самба 50) | Горячий ритм 1 | Среднее | 3:08 | € 1,49 | ||
Ла Гозадера (Самба 50) | Горячий ритм 1 | Среднее | 3:13 | € 1,49 | ||
Байла Конмиго (Samba 50) | Chartbreaker Vol. |