Блог

Максимум дизайна текстом

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

Потом добавьте другие отступы, подвигайте текст пробелами, сделайте иконки текстом (←→×).

После можно приступать к излишествам: заменить тектовые элементы на настоящие иконки, изменить размер шрифта, цвет текста, сам шрифт. Но и здесь не стоит заигрываться.

Простой текст

Текст с отступами

Красивые разные шрифты и иконки

Зачем это всё?

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

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

Получается, сперва собираем ёлку, а потом вешаем украшения.

Математическая нотация степени

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

Школьники допускают ошибки из-за того, что неправильно понимают запись или действую быстро, не обдумывая. Проблемное сокращение — степень часто используемых функций. Когда надо возвести функцию в степень, её оборачивают в скобки и выносят показатель (степень) за них. Для тригонометрических и логарифмических функций есть сокращение, чтоб не писать много скобок, который усложняют чтение:

(sinx)2 = sin2x
(logab)2 = log2ab

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

log239a ≠ log239 + log23a
log239a = (log39 + log3a)2

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

log23a3 ≠ 3log23a
log23a3 = (3log3a)2

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

И еще о степенях. Вроде бы уяснили, что маленькая цифра наверху, сбоку от функции означает степень. Но в случаи обратной функции «-1» рядом со знаком «f» не рассматривается как показатель и отдельная часть. Знак функции и единичка с минусом — один символ, обозначающий обратную функцию.

Выбирайте правильные инструменты

Разработчики, которые имели медленный сайт или не имели его, с популярностью React переводят сайты на Gatsby, а потом радостно пишут в Твиттер о 90-100 в Lighthouse и рекомендуют перенести старый WordPress-блог на новый JS-фреймворк. И даже те, кто имел статический сайт на HTML с 70 в Lighthouse, переписывают его на Gatsby, который оптимизирует сайт за них и выдает хорошие цифры в тестах.

Проблема в том, что вам скорее всего не нужен JavaScript для личного блога. Gatsby крут плагинами, но всё, что нужно от него, — генерация страниц из Markdown. Клиент не хочет видеть JS-бандл. Gatsby нужен для сложных сайтов с анимациями и интерактивом, например, для этого блога — он издает звуки, персонажи двигаются, а примеры кода запускаются на месте. React с его JSX, где интерактив легко встраивается в текст, идеально здесь подходит, а еще у Gatsby хорошая поддержка MDX, чтоб делать такое же с Markdown.

Ситуация описывается так:

@twanttobealighi: реакт делает сложное простым, а простое невозможным

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

Возьмите полную статику: Eleventy, — используйте плагины для сжатия кода и картинок или напишите свой код в десять строк и дайте клиенту минималистичный набор HTML + CSS. Это тоже даст 100 в Lighthouse, но ниже буду написаны цифры, более глубоко описывающие скорость загрузки: первая отрисовка, время до взаимодействия с сайтом, самый крупный элемент сайта, — которые будут в разы меньше, а в сложных тестах вы наберете лучший результат.

А пишу я это потому, что у меня тоже сперва была полная статика с Jekyll, а потом я поддался количеству плагинов в Gatsby и автоматической оптимизации изображений. Но недавно я переписал сайт на Eleventy за три дня. Выбирайте правильные инструменты.

Y-комбинатор

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

Рассмотрим Y-комбинатор на примере Scheme — диалекта Lisp. Тестовой функцией будет length, которая измеряет длину списка. Для начала объясню как рабоатет сама функция.

(define length
(lambda (l)
(cond
((null? l) 0)
(else (add1 (length (cdr l)))))))

С каждым блоком кода открываются скобки, а потом они закрываются. Почти как {} в JavaScript. Разберем по строкам.

  1. define lengthdefine определяет называние функции, как если бы мы написали function length в JavaScript или def length в Python.
  2. lambda (l) — определяет безымянную функцию и её аргументы. В данном случаи аргумент один — l — в функцию мы передадим список. Передавая безымянную функцию в первую строку, мы определяем для нее имя. Первые две строки — аналог function length(l) в JavaScript и def length(l) в Python.
  3. cond — начало условия. Это как if, только туда передается много строк условий и действий подряд и в конце else.
  4. В каждой следующей строке после cond идет блок кода с условием и действием. Как ((null? l) 0). Читается так: ((если это) то это). А null? — это функция, которая проверяет список, который мы ей передаём, на пустоту.
  5. add1 — функция, которая добавляет 1; её надо писать самостоятельно. cdr — функция, которая возвращает список, который мы передаём, но без первого элемента.

