Я в интернете

РСС    Джейсон-фид

Есть автоматические трансляции в Тумблер и Же-же. Если не работает, напишите мне: ilyabirman@ilyabirman.ru.

Избранное

Позднее Ctrl + ↑

Склонировать структуру папок и файлов

Мне нужно было скопировать структуру папок и файлов с одного диска на другой. Чтобы всё лежало так же по папкам, под теми же именами, но каждый файл весил 0 байт.

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

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

Пришлось попотеть, чтобы понять, как это сделать. У меня получилось так:

cd папка_которую_клонируем
find . -type d -print0 | xargs -0 -I {} mkdir -p папка_куда_клонируем/{}
find . -type f -print0 | xargs -0 -I {} touch папка_куда_клонируем/{}

Сложность была в том, что find возвращает список найденных файлов с пробелами в именах, и когда такие файлы передаёшь куда-то ещё, всё взрывается. Пришлось просить find в конце имени каждого найденного файла ставить символ 0 (-print0), а потом с помощью адской команды xargs это разбирать и скармливать в качестве аргументов другим командам. Учитывая, что я раньше ничего сложнее apachectl restart не писал, это была жесть.

Добавлено через полчаса: Читатели рассказали мне про -exec

Как работает мой сайт

Мой сайт работает на моём самописном движке на ПХП (единственное исключение — раздел «Блог», о нём в конце).

Файлы страниц сайта лежат в папках, соответствующих урлам разделов, например страница про Ангстрем лежит на сервере под именем .../www/projects/angstrom/angstrom.php. Задача этого файла — сгенерить ХТМЛ смысловой части этой страницы.

Метаданные

Рядом с файлом имя-папки.php должен лежать файл метаданных _имя-папки.php. Для Ангстрема он выглядит примерно так (выкинул часть полей для простоты):

<?php return array (

  'logo' => 'angstrom',
  'value' => '20140201',
  'title' => 'Ангстрем', 

  'x-showcase-title' => 'Ангстрем, конвертер всего',
  'x-copyright-years' => '2014...',

  'languages' => array (
    'english' => array (
      'title' => 'Ångström',
      'x-showcase-title' => 'Ångström, the converter',
    ),
  ),

) ?>

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

Там умная и гибкая система, которая позволяет делать отличия между сайтами на разных языках (ilyabirman.ru и ilyabirman.net) только там, где они нужны: домен, текст, правила типографики, твиттер-акаунт для шаринга; но всё остальное хранить в одном месте один раз.

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

Вот примерный код, который её рисует (подсветка синтаксиса глючит):

<?php $showcase_elements = array (
  'angstrom',
  'moscow-metro-multiplication',
  'therules-2-for-ios',
  'chelyabinsk-trams-2015',
  'emcee',
  'train-thirteen',
  'wireless-dj',
  'snooker-results-display',
  'moscow-metro-poster-vdnh',
  'forebruary',
  'moscow-metro-nanomap',
); ?>

<?php foreach ($showcase_elements as $showcase_element) { ?>
  <div class="b-showcase-element" style="width: 160px">
    <div class="b-showcase-element-image-wrapper">
      <div>
        <a href="<?= HREF ($showcase_element) ?>" class="nu">
          <img
            src="<?= FOLDER ($showcase_element) ?>i/icon-160@2x.png"
            alt="<?= strip_tags (TITLE ($showcase_element)) ?>"
            width="160" height="160"
          />
        </a>
      </div>
    </div>
    <div class="b-showcase-element-title">
      <a href="<?= HREF ($showcase_element) ?>">
        <?= EX ('showcase-title', $showcase_element)?>
      </a>
    </div>
  </div>
<?php } ?>

Макросы

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

  • HREF ($logo) возвращает полный урл страницы по её идентификатору;
  • FOLDER ($logo) возвращает путь к папке, в которой лежит страница;
  • TITLE ($logo) возвращает название страницы;
  • EX ($what, $logo) возвращает значение поля x-something из файла метаданных.

