Безжалостное избавление от Layout Shift на netlify.com

Безжалостное избавление от Layout Shift на netlify.com

Приветствую. Представляю вашему вниманию перевод статьи «Ruthlessly Eliminating Layout Shift On Netlify.com», опубликованной 25 ноября 2020 года автором Zach Leatherman.

На сайте Netlify у нас есть небольшой баннер, который появляется вверху для привлечения трафика к новым и интересным вещам, происходящим в мире Netlify.

Этот баннер состоит из двух частей:

  1. Расширенная фича HTML, о которой знают только разработчики старой школы: гиперссылка.
  2. Кнопка закрытия (которая сохраняет предпочтение для будущих загрузок страницы)

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

  1. Первоначальный рендеринг страницы. По умолчанию баннер ⚠️⚠️⚠️ скрыт. До загрузки JavaScript или без JavaScript баннер не отображается.
  2. После загрузки JavaScript мы проверяем localStorage, чтобы узнать, закрывал ли пользователь баннер ранее. Значение — URL-адрес ссылки, чтобы при изменении баннера он снова отображался, даже если пользователь его закрыл. Если нужно — рендерим баннер.
  3. Наконец, мы вешаем события на кнопку закрытия. Для гиперссылки это не нужно, потому что ее поведение предоставляется исключительно в HTML (вааау).

Шаги 2 и 3 объединены и выполняются вместе в одном компоненте. В некоторых предедущих версиях сайта время между шагами 1 и 2 могло достигать ~600 мс.

uploads/4ce9dbff29e610c4740f7481d58568c2.png

При редизайне нашего сайта (заметьте, быстрее) мы вставили JavaScript шагов 2 и 3 в конец <body>, и задержка все еще была:

uploads/f550c5c5621d8109442fc31f88548ede.png

Решение

Что нам нужно сделать? Сделать поведение наоборот. Обычно баннер по умолчанию скрыт. Мы должны сделать баннер видимым по умолчанию и с помощью JavaScript скрывать его, если нужно.

Это изменяет наш выше упомянутый Шаг 1, первоначальный рендеринг страницы. Теперь без JavaScript или до загрузки JavaScript баннер будет виден.

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

HTML и CSS

Мы используем opacity для скрытия кнопки закрытия, чтобы изза неё не перерисовывался компонент, когда он отобразится с помощью JavaScript.

.banner--hide announcement-banner,
announcement-banner[hidden] {
  display: none;
}
#test .banner {
  height: 400px;
  position: relative;
}
[data-banner-close] {
  opacity: 0;
  pointer-events: none;
}
.banner--show-close [data-banner-close] {
  opacity: 1;
  pointer-events: auto;
}
<announcement-banner>
  <a href="https://www.netlify.com/sustainability/">Read about our Sustainability</a>
  <button type="button" data-banner-close>Close</button>
</announcement-banner>

JavaScript

banner-helper.js, вставленный в <head> страницы:

// Адрес CTA ссылки, мы инжектим его из JSON файла
let regex = /^([0-9]+)(\w?)(\s\S)$/ig;
let ctaUrl = 'https://www.netlify.com/sustainability/';
let savedCtaUrl = localStorage.getItem('banner--cta-url');

if (savedCtaUrl === ctaUrl) {
  document.documentElement.classList.add('banner--hide');
}

banner.js, отоложен на потом (на сколько позже — зависит от вас):

class Banner extends HTMLElement {
  connectedCallback () {
    // Независимо от того, когда это выполняется, кнопка закрытия будет скрыта,
    // пока этот класс не будет добавлен - он предотвращает призрачные клики
    // по кнопке до добавления обработчика событий.
    this.classList.add('banner--show-close');

    let button = this.getButton();
    if (button) {
      button.addEventListener('click', () => {
        this.savePreference();
        this.close();
      });
    }
  }

  getButton () {
    return this.querySelector('[data-banner-close]');
  }

  savePreference () {
    let cta = this.querySelector('a[href]');
    if (cta) {
      let ctaUrl = cta.getAttribute('href');
      localStorage.setItem('banner--cta-url', ctaUrl);
    }
  }

  close () {
    this.setAttribute('hidden', true);
  }
}

window.customElements.define('announcement-banner', Banner);

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

Результат

Обратите внимание, что первый рендер содержит баннер! Это одинаковый рендеринг вне зависимости от того, задействован ли JavaScript или нет.