В общем виде функция работает так:

  1. проверяем список на пустоту,
  2. если пустой — возвращаем 0, если нет, идем дальше,
  3. добавляем 1 к рекурсивному запуску фукнции,
  4. запускаем функцию со списком, который меньше на один элемент,

Пока список не будет пуст, мы будем добавлять единицу, когда он останется пуст, вернётся 0 из ((null? l) 0) и шаг за шагом в обратном направлении добавится по единице.

Если непонятно, то лучше пропустить какой-нибудь список через фукнцию. Например (lisp is great). Функция будет запускаться рекурсивно, удаляя по одному элементу из начала: (lisp is great), (is great), (great), (). Теперь можно приступать к комбинатору неподвижной точки.

Сперва попробуем избавиться от define. Функция будет безымянной. В Lisp есть синтаксис мгновенного объявления и вызова функции, как и в JavaScript. В скобки передается безымянная лямба-функция и следом аргумент:

((lambda (length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (length (cdr l)))))))
eternity)

Две лямбды означают, что мы создаём функцию, которая возвращает функцию, готовую принять другой аргумент. eternity просто пустышка, которая подставляется вместо аргумента. Такая функция будет очень похожа на length, но рекурсивного вызова не будет, потому что у функции нет имени и мы не знаем, как ее вызвать. Но если передать туда пустой список, то сработает первое условие — (null? l) и функция вернёт 0. То есть для пустого списка всё ок.

((lambda (f)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (f (cdr l))))))) ; здесь будет вторая фукнция
((lambda (g)
(lambda (l) ; здесь будет cdr l
(cond
((null? l) 0)
(else (add1 (g (cdr l))))))) ; здесь будет eternity
eternity))

Теперь передадим вместо eternity другую функцию. В первую функцию передается вторая, а в неё — eternity. Теперь мы можем передать список с одним элементом. Выполнится else, вызовется вторая функция, которая такая же, как и первая, и там мы уже остановимся. А можно так добавлять бесконечно. Но код будет не универсальным, а писать так много неудобно. Перейдем к другому определению функции.

((lambda (mk-length) ; (1)
(mk-length eternity))
(lambda (length) ; (2)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (length (cdr l))))))))

Теперь у нас есть отдельная функция (первая), которая возвращает похожую на length функцию. Функция (2) попадет в лямбду (1) как аругмент mk-length. Внутри происходит опять объявление с вызовом. В функцию (2) подставляется eternity вместо length.

Теперь повторим прошлый код с новым синтаксисом подстановки, передадим в функцию (2) вместо eternity саму функцию.

((lambda (mk-length) ; (1)
(mk-length
(mk-length eternity)))
(lambda (length) ; (2)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (length (cdr l))))))))

Здесь мы передаем eternity в функцию, как и в прошлый раз, и всю эту конструкцию снова передаем в функцию. Уберем eternity.

((lambda (mk-length) ; (1)
(mk-length mk-length))
(lambda (length) ; (2)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (length (cdr l))))))))

Функция (2) передается в функцию (1) и получает там имя mk-length, а потом передается в себя в строке (mk-length mk-length). Вернем eternity, но теперь в другое место, положим его прямо внутрь функции.

((lambda (mk-length) ; (1)
(mk-length mk-length))
(lambda (length) ; (2)
(lambda (l)
(cond
((null? l) 0)
(else (add1 ((length eternity) (cdr l))))))))

Теперь опять заменим eternity на функцию, мы уже делали так.

((lambda (mk-length) ; (1)
(mk-length mk-length))
(lambda (length) ; (2)
(lambda (l)
(cond
((null? l) 0)
(else (add1 ((length length) (cdr l))))))))