Я, как видите, использую EX и поле x-showcase-title для того, чтобы показывать особые заголовки в «витрине». Если я вдруг решу переименовать один из проектов и перенести в другую папку, и ещё сделать про него страницу на французском, чтобы она была доступна по адресу ilyabirman.net/french/обычный-путь-к-проекту — это займёт пару минут, не считая времени написания французского текста. При этому создавать папку /french/ на сервере и копировать туда все файлы не придётся — языковые элементы урла обрабатываются отдельно и на структуру папок на сервере не влияют.

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

А ещё у меня на страницах бывают переключалки между связанными страницами, вот, например, такой переключалкой провязаны несколько рассказов про Лондон. Это работает, потому что эти страницы связаны в одну группу через поле group в файле метаданных. Они при этом могут лежать вообще по любым урлам, их просто вернёт GROUPLINGS. Если одна из страниц группы окажется недоступна на одном из языков — не беда, значит не попадёт в список. Движок не станет генерить мёртвые ссылки.

Или вот есть ещё WITHIN, определяется так:

function WITHIN ($what, $id = false) {
  return AT ($what) or INSIDE ($what, $id);
}

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

Есть макрос LANG, который возвращает текущий язык. Его удобно использовать, если страницы на разных языках отличаются двумя-тремя строками текста. Но чтобы не писать сто раз if (LANG == ’russian’) { ... }, можно просто положить в папке два файла — angstrom-english.php и angstrom-russian.php, тогда движок сразу возьмёт нужный из них.

Ещё есть TAIL, OFFSET, SIBLINGS, NEIGHBOURS и всякие другие, которые позволяют компактно и внятно выражаться в коде.

Я это называю макросами, а не функциями, потому что это точнее передаёт смысл, и ещё их можно вызывать без параметра $logo и без скобок (если других параметров нет), и тогда они сработают для текущей собираемой страницы:

<h1><?= TITLE ?></h1>

Шаблоны

У любой страницы в файле метаданных может быть поле apply-template — оно говорит движку, что надо пропустить страницу через определённый шаблон перед тем, как заворачивать в обёртку из меню и подвала.

Например, в подвале любого рассказа о поездке я даю ссылки на соседние. Их сколько нужно возвращает макрос SIBLINGS. Но я не копирую этот этаж из рассказа в рассказ — для этого у меня есть шаблон world-story, который применяется ко всем рассказам из поездок.

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

Вот начало файла .../www/world/london-2011-may/london-2011-may-russian.php:

Лондон — лучший город, где мне доводилось бывать.
IMG_0333.jpg Парламент и Биг-бен в Лондоне

Достопримечательностям здесь совершенно необязательно быть в поле зрения, чтобы было понятно, где ты находишься. Каждая деталь напоминает об этом:
IMG_0238.jpg Телефонная будка, почтовая машина и автобус в Лондоне

Похоже на текст из редактора Эгеи, правда? Потому что я тут использую Нисден — форматтер Эгеи. Шаблон world-story автоматически пропускает текст через него. Поэтому тут автоматически работает всякая резиновость картинок, фоторамы и всё остальное, и в результате сам собой получается рассказ про Лондон.

Блог

Теперь про блог. Блог работает на Эгее и живёт своей жизнью, несмотря на внешнее сходство с остальным сайтом. Эгея, в отличие от остального сайта, использует базу данных для хранения заметок, комментариев и прочего. Сайту никак не мешает, что в папке /meanwhile/ у него живёт что-то «неродное». Он не находит там файла _meanwhile.php и поэтому считает, что эта папка для него не представляет ценности.

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

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

Это недокументированная функция, но по секрету скажу что там, где у вас в Эгее лежит папка /user/, у меня лежит папка /users/ с двумя подпапками. Да, Эгея умеет быть многопользовательской уже много лет! Только никому не говорите. Если серьёзно, это работает на костылях. Заранее говорю, что не буду отвечать на письма с вопросом «как мне сделать так же».

Люди используют пробел для прокрутки страниц

Издревле в браузерах пробел прокручивает страницу на один экран вниз.

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

Cреди моей аудитории больше трети людей используют пробел

Даже среди моей продвинутой аудитории больше трети людей используют пробел!

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

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

Список — это однородные члены

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

Стоит написать список не в строку, а столбик, когда:

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

Часто встречаются списки с несогласованным набором слов и словосочетаний:

Шиномонтаж «Пончик»

  • • Высокое качество!
  • • Мы работаем для вас 24 часа!
  • • Для постоянных клиентов действует гибкая система скидок

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