uploads/4a114b75ce8f1719a806e66717d50ad0.png
Внимательные читатели заметят, что это веб-компонент, но давайте оставим это между нами.

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

uploads/8abd4c602c6b65687d40b052c700c304.png

И поскольку мы вставили скрипт для повторных просмотров в <head>, когда пользователь скрывает баннер и переходит на новую страницу, баннер также будет скрыт перед первым рендерингом.

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

Следующей целью будет улучшение отображения веб-шрифтов.

Об электронной демократии

Удивляют предприятия, которые в для деловой переписки используют адреса электронной почты, зарегистрированные на популярных почтовых сервисах, вроде Gmail, Yahoo или, упаси боже, Inbox.lv. И это при том, что, зачастую, у них есть свой домен и сайт.

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

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

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

В наше время

sdsdsdsds
sdsd
sd

Подборка полезных команд на bash — 1

Внешний IP-адрес

Если на вашем компьютере установлен пакет dnsutils, то самым простым способом получить из bash внешний IP-адрес машины будет обратиться к OpenDNS:

myip() { dig +short myip.opendns.com @resolver1.opendns.com; }

Имя сетевого интерфейса

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

eth() { route -n | awk '($1 == "0.0.0.0") { print $NF ; exit }'; }

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

Права доступа в восьмеричном формате

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

lso() { ls -halG "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }

Теперь, если вы вызываете lso, вы увидете стандартный вывод команды ls -halG с дополнительной колонкой.

Генератор паролей

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

randompass() { < /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-16}; echo; }

Вызываем:

$ randompass
EGcudXmuUv-lFejx

$ randompass 13
bqBqGVUsvZDK1

DigitalOcean vs. Scaleway

Почти два года назад я переехал с классического хостинга на DigitalOcean. За это время я уже вполне наловчился настраивать Nginx, писать всевозможные скрипты на bash и запускать приложения на Node.js как сервисы. И вот теперь я переехал на Scaleway.

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

DigitalOceanScaleway VC1SScaleway C1
CPU1×86 64bit core2×86 64bit cores4 ARM cores
RAM512MB2048MB2048MB
Диск20GB SSD50GB SSD50GB SSD
Трафик1TB
Канал∞ (?)200Mbit/s200Mbit/s
Цена$5/mo (≈ €4,40/mo)€2,99/mo€2,99/mo

Для сравнения дроплет с 2-мя ядрами и 2-мя гигабайтами памяти у DO стоит $20 в месяц.

Но есть у Scaleway и минусы:

  • на данный момент географически предлагаются сервера только в Париже (компания французская);
  • отсутствует возможность поднять сразу несколько новых нод;
  • нужно платить за создание (€0,50) и хранение (€0,02 за гигабайт в месяц) снапшотов;
  • контрольная панель не такая удобная, как у DO;
  • отсутствует поддержка DNS.

Тем не менее, лично меня это вполне устраивает.

Hello World: The Sidenotes

Notes

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

Ну опечатался человек, бывает. Но в отличии от полноценной корпоративной почты, это письмо, очень вероятно, кто-то получит.

That is where CableReady from the StimulusReflex clan beats the opponent: it supports more than 30 actions, including insert_adjacent_html.

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

Hello World: The remark Kitchen Sink

Note how all headlines below show an anchor link when you hover them?

That's gatsby-remark-autolink-headers hooking up all MarkdownRemark headers with anchor links for us.

Markdown in Gatsby

Markdown parsing in Gatsby is done with gatsby-transformer-remark, which uses the excellent remark under the hood.
Alongside remark we also use gatsby-remark-smartypants, which provides smart punctuation through retext-smartypants.

The examples on this page cover the basic Markdown syntax and are adapted from Markdown Here's Cheatsheet (CC-BY).


This is intended as a quick reference and showcase. For more complete info, see John Gruber's original spec and the GitHub-flavored Markdown info page.

Table of Contents

Headers Emphasis Lists Links Images Tables Footnotes Blockquotes Inline HTML Horizontal Rule Line Breaks

Headers

# H1

## H2

### H3

#### H4

##### H5

###### H6

Alternatively, for H1 and H2, an underline-ish style:

# Alt-H1

## Alt-H2

H1

H2

H3

H4

H5
H6

Alternatively, for H1 and H2, an underline-ish style:

Alt-H1

Alt-H2

Emphasis

Emphasis, aka italics, with *asterisks* or _underscores_.

Strong emphasis, aka bold, with **asterisks** or __underscores__.

Combined emphasis with **asterisks and _underscores_**.

