Позднее Ctrl + ↑

Как я узнал, что domenica — это воскресенье

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

Так вот. Есть такая дурацкая, но клёвая песня:

Самый кайф после 2:30, но сейчас нас интересует не это. В 1:13 там начинается какой-то текст про дискотеку. Мне в общем-то пофиг на текст, но когда я на третий раз услышал «Domenica... a la discoteca» у меня щёлкнуло: «А, так domenica — это воскресенье? Это ж почти как dimanche по-французски».

И тут я понял, о чём эта песня. Песня-разгадка (ещё клёвее):

«Lunedi sera, la discoteca» — ну блин, мог бы и с первого раза понять, учитывая, что lundi — это понедельник по-французски, а buonasera — добрый вечер по-итальянски.

Слова weight и height

Часто веб-разработчиков ставит в лингвистический тупик такой ЦСС-код:

font-weight: normal;
line-height: 1.4em;

Запомните: слово height читается «хайт» несмотря на то, что слово weight читается «вейт».

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

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

Файлы страниц сайта лежат в папках, соответствующих урлам разделов, например страница про Ангстрем лежит на сервере под именем .../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реди моей аудитории больше трети людей используют пробел

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

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

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

Сто лет одиночества: либералы, консерваторы и честные выборы

Как прошли выборы в городке Макондо:

Либералы готовились развязать войну. Поскольку в ту пору Аурелиано имел весьма туманное представление о консерваторах и либералах, тесть простыми словами изложил ему, в чём состоит разница между этими партиями. Либералы, говорил он, — это фасоны, скверные люди, они стоят за то, чтобы отправить священников на виселицу, ввести гражданский брак и развод, признать равенство прав законнорожденных и незаконнорожденных детей и, низложив верховное правительство, раздробить страну — объявить её федерацией. В противоположность им консерваторы — это те, кто получил бразды правления непосредственно от самого Господа Бога, кто ратует за устойчивый общественный порядок и семейную мораль, защищает Христа, основы власти и не хочет допустить, чтобы страна была раскромсана. Из чувства человечности Аурелиано симпатизировал либералам во всем, что касалось прав незаконнорожденных детей, но не мог понять, зачем нужно впадать в крайности и развязывать войну из-за чего-то такого, что нельзя потрогать руками. Ему показалось чрезмерным усердие тестя, затребовавшего на время выборов в лишенных всяких политических страстей городок шесть вооруженных винтовками солдат с сержантом во главе. Солдаты не только прибыли, но обошли все дома и конфисковали охотничьи ружья, мачете и даже кухонные ножи, а затем раздали мужчинам старше двадцати одного года голубые листки с именами кандидатов консерваторов и розовые — с именами кандидатов либералов. В субботу, накануне выборов, дон Аполинар Москоте лично огласил декрет, запрещавший, начиная с полуночи и в течение сорока восьми часов, торговать спиртными напитками и собираться группами числом более трех человек, если это не члены одной семьи. Выборы прошли спокойно. В воскресенье, в восемь часов утра, на площади была установлена деревянная урна под охраной шести солдат. Голосование было совершенно свободным, в чем Аурелиано мог убедиться сам — почти весь день он простоял рядом с тестем, следя, чтобы никто не проголосовал больше одного раза. В четыре часа дня барабанная дробь возвестила о конце голосования, и дон Аполинар Москоте опечатал урну ярлыком со своей подписью. Вечером, сидя за партией в домино с Аурелиано, он приказал сержанту сорвать ярлык и подсчитать голоса. Розовых бумажек было почти столько же, сколько голубых, но сержант оставил только десять розовых и пополнил недостачу голубыми. Потом урну опечатали новым ярлыком, а на следующий день чуть свет отвезли в главный город провинции.

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

Габриэль Гарсиа Маркес. Сто лет одиночества

Дорогая редакция: стиральная и посудомочная машины читателей

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

Илья Синельников показывает свою стиральную машину и сушилку:

Пишет:

Минуту соображал, почему машина не работает, когда выбрал программу и нажимаешь «Старт». А ещё, чтобы включить, кнопку надо держать 2 секунды. Прикинь?

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

Глеб Крауклиш показывает свою посудомоечную машину:

Дорогая редакция: стиральная и посудомочная машины

Пишет:

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

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

Ну, вообще, это тоже не очень. Что за пять секунд? Почему именно пять, а не три или не семь? Временны́е задержки в интерфейсе — зло, про это надо будет тоже заметку написать.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также:

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

Дорогая редакция: Понимаю ли я разницу между электрочайником и стиральной машиной?

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

Добрый день, Илья!

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

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

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

У стиралки есть настройки, тип белья, температура, скорость отжима. После включения она ждет, что ты задашь эти параметры. Этот интерфейс расходует электричество, мало (светодиоды), но расходует. Ок, плевать на электричество, но там все подсвечивается теми же светодиодами. Удобно? Да. Но я не хочу, чтобы ночью что-то в ванной или на кухне светилось. Отдельную кнопку для выключения светодиодов? А не проще ли общий вкл/выкл, как уже есть?

что делает включенная машина до старта? Если я её включу на пару часов, чтобы она поработала, а потом выключу, какую пользу мне принесёт её работа?

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

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

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

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

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

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

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

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

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

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

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

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

Ранее Ctrl + ↓