Если шиномонтаж — это подлежащее, то однородные члены могут быть глагольными сказуемыми:

Шиномонтаж «Пончик»: что делает?

  • гарантирует высокое качество,
  • работает 24 часа,
  • даёт скидки постоянным клиентам.

Именными сказуемыми:

Шиномонтаж «Пончик» — это: что?

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

Дополнениями:

Шиномонтаж «Пончик» отличается: чем?

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

Обстоятельствами:

Шиномонтаж «Пончик» работает: как?

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

То есть список — это обычное предложение с однородными членами, просто по-особому оформленное. Если убрать графические признаки списка (двоеточие и переносы), ничего не должно сломаться:

Шиномонтаж «Пончик» работает высококачественно, круглосуточно, со скидками постоянным клиентам.

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

Элементы списка бывают настолько большими, что:

  1. Каждый из них оформляют как отдельное предложение с точкой в конце. Или даже как несколько таких предложений.
  2. Вводят нумерацию только ради того, чтобы помочь читателю увидеть, что перед ним перечисление.
  3. После самих номеров ставят точку. В роли номеров тут также могут быть и буквы.

Хоть элементы такого списка и оформляют как отдельные предложения, это лишь оформление. Требования согласованности элементов никуда не деваются, и список должен по-прежнему работать как предложение:

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

См. также:

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

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

Первое, что должен сделать любой человек с новым компьютером — поставить на максимум скорость повтора клавиатуры и на минимум задержку перед повтором. Это утверждение было истинным ещё во времена МС-ДОСа, когда это настраивалось в Биосе, было истинным во времена Виндоуса 95 и остаётся истинным до сих пор.

Мне бы и в голову не пришло писать про это, если бы я не обнаруживал, что у большинства моих знакомых клавиатура. Работает. Невероятно. Мучительно. Медленно. Жмёшь ты, скажем, бекспейс, и она стирает. По. Одному. Грёбанному. Символу. В неделю. Или жмёшь шифт-вверх и текст. Выделяется. Так. Неохотно. Что. Проще. Повеситься.

Зайдите в настройку системы, потом в клавиатуру и поставьте оба ползунка в крайнее правое положение:

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

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

Не сори

На трассе Челябинск—Екатеринбург, уже в Свердловской области, встречается несколько удивительных знаков «Не сори»:

Не сори

А всё почему? Потому что чистые дороги совесть каждого из нас!

Чистые дороги совесть каждого из нас!

Дорожный знак, не хухры мухры. Будут грязные дороги — менты остановят.

Кнопки включения-выключения

Кнопки включения-выключения

Смотрите, на этой посудомоечной машине слева — кнопка включения-выключения. Дурдом! Такая же есть на стиральной машине.

Чтобы запустить стирку, нужно сначала включить машину, а потом нажать «Старт». Спрашивается: нахрена её «включать», что делает включенная машина до старта? Если я её включу на пару часов, чтобы она поработала, а потом выключу, какую пользу мне принесёт её работа?

Мало того, когда машина достирает, она орёт на всю квартиру, чтобы я пришёл и выключил её. Нахрена её «выключать»? Что будет, если она всю оставшуюся жизнь простоит «включённой»?

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

Кнопки включения-выключения

См. также:

Мои редстандарты

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

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

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

Буква ё. Пишу.

Числа в словесной форме. Предпочитаю числа в словесной форме. Не пишу: «Я там был 2 раза», пишу: «два раза». Цифровую форму использую только если мне для чего-то важно подчеркнуть точность значения; выделить число в тексте; помочь сравнению с другими приведёнными рядом числами и т. п.

Знак процента с числом. Я не могу смириться с мильчинским пробелом между числом и знаком процента (я уже не помню, у кого как, но помню, что Мильчин, Вигдорчик, Гиленсон и Шульмейстер не имели единого мнения по этому вопросу). Везде, где технически можно поставить полпробела, я ставлю полпробела. Если такой возможности нет, я пишу слитно.

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

Имена и отчества людей. Не использую инициалы. Исключение — когда я сам не знаю имён, потому что кто-то до меня уже использовал инициалы. Тогда пишу за неимением лучшего. Без отчества — окей: Александр Пушкин. (Добавлено 13 февраля 2017.)

