Сайт Романа ПарпалакаБлог

Айсберг, который переворачивается

19 ноября 2017 года, 17:55

Дмитрий Гудков на Эхе про рейтинги диктаторов:

Вы знаете, у меня очень часто особенно иностранные журналисты спрашивают «Ну, как же вот так? Путин – вот, у него 86%. А что с этим делать?» И я им всегда рассказываю историю про Лужкова, у которого было, по-моему, 75% за неделю до отставки, и через неделю после отставки 50% с лишним уже поддерживали отставку. Это так устроено общественное мнение в России. Как только центр силы меняется, смещается, все эти цифры – они вообще куда-то улетают. Это как айсберг, который переворачивается. Было у тебя 98%, а потом айсберг перевернулся и у тебя 2 только осталось.

Когда переворачивается айсберг, ничего подобного не происходит. А айсберги действительно переворачиваются, мы это разбирали 10 лет назад.

Смотрите также:
Минус один в 28 степени
Гуманитарии о биноме Ньютона

Ключевые слова: политика, цитаты | Оставить комментарий

Синхронная прокрутка

6 ноября 2017 года, 16:18

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

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

Пример синхронной прокрутки есть в каждом интерфейсе просмотра изменений файлов. Вот PhpStorm:

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

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

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

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

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

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

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

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

Ключевые слова: интерфейсы | Оставить комментарий

Viewport в Edge

29 октября 2017 года, 00:42

Для нормального отображения сайтов на узких экранах мобильников верстальщик добавляет в html-код страниц мета-тег viewport:

<meta name="viewport" content="width=device-width, initial-scale=1">

Например, вот скриншот моего сайта:

Если этого не сделать, на странице всё будет слишком мелким, а при увеличении масштаба появляется неудобная горизонтальная прокрутка:

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

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

Микрософт избрал свой путь и поддерживает специальное css-правило @-ms-viewport. Это вендорный вариант правила @viewport, стандарт на которое находится в черновиках. Без этого правила сайты отображаются на планшетах с Windows в уменьшенном масштабе (как на втором скриншоте).

Каждый раз, когда вы добавляете мета-тег viewport, добавьте в css соответствующий код:

@viewport {
	width: device-width;
	}

@-ms-viewport {
	width: device-width;
	}

Доля пользователей Edge близка к нулю, но такие люди есть :) Так почему бы парой строк кода не сделать им приятно? И к стандартному способу управления размером видимой области ваш сайт будет готов.

Ключевые слова: веб-разработка, браузеры | Комментарии (2)

Бинбанк всё

21 октября 2017 года, 12:08

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

У Бинбанка есть кешбек под названием «Бинбонус». По всем покупкам они возвращают 1%, а за покупки в выбранной категории — 5%. В свое время я выбрал «Отдых и развлечения» и не прогадал. Туда входят рестораны, кино, театры, концерты, музеи, кафе и бары, ночные клубы, боулинг и бильярд, выставки, цирки и зоопарки, билеты на спортивные мероприятия. Сходил в кино, поел в кафе — тебе вернулись 5%.

Мы с коллегами ходим обедать в кафе и ресторанчики. Я плачу за всех кредитной картой Бинбанка, а они возвращают деньги в мобильном приложении Альфа-банка. В итоге получается двойная выгода. Во-первых, 5% от всей суммы за обед мне возвращается бонусами. Во-вторых, я расплачиваюсь кредитными деньгами банка, которые верну со следующей зарплаты, в то время как текущую зарплату можно сразу положить на депозит и получить больше процентных выплат.

И вот я получаю уведомление об изменениях в кешбеке:

C 1 ноября по 31 декабря 2017 года Вы сможете получить на 50% больше бонусов за покупки в дополнительных категориях:
— при оплате картой в ноябре в категории «Одежда и обувь» Вам будет начислено бонусами 1,5% от суммы покупки;
— при оплате картой в декабре в категории «Электроника» Вам будет начислено бонусами 1,5% от суммы покупки.

Также информируем Вас об изменениях в программе Бинбонус, которые вступят в силу 1 ноября:
• Минимальная сумма для начисления бонусов в месяц — 100 бонусов
• Минимальная сумма для компенсации покупки — 500 рублей
• Установлен максимальный порог начисления бонусов за покупки в выбранной категории – 1500 бонусов (общий порог остается прежним – 3000 бонусов)

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

А дальше — интереснее. То, что обычно написано мелкими буквами рядом со звездочкой. Если вы заработали за месяц меньше 100 бонусов (1 бонус = 1 рубль), то вы ничего не получаете (раньше было 50 бонусов). Бонусы не просто поступают на ваш счет в виде рублей. Нужно подобрать покупки, которые можно компенсировать бонусами. Раньше минимальная сумма компенсации была 100 рублей, а теперь стала 500 рублей. Таким образом, если у вас небольшие расходы, вы либо вообще не получите кешбек, либо получите непонятно когда.

Рассмотрим пример. Чтобы каждый месяц получать хоть какие-то бонусы, я должен тратить минимум 2000 рублей на отдых и развлечения, минимум 10 000 рублей не на отдых и развлечения, или промежуточную сумму при смешанных покупках. Получу при этом минимум 100 бонусов. Потратить я их смогу, только когда накопится X бонусов, причем X > 500 и должна существовать покупка на сумму между 500 и X рублей. При указанных расходах банк будет возвращать на карту 500 с чем-то рублей где-то раз в полгода, если вы что-то покупали на соответствующую сумму.

