No title here

Обо всём на свете в каждом номере

# 93. Лавр

Сегодня у нас в программе отзыв.

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

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

Он посвятил свою жизнь служению, но непонятно кому: любимой, Богу или себе? Я вот не знаю ответа на этот вопрос, не нашёл его в книге. Кажется, что не любимой, не смотря на то, что он постоянно с ней беседует. Скорее это просто спасение от одиночества, которое он считает каким-то особым жестом в память о ней. Вряд ли и Богу, хоть он и предельно верующий персонаж. Кажется, что он делал это всё для себя, просто ни разу об этом не сказав и не подумав. Излечивая других он старался доказать себе, что он может и должен; что случившееся с его возлюбленой – это не его ошибка (хотя нельзя сказать с полной уверенностью, что его).

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

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

В общем, рекомендую всем прочитать. Книга явно стоит потраченного на неё времени. Не уверен, что вы будете её перечитвать, скорее даже наоборот. Но она явно останется где-то рядом с вами надолго.

# 92. Переменные в javascript

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

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

В javascript’е есть пара ключевых слов, чтобы объявить переменную: var и let. На собеседованиях очень любят спрашивать про var, потому что в нём больше подводных камней. Так, например, переменная объявленная через var “поднимается” (по англ. hoisting) по вашему блоку кода (функции в общем случае) к его началу. Посмотрим на следующий код:

function foo() {
    if (!hoisted) {
        console.log('defined undefined');
    }

    var hoisted = true;
}

foo();

Хотелось, чтобы в рантайме было выброшено исключение о том, что переменной hoisted не существует, но этого не произойдёт – переменная будет объявлена и ей присвоится значение undefined.

Если бы мы объявили hoisted с помощью let, то получили бы, как надо, reference error – hoisted is not defined.

Теперь немного усложним:

function foo() {
    if (!hoisted) {
        console.log('defined undefined');
    }

    hoisted = true;
}

foo();

Внезапно этот код много где может отработать, несмотря на то, что hoisted никогда не определяется. Всё потому, что при выполнении кода, такая запись будет рассматриваться интерпретатором как присвоение значения свойству (некоторого объекта). Чтобы определить какому, мы бежим по scope chain до самого корня, не находим это поле в нашей цепочке и создаём его в глобальном объекте, который равен window. Если бы нашли, то присвоили бы найденной переменной значение.

Кроме прочего, объявление переменной без var не позволит сборщику мусора удалить выделенную под неё память, ведь она будет полем объекта, а объект всё ещё нужен для работы.

Всё будет иначе (и, пожалуй, как надо), если сделать так:

'use strict';

function foo() {
    if (!hoisted) {
        console.log('defined undefined');
    }

   hoisted = true;
}

foo();

Замечаем небольшое изменение – ‘use strict’. Эта директива включает особый режим языка, в котором такие вольности не позволяются и будет выброшена ошибка ReferenceError.

А вот задачка:

function foo() {
    if (false) {
        var hoisted = true;
    }

    console.log(hoisted); // что случится в этом месте?
}

foo();

Предлагаю подумать, каким будет вывод и только потом читать следующий параграф.

Если бы мы использовали let, то вывод, как мы обсуждали раньше, привёл бы к ошибке ReferenceError. Здесь же получится, что мы объявили переменную, она всплыла до вершины блока (в данном случае к началу функции foo) и была инициализирована значением undefined.

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

'use strict';

x = 5;

console.log(++x);
console.log(x++);

function test() {
    console.log(x);

    x += 10;

    console.log(x);
    console.log(typeof x);

    var x = 15;
    console.log(x);
}

test();
console.log(x);

Интересные ссылки:

  1. https://www.ecma-international.org/ecma-262/8.0/index.html#sec-variable-statement
  2. stackoverflow

# 91. За гранью

Соблюдая все правила предосторожности, исполнил.

#90. Chrome status

Надо куда-то закинуть ссылку, чтобы не потерялась. В закладки неудобно, потому что заходить на неё надо редко, а если куда-то ещё, то потом просто не найдёшь. А тут оптимальный вариант.

Список фич в текущем хроме

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

#89. Дружба docker и ufw

Чтобы заставить дружить Docker Version: 1.12.1 c ufw на убунте 16.04, создаём (или открываем, если уже есть) файл /etc/docker/daemon.json и добавляем туда следующее:

{
    "iptables": false
}

Делаем рестарт докера и всё работает.

UPD: на самом деле отхватим потом при таком подходе к решению, так что это только на крайний случай.

#88. Как обновить postgresql

Да, здесь надо прямо-таки обновлять. Нельзя просто взять и сказать update — тебя не поймут. У postgres’а целое приложение консольное есть, чтобы правильно обновиться.

Итак:

  1. Стопорим postgres. У всех по-разному, например service postgres stop;
  2. Выполняем команду:
    
initdb /usr/local/var/postgres_version -E utf8
    postgres_version меняем на что-то более вменяемое, типа postgres9.6.1. C параметром -E всё понятно – кодировка темплейта (кто знает, что такое темплейт, – добро пожаловать в комментарии). Все базы будут иметь эту кодировку по умолчанию при создании;
  3. Дальше запускаем следующую красоту:
    pg_upgrade -v \
         -d /usr/local/var/postgres \
         -D /usr/local/var/postgres_version \
         -b /usr/local/Cellar/postgresql/9.5.4/bin/ \
         -B /usr/local/Cellar/postgresql/9.6.1/bin/
    Здесь -d — старая директория данных, -D – новая директория, которую мы указали в шаге 2, -b — старая директория, где стоит postgres, -B — директория новой версии postgres;
  4. Меняем местами старую и новую базы:
    cd /usr/local/var
    mv postgres postgres9.5.4
    mv postgres9.6.1 postgres
    Если при установке вы решили блеснуть мастерством и поменяли пути, то тут надо подставлять ваши директории;
  5. Рестартуем postgres и получаем удовольствие. Но если не повезло, то идём читать логи, stackoverflow и хабр.

Немного линков: initdb, pg_upgrade.

#87. «Среда обитания. Как архитектура влияет на наше поведение и самочувствие»

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

Ну и несколько выделенных моментов:

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

Зачем мы строим:

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

Ну и куда же без фракталов:

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

И доля отрицания, нельзя же просто сказать, что фракталы – это всё:

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

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

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

Как мы бежим от скукоты и уныния:

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

Осталось только понять, что такое подразумевается под “невыразительными” и под “дружелюбными” фасадами.

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

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

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

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

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

#86. Подсветка синтаксиса тестов в WebStorm

Чтобы убрать упоминания о недоступности методов describe и it в тестовом mocha файле:

  1. Надо в настройках WebStorm зайти в Languages & Frameworks -> Javascript -> Libraries
  2. Нажать Download, найти в огромном списке mocha и скачать
  3. Нажимать Ok до конца

Аналогичная история для expect и jasmine.

#84. Офигенный сборник статей про ES6

Офигенный сборник статей про фичи в ES6, их работу и применение в реальной жизни. Для меня особенно интересно было про Symbol и Proxy.

После прочтения заглянул в таблицу совместимости и взгрустнул. Всё зелено до колонки IE11, где почти всё красное. Учитывая то, что микрософт, похоже, будет двигать только Edge, а 11 только поддерживать, выглядит это удручающе. Это, конечно, не IE9, но легче от этого не становится. Значимое количество людей (которое не позволит отказаться от поддержки) будет заставлять нас творить полифилы, не использовать прекрасные Proxy, Symbol и ...extend Array.

https://hacks.mozilla.org/category/es6-in-depth/

Earlier Ctrl + ↓