В функциональном программировании используется прием eta-reduction. Он позволяет заменить (lambda (x) (function x)) на function, потому что в первом варианте мы передаем аргумент в функцию, которая находится в ожидании, во втором варианте функция также ждет аргумент, который можно ей передать. Если мы передадим любое число в оба варианта, то функция получит число и там, и там.

Сделаем обратную замену: подставим вместо (length length) функцию (lambda (x) ((length length) x)). Здесь (length length) просто функция.

((lambda (mk-length) ; (1)
(mk-length mk-length))
(lambda (length) ; (2)
(lambda (l)
(cond
((null? l) 0)
(else (add1 ((lambda (x) ((length length) x))
(cdr l))))))))

Вытащим новую конструкцию за функцию.

((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length) ; новая функция-обертка
((lambda (length) ; подстановка аргумента
(lambda (l)
(cond
((null? l) 0)
(else (add1 (length (cdr l)))))))
(lambda (x) ; аргумент
((mk-length mk-length) x)))))

На 4 строке появились двойные скобки: это значит, что мы в функцию передаем аргумент. Выделенный фрагмент — прошлая функция, куда мы передаем последние две строки. Если подставить (lambda (x) ((length length) x)) вместо length в четвертой строке, то получим функцию из предыдущего блока. Всю эту конструкцию мы обернули в новую фукнцию.

Вытащим выделенный фрагмент в отдельный аргумент.

((lambda (le)
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(le (lambda (x)
((mk-length mk-length) x))))))
(lambda (length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (length (cdr l))))))))

Выделенный фрагмент — функция, похожая на изначальный length. Она передается в первую функцию как le. Остальное — часть, которая выполняет рекурсию. Её можно определить с помощью define.

(define Y
(lambda (le)
((lambda (f) (f f))
(lambda (f)
(le (lambda (x) ((f f) x)))))))

Здесь le — функция, которую мы хотим вызывать рекурсивно, x — ее аргумент, а f — внутреннее имя функция для применения функции к себе. Эта часть называется Y-комбинатор. Их существует несколько видов, но этот основной. Более сложное, но не менее интересное, объяснение есть в книге The Little Schemer, а еще один вид комбинатора есть во второй части — The Seasoned Schemer. Это интересные и веселые книги по функциональному программированию, которые стоит прочитать навичкам в этом разделе.

Обещание математической логики

У Савватеева — крутого русского математика, который занимается теорией игр и сложными задачами — вышло видео о логике математиков. Он запустил серию видео с красивой подачей: крутые превью и объяснение на прозрачной доске. В видео Алексей упомянул утверждение «Если Земля плоская, то все крокодилы красные» и показал на этом примере принцип логики. Объяснение показалось недостаточно раскрытым. Попробую углубиться в этот пример.

Рассмотрим четыре случая, которые я обозначу через числа. 1 — утверждение верно, 0 — неверно.

Земля плоская?Крокодилы красные
00
01
10
11

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

  • Первый и второй случаи: Земля не плоская (общая ситуация) и не все крокодилы красные (в первом случаи) или все крокодилы красные (во втором случаи). Я утверждаю, что «если Земля плоская, то …», — то есть я ничего не говорю о случаи не плоской Земли. Я не лгал, если не говорил об этом. Значит утверждение правдиво.
  • Третий случай: Земля плоская, но не все крокодилы красные. Я пообещал в утверждении, что если Земля плосокая, то все крокодилы будут красными. Условие соблюдено, но результат не совпал. Значит я соврал. Утверждение неверно.
  • Четвертый случай: Земля плоская и все крокодилы. Как и говорил. Условие соблюдено, результат совпал. А значит не соврал и утверждение верно.

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

Перепишу схему с выводами:

Земля плоская?Крокодилы красныеРебенок рад?
001
011
100
111

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

Дизайн на рендерах и в жизни

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

@st8rmi: The new Office App

Комментарии под твитом
Комментарии под твитом

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

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

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

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

«Как устроена экономика»: цитаты

Прочитал книгу «Как устроена экономика». История капитализма, объяснение работы банков и экономических школ, а еще много цифр.

Обложка книги
Обложка книги

