Clean param: Директива Clean-param — Вебмастер. Справка

Содержание

Директива Clean-param — Вебмастер. Справка

Используйте директиву Clean-param, если адреса страниц сайта содержат GET-параметры (например, идентификаторы сессий, пользователей) или метки (например, UTM), которые не влияют на их содержимое.

Примечание. Иногда для закрытия таких страниц используется директива Disallow. Рекомендуем использовать Clean-param, так как эта директива позволяет передавать основному URL или сайту некоторые накопленные показатели.

Обучающее видео. Как использовать директиву Clean-param.

Посмотреть видео

Заполняйте директиву Clean-param максимально полно и поддерживайте ее актуальность. Новый параметр, не влияющий на контент страницы, может привести к появлению страниц-дублей, которые не должны попасть в поиск. Из-за большого количества таких страниц робот медленнее обходит сайт. А значит, важные изменения дольше не попадут в результаты поиска.

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

Например, на сайте есть страницы:

www.example.com/some_dir/get_book.pl?ref=site_1&book_id=123
www.example.com/some_dir/get_book.pl?ref=site_2&book_id=123
www.example.com/some_dir/get_book.pl?ref=site_3&book_id=123

Параметр ref используется только для того, чтобы отследить с какого ресурса был сделан запрос и не меняет содержимое, по всем трем адресам будет показана одна и та же страница с книгой book_id=123. Тогда, если указать директиву следующим образом:

User-agent: Yandex
Disallow:
Clean-param: ref /some_dir/get_book.pl

Робот Яндекса сведет все адреса страницы к одному:

www.example.com/some_dir/get_book.pl?book_id=123

Если на сайте доступна такая страница, именно она будет участвовать в результатах поиска.

Чтобы директива применялась к параметрам на страницах по любому адресу, не указывайте адрес:

User-agent: Yandex
Disallow:
Clean-param: utm

Совет. Директива Clean-Param является межсекционной, поэтому может быть указана в любом месте файла. Если вы указываете другие директивы именно для робота Яндекса, перечислите все предназначенные для него правила в одной секции. При этом строка User-agent: * будет проигнорирована.

Clean-param: p0[&p1&p2&..&pn] [path]

В первом поле через символ & перечисляются параметры, которые роботу не нужно учитывать. Во втором поле указывается префикс пути страниц, для которых нужно применить правило.

Префикс может содержать регулярное выражение в формате, аналогичном файлу robots.txt, но с некоторыми ограничениями: можно использовать только символы A-Za-z0-9.-/*_. При этом символ * трактуется так же, как в файле robots.txt: в конец префикса всегда неявно дописывается символ *. Например:

Clean-param: s /forum/showthread.php

означает, что параметр s будет считаться незначащим для всех URL, которые начинаются с /forum/showthread.php. Второе поле указывать необязательно, в этом случае правило будет применяться для всех страниц сайта.

Регистр учитывается. Действует ограничение на длину правила — 500 символов. Например:

Clean-param: abc /forum/showthread.php
Clean-param: sid&sort /forum/*.php
Clean-param: someTrash&otherTrash
#для адресов вида:
www.example1.com/forum/showthread.php?s=681498b9648949605&t=8243
www.example1.com/forum/showthread.php?s=1e71c4427317a117a&t=8243

#robots.txt будет содержать:
User-agent: Yandex
Disallow:
Clean-param: s /forum/showthread.php
#для адресов  вида:
www.example2.com/index.php?page=1&sid=2564126ebdec301c607e5df
www.example2.com/index.php?page=1&sid=974017dcd170d6c4a5d76ae

#robots.txt будет содержать:
User-agent: Yandex
Disallow:
Clean-param: sid /index.php
#если таких параметров несколько:
www.example1.com/forum_old/showthread.php?s=681498605&t=8243&ref=1311
www.example1.com/forum_new/showthread.php?s=1e71c417a&t=8243&ref=9896

#robots.txt будет содержать:
User-agent: Yandex
Disallow:
Clean-param: s&ref /forum*/showthread.php
#если параметр используется в нескольких скриптах:
www.example1.com/forum/showthread.php?s=681498b9648949605&t=8243
www.example1.com/forum/index.php?s=1e71c4427317a117a&t=8243

#robots.txt будет содержать:
User-agent: Yandex
Disallow:
Clean-param: s /forum/index.php
Clean-param: s /forum/showthread.php

Описание и настройка директивы Clean-param — SEO на vc.ru

Clean-param — директива файла robots.txt, которую поддерживают роботы «Яндекса». Она позволяет сообщить динамические параметры, которые присутствуют в URL страницы, но не изменяют её содержание. Это могут быть идентификаторы пользователя, сессии, параметры сортировки товаров и другие элементы.

{«id»:63058,»type»:»num»,»link»:»https:\/\/vc.ru\/seo\/63058-opisanie-i-nastroyka-direktivy-clean-param»,»gtm»:»»,»prevCount»:null,»count»:1}

{«id»:63058,»type»:1,»typeStr»:»content»,»showTitle»:false,»initialState»:{«isActive»:false},»gtm»:»»}

{«id»:63058,»gtm»:null}

12 162 просмотров

Например, имеются страницы:

  • site.ru/catalog/category/?sort_field=PRICE&order=asc
  • site.ru/catalog/category/?sort_field=PRICE&order=desc
  • site.ru/catalog/category/?sort_field=id&order=asc

Все они содержат одинаковый контент, но имеют в своих URL-адресах параметры sort_field и order, которые определяют сортировку товаров на этой странице, но формально не меняют ее содержание. В результате у нас получается 3 страницы-дубликата.

Правильно настроить обработку таких страниц нам поможет директива Clean-param. Необходимо прописать её в файле robots.txt следующим образом:

User-Agent: Yandex … Clean-param: sort_field&order /catalog/category/

После этого индексироваться роботом Яндекса будет только одна страница: site.ru/catalog/category/, параметры sort_field и order учитываться не будут.

