Интернет магазин на тильде пример: Примеры интернет-магазинов на конструкторе Tilda

Содержание

Какие сайты мы создаем на Тильде. Обзор от Uplab — Личный опыт на vc.ru

Digital-агентство Uplab о том, почему использует Tilda Publishing и какие проекты на ней можно разрабатывать.

{«id»:54047,»url»:»https:\/\/vc.ru\/life\/54047-kakie-sayty-my-sozdaem-na-tilde-obzor-ot-uplab»,»title»:»\u041a\u0430\u043a\u0438\u0435 \u0441\u0430\u0439\u0442\u044b \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0430 \u0422\u0438\u043b\u044c\u0434\u0435. \u041e\u0431\u0437\u043e\u0440 \u043e\u0442 Uplab»,»services»:{«facebook»:{«url»:»https:\/\/www.facebook.com\/sharer\/sharer.php?u=https:\/\/vc.ru\/life\/54047-kakie-sayty-my-sozdaem-na-tilde-obzor-ot-uplab»,»short_name»:»FB»,»title»:»Facebook»,»width»:600,»height»:450},»vkontakte»:{«url»:»https:\/\/vk. com\/share.php?url=https:\/\/vc.ru\/life\/54047-kakie-sayty-my-sozdaem-na-tilde-obzor-ot-uplab&title=\u041a\u0430\u043a\u0438\u0435 \u0441\u0430\u0439\u0442\u044b \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0430 \u0422\u0438\u043b\u044c\u0434\u0435. \u041e\u0431\u0437\u043e\u0440 \u043e\u0442 Uplab»,»short_name»:»VK»,»title»:»\u0412\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u0435″,»width»:600,»height»:450},»twitter»:{«url»:»https:\/\/twitter.com\/intent\/tweet?url=https:\/\/vc.ru\/life\/54047-kakie-sayty-my-sozdaem-na-tilde-obzor-ot-uplab&text=\u041a\u0430\u043a\u0438\u0435 \u0441\u0430\u0439\u0442\u044b \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0430 \u0422\u0438\u043b\u044c\u0434\u0435. \u041e\u0431\u0437\u043e\u0440 \u043e\u0442 Uplab»,»short_name»:»TW»,»title»:»Twitter»,»width»:600,»height»:450},»telegram»:{«url»:»tg:\/\/msg_url?url=https:\/\/vc.ru\/life\/54047-kakie-sayty-my-sozdaem-na-tilde-obzor-ot-uplab&text=\u041a\u0430\u043a\u0438\u0435 \u0441\u0430\u0439\u0442\u044b \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0430 \u0422\u0438\u043b\u044c\u0434\u0435.

\u041e\u0431\u0437\u043e\u0440 \u043e\u0442 Uplab»,»short_name»:»TG»,»title»:»Telegram»,»width»:600,»height»:450},»odnoklassniki»:{«url»:»http:\/\/connect.ok.ru\/dk?st.cmd=WidgetSharePreview&service=odnoklassniki&st.shareUrl=https:\/\/vc.ru\/life\/54047-kakie-sayty-my-sozdaem-na-tilde-obzor-ot-uplab»,»short_name»:»OK»,»title»:»\u041e\u0434\u043d\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u0438\u043a\u0438″,»width»:600,»height»:450},»email»:{«url»:»mailto:?subject=\u041a\u0430\u043a\u0438\u0435 \u0441\u0430\u0439\u0442\u044b \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0430 \u0422\u0438\u043b\u044c\u0434\u0435. \u041e\u0431\u0437\u043e\u0440 \u043e\u0442 Uplab&body=https:\/\/vc.ru\/life\/54047-kakie-sayty-my-sozdaem-na-tilde-obzor-ot-uplab»,»short_name»:»Email»,»title»:»\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u043f\u043e\u0447\u0442\u0443″,»width»:600,»height»:450}},»isFavorited»:false}

24 252 просмотров

Tilda Publishing — платформа, которая позволяет запускать качественные интернет-проекты, минуя этапы верстки и программирования. Реализована в форме SaaS-решения (software as a service — «программное обеспечение как услуга») — пользователю не нужно самостоятельно заниматься техническим обслуживанием сайта и подключать для администрирования конкретного специалиста.

Раньше мы делали сайты только на CMS «1С-Битрикс», верстая страницы кодом, однако с появлением Тильды стали использовать ее для внутренних проектов: анонсирования мероприятий, создания ежемесячных агентских дайджестов, публикации кейсов и т.д. Тильда позволила разгрузить дизайнеров и разработчиков — редактор вполне мог запустить проект с нуля самостоятельно. Через какое-то время мы стали выпускать коммерческие проекты для заказчиков, у которых был ограничен бюджет и сроки разработки.

Тильду мы выбрали неслучайно.

У нее весомые преимущества перед многими другими конструкторами:

  • Богатая библиотека готовых блоков, из которых можно собрать вполне себе уникальную страницу.
  • Много готовых (нестандартных!) шаблонов для разных тематик.
  • Автоматическая адаптивность библиотечных блоков, и простая ручная адаптация под мобильные устройства в Zero Block.
  • Возможности подключения систем оплаты к сайту.
  • Встроенная система аналитики сайта.
  • Расширенная обучающая программа — инструкции, подборки проектов, курсы, полезные статьи в блоге.
  • Возможность добавления страниц, сверстанных в Тильде, через API на основной сайт.
  • Простая и удобная работа с контентом.
  • Гибкость для дизайнеров: тонкая настройка типографики, базовая и сложная анимация и Zero Block (редактор внутри Тильды, который позволяет самому создавать уникальные блоки) для свободного творчества.
  • Не нужен хостинг и техническая поддержка — все предоставляет сервис.

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

Клиенты ценят Тильду в первую очередь за скорость разработки сайтов — он не превышает 2 месяцев. А еще за удобство дальнейшего администрирования — научиться управлять контентом легко, а вносить правки еще легче. При этом нет риска что-то сломать в движке сайта.

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

Лендинг

Лендинг для Школы ораторского мастерства Александра Яныхбаша

Лендинг для Школы ораторского мастерства Александра Яныхбаша. Состоит из блоков с основными тезисами, которые раскрывают выгоды предложения.

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

К тому же он планировал вести блог — требовался удобный движок для быстрой публикации статей и внесения изменений.

Задача проекта

Стильный лендинг с хорошим дизайном, реализованный именно на Тильде.

Решения

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

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

Андрей Тюнин

дизайнер Uplab

Преимущества Тильды для дизайнера

  • Простая работа с контентом.
    Визуальный редактор предельно простой, но при этом функциональный. Есть все необходимые инструменты, включая встроенный типограф.
  • Тонкая работа с типографикой. Можно настроить высоту и толщину шрифта, межстрочное и межбуквенное расстояние и т.д.
  • Zero Block. Встроенный редактор позволяет самостоятельно создать любой блок. Можно реализовать полностью индивидуальный дизайн.
  • Настраиваемая адаптивность. Некоторые стандартные блоки могут некорректно отображаться на маленьких экранах. Для решения этой проблемы можно использовать раздельную настройку адаптивности. Так на мониторе пользователь увидит один результат, а на смартфоне другой — тот, который лучше подойдет под размер его экрана.
  • Анимация элементов. Простая анимация доступна в настройках стандартных блоков, а сложную, пошаговую анимацию можно разработать в Zero Block.

Информационный портал

Туристический портал города Чебоксары. Запускался как собственный work&fun проект агентства, а затем перерос в полноценный портал для туристов и жителей города. Проект развивается при поддержке местной администрации. Сейчас над ним работает команда специалистов: редакторы, SEO- и SMM-специалисты, контент-менеджеры.

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

Задачи проекта

  • Привлечь внимание туристов и местных жителей к событиям и объектам города.
  • Увеличить туристический поток и узнаваемость бренда города.

Решения

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

Результат

  • Средняя посещаемость — 40 000 человек ежемесячно.
  • 50% посетителей — местные жители, 50% — жители других регионов.
  • VisitVolga стала узнаваемым брендом как в городе, так и за его пределами.
  • Посещаемость растет с каждым годом.

География посетителей портала VisitVolga

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

Занимаюсь поисковым продвижением портала VisitVolga. Сайт хорошо индексируется и ранжируется, подавляющая часть трафика — посетители из поисковых систем. Поначалу я скептически относился к Тильде — все же это конструктор, к тому же, когда мы запускали сайт, был ряд ограничений по SEO.

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

Предлагаю небольшой чек-лист, который поможет оптимизировать сайт на Тильде:

1. Настроить 301 redirect с версии www на версию без www или наоборот.

2. Добавить протокол https, настроить redirect 301 и указать в файле robots.txt и карте сайта (sitemap).

3. Внедрить коды систем аналитики, добавить сайт в панели вебмастеров.

4. Оптимизировать все мета-теги, указать уровни заголовков (h2, h3, h4).

5. Оптимизировать все изображения: уменьшить их вес и размер, прописать альтернативное описание изображения (alt).

6. Найти и исправить битые ссылки, добавить хлебные крошки, провести работы по внутренней перелинковке.

7. Создавать качественный контент под поисковые запросы, грамотно верстать страницы, использовать только уникальные фото и видеоматериалы.

В качестве пошаговой инструкции можно использовать статью «Как оптимизировать сайт на Тильде под поисковые системы».

Александр Плеханов

SEO-специалист Uplab

Преимущества для SEO

  • Упрощенная работа с поисковой оптимизацией. Базовые настройки доступны прямо в админ-панели, не нужно лезть в код, искать где и что находится, все максимально доступно.
  • Предусмотрен весь необходимый функционал: robots.txt, sitemap, метаописания для изображений, соцсетей, страниц и др.
  • Можно управлять индексацией отдельных страниц. В настройках каждой страницы есть запрет на индексацию. Это полезно, когда вы работаете над материалом и не хотите, чтобы он индексировался раньше времени, или создаете техническую страницу.
  • Легкая интеграция с системами аналитики. Не нужно вставлять код «Яндекс.Метрики» или Google Analytics, достаточно номера счетчика.
  • Хорошая индексация поисковыми роботами. За время работы у нас не возникло проблем с индексацией или дублями страниц.

Корпоративный сайт

Сайт курортного комплекса

Riviera Wellness Resort — курортный комплекс премиум-класса, расположенный в живописном районе недалеко от Белгорода. Особенность разработки сайта — сжатые сроки. За месяц требовалось реализовать более 100 страниц. Выбрали Тильду за скорость и простоту работы.

Структура сайта Riviera Wellness Resort

На этом проекте Тильда нас буквально выручила. От клиента пришел запрос на новый сайт — в ТЗ была огромная структура, а времени на все — месяц. При этом проект нужно было сделать на уровне. Были особые требования к дизайну — сайт должен был строго соответствовать гайдлайну, поэтому почти все блоки мы разработали в Zero Block.


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

Диана Олейник

менеджер проектов Uplab

Задачи проекта

  • Разработать современный адаптивный сайт.
  • Продумать структуру сайта и навигацию.
  • Учесть требования гайдлайна клиента.

Решения

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

Клиенту понравился сайт на Тильде, но он указал на один недостаток — лента новостей не обновлялась автоматически. Мы сообщили об этом команде Тильды и уже через неделю такая возможность появилась. Совпадение? )

Вот такое письмо пришло нам от клиента.

Преимущества для менеджера

  • Можно реализовать даже крупный проект — но не более 500 страниц на одном домене.
  • Реально запустить полноценный сайт в короткие сроки — нет этапа верстки и программирования, поэтому разработка и внесение правок проходят гораздо быстрее.
  • В отличие от многих конструкторов, Тильда позволяет создавать сайты, полностью отвечающие запросам клиента: как по дизайну, так и по функционалу.

Сайт для сферы услуг

Сайт салона красоты

Новый сайт салона красоты «САН БАЛИ». Салон на рынке уже больше 10 лет, предыдущая версия сайта устарела — не было адаптации под мобильные устройства, дизайн не отражал уровень заведения, страдала навигация, ресурсом было неудобно пользоваться.

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

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

Задачи проекта

  • Обновить сайт заказчика — сделать его более удобным и современным.
  • Адаптировать сайт под мобильные устройства.
  • Внедрить модуль онлайн-бронирования.
  • Презентовать SPA-услуги как основное направление салона.
  • Перенести сайт со старого домена без потери трафика.