Смайлы и эмодзи. Смайлы пишу с глазами и носом, эмодзи не использую никогда.

Тире в предложениях с именным сказуемым. Часто опускаю: «Маск странный чувак», «Песня кайф». В принципе, русский язык так умеет — тире даже по правилам не пишется, если подлежащее выражено местоимением («Он молодец»). Причём, не пишется потому, что если его поставить, возникает лишняя пауза, ощущение противопоставления. Ровно поэтому же я не пишу в своих случаях. Вообще, я такое употребление встречал и в литературе (например: «Мужик наш мошенник» у Достоевского), поэтому, возможно, я просто не знаю какого-то правила, по которому это вполне нормально.

Тире и дефис в интервалах. Между числами интервала я ставлю дефис, если имею в виду «примерно» и тире, если имею в виду «от и до», независимо от того, написаны ли числа в словесной или цифровой форме. По Мильчину дефис используется только при словесной записи («У дома стояло машин пять-шесть»), а при цифровой записи всегда ставят тире («машин 5—6»). Я бы написал «машин 5-6», если бы вообще стал использовать цифровую запись. Или вот: «обувь на 1-2 размера больше».

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

Упорядоченные списки со скобками. Иногда элементы списка настолько распространённы, что их удобно оформить как предложения с большой буквы и с точкой в конце. Мильчин разрешает так оформлять элементы списка, «пронумерованного» заглавными буквами с закрывающей скобкой после них: А) Б) В). Я придерживаюсь принципа: если в обозначении элементов списка есть скобки, сами элементы не могут оформляться как предложения; они обязаны начинаться с маленькой буквы и заканчиваться запятой или точкой с запятой. Чтобы оформить элемент списка как предложение с точкой в конце, нужно поставить точку и после его «номера»: 1. 2. 3. или А. Б. В.

Склоняю Бангладеш, Хельсинки. Пишу Тайланд через й. Несклонение Бангладеша вообще ни в какие ворота не лезет. Несклонение Хельсинок понять можно: это как Тбилиси. Но мне просто больше нравится склонять — они даже в финском склоняются. Тайланд через „и“ — нелепость: в русском языке гласная буква обязана порождать слог, но Тайланд никто никогда не произносит в три слога. Ладно, справедливости ради скажу, что слово Бангладеш я ни разу не использовал вообще ни в каком другом контексте кроме возмущения его несклонением.

Деепричастие «пиша». Использую как ни в чём не бывало.

Диерезис в английском. Пиша по-английски, в рамках выпендрёжа использую диерезис, если не забываю: noöne и naïve. Так ещё делает, например, «Нью-Йоркер».

Британский английский. Стараюсь писать по-британски, опять же, если не забываю: apologise, centre, colour. Ставлю оксфордскую запятую.

Кнопка «Купить» всегда доступна

Мы рисовали страницу машины для Энви, и там справа есть жёлтый блок, который мы называли «ценником» — на нём кнопка «Арендовать»:

Кнопка «Купить» всегда доступна

Обычный сценарий попадания на страницу машины такой: на главной клиент указывает желаемые даты аренды, нажимает «Найти» и потом кликает в доступную машину. Возможно, однако, что клиент долго думал над выдачей, и когда кликнул, машину уже арендовал другой. Или он перезагрузил страницу машины через пару дней, с тем же результатом. Так что клиент может оказаться на странице машины с указанными датами, в которые машина недоступна. Значит, арендовать её будет нельзя.

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

Пошёл я презентовать дизайн Илье Синельникову (один из создателей Энви). Рассказываю, значит, про тот ценник.

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

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

Тут Илья перебивает:
— Что-то ты усложняешь, пусть кнопка просто всегда доступна, пофиг на даты.

Что? Машины же может не быть в эти даты.

— Да плевать, — говорит Илья, — клиент готов денег заплатить, а ты ему не даёшь, это же бред. Пусть заплатит, а мы как-нибудь разрулим.

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

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

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

Принцип: кнопка «Купить» всегда доступна.

Продолжение полуовала у знака рубля

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

Продолжение полуовала у знака рубля

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

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

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

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

Ранее Ctrl + ↓