{ «osnovaUnitId»: null, «url»: «https://booster.osnova.io/a/relevant?site=vc&v=2», «place»: «between_entry_blocks», «site»: «vc», «settings»: {«modes»:{«externalLink»:{«buttonLabels»:[«\u0423\u0437\u043d\u0430\u0442\u044c»,»\u0427\u0438\u0442\u0430\u0442\u044c»,»\u041d\u0430\u0447\u0430\u0442\u044c»,»\u0417\u0430\u043a\u0430\u0437\u0430\u0442\u044c»,»\u041a\u0443\u043f\u0438\u0442\u044c»,»\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c»,»\u0421\u043a\u0430\u0447\u0430\u0442\u044c»,»\u041f\u0435\u0440\u0435\u0439\u0442\u0438″]}},»deviceList»:{«desktop»:»\u0414\u0435\u0441\u043a\u0442\u043e\u043f»,»smartphone»:»\u0421\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u044b»,»tablet»:»\u041f\u043b\u0430\u043d\u0448\u0435\u0442\u044b»}} }

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

Синтаксис директивы

Clean-param: p0[&p1&p2&..&pn] [path]

Поле p — это динамические параметры, влияние которых на индексацию необходимо устранить. Если таких несколько, их нужно перечислить через амперсанд, например, sort&price.

Поле path — префикс, указывающий путь применения директивы. Если его не указывать, Clean-param применится для всего сайта.

Файл robots.txt не имеет ограничений на количество указываемых директив Clean-param. В любом месте файла и количестве они будут учтены. В написании директивы учитывается регистр, а также длина правила ограничена 500 символами.

Пример применения

Допустим у нас имеется страница с такими get-параметрами:

  • https://orteka.ru/catalog/kompressionnyi-trikotazh/golfy/?sort=popularity&order=asc
  • https://orteka.ru/catalog/kompressionnyi-trikotazh/golfy/?sort=price&order=asc
  • https://orteka.ru/catalog/kompressionnyi-trikotazh/golfy/?sort=price&order=desc

Директива Clean-param должна иметь следующее содержание:

Clean-param: sort&order /catalog/kompressionnyi-trikotazh/golfy/

  • sort&order — это динамическиt параметры, которые не нужно учитывать;
  • /catalog/kompressionnyi-trikotazh/golfy/– префикс применения директивы, обозначает, что данные параметры не нужно учитывать только для страниц, начинающихся с /catalog/kompressionnyi-trikotazh/golfy/. Если необходимо, чтобы правило применялось ко всем страницам сайта, префикс указывать не нужно.

Clean-param Пам-Пам или об одном простом способе закрытия страниц от индексации в Яндексе

Если сделать опрос среди вебмастеров/оптимизаторов, слышали ли они про директиву Clean-param (от англ. clean parameters — чистые параметры), то практически все ответят положительно. Но если задать вопрос про ее использование, то ответы будут уже отрицательными. Что же это за такой зверь, которого все боятся и «с чем его едят»?

Для кого будет полезен Clean-param

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

. В большинстве случаев применять ее не нужно. Но также есть достаточно большой пул проектов, для которых ее применение необходимо или желательно:

1. Рекламируются на сторонних площадках, а переходы осуществляются не по прямым ссылкам. Например, при переходе с Яндекс.Маркета открывается URL с параметром frommarket.

В данном случае в индексе оказывается страница мобильной версии на поддомене. На ней стоИт междоменный rel=»canonical», который не учитывается Яндексом (хотя были случаи, когда учитывался).

Вот другой случай проиндексированных документов с параметрами.

2. Используют UTM-метки во внешних ссылках. Например, таким образом отслеживают эффективность рекламных каналов.

https://sosnovskij.ru/catalog/?utm_source=yandex&utm_medium=cpc&utm_campaign=audit

3. Содержат в URL параметры, не меняющие содержание страницы, например, идентификаторы сессий.

https://sosnovskij.ru/index.php?sessionID=jf1d3ks2fj7dss3fs33

4. Имеют большие масштабы — от нескольких десятков тысяч документов.

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

Как применять директиву?

Важное уточнение! Clean-param понимает только Яндекс. У Гугла был похожий инструмент, но в старой версии Google Search Console.

Директива прописывается в robots.txt в любом месте файла. В примерах официальной инструкции clean-param всегда указывался после User-agent: Yandex.

Я уточнил, обязательно ли указывать директиву именно для Yandex (я сторонник не плодить лишних юзер-агентов в роботсе, если на то нет объективных причин). Ответили следующее:

Директива Clean-param — межсекционная, поэтому будет учитываться в любом месте robots.txt, как для User-Agent: *, так и User-Agent: Yandex

Например, необходимо, чтобы все приведенные примеры не попадали в индекс (+ добавлю openstat):

  • https://sosnovskij.ru/catalog/3447/magazin/?frommarket=
  • https://sosnovskij.ru/catalog-old/54347/?r1=yandext&r2=
  • https://sosnovskij.ru/catalog/?utm_source=yandex&utm_medium=cpc&utm_campaign=audit
  • https://sosnovskij.ru/index.php?sessionID=jf1d3ks2fj7dss3fs33
  • https://sosnovskij.ru/page.php?_openstat=dTsx2MjM0OzU2Ndzg5O3lhbmRleC5ydT54pwcmVtaXVt

Добавляем в robots.txt в любое место под User-Agent: * или под User-Agent: Yandex (если есть оба, то под User-Agent: Yandex) следующие правила:

Clean-param: frommarket /catalog*/magazin/
Clean-param: yandext /catalog-old/
Clean-param: utm_source&utm_medium&utm_campaign /catalog/
Clean-param: sessionID /index.php
Clean-param: _openstat /page.php

Директива состоит из 2-х важных частей (с пробелом между ними):

1. Параметр. Здесь указываются параметры, которые необходимо игнорировать поисковому роботу (в примере «frommarket», «sessionID» и т.д). На 3-й строчке вы можете видеть конструкцию со знаком «&». Амперсанд используется в качестве аналога логического союза «и», объединяя параметры в одну строку. Этот момент я также уточнял у службы поддержки Яндекса. Мой вопрос:

Здравствуйте! Подскажите, пожалуйста, по использованию &» в директиве clean-param. Оно трактуется как «и» или «или»? То есть, например, имеются следующие URL:
— /category/1/?page_count=12 (только параметр page_count)
— /category/1/?pgen=3 (только параметр pgen)
— /category/1/?page_count=12&pgen=3 (и page_count, и pgen).

Если директива будет указана следующим образом:

Clean-param: page_count&pgen /category/

То она затронет все URL или только последний? Если последний, то корректнее будет следующий вариант?

Clean-param: page_count /category/
Clean-param: pgen /category/

С уважением, Сергей.

Ответили достаточно быстро:

Воспринимается как «и». Вы вполне можете использовать директиву Clean-param: page_count&pgen, хотя и второй вариант ошибкой не будет.

В общем, советую использовать «&» только тогда, когда указанные через амперсанд параметры используются в URL всегда вместе. В остальных случаях лучше написать дополнительное правило.

2. Префикс. Путь до URL с параметром. Здесь указываем маску урлов, как при стандартном закрытии страниц в rotobs.txt. Можно использовать знак звездочки «*» в качестве замены любого количества символов. По умолчанию «*» неявно проставляется в конце префикса (в конце дополнительно звездочку ставить не нужно).

Кидайте в комментарии ваши примеры URL, которые необходимо «закрыть» с помощью Сlean-param. Я напишу, какую директиву добавить в robots.txt

.

Некоторые особенности

  1. Учитывается регистр. UTM и utm — это 2 разных параметра. То же самое и в префиксах.
  2. Указывайте параметр полностью. Не «utm», а «utm_source». Вдруг у вас сайт на ЧПУ и есть материалы про такие популярные темы как: дутма (dutma), бутман (butman) или рекрутмент (rekrutment) .
  3. Подобные документы с различными параметрами можно закрывать и стандартными методами (canonical, <meta name=»robots» content=»noindex. nofollow»> и т. д.), но их не всегда возможно реализовать (необходимо дорабатывать код сайта). Дополнительно rel=»canonical» Яндекс не считает за строгое правило. Clean-param в некоторых случаях может быть надежнее и проще. Да и поисковому роботу не придется перебирать значения параметров. Как итог — ускорение и более полная индексация сайта.

Расскажите, а вы когда-нибудь использовали Clean-param в своей практике? Если да, то для каких случаев. Будет интересно ознакомиться с вашим опытом

.

☝ Как использовать директиву Clean-param для Get-параметров

С помощью Get-параметров на сайте создается структура, которая отвечает на интерес пользователя (покупателя). Чаще всего это фильтрация-сортировка по различным критериям – цене, объему, весу и т д товаров.

Примеры страниц с параметрами GET

Вот пример классической страницы с Get:

https://es-sense.ru/shop/folder/aromatizator-gotovyy-v-rastvore-500ml?view=list

Если мы уберем get-параметр ?view=list, то получим чистую страницу товара, а с ним это страница сортировки.

https://es-sense.ru/shop/folder/aromatizator-gotovyy-v-rastvore-500ml

Для навигации это удобно, но в интернет-магазине плодятся дубли, что не есть хорошо и заканчивается критической ошибкой в Яндекс Вебмастере.

Решение проблемы от Clean-param

Решается проблема в файле robots.txt, но ошибочно сразу ставить:

Disallow: /*view=list*

И добавлять директивы:

Disallow: /*view=thumbs*

Disallow: /*view=simple*

и пр.

Дубли закроются от индексации, но это не идеальное решение. Лучше использовать для запрета таких ссылок директиву Clean-param, так как она, в отличии от директивы Disallow, позволяет эффективно передать показатели страниц с незначащими GET-параметрами основным страницам.

Проще говоря, Disallow тупо обрежет страницы для индекса, а Clean-param избавит от дублей, но сохранит за основными страницами параметры Get от их навигационных дублей.

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

Можно к прочему использовать и rel=»canonical», но даже поддержка Яндекса голосует за Clean-param, а они видят мир с более высокой горы знаний.

Редактируем robots.txt

Итак, будем использовать Clean-param, но как прописать директиву в robots?

В нашем примере надо использовать конструкцию:

Clean-param: view

Они очистит все страниц с get-параметром view=.

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

Пример директивы:

Для адреса:

Site.ru/index.php?page=1&sid=974017dcd170d6c4a5d76ae

Решение такое:

Clean-param: sid /index.php

И так далее по шаблону.

Решение актуально для сайтов на сервисе Мегагрупп

Полный расклад по директиве Clean-param от Яндекса на странице поддержки https://yandex.ru/support/webmaster/robot-workings/clean-param.html#clean-param. 

Как настроить Clean-Param для файла robots.txt на Блоггер (Blogger)?

Столкнулся на одном из своих блогов на платформе Блоггер (Blogger) с появлением страниц-дублей с GET-параметрами. Произошло это после смены дефолтного шаблона, на сторонний. В разделе Вебмастер (Яндекс) по пути:

Диагностика -> Диагностика сайта

Появились сообщения о данных страницах:


Яндекс рекомендуем использовать директиву Clean-param в robots.txt, чтобы робот игнорировал незначащие GET-параметры и объединил все сигналы со страниц-копий на основной странице.

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

Как настроить свой файл robots.txt на Blogspot (Блогспот)?


Выбираем свой блог в аккаунте Блогспот (1.) и переходив в раздел «Настройки» (2.). Прокручиваем страницу «Настройки» и находим «Поисковые роботы и индексирование». Переключаем ползунок (3.) напротив параметра «Использовать собственный файл robots.txt» и нажимаем на пространство (4.) под параметром «Пользовательский файл robots.txt».


После этого, откроется небольшое окошко, в которое нам необходимо указать свои настройки (1.) для robots.txt файла на Blogspot. После внесения настроек, не забываем их сохранить (2.).

Как настроить Clean-Param для файла robots.txt на Блоггер (Blogger)?

А тут проблема. Столкнулся с тем, что при попытке указать Clean-Param в файле robots.txt для Блоггер, при попытке сохранить внесенные изменения, получал сообщение об ошибке:

Содержимое файла robots.txt не соответствует правилам форматирования.

Связано это скорее всего с тем, что Google не распознает Clean-param. Для данной задачи, Google предоставляет инструмент «Параметры URL».

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

В нашем случае с настройкой Clean-param по рекомендации Яндекса, мы можем решить посредством закрытия от индексации URL адресов с параметрами. Для этого добавляем следующие данный в свой robots.txt файл:

User-agent: Mediapartners-Google
Disallow:

User-agent: *
Disallow: /search
Disallow: /*?
Allow: /

Sitemap: https://имя_вашего_блога.blogspot.com/sitemap.xml

Проверить свой файл robots.txt, вы можете в Google Search Console. Добавьте свой robots.txt и укажите URL с параметром. Проверьте результат, URL должен блокироваться от индексации:

Теперь проверьте, индексируется ли ваш URL без параметров:

Аналогично, проверяем результат работы файла robots.txt для Блоггер в Вебмастер Яндекс. Для этого в кабинете Вебмастера, выбираем свой сайт и переходим в разделе «Инструменты» (1.) в параметр «Анализ robots.txt» (2.). Нажимаем «Проверить» (3.) для определения настроек файла

После, прокручиваем страницу ниже и указываем свои страницы-дубли с GET-параметрами, после чего, нажимаем «Проверить» (1.). Все ссылки с GET-параметрами, должны быть закрыты в robots.txt от индексации (2.):

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

После данных манипуляций и настроек файла robots.txt для Блоггер, переходим в «Проблемы сайта» (по пути «Диагностика» -> «Диагностика сайта») и напротив проблемы, нажимаем «Проверить».

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

Недостатки.

Было замечено, что после создания данного файла robots.txt, Google Search Console сообщает в разделе «Покрытие» о том, что некоторые страницы были проиндексированы, несмотря на запрет индексации в robots.txt:


При проверке любой ссылки с пометкой «Предупреждение» и типом «Проиндексировано, несмотря на блокировку в файле robots.txt», мы увидим сообщение, что страница есть в индексе, хотя URL заблокирован к индексации в файле robots.txt:

При детальном просмотре, можно увидеть, что проблемы с индексацией, возникают там, где страница была проиндексирована мобильным пауком (Googlebot-Mobile):


Данная страница, имеет пометку, что она заблокирована в файле robots.txt для сканирования. При этом, она по прежнему разрешена для индексации.

Связанно это скорее всего с тем, что мобильный Googlebot-Mobile, заходил по ссылке с GET-параметром 

?m=1

Так как мы, заблокировали все подобные GET-параметры в своем robots.txt, мы и получаем подобную ошибку. Примечательно и то, что если проверить этот же URL в инструменте проверки robots.txt на доступность страницы на доступность Googlebot-Mobile, мы не получим ошибки:


При этом, наша ссылка без GET-параметров. Стоит нам проверить ссылку с GET-параметром
?m=1 и мы получим блокировку индексации. Верно, именно этого мы и добивались, чтобы исключить дубли страниц. Скорее всего, мобильные Googlebot-Mobile заходят на сайт с мобильных устройств.

Заключение.

Несмотря на то, что платформа Блоггер (Blogger) не дает возможности указать в своем robots.txt директиву Clean-param, мы можем использовать обходной вариант и исправить проблемы на блоге Blogger с дублями страниц, у которых присутствуют GET-параметры.

Способ рабочий и универсальный, так как позволяет исключить дубли страниц черен настройки robots.txt как для поисковой системы Яндекс, так и для поисковика Google.

При этом, возникают проблемы сканирования страниц ботом Googlebot-Mobile. Это приводит к появлению предупреждений в Google Search Console раздела «Покрытие», что часть страниц были проиндексированы, несмотря на запрет в robots.txt. К сожалению, мне не известны способы решения данной проблемы. Если вы найдете решение для Blogger, поделитесь им в комментариях.

Другая проблема в том, что если игнорировать проблему с ошибками GET-параметрами в Яндекс. Вебмастер, вы рискуете потерять Индекс качества сайта (ИКС). У меня так понизили сайт на 10. Как только исправил проблему с GET-параметрами, ИКС вернулся обратно.

Использовать ли данное решение на своем блоге на платформе Blogger или нет, зависит от того, на какую аудиторию рассчитан ваш сайт. При получении трафика из Google, возможно и не стоит использовать данное решение. Если основной трафик у вас из Яндекса, естественно, игнорировать ошибки с GET-параметрами нельзя, так как это негативно скажется на позициях вашего сайта. В любом случае, используйте данный вариант, ТОЛЬКО если у вас появились проблемы с GET-параметрами. Если у вас их нет (не отображаются ошибки в Яндекс Вебмастер), оставляйте файл robots.txt по умолчанию и ничего не изменяйте!

И помните, что если позволяют финансы, лучше найдите специалиста.

Добавлено 07.11.2021

У меня в поиске Google, начали появляться страницы без описания, с указанием на справку Google.


Проверив Вебмастер Яндекс и убедившись, что пропали дубли страниц, было принято решение, отключить вышеприведенный robots.txt, из-за проблем с индексацией сайта мобильным ботом Google. При этом, у меня не было указано в шаблоне блога канонические ссылки на страницах. Как так вышло, даже не знаю. В связи с этим, прописал код в шаблон:

<link expr:href=’data:blog.url.canonical’ rel=’canonical’/>

Для добавления вышеприведенного кода, переходим в «Тема» (1.) и нажимаем на раскрывающийся (2.) список (напротив «НАСТРОИТЬ»):

В выпадающем списке, выбираем «Изменить HTML»:

И вставляем вышеприведенный код (2.), после <head> (1.):


Это позволит нам сообщить поисковым системам, что все data:blog.url (ссылки) являются каноническими. 

После, ищем все 

data:blog.url

в коде и добавляем

.canonical

Для этого, нажимаем в редакторе кода CTRL -> F и в появившемся поле поиска (1.), указываем:

data:blog.url

Нажимаем Enter и в найденных результатах, добавляем:

.canonical

После внесения изменений, не забываем сохранить правки:

 

В результате, наши страницы, должны показывать канонический адрес, без GET-параметров (?m=1, ?m=0, ?comments_89917 и т. п.):

Мной было также обнаружено, что в стандартных новых темах Blogger, прописан канонический адрес в шаблоне.

 

Таким образом, как и указывал в начале поста, если будете использовать сторонние темы, всегда их старайтесь проверять.

На данный момент, пока наблюдаю за ситуацией. Если дублей больше не появится с GET-параметрами в Яндексе или Google, отпишусь в данной заметке. Если будет новая информация, обязательно ее добавлю.

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

Добавлено 04.12.2021

В панели Яндекс Вебмастер, наблюдаю картину, как страницы с GET-параметрами, автоматически исключаются из индекса и не дублируются, так как не являются каноническими страницами. 

Аналогичная ситуация и в Google Search Console. Таким образом, еще раз рекомендую владельцам сайтов на платформе Блоггер, не использовать файл роботс (robots.txt) приведенный в начале заметки, а указать канонический (canonical) адрес для страниц. Это позволит сохранить нормальную индексацию блога мобильным роботом Google. Если будут уточнения и дополнения из вашего опыта, пожалуйста, делитесь ими в комментариях. Ваш опыт, будет полезен и другим. Заранее, спасибо и успехов в продвижении блогов на Блогспот.

Добавлено 18.01.2022

Если у вас сообщения с GET-параметрами следующего вида на конце url-страниц:

?showComment=

Пример на скрине:

Можно использовать следующий robots.txt для Блоггера:

User-agent: *
Disallow:
Disallow: /search
Disallow: /?showComment=
Sitemap: https://pc103help.blogspot.com/sitemap.xml

Новая ошибка от Яндекса: отсутствие директивы Clean-Param

1. ОПРЕДЕЛЕНИЕ ТЕРМИНОВ

1.1. В настоящей Политике конфиденциальности используются следующие термины:

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

1.1.2. «Персональные данные» — любая информация, относящаяся прямо или косвенно к определяемому физическому лицу (субъекту персональных данных).

1.1.3. «Обработка персональных данных» — любое действие (операция) или совокупность действий (операций), совершаемых с использованием средств автоматизации или без использования таких средств с персональными данными, включая сбор, запись, систематизацию, накопление, хранение, уточнение (обновление, изменение), извлечение, использование, передачу (распространение, предоставление, доступ), обезличивание, блокирование, удаление, уничтожение персональных данных.

1.1.4. «Конфиденциальность персональных данных» — обязательное для соблюдения Организацией или иным получившим доступ к персональным данным лицом требование не допускать их распространения без согласия субъекта персональных данных или наличия иного законного основания.

1.1.5. «Пользователь сайта (далее Пользователь)» – лицо, имеющее доступ к Сайту, посредством сети Интернет и использующее Сайт Организации.

1.1.6. «IP-адрес» — уникальный сетевой адрес узла в компьютерной сети, построенной по протоколу IP.

1.1.7. «Cookies» — небольшой фрагмент данных, отправленный веб-сервером и хранимый на компьютере пользователя, который веб-клиент или веб-браузер каждый раз пересылает веб-серверу в HTTP-запросе при попытке открыть страницу соответствующего сайта.

2. ОБЩИЕ ПОЛОЖЕНИЯ

2.1. Порядок ввода в действие и изменения Политики конфиденциальности:

2.1.1. Настоящая Политика конфиденциальности (далее – Политика конфиденциальности) вступает в силу с момента его утверждения приказом Руководителей Организации и действует бессрочно, до замены его новой Политикой конфиденциальности.

2.1.2. Изменения в Политику конфиденциальности вносятся на основании Приказов Руководителей Организации.

2.1.3. Политика конфиденциальности персональных данных действует в отношении информации, которую ООО «Третий Путь» (далее – Организация) являясь владельцем сайтов, находящихся по адресам: 3put.ru, а также их поддоменах (далее – Сайт и/или Сайты), может получить от Пользователя Сайта при заполнении Пользователем любой формы на Сайте Организации. Администрация сайта не контролирует и не несет ответственность за сайты третьих лиц, на которые Пользователь может перейти по ссылкам, доступным на Сайтах.

2.1.4. Администрация сайта не проверяет достоверность персональных данных, предоставляемых Пользователем.

2.2. Порядок получения согласия на обработку персональных данных и их обработки:

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

2.2.2. В случае несогласия с условиями Политики конфиденциальности и отзывом согласия на обработку персональных данных Пользователь должен направить на адрес эл. почты и/или на почтовый адрес Организации заявление об отзыве согласия на обработку персональных данных.

2.2.3. Согласие Пользователя на использование его персональных данных может храниться в Организации в бумажном и/или электронном виде.

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

2.2.5. Обработка персональных данных Пользователя без их согласия осуществляется в следующих случаях:

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

2.2.6. Кроме персональных данных при посещении Сайта собираются данные, не являющиеся персональными, так как их сбор происходит автоматически веб-сервером, на котором расположен сайт, средствами CMS (системы управления сайтом), скриптами сторонних организаций, установленными на сайте. К данным, собираемым автоматически, относятся: IP адрес и страна его регистрации, имя домена, с которого Пользователь осуществил перехода на сайты организации, переходы посетителей с одной страницы сайта на другую, информация, которую браузер Посетителя предоставляет добровольно при посещении сайта, cookies (куки), фиксируются посещения, иные данные, собираемые счетчиками аналитики сторонних организаций, установленными на сайте. Эти данные носят неперсонифицированный характер и направлены на улучшение обслуживания Пользователя, улучшения удобства использования сайта, анализа посещаемости. Эти данные собираются автоматически, отправку этих данных Пользователь может запретить, отключив cookies (куки) в браузере, в котором открывается сайт.

2.2.7. Порядок обработки персональных данных:

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

3. ПРЕДМЕТ ПОЛИТИКИ КОНФИДЕНЦИАЛЬНОСТИ

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

3.2. Персональные данные, разрешённые к обработке в рамках настоящей Политики конфиденциальности, предоставляются Пользователем путём заполнения регистрационной формы на Сайте и включают в себя следующую информацию:

3.2.1. фамилию, имя, отчество Пользователя.

3.2.2. контактный телефон Пользователя.

3.2.3. адрес электронной почты (e-mail).

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

4. ЦЕЛИ СБОРА ПЕРСОНАЛЬНОЙ ИНФОРМАЦИИ ПОЛЬЗОВАТЕЛЯ

4.1. Персональные данные Пользователя Администрация сайта может использовать в целях:

4.1.1. Установления с Пользователем обратной связи, включая направление уведомлений, запросов, касающихся использования Сайта, оказания услуг, обработка запросов и заявок от Пользователя.

4.1.2. Осуществления рекламной деятельности с согласия Пользователя.

4.1.3. Регистрации Пользователя на Сайтах Организации для получения индивидуальных сервисов и услуг.

4.1.4. Совершения иных сделок, не запрещенных законодательством, а также комплекс действий с персональными данными, необходимых для исполнения данных сделок.

5. СПОСОБЫ И СРОКИ ОБРАБОТКИ ПЕРСОНАЛЬНОЙ ИНФОРМАЦИИ

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

5.2. При утрате или разглашении персональных данных Администрация сайта информирует Пользователя об утрате или разглашении персональных данных.

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

6. ОБЯЗАТЕЛЬСТВА СТОРОН

6.1. Пользователь обязан:

6.1.1. Предоставить информацию о персональных данных, необходимую для пользования Сайтом.

6.1.2. Обновить, дополнить предоставленную информацию о персональных данных в случае изменения данной информации.

6.2. Администрация сайта обязана:

6.2.1. Использовать полученную информацию исключительно для целей, указанных в п. 4 настоящей Политики конфиденциальности.

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

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

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

7. ОТВЕТСТВЕННОСТЬ СТОРОН

7.1. Администрация сайта, не исполнившая свои обязательства, несёт ответственность в соответствии с действующим законодательством Российской Федерации, за исключением случаев, предусмотренных п.2.5. и 7.2. настоящей Политики

Конфиденциальности.

7.2. В случае утраты или разглашения Конфиденциальной информации Администрация сайта не несёт ответственность, если данная конфиденциальная информация:

7.2.1. Стала публичным достоянием до её утраты или разглашения.

7.2.2. Была получена от третьей стороны до момента её получения Администрацией сайта.

7.2.3. Была разглашена с согласия Пользователя.

8. РАЗРЕШЕНИЕ СПОРОВ

8.1. До обращения в суд с иском по спорам, возникающим из отношений между Пользователем сайта и Администрацией сайта, обязательным является предъявление претензии (письменного предложения о добровольном урегулировании спора).

8.2. Получатель претензии в течение 30 календарных дней со дня получения претензии, письменно уведомляет заявителя претензии о результатах рассмотрения претензии.

8.3. При не достижении соглашения спор будет передан на рассмотрение в судебный орган в соответствии с действующим законодательством Российской Федерации.

8.4. К настоящей Политике конфиденциальности и отношениям между Пользователем и Администрацией сайта применяется действующее законодательство Российской Федерации.

9. ДОПОЛНИТЕЛЬНЫЕ УСЛОВИЯ

9.1. Администрация сайта вправе вносить изменения в настоящую Политику конфиденциальности без согласия Пользователя.

9.2. Новая Политика конфиденциальности вступает в силу с момента ее размещения на Сайте, если иное не предусмотрено новой редакцией Политики конфиденциальности.

9.3. Действующая Политика конфиденциальности размещена на страницах сайтов находящихся по адресам: 3put.ru, а также на их поддоменах.

Дополнительные директивы Robots.txt — Crawl-Delay и Clean-param

  Дополнительные правила поисковикам

В одной из статей я уже описывал файл Robots.txt. В принципе, того описания достаточно, чтобы составить данный файл для любого сайта. Но всё же есть в нём ещё кое-что, о чём следует рассказать — это пара дополнительных директив: Crawl-Delay и Clean-param.

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

Дополнительные директивы Robots.txt

Первая из них — Crawl-Delay. С английского буквально переводится как «задержка ползания». Таким образом, данная директива задаёт время между переходами поискового робота с одной страницы сайта на другую.

Пишется, например, так:

User-agent: Yandex

Crawl-delay: 3.5   #задержка 3.5 секунд для перехода между страницами

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

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

Вторая дополнительная директива Robots.txt — Clean-param. Переводится как «очистка параметров». Собственно, для этого она и используется — для исключения некоторых страниц, содержащих динамические параметры в URL.

Про динамические параметры в Url я уже писал в одноимённой статье: http://web-ru.net/internet/chto-takoe-dinamicheskie-ssylki-url-i-dinamicheskie-stranicy.html. Грубо говоря, это примерно следующее: http://site.ru/…/?a=1&b=3&… — т.е. a и b — параметры.

К примеру, есть у нас страница форума http://forum.ru/index.php?sid=8761234&topic=123, где параметр sid для каждого посетителя форума абсолютно новый (такое часто бывает, потому что форумные движки любят создавать т.н. идентификаторы сессий — sid).

Т.к. идентификатор каждый раз новый, то для одной страницы создаётся столько URL’ов, сколько пользователей её посещает. И если все эти УРЛ попадут в индекс поисковой системы, то будет не очень хорошо — создадутся дубликаты одной страницы, и как поведёт себя поисковик — не известно. Он может оставить одну страницу, а может выкинуть все.

Поэтому следует «очистить» параметр sid с помощью директивы Clean-param. Сделать это можно так:

User-agent: *

Disallow:

Clean-param: sid /forum.ru/index.php

В результате, все страницы вида http://forum.ru/index.php?sid=xxx&topic=123 будут сведены к одной, любой из них. Например, первой попавшей в индекс: http://forum.ru/page.php?sid=8761234&topic=123.

Можно вообще откинуть оба параметра:

Clean-param: sid&topic /forum.ru/index.php

В общем виде, эта директива файла Robots.txt пишется так:

Clean-param: p0[&p1&p2&..&pn] [path]

— т.е. параметр (или их список через «&») и шаблон страницы, к которой они приписываются. Шаблон описывается как обычно в Роботс, но исключая символы ? и &.

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

Disallow: *?

Ну а также можно использовать канонические ссылки.

Кстати, пока писал эту статью, заметил интересную вещь:

  Google проиндексировал собственный Robots.txt

Гугл выдал собственный Роботс.тхт. Ещё и заголовок ему добавил, весьма необычно

Loading… Учебник

— как использовать постоянные параметры с Azure CLI

  • Статья
  • 6 минут на чтение
  • 6 участников

Полезна ли эта страница?

да Нет

Любая дополнительная обратная связь?

Отзыв будет отправлен в Microsoft: при нажатии кнопки отправки ваш отзыв будет использован для улучшения продуктов и услуг Microsoft.Политика конфиденциальности.

Представлять на рассмотрение

В этой статье

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

В этом уроке вы научитесь:

  • Использовать az config param-persist справочные команды
  • Выполнение последовательных команд с использованием сохраненных параметров

В этом руководстве используются следующие команды Azure CLI

.

Если у вас нет подписки Azure, создайте бесплатную учетную запись перед началом работы.

Предпосылки

  1. Установка Azure CLI

    При желании вы также можете использовать Azure Cloud Shell для выполнения действий, описанных в этом руководстве. Azure Cloud Shell — это интерактивная среда оболочки, которую вы используете через браузер. Запустите Cloud Shell одним из следующих способов:

    .
  2. Если вы используете локальную установку Azure CLI, выполните следующие действия:

    • Войдите в систему, используя команду az login, затем следуйте инструкциям, отображаемым на вашем терминале, чтобы завершить процесс аутентификации.

        аз логин
        
    • Для работы с этим руководством требуется Azure CLI версии 2.12.0 или более поздней. Запустите az version, чтобы найти установленную версию и зависимые библиотеки. Чтобы выполнить обновление до последней версии, запустите az upgrade.

1. Определите свой локальный каталог

Значения постоянных параметров хранятся в рабочем каталоге учетной записи хранения Azure, используемой Azure Cloud Shell. Если вы используете локальную установку Azure CLI, значения хранятся в рабочем каталоге на вашем компьютере.

Чтобы найти, создать или изменить рабочий каталог, используемый Azure CLI, используйте эти знакомые команды CLI.

  # Список каталогов
директор

# Сделать каталог
mkdir azCLI

# Изменить каталог
компакт-диск azCLI
  

2. Включите постоянные параметры

Перед сохранением значений параметров необходимо включить постоянные параметры. Вы будете получать предупреждение до тех пор, пока параметр az config param-persist не выйдет из экспериментальной стадии. См. раздел Обзор: типы ссылок и состояние Azure CLI, чтобы узнать о типах ссылок Azure CLI, состоянии и уровнях поддержки.

  параметр az config сохраняется на
  

3. Создать постоянные параметры

Чтобы сохранить значения для сохраняемых параметров, выполните команду Azure CLI по вашему выбору, содержащую параметры, которые вы хотите сохранить. Например, создайте группу ресурсов, а параметры --location и --name будут сохранены для использования в будущем.

  1. Сохраните расположение и имя группы ресурсов.

      # С включенными постоянными параметрами создайте группу ресурсов
    группа az create --name RG1forTutorial --location eastus2
    
    # Посмотреть новые постоянные параметры
    az config param-persist show
      
      {
      "все": {
        "местоположение": "eastus2",
        "resource_group_name": "RG1forTutorial"
      }
    }
      
  2. Используя новые постоянные параметры, создайте учетную запись хранения.

      # Создать учетную запись хранения
    создание учетной записи хранения az --name sa1fortutorial
    
    # Посмотрите, что storage_account_name добавлено к сохраняемым параметрам
    az config param-persist show
      
      {
      "все": {
        "местоположение": "eastus2",
        "resource_group_name": "RG1forTutorial",
        "storage_account_name": "sa1fortutorial"
      }
    }
      
  3. Создать постоянный параметр без создания нового ресурса.

    Если вы не хотите создавать новый ресурс Azure, параметры resource_group_name и location можно сохранить с помощью команд без создания, таких как show или list .Полный список поддерживаемых параметров и действий, необходимых для сохранения значений, см. в разделе Сохраняемые параметры Azure CLI. В этом примере также удаляются все значения параметров с помощью команды az config param-persist delete.

      # Очистить все сохраненные параметры для демонстрации.
    az config param-persist удалить --all
    
    # Список всех учетных записей хранения, которые создадут значение сохраненного параметра `resource_group_name`.
    учетная запись хранения az show --resource-group RG1forTutorial --name sa1fortutorial
    
    # См. новое сохраненное значение, созданное для группы ресурсов.Имя учетной записи хранения сохраняется только с помощью команды «создать».
    az config param-persist show
      
      {
      "все": {
        "resource_group_name": "RG1forTutorial"
      }
    }
      

4. Заменить сохраненные параметры

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

  1. Создать новые постоянные параметры.

      # Очистить все сохраненные параметры для демонстрации
    az config param-persist удалить --all
    
    # Создайте учетную запись хранения, поместив «location», «resource_group_name» и «storage_account_name» в постоянные параметры.
    учетная запись хранения az create --name sa1fortutorial --resource-group RG1forTutorial --location eastus2
    
    # См. записи сохраненных параметров
    az config param-persist show
      
      {
      "все": {
        "местоположение": "eastus2",
        "resource_group_name": "RG1forTutorial",
        "storage_account_name": "sa1fortutorial"
      }
    }
      
  2. Заменить вновь сохраненные значения.

      # Создание второй учетной записи хранения при изменении сохраняемых параметров «storage_account_name» и «location»
    учетная запись хранения az create --name sa2fortutorial --location westeurope
    
    # Посмотреть новые постоянные параметры
    az config param-persist show
      
      {
      "все": {
        "местоположение": "западная Европа",
        "resource_group_name": "RG1forTutorial",
        "storage_account_name": "sa2fortutorial"
      }
    }
      

    Примечание

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

5. Выполнение последовательных команд

Эти сценарии создают приложение-функция Azure с использованием плана потребления.

  # Напоминание: имена приложений-функций и учетных записей хранения должны быть уникальными.

# Включить постоянные параметры.
параметр конфигурации az сохраняется на

# Создать группу ресурсов.az group create --name RG2forTutorial --location westeurope

# Создайте учетную запись хранения Azure в группе ресурсов, опустив параметры "--location" и "--resource-group".
создание учетной записи хранения az \
  --name sa3fortutorial \
  --sku Standard_LRS

# Создайте бессерверное приложение-функцию в группе ресурсов, опустив параметры "--storage-account" и "--resource-group".
az functionapp создать \
  --name FAforTutorial \
  --consumment-plan-location westeurope \
  --функции-версия 2

# Посмотреть сохраненные значения параметров.az config param-persist show
  
  # Напоминание: имена приложений-функций и учетных записей хранения должны быть уникальными.

# отключаем постоянные параметры
az config param-persist отключен

# Создать группу ресурсов.
az group create --name RG2forTutorial --location westeurope

# Создайте учетную запись хранения Azure в группе ресурсов.
создание учетной записи хранения az \
  --name sa3fortutorial \
  --местоположение западная европа \
  --resource-group RG2forTutorial \
  --sku Standard_LRS

# Создайте бессерверное приложение-функцию в группе ресурсов.az functionapp создать \
  --name FAforTutorial \
  --storage-account sa3fortutorial \
  --consumment-plan-location westeurope \
  --resource-group RG2forTutorial \
  --функции-версия 2
  

6. Удалить сохраненные параметры

Используйте команду az config param-persist delete для удаления записей.

  # Удалить одну запись сохраняемых параметров, указав имя, а не значение
az config param-persist удалить имя_группы_ресурса

# Удалить все сохраненные записи параметров и не запрашивать подтверждение
az config param-persist delete --all --yes
  

Важно

Сохраняемые параметры не обновляются при удалении ресурса Azure.

  # удалить группу ресурсов
группа az удалить --name RG1forTutorial

# убедиться, что группа ресурсов больше не существует
список групп az --выходная таблица

# Убедитесь, что имя группы ресурсов остается в постоянных параметрах
az config param-persist show
  

7. Отключить постоянные параметры

Вы можете отключить постоянные параметры с помощью команды az config param-persist off, но ваши сохраненные данные постоянных параметров не будут удалены.

  # Отключить постоянные параметры
az config param-persist отключен

# Убедитесь, что ваши постоянные параметры все еще существуют
az config param-persist show

# Попытаться создать новый ресурс, опираясь на сохраненные параметры, и получить ошибку ".... требуются следующие аргументы:..."
учетная запись хранения az create --name SA4inAzCLI --sku Standard_LRS
  

8. Очистить ресурсы

Когда в этом нет необходимости, используйте команду az group delete для удаления группы ресурсов и всех связанных ресурсов.

  удаление группы az --name RG1forTutorial
  

См. также

Самостоятельная генеральная уборка. Каждый март или апрель миллионы… | Парам Шанти | BAPS Better Living

Каждый март или апрель миллионы домохозяйств проводят преобразующий ритуал — весеннюю уборку.Они ходят из комнаты в комнату и выясняют, что остается, что уходит и где это организовать. Я, например, обычно выбрасываю чужие вещи (если это не мои вещи).

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

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

  • Собираетесь ли вы выбросить «это» или оставить «это»?
  • Если вы собираетесь его оставить, куда он пойдет?

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

Однажды король решил, что пора искать жену. Вестники объявили эту новость и пригласили всех подходящих женщин королевства прийти во дворец короля, чтобы он мог выбрать. В назначенный день залы замка наполнились теми, кто надеялся привлечь внимание короля.Наконец, после долгого ожидания, король и его верный секретарь вошли в главный зал, и король сел на свой трон. Секретарь поблагодарил их всех за то, что пришли, а затем сказал: «Его Высочество приветствует вас всех за то, что пришли. Недавно у него появилось зеркало. Это зеркало не обычное зеркало, а скорее волшебное зеркало, которое оценивает ваш характер. За каждую ошибку, которую вы совершили в своей жизни, зеркало покажет пятно. Любой, кто хочет выйти замуж за короля, должен сначала посмотреть в зеркало.

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

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

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

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

Я часто думал про себя: «Иногда я могу довольно быстро разозлиться» и «Мне нужно понять точку зрения другого человека». Но тогда что? Готов ли я прислушаться к урокам любимого сериала моей дочери «Соседство Даниэля Тайгера», чтобы успокоиться, прежде чем сказать что-то сожалеющее? — «Когда ты так злишься и тебе хочется рычать, сделай глубокий вдох и сосчитай до четырех». Или я готов учиться и слушать точки зрения и мысли других с непредвзятостью и готовностью принять их точку зрения, прежде чем навязывать свою? Я просто говорю, что есть необходимость удалить или изменить что-то внутри, но без плана игры это ничем не отличается от покупки абонемента в спортзал на 3 года, а потом никуда не ходить.

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

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

Небольшое отступление: при прохождении этого процесса самоочищения важно всегда помнить, что цели и путь исходят изнутри вас и предназначены только для вас. Вдохновляйтесь другими, но не сравнивайте себя с другими. Работайте вместе с другими, чтобы достичь новых высот, но не ставьте свой прогресс в зависимость от их успехов и их планов. Далай-лама предупредил об этом типе ошибочного мышления, когда сказал: «Цель (самоанализа) не в том, чтобы быть лучше, чем другой человек, а в том, чтобы стать лучше себя прежнего».

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

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

Siddharth Dubal, J.D.
Legal Recruiter

Предопределенные функции серверного приложения и фильтры в obj.конф

Функция check-request-limits отслеживает входящие запросы, соответствующие заданному атрибуту (например, IP-адресу клиента), и вычисляет среднее количество запросов в секунду за настраиваемый интервал времени. Когда запросы, соответствующие отслеживаемому атрибуту, превышают пороговое значение, настроенное вами, последующие соответствующие запросы не обслуживаются до тех пор, пока частота запросов не упадет. Используйте эту функцию для обнаружения возможных атак типа «отказ в обслуживании».

Необходимо указать либо max-rps , либо max-connections , иначе check-request-limits ничего не делает.Если вы не введете атрибут или атрибуты для мониторинга, функция будет отслеживать все запросы.

По умолчанию функция хранит записи в запросах в течение 300 секунд (5 минут) перед их очисткой. Чтобы настроить это время, используйте init-request-limits SAF в файле magnus.conf .

Таблица 5-8 описывает параметры функции check-request-limits .

В следующем примере IP-адрес клиента ограничен максимальной частотой запросов 10 запросов в секунду с интервалом по умолчанию 30 секунд:

PathCheck fn="check-request-limit" monitor="$ip" max-rps="10"
 

В следующем примере IP-адрес клиента ограничивается максимальной скоростью запросов 10 запросов в секунду при доступе к любым CGI Perl.Другие типы запросов не ограничены:

<Если путь = "*.pl">
PathCheck fn="check-request-limits" monitor="$ip" max-rps="10"

 

Дополнительные сведения об использовании тега If см. в разделе If, ElseIf и Else.

В следующем примере запросы глобально для Perl CGI ограничены 10 запросами в секунду. Конкретный параметр монитора не указан:

<Если путь = "*.pl">
PathCheck fn="check-request-limits" max-rps="10"

 

В следующем примере IP-адрес клиента не может генерировать более 10 запросов Perl CGI в секунду или 5 запросов JSP в секунду.Чтобы отслеживать итоги Perl и JSP отдельно, указанные параметры монитора содержат как фиксированный строковый идентификатор, так и переменную IP-адреса клиента:

.
<Если путь = "*.pl">
PathCheck fn="check-request-limits" max-rps="10" monitor="perl:$ip"

<Если путь = "*.jsp">
PathCheck fn="check-request-limits" max-rps="5" monitor="jsp:$ip"

 

В следующем примере любой IP-адрес клиента ограничен не более чем 5 подключениями в данный момент времени:

PathCheck fn="check-request-limits" max-connections="2" monitor="$ip"
 

Использование эффектного хука — React

Хуки — новое дополнение в React 16.8. Они позволяют использовать состояние и другие функции React без написания класса.

Эффектный хук позволяет выполнять побочные эффекты в функциональных компонентах:

  import React, {useState, useEffect} из 'реакции';
Пример функции() {
  const [количество, setCount] = useState (0);

    useEffect(() => { document.title = `Вы нажали ${count} раз`; });
  вернуть (
    <дел>
      

Вы нажали {count} раз

); }

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

Извлечение данных, настройка подписки и ручное изменение DOM в компонентах React — все это примеры побочных эффектов. Независимо от того, привыкли ли вы называть эти операции «побочными эффектами» (или просто «эффектами»), вы, вероятно, выполняли их в своих компонентах раньше.

Наконечник

Если вы знакомы с методами жизненного цикла класса React, вы можете представить useEffect Hook как componentDidMount , componentDidUpdate и componentWillUnmount вместе взятые.

В компонентах React есть два распространенных типа побочных эффектов: те, которые не требуют очистки, и те, которые требуют очистки. Рассмотрим это различие более подробно.

Эффекты без очистки

Иногда нам нужно запустить некоторый дополнительный код после того, как React обновит DOM. Сетевые запросы, ручные мутации DOM и ведение журнала — распространенные примеры эффектов, не требующих очистки. Мы говорим так, потому что можем запустить их и тут же забыть о них.Давайте сравним, как классы и хуки позволяют нам выражать такие побочные эффекты.

Пример использования классов

В компонентах класса React метод render сам по себе не должен вызывать побочных эффектов. Было бы слишком рано — обычно мы хотим выполнить наши эффекты после того, как React обновит DOM.

Вот почему в классах React мы помещаем побочные эффекты в componentDidMount и componentDidUpdate . Возвращаясь к нашему примеру, вот компонент класса счетчика React, который обновляет заголовок документа сразу после того, как React вносит изменения в DOM:

.
  пример класса расширяет React.Компонент {
  конструктор (реквизит) {
    супер (реквизит);
    это.состояние = {
      количество: 0
    };
  }

  componentDidMount() { document.title = `Вы нажали ${this.state.count} раз`; } componentDidUpdate() { document.title = `Вы нажали ${this.state.count} раз`; }
  оказывать() {
    вернуть (
      <дел>
        

Вы нажали {this.state.count} раз

); } }

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

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

Теперь давайте посмотрим, как мы можем сделать то же самое с хуком useEffect .

Пример использования хуков

Мы уже видели этот пример вверху этой страницы, но давайте рассмотрим его поближе:

  import React, {useState, useEffect} из 'реакции';
Пример функции() {
  const [количество, setCount] = useState (0);

  useEffect(() => {документ.title = `Вы нажали ${count} раз`; });
  вернуть (
    <дел>
      

Вы нажали {count} раз

); }

Что делает useEffect ? Используя этот хук, вы сообщаете React, что ваш компонент должен что-то сделать после рендеринга. React запомнит переданную вами функцию (мы будем называть ее нашим «эффектом») и вызовет ее позже после выполнения обновлений DOM.В этом случае мы устанавливаем заголовок документа, но мы также можем выполнять выборку данных или вызывать какой-либо другой императивный API.

Почему useEffect вызывается внутри компонента? Размещение useEffect внутри компонента позволяет нам получить доступ к переменной состояния count (или любому реквизиту) прямо из эффекта. Нам не нужен специальный API для его чтения — он уже находится в области видимости функции. Хуки охватывают замыкания JavaScript и избегают внедрения API-интерфейсов, специфичных для React, где JavaScript уже предоставляет решение.

Запускается ли useEffect после каждого рендеринга? Да! По умолчанию он запускается как после первого рендера , так и после каждого обновления. (Позже мы поговорим о том, как это настроить.) Вместо того, чтобы думать в терминах «монтирование» и «обновление», вам может быть проще думать, что эффекты возникают «после рендеринга». React гарантирует, что DOM будет обновлен к моменту запуска эффектов.

Подробное объяснение

Теперь, когда мы знаем больше об эффектах, эти строки должны иметь смысл:

  Функция Пример() {
  const [количество, setCount] = useState (0);

  использоватьЭффект(() => {
    документ.title = `Вы нажали ${count} раз`;
  });
}  

Мы объявляем переменную состояния count , а затем сообщаем React, что нам нужно использовать эффект. Мы передаем функцию хуку useEffect . Эта функция, которую мы передаем , является нашим эффектом. Внутри нашего эффекта мы устанавливаем заголовок документа, используя API браузера document.title . Мы можем прочитать последние счетчика внутри эффекта, потому что это входит в область действия нашей функции. Когда React визуализирует наш компонент, он запомнит использованный нами эффект, а затем запустит наш эффект после обновления DOM.Это происходит для каждого рендера, включая первый.

Опытные разработчики JavaScript могут заметить, что функция, передаваемая в useEffect , будет отличаться при каждом рендеринге. Это сделано намеренно. На самом деле это то, что позволяет нам считывать значение count изнутри эффекта, не беспокоясь о том, что оно устареет. Каждый раз при повторном рендеринге мы планируем различных эффектов , заменяя предыдущий. В некотором смысле, это заставляет эффекты вести себя как часть результата рендеринга — каждый эффект «принадлежит» конкретному рендеру.Мы увидим более ясно, почему это полезно позже на этой странице.

Наконечник

В отличие от componentDidMount или componentDidUpdate , эффекты, запланированные с помощью useEffect , не блокируют обновление экрана браузером. Это делает ваше приложение более отзывчивым. Большинство эффектов не обязательно должны происходить синхронно. В редких случаях, когда они это делают (например, при измерении макета), существует отдельный хук useLayoutEffect с API, идентичным useEffect .

Эффекты с очисткой

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

Пример использования классов

В классе React вы обычно настраиваете подписку в componentDidMount и очищаете ее в componentWillUnmount .Например, допустим, у нас есть модуль ChatAPI , который позволяет нам подписываться на онлайн-статус друга. Вот как мы могли бы подписаться и отображать этот статус, используя класс:

  класс FriendStatus расширяет React.Component {
  конструктор (реквизит) {
    супер (реквизит);
    this.state = { isOnline: null };
    this.handleStatusChange = this.handleStatusChange.bind(это);
  }

  componentDidMount() { ChatAPI.subscribeToFriendStatus(this.props.friend.id, this.handleStatusChange); } componentWillUnmount() { ChatAPI.unsubscribeFromFriendStatus(this.props.friend.id, this.handleStatusChange); } handleStatusChange (статус) { this.setState ({ isOnline: status.isOnline }); }
  оказывать() {
    если (this.state.isOnline === null) {
      вернуть 'Загрузка...';
    }
    вернуть this.state.isOnline ? «В сети»: «Офлайн»;
  }
}  

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

Примечание

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

Пример использования хуков

Давайте посмотрим, как мы можем написать этот компонент с помощью хуков.

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

  import React, {useState, useEffect} из 'реакции';

функция FriendStatus (реквизит) {
  const [isOnline, setIsOnline] = useState (null);

  useEffect(() => { function handleStatusChange(status) { setIsOnline(status.isOnline); } ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange); return function cleanup() { ChatAPI.unsubscribeFromFriendStatus(props.friend.идентификатор, дескриптор изменения статуса); }; });
  если (isOnline === ноль) {
    вернуть 'Загрузка...';
  }
  вернуть онлайн ? «В сети»: «Офлайн»;
}  

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

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

Примечание

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

Резюме

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

  useEffect(() => {
    функция handleStatusChange (статус) {
      setIsOnline (status.isOnline);
    }

    ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
    возврат () => {
      ChatAPI.unsubscribeFromFriendStatus(props.friend.идентификатор, дескриптор изменения статуса);
    };
  });  

Другие эффекты могут не иметь фазы очистки и ничего не возвращать.

  useEffect(() => {
    document.title = `Вы нажали ${count} раз`;
  });  

Эффект-хук объединяет оба варианта использования с помощью единого API.


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


Советы по использованию эффектов

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

Совет: используйте несколько эффектов для разделения проблем

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

  класс FriendStatusWithCounter расширяет React.Компонент {
  конструктор (реквизит) {
    супер (реквизит);
    this.state = { count: 0, isOnline: null };
    this.handleStatusChange = this.handleStatusChange.bind(это);
  }

  компонентDidMount () {
    document.title = `Вы нажали ${this.state.count} раз`;
    ChatAPI.subscribeToFriendStatus(
      этот.реквизит.друг.идентификатор,
      this.handleStatusChange
    );
  }

  компонентDidUpdate () {
    document.title = `Вы нажали ${this.state.count} раз`;
  }

  компонентWillUnmount () {
    ChatAPI.unsubscribeFromFriendStatus(
      это.реквизит.друг.идентификатор,
      this.handleStatusChange
    );
  }

  handleStatusChange (статус) {
    это.setState({
      isOnline: статус.isOnline
    });
  }
    

Обратите внимание, что логика, которая устанавливает document.title , разделена между componentDidMount и componentDidUpdate . Логика подписки также распределена между componentDidMount и componentWillUnmount . А componentDidMount содержит код для обеих задач.

Итак, как хуки могут решить эту проблему? Точно так же, как вы можете использовать хук State более одного раза, вы также можете использовать несколько эффектов. Это позволяет нам разделить несвязанную логику на разные эффекты:

  функция FriendStatusWithCounter (реквизит) {
  const [количество, setCount] = useState (0);
  useEffect(() => { document.title = `Вы нажали ${count} раз`;
  });

  const [isOnline, setIsOnline] = useState (null);
  useEffect(() => { function handleStatusChange(status) {
      установитьIsOnline(статус.В сети);
    }

    ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
    возврат () => {
      ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
    };
  });
  
}  

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

Объяснение: почему эффекты запускаются при каждом обновлении

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

Ранее на этой странице мы представили пример компонента FriendStatus , который показывает, находится ли друг в сети или нет. Наш класс читает friend.id из this.props , подписывается на статус друга после монтирования компонента и отписывается во время размонтирования:

  компонентDidMount() {
    ChatAPI.subscribeToFriendStatus(
      это.реквизит.друг.идентификатор,
      this.handleStatusChange
    );
  }

  компонентWillUnmount () {
    ChatAPI.unsubscribeFromFriendStatus(
      этот.реквизит.друг.идентификатор,
      this.handleStatusChange
    );
  }  

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

В компонент класса нам нужно добавить componentDidUpdate для обработки этого случая:

  компонентDidMount() {
    ChatAPI.subscribeToFriendStatus(
      этот.реквизит.друг.идентификатор,
      this.handleStatusChange
    );
  }

  componentDidUpdate(prevProps) { ChatAPI.unsubscribeFromFriendStatus(prevProps.friend.id, this.handleStatusChange); ChatAPI.subscribeToFriendStatus(this.props.friend.id, this.handleStatusChange); }
  компонентWillUnmount () {
    ЧатAPI.отписаться от состояния друга(
      этот.реквизит.друг.идентификатор,
      this.handleStatusChange
    );
  }  

Если вы забываете правильно обработать componentDidUpdate , это распространенный источник ошибок в приложениях React.

Теперь рассмотрим версию этого компонента, использующую хуки:

  функция FriendStatus(реквизит) {
  
  использоватьЭффект(() => {
    
    ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
    возврат () => {
      ChatAPI.unsubscribeFromFriendStatus(props.friend.id, дескрипторStatusChange);
    };
  });  

Он не страдает от этой ошибки. (Но мы также не вносили в него никаких изменений.)

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

 
ChatAPI.subscribeToFriendStatus(100, handleStatusChange);


ЧатAPI.отписаться от FriendStatus(100, handleStatusChange);
ChatAPI.subscribeToFriendStatus(200, handleStatusChange);


ChatAPI.unsubscribeFromFriendStatus(200, handleStatusChange);
ChatAPI.subscribeToFriendStatus(300, handleStatusChange);


ChatAPI.unsubscribeFromFriendStatus(300, handleStatusChange);  

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

Совет

: оптимизация производительности за счет пропуска эффектов

В некоторых случаях очистка или применение эффекта после каждого рендеринга может вызвать проблемы с производительностью.В компонентах класса мы можем решить эту проблему, написав дополнительное сравнение с prevProps или prevState внутри componentDidUpdate :

  componentDidUpdate(prevProps, prevState) {
  если (prevState.count !== this.state.count) {
    document.title = `Вы нажали ${this.state.count} раз`;
  }
}  

Это достаточно распространенное требование, поскольку оно встроено в useEffect Hook API. Вы можете указать React пропустить , применяя эффект, если определенные значения не изменились между повторными рендерингами.Для этого передайте массив в качестве необязательного второго аргумента в useEffect :

.
  useEffect(() => {
  document.title = `Вы нажали ${count} раз`;
}, [считать]);  

В приведенном выше примере мы передаем [count] в качестве второго аргумента. Что это значит? Если count равно 5 , а затем наш компонент повторно рендерится с count , все еще равным 5 , React сравнит [5] из предыдущего рендеринга и [5] из следующего рендеринга. .Поскольку все элементы в массиве одинаковы ( 5 === 5 ), React пропустит эффект. Это наша оптимизация.

Когда мы визуализируем с count обновленным до 6 , React сравнит элементы в массиве [5] из предыдущего рендеринга с элементами в массиве [6] из следующего рендеринга. На этот раз React повторно применит эффект, потому что 5 !== 6 . Если в массиве несколько элементов, React повторно запустит эффект, даже если хотя бы один из них отличается.

Это также работает для эффектов, которые имеют фазу очистки:

  useEffect(() => {
  функция handleStatusChange (статус) {
    setIsOnline (status.isOnline);
  }

  ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
  возврат () => {
    ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
  };
}, [props.friend.id]);  

В будущем второй аргумент может добавляться автоматически при преобразовании во время сборки.

Примечание

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

Если вы хотите запустить эффект и очистить его только один раз (при монтировании и размонтировании), вы можете передать пустой массив ( [] ) в качестве второго аргумента.Это сообщает React, что ваш эффект не зависит от любых значений из свойств или состояния, поэтому его никогда не нужно перезапускать. Это не рассматривается как частный случай — это следует непосредственно из того, как всегда работает массив зависимостей.

Если вы передаете пустой массив ( [] ), свойства и состояние внутри эффекта всегда будут иметь свои начальные значения. Хотя передача [] в качестве второго аргумента ближе к знакомой ментальной модели componentDidMount и componentWillUnmount , обычно есть лучшие решения, чтобы избежать слишком частого повторного запуска эффектов.Кроме того, не забывайте, что React откладывает запуск useEffect до тех пор, пока браузер не отрисует, поэтому дополнительная работа не будет проблемой.

Мы рекомендуем использовать правило исчерпывающего-deps как часть нашего пакета eslint-plugin-react-hooks . Он предупреждает, когда зависимости указаны неправильно, и предлагает исправление.

Следующие шаги

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

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

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

Создание комментариев к документации | PyCharm

Создание комментариев к документации для функций Python

Чтобы создать комментарий к документации для функции Python

  1. Поместите курсор после объявления функции, которую вы хотите задокументировать.

  2. Введите открывающие тройные кавычки и нажмите Введите или Пробел .

  3. Добавить осмысленное описание параметров и возвращаемых значений.

Учтите следующее:

Чтобы создать комментарий к документации для функции Python с помощью действия намерения

  1. Поместите курсор где-нибудь внутри функции, которую вы хотите задокументировать.

  2. Нажмите Alt+Enter , чтобы отобразить доступные действия намерения.

  3. Выберите Вставить заглушку строки документации:

    PyCharm создает заглушку комментария к документации в соответствии с форматом строки документации, выбранным на странице встроенных инструментов Python.

Пример комментария Python

Рассмотрим следующую функцию:

Деф дескриптор (я, myParam1, myParam2):

На странице встроенных инструментов Python выберите Epytext. Затем введите открывающие тройные кавычки и нажмите Введите или Пробел . PyCharm генерирует заглушку комментария к документации:

»’ @параметр себя: @параметр myParam1: @параметр myParam2: @вернуть: »’

Затем выберите reStructuredText, введите открывающие тройные кавычки и нажмите Введите или Пробел .PyCharm генерирует заглушку комментария к документации:

»’ :параметр себя: :парам мойПарам1: :парам мойПарам2: :вернуть: »’

Последнее изменение: 27 марта 2022 г.

Документация Hitachi Vantara Lumada и Pentaho

_disposeComponents()

Очищает ресурсы, связанные с компонентами панели мониторинга.

_disposeParameters()

Очищает ресурсы, связанные с параметрами экземпляра панели мониторинга.

_disposeStorage()

Очищает ресурсы, связанные с хранилищем панели мониторинга.

_disposeViews()

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

_throwIfDisposed()

Выдает ошибку, если панель мониторинга уже удалена.

addComponent (компонент, опции): cdf.Dashboard.Dashboard

Добавляет экземпляр компонента на панель мониторинга.

addComponents(components)

Добавляет массив экземпляров компонентов на информационную панель.

addDataSource(name, obj, force)

Добавляет новый источник данных.

addParameter(имя параметра, значение параметра) : Объект

Добавляет новый параметр в модуль параметров.

blockUIwithDrag()

Визуализирует блокирующий div, который можно перетаскивать.

callPentahoAction(объект, решение, путь, действие, параметры, обратный вызов) : Объект | string

Вызывает xaction.

checkServer() : логическое значение

Выполняет jQuery.ajax для проверки соединения с сервером.

cleanStorage()

Сбрасывает значение хранилища на пустой объект и выдает jQuery.ajax-запрос на удаление значения, хранящегося на сервере.

createAndCleanErrorDiv()

Создает пустой HTML-элемент div для отображения ошибок.

decrementRunningCalls()

Уменьшает значение счетчика текущих вызовов.

detectQueryType (qd): Строка | undefined

При наличии объекта определения запроса возвращает его тип запроса.

dispose()

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

errorNotification(err, ph)

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

executeAjax (тип возврата, URL, параметры, функция): Объект | строка

Выполняет запрос Ajax.

fetchData(cd, params, callback)

Извлекает данные с сервера в соответствии с определением запроса объект .

fireChange(параметр, значение)

Изменяет значение параметра, вызывая событие параметр :fireChange .

generateBookmarkState() : Object

Создает состояние закладки, используя сохраненные значения.

getAddIn(type, subType, addInName) : cdf.AddIn

Получает надстройку из реестра надстроек.

getBaseQuery() : cdf.queries.BaseQuery

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

getBookmarkState() : Object

Получает декодированный URL-адрес состояния закладки.

getComp()

Псевдоним для getComponent .

getComponent(name) : cdf.components.BaseComponent | undefined

Получает экземпляр компонента по заданному имени.

getComponentByName()

Псевдоним для getComponent .

getComponentIndex(compOrNameOrIndex) : number

Получает индекс компонента.

getDataSource(obj): Объект | undefined

Получает источник данных с указанным именем.

getDataSourceQuery(obj): Объект | undefined

Получает запрос от getQuery , используя источник данных с указанным именем.

getErrorObj(errorCode) : Object

Получает сообщение с кодом ошибки.

getMessagesPath() : string

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

getParam(parameterName) : Object

Псевдоним для getParameterValue .

getParameterValue(parameterName) : Object

Получает значение параметра.

getQuery (тип, параметры): cdf.query.BaseQuery

Учитывая тип и параметры, возвращает объект запроса для выполнения этого конкретного запроса.

getRunningCalls() : номер

Возвращает количество текущих вызовов.

getSettingsValue(ключ, значение)

Получает значение параметра с сервера.

getUnboundParameters() : Array.< string >

Получает список имен параметров информационной панели с флагом представления, установленным на viewFlags.НЕСВЯЗАННЫЙ .

getViewParameters() : Object

Получает карту с параметрами информационной панели с установленным флагом вида viewFlags.VIEW или viewFlags.UNBOUND .

getWcdfSettings() : Object

Получает wcdfSettings приборной панели.

getWebAppPath() : строка

Получает текущий путь веб-приложения.

handleServerError()

Обрабатывает ошибку сервера.

hasAddIn(type, subType, addInName) : boolean

Проверяет, существует ли надстройка в реестре надстроек.

hasQuery(type) : boolean

Определяет, зарегистрирован ли данный тип запроса в текущей информационной панели.

hideProgressIndicator(force)

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

incrementRunningCalls()

Увеличивает счетчик текущих вызовов.

инициализация (компоненты)

Функция инициализации приборной панели.

isBookmarkable(параметр) : boolean

Проверяет, можно ли сделать закладку на параметр .

isComponentUpdating(the)

Проверяет, обновляется ли компонент в жизненном цикле панели мониторинга.

isValidQueryDefinition(queryDefinition) : логический

Проверяет, является ли определение запроса допустимым или нет.

isViewParameter(параметр) : string

Возвращает значение флага представления данного параметра.

listAddIns(type, subType) : Array.< cdf.AddIn >

Список зарегистрированных надстроек данного типа и подтипа.

listQueries() : Array.< String >

Список зарегистрированных типов запросов на этой панели.

loadStorage()

Загружает значение хранилища с сервера.

loginAlert(newOpts)

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

normalizeId(id) : string

Нормализует идентификатор элемента DOM.

parseXActionResult(obj, html) : Object

Анализирует результат xaction.

pentahoAction(решение, путь, действие, параметры, функция) : Объект | string

Еще один способ вызова xaction.

pentahoServiceAction (метод службы, тип возврата, решение, путь, действие, параметры, функция) : Объект | string

Вызывает xaction.

persistBookmarkables(param)

Сохраняет состояние закладки.

processChange(object_name)

Обрабатывает изменение компонента.

registerAddIn(type, subType, addIn)

Регистрирует надстройку для использования только этим экземпляром панели мониторинга.

registerGlobalAddIn(type, subType, addIn)

Регистрирует глобальную надстройку.

registerQuery(type, query)

Регистрирует новый конструктор типа запроса, который будет использоваться экземпляром информационной панели.

removeComponent(compOrNameOrIndex): cdf.components.BaseComponent | undefined

Удаляет компонент из массива компонентов .

removeDataSource(obj)

Удаляет источник данных с указанным именем.

resetAll()

Сбрасывает приборную панель.

resetRunningCalls()

Сбрасывает счетчик текущих вызовов и скрывает индикатор выполнения.

restoreBookmarkables()

Восстанавливает состояние закладки.

restoreView()

Восстанавливает параметры приборной панели, хранящиеся в представлении .

saveStorage()

Сохраняет значение хранилища на сервере.

setAddInDefaults(type, subType, addInName, defaults)

Устанавливает параметры надстройки по умолчанию.

setBookmarkable(параметр, значение)

Устанавливает пару параметр/значение в качестве закладки.

setBookmarkState(state)

Переопределяет состояние закладки заданным состоянием .

setDataSource(name, obj)

Добавляет источник данных, переопределяющий любой существующий источник с таким же именем.

setGlobalContext(globalContext)

Задает значение globalContext .

setI18nSupport(locale, i18nRef)

Устанавливает текущую локаль и параметры i18n.

setParam(имя параметра, значение параметра, isNotified) : undefined

Псевдоним для setParameter .

setParameter(имя параметра, значение параметра, isNotified)

Сохраняет параметр с определенным значением.

setParameterViewMode(параметр, значение)

Устанавливает флаг просмотра для данного параметра.

setSettingsValue(имя, объект)

Устанавливает параметр на сервере.

showErrorTooltip()

Создает всплывающую подсказку для отображения ошибок.

showProgressIndicator()

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

syncDebugLevel() : number

Устанавливает уровень отладки .

update(component)

Добавляет компонент в очередь «для обновления».

updateComponent(object)

Обновляет определенный компонент.

urlAction(url, params, func): Object | строка

Вызывает произвольный URL-адрес, ожидая, что тип содержимого результата будет xml.

опыт работы | Контроль версий данных · DVC

Запустить или возобновить Эксперимент ДВС.

Сводка

Описание

Позволяет выполнять и отслеживать эксперименты в вашей проекта, не загрязняя его лишними коммитами, ветками, каталоги и т.д.

dvc exp run имеет то же общее поведение, что и dvc repro , когда дело доходит до нацелен на и поэтапное выполнение (восстанавливает граф зависимостей и т. д.).

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

Используйте параметр --set-param ( -S ) в качестве ярлыка для изменения значения параметров на лету перед запуском эксперимента.

Можно ставить эксперименты в очередь для последующего выполнения с помощью --queue флаг. Чтобы запустить их, используйте dvc exp run --run-all . Эксперименты в очереди запускаются последовательно по умолчанию, но могут запускаться параллельно с помощью --jobs вариант.

⚠️ Параллельные запуски являются экспериментальными и могут быть нестабильными. Убедитесь, что вы используете количество заданий, которые может обработать ваша среда (не больше, чем CPU ядра).

Также можно проводить специальные эксперименты с контрольными точками, которые регистрируют ход выполнения (полезно для машинного обучения с глубоким обучением). --rev и --reset options имеют специальное применение для них.

📖 Подробнее обо всех этих функциях см. в руководстве «Выполнение экспериментов».

Просмотрите свои эксперименты с dvc exp show . Успешные можно сделать постоянным путем восстановления их через dvc exp ветку или dvc exp применить и зафиксировать их в репозитории Git. Ненужные можно удалить с помощью dvc exp gc .

Опции

В дополнение к следующему, dvc exp run принимает параметры в dvc repro кроме --glob , --no-commit и --no-run-cache .

Примеры

Это основано на нашем руководстве по началу работы, где вы можете найти собственно исходный код.

Разверните, чтобы подготовить пример проекта ML

Клонируйте репозиторий DVC и загрузите данные, от которых он зависит:

  $ git clone [email protected]: итеративный/пример-get-started.git
$ cd пример-начало работы
$ dvc pull  

Давайте также установим требования Python:

Мы настоятельно рекомендуем создать виртуальная среда первый.

  $ pip install -r src/requirements.txt  

Давайте проверим последние показатели проекта:

  $ показ метрик dvc
Путь avg_prec roc_auc
scores.json 0,60405 0,9608  

Для этого эксперимента мы хотим увидеть результаты для меньшего набора данных, поэтому давайте ограничим данные до 20 МБ и воспроизведем конвейер с dvc exp run :

  $ усечь --size=20M данные/данные.XML
$ dvc опыт работы
...
Воспроизведенный(е) эксперимент(ы): exp-44136
Результаты эксперимента применены к вашей рабочей области.

$ dvc метрики diff
Изменение рабочего пространства HEAD для метрики пути
scores.json avg_prec 0,60405 0,56103 -0,04302
scores.json roc_auc 0,9608 0,94003 -0,02077  

Команда dvc metrics diff показывает разницу в производительности для эксперимент, который мы только что провели ( exp-44136 ).

Пример: оперативное изменение параметров

dvc exp run--set-param ( -S ) избавляет вас от необходимости вручную редактировать параметры файл перед запуском эксперимента.

  $ dvc exp run -S prepare.split=0.25 -S featurize.max_features=2000
...
Воспроизведенные эксперименты: exp-18bf6  

Чтобы увидеть результаты, вы можете использовать dvc exp diff . Он сравнивает как параметры, так и метрики к предыдущей версии проекта:

  $ dvc exp diff
Изменение значения метрики пути
scores.

				
			

Leave a Reply