Решения

  • За основу взяли фирменные цвета салона.
  • Чтобы сохранить позиции в поисковых системах, мы учли все нюансы поисковой оптимизации, которые присутствовали на старом сайте. URL и заголовки страниц, вхождения запросов и структура сайта остались теми же. Перенос производился под контролем SEO-специалистов, что позволило избежать потери трафика.
  • Внедрили модуль онлайн-бронирования.
  • Настроили адаптацию всех блоков под мобильные устройства.

Преимущества для заказчика

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

Интеграция по API

Блог Uplab

Мы ведем блог уже несколько лет. Раньше статьи были на «1С-Битрикс», как и весь сайт. В 2015 году мы решили верстать материалы в Тильде — это быстрее, проще и удобнее, а результат гораздо эффектнее. Можно экспериментировать с форматами, а также создавать шаблоны страницы и на их основе верстать новые материалы.

Контент из Тильды встраивается в наш сайт на «1С-Битрикс» через Tilda API. Подробнее изучить механизм работы можно в справочном центре конструктора. Шапка, меню и другие важные элементы остаются теми же, что на основном сайте.

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

Задачи проекта

  • Упростить и стандартизировать верстку статей.
  • Придать публикациям собственный визуальный стиль.

Решения

  • Мы сами разработали плагин для «1С-Битрикс» который позволяет подгружать статьи из Тильды в один клик. Сейчас он доступен для всех.
  • Основной сайт использует все преимущества «1С-Битрикс», а статьи в блог верстаются на Тильде.

Мы выбрали Тильду по трем причинам:

Верстка статей и внесение правок происходят быстрее. В случае чего редактор сам может что-то поменять — для этого не нужно знать HTML.

Тильда стимулирует редакторов целостно смотреть на материал — думать не только о тексте, но и его оформлении.

Очень много стандартных блоков, которые отлично выглядят. Для базового ведения блога их вполне достаточно. Если планируется спецпроект и нужна уникальная верстка, можно воспользоваться Zero Block.

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

Анастасия Макарова

ведущий редактор Uplab

Преимущества для редактора

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

Когда использовать Тильду

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

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

  • Посадочных и промо-страниц — там, где нужно сделать красиво, но нет времени и смысла тратить много ресурсов. Отдельный плюс — высокая скорость внесения правок и возможность создания мультилендингов. Можно запускать A/B-тесты и настраивать отображение контента в зависимости от разных факторов, например, геолокации пользователя.
  • Визиток и небольших корпоративных сайтов — когда заказчикам нужен простой и удобный, но полноценный сайт с хорошим дизайном. При этом важно, что управлять ресурсом клиент сможет своими силами.
  • Небольших сайтов-каталогов, услуг и интернет-магазинов — когда ассортимент невелик и можно представить каждую единицу в выгодном свете.
  • Контентных проектов — когда важно грамотно и красиво подать контент: видео, изображения и текст. Тильда идеальна для ведения блога, создания лонгридов, оформления портфолио и запуска спецпроектов.

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

  • Ограничение по количеству страниц — не более 500 страниц даже на бизнес-тарифе.
  • Ограниченность функционала. Все-таки это конструктор. Однако дополнительные функции на сайт можно внедрить через вставку HTML-кода.
  • Неудобное управление уровнями вложенностями. Пока проект небольшой, Тильда довольно удобна, но когда количество страниц растет, управлять вложенностью становится трудно.
  • Крупный интернет-магазин, который будет хорошо продвигаться в поисковых системах, на Тильде пока создать не получится. Конструктор не позволяет собрать базу данных товаров, занести характеристики, настроить фильтры, добавить боковое меню с продуктами и сортировкой. А это важно, т.к. серьезно влияет на поведенческие факторы сайта.

Подводя итог: Тильда не подойдет для высоконагруженных проектов — крупных промышленных каталогов, информационных порталов, больших интернет-магазинов, сайтов с динамическим контентом вроде «Госуслуг».

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

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

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

Сайты на Tilda. Плюсы и минусы конструктора. Примеры сайтов на Tilda

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

Итак, Tilda Publishing — блочный конструктор сайтов, который позволяет создавать как одностраничные сайта для рекламы, так и небольшие интернет-магазины, при этом не требующий навыков программирования.
Принцип создания сайтов на Tilda заключается в использовании готовых блоков, которые уже адаптированы под мобильные устройства, то есть сайт будет одинаково хорошо отображаться на любых устройствах.
Также стоит отметить, что помимо готовых блоков конструктор сайтов Tilda Publishing позволяет создавать свои при помощи встроенного редактора Zero Block, однако он потребует определенных знаний и навыков.
Основателем сервиса является Никита Обухов — арт-директор, предприниматель, автор курсов и интенсивов по дизайну. Сам сервис стартовал свою работу в 2014 году, а также Tilda Publishing стала лауреатом «Премии Рунета 2019» в номинации «Технологии и инновации».


Конструктор сайтов Tilda Publishing, примеры работ

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

    1. Одностраничный сайт для рекламы одной конкретной услуги автосервиса «АлДеан. Сделан полностью на бесплатном аккаунте.

    2. Еще один пример одностраничного сайта на Тильде, собранный для компании КОМПАС-РК , однако в этом случае использовалась возможность сбора заявок, поэтому приобретался платный аккаунт.

Друге интересные примеры сайтов, собранных на Тильде:

    3. Открой новый кофе (презентация товаров)
    4. Александровские конфеты (презентация товаров)
    5. Беспроводные охранные системы (лендинг для описания услуг)

Интернет магазины

    6. Постельное белье COMFYME
    7. Утягивающие корсеты STATNANIA
    8. Футболки с мерчем PEACELOVEMODA

Порталы

    9. Первая платформа трансформации российского бизнеса «#Трансфрма1″
    10. Журнал о конном мире — EQUESTRIAN
    11. БИБЛИОТЕЧНЫЙ ЦЕНТР «ЕКАТЕРИНБУРГ»