Читаем дальше и узнаем, что при больших тратах процент бонусов тоже снижается. Теперь за «отдых и развлечения» я смогу получать только 1500 бонусов, хотя раньше мог до 3000. То есть кешбеком покрывается 30 000 рублей. Такая сумма легко набегает, если обедать втроем-вчетвером. Если потратил больше, дополнительных бонусов не получу. У меня сумма бонусов обычно подбирается к этому ограничению, и один раз даже была 1560.

Всего этого и следовало ожидать. Бинбанк постепенно сворачивает плюшки для клиентов и превращается отделение госбанка.

Ключевые слова: деньги | Оставить комментарий

О режимах редактора vim

18 октября 2017 года, 23:07

На хабре идут обсуждения вима: «Режимы не фатальный недостаток, а киллер-фича» и «Киллер-фича в vim — это режимы? Серьёзно?».

И даже в комментариях никто не вспомнил старика Раскина. Именно он писал в книге «Интерфейс» о проблемах модальности и режимов (конспект нескольких глав книги тоже есть на хабре). Причем и в статьях, и у Раскина совпадает не только используемое понятие, но и его название — «режим».

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

Интерфейсные решения вима устарели чуть менее, чем перфокарты. Сравнивать вим и современные IDE — всё равно что сравнивать интерфейс Нокии 3310 и любого современного смартфона.

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

Ключевые слова: интерфейсы | Комментарии (1)

Парк «Зарядье»

13 сентября 2017 года, 23:06

Медуза пишет, что посетители парка «Зарядье» вытоптали 10 тысяч растений, часть выкопали, засунули в сумки и унесли с собой.

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

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

Вот такой вот флекс скоуп.

Ключевые слова: по жизни | Оставить комментарий

Сочинение музыки к стихотворениям

16 августа 2017 года, 17:46

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

Слетают листья, словно конфетти.
Неслышно в доме сумерки вздыхают.
И наши одинокие пути
Созвездия в ночи пересекают.

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

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

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

Роман Парпалак: В чужой Вселенной

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

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

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

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

В основе всех трех строф одна и та же часть с небольшими ритмическими и мелодическими вариациями, продиктованными различным текстом. Я разбавил строфы проигрышем с гармонией i VI VII V.

Ключевые слова: музыка | Оставить комментарий

Как определить домен из PHP

14 августа 2017 года, 23:12

Илья Бирман написал про баг в Эгее, когда сайт доступен по разным доменам, и RSS кешируется то с одним доменом, то с другим.

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

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

HTTP_HOST и SERVER_NAME

Для этих целей обычно проверяют серверную переменную HTTP_HOST. Но в ней всего лишь содержимое заголовка Host из http-запроса. Этот заголовок — часть стандарта HTTP/1.1, и в HTTP/1.0 он не обязателен. Правда, без этого заголовка не заработают виртуальные хосты — разные сайты на общем сервере. Но даже в таком случае среди сайтов есть сайт по умолчанию, открывающийся при заходе напрямую по IP. Так вот, когда устаревшие клиенты (в том числе нормальные браузеры за старыми или специально настроенными прокси) открывают сайт по умолчанию, переменная HTTP_HOST будет пустой.

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

server_name _;

Сайт будет прекрасно открываться, но при этом в SERVER_NAME окажется знак подчеркивания.

Подробности для дальнейшего чтения на стековерфлоу: HTTP_HOST vs. SERVER_NAME.

Параметр конфигурации

Если вы делаете распространяемый движок для работы на разных серверах, у вас нет гарантированного способа определить хост, по которому открыт сайт. В моем движке S2 я скопировал способ из PunBB. В нем установочный скрипт «угадывает» адрес сайта (протокол + домен + порт + подпапка) в том числе на основе HTTP_HOST, дает возможность этот адрес отредактировать и сохраняет результат в конфигурационный файл. Затем именно этот адрес используется для генерации ссылок.

Как альтернативу Илья советует настроить редиректы. Это правильно, но, опять же, не всегда выполнимо. Например, вы настроили на сервере https, но не хотите делать редирект с http на https (вы хотите поддерживать старые браузеры, но у вас нет отдельного IP-адреса на каждый домен).

Когда одна и та же страница открывается по разным адресам, Гугл рекомендует в явном виде указывать canonical-адреса:

<link rel="canonical" href="https://example.com/some/url" />

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

Кстати, давно хотел написать о том, что https — это новый www. Он вынуждает совершать дополнительные бессмысленные действия при настройке сайта вроде редиректов с www. Ради https мне пришлось сделать в S2 поддержку тега link rel="canonical".

Ключевые слова: www, PHP, S2 | Оставить комментарий

Программирование ≠ информатика

9 августа 2017 года, 00:03

На хабре перевод статьи некоего Коннелла о том, почему нельзя до конца формализовать и алгоритмизировать разработку софта:

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

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

  • Что должна делать эта программа? (требования, юзабилити, безопасность)
  • Как должна выглядеть программа внутри, чтобы её легко было починить и модифицировать? (архитектура, дизайн, масштабируемость, переносимость, расширяемость)
  • Как долго займёт её написание? (оценка)
  • Как мы должны её разрабатывать? (кодирование, тестирование, измерение, конфигурация)
  • Как следует эффективно организовать работу команды? (менеджмент, процесс, документация)

Все эти проблемы вращаются вокруг людей.

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

Ключевые слова: программирование | Оставить комментарий

Экспонента

3 июля 2017 года, 22:21

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

С 1:15:20 он строго доказывает формулу Эйлера о мнимой экспоненте $$e^{iy}=\sin y+i\cos y$$ тем же нестандартным методом, который я использовал в своей заметке про экспоненту и приближенные методы.

Ключевые слова: математика, видео | Оставить комментарий

туда →

Поделиться
Записи

Подписка на RSS (?)