На Гисте: economics-the-users-guide-quotes.md

  1. Сторонники этой школы, в особенности сам Рикардо, подчеркивали, что в долгосрочной перспективе каждый заинтересован в том, чтобы наибольшую долю национального дохода (то есть прибыль) получал класс капиталистов, потому что только он инвестирует и создает экономический рост; рабочий класс слишком беден, чтобы сохранять и вкладывать средства, а класс землевладельцев использует свой доход (арендную плату) на «непродуктивное» расточительство, например на наем прислуги.
  2. Теория ХОС предполагает, что все страны технологически и организационно способны производить любые продукты. Они выбирают специализацию только потому, что для разных продуктов необходимы различные комбинации труда и капитала, обеспечение которыми не везде одинаково.
  3. Пигу утверждал, что в некоторых случаях рыночные цены не отражают истинных социальных издержек и выгод. Например, завод загрязняет воздух и воду, потому что те не имеют рыночной цены, следовательно, к ним можно относиться как к бесплатным продуктам. Но в результате такого «перепроизводства» загрязнения окружающая среда будет уничтожена и общество пострадает.
  4. Институциональная школа: старая, новая и новая старая? Люди – это продукт собственного общества, даже если они способны изменить его правила.
  5. «Не от благожелательности мясника, пивовара или булочника ожидаем мы получить свой обед, а от соблюдения ими своих собственных интересов».
  6. Классическое значение термина описывает такое положение вещей, при котором наивысший приоритет имеет свобода личности. С экономической точки зрения, это означает защиту права человека на использование своей собственности по личному усмотрению, особенно в том, что касается заработка денег. Лучшее правительство, по мнению приверженцев либерализма, – то, которое обеспечивает самые минимальные условия для осуществления таких прав: закон и порядок. Такое правительство (государство) называется минимальным государством. Распространенным лозунгом среди либералов того времени было «невмешательство» («Пусть все идет своим чередом»), так что либерализм также называют доктриной невмешательства.
  7. …в большинстве своем европейские женщины выступали против введения женского избирательного права в начале XX века.
  8. Некоторые из них могут даже активно поддерживать сохранение несправедливости и жестокости – подобно тем рабам, что стали надсмотрщиками над другими рабами и первыми же их угнетателями, как, например, Стивен – персонаж актера Сэмюэла Джексона в фильме «Джанго освобожденный».
  9. Рынки работают в соответствии с правилом «один доллар – один голос», в то время как демократическая политика действует по принципу «один человек – один голос».
  10. Между 1860-м и 1910 годом появились кластеры новых технологических инноваций, в результате чего начался подъем так называемой тяжелой и химической промышленности: производства электротехнического оборудования, двигателей внутреннего сгорания, синтетических красителей, искусственных удобрений и других продуктов. В отличие от технологий промышленной революции, придуманных практичными мужчинами с хорошей интуицией, новые технологии разрабатывались в рамках систематического применения научных и инженерных принципов. Таким образом, любое изобретение очень быстро могло быть воспроизведено и улучшено.
  11. Мы всегда жили при экономике знаний. Всегда именно качество используемых знаний, а не физическая природа произведенных продуктов (хоть материальных товаров, хоть нематериальных услуг) делало индустриализированные страны богаче.
  12. В странах с плохим общественным транспортом и разбросанными жилыми районами люди тратят огромное время на дорогу до работы и обратно, что плохо сказывается на их благосостоянии.
  13. При этом стоимость производства повышается настолько, что монополия представляет собой наиболее экономически эффективный вариант.
  14. Гарри Трумэн в своей типичной деловой манере однажды заметил: «Эксперт – это человек, который больше не хочет узнавать ничего нового, потому что иначе он перестанет быть экспертом».
  15. Некоторые экономисты, в том числе и я, идут еще дальше и утверждают, что в отраслях, требующих больших капиталовложений для роста производительности (например, металлургия, автомобильная промышленность), «антиконкурентные» договоренности между олигополистическими компаниями, такими как картели, иногда приносят пользу. В таких отраслях цена неограниченной конкуренции уменьшает прибыль компаний насколько, что снижает их способность делать инвестиции, нанося вред их долгосрочному росту. Если такая конкуренция приводит к банкротству компании, ее оборудование и рабочие могут быть потеряны для общества навсегда, поскольку им сложно найти применение в других отраслях.

  1. По данным Всемирного банка, в 2010 году страной с самым высоким уровнем дохода (ВНД) на душу населения в мире было Монако (197 460 долларов), за ним следовал Лихтенштейн (136 540 долларов). Тем не менее оба эти государства с крошечным населением (33 и 36 тысяч человек соответственно) представляют собой зоны льготного налогообложения. Поэтому, если исключить страны с населением менее полумиллиона человек, самой богатой страной будет Норвегия, доход на душу населения там составляет 85 380 долларов (то есть она имеет самый высокий ВНД на душу населения).
  2. По оценкам МОТ, в мире насчитывается 123 миллиона работающих детей в возрасте от 5 до 14 лет, что эквивалентно 3,7 процента рабочей силы в мире.
  3. Самая высокая доля работает значительно большее количество часов в Индонезии (51 процент) и Корее (50 процентов); Таиланд, Пакистан и Эфиопия имеют долю выше 40 процентов. Самое низкое отношение в России (3 процента), Молдове (5 процентов), Норвегии (5 процентов) и Нидерландах (7 процентов).