Стоит отметить, что пользователи сервиса Tilda Publishing создают сайты, которые были по достоинству отмечены несколькими премиями:

  • первое место в номинации «Промышленность и оборудование» Рейтинга рунета 2016;
  • первое место Bitrix Design Cup 2016;
  • третье место в номинации «Сайт промышленной или ТЭК компании» премии «Золотой сайт 2015».

  • Больше примеров сайтов, разработанных на базе конструктора Тильда, можно увидеть, перейдя на страницу с портфолио самого конструктора

    Минусы Тильды

    Итак, если о плюсах конструктора мы проговорили, то давайте рассмотрим и отрицательные моменты.

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

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

    Другой аспект, который волнует многих более-менее знающих в тонкостях продвижения – это минусы SEO сайта на Tilda. В данном случае редактор дает возможность настраивать многие аспекты, и даже подключать метрики к сайту, но лишь на платных аккаунтах.

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

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


    Итак, еще раз подведем итоги всего, что было сказано выше о конструкторе сайтов Tilda Publishing

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

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


    Что такое геймификация? 7 лучших примеров геймификации в веб-дизайне

    Выбираете, какие приёмы геймификации подойдут для вашего сайта или интернет-магазина? О геймификации эксперты говорят давно. Было время, когда каждый писал статьи о этом явлении и претендовал на статус эксперта по геймификации в бизнесе. Для кого-то это просто модное словечко, для кого-то – одержимость при ведении своего бизнеса. Как бы то ни было, геймификация не просто существует, но и невероятно эффективно работает.

    Краткая справка для новичков. Геймификация – это практика внедрения игровых механик и иногда элементов UI (пользовательский интерфейс) в сайт или приложение. В этой статье рассмотрены разные формы геймификации и способы их внедрения. О некоторых вы, возможно, слышали раньше, но могли не думать о них с точки зрения геймификации. Перевод статьи EZEQUIEL BRUNI.

    Игровые элементы: очки опыта, уровни, механизм апгрейдов и др.

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

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

    Игровые элементы: открытие объекта, достижение цели.

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

     

    Игровые элементы: соревнование, завершение миссии.

    Вы могли не думать об этом с точки зрения геймификации, но LinkedIn (и почти любое социальное медиа) внедряет игровые механики, чтобы убедить вас заполнить свой профиль максимально подробно. Заполнение каждого блока в вашем профиле идет как достижение. И вам всегда показывается статус-бар, чтобы вы видели, насколько заполнен ваш профиль.

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

    Игровые элементы: соревнование.

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

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

    Игровые элементы: соревнование (жесткий режим).

    Zoho мотиватор – инструмент от офисного онлайн ПО Zoho. Он берет данные из Zoho CRM, чтобы измерять действия каждой компании. Мотиватор считает лиды, потенциальных клиентов и успешные сделки. А затем организует соревнование между ними.

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

     

    Игровые элементы: квизы, загадки, платформинг и др.

    Interland это в буквальном смысле сайт, состоящий из образовательных мини-игр, обучающих интернет-безопасности и учтивости по отношению к новым интернет-пользователям. Этот проект Google направлен, прежде всего, на детей. Поэтому используемые механики не подойдут большинству сайтов и бизнес-проектам. А вот для образовательных сайтов это должно сработать. Обучение через игру – проверенная временем практика.

     

    7. Квизы

    Игровые элементы: квизы (да-да), соревнование.

    В продолжение предыдущего примера, было бы неправильно проигнорировать одну из самых старых форм геймификации в сети: онлайн-викторина. Многие приложения интегрируют в себя опросы Facebook, викторины Buzzfeed и квизы из Oatmeal. Возьмем для примера один из самых явных примеров квиза – гид по Британии.

    Хотя обычно квизы и викторины не связывают напрямую с бизнес-инструментами (а они могут ими быть), они часто используются как эффективные инструменты маркетинга. Осмелюсь сказать, что Buzzfeed и Outmeal обязаны своему успеху вирусному распространению опросов.

     

    Бонус: Чистая визуализация геймификации

    Игровые элементы: визуализация, платформинг.

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

    Я не знаю, можно ли это считать в полной степени геймификацией, но уверен, что это круто.

     

    Делитесь своими примерами сайтов в комментариях!

    Хотите, чтобы все знали ваш сайт? Заказать отзывы на сайт.

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

    Нужны другие работы по вашему сайту?

    Тарифы на поддержку сайта

     

    40 красивых примеров мебельных сайтов (+ шаблоны)

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

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

    Msl Interiors

    Porta Romana

    Nabru

    Eliteak

    Bontempi

    Artek

    Shackletons

    125years Poggenpohl

    Engelbrechts

    Brosa

    Current Collection

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

    Ballard Designs

    Jonathan Adler

    Pais Blanche

    Jossand Main

    Exsud

    CB2

    Trika

    Herman Miller

    ComingSoon Newyork

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

    King Living

    Wayfair

    DeFrae

    CultFurniture

    SpaceCraftJoinery

    Brdr.Kruger

    Taxonomy Of Design

    Eginstill

    Msds Studio

    Paustian

    Шаблоны

    Ниже предлагаем вашему вниманию 10тку шаблонов мебельных сайтов. Первые два из них бесплатные, найдены через Pinterest. Остальные взяты из архива TemplateMonster и полностью готовы к установке/настройке. Движки в премиальных решениях подбирали разные — от WooCommerce до OpenCart.

    Furniture Onepage Website

    DSGN

    Loftcosy (WooCommerce)

    Wood Finishes (OpenCart)

    Cherfort (WordPress)

    Modern Furniture (Magento)

    FurnitureStore (WooCommerce)

    Furniture (PrestaShop)

    Modern Furniture, Interior & Home (OpenCart)

    Furnitto (Shopify)

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

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

    Корзина для Тильда (альтернативный вариант)

    Легкая установка ,Не требует серверов ,Переведено на 8 языков ,Отправляет заказы на почту ,Отправляет заказы в Telegram ,Отправляет заказы через SMS ,Доступна бесплатная версия ,Рассчитывает скидки ,Использует промо-коды ,Показывает варианты доставки ,Создает сделки в Битрикс24 ,Создает сделки в МойСклад ,Формирует счета онлайн-оплаты ,Рекомендует дополнительные товары ,Передает цели в Яндекс Метрику

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

    Как установить корзину на Tilda

    Большой выбор инструментов продаж

    Простая настройка дополнительных механизмов: сопутствующие товары, скидки, доставка, онлайн-оплата и др.


    Любые данные покупателя

    Настройка необходимых полей для ввода покупателем при оформлении заказа.


    Сопутствующие товары

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


    Варианты доставки и скидки

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


    Онлайн-оплата заказа

    Подключение виждета онлайн-оплаты любой платежной системы.


    Уведомления о заказах в Telegram

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

    Получить код для установки корзины

    Как добавить корзину на Тильде

    [инструкция]

    — В главном меню сайта перейдите в раздел «Настройки сайта» (1).

    — Слева в списке выберите раздел «Еще». В появившемся окне перейдите в раздел «HTML код для вставки внутрь HEAD» и отредактируйте его (2).

    — Установите внутри блока код, который вы получили в личном кабинете сервиса «Простой магазин». Обратите внимание на то, что при создании корзины на тильде первая строка скопированного кода не используется (3).

    Через Zero-Block

    Добавьте элемент HTML. Внутри него разместите код, полученный в личном кабиенте сервиса «Простой магазин» в разделе «Торговые предложения» (4).

    В стандартный каталог

    При редактировании контента добавьте вторую кнопку. Назовите её «купить» и сделайте ссылкой на страницу. В адресе укажите #ensadd:{код товара}

    Бесплатно

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

    Для любого сайта

    Корзина может быть установлена на любой сайт, в том числе на HTML-сайты или собранные на конструкторах.

    Онлайн-оплата

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

    Адаптивный дизайн

    100% адаптирован для мобильных устройств с различными размерами экрана. Удобен для заполнения на устройствах с сенсорным вводом.

    Служба поддержки

    Помогает при установке корзины, настройке дизайна, настройке аналитики в корзине (целей). Консультирует по вопросам использования.

    Доставка и скидки

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

    Экспорт в Excel

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

    Бесплатная установка виджета корзины

    Для установки вам потребуется:

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

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

    Заказать сайт на тильде, пример лендингов на tilda, лучшие сайты на конструкторе Тильда от CLICK IT

    1. Возможность создать сайт по доступной цене. Благодаря своей простоте, стоимость сайта на тильде вас приятно удивит. Стоимость создания сайта на Тильде зависит от того, будет это сайт каталог, лендинг, многостраничный сайт или корпоративный блог. Также цена создания сайта на тильде зависит и от пожеланий клиента по дизайну проекта.

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

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

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

    5. Техподдержка на связи 24/7. Любые возникшие проблемы, сложности, вопросы и сбои решаются технической поддержкой, которая работает на русском языке (будет плюсом для тех, кто не знает английский) и действительно дает быструю обратную связь. Специалист всегда подскажет, направит и объяснят все возможности конструктора, а также предложит решение. Кроме того, у компании есть свой блог, где для пользователей собрана вся информация по возможностям, функционалу и вопросам. Это мощная база знаний, которая помогает каждому решать большинство всех неясных ситуаций, фактически не связываясь со службой технической поддержки.

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

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

    8. Оплату онлайн можно получить с любого удобного сервиса. Получение платежа через Интернет может показаться проблемой. Но с Тильдой вам не о чем беспокоиться. Конструктор дает возможность пользоваться всеми популярными сервисами онлайн платежей.

    9. SEO продвижение. SEO — главный инструмент, который позволяет сайту быть заметным для поисковиков и пользователей. Хорошая новость о Тильде заключается в том, что это платформа удобна для поисковых систем. Благодаря последовательному расположению блоков проекты, выполненные на тильде, хорошо индексируются поисковиками. Можно прописать мета-теги, задать url для каждой страницы, благодаря чему адрес будет удобен для чтения и понятен при индексации. Проект загружается быстро, что также положительно влияет на выдачу поисковике.

    10. Facebook оптимизация. Есть возможность создать заголовок и описание отдельно для страниц, отображающихся в превью ссылки в Facebook.

    11. CRM. Смотреть всю аналитику и доступные лиды можно с встроенной CRM системе. Также есть возможность подключить сторонние инструменты, полный список которых опубликован на сайте компании.

    12. Аналитика. Конструктор имеет встроенную панель аналитики, которая показывает базовые измерения эффективности веб-сайта: просмотры страниц, конверсии страниц, вовлеченность посетителей.

    Тильда — достойный конструктор сайтов в своей нише. Это позволяет подавать контент креативно в привлекательной и интересной форме, чтобы привлечь внимание целевой аудитории. Поэтому важно понимать, что Тильда ориентирована на контент. С сайтом на Тильде создавать качественный контент так же просто, как 1, 2, 3. Как один из лучших конструкторов для создания сайтов на рынке, Тильда обладает множеством функций и преимуществ. Вам нужна только ваша собственная концепция и помощь специалиста, тогда все остальное будет завершено в кратчайшие сроки. Имея возможность создавать уникальный дизайн, сайт на Тильде на заказ — это лучшее решение для большинства проектов. Если вам нужен одностраничный сайт — Тильда станет лучшим решением. В то же время вы не сможете реализовать проекты с очень сложной структурой, и создать большой интернет-магазин невозможно. Однако если ваша цель — сайт визитка, нужно быстро запуститься, протестировать бизнес-идею, то вам обязательно стоит заказать сайт на Тильде.

    Статья знаний

    Case Wizard | Qlik®

    Номер статьи: 000077470 | Последнее изменение: 22.06.2019

    Несколько файлов, имена которых содержат символ тильды, можно найти в% InstallDir% \ Qlik \ Sense \ Client \ chunks \. Некоторые приложения брандмауэра веб-приложений, такие как CA Siteminder и Barracuda LB ADC, жалуются на это. Пример предупреждающего сообщения:

    «Тильда в пути URL-адреса URL-адрес запроса / qs / webticket2 / resources / chunks / vendors ~ unorm-amd.Файл c9641a3a4d6c4a29e36e.js содержит символ тильды (~) и запрещен АЦП Barracuda Load Balancer. Символ тильды обычно обозначает домашние каталоги пользователей, а разрешение тильды может предоставить доступ даже к файлам, принадлежащим суперпользователю сервера, если процесс веб-сервера запущен от имени суперпользователя. Нет рекомендаций для этой атаки »


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

    Тильда:
    В RFC 1738 (от декабря 1994 г.) символ тильды считался небезопасным, поскольку шлюзы и другие транспортные агенты иногда могли его изменять. Однако в RFC 2396 (от августа 1998 г.) он был удален из списка небезопасных «, поскольку он широко используется в Интернете, несмотря на трудности с его расшифровкой с помощью некоторых клавиатур ».В некоторых статьях по-прежнему рекомендуется не использовать тильду, потому что писать с клавиатуры нелегко, но здесь это не проблема, поскольку мы используем ее только для ссылки на статические файлы. Короче говоря, его следует рассматривать как безопасный символ для использования в URL-адресах.

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

    Веб-дизайн: как использовать значки на целевых страницах

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

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

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

    Итак, приступим!

    Сделайте список привлекательным

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

    Самый простой способ эффективно использовать пространство веб-страницы — это расположить элементы по горизонтали. Вот пример:

    Целевая страница IBM Watson

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

    Давайте сравним 2 способа, и вы поймете, какой из них более запоминающийся и удобный.
    Структурный блок фактов без иконок:

    Или структурный блок фактов с иконками:

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

    Блок нижнего колонтитула на целевой странице iPhone X

    Сделать неупорядоченные списки красивыми

    Очевидный способ сделать список красивее — поставить галочку:

    Партнерская программа Stripe, страница

    Шаблон целевой страницы фитнес-тренера от Тильды

    Основные характеристики

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

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

    Чтобы получить числовые значки, легко ищите «цифру 4» или «4 в кружке» на Icons8.

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

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

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

    Придайте эмоциональный оттенок достоинствам

    Визуальная метафора привлекает внимание посетителя и помогает понять смысл вашего сообщения.

    Блок «Преимущества» в шаблоне целевой страницы компании Тильды

    Дайте визуальные синонимы сервисам

    Один из стандартных сервисных блоков в Tilda Publishing

    Давайте быстро изменим дизайн веб-сайта консалтинговой компании мирового уровня.

    Вот раздел страницы до редизайна:

    Опыт Booz Allen Hamilton стр.

    А вот и переработанная версия с иконками.Мы будем использовать иконки в стиле Windows 10. Какой тебе больше нравится?

    Обновленный блок услуг для Booz Allen Hamilton

    Применение фирменного цвета к значкам

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

    Целевая страница Xero

    Целевая страница чата по внутренней связи

    Стр. Партнерской программы Stripe

    Icons8 имеет несколько цветовых схем для любого значка. Диалог раскраски позволяет изменить любой цвет разноцветных значков.

    Иконки 8 различных цветовых стилей для иконки в правом столбце.

    Диалог изменения цвета значка Icons8, в котором можно изменить несколько цветов значка.

    Добавьте веса к иконкам с формой фона

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

    Шаблон целевой страницы квартиры Тильды

    Shopify использует формы круга для объединения различных форм значков на своей домашней странице:

    Используйте гибкую настройку фона в Icons8 в соответствии с вашим стилем.

    Отдельные блоки

    Визуальный анкер секции

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

    В разделе шаблона целевой страницы веб-службы используется значок вложения

    Целевая страница вакансии использует числовые значки в кружках в качестве разделителя разделов

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

    Несколько значков вместе (чашка, сердце, круассан) на целевой странице кофейни

    Разделитель оригинальный

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

    «Разрывы текста — те места, где автор хочет вставить пробел, но не новую главу или раздел — многие авторы используют их, и они часто создают проблемы при верстке книги.«(8 решений дилеммы разрыва текста)

    Однако разделитель частей является одним из вариантов форматирования Medium:

    А в издательстве «Тильда» их целый ряд:

    В принципе, любая простая форма в стиле материала (заполненная и плоская), такая как 3 точки или звездочки, лист или звездочки, может быть разделителем частей.

    Разъясните тарифные планы с помощью метафор

    Ценовые планы

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

    Страница с ценами на рычаг

    Страница цен на Algolia

    Toggl планирует блок

    Страница цен на Digital Ocean

    Один из блоков тарифных планов Тильды побуждает автора указывать значок в каждом столбце

    Не скучно

    «Вы не можете утомлять людей покупать ваш продукт» (Дэвид Огилви, рекламный магнат)

    Создавайте привлекательные образы героев

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

    Изображение героя в сообщении в блоге Realtimeboard состоит из значков

    Sprout Social использует иконки почти во всех анонсах статей

    Auth0 выбрал минималистичный способ иллюстрации для своих статей — одна иконка

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

    В шаблоне целевой страницы ремонтной службы Тильды есть обложка из иконок устройств

    Чтобы создать простой предварительный просмотр вашего контента для социальных сетей, рассмотрите Cosmic Pedro от Icons8 или Emoji Pics Composer от Amplifr.

    Создание значимых интерактивных кнопок

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

    Простая стрелка означает еще одну страницу с дополнительными сведениями.

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

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

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

    Целевая страница Quickbooks использует обведенный кружком значок воспроизведения для кнопки просмотра видео

    Получить положительный отзыв

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

    Согласно Hubspot, получить комментарий намного сложнее, чем поставить отметку «Нравится».

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

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

    Сделайте обычный образ привлекательным

    Иконки добавляют вкус любому сухому содержимому.

    Карьера на Airbnb стр.

    Целевая страница Dropbox

    Контактный блок в шаблоне лендинга кафе от Тильды

    Использование значков в качестве логотипов

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

    Baremetrics использует значки геометрической формы для каждой большой функции в своем продукте

    В шаблоне целевой страницы летнего лагеря Тильды используется значок палатки на крышке блока

    Заключение

    Создание привлекательных целевых страниц может не потребовать больших усилий, если у вас есть немного вдохновения и пара хороших инструментов:
    — Библиотека значков с поиском и настройками значков, например Icons8
    — Конструктор веб-страниц с хорошей библиотекой блоков, например Tilda Издательство

    Попробуйте применить кейсы из статьи на текущей или следующей целевой странице, измерьте конверсию и расскажите нам о результатах!

    Находите это полезным? Поделитесь с теми, кто тоже может им воспользоваться.

    Об авторе: это гостевой пост Влада Коробова из команды «Тильда Паблишинг», создателей удобного и элегантного конструктора сайтов.

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

    интервал — Какая разница в цитировании / ссылках с тильдой или без? — TeX

    Из книги TeX ( Глава 6: Запуск TeX , стр. 25):

    [знаки ~ ] называются связями , потому что они связывают слова вместе; я.е., TeX должен обрабатывать ~ как нормальное пространство, но не нарушать между строк там. Хорошая машинистка будет использовать связи в именах, так как показано в нашем примере; дальнейшее обсуждение связей появляется в Глава 14.

    Продолжение в Глава 14: Как TeX разбивает абзацы на строки , стр. 91-93:

    «Связи» — обозначаются ~ в обычном TeX — являются ключом к успешной линии. ломка. Как только вы научитесь их вставлять, вы закончите из рядов обычных машинисток TeXnical в избранную группу Уважаемые TeXnicians.И тренироваться действительно не сложно сам вставлять случайные галстуки, почти не задумываясь, как вы напечатайте рукопись.

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

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

    • В ссылках на названные части документа:

      Глава ~ 12 и Теорема ~ 1.2 Приложение ~ A и Таблица ~ \ hbox {B-8}
      Рисунок ~ 3 и Леммы 5 и ~ 6

      ~ появляется после лемм в последнем примере, поскольку нет вредно иметь 5 ~ и ~ 6 в начале строки.Использование \ hbox объясняется ниже.

    • Между именами человека и между несколькими фамилиями:

      Дональд ~ Э. Кнут и Луис ~ И. Трабб ~ Пардо
      Бартель ~ Леендерт van ~ der ~ Waerden и Charles ~ XII

      Обратите внимание, что иногда лучше написать имя через дефис, чем разорвать его. между словами; например, Don- и ald ~ E. ~ Knuth более приемлем, чем Дональд и Э.~ Кнут . Предыдущее правило можно рассматривать как частный случай этого, поскольку мы можем рассматривать Chapter ~ 12 как составное имя; другой пример — регистр ~ X . Иногда имя такое долго, чтобы мы не осмелились связать все вместе, чтобы не было возможности разорвать строку:

      Шарль Луи Ксавье ~ Жозеф де ~ ла Валле ~ Пуссен.

    • Между математическими символами в сочетании с существительными:

      размер ~ $ d $ ширина ~ $ w $ функция ~ $ f (x) $
      строка ~ $ s $ длины ~ $ l $

      Однако последний пример следует сравнить с

      .

      строка ~ $ s $ длиной $ l $ ~ или более.

    • Между символами в серии:

      1, ~ 2 или ~ 3
      $ a $, ~ $ b $ и ~ $ c $.
      1, ~ 2, \ точки, ~ $ n $.

    • Когда символ представляет собой плотно связанный объект предлога:

      из ~ $ x $
      от 0 до ~ 1
      увеличивает $ z $ на ~ 1
      вместе с ~ $ m $.

      Однако правило не распространяется на составные объекты:

      из $ u $ ~ и ~ $ v $.e $ и для всех крупных ~ $ n $

      Сравните ~ 15 с в 15 ~ раз больше высоты .

    • При перечислении дел в абзаце:

      (b) ~ Покажите, что $ f (x) $ (1) ~ непрерывно; (2) ~ ограничено.

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

    Галстук не дает TeX ломаться в пробел, но иногда хочется не допускайте поломки машины через дефис или тире. Это может быть выполняется с помощью \ hbox , потому что TeX не разбивает содержимое коробка; коробки являются неразложимыми блоками после того, как они были построены. Мы уже проиллюстрировали этот принцип в таблице ~ \ hbox {B-8} пример, рассмотренный ранее.Другой пример возникает, когда вы вводя номера страниц в библиографической ссылке: не выглядит хорошо поставить 22. в отдельную строку, чтобы вы могли набрать \ hbox {13–22}. , чтобы запретить взлом 13-22. С другой стороны, TeX не часто ставит перенос строки через дефис, поэтому вам не нужно беспокоиться о вставьте команды \ hbox , если вам не нужно исправить плохой разрыв, который TeX уже выполнил предыдущий запуск.

    Создание очень гибких и точных фильтров с использованием подстановочных знаков: ProtonMail

    Поскольку объяснение фильтров на самой панели в основном не существует, а учебные пособия / справочная документация доходит только до выполнения самого простого фильтра по одному слову, я объясню здесь, как заставить фильтры вести себя больше как поисковые системы, а не абсолютно статические фильтры по умолчанию.Кроме того, знаете ли вы, что условие «MATCHES» (и только это) также поддерживает подстановочные знаки? Да, я тоже. Мы просто должны каким-то образом это знать. Очевидно, слишком сложно упомянуть об этом где-нибудь на панели «Фильтры» …

    ЧТО ТАКОЕ WILDCARDS?

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

    * (звездочка) может заменять любое количество символов, например, * восток соответствует «Север восток » и «Юг восток »

    ? (знак вопроса) можно заменить любой одиночный символ, например sm? th соответствует «sm i th» и «sm y th»

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

    КАК ПОЛЬЗОВАТЬСЯ WILDCARDS?

    Вам необходимо создать новый фильтр, который использует условия «тема» и «соответствует». Поскольку только условие типа «совпадает» позволяет использовать подстановочные знаки, такие как * (звездочка) или? (знак вопроса), чтобы преобразовать статическое сопоставление символов в гибкое сопоставление без необходимости иметь дело со слишком сложными сетевыми фильтрами, но при этом у вас по-прежнему будет очень гибкая и точная фильтрация прямо на основной панели фильтров.

    ОСНОВНОЕ ИСПОЛЬЗОВАНИЕ ASTERISK

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

    Тема:

    Ваш заказ № 123456 выполнен!

    Поскольку номер будет отличаться в каждом полученном электронном письме, мы не можем включить его в фильтр, иначе письма не будут фильтроваться правильно.Мы могли бы использовать * для замены только числа. Это нормально, если вы планируете фильтровать только эту строку темы, а не какой-либо другой ее вариант. Вроде так:

    Ваш заказ * выполнен!

    Это будет соответствовать любому варианту числа, например:

    • Ваш заказ # 123456 выполнен!

    • Ваш заказ # 234567 выполнен!

    • Ваш заказ # 987654 выполнен!

    • Ваш заказ 123456 выполнен!

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

    РАСШИРЕННОЕ ИСПОЛЬЗОВАНИЕ ASTERISK

    Чтобы сделать более широкий фильтр, который по-прежнему оставался бы очень точным в том, что он делает, вы можете сделать следующее:

    Ваш * заказ * * завершен *

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

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

    • Ваш заказ # 123456 завершен !

    • Ваш заказ на новый выполнен!

    • Ваш заказ номер 1234 завершен

    Вы даже можете убрать из него «is», и это еще больше расширит соответствие строк темы, например:

    Ваш * заказ * завершен *

    Это приведет к тому, что он будет совпадать с чем-то почти полностью другим, например:

    Ваш заказ номер 123456 был завершен d!

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

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

    ПОЧЕМУ ТОЛЬКО НЕ ИСПОЛЬЗУЙТЕ УСЛОВИЕ «ОТПРАВИТЕЛЬ»?

    Что ж, иногда вы можете это сделать, если, например, в магазине есть отдельные адреса электронной почты для общих запросов и подтверждений. Например, у них есть [email protected] для общих запросов и [email protected] для подтверждений покупок, вы можете это сделать. Но если магазин использует [email protected] для обоих, у вас возникнут проблемы, потому что фильтр может улавливать технические запросы и фильтровать их вместе с подтверждениями заказа, потому что адрес электронной почты отправителя будет таким же.Использование вышеупомянутого фильтра с * между словами и использование как можно большего количества даст очень точное соответствие с почти нулевым количеством ложных срабатываний. Кроме того, вам потребуется добавить электронную почту каждого магазина, с которым вы взаимодействуете, в фильтр, где использование строки темы позволяет расширить область действия для различных магазинов с разными адресами электронной почты.

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

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

    Найти или заменить текст и числа на листе

    Найти

    Чтобы что-то найти, нажмите Ctrl + F или перейдите на страницу Домашняя страница > Редактирование > Найти и выбрать > Найти .

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

    1. В поле Find what: введите текст или числа, которые вы хотите найти, или щелкните стрелку в поле Find what: , а затем выберите в списке элемент недавнего поиска.

      Советы: Вы можете использовать подстановочных знаков — вопросительный знак (? ), звездочку ( * ), тильду ( ~ ) — в критериях поиска.

      • Используйте вопросительный знак (?), Чтобы найти любой отдельный символ — например, s? T находит «sat» и «set».

      • Используйте звездочку (*), чтобы найти любое количество символов — например, s * d находит «грустный» и «начатый».

      • Используйте тильду (~), за которой следует?, * Или ~, чтобы найти вопросительные знаки, звездочки или другие символы тильды, например, fy91 ~? находит «fy91?».

    2. Нажмите Найти все или Найти далее , чтобы начать поиск.

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

    3. Нажмите Параметры >> , чтобы при необходимости определить параметры поиска:

      • Внутри: Для поиска данных на листе или во всей книге выберите Лист или Рабочая книга .

      • Поиск: Вы можете выбрать поиск По строкам (по умолчанию) или По столбцам .

      • Искать в: Для поиска данных с конкретными деталями в поле щелкните Формулы , Значения , Примечания или Комментарии .

        Примечание: Формулы , Значения , Примечания и Комментарии доступны только на вкладке Найти ; только Формулы доступны на вкладке Заменить .

      • Учитывать регистр — Установите этот флажок, если хотите искать данные с учетом регистра.

      • Соответствовать всему содержимому ячеек — Установите этот флажок, если хотите искать ячейки, содержащие только символы, введенные в поле Найти: .

    4. Если вы хотите найти текст или числа с определенным форматированием, нажмите Формат , а затем сделайте свой выбор в диалоговом окне Найти формат .

      Совет: Если вы хотите найти ячейки, которые просто соответствуют определенному формату, вы можете удалить любые критерии в поле Найти , а затем выбрать конкретный формат ячеек в качестве примера. Щелкните стрелку рядом с полем Формат , нажмите Выбрать формат из ячейки , а затем щелкните ячейку с форматированием, которое вы хотите найти.

    Заменить

    Чтобы заменить текст или числа, нажмите Ctrl + H или перейдите на главную страницу > Редактирование > Найти и выбрать > Заменить .

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

    1. В поле Find what: введите текст или числа, которые вы хотите найти, или щелкните стрелку в поле Find what: , а затем выберите в списке элемент недавнего поиска.

      Советы: Вы можете использовать подстановочных знаков — вопросительный знак (? ), звездочку ( * ), тильду ( ~ ) — в критериях поиска.

      • Используйте вопросительный знак (?), Чтобы найти любой отдельный символ — например, s? T находит «sat» и «set».

      • Используйте звездочку (*), чтобы найти любое количество символов — например, s * d находит «грустный» и «начатый».

      • Используйте тильду (~), за которой следует?, * Или ~, чтобы найти вопросительные знаки, звездочки или другие символы тильды, например, fy91 ~? находит «fy91?».

    1. Нажмите Заменить все или Заменить .

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

    2. Нажмите Параметры >> , чтобы при необходимости определить параметры поиска:

      • Внутри: Для поиска данных на листе или во всей книге выберите Лист или Рабочая книга .

      • Поиск: Вы можете выбрать поиск По строкам (по умолчанию) или По столбцам .

      • Искать в: Для поиска данных с конкретными деталями в поле щелкните Формулы , Значения , Примечания или Комментарии .

        Примечание: Формулы , Значения , Примечания и Комментарии доступны только на вкладке Найти ; только Формулы доступны на вкладке Заменить .

      • Учитывать регистр — Установите этот флажок, если хотите искать данные с учетом регистра.

      • Соответствовать всему содержимому ячеек — Установите этот флажок, если хотите искать ячейки, содержащие только символы, введенные в поле Найти: .

    3. Если вы хотите найти текст или числа с определенным форматированием, нажмите Формат , а затем сделайте свой выбор в диалоговом окне Найти формат .

      Совет: Если вы хотите найти ячейки, которые просто соответствуют определенному формату, вы можете удалить любые критерии в поле Найти , а затем выбрать конкретный формат ячеек в качестве примера.Щелкните стрелку рядом с полем Формат , нажмите Выбрать формат из ячейки , а затем щелкните ячейку с форматированием, которое вы хотите найти.

    Существует два различных метода поиска или замены текста или чисел на Mac. Первый — использовать диалоговое окно «Найти и заменить ». Второй — использовать строку поиска на ленте.

    Чтобы что-то найти, нажмите Ctrl + F или перейдите на страницу Home > Найдите и выберите > Найдите .

    1. В поле Find what: введите текст или числа, которые вы хотите найти.

    2. Нажмите Найти далее , чтобы начать поиск.

    3. При необходимости вы можете определить дальнейший поиск:

      • Внутри: Для поиска данных на листе или во всей книге выберите Лист или Рабочая книга .

      • Поиск: Вы можете выбрать поиск По строкам (по умолчанию) или По столбцам .

      • Искать в: Для поиска данных с конкретными деталями в поле щелкните Формулы , Значения , Примечания или Комментарии .

        Примечание: Формулы , Значения , Примечания и Комментарии доступны только на вкладке Найти ; только Формулы доступны на вкладке Заменить .

      • Учитывать регистр — Установите этот флажок, если хотите искать данные с учетом регистра.

      • Соответствовать всему содержимому ячеек — Установите этот флажок, если хотите искать ячейки, содержащие только символы, введенные в поле Найти: .

    Советы: Вы можете использовать подстановочных знаков — вопросительный знак (? ), звездочку ( * ), тильду ( ~ ) — в критериях поиска.

    • Используйте вопросительный знак (?), Чтобы найти любой отдельный символ — например, s? T находит «sat» и «set».

    • Используйте звездочку (*), чтобы найти любое количество символов — например, s * d находит «грустный» и «начатый».

    • Используйте тильду (~), за которой следует?, * Или ~, чтобы найти вопросительные знаки, звездочки или другие символы тильды, например, fy91 ~? находит «fy91?».

    Чтобы заменить текст или числа, нажмите Ctrl + H или перейдите на главную страницу > Найти и выбрать > Заменить .

    1. В поле Найдите то, что введите текст или числа, которые хотите найти.

    2. В поле Заменить на введите текст или числа, которые вы хотите использовать для замены текста поиска.

    3. Нажмите Заменить или Заменить все .

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

    4. При необходимости вы можете определить дальнейший поиск:

      • Внутри: Для поиска данных на листе или во всей книге выберите Лист или Рабочая книга .

      • Поиск: Вы можете выбрать поиск По строкам (по умолчанию) или По столбцам .

      • Учитывать регистр — Установите этот флажок, если хотите искать данные с учетом регистра.

      • Соответствовать всему содержимому ячеек — Установите этот флажок, если хотите искать ячейки, содержащие только символы, введенные в поле Найти: .

    Советы: Вы можете использовать подстановочных знаков — вопросительный знак (? ), звездочку ( * ), тильду ( ~ ) — в критериях поиска.

    • Используйте вопросительный знак (?), Чтобы найти любой отдельный символ — например, s? T находит «sat» и «set».

    • Используйте звездочку (*), чтобы найти любое количество символов — например, s * d находит «грустный» и «начатый».

    • Используйте тильду (~), за которой следует?, * Или ~, чтобы найти вопросительные знаки, звездочки или другие символы тильды, например, fy91 ~? находит «fy91?».

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

    2. Пресса + F или щелкните значок, чтобы развернуть панель поиска, затем в поле поиска введите текст или число, которое хотите найти.

      Советы: Вы можете использовать подстановочных знаков — вопросительный знак (? ), звездочку ( * ), тильду ( ~ ) — в критериях поиска.

      • Используйте вопросительный знак (?), Чтобы найти любой отдельный символ — например, s? T находит «sat» и «set».

      • Используйте звездочку (*), чтобы найти любое количество символов — например, s * d находит «грустный» и «начатый».

      • Используйте тильду (~), за которой следует?, * Или ~, чтобы найти вопросительные знаки, звездочки или другие символы тильды, например, fy91 ~? находит «fy91?».

    3. Нажмите кнопку Возврат .

    4. Чтобы найти следующий экземпляр искомого элемента, щелкните в поле поиска и нажмите Возврат или в диалоговом окне Найти нажмите Найти следующий .

      Совет: Вы можете отменить текущий поиск, нажав ESC .

    5. Чтобы указать дополнительные параметры поиска, щелкните увеличительное стекло, а затем щелкните «Поиск на листе » или «Поиск в книге ». Вы также можете выбрать опцию Advanced , которая запустит диалоговое окно Find .

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

    2. Пресса + F, чтобы развернуть панель поиска, затем в поле поиска введите текст или число, которое хотите найти.

      Советы: Вы можете использовать подстановочных знаков — вопросительный знак (? ), звездочку ( * ), тильду ( ~ ) — в критериях поиска.

      • Используйте вопросительный знак (?), Чтобы найти любой отдельный символ — например, s? T находит «sat» и «set».

      • Используйте звездочку (*), чтобы найти любое количество символов — например, s * d находит «грустный» и «начатый».

      • Используйте тильду (~), за которой следует?, * Или ~, чтобы найти вопросительные знаки, звездочки или другие символы тильды, например, fy91 ~? находит «fy91?».

    3. В поле поиска щелкните увеличительное стекло, а затем щелкните Заменить .

    4. В поле Заменить на введите символы замены.

      Чтобы заменить символы в поле Найти поле пустым, оставьте поле Заменить на пустым.

    5. Нажмите Найти далее .

    6. Чтобы заменить выделенное вхождение, нажмите Заменить .

      Чтобы заменить все вхождения символов на листе без предварительного просмотра, нажмите Заменить все .

      Совет: Отмените текущий поиск, просто нажав ESC .

    7. Чтобы указать дополнительные параметры поиска, щелкните увеличительное стекло, а затем щелкните «Поиск на листе » или «Поиск в книге ».Вы также можете выбрать опцию Advanced , которая запустит диалоговое окно Replace .

    Найти

    Чтобы что-то найти, нажмите Ctrl + F или перейдите на страницу Домашняя страница > Редактирование > Найти и выбрать > Найти .

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

    1. В поле Find what: введите текст или числа, которые вы хотите найти.

      Советы: Вы можете использовать подстановочных знаков — вопросительный знак (? ), звездочку ( * ), тильду ( ~ ) — в критериях поиска.

      • Используйте вопросительный знак (?), Чтобы найти любой отдельный символ — например, s? T находит «sat» и «set».

      • Используйте звездочку (*), чтобы найти любое количество символов — например, s * d находит «грустный» и «начатый».

      • Используйте тильду (~), за которой следует?, * Или ~, чтобы найти вопросительные знаки, звездочки или другие символы тильды, например, fy91 ~? находит «fy91?».

    2. Нажмите Найти далее или Найти все , чтобы начать поиск.

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

    3. Нажмите > Параметры поиска , чтобы при необходимости определить параметры поиска:

      • Внутри: Для поиска данных в определенном выделении выберите Выбор . Чтобы найти данные на листе или во всей книге, выберите Лист или Рабочая книга .

      • Направление: Вы можете выбрать поиск: Вниз, (по умолчанию) или Вверх, .

      • Учитывать регистр — Установите этот флажок, если хотите искать данные с учетом регистра.

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

    Заменить

    Чтобы заменить текст или числа, нажмите Ctrl + H или перейдите на главную страницу > Редактирование > Найти и выбрать > Заменить .

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

    1. В поле Find what: введите текст или числа, которые вы хотите найти.

      Советы: Вы можете использовать подстановочных знаков — вопросительный знак (? ), звездочку ( * ), тильду ( ~ ) — в критериях поиска.

      • Используйте вопросительный знак (?), Чтобы найти любой отдельный символ — например, s? T находит «sat» и «set».

      • Используйте звездочку (*), чтобы найти любое количество символов — например, s * d находит «грустный» и «начатый».

      • Используйте тильду (~), за которой следует?, * Или ~, чтобы найти вопросительные знаки, звездочки или другие символы тильды, например, fy91 ~? находит «fy91?».

    2. В поле Заменить на: введите текст или числа, которые вы хотите использовать для замены текста поиска.

    3. Нажмите Заменить или Заменить все .

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

    4. Нажмите > Параметры поиска , чтобы при необходимости определить параметры поиска:

      • Внутри: Для поиска данных в определенном выделении выберите Выбор . Чтобы найти данные на листе или во всей книге, выберите Лист или Рабочая книга .

      • Направление: Вы можете выбрать поиск: Вниз, (по умолчанию) или Вверх, .

      • Учитывать регистр — Установите этот флажок, если хотите искать данные с учетом регистра.

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

    Документы NGINX | Настройка NGINX и NGINX Plus в качестве веб-сервера

    Эта статья объясняет, как настроить NGINX с открытым исходным кодом и NGINX Plus в качестве веб-сервера, и включает следующие разделы:

    Для получения дополнительной информации о том, как настроить NGINX Plus и NGINX с открытым исходным кодом, просмотрите наш бесплатный веб-семинар по запросу «Установка и настройка NGINX».

    Примечание: Информация в этой статье относится как к NGINX с открытым исходным кодом, так и к NGINX Plus.Для удобства чтения оставшаяся часть статьи относится только к NGINX Plus.

    На высоком уровне настройка NGINX Plus в качестве веб-сервера — это вопрос определения, какие URL-адреса он обрабатывает и как он обрабатывает HTTP-запросы для ресурсов по этим URL-адресам. На более низком уровне конфигурация определяет набор из виртуальных серверов , которые управляют обработкой запросов для определенных доменов или IP-адресов. Дополнительные сведения о файлах конфигурации см. В разделе Создание файлов конфигурации NGINX Plus.

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

    Настройка виртуальных серверов

    Файл конфигурации NGINX Plus должен включать по крайней мере одну директиву server для определения виртуального сервера. Когда NGINX Plus обрабатывает запрос, он сначала выбирает виртуальный сервер, который будет обслуживать запрос.

    Виртуальный сервер определяется директивой server в контексте http , например:

     http {
        server {
            # Конфигурация сервера
        }
    }
     

    Можно добавить несколько директив server в контекст http для определения нескольких виртуальных серверов.

    Блок конфигурации сервера обычно включает в себя директиву listen , чтобы указать IP-адрес и порт (или сокет домена Unix и путь), на котором сервер прослушивает запросы. Принимаются адреса как IPv4, так и IPv6; заключайте IPv6-адреса в квадратные скобки.

    В приведенном ниже примере показана конфигурация сервера, который прослушивает IP-адрес 127.0.0.1 и порт 8080:

    .
     сервер {
        слушайте 127.0.0.1:8080;
        # Дополнительная конфигурация сервера
    }
     

    Если порт не указан, используется стандартный порт.Аналогично, если адрес опущен, сервер прослушивает все адреса. Если директива listen вообще не включена, «стандартный» порт — 80 / tcp , а порт «по умолчанию» — 8000 / tcp , в зависимости от привилегий суперпользователя.

    Если существует несколько серверов, соответствующих IP-адресу и порту запроса, NGINX Plus проверяет поле заголовка Host запроса на соответствие директивам server_name в блоках server .Параметр имя_сервера может быть полным (точным) именем, подстановочным знаком или регулярным выражением. Подстановочный знак — это символьная строка, которая включает звездочку ( * ) в начале, конце или обоих; звездочка соответствует любой последовательности символов. NGINX Plus использует синтаксис Perl для регулярных выражений; ставьте перед ними тильду ( ~ ). Этот пример иллюстрирует точное имя.

     сервер {
        слушать 80;
        имя_сервера example.org www.example.org;
        #...
    }
     

    Если несколько имен соответствуют заголовку Host , NGINX Plus выбирает одно, выполняя поиск имен в следующем порядке и используя первое найденное совпадение:

    1. Точное название
    2. Самый длинный подстановочный знак, начинающийся со звездочки, например * .example.org
    3. Самый длинный подстановочный знак, оканчивающийся звездочкой, например mail. *
    4. Первое совпадающее регулярное выражение (в порядке появления в файле конфигурации)

    Если поле заголовка Host не соответствует имени сервера, NGINX Plus направляет запрос на сервер по умолчанию для порта, на который поступил запрос.Сервер по умолчанию — это первый сервер, указанный в файле nginx.conf , если только вы не включите параметр default_server в директиву listen , чтобы явно указать сервер по умолчанию.

     сервер {
        слушаем 80 default_server;
        # ...
    }
     

    Настройка местоположений

    NGINX Plus может отправлять трафик на разные прокси или обслуживать разные файлы на основе URI запроса. Эти блоки определяются с помощью директивы location , помещенной в директиву server .

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

    NGINX Plus проверяет запросы URI на соответствие параметрам всех директив location и применяет директивы, определенные в соответствующем местоположении. Внутри каждого блока location обычно можно (за некоторыми исключениями) разместить еще больше директив location для дальнейшего уточнения обработки для определенных групп запросов.

    Примечание: В этом руководстве слово , местоположение , относится к одному контексту местоположения .

    В директиве location есть два типа параметров: строки префикса , (пути) и регулярные выражения. Чтобы URI запроса соответствовал строке префикса, он должен начинаться со строки префикса.

    Следующий пример расположения с параметром имени пути соответствует URI запроса, которые начинаются с / some / path / , например / some / path / document.html . (Он не соответствует / my-site / some / path , потому что / some / path не встречается в начале этого URI.)

     location / some / path / {
        # ...
    }
     

    Регулярному выражению предшествует тильда ( ~ ) для сопоставления с учетом регистра или тильда-звездочка ( ~ * ) для сопоставления без учета регистра. В следующем примере выполняется сопоставление URI, которые включают строку .html или .htm в любой позиции.

     расположение ~ \.Модификатор ~  (тильда-вставка) добавляет самую длинную совпадающую строку префикса, регулярные выражения не проверяются. 
     
  • Сохраняет самую длинную совпадающую строку префикса.
  • Проверьте URI на соответствие регулярным выражениям.
  • Остановить обработку, когда будет найдено первое подходящее регулярное выражение, и использовать соответствующее местоположение.
  • Если ни одно регулярное выражение не соответствует, используйте расположение, соответствующее сохраненной строке префикса.
  • Типичный вариант использования модификатора = - это запросы на / (косая черта).Если запросы для / являются частыми, указание = / в качестве параметра в директиве location ускоряет обработку, поскольку поиск совпадений останавливается после первого сравнения.

    Местоположение Контекст может содержать директивы, которые определяют, как разрешить запрос - либо обслужить статический файл, либо передать запрос проксируемому серверу. В следующем примере запросы, соответствующие первому контексту местоположения , обслуживаются файлами из каталога / data , а запросы, соответствующие второму, передаются на прокси-сервер, на котором размещается контент для www.example.com домен.

     сервер {
        location / images / {
            корень / данные;
        }
    
        место расположения / {
            proxy_pass http://www.example.com;
        }
    }
     

    Директива root указывает путь файловой системы, в котором следует искать статические файлы для обслуживания. URI запроса, связанный с местоположением, добавляется к пути, чтобы получить полное имя статического файла для обслуживания. В приведенном выше примере в ответ на запрос /images/example.png NGINX Plus доставляет файл / data / images / example.PNG .

    Директива proxy_pass передает запрос прокси-серверу, доступ к которому осуществляется с помощью настроенного URL-адреса. Затем ответ от прокси-сервера передается обратно клиенту. В приведенном выше примере все запросы с URI, которые не начинаются с / images / , передаются на прокси-сервер.

    Использование переменных

    Вы можете использовать переменные в файле конфигурации, чтобы NGINX Plus обрабатывал запросы по-разному в зависимости от определенных обстоятельств.Переменные - это именованные значения, которые вычисляются во время выполнения и используются в качестве параметров для директив. Переменная обозначается знаком \ (\) (доллар) в начале ее имени. Переменные определяют информацию, основанную на состоянии NGINX, такую ​​как свойства запроса, обрабатываемого в данный момент.

    Существует ряд предопределенных переменных, таких как основные переменные HTTP, и вы можете определить пользовательские переменные с помощью директив set , map и geo .Большинство переменных вычисляются во время выполнения и содержат информацию, относящуюся к конкретному запросу. Например, $ remote_addr содержит IP-адрес клиента, а $ uri содержит текущее значение URI.

    Возврат определенных кодов состояния

    Некоторые URI веб-сайтов требуют немедленного возврата ответа с определенной ошибкой или кодом перенаправления, например, когда страница была перемещена временно или навсегда. Самый простой способ сделать это - использовать директиву return .Например:

     location / неверный / url {
        возврат 404;
    }
     

    Первый параметр return - это код ответа. Необязательный второй параметр может быть URL-адресом перенаправления (для кодов 301 , 302 , 303 и 307 ) или текстом, возвращаемым в теле ответа. Например:

     местоположение / постоянно / перемещено / url {
        вернуть 301 http://www.example.com/moved/here;
    }
     

    Директива return может быть включена как в контекст местоположения , так и в контекст сервера .

    Перезапись URI в запросах

    URI запроса может быть изменен несколько раз во время обработки запроса с помощью директивы rewrite , которая имеет один необязательный и два обязательных параметра. Первый (обязательный) параметр - это регулярное выражение, которому должен соответствовать URI запроса. Второй параметр - это URI, заменяющий соответствующий URI. Необязательный третий параметр - это флаг, который может остановить обработку дальнейших , перезаписать директивы или отправить перенаправление (код 301 или 302 )./users/(.*)$ / show? user = перерыв в 1 доллар; }

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

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

    После того, как NGINX обработает набор инструкций перезаписи, он выбирает контекст местоположения в соответствии с новым URI.(/download/.*)/audio/(\w+)\.?.*$ 1 доллар / mp3 / 2 доллара последний; возврат 403; # … }

    В этом примере конфигурации различаются два набора URI. URI, такие как / download / some / media / file , изменяются на /download/some/mp3/file.mp3 . Из-за флага last последующие директивы (вторая директива rewrite и директива return ) пропускаются, но NGINX Plus продолжает обработку запроса, который теперь имеет другой URI.Точно так же URI, такие как / download / some / audio / file , заменяются на /download/some/mp3/file.ra . Если URI не соответствует ни одной из директивы rewrite , NGINX Plus возвращает клиенту код ошибки 403 .

    Есть два параметра, которые прерывают обработку директив rewrite :

    • last — Останавливает выполнение директив rewrite в текущем сервере или в контексте местоположения, но NGINX Plus ищет местоположения, которые соответствуют перезаписанному URI, и применяются любые директивы rewrite в новом местоположении (это означает, что URI можно снова изменить).
    • break — Как и директива break , останавливает обработку директив rewrite в текущем контексте и отменяет поиск местоположений, соответствующих новому URI. Директивы rewrite в новом месте не выполняются.

    Перезапись HTTP-ответов

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

    Например, вы можете изменить абсолютные ссылки, которые относятся к серверу, отличному от прокси:

     место / {
        sub_filter / blog / / blog-staging /;
        sub_filter_once off;
    }
     

    Другой пример изменяет схему с http: // на https: // и заменяет адрес localhost на имя хоста из поля заголовка запроса.Директива sub_filter_once сообщает NGINX о необходимости последовательного применения директив sub_filter в местоположении:

     место / {
        sub_filter 'href = "http://127.0.0.1:8080/' 'href =" https: // $ host /';
        sub_filter 'img src = "http://127.0.0.1:8080/' 'img src =" https: // $ host /';
        sub_filter_once включен;
    }
     

    Обратите внимание, что часть ответа, уже измененная с помощью sub_filter , не заменяется снова, если происходит другое совпадение sub_filter .

    Обработка ошибок

    С помощью директивы error_page вы можете настроить NGINX Plus так, чтобы он возвращал пользовательскую страницу вместе с кодом ошибки, подставлял другой код ошибки в ответ или перенаправлял браузер на другой URI. В следующем примере директива error_page указывает страницу ( /404.html ) для возврата с кодом ошибки 404 .

     error_page 404 /404.html;
     

    Обратите внимание, что эта директива не означает, что ошибка возвращается немедленно (это делает директива return ), а просто указывает, как обрабатывать ошибки, когда они возникают.Код ошибки может поступать от прокси-сервера или возникать во время обработки NGINX Plus (например, 404 результаты, когда NGINX Plus не может найти файл, запрошенный клиентом).

    В следующем примере, когда NGINX Plus не может найти страницу, он заменяет код 301 на код 404 и перенаправляет клиента на http: /example.com/new/path.html . Эта конфигурация полезна, когда клиенты все еще пытаются получить доступ к странице по ее старому URI.Код 301 информирует браузер о том, что страница переместилась навсегда, и ему необходимо автоматически заменить старый адрес новым при возврате.

     расположение /old/path.html {
        error_page 404 = 301 http: /example.com/new/path.html;
    }
     

    Следующая конфигурация является примером передачи запроса в серверную часть, когда файл не найден. Поскольку после знака равенства в директиве error_page не указан код состояния, ответ клиенту содержит код состояния, возвращаемый прокси-сервером (не обязательно 404 ).

     сервер {
        ...
        location / images / {
            # Установите корневой каталог для поиска файла
            корень / данные / www;
    
            # Отключить ведение журнала ошибок, связанных с существованием файла
            open_file_cache_errors выключен;
    
            # Сделать внутреннее перенаправление, если файл не найден
            error_page 404 = / выборка $ uri;
        }
    
        location / fetch / {
            proxy_pass http: // backend /;
        }
    }
     

    Директива error_page указывает NGINX Plus выполнить внутреннее перенаправление, если файл не найден.Переменная $ uri в последнем параметре директивы error_page содержит URI текущего запроса, который передается при перенаправлении.

    Например, если / images / some / file не найден, он заменяется на / fetch / images / some / file , и начинается новый поиск местоположения. В результате запрос попадает во второй контекст местоположения и проксируется на http: // backend / .

    Директива open_file_cache_errors предотвращает запись сообщения об ошибке, если файл не найден.Здесь в этом нет необходимости, поскольку отсутствующие файлы обрабатываются правильно.

    Написание макросов | Clojure для храбрых и настоящих

    Глава 8

    Когда мне было 18, я устроился ночным аудитором в отеле в Санта-Фе, Нью-Мексико, работая четыре ночи в неделю с 23:00 до 7:00. После нескольких месяцев этого бессонного графика мои эмоции зажили собственной жизнью. Однажды ночью, около

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

    С тех пор мне стало интересно, могу ли я каким-то образом воссоздать эмоциональную отрешенность и признательность за жизнь, вызванные хроническим недосыпанием. Возможно, какое-то зелье — пара глотков, чтобы дать волю моему внутреннему Ричарду Симмонсу, но ненадолго.

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

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

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

    Макросы необходимы

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

      (когда логическое выражение
      выражение-1
      выражение-2
      выражение-3
      ...
      выражение-x)
      

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

    В этом расширении макроса вы можете видеть, что , когда , реализовано в терминах , если и , делают :

      (macroexpand '(когда логическое выражение
                    выражение-1
                    выражение-2
                    выражение-3))
    ; => (если логическое выражение
           (сделать выражение-1
               выражение-2
               выражение-3))
      

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

    Анатомия макроса

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

    В качестве примера, вот наш старый друг, макрос infix :

      (дефмакро инфикс
      «Используйте этот макрос, когда тоскуете по нотам своего детства»
      [инфиксный]
      (список (второй инфиксный) (первый инфиксный) (последний инфиксный)))
      

    Этот макрос переставляет список в правильном порядке для инфиксной записи.Вот пример:

    Одно из ключевых различий между функциями и макросами заключается в том, что аргументы функции полностью оцениваются перед передачей в функцию, тогда как макросы получают аргументы как неоцененные данные. Вы можете увидеть это на примере. Если вы попытаетесь вычислить (1 + 1) самостоятельно, вы получите исключение. Однако, поскольку вы выполняете вызов макроса, неоцененный список (1 + 1) передается в инфикс . Затем макрос может использовать первый , второй и последний , чтобы изменить порядок списка, чтобы Clojure мог его оценить:

      (макрорасширение '(инфикс (1 + 1)))
    ; => (+ 1 1)
      

    Развернув макрос, вы увидите, что инфикс переставляет (1 + 1) в (+ 1 1) .Удобно!

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

      (defmacro infix-2
      [[операнд1 операнд2]]
      (список операнд1 операнд2))
      

    Деструктуризация аргументов позволяет кратко связывать значения с символами в зависимости от их положения в последовательном аргументе. Здесь infix-2 принимает последовательную структуру данных в качестве аргумента и деструктурирует по позиции, поэтому первое значение называется operand1 , второе значение называется op , а третье значение называется operand2 в макросе. .

    Вы также можете создавать макросы множественной арности, и фактически основные логические операции и и или определены как макросы. Вот исходный код и :

      (дефмакро и
      "Оценивает exprs по одному, слева направо. Если форма
      возвращает логическое ложь (ноль или ложь) и возвращает это значение и
      не оценивает никакие другие выражения, иначе возвращает
      значение последнего выражения. (и) возвращает истину ".
      {: добавлено "1.0 "}
      ([] истинный)
      ([x] x)
      ([x и далее]
       `(пусть [и # ~ x]
          (если и # (и ~ @ следующий) и #))))
      

    В этом примере происходит много чего, включая символы ` и ~ @ , о которых вы скоро узнаете. На данный момент важно понять, что здесь есть три тела макроса: тело макроса с нулевой арностью, которое всегда возвращает true, , тело макроса с одной арностью, которое возвращает операнд, и тело макроса с n , которое рекурсивно называет себя.Верно: макросы могут быть рекурсивными, и они также могут использовать остальные аргументы ( и следующий в теле макроса n -arity), как и функции.

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

    Списки зданий для оценки

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

    Отличительные символы и значения

    Допустим, вы хотите создать макрос, который принимает выражение и одновременно печатает и возвращает его значение. (Это отличается от println тем, что println всегда возвращает nil .) Вы хотите, чтобы ваш макрос возвращал списки, которые выглядят следующим образом:

      (let [результат выражения]
      (результат печати)
      результат)
      

    Ваша первая версия макроса может выглядеть так, используя функцию list для создания списка, который Clojure должен оценить:

      (defmacro my-print-whoopsie
      [выражение]
      (список let [результат выражения]
            (список результатов печати)
            результат))
      

    Однако, если вы попробуете это, вы получите исключение. Не могу принять значение макроса: # 'clojure.core / let . Что тут происходит?

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

      (defmacro my-print
      [выражение]
      (список 'let [' результирующее выражение]
            (перечислить результат 'println')
            'результат))
      

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

    Простое котирование

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

    Во-первых, вот простой вызов функции без кавычек:

    Если мы добавим цитату в начале, она вернет неоцененную структуру данных:

      (цитата (+ 1 2))
    ; => (+ 1 2)
      

    Здесь в возвращенном списке + — символ. Если мы оценим этот символ плюса, он даст функцию плюс:

      +
    ; => # <ядро $ _PLUS_ [email protected]>
      

    В то время как если мы процитируем символ плюса, получится просто символ плюса:

    Оценка несвязанного символа вызывает исключение:

      потеющие старики
    ; => Невозможно разрешить символ: потеющие старики в этом контексте
      

    Но заключение символа в кавычки возвращает символ независимо от того, имеет ли этот символ связанное с ним значение:

      (цитирую стариков)
    ; => потеющие до стариков
      

    Символ одинарной кавычки — это макрос чтения для (цитата x ) :

      '(+ 1 2)
    ; => (+ 1 2)
    
    Доктор Джекилл и Ричард Симмонс
    ; => доктор Джекилл и Ричард Симмонс
      

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

    .
      (дефмакро, когда
      «Оценивает тест. Если логическое истинно, оценивает тело в неявном do.»
      {: добавлено "1.0"}
      [тест и тело]
      (список 'if test (cons' do body)))
      

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

      (macroexpand '(когда (коровы-приходят: домой)
                    (позвони мне: папочка)
                    (шлепни меня: глупо)))
    ; => (если (коровы пришли: домой)
           (сделай (позвони мне: папочка)
               (шлепни меня: глупо)))
      

    Вот еще один пример исходного кода для встроенного макроса, на этот раз для , кроме :

      (дефмакро, если
      "Перевернутое" если ""
      [тест и ветки]
      (конъюнктура (обратные ветви) проверка 'если))
      

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

      (macroexpand '(если (готово-пощечину? Меня)
                          (шлепни меня: глупо)
                          (скажите: "Думаю, это меня научит")))
    ; => (если (сделано - меня ударили?)
           (скажите: «Думаю, это меня научит»)
           (шлепни меня: глупо))
      

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

    Синтаксические кавычки

    До сих пор вы видели макросы, которые создают списки с помощью функции list для создания списка вместе с ' (цитата) и функций, которые работают со списками, например first , second , last и так далее. Действительно, так можно было писать макросы до тех пор, пока коровы не вернутся домой. Однако иногда это приводит к утомительному и многословному коду.

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

    Цитирование не включает пространство имен, если ваш код не включает пространство имен:

    Запишите пространство имен, и оно будет возвращено обычной цитатой:

      'clojure.core / +
    ; => clojure.core / +
      

    Синтаксические кавычки всегда включают полное пространство имен символа:

    При цитировании списка рекурсивно цитируются все элементы:

    Синтаксис цитирует список рекурсивно синтаксис цитирует все элементы:

      `(+ 1 2)
    ; => (clojure.ядро / + 1 2)
      

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

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

      `(+ 1 ~ (инк.1))
    ; => (clojure.core / + 1 2)
      

    Поскольку он стоит после тильды, (inc 1) оценивается вместо заключения в кавычки. Без кавычек синтаксические кавычки возвращают неоцененную форму с полностью определенными символами:

      `(+ 1 (инк.1))
    ; => (clojure.core / + 1 (clojure.core / inc 1))
      

    Если вы знакомы с интерполяцией строк, вы можете думать о синтаксическом цитировании / снятии кавычек аналогичным образом.В обоих случаях вы создаете своего рода шаблон, помещая несколько переменных в большую статическую структуру. Например, в Ruby вы можете создать строку «Взбивай масло, Джебедия!» через конкатенацию:

      name = "Джебедия"
    "Взбейте масло" + имя + "!"
      

    или через интерполяцию:

      "Взбивайте масло, # {name}!"
      

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

      (список '+ 1 (инк.1))
    ; => (+ 1 2)
    
    `(+ 1 ~ (прибавка 1))
    ; => (clojure.core / + 1 2)
      

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

    Использование синтаксических кавычек в макросе

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

      (код-критик дефмакро
      «Фразы любезно предоставлены Гермесом Конрадом из Футурамы»
      [Плохой хороший]
      (список делаю
            (список 'println
                  "Великий мадридский кальмар, это плохой код:"
                  (перечислить 'плохая цитата))
            (список 'println
                  "Милая горилла из Манилы, это хороший код:"
                  (список 'цитата хорошая))))
    
    (код-критик (1 + 1) (+ 1 1))
    ; => Великий мадридский кальмар, это плохой код: (1 + 1)
    ; => Милая горилла из Манилы, это хороший код: (+ 1 1)
      

    Один только взгляд на эти утомительные повторения , список и одинарные кавычки заставляет меня съеживаться.Но если вы переписываете код-критик , используя синтаксические кавычки, вы можете сделать его гладким и кратким:

      (код-критик дефмакро
      «Фразы любезно предоставлены Гермесом Конрадом из Футурамы»
      [Плохой хороший]
      `(do (println" Великий мадридский кальмар, это плохой код: "
                    (цитата ~ плохо))
           (println "Милая горилла из Манилы, это хороший код:"
                    (цитата ~ хорошо))))
      

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

    На этом мы завершаем введение в механику написания макроса! Сладкий священный удав Западного и Восточного Самоа, это было много!

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

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

    Рефакторинг макроса и объединение кавычек

    Макрос code-critical из предыдущего раздела можно было бы улучшить. Посмотрите на дублирование! Два вызова println почти идентичны.Давай уберем это. Во-первых, давайте создадим функцию для создания этих списков println . С функциями легче думать и играть с ними, чем с макросами, поэтому часто бывает полезно переместить внутренности макроса во вспомогательные функции:

      (код критики defn
      [код критики]
      `(println ~ критика (цитата ~ код)))
    
    (критик кода defmacro
      [Плохой хороший]
      `(do ~ (cryize-code" Проклятые бактерии Либерии, это плохой код: "плохой)
           ~ (критика-код "Сладкий священный удав Западного и Восточного Самоа, это хороший код:" хорошо)))
      

    Обратите внимание, как функция critize-code возвращает список с синтаксическими кавычками.Вот как вы составляете список, который вернет макрос.

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

      (код-критик дефмакро
      [Плохой хороший]
      `(do ~ (карта # (применить код критики%)
                 [[«Великий мадридский кальмар, это плохой код:« плохой »]
                  ["Милая горилла из Манилы, это хороший код:" хорошо]])))
      

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

      (код-критик (1 + 1) (+ 1 1))
    ; => NullPointerException
      

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

    Другими словами, при оценке этого кода Clojure получает что-то вроде этого:

      (сделать
     ((clojure.core / println "критика" '(1 + 1))
      (clojure.core / println "критика" '(+1 1))))
      
    Затем

    оценивает первый вызов println и дает нам следующее:

      (сделать
     (ноль
      (clojure.core / println "критика" '(+1 1))))
      

    и после оценки второго вызова println делает следующее:

    Это причина исключения. println оценивается как nil , поэтому мы получаем что-то вроде (nil nil) . nil не вызывается, и мы получаем NullPointerException .

    Какое неудобство! Но как оказалось, склейка без кавычек была изобретена как раз для того, чтобы справляться с подобными ситуациями. Соединение без кавычек выполняется с ~ @ . Если вы просто отмените цитирование списка, вы получите:

      `(+ ~ (список 1 2 3))
    ; => (clojure.core / + (1 2 3))
      

    Однако, если вы используете сращивание без кавычек, вы получите:

      `(+ ~ @ (список 1 2 3))
    ; => (clojure.ядро / + 1 2 3)
      

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

    В любом случае, если в вашем кодировщике использовать сращивание без кавычек, то все будет отлично работать:

      (код-критик дефмакро
      [{: ключи [хорошо, плохо]}]
      `(do ~ @ (map # (применить код критики%)
                  [[«Милый лев Сиона, это плохой код:« плохой »]
                   ["Великая корова Москвы, это хороший код:" хорошо]])))
    
    (код-критик (1 + 1) (+ 1 1))
    ; => Милый лев Сиона, это плохой код: (1 + 1)
    ; => Великая корова Москвы, это хороший код: (+ 1 1)
      

    Woohoo! Вы успешно извлекли повторяющийся код в функцию и сделали код макроса более чистым.Сладкая морская свинка Виннипега, это хороший код!

    Что нужно остерегаться

    У макроса

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

    Захват переменных

    Захват переменной происходит, когда макрос вводит привязку, которая, неизвестная пользователю макроса, затмевает существующую привязку. Например, в следующем коде макрос злонамеренно вводит свою собственную привязку let , и это не соответствует коду:

      (по умолчанию сообщение «Хорошая работа!»)
    (дефмакро с озорством
      [и дела]
      (concat (list 'let [' сообщение «О, большое дело!»])
              дела))
    
    (с озорством
      (println "Вот что я думаю о том, что вы сделали:" сообщение))
    ; => Вот как я отношусь к тому, что вы сделали: О, большое дело!
      

    Вызов println ссылается на символ message , который, по нашему мнению, привязан к строке "Good job!" .Однако макрос with-mischief создал новую привязку для сообщения .

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

      (по умолчанию сообщение «Хорошая работа!»)
    (дефмакро с озорством
      [и дела]
      `(пусть [сообщение" Ой, большое дело! "]
         ~ @ дела))
    
    (с озорством
      (println "Вот что я думаю о том, что вы сделали:" сообщение))
    ; Исключение: нельзя разрешить полное имя: пользователь / сообщение
      

    Это исключение для вашего же блага: синтаксические кавычки предназначены для предотвращения случайного захвата переменных в макросах.Если вы хотите ввести привязки let в свой макрос, вы можете использовать gensym . Функция gensym создает уникальные символы при каждом последующем вызове:

      (генсим)
    ; => G__655
    
    (генсим)
    ; => G__658
      

    Также можно передать префикс символа:

      (сообщение генсима)
    ; => message4760
    
    (сообщение gensym)
    ; => message4763
      

    Вот как можно переписать with-mischief , чтобы сделать его менее озорным:

      (дефмакро без вреда
      [и дела]
      (пусть [макрос-сообщение (gensym 'message)]
        `(let [~ макрос-сообщение" Ой, большое дело! "]
           ~ @ дела
           (println "Мне еще нужно сказать:" ~ макрос-сообщение))))
    
    (без шалости
      (println "Вот что я думаю о том, что вы сделали:" сообщение))
    ; => Вот как я отношусь к тому, что вы сделали: Молодец!
    ; => Мне все еще нужно сказать: О, большое дело!
      

    В этом примере предотвращается захват переменной за счет использования gensym для создания нового уникального символа, который затем привязывается к макрос-сообщению .В выражении let , заключенном в синтаксические кавычки, макрос-сообщение не заключено в кавычки, преобразуясь в символ gensym’d. Этот символ gensym’d отличается от любых символов в пределах stuff-to-do , поэтому вы избегаете захвата переменных. Поскольку это очень распространенный паттерн, вы можете использовать автогенсим . Автогенсимы — это более краткие и удобные способы использования генсимов:

      `(blarg # blarg #)
    (blarg__2869__auto__ blarg__2869__auto__)
    
    `(пусть [имя #" Ларри Поттер "] имя #)
    ; => (clojure.core / let [name__2872__auto__ "Ларри Поттер"] name__2872__auto__)
      

    В этом примере вы создаете автогенсим, добавляя хэш-метку (или хэштег , если вы должны настаивать) на символе в списке с синтаксическими кавычками. Clojure автоматически гарантирует, что каждый экземпляр x # разрешается в один и тот же символ в одном и том же списке с синтаксическими кавычками, что каждый экземпляр y # разрешается аналогично, и так далее.

    gensym и auto-gensym используются постоянно при написании макросов и позволяют избежать захвата переменных.

    Двойная оценка

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

      (отчет дефмакро
      [пытаться]
      `(если ~ попробовать
         (println (quote ~ to-try) "успешно:" ~ to-try)
         (println (quote ~ to-try) "не удалось:" ~ to-try)))
         
    ;; Поток / сон занимает несколько миллисекунд, чтобы засыпать
    (report (do (Thread / sleep 1000) (+ 1 1)))
      

    Этот код предназначен для проверки своих аргументов на истинность.Если аргумент правдив, он считается успешным; если ложь, то безуспешно. Макрос печатает, был ли его аргумент успешным. В этом случае вы фактически засыпаете на две секунды, потому что (Thread / sleep 1000) оценивается дважды: один раз сразу после , если , и еще раз, когда вызывается println . Это происходит из-за того, что код (do (Thread / sleep 1000) (+ 1 1)) повторяется во всем расширении макроса. Как будто вы написали это:

      (если (do (Thread / sleep 1000) (+ 1 1))
      (println '(do (Thread / sleep 1000) (+ 1 1))
               "Был успешен:"
               (do (Thread / sleep 1000) (+ 1 1)))
      
      (println '(do (Thread / sleep 1000) (+ 1 1))
               "не удалось:"
               (do (Thread / sleep 1000) (+ 1 1))))
      

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

      (отчет дефмакро
      [пытаться]
      `(позвольте [результат # ~ попробовать]
         (если результат #
           (println (quote ~ to-try) "успешно:" результат #)
           (println (quote ~ to-try) "не удалось:" результат #))))
      

    Поместив to-try в выражение let , вы оцените этот код только один раз и привяжете результат к символу auto-gensym’d, result # , на который теперь вы можете ссылаться, не переоценивая to- попробуйте код .

    Макросы до конца

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

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

      (отчет (= 1 1))
    ; => (= 1 1) успешно: правда
    
    (отчет (= 1 2))
    ; => (= 1 2) не удалось: ложь
      

    , давайте повторим:

      (доза q [код ['(= 1 1)' (= 1 2)]]
      (отчетный код))
    ; => код был успешным: (= 1 1)
    ; => код был успешным: (= 1 2)
      

    Макрос отчета работает нормально, когда мы передаем ему функции по отдельности, но когда мы используем ock для итерации отчета по нескольким функциям, это бесполезный сбой.Вот как будет выглядеть макрорасширение для одной из итераций dosq :

      (если
     код
     (код clojure.core / println "был успешным:" код)
     (clojure.core / println 'code "не удалось:" код))
      

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

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

      (defmacro dosq-macro
      [macroname & args]
      `(делать
         ~ @ (map (fn [arg] (list macroname arg)) args)))
    
    (отчет DoSq-macro (= 1 1) (= 1 2))
    ; => (= 1 1) успешно: правда
    ; => (= 1 2) не удалось: ложь
      

    Если вы когда-нибудь окажетесь в такой ситуации, найдите время, чтобы переосмыслить свой подход.Легко загнать себя в угол, делая невозможным что-либо с помощью обычных вызовов функций. Вместо этого вам придется писать больше макросов. Макросы чрезвычайно мощные и потрясающие, и вы не должны бояться их использовать. Они превращают возможности Clojure для работы с данными в средства для создания новых языков с учетом ваших проблем программирования. Для некоторых программ уместно, чтобы ваш код был на 90 процентов похож на макрос. Какими бы классными они ни были, они также добавляют новые задачи композиции.Они действительно сочетаются друг с другом, поэтому, используя их, вы можете упустить другие виды композиции (функциональные, объектно-ориентированные), доступные вам в Clojure.

    Мы рассмотрели всю механику написания макроса. Похлопайте себя по спине! Это большое дело!

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

    Отвара для смелых и настоящих

    В начале этой главы я раскрыл мечту: найти какой-нибудь напиток, который, если его проглотить, временно придаст мне силу и темперамент фитнес-гуру 80-х, освободив меня из тюрьмы сдержанности и самосознания. .Я уверен, что кто-нибудь когда-нибудь когда-нибудь изобретет такой эликсир, так что мы могли бы с таким же успехом поработать над системой продажи этого мифического зелья. Назовем эту гипотетическую смесь Brave и True Ale . Это имя пришло мне в голову без всякой причины.

    Прежде чем поступят заказы на (каламбур! Дай пять!), Нам нужно будет провести некоторую проверку. В этом разделе показано, как выполнить эту проверку функционально и как написать код, который выполняет проверки, немного более кратко, используя макрос, который вы напишете, под названием if-valid .Это поможет вам понять типичную ситуацию для написания собственного макроса. Если вам просто нужно определение макроса, можно сразу перейти к «, если действителен » на странице 182.

    Функции проверки

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

      (подробные сведения о заказе
      {: name "Митчард Блиммонс"
       : email "митчард.blimmonsgmail.com "})
      

    У этой конкретной карты неверный адрес электронной почты (отсутствует символ @ ), поэтому наш код проверки должен улавливать именно такой порядок! В идеале мы хотим написать код, который производит что-то вроде этого:

      (проверить детали заказа детали заказа)
    ; => {: email ["Ваш адрес электронной почты не похож на адрес электронной почты."]}
      

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

    Давайте сначала посмотрим на проверки сведений о заказе . Вот как можно представить проверки:

      (def order-details-validations).
      {:имя
       ["Пожалуйста, введите имя" не пусто]
    
       :электронное письмо
       ["Пожалуйста, введите адрес электронной почты" не пусто
    
        «Ваш адрес электронной почты не похож на адрес электронной почты»
        # (или (пусто?%) (re-seq # "@"%))]})
      

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

    Затем нам нужно записать функцию validate . Функцию validate можно разделить на две функции: одну для применения проверок к одному полю, а другую для накопления этих сообщений об ошибках в окончательной карте сообщений об ошибках, например, {: email ["Ваш адрес электронной почты не похож на Адрес электронной почты."]} . Вот функция под названием сообщения об ошибках для , которая применяет проверки к одному значению:

      (defn error-messages-for
      «Вернуть последовательность сообщений об ошибках»
      [для проверки пар сообщение-валидатор]
      (сначала сопоставить (номер фильтра (не ((второй%) для проверки))
                         (разделите 2 пары сообщение-валидатор))))
      

    Первый аргумент для проверки — это поле, которое вы хотите проверить. Второй аргумент, пары сообщений-валидаторов , должен быть последовательностью с четным числом элементов.Этот seq сгруппирован в пары с (раздел 2 пары сообщение-валидатор) . Первый элемент пары должен быть сообщением об ошибке, а второй элемент пары должен быть функцией (точно так же, как пары упорядочены в order-details-validations ). Функция error-messages-for работает, отфильтровывая все пары сообщений об ошибках и проверки, где функция проверки возвращает true при применении к для проверки . Затем он использует карту сначала , чтобы получить первый элемент каждой пары, сообщение об ошибке.Вот он в действии:

      (сообщения об ошибках для "" ["Введите имя" не пусто])
    ; => ("Пожалуйста, введите имя")
      

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

    Вот полная функция проверки , а также результат, когда мы применяем ее к нашим сведениям о заказе и проверки сведений о заказе :

      (defn validate
      «Возвращает карту с вектором ошибок для каждого ключа»
      [для проверки валидации]
      (сокращение (fn [проверка ошибок]
                (пусть проверка [[fieldname validation-check-groups]
                      значение (получить, чтобы проверить имя поля)
                      сообщения об ошибках (сообщения об ошибках для групп проверки значений)]
                  (если (пусто? сообщения об ошибках)
                    ошибки
                    (связать ошибки имя поля сообщения-ошибки))))
              {}
              проверки))
    
    (проверить детали заказа детали-валидации заказа)
    ; => {: email ("Ваш адрес электронной почты не похож на адрес электронной почты")}
      

    Успех! Это работает за счет сокращения более проверок сведений о заказе и связывания сообщений об ошибках (если они есть) для каждого ключа сведений о заказе в окончательную карту сообщений об ошибках.

    если действительный

    Имея наш код проверки, теперь мы можем проверять записи, сколько нам душе угодно! Чаще всего проверка будет выглядеть примерно так:

      (let [errors (validate-order-details-order-details-validations)]
      (если (пусто? ошибки)
        (println: успех)
        (println: ошибки сбоя)))
      

    Шаблон должен сделать следующее:

    1. Проверить запись и связать результат с ошибками
    2. Проверить, нет ли ошибок
    3. Если были, сделайте успех, здесь (println: success)
    4. В противном случае выполните операцию сбоя, здесь (println: ошибки сбоя)

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

      (определяется, если действителен
      [запись-код-успеш-код-сбой-проверки]
      (let [ошибки (проверка правильности записи)]
        (если (пусто? ошибки)
          код успеха
          код неисправности)))
      

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

      (если действительны сведения о заказе, ошибки проверки сведений о заказе
     (визуализация: успех)
     (рендеринг: ошибки сбоя))
      

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

      (defmacro, если действительный
      "Более лаконично обрабатывать валидацию"
      [для проверки правильности ошибок-имя и затем-еще]
      `(let [~ имя-ошибки (проверка ~ проверка ~ проверки)]
         (если (пусто? ~ имя-ошибки)
           ~ @ тогда-еще)))
      

    Этот макрос принимает четыре аргумента: для проверки , проверки , имя-ошибки и остальной аргумент , затем-еще . Использование error-name как это новая стратегия.Мы хотим иметь доступ к ошибкам, возвращаемым функцией validate в операторах then-else . Для этого мы сообщаем макросу, к какому символу он должен привязать результат. Следующее расширение макроса показывает, как это работает:

      (макрорасширение
     '(if-valid детали-детали-заказа-валидации-детали-заказа my-error-name
                (println: успех)
                (println: ошибка имя-моей-ошибки)))
    (позволять*
     [my-error-name (пользователь / проверка сведений о заказе, проверки сведений о заказе)]
     (если (clojure.ядро / пусто? мое-имя-ошибки)
      (println: успех)
      (println: ошибка имя-моей-ошибки)))
      

    Синтаксическая кавычка абстрагирует общую форму шаблона let / validate / if , который вы видели ранее. Затем мы используем объединение без кавычек для распаковки ветвей if , которые были упакованы в аргумент then-else rest.

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

    Сводка

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

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

    Макросы

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

    Упражнения

    1. Запишите макрос , когда действителен , чтобы он вел себя так же, как , когда .

    Leave a Reply