code_notes
71 subscribers
136 photos
1 video
134 links
учусь делать веб

обратная связь: t.me/dmorenogogoleva
Download Telegram
немного не по теме, но тоже важно

про cors
если запрос является сложным или/и имеет заголовки, отличные от стандартных, то сначала браузер делает preflight-реквест options для того чтобы найти allow-access-origin заголовки
и если он их нашёл и домен, с которого мы отправляем запрос, указан на сервере как разрешённый, после этого выполняется запрос, который мы посылали изначально

подробности: https://grishaev.me/cors/
скалярные типы переменных это то же самое что и простые типы переменных

то есть это строка, число, булин
Object.freeze замораживает только первый уровень свойств

(мм джаваскрипт)

class Person {
constructor(name, hobby) {
this.name = name
this.hobby = hobby
}

sayHi() {
return `hello, my name is ${this.name}`
}

}

const person = Object.freeze(new Person('dasha', {label: 'poetry'}))

person.name = 'masha'
console.log(person.name) //dasha

person.hobby.label = 'skiing'
console.log(person.hobby.label) //skiing
не могла найти файл конфигурации постгреса, но получилось через
  mdfind pg_hba.conf
Forwarded from Про
#js

function invocation like
func(arg1, arg2)


desugars to
func.call(this, arg1, arg2)
у меня много пет-проджектов и для каждого нужно настроить минимальную сборку

для книжки по функциональному программированию тоже захотелось иметь среду выполнения

конечно же create-react-app для этого случая слишком мощен (да и местный линтер меня раздражает), так что я взяла парсель и накрутила минимальной функциональности. В данном случае это — еслинт, рамбда и лоудаш

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

так что я написала небольшую заметчк:
https://medium.com/@twanttobealighi/%D0%BA%D0%B0%D0%BA-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C-%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5-%D0%B8%D0%BC%D0%BF%D0%BE%D1%80%D1%82%D1%8B-%D1%87%D0%B5%D1%80%D0%B5%D0%B7-babel-ceebc0bc7361
функция chain из lodash

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

обязательно нужно вернуть результат через .value()

пример:
_.chain('mememe')
.capitalize()
.value();

//Mememe

пример посложнее:
_.chain([36, 40, 1, 3, 1, 1, 1, 1])
.sort((a, b) => a - b)
.uniq()
.value();

// [1, 3, 36, 40]

тут важно заметить, что uniq это тоже лоудашевская функция, доступная внутри chain без _
функция высшего порядка это функция, которая в качестве аргументов принимает другие функции или возвращает функцию в качестве результата

например onEventListener

button.addEventListener("click", function() {
//do stuff
})
декоратор это функция, которая расширяет функционал переданной ей функции

пример:
hoc — функция, которая принимает компонент и возвращает новый компонент с расширенным функционалом

то есть hoc это частный случай декоратора
https://reactjs.org/docs/higher-order-components.html
вчера обсуждали с коллегами, решила записать
вернёмся к фп

_.chain(persons)
.filter(isValid)
.map(_.property('address.country'))
.reduce(gatherStats, {})
.values()
.sortBy('count')
.reverse()
.first()
.value()
.name; //-> 'US'


преимущество такой колбасы в том, что мы избегаем циклов и создания переменных — повышаем читаемость и сокращаем количество мест в которых можем ошибиться
в _.chain ничего не выполняется, пока не будет вызвана функция value() — где-то здесь и начинаются отложенные вычисления
_.mixin позволяет добавлять в лоудашевский (не только) объект свои методы

пример
  _.mixin({
test: () => 'hello world',
});


const res = _.test();

console.log(res);
// hello world
обратим внимание на вот такой объект примеси:

  _.mixin({
select: _.map,
from: _.chain,
where: _.filter,
sortBy: _.sortByOrder,
});

он делает js-код похожим на sql-запрос

_.from(persons)
.where(p => p.birthYear > 1903 && p.address.country !== 'US')
.sortBy(['firstname'])
.select(p => p.firstname)
.value();


sql супир
Рекурсия

Понять рекурсию несложно, нужно научиться мыслить рекурсивно

вот простая рекурсивная функция:
function sum(arr) {
if(_.isEmpty(arr)) {
return 0;
}
return _.first(arr) + sum(_.rest(arr));
}
sum([]); //-> 0
sum([1,2,3,4]);

у неё есть базовая ветвь или условие возврата
в нашем случае вот оно:
   if(_.isEmpty(arr)) {
return 0;
}

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

1 + sum[2,3,4]
1 + 2 + sum[3,4]
1 + 2 + 3 + sum[4]
1 + 2 + 3 + 4 + sum[]
1 + 2 + 3 + 4 -> halts, stack unwinds
1 + 2 + 7
1 + 9
10


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

дальше в книжке идёт несколько длинных примеров кода создания древовидной структуры и методов её обхода

главное что стоит запомнить:
- в родительском узле есть дети, а у детей есть ссылки на родителей
- в этом случае мы обходим дерево в ширину (а можно ещё и в глубину или рандомно или еще как-то)