Необходимые и достаточные условия

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

«Параметр — это буква, которая «никому ничем не обязана» и может принимать любые допустимые значения. Структура решений уравнения или неравенства зависит от значений параметра; те или иные аспекты этой зависимости и предстоит выяснить в каждой конкретной задаче»
Игорь Яковлев, math us

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

Необходимые условия

Сразу к примеру. Чтобы фигура считалась квадратом, она должна быть ромбом, но это еще не все, нужно еще условие того, что все углы прямые. Понимать это можно так: квадрат не может не быть ромбом — он всегда ромб, но ромб не всегда квадрат.

Сложнее понятие необходимости становится с неравенствами:

Для того, чтобы выполнялось неравенство x^2 − 7x + 6 < 0, необходимо, чтобы выполнялось неравенство |x − 3| < a.

В данном случае мы будем иметь решение первого неравенства — отрезок на числовой прямой — и второе неравенство, которое будет содержать больший промежуток, чем первое. То есть, чтоб x принадлежал меньшему промежутку (1), надо, чтоб он для начала принадлежал большему (2), в котором находится меньший (1). Но данного недостаточно, нужно еще больше ограничить промежуток до меньшего, сузить его.

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

Достаточные условия

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

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

Условие прошлой задачи с неравенствами можно перевернуть:

Для того, чтобы выполнялось неравенство |x − 3| < a, достаточно, чтобы выполнялось неравенство x^2−7x+6 < 0.

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

Имеем общее правило для условий задач: 1 необходимо для 2 = 2 достаточно для 1. Для неравенств можно перефразировать так: если неравенства 1 достаточно для неравенства 2, то все решения 1-го содержатся во 2-ом.

«Choose» или «select»

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

“Use choose, not select, for menu items. In general, the user selects something (such as a file or disk icon, an email message, or a section of text) and then chooses a command to act on the selection.”

“Use choose, not select, for menu items. In general, the user selects something (such as a file or disk icon, an email message, or a section of text) and then chooses a command to act on the selection.”

Коротко: сперва «select» несколько фотографий, а потом «choose» поделиться.

Отсюда: Reminder: Select and Choose Are not Synonyms

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

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

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

Плюсы:

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

Сделал себе такое меню на новом сайте Пост Величин:

Пост Величины на телефоне
Пост Величины на телефоне

А еще вот несколько примеров:

Тинькофф и ГитхабГугл и Горбунов
Меню на сайте Журнала Тинькофф. Я вдохновлялся именно им, когда делал себе для Величин
Меню на сайте Журнала Тинькофф. Я вдохновлялся именно им, когда делал себе для Величин
Меню в поиске Гугла
Меню в поиске Гугла
Меню у Гитхаба. При этом от гамбургера не избавились
Меню у Гитхаба. При этом от гамбургера не избавились
Меню на сайте Бюро Горбунова
Меню на сайте Бюро Горбунова
РанееВсе заметки