Strikethrough uses two tildes. ~~Scratch this.~~

Emphasis, aka italics, with asterisks or underscores.

Strong emphasis, aka bold, with asterisks or underscores.

Combined emphasis with asterisks and underscores.

Strikethrough uses two tildes. Scratch this.

Lists

In this example, leading and trailing spaces are shown with dots: ⋅

1. First ordered list item
2. Another item
  * Unordered sub-list.
1. Actual numbers don't matter, just that it's a number
  1. Ordered sub-list
4. And another item.

  You can have properly indented paragraphs within list items. Notice the blank line above, and the leading spaces (at least one, but we'll use three here to also align the raw Markdown).

  To have a line break without a paragraph, you will need to use two trailing spaces.⋅⋅
  Note that this line is separate, but within the same paragraph.⋅⋅

* Unordered list can use asterisks
- Or minuses
+ Or pluses
  1. First ordered list item
  2. Another item
    • Unordered sub-list.
  3. Actual numbers don't matter, just that it's a number
    1. Ordered sub-list
  4. And another item.

You can have properly indented paragraphs within list items. Notice the blank line above, and the leading spaces (at least one, but we'll use three here to also align the raw Markdown).

To have a line break without a paragraph, you will need to use two trailing spaces.
Note that this line is separate, but within the same paragraph.

  • Unordered list can use asterisks
  • Or minuses
  • Or pluses

There are two ways to create links.

[I'm an inline-style link](https://www.google.com)

[I'm an inline-style link with title](https://www.google.com "Google's Homepage")

[I'm a reference-style link][Arbitrary case-insensitive reference text]

[I'm a relative reference to a repository file](../blob/master/LICENSE)

[You can use numbers for reference-style link definitions][1]

Or leave it empty and use the [link text itself].

URLs and URLs in angle brackets will automatically get turned into links.
http://www.example.com or <http://www.example.com> and sometimes
example.com (but not on GitHub, for example).

Some text to show that the reference links can follow later.

[arbitrary case-insensitive reference text]: https://www.mozilla.org
[1]: http://slashdot.org
[link text itself]: http://www.reddit.com

I'm an inline-style link

I'm an inline-style link with title

I'm a reference-style link

I'm a relative reference to a repository file

You can use numbers for reference-style link definitions

Or leave it empty and use the link text itself.

URLs and URLs in angle brackets will automatically get turned into links. http://www.example.com or http://www.example.com and sometimes example.com (but not on GitHub, for example).

Some text to show that the reference links can follow later.

Images

Here's our logo (hover to see the title text):

Inline-style:
![alt text](https://pbs.twimg.com/profile_images/875556871427375106/Xuq8DypK_bigger.jpg "Logo Title Text 1")

Reference-style:
![alt text][logo]

[logo]: https://pbs.twimg.com/profile_images/875556871427375106/Xuq8DypK_bigger.jpg "Logo Title Text 2"

Here's our logo (hover to see the title text):

Inline-style:alt text

Reference-style:alt text

Tables

Tables aren't part of the core Markdown spec, but they are part of our implementation. They are an easy way of adding tables to your email — a task that would otherwise require copy-pasting from another application.

Colons can be used to align columns.

| Tables        | Are           | Cool  |
| ------------- |:-------------:| -----:|
| col 3 is      | right-aligned | $1600 |
| col 2 is      | centered      |   $12 |
| zebra stripes | are neat      |    $1 |

There must be at least 3 dashes separating each header cell.
The outer pipes (|) are optional, and you don't need to make the
raw Markdown line up prettily. You can also use inline Markdown.

Markdown | Less | Pretty
--- | --- | ---
*Still* | `renders` | **nicely**
1 | 2 | 3

Colons can be used to align columns.

TablesAreCool
col 3 isright-aligned$1600
col 2 iscentered$12
zebra stripesare neat$1

There must be at least 3 dashes separating each header cell. The outer pipes (|) are optional, and you don't need to make the raw Markdown line up prettily. You can also use inline Markdown.

MarkdownLessPretty
Stillrendersnicely
123

Footnotes

Footnotes are also not a core feature of markdown, but they're a common extension feature. The footnote syntax looks like this:

This line has a footnote [^1]. Scroll down or click the link to see it.

That renders like this:

This line has a footnote1. Scroll down or click the link to see it.

Blockquotes

> Blockquotes are very handy in email to emulate reply text.
> This line is part of the same quote.

Quote break.

> This is a very long line that will still be quoted properly when it wraps. Oh boy let's keep writing to make sure this is long enough to actually wrap for everyone. Oh, you can *put* **Markdown** into a blockquote.

Blockquotes are very handy in email to emulate reply text. This line is part of the same quote.

Quote break.

This is a very long line that will still be quoted properly when it wraps. Oh boy let's keep writing to make sure this is long enough to actually wrap for everyone. Oh, you can put Markdown into a blockquote.

Inline HTML

You can also use raw HTML in your Markdown, and it'll mostly work pretty well.

<dl>
  <dt>Definition list</dt>
  <dd>Is something people use sometimes.</dd>

  <dt>Markdown in HTML</dt>
  <dd>Does *not* work **very** well. Use HTML <em>tags</em>.</dd>
</dl>
Definition list
Is something people use sometimes.
Markdown in HTML
Does *not* work **very** well. Use HTML tags.

Horizontal Rule

Three or more...

---

Hyphens

***

Asterisks

___

Underscores

Three or more…


Hyphens


Asterisks


Underscores

Line Breaks

Here are some things to try out:

Here's a line for us to start with.

This line is separated from the one above by two newlines, so it will be a *separate paragraph*.

This line is also a separate paragraph, but...
This line is only separated by a single newline, so it's a separate line in the *same paragraph*.

Here's a line for us to start with.

This line is separated from the one above by two newlines, so it will be a separate paragraph.

This line is also begins a separate paragraph, but…
This line is only separated by a single newline, so it's a separate line in the same paragraph.

Notes

The next block should appear on the right side of this paragraph.

::: note{.note}

Note's header

Some extra content :::

Embed

Youtube:

https://youtu.be/ns2M0BIn4bI

https://www.youtube.com/watch?v=ns2M0BIn4bI

Twitter:

https://twitter.com/vuejsdevelopers/status/1278406520078839810?s=20

Codepen:

https://codepen.io/madvic/pen/MOyqEg?tabs=result,html

CodeSandbox:

https://codesandbox.io/s/input-mask-hack-3torj

Facebook:

https://www.facebook.com/zuck/posts/10112048980882521


  1. The footnote appears at the bottom of the page

Синхронизация проектов при помощи SparkleShare

Главной проблемой при использовании облачного хранилища для синхронизации фронт-энд (или, например, проектов на Node.js) проектов между компьютерами, в отличии от VCS, является то, что в облако загружается огромная куча мусора в виде сторонних библиотек, логов, временных файлов и т. д. В общем, всё то, что при использовании VCS мы обычно добавляем в игнор. По размерам обычно это не так много, но вот количество не нужных файлов бывает огромным. А все мы знаем как медлительны облачные хранилища с загрузкой большого количества маленьких файлов. Куда как быстрее проинсталировать всё необходимое для проекта заново, чем ждать пока оно выгрузится из облака.

Долгое время я мирился с «медленностью» Dropbox. Однако клиент Dropbox сильно загружает систему, заставляя кулер моего макбука шуметь как китайский фен. Попытка перенести всё в облако Mail.ru (оно значительно быстрее Dropbox и кроме того, я успел обзавестись там бесплатным 1TB) продлилась три дня и вынудила искать более радикальные решения. И в этот момент я вспомнил про небольшой проект, который несколько лет назад попался мне на глаза, но не произвёл на меня тогда должного впечатления.

Если стоит выбор между удобством облачного хранилища и гибкостью VCS, почему бы не объединить всё это в одно целое? И вот тут на помощь нам приходит SparkleShare. Эта утилита превращает любые удалённые Git-репозитории в облачные хранилища. При этом, так как в основе принципа работы использован всё же Git, можно совершенно спокойно добавить в репозиторий файл .gitignore и исключить весь мусор, который так досаждал вам всё это время. При этом, как и Dropbox, SparkleShare отслеживает любые изменения в папке или на сервере и автоматически их синхронизирует. Вот так просто: создаёте репозиторий на каком-нибудь Bitbucket и добавляете в клиент. Причём репозиториев можно добавлять много.

Плюсы

  • Скорость загрузки несравнимо выше чем у обычного «облака», так как при изменении файлов, на сервер загружается не файл, а его разница с предыдущей версией.
  • Можно добавлять много репозиториев, каждый из которых будет синхронизировать по отдельности.
  • Можно использовать .gitignore для управления исключениями.
  • При помощи не хитрого скрипта, можно поднять свой собственный сервер с репозиториями (например на NAS).
  • Всегда быстро и легко можно откатить нужные файлы, используя все преимущества Git.
  • Клиент общается с удалёнными репозиториями через SSH.
  • Всё это бесплатно.

Минусы

  • Клиент имеет довольно ограниченный функционал: он умеет только добавлять новые репозитории и отображать статус синхронизации.
  • Нет практически никаких настроек (чтобы изменить корневую папку, например, придётся вручную изменить файл настроек).
  • Удалённый репозиторий прописывается клиентом как origin.
  • Иногда, если закомитить проект вручную, клиент перестаёт следить за изменениями (это не точно).
  • Использование Git не располагает для загрузки файлов больших размеров.
  • Разработка SparkleShare идёт медленно и урывками неравнодушными энтузиастами.

Человеческий фактор

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

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

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

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

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

Виртуальный хостинг → VPS

Переехал с некогда горячо любимого хостинга Nano.lv, которым пользовался более 8 лет, на DigitalOcean.

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

Да, трудностей с настройками несравнимо больше, но за $5 в месяц то можно приложить усилия.

Саппорт или «Чем я могу вам помочь?»

Одна из самых, казалось бы, полезных вещей, и в то же время, одна из самых тупых — поддержка пользователей или customer support.

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

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

Хочешь ты заказать в американском интернет-магазине определённый товар с доставкой внутри страны (чтобы коллега, который в данный момент за океаном в командировке, потом спокойно привёз тебе заказ домой), уточняешь у саппорта касательно нужной тебе модели и первое, что ты слышишь в ответ — «Мы не доставляем в вашу страну». Ну да, они же сразу по IP посмотрели, хуле я тут пишу им.

Или тот же товар, аналогичный вопрос, но уже в другом магазине. Нет в наличии, но полно в розничных магазинах (крупная сеть магазинов в каждом штате). И ближайший такой магазин всего в нескольких кварталах от нужного тебе адреса доставки. Спрашиваешь, «Можно?». «Данного товара в данный момент нет на складе. А из магазинов мы не доставляем.» А склад, ни много, ни мало, на другом конце страны.

Или вот техническая поддержка. Сколько надо терпения, чтобы переписываться с саппортом одного проекта, который, между прочим предлагает зарегистрироваться из любой страны, где для получения всех привелегий зарегистрированного пользователя, необходимо пройти верификацию личных данных и адреса: прислать отсканированную копию удостоверения личности и (внимание!) либо банковскую выписку за последние полгода, в которой указан адрес проживания, либо квитанции об оплате комунальных услуг, с указанием того же адреса. И (внимание!) всё это на английском языке. На все попытки объяснить, что анлийский язык не является официальным для всех стран, и что в банковской выписке не пишут адрес проживания, саппорт вежливо из раза в раз присылает тебе ссылку на их документацию, «где написано как надо проходить верификацию».

Или, например, не понимаешь ты, почему eBay в Ирландии показывает автоматически цены в евро, а в твоей стране (да, на мобильных устройствах можно выбрать Латвию) — в долларах США, хотя евро уже официальная валюта. И ты начинаешь двухнедельную переписку в жалких потугах объяснить саппорту, что «ай-яй-яй, не хорошо», на что саппорт недоумённо хлопает глазками и сыплет ссылками на «мануал» не по делу. И вроде много лет пишешь техническую документацию на английском, а «носитель» тебя, вроде как не понимает.

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

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

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

Вэб-сервер на localhost

Вэб-сервер на localhost

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

python -m SimpleHTTPServer 8080

Эта команда запускает простой вэб-сервер на вашей машине ровно в той папке, из которой вы её запускаете. Или если у вас в системе имеется PHP, то можно Python заменить на него:

php -S 0.0.0.0:8080

Для удобства можно добавить вот такую функцию:

function serve() {
  local port="${1:-8080}"
  (sleep 1 && open "http://localhost:${port}")&
  $(which php) -S 0.0.0.0:${port}
}

На большинстве Linux open надо заменить на xdg-open.

Теперь достаточно для запуска набрать:

serve 8080

В этом случае у вас ещё и поддержка PHP будет, а браузер заботливо откроет вам главную страницу.

Корпоративная почта

Удивляют предприятия, которые в для деловой переписки используют адреса электронной почты, зарегистрированные на популярных почтовых сервисах, вроде Gmail, Yahoo или, упаси боже, Inbox.lv. И это при том, что, зачастую, у них есть свой домен и сайт.

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

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