Пример потребность: Физиологические потребности человека — что это такое, как иначе называются и что к ним относится
if(rtbW>=960){var rtbBlockID="R-A-744041-3";} else{var rtbBlockID="R-A-744041-5";}
window.yaContextCb.push(()=>{Ya.Context.AdvManager.render({renderTo:"yandex_rtb_7",blockId:rtbBlockID,pageNumber:7,onError:(data)=>{var g=document.createElement("ins");g.className="adsbygoogle";g.style.display="inline";if(rtbW>=960){g.style.width="580px";g.style.height="400px";g.setAttribute("data-ad-slot","9935184599");}else{g.style.width="300px";g.style.height="600px";g.setAttribute("data-ad-slot","9935184599");} g.setAttribute("data-ad-client","ca-pub-1812626643144578");g.setAttribute("data-alternate-ad-url",stroke2);document.getElementById("yandex_rtb_7").appendChild(g);(adsbygoogle=window.adsbygoogle||[]).push({});}})});
window.addEventListener("load",()=>{
var ins=document.getElementById("yandex_rtb_7");if(ins.clientHeight =="0"){ins.innerHTML=stroke3;}},true);
Мнимые потребности
if(rtbW>=960){var rtbBlockID="R-A-744041-3";} else{var rtbBlockID="R-A-744041-5";}
window.yaContextCb.push(()=>{Ya.Context.AdvManager.render({renderTo:"yandex_rtb_6",blockId:rtbBlockID,pageNumber:6,onError:(data)=>{var g=document.createElement("ins");g.className="adsbygoogle";g.style.display="inline";if(rtbW>=960){g.style.width="580px";g.style.height="400px";g.setAttribute("data-ad-slot","9935184599");}else{g.style.width="300px";g.style.height="600px";g.setAttribute("data-ad-slot","9935184599");} g.setAttribute("data-ad-client","ca-pub-1812626643144578");g.setAttribute("data-alternate-ad-url",stroke2);document.getElementById("yandex_rtb_6").appendChild(g);(adsbygoogle=window.adsbygoogle||[]).push({});}})});
window.addEventListener("load",()=>{
var ins=document.getElementById("yandex_rtb_6");if(ins.clientHeight =="0"){ins.innerHTML=stroke3;}},true);
Не так давно познакомился с таким понятием как мнимые потребности. Решил разобраться и оказалось что в сети не так много информации про них, именно это и подстегнуло меня провести небольшое исследование для того чтобы составить своё определение — что такое мнимые потребности.
Мнимые потребности человека.
С точки зрения продаж, выделяют два основных вида потребностей – истинные и ложные. Сразу стоит определить, что мнимые потребности человека это определение не сильно связанное с продажами. Хотя, на мой взгляд, любые знания о психологии потребителя полезны для продавца.
Мнимые потребности человека – это ценности, сформированные под воздействием общества. Удовлетворение мнимых потребностей не решает никаких задач и не приносит никакой пользы для человека. Удовлетворение мнимых потребностей – это лишь трата времени и других ресурсов (денег, здоровья, сил). Мнимые потребности навязаны из вне, их удовлетворение не несет пользы для человека.
Примеры мнимых потребностей.
Примеров мнимых потребностей сотни тысяч, по сути весь современный маркетинг нацелен на создание мнимых потребностей. В этом заключается смысл общества потребления. Вот несколько свежих примеров мнимых потребностей:
- 99% потребителей использует не более 5% функций смартфона. Товар приобретается только за счет того что он есть у всех, это такой эффект стадного чувства в продажах.
- Пришёл ваш друг и рассказал вам: что он занимается нумизматикой и это здорово и интересно. И вы тоже решаете заниматься нумизматикой, но через небольшой промежуток времени вам это становится не интересно, и вы бросаете.
- Зашли вы в вагон метро и увидели, что все носят джинсы, и вы тоже пошли и купили джинсы.
В целом создание мнимых потребностей у населения это один из мощнейших инструментов маркетинга. Наверное, каждый может вспомнить, сколько ненужных вещей у вас дома. Но в момент покупки они казались очень необходимыми, потому что эта вещь есть у всех.
Клиенты с мнимыми потребностями.
Рядовой продавец вынужден почти каждый день сталкиваться с клиентами, у которых мнимые потребности. Отличительная особенность таких клиентов, они как правило знают какой товар им нужен, но не могут объяснить почему и зачем. Причём спорить с ними крайне не желательно, это вызовет открытый негатив и не понимание. Если у вас есть нужный им товар в наличии, то продайте и забудьте. Если же товара нет, то эффективно будет использовать метод СПИН продажи. Тут уже всё будет зависеть от мастерства продавца, если всё делать правильно, то не так сложно понять что движет человеком и предложить ему альтернативу.
Основные потребности покупателей и клиентов в маркетинге (классификация и виды) — PowerBranding.ru
В статье мы подробно расскажем о трех основных группах потребностей покупателя (клиента) в маркетинге, которые влияют на мотивацию к покупке, а также рассмотрим подробно практическое использование теории потребностей потребителя на практике. В результате изучения материала статьи вы научитесь определять, какой тип потребности является определяющим для вашей целевой аудитории, и сможете разработать идеальный продукт и рекламное сообщение, максимально отвечающее ключевым потребностям рынка.
Разбираем понятие
Под потребностью потребителя (consumer needs) понимается разница между текущим и идеальным (= желаемым) состоянием потребителя. Чем больше данная разница, тем выше мотивация потребителя купить товар для удовлетворения своей потребности.
Например, когда мы испытываем жажду, существует разница между идеальным нашим состоянием «не испытывать жажду» и текущим состоянием. В этот момент мы мотивированы приобрести напиток для удовлетворения своей потребности. При этом, чем больше наше желание в утолении жажды, тем сильнее мы сконцентрированы на удовлетворении данной потребности и для нас приоритетны становятся не эмоциональные и имиджевые характеристики товара, а функциональные.
Другие примеры возникновения потребностей: если мы не удовлетворены формой своей прически — мы идем в парикмахерскую; если мы не удовлетворены своей работой – мы заходим на сайт вакансий и ищем новые предложения по трудоустройству.
Если примерять данное понятие на рынок b2b и говорить о потребности клиента (как юр. лица), то здесь мы будем также говорить о разнице между желаемым и фактическим состоянием клиента. С клиентами на деловом рынке все достаточно проще, чем с обычными потребителями, так как спектр их потребностей намного уже и концентрируется вокруг роста продаж и повышения прибыльности компании.
if(rtbW>=960){var rtbBlockID="R-A-744041-3";} else{var rtbBlockID="R-A-744041-5";}
window.yaContextCb.push(()=>{Ya.Context.AdvManager.render({renderTo:"yandex_rtb_5",blockId:rtbBlockID,pageNumber:5,onError:(data)=>{var g=document.createElement("ins");g.className="adsbygoogle";g.style.display="inline";if(rtbW>=960){g.style.width="580px";g.style.height="400px";g.setAttribute("data-ad-slot","9935184599");}else{g.style.width="300px";g.style.height="600px";g.setAttribute("data-ad-slot","9935184599");} g.setAttribute("data-ad-client","ca-pub-1812626643144578");g.setAttribute("data-alternate-ad-url",stroke2);document.getElementById("yandex_rtb_5").appendChild(g);(adsbygoogle=window.adsbygoogle||[]).push({});}})});
window.addEventListener("load",()=>{
var ins=document.getElementById("yandex_rtb_5");if(ins.clientHeight =="0"){ins.innerHTML=stroke3;}},true);
Классификация потребностей
Все потребности покупателя можно разделить на 2 большие группы: функциональные потребности и эмоциональные потребности. Эмоциональные потребности могут носить как психологический, так и социальный характер. Рассмотрим каждую потребность покупателя подробнее на знакомых примерах.
Функциональные потребности
Данные потребности являются первичными, базовыми, фундаментальными. Функциональные потребности также можно охарактеризовать как желание покупателя улучшить свое физиологическое состояние. Примерами функциональных потребностей могут являться:
- Желание в утолении жажды или чувства голода (для любых продуктов питания)
- Желание в любое время добраться из пункта А в пункт Б (для автомобилей)
- Желание устранить боль (для лекарственных препаратов)
- Желания охладить воздух в жару (для кондиционеров)
Функциональные потребности потребителя очень часто являются ключевыми драйверами к покупке продукта, т.
Бренд в исключительных случаях может дифференцироваться на уровне удовлетворения функциональных потребностей: когда он является first-mover категории (никто до него не удовлетворял данную потребность потребителя) или имеет охраноспособную уникальную технологию, позволяющую удовлетворять функциональную потребность лучше других.
Удовлетворение только функциональных потребностей не позволяет построить долгосрочную связь с потребителем и развивать лояльность к продукту.
Эмоциональные потребности
Потребности не всегда бывают только функциональными. Потребитель при покупке товара часто ищет возможность самовыражения. Некоторые товары ассоциируются с определенным типом потребителей, которые имеют четкий набор ценностей, характер, признание в обществе.
if(rtbW>=960){var rtbBlockID="R-A-744041-3";} else{var rtbBlockID="R-A-744041-5";}
window.yaContextCb.push(()=>{Ya.Context.AdvManager.render({renderTo:"yandex_rtb_4",blockId:rtbBlockID,pageNumber:4,onError:(data)=>{var g=document.createElement("ins");g.className="adsbygoogle";g.style.display="inline";if(rtbW>=960){g.style.width="580px";g.style.height="400px";g.setAttribute("data-ad-slot","9935184599");}else{g.style.width="300px";g.style.height="600px";g.setAttribute("data-ad-slot","9935184599");} g.setAttribute("data-ad-client","ca-pub-1812626643144578");g.setAttribute("data-alternate-ad-url",stroke2);document.getElementById("yandex_rtb_4").appendChild(g);(adsbygoogle=window.adsbygoogle||[]).push({});}})});
window.addEventListener("load",()=>{
var ins=document.getElementById("yandex_rtb_4");if(ins.clientHeight =="0"){ins.innerHTML=stroke3;}},true); Покупая товары, наделенные особым имиджем, потребитель как бы определяет себя в обществе и сообщает это окружающим.
Внутренние эмоциональные потребности
Или психологические потребности. Данный вид потребностей связан с внутренними переживаниями и страхами потребителя. Примеры психологических потребностей потребителя:
- Желание приобрести спокойствие и уверенность в ненаступлении ситуации при покупке лекарств
- Желание снизить риск и страх покупки плохого товара при покупке экономичных продуктов
- Желание быть любимым при покупке одежды и косметики
Внешние эмоциональные потребности
Или социальные потребности. Данный вид потребностей связан с желанием потребителя получить признание в обществе, стать частью определённой социальной группы, сформировать свой имидж. Примеры социальных потребностей:
- Желание стать частью более высоко-доходной группы мотивирует потребителя покупать товары известных и дорогих брендов
- Желание показать себя как «заботливая мама» мотивирует женщин к покупке продуктов с семейным имиджем
- Желание привязать себя к определённому профессиональному сообществу может служить мотивом к приобретению специализированных книг
Основные эмоциональные потребности потребителей
Функциональных потребностей покупателя может быть бесконечно много, так как они все связаны непосредственно с базовыми функциями конкретных продуктов. Но список базовых эмоциональных потребностей является достаточно определенным. Приведем основные из них (словами потребителя):
- Потребитель хочет приобрести:здоровье, уверенность, время, более лучший внешний вид, комфорт, отдых, удовольствие
- Потребитель хочет себя защитить от: дискомфорта, боли, рисков, беспокойства, смущения, сомнений
- Потребитель хочет сэкономить: время, деньги, нервы
- Потребитель хочет быть: эффективным, современным, успешным, влиятельным, признанным, услышанным, замеченным, отблагодаренным, частью конкурентной социальной группы
- Потребитель также хочет: выразить свою индивидуальность и совершенствовать ,улучшать себя
if(rtbW>=960){var rtbBlockID="R-A-744041-3";} else{var rtbBlockID="R-A-744041-5";}
window.yaContextCb.push(()=>{Ya.Context.AdvManager.render({renderTo:"yandex_rtb_3",blockId:rtbBlockID,pageNumber:3,onError:(data)=>{var g=document.createElement("ins");g.className="adsbygoogle";g.style.display="inline";if(rtbW>=960){g.style.width="580px";g.style.height="400px";g.setAttribute("data-ad-slot","9935184599");}else{g.style.width="300px";g.style.height="600px";g.setAttribute("data-ad-slot","9935184599");} g.setAttribute("data-ad-client","ca-pub-1812626643144578");g.setAttribute("data-alternate-ad-url",stroke2);document.getElementById("yandex_rtb_3").appendChild(g);(adsbygoogle=window.adsbygoogle||[]).push({});}})});
window.addEventListener("load",()=>{
var ins=document.getElementById("yandex_rtb_3");if(ins.clientHeight =="0"){ins.innerHTML=stroke3;}},true);
Практическое применение
Разработку своего товара всегда начинайте с изучения и выявления ключевых потребностей клиентов рынка. Выявить основные потребности покупателя можно с помощью различных маркетинговых исследований и опросов целевого рынка. Важно понимать, что только когда существует потребность — может существовать товар для ее удовлетворения. Иначе вы создадите «пустой» продукт, который не будет пользоваться спросом. Конечно, возможен другой вариант в случае, если потребность отсутствует – можно ее сформировать. Но для этого требуется время и большие инвестиции в продвижение товара.
Особое внимание следует уделить поиску скрытых (не очевидных) потребностей клиентов, существование которых потребители не могут выразить самостоятельно. Данный вид потребностей клиента еще не воплощен на рынке, а значит построение идеи продукта на сильной скрытой потребности может дать компании долгосрочное преимущество.
Важно знать, что потребность потребитель может удовлетворять разными способами, поэтому ваш продукт может быть не единственным решением проблемы потребителя. Всегда необходимо подробно изучать конкурентные товары по удовлетворению потребности, и не только из вашей товарной категории.
Всегда необходимо строить образ товара, начиная с базовых характеристик, удовлетворяющих основные потребности. Но не заканчивать построение образа на функциональных характеристиках, дополняя его эмоциональными преимуществами.
if(rtbW>=960){var rtbBlockID="R-A-744041-3";} else{var rtbBlockID="R-A-744041-5";}
window.yaContextCb.push(()=>{Ya.Context.AdvManager.render({renderTo:"yandex_rtb_2",blockId:rtbBlockID,pageNumber:2,onError:(data)=>{var g=document.createElement("ins");g.className="adsbygoogle";g.style.display="inline";if(rtbW>=960){g.style.width="580px";g.style.height="400px";g.setAttribute("data-ad-slot","9935184599");}else{g.style.width="300px";g.style.height="600px";g.setAttribute("data-ad-slot","9935184599");} g.setAttribute("data-ad-client","ca-pub-1812626643144578");g.setAttribute("data-alternate-ad-url",stroke2);document.getElementById("yandex_rtb_2").appendChild(g);(adsbygoogle=window.adsbygoogle||[]).push({});}})});
window.addEventListener("load",()=>{
var ins=document.getElementById("yandex_rtb_2");if(ins.clientHeight =="0"){ins.innerHTML=stroke3;}},true); Эмоциональных преимуществ может быть несколько или одно ключевое, все зависит от категории и целевой аудитории товара.
Товары повседневного спроса (питание, зубная паста, а особенно экономичные товары масс-маркета) в большей степени направлены на удовлетворение базовых функциональных потребностей. Но их необходимо также наделять эмоциональными выгодами, ключевые из которых являются – защита от риска неправильного выбора, желание в безопасности для всей семьи, удовлетворение от совершения выгодной покупки и экономии семейного бюджета, уверенность и комфорт.
Имиджевые товары, в особенности luxury –сегмент, в основном построены на эмоциональных выгодах. Ключевые из которых – успешность, приобщение к определенной социальной группе, привлечение внимания, экономия времени и сил и т.п. При разработке данных товаров или услуг все же нельзя забывать о функциональных характеристиках, без которых все имиджевые составляющие могут стать бесполезными.
Для каждого товара или услуги кампании рекомендуется составление карты потребностей потребителя. Данная карта потребностей будет служить ядром каждого нового продукта, по данной карте можно будет быстро проверить соответствие новых идей требованиям целевого потребителя.
Твитнуть
Cледующая статья:
Что важно знать о целевой аудитории?
Please enable JavaScript to view the comments powered by Disqus.
comments powered by
Дмитрий Жуков «Стой, кто ведет? Биология поведения человека и других зверей»
Потребности разделяют на три группы: витальные, социальные и идеальные. Первые две группы присущи в равной степени как человеку, так и животным. Идеальные потребности, возможно, есть и у животных, но доказать это крайне трудно.
Витальные потребности
Название этой группы потребностей произошло от латинского vitalis – жизненный. Среди них выделяют три подгруппы: самосохранения, самовоспроизводства и самоподдержания.
Потребности в самосохранении способствуют сохранению физической целостности организма: любой организм нуждается в поступлении питательных веществ и воды. При дисбалансе диеты возникают потребности в отдельных компонентах нормального питания («хочется мяса»). Кроме того, любой организм стремится избежать механических повреждений и следовательно, всего, что может их причинить, будь то клыки хищника, град или движущийся автомобиль.
Потребность в самовоспроизведении часто называют половой. Это не совсем точно. В отношениях между полами, как будет показано ниже, люди удовлетворяют сразу несколько потребностей. Поэтому половую потребность легко разложить на несколько витальных и социальных потребностей.
В то же время потребность иметь потомство и заботиться о нем такому разложению не поддается.
Потребности в самоподдержании организма связаны с сохранением его функциональной целостности и поддержанием работоспособности. И животные, и человек нуждаются в постоянном раздражении сенсорных систем – зрения, слуха и т. п.
На то, что активное состояние мозга поддерживается суммой раздражений от всех органов чувств, впервые четко указал И. М. Сеченов в «Рефлексах головного мозга». В дальнейшем это положение получило многочисленные экспериментальные подтверждения. Животное, которому во время опыта разрушают структуры мозга, где расположены сенсорные входы, впадает в состояние, неотличимое от глубокой потери сознания. У первых космонавтов возникали психические расстройства, вызванные отсутствием привычной сенсорной информации, обусловленной гравитацией. Известно, что однообразные кварталы новостроек повышают утомляемость, ухудшают настроение, вызывают тягостные ощущения в груди и животе и т. п. именно из-за своей монотонности, т. е. из-за того, что у человека, вынужденного постоянно находиться в такой среде, возникает дефицит сенсорного притока. Для удовлетворения сенсорной потребности имеет значение не информационная нагрузка, а количество и разнообразие раздражений органов чувств.
Обе потребности – в сенсорном притоке и в информации – биологически обоснованы тем, что постоянный сбор сведений об окружающей среде – жизненно необходимое условие выживания каждого человека и животного. Эта потребность лежит в основе их исследовательского поведения, а ее величина колеблется внутри каждого вида. И среди людей, и среди любых видов животных есть особи, которые быстро теряют интерес к предмету, если он не связан с едой, безопасностью и прочими насущными проблемами. В то же время и среди кошек, например, и среди людей есть такие, которые могут подолгу заниматься вещами, не имеющими биологической значимости. Правильнее будет сказать, не имеющими актуальной биологической значимости. Неизвестно, как изменятся условия существования и какие свойства вещей окажутся важными для выживания. Поэтому определенная часть сообщества должна заниматься ерундовыми, с точки зрения большинства, исследованиями, про которые говорят, что они «не имеют практического значения».
Иногда выделяют потребность в двигательной активности (А. Д. Слоним). Действительно, все люди тяжело переносят неподвижность. Однако эта потребность состоит из информационной и сенсорной, так как в мышцах находятся рецепторы, посылающие в центральную нервную систему информацию о сокращении мышц и взаимном положении конечностей.
Потребность в эмоциях. Обычно она неочевидна, так как человек, который ведет активную социальную или хотя бы только трудовую жизнь (например, лесник), испытывает достаточно эмоций. Существование потребности в эмоциях становится явным, если социальные контакты человека ограничиваются вследствие выхода на пенсию, болезни и т. п.
Так называемое болезненное бесчувствие (anaesthesia dolorosa), т. е. отсутствие любых эмоций и переживаний (главным образом положительных), является одним из симптомов, встречающихся, как правило, в структуре депрессивных психозов. Такое бесчувствие субъективно переживается больными крайне тяжело; оно определяет наибольший риск самоубийства.
Ограничение сенсорного и информационного притока ведет к эмоциональным расстройствам. Писатели XIX в., например Н. Лесков и Анатоль Франс, неоднократно отмечали дурной нрав монахов и монахинь. То же самое можно наблюдать и сегодня в замкнутых коллективах (во время дальних экспедиций, в гарнизонах и закрытых учебных заведениях) или в дачных поселках, заполненных пенсионерами («Уймите вашу кошку, которая пугает нашу собаку»). Это объясняется тем, что в условиях сенсорного и информационного голода любое, даже незначительное, событие приобретает яркую эмоциональную окраску, неадекватную значению этого изменения в окружающей среде. Психологический дискомфорт в условиях информационного голода может легко переходить в психические расстройства. Например, в обязательную комплектацию полярных экспедиций входят смирительные рубашки, поскольку так называемое экспедиционное бешенство – обычное явление.
Четвертая потребность самоподдержания – гедонистическая, или потребность в приятных ощущениях. Жизненная необходимость гедонистической потребности, а также потребности в эмоциях, информации и сенсорном раздражении доказывается тем, что животные, лишенные в эксперименте возможности удовлетворять одну из этих потребностей, чаще всего гибнут, не достигнув взрослого возраста. Люди, почему-либо лишенные в детстве возможности удовлетворять потребности в самоподдержании, страдают психическими расстройствами различной степени тяжести – от так называемой педагогической запущенности и задержки развития до самых тяжелых форм слабоумия[64]. Взрослые люди, длительно депривированные сенсорно, информационно и эмоционально, могут иногда удовлетворять эти потребности совершенно деструктивным образом.
Социальные потребности
К этой группе относятся все потребности и, соответственно, все формы поведения, связанные с общением с другими существами, чаще всего – с представителями своего вида. Общение может быть не прямым, а только воображаемым.
Социальные потребности многообразны. Набор их у каждого человека различен.
Потребность в самоидентификации.
Социальной самоидентификацией человек спасается от страха одиночества – одной из экзистенциальных, т. е. присущих всем людям, проблем.
У каждого человека существует потребность ощущать себя членом какого-либо сообщества. Все поведение человека и внутренний мир его душевных переживаний строятся на основе идентификации себя с определенной группой: семьей, конкретным государством, народом, трудовым коллективом, болельщиком футбольной команды, группой в социальных сетях и т. д. Иногда сообщества формируются по случайным, малозначимым признакам. Это может быть одинаковая фамилия, если она редкая или если ее носит некий выдающийся человек. Или общая болезнь, как в рассказе О.Генри «Родственные души». Или даже цвет волос, как в рассказе Конан Дойля «Союз рыжих». Важно, что объединение в сообщество улучшает психическое самочувствие людей. В рассказе Вадима Шефнера «Фиалка молчаливая» людей с переломами правой ноги помещали в одну палату, а с переломами левой – в другую. Так поступали для того, «чтобы у больных была общая тема для разговоров».
В разные моменты жизни различные группы становятся важнейшими для человека, т. е. его приоритеты меняются. Как правило, он идентифицирует себя с наиболее успешным на данный момент сообществом.
Философы считают свою образованность свойством, достаточным для выделения себя в группу, отличающую их от прочих людей.
Хотя признак, определяющий причастность к группе, может быть и неявным, но часто социальная идентификация подчеркивается некими атрибутами. Многие вещи человек делает только потому, что «так принято» в том обществе, членом которого он себя считает. Вести себя определенным образом только потому, что «так принято», и является удовлетворением этой потребности.
Патриотизм чаще всего основан на самоидентификации людей как членов метафизических, т. е. не имеющих материальных объектов, могущих служить символом единения, сообществ.
Рис. 3.6. Бартоломе Мурильо. Мальчик с собакой.
Сообщество, членом которого человек себя считает, не обязательно должно состоять из людей. Картина Мурильо замечательно передает и радость мальчика, и радость его собаки. Положительные эмоции возникают в результате удовлетворения их социальной потребности в самоидентификации как членов одного сообщества. Другой распространенный пример комбинированного сообщества – человек и его автомобиль. Нежные слова, которые употребляет человек, обращаясь к своей машине, свидетельствуют о том, что его отношение к ней гораздо богаче, чем просто как к предмету роскоши в качестве показателя социального положения и символа престижа. В английском языке все объекты, кроме людей, обозначаются местоимением среднего рода. Исключение составляют домашние животные и машины. Автомобиль для мужчины – she (она), а для женщины – he (он). ****
Прочие социальные потребности – точнее, их набор – у каждого человека соответствуют стилю приспособления личности. Все они присутствуют и у животных. Основные из них – потребность в доминировании (приоритетный доступ к витальным ресурсам; у человека универсальным витальным ресурсом являются деньги) и в лидерстве. Основная мотивация лидерства очевидна в любви хозяина к своей собаке. Собака – ни в коем случае не друг человека, она – верный раб, преданный слуга. Люди, любящие собак, имеют, как правило, выраженную потребность в лидерстве, которую не могут удовлетворить в отношениях, сложившихся в других социальных структурах. Те же, кто предпочитает собакам кошек, либо не имеют выраженной потребности в лидерстве, либо реализуют ее в других сообществах.
Собака любит хозяина только за то, что он хозяин, так как собаки – стайные животные. Любовь кошки к человеку возникает далеко не всегда. Но все-таки иногда между котом и человеком возникает связь.
Кроме того, у животных имеются и многие другие социальные потребности, например, потребность в следовании за лидером, которая ярко проявляется у собаки в отношении к ее хозяину.
Преимущества особи, которая ориентируется в своем поведении на лидера, заключается в том, что она избавлена от бремени принятия решений, выбора или выработки программы поведения и, наконец, от ответственности за принятые решения и совершенные действия.
Потребность в дружелюбных отношениях – одна из социальных потребностей. Непосредственные физические контакты – объятия, похлопывания, поглаживания и т. д. – присутствуют в отношениях близких людей. Аналогичное поведение мы можем наблюдать у многих животных – это так называемые скучивание и взаимная чистка.
Некоторые социальные потребности трансформируются в искусственные, что наиболее ярко проявляется в ценах на предметы искусства. Картина может висеть десятилетиями, пока какой-нибудь эксперт не обнаружит, что ее написал не никому не известный художник, а знаменитый. Теперь люди готовы платить за него огромные деньги. В основе этого феномена лежит их потребность в тщеславии.
Идеальные потребности
Если социальные и витальные потребности имеются как у человека, так и у животных, то потребности, называемые идеальными, есть только у человека. Они возникли сравнительно недавно. Например, потребность поступать как должно, а не так, как выгодно (нравственность).
К идеальным потребностям, т. е. тем, которые отличают человека от животного, Аристотель отнес «стремление к познанию». Надо отличать его от потребности в информации, которая проявляется у животных в исследовательском поведении.
—————————————-
****
Уточнение от носителя языка:
Если уточнить, то все объекты, которым ты «не можешь заглянуть под хвост» — среднего рода, чтобы не запариваться. Кошка (кот?) на улице — it . Кот Кешка — he. Потому что ты точно знаешь, что он кот, видела своими глазами. Поэтому в первом случае — I saw a cat. It was climbing a tree. A во втором — I saw Kesha, he was klimbing a tree. Если животное не домашнее, но ты знаешь, какого оно рода, ну например, смотришь animal planet, и там есть тигр Вася, и ты знаешь, что это самец, это доказано. То тогда — he .
Дальше — о машинах. Есть некоторые исключения из этого правила, но считается, что они касаются кораблей только. Исторически. Исторически у моряка долго-д
Конфигурация бэкэнд-независимой сети в YAML
Ниже приведены примеры конфигураций netplan для общих сценариев. Если вы видите, что сценарий отсутствует или вы хотите внести свой вклад, сообщите об ошибке в этой документации с примером, используя ссылки внизу этой страницы. Спасибо!
if(rtbW>=960){var rtbBlockID="R-A-744041-3";} else{var rtbBlockID="R-A-744041-5";}
window.yaContextCb.push(()=>{Ya.Context.AdvManager.render({renderTo:"yandex_rtb_1",blockId:rtbBlockID,pageNumber:1,onError:(data)=>{var g=document.createElement("ins");g.className="adsbygoogle";g.style.display="inline";if(rtbW>=960){g.style.width="580px";g.style.height="400px";g.setAttribute("data-ad-slot","9935184599");}else{g.style.width="300px";g.style.height="600px";g.setAttribute("data-ad-slot","9935184599");} g.setAttribute("data-ad-client","ca-pub-1812626643144578");g.setAttribute("data-alternate-ad-url",stroke2);document.getElementById("yandex_rtb_1").appendChild(g);(adsbygoogle=window.adsbygoogle||[]).push({});}})});
window.addEventListener("load",()=>{
var ins=document.getElementById("yandex_rtb_1");if(ins.clientHeight =="0"){ins.innerHTML=stroke3;}},true);
Конфигурация
Для настройки netplan сохраните файлы конфигурации в каталоге / etc / netplan /
с расширением .yaml
(например, / etc / netplan / config.yaml
), затем запустите sudo netplan apply
. Эта команда анализирует и применяет конфигурацию к системе. Конфигурация, записанная на диск в каталоге / etc / netplan /
, будет сохраняться между перезагрузками.
Использование DHCP и статической адресации
Чтобы интерфейс с именем «enp3s0» получал адрес через DHCP, создайте файл YAML со следующим:
сеть:
версия: 2
рендерер: networkd
Ethernet:
enp3s0:
dhcp4: правда
Чтобы вместо этого установить статический IP-адрес, используйте ключ адресов, который принимает список (IPv4 или IPv6) адресов вместе с длиной префикса подсети (например,г. / 24). Также может быть предоставлена информация о шлюзе и DNS:
сеть: версия: 2 рендерер: networkd Ethernet: enp3s0: адреса: - 10.10.10.2/24 шлюз4: 10.10.10.1 серверы имен: поиск: [mydomain, otherdomain] адреса: [10.10.10.1, 1.1.1.1]
%MINIFYHTML25fb47743edc5cd42284e64a757cfac823%
Подключение нескольких интерфейсов с DHCP
Многие системы теперь включают более одного сетевого интерфейса.Серверы обычно должны подключаться к нескольким сетям, и может потребоваться, чтобы трафик в Интернет проходил через определенный интерфейс, несмотря на то, что все они предоставляют действующий шлюз.
Можно достичь точной маршрутизации, желаемой через DHCP, указав метрику для маршрутов, полученных через DHCP, которая обеспечит предпочтение одних маршрутов перед другими. В этом примере «enred» предпочтительнее «engreen», так как у него более низкая метрика маршрута:
.
сеть:
версия: 2
Ethernet:
enred:
dhcp4: да
dhcp4-overrides:
маршрут-метрика: 100
грин:
dhcp4: да
dhcp4-overrides:
маршрут-метрика: 200
Подключение к открытой беспроводной сети
Netplan легко поддерживает подключение к открытой беспроводной сети (не защищенной паролем), требуя только определения точки доступа:
сеть:
версия: 2
wifis:
wl0:
точки доступа:
открытая сеть: {}
dhcp4: да
Подключение к персональной беспроводной сети WPA
Беспроводные устройства
используют ключ «wifis» и используют те же параметры конфигурации, что и проводные устройства Ethernet.Также необходимо указать имя беспроводной точки доступа и пароль:
сеть:
версия: 2
рендерер: networkd
wifis:
wlp2s0b1:
dhcp4: нет
dhcp6: нет
адреса: [192.168.0.21/24]
шлюз4: 192.168.0.1
серверы имен:
адреса: [192.168.0.1, 8.8.8.8]
точки доступа:
"network_ssid_name":
пароль: "**********"
Подключение к корпоративным беспроводным сетям WPA
Также часто встречаются беспроводные сети, защищенные с помощью WPA или WPA2 Enterprise, что требует дополнительных параметров аутентификации.
Например, если сеть защищена с помощью WPA-EAP и TTLS:
сеть:
версия: 2
wifis:
wl0:
точки доступа:
рабочее место:
авторизация:
управление ключами: eap
метод: ttls
анонимный идентификатор: "@ internal.example.com"
идентичность: "[email protected]"
пароль: "v3ryS3kr1t"
dhcp4: да
Или, если сеть защищена с помощью WPA-EAP и TLS:
сеть:
версия: 2
wifis:
wl0:
точки доступа:
Университет:
авторизация:
управление ключами: eap
метод: tls
анонимная личность: "@cust.example.com "
идентичность: "[email protected]"
ca-сертификат: /etc/ssl/cust-cacrt.pem
клиент-сертификат: /etc/ssl/cust-crt.pem
клиент-ключ: /etc/ssl/cust-key.pem
пароль-ключ-клиента: "d3cryptPr1v4t3K3y"
dhcp4: да
Поддерживается множество различных режимов шифрования. См. Справочную страницу Netplan.
Использование нескольких адресов на одном интерфейсе
Клавиша адресов может принимать список адресов для назначения интерфейсу:
сеть:
версия: 2
рендерер: networkd
Ethernet:
enp3s0:
адреса:
- 10.100.1.38 / 24
- 10.100.1.39/24
шлюз4: 10.100.1.1
Псевдонимы интерфейса (например, eth0: 0) не поддерживаются.
Использование нескольких адресов с несколькими шлюзами
Подобно приведенному выше примеру, интерфейсы с несколькими адресами могут быть
сконфигурированы с несколькими шлюзами.
сеть:
версия: 2
рендерер: networkd
Ethernet:
enp3s0:
адреса:
- 9.0.0.9/24
- 10.0.0.10/24
- 11.0.0.11/24
# gateway4: # unset, так как мы настраиваем маршруты ниже
маршруты:
- до: 0.0.0.0/0
через: 9.0.0.1
метрика: 100
- до: 0.0.0.0/0
через: 10.0.0.1
метрика: 100
- до: 0.0.0.0/0
через: 11.0.0.1
метрика: 100
Учитывая, что существует несколько адресов, каждый со своим собственным шлюзом, мы не указываем здесь gateway4
, а вместо этого настраиваем отдельные маршруты
на 0.0.0.0 / 0 (везде) с использованием адреса шлюза для подсети. Значение метрики
должно быть скорректировано как
, чтобы маршрутизация происходила должным образом.
DHCP может использоваться для получения одного из IP-адресов интерфейса. В этом случае маршрут по умолчанию для этого адреса будет
, автоматически настроенный со значением метрики
, равным 100. В качестве сокращения для записи в маршрутах
, gateway4
может быть установлен на адрес шлюза
для одного. подсетей.В этом случае маршрут для этой подсети можно не включать в маршрутов
. Его метрика
будет
, установленной на 100.
Использование Network Manager в качестве средства визуализации
Netplan поддерживает как networkd, так и Network Manager в качестве бэкэндов. Вы можете указать, какой сетевой сервер должен использоваться для настройки определенных устройств, используя ключ модуля рендеринга . Вы также можете делегировать всю конфигурацию сети самому Network Manager, указав только ключ
рендеринга
:
сеть:
версия: 2
рендерер: NetworkManager
Настройка связывания интерфейсов
Связывание настраивается путем объявления интерфейса связывания со списком физических интерфейсов и режимом связывания.Ниже приведен пример связи с активным резервным копированием, которая использует DHCP для получения адреса:
сеть:
версия: 2
рендерер: networkd
облигации:
bond0:
dhcp4: да
интерфейсы:
- enp3s0
- enp4s0
параметры:
режим: активный-резервный
первичный: enp3s0
Ниже приведен пример системы, действующей как маршрутизатор с различными связанными интерфейсами и разными типами. Обратите внимание на объявления ключа «optional: true», которые позволяют загрузку происходить, не дожидаясь полной активации этих интерфейсов.
сеть:
версия: 2
рендерер: networkd
Ethernet:
enp1s0:
dhcp4: нет
enp2s0:
dhcp4: нет
enp3s0:
dhcp4: нет
необязательно: правда
enp4s0:
dhcp4: нет
необязательно: правда
enp5s0:
dhcp4: нет
необязательно: правда
enp6s0:
dhcp4: нет
необязательно: правда
облигации:
бонд-лан:
интерфейсы: [enp2s0, enp3s0]
адреса: [192.168.93.2 / 24]
параметры:
режим: 802.3ad
mii-monitor-interval: 1
Бонд-Ван:
интерфейсы: [enp1s0, enp4s0]
адреса: [192.168.1.252/24]
шлюз4: 192.168.1.1
серверы имен:
поиск: [местный]
адреса: [8.8.8.8, 8.8.4.4]
параметры:
режим: активный-резервный
mii-monitor-interval: 1
gratuitious-arp: 5
бонд-коннтрак:
интерфейсы: [enp5s0, enp6s0]
адреса: [192.168.254.2 / 24]
параметры:
режим: баланс-рр
mii-monitor-interval: 1
Настройка сетевых мостов
Чтобы создать очень простой мост, состоящий из одного устройства, использующего DHCP, напишите:
сеть:
версия: 2
рендерер: networkd
Ethernet:
enp3s0:
dhcp4: нет
мосты:
br0:
dhcp4: да
интерфейсы:
- enp3s0
Более сложный пример, чтобы заставить libvirtd использовать определенный мост с тегированным vlan, при этом продолжая предоставлять немаркированный интерфейс, потребует:
сеть:
версия: 2
рендерер: networkd
Ethernet:
enp0s25:
dhcp4: правда
мосты:
br0:
адреса: [10.3.99.25 / 24]
интерфейсы: [vlan15]
vlans:
vlan15:
accept-ra: нет
id: 15
ссылка: enp0s25
Затем libvirtd будет настроен на использование этого моста путем добавления следующего содержимого в новый файл XML в каталоге / etc / libvirtd / qemu / networks /
. Имя моста в теге, а также должно совпадать с именем устройства моста, настроенного с помощью netplan:
<сеть>
br0
<название моста = 'br0' />
Подключение VLAN к сетевым интерфейсам
Для настройки нескольких VLAN с переименованными интерфейсами:
сеть:
версия: 2
рендерер: networkd
Ethernet:
mainif:
соответствие:
macaddress: "de: ad: be: ef: ca: fe"
имя-набора: mainif
адреса: [«10.3.0.5 / 23 "]
шлюз4: 10.3.0.1
серверы имен:
адреса: [«8.8.8.8», «8.8.4.4»]
поиск: [example.com]
vlans:
vlan15:
id: 15
ссылка: mainif
адреса: ["10.3.99.5/24"]
vlan10:
id: 10
ссылка: mainif
адреса: ["10.3.98.5/24"]
серверы имен:
адреса: ["127.0.0.1"]
поиск: [domain1.example.com, domain2.example.com]
Доступ к напрямую подключенному шлюзу
Это позволяет настроить маршрут по умолчанию или любой маршрут с использованием ключевого слова «on-link», где шлюз - это IP-адрес, напрямую подключенный к сети, даже если адрес не соответствует подсети, настроенной на интерфейсе.
сеть:
версия: 2
рендерер: networkd
Ethernet:
адреса: ["10.10.10.1/24"]
маршруты:
- до: 0.0.0.0/0
через: 9.9.9.9
по ссылке: правда
Для IPv6 конфигурация будет очень похожей, с заметной разницей в дополнительной области: связать маршрут хоста с требуемым адресом маршрутизатора:
сеть:
версия: 2
рендерер: networkd
Ethernet:
адреса: ["2001: кафе: лицо: говядина :: мертв: мертв / 64"]
маршруты:
- по: «2001: кафе: фас :: 1/128»
объем: ссылка
- в: ":: / 0"
через: "2001: кафе: лицо :: 1"
по ссылке: правда
Настройка маршрутизации от источника
Таблицы маршрутов могут быть добавлены к определенным интерфейсам для обеспечения маршрутизации между двумя сетями:
В приведенном ниже примере Ens3 находится на 192.168.3.0 / 24, а ens5 - в сети 192.168.5.0/24. Это позволяет клиентам в одной сети подключаться к другой и позволяет получать ответ от правильного интерфейса.
Кроме того, для Ens5 по-прежнему назначен маршрут по умолчанию, позволяющий любому другому трафику проходить через него.
сеть:
версия: 2
рендерер: networkd
Ethernet:
Ens3:
адреса:
- 192.168.3.30/24
dhcp4: нет
маршруты:
- к: 192.168.3.0 / 24
через: 192.168.3.1
стол: 101
политика маршрутизации:
- с: 192.168.3.0/24
стол: 101
Ens5:
адреса:
- 192.168.5.24/24
dhcp4: нет
шлюз4: 192.168.5.1
маршруты:
- в: 192.168.5.0/24
через: 192.168.5.1
стол: 102
политика маршрутизации:
- с: 192.168.5.0/24
стол: 102
Настройка интерфейса обратной петли
Networkd не позволяет создавать новые устройства обратной петли, но пользователь может добавлять новые адреса в стандартный интерфейс обратной связи lo, чтобы он считался действительным адресом на машине, а также для настраиваемой маршрутизации:
сеть:
версия: 2
рендерер: networkd
Ethernet:
вот:
соответствие:
имя: вот
адреса: [7.7.7.7 / 32]
Интеграция с DHCP-сервером Windows
Для сетей, где DHCP предоставляется сервером Windows с использованием ключа dhcp-identifier, обеспечивающего взаимодействие:
сеть:
версия: 2
Ethernet:
enp3s0:
dhcp4: да
dhcp-идентификатор: mac
Подключение IP-туннеля
Туннели позволяют администратору расширять сети через Интернет путем настройки двух конечных точек, которые будут подключаться к специальному туннельному интерфейсу и выполнять необходимую маршрутизацию.Netplan поддерживает туннели SIT, GRE, IP-in-IP (ipip, ipip6, ip6ip6), IP6GRE, VTI и VTI6.
Обычно туннели используются для обеспечения возможности подключения IPv6 в сетях, которые поддерживают только IPv4. В приведенном ниже примере показано, как можно настроить такой туннель.
Здесь 1.1.1.1 - собственный IP-адрес клиента; 2.2.2.2 - это IPv4-адрес удаленного сервера, «2001: dead: beef :: 2/64» - это IPv6-адрес клиента, определенный туннелем, а «2001: dead: beef :: 1» - IPv6-адрес удаленного сервера. .
Наконец, «2001: cafe: face :: 1/64» - это адрес клиента в пределах префикса маршрутизируемого IPv6:
.
сеть:
версия: 2
Ethernet:
eth0:
адреса:
- 1.1.1.1 / 24
- «2001: кафе: лицо :: 1/64»
шлюз4: 1.1.1.254
туннели:
он-ipv6:
режим: сидеть
удаленный: 2.2.2.2
местный: 1.1.1.1
адреса:
- «2001: мертвые: говядина :: 2/64»
gateway6: "2001: dead: beef :: 1"
Настройка виртуальных функций SR-IOV
Для сетевых карт SR-IOV можно динамически выделять интерфейсы виртуальных функций для каждой настроенной физической функции. В netplan VF определяется как свойство link:, указывающее на родительский PF.
сеть:
версия: 2
Ethernet:
eno1:
MTU: 9000
enp1s16f1:
ссылка: eno1
адреса: ["10.15.98.25/24"]
vf1:
соответствие:
имя: enp1s16f [2-3]
ссылка: eno1
адреса: ["10.15.99.25/24"]
Встроенные теги очистки | |||||||
---|---|---|---|---|---|---|---|
Авторство |
| ||||||
Четкость |
| ||||||
Разное |
| ||||||
Нейтралитет |
| ||||||
Прецизионный |
| ||||||
Чувствительность по времени |
| ||||||
Проверяемость |
| ||||||
Формулировка |
| ||||||
|
Пример :: выучить TLA +
В целом идея проверки модели кажется привлекательной в теории, но люди часто сомневаются, что ее можно использовать на практике.Итак, это управляемый пример того, как реализовать простую спецификацию и найти ошибки. Этот пример не является обязательным для понимания остальной части руководства. Все здесь будет рассмотрено более подробно в следующих разделах. Тем не менее, стоит получить некоторый практический опыт.
Проблема
Вы пишете программное обеспечение для банка. У вас есть Алиса и Боб в качестве клиентов, у каждого из которых есть определенная сумма денег на счетах. Алиса хочет отправить деньги Бобу. Как вы это смоделируете? Предположим, все, что вас волнует, - это их банковские счета.
Шаг первый
Вот один путь:
---- передача МОДУЛЯ ----
EXTENDS Naturals, TLC
(* - передача алгоритма
переменные alice_account = 10, bob_account = 10, money = 5;
начать
A: alice_account: = alice_account - деньги;
B: bob_account: = bob_account + деньги;
конечный алгоритм *)
====
Прежде чем мы начнем возиться с этим, давайте разберем текущий синтаксис, который у нас есть. Поскольку TLA + является языком спецификации, он накладывает определенные ограничения на структуру вашей программы.
- Если имя файла - «передача», первая строка спецификации должна быть
---- МОДУЛЬ передача ----
. У вас должно быть не менее четырех тире с каждой стороны. Точно так же в последней строке должно быть не менее четырех знаков равенства. Все, что находится до МОДУЛЯ или после дна, игнорируется. - EXTENDS - это эквивалент оператора импорта.
-
\ *
- это комментарий,(* *)
- это блоки комментариев. Обратите внимание, что алгоритм находится в блоке комментариев. Это сделано намеренно.Поскольку алгоритмы PlusCal не являются синтаксически допустимыми TLA +, мы не можем запускать их в файле TLA. Вместо этого вы оставляете их в комментариях, и переводчик PlusCal переводит их. -
переменных
, как ни странно, являются переменными. Обратите внимание, что мы используем=
при объявлении переменных, а в самом алгоритме мы используем: =
. Вне определения переменной = - это оператор сравнения. Не равно записывается как / =.1 + 2 = 3; 2 + 3 / = 4.
-
A:
иB:
- это этикетки.Они определяют шаги, которые выполняет алгоритм. Понимание того, как работают метки, имеет решающее значение для написания более сложных алгоритмов, поскольку они определяют места, в которых параллелизм может сильно нарушиться. Позже мы рассмотрим их подробнее.
Итак, как нам это запустить? Что ж, не можем. Во-первых, это ненастоящий код, мы должны сначала его перекомпилировать. Кроме того, мы не совсем "запускаем" его. Вместо этого мы разрабатываем модели, чтобы проверить это. Давайте настроим прямо сейчас.
TLA + Ящик для инструментов
TLA + Toolbox - это IDE для TLA +.Использование TLA + имеет достаточно движущихся частей, поэтому использование IDE - правильный выбор, независимо от ваших предпочтений.
Давайте откроем его и добавим наш текущий проект. Спецификация состоит из двух частей: модулей и моделей. У модулей есть наш код, модели тестируют их. Попробуйте создать новую спецификацию с приведенным выше кодом, а затем переведите ее в TLA + (на Mac это ⌘T).
Сразу же вы увидите набор кода. Это TLA + перевод нашего алгоритма PlusCal, он же то, что на самом деле будет запускать программа проверки модели.Кстати, давайте также создадим модель:
.
Это нормально, если модель сейчас пуста; даже без какой-либо конфигурации мы сможем использовать его в следующем разделе.
Утверждения и наборы
Может ли аккаунт Алисы стать отрицательным? Прямо сейчас наша спецификация позволяет то, чего мы не хотим. Мы можем начать с добавления базовой проверки assert после транзакции. Это то же самое, что и утверждения на любом другом языке. Однако в TLA + он (в основном) используется для отладки.Это потому, что TLA + имеет гораздо более мощные инструменты для проверки контрактов и свойств. Но давайте начнем с малого.
Вот как выглядит наш код с assert:
---- передача МОДУЛЯ ----
EXTENDS Naturals, TLC
(* - передача алгоритма
переменные alice_account = 10, bob_account = 10, money = 5;
начать
A: alice_account: = alice_account - деньги;
B: bob_account: = bob_account + деньги;
C: утверждать alice_account> = 0;
конечный алгоритм *)
=====
Стандартная практика для модульного тестирования {и разработки через тестирование: написать критический тест, исправить его, написать рабочий тест}.Если мы запустим это, модель успешно пройдет.
По крайней мере, это работает для одного номера, который мы попробовали. Это не значит, что это работает во всех случаях. При тестировании часто бывает сложно выбрать только правильные тестовые примеры, чтобы выявить ошибки, которые вы хотите найти. Это связано с тем, что большинство языков позволяют легко тестировать определенное состояние, но не большой их набор. В TLA +, однако, простое тестирование широкого диапазона:
---- передача МОДУЛЯ ----
EXTENDS Naturals, TLC
(* - передача алгоритма
переменные alice_account = 10, bob_account = 10, деньги \ в 1..20;
начать
A: alice_account: = alice_account - деньги;
B: bob_account: = bob_account + деньги;
C: утверждать alice_account> = 0;
конечный алгоритм *)
=====
Единственное, что мы изменили, это денег = 5
на денег \ в 1..20
. Это означает, как вы, вероятно, заметили, что для целей этого алгоритма деньги могут быть любым числом от 1 до 20. Это означает, что при проверке модели существует 20 возможных начальных состояний: (10, 10, 1), (10 , 10, 2) и т. Д. TLA + попробует все двадцать возможностей и проверит, нарушает ли какая-либо из них утверждение.Это весы; если бы мы написали alice_account \ в {5, 10}
, было бы 40 возможных начальных состояний.
( {}
- спецификатор набора. a..b
- это синтаксический сахар для «набора всех целых чисел от a до b включительно», поэтому 1..3 = {1, 2, 3}
)
При запуске сразу получаем ошибку:
Мы можем исправить это, заключив проверку в блок if:
---- передача МОДУЛЯ ----
EXTENDS Naturals, TLC
(* - передача алгоритма
переменные alice_account = 10, bob_account = 10, деньги \ в 1..20;
начать
Перечислить:
если alice_account> = деньги, то
A: alice_account: = alice_account - деньги;
B: bob_account: = bob_account + деньги;
конец, если;
C: утверждать alice_account> = 0;
конечный алгоритм *)
=====
Которая теперь работает правильно.
В сторону: это ближе к проверке всех возможных случаев, но не проверяет все возможные случаи. Не сломался бы алгоритм, если бы денег было, скажем, 4997? Если бы мы действительно хотели протестировать все возможные случаи, мы могли бы заменить денег \ в 1..20
с деньгами \ в Nat
, где Nat
- это набор натуральных чисел. Это совершенно правильный TLA +. К сожалению, это то, с чем не может справиться программа проверки моделей. TLC может проверять только подмножество TLA +, и бесконечные наборы не являются частью этого.
TLA + и инварианты
Можно ли перевести отрицательную сумму денег? Мы могли бы добавить assert money> 0
в начало алгоритма. Однако на этот раз мы собираемся представить новый метод в рамках подготовки к следующему разделу
.
---- МОДУЛЬ Передача ----
EXTENDS Naturals, TLC
(* - передача алгоритма
переменные alice_account = 10, bob_account = 10, деньги \ в 1..20;
начать
Перечислить:
если alice_account> = деньги, то
A: alice_account: = alice_account - деньги;
B: bob_account: = bob_account + деньги;
конец, если;
C: утверждать alice_account> = 0;
конечный алгоритм *)
\ * НАЧАТЬ ПЕРЕВОД
\ * Удалено для наглядности ...
\ * КОНЕЦ ПЕРЕВОДА
MoneyNotNegative == деньги> = 0
====
Здесь должно выскочить несколько вещей. Во-первых, это не часть алгоритма PlusCal. Это чистый TLA +, который мы помещаем в конец файла, чтобы иметь возможность ссылаться на переданный TLA +.TLA + может ссылаться на все, что может использовать ваш PlusCal, если оно идет после маркера END TRANSLATION
. Во-вторых, это ничего не меняет. Напротив, это свойство системы. Если деньги отрицательны, MoneyNotNegative ложно. В противном случае это правда. Свойства указаны с ==
.
Чем это отличается от assert
? Утверждать проверки в одном месте. Мы можем указать MoneyNotNegative как инвариант системы, что должно быть истинным во всех возможных состояниях системы.Он становится частью модели, и затем он будет проверять, прежде чем деньги будут сняты со счета Алисы, будь то депозит и снятие средств и т. Д. Если мы добавим шаг money: = money - 2
везде, где инвариант MoneyNotNegative поймает это спецификация не работает, когда денег = 1
.
Если модель жалуется, что MoneyInvariant - неизвестный оператор, возможно, вы поместили определение после закрытия модуля. Помните, все после первой строки, начинающейся с ====
, игнорируется!
Еще один шаг: проверка атомарности
Пока мы не сделали ничего необычного.Все до сих пор легко покрыть в реальной системе с помощью модульных тестов и тестов свойств. Еще многое предстоит сделать, но я хочу показать, что мы уже можем использовать то, что узнали, для поиска более сложных ошибок. Алиса хочет дать Бобу 1000 долларов. Если не повезет, все может закончиться так:
- Система проверяет, достаточно ли денег у Алисы
- С ее счета списано 1000 долларов
- Ева разбивает сервер бейсбольной битой
- Боб так и не получил денег
- Из системы полностью исчезла 1000 долларов
- Комиссия по ценным бумагам и биржам закрывает вас за мошенничество.
У нас уже есть все инструменты, чтобы это проверить. Во-первых, нам нужно выяснить, как представить сломанный инвариант. Мы могли бы сделать это, потребовав, чтобы общая сумма денег в системе всегда была одинаковой:
---- МОДУЛЬ Передача ----
EXTENDS Naturals, TLC
(* - передача алгоритма
переменные alice_account = 10, bob_account = 10, деньги \ in 1..20,
account_total = alice_account + bob_account;
начать
Перечислить:
если alice_account> = деньги, то
A: alice_account: = alice_account - деньги;
B: bob_account: = bob_account + деньги;
конец, если;
C: утверждать alice_account> = 0;
конечный алгоритм *)
MoneyNotNegative == деньги> = 0
MoneyInvariant == alice_account + bob_account = account_total
====
Затем объявляем отмеченный инвариант модели:
Когда мы запускаем это, TLC находит контрпример: между шагами A и B инвариант не выполняется.
Как решить эту проблему? Это зависит от того, какой уровень абстракции нам небезразличен. Если вы разрабатываете базу данных, вам нужно указать точные шаги, необходимые для обеспечения согласованности системы. Однако на нашем уровне мы, вероятно, имеем доступ к транзакциям базы данных и можем «абстрагироваться» от проверок атомарности. Мы делаем это так, чтобы объединить A и B в один шаг «Транзакции». Это сообщает TLA +, что оба действия выполняются одновременно, и система никогда не проходит через недопустимое состояние.
---- МОДУЛЬ Передача ----
EXTENDS Naturals, TLC
(* - передача алгоритма
переменные alice_account = 10, bob_account = 10, деньги \ in 1..20,
account_total = alice_account + bob_account;
начать
Перечислить:
если alice_account> = деньги, то
A: alice_account: = alice_account - деньги;
bob_account: = bob_account + деньги; \ * Оба теперь являются частью A
конец, если;
C: утверждать alice_account> = 0;
конечный алгоритм *)
MoneyNotNegative == деньги> = 0
MoneyInvariant == alice_account + bob_account = account_total
====
Многопроцессорные алгоритмы
В завершение нашего примера давайте обсудим параллелизм.Сейчас наша система кажется достаточно стабильной для одной передачи между двумя сторонами. Но что произойдет, если люди смогут делать несколько переводов? Каждый из них использует одно и то же состояние учетной записи, но работает независимо друг от друга. Можем ли мы проверить поведение этой системы?
PlusCal поддерживает многопроцессорные алгоритмы. Процессы могут быть совершенно разными алгоритмами, происходящими одновременно, или одним и тем же, происходящим параллельно (или и тем, и другим). Последнее - то, что мы хотим указать. Вот как бы это выглядело, если бы мы могли провести две транзакции:
---- МОДУЛЬ Передача ----
EXTENDS Naturals, TLC
(* - передача алгоритма
переменные alice_account = 10, bob_account = 10,
account_total = alice_account + bob_account;
Перенос процесса \ в 1..2
переменные деньги \ в 1..20;
начать
Перечислить:
если alice_account> = деньги, то
A: alice_account: = alice_account - деньги;
bob_account: = bob_account + деньги;
конец, если;
C: утверждать alice_account> = 0;
завершить процесс
конечный алгоритм *)
MoneyNotNegative == деньги> = 0
MoneyInvariant == alice_account + bob_account = account_total
====
Счета - это глобальные переменные, а деньги - это локальная переменная процесса. Это означает, что существует 400 возможных начальных состояний, так как первый перевод может составлять один доллар, а второй - семь.Однако на самом деле существует 2400 возможных вариантов поведения! Это потому, что TLC может выбирать, в каком порядке запускать процессы, а также как их чередовать.
Однако MoneyNotNegative
больше не имеет смысла, так как теперь есть два значения для денег. Если вы добавили это в модель, не забудьте снять этот флажок, чтобы избежать ошибки и выполнить повторный запуск. Вы должны получить следующую ошибку:
Существует промежуток между тем, когда мы проверяем, достаточно ли денег у Алисы, и тем, когда мы фактически переводим деньги.С одним процессом это не было проблемой, но с двумя это означает, что ее аккаунт может стать отрицательным. TLC достаточно хорош, чтобы предоставить начальное состояние и шаги, необходимые для воспроизведения ошибки.
Этот пример охватывает только небольшую часть инструмента; мы еще даже не коснулись временных свойств, живучести или манипуляции с установками.