недавно
Я так понимаю определение там только по группе товаров? Сорт не определяет, а тех же яблок может быть десяток сортов.
недавно
Видел такие, уже перестали работать 😄
К примеру, я терпеть не могу ходить в Магнит и Солнечный круг (ростовская сеть). Могу пойти в Пятерочку, а вот в Перекресток схожу с удовольствием. Особняком стоит ВкусВилл, всё-таки это совсем другой выбор продуктов. Гипермаркеты не беру, туда я при прочих равных ни ногой, очень много времени отнимают.
Так вот про ближайшие ко мне в центре города. Выбор продуктов примерно одинаковый, разница в свежести товара, особенно фруктов и овощей, в наличии просрочек, а еще в чистоте зала, качестве обслуживания, удобстве - кассы быстрого обслуживания.
Начну с плохого. В Солнечном круге отвратные плесневелые фрукты и овощи, часто бывают просроченные молочные продукты, спасибо честному знаку, их касса не пропускает, вечно грязь на полу, даже на входе, бывает, лежат картонки как в 90е, и снаружи не убираются урны и грязные стены и ступени, а еще не всегда приветливый персонал и нет касс самообслуживания. Ах да, еще воняет курицей гриль из печки, неужели их сейчас кто-то покупает. Но бывает альтернативный ассортимент продуктов. Первое место в антирейтинге, это самый ближайший к дому магазин, поэтому всё-таки хожу.
В Магните часто все заставлено высокими каталками пустыми или с товаром, видимо, совсем нет склада, куда можно убрать, но они загораживают товар и создают ощущение беспорядка. Персонал специфический, по свежести овощей и фруктов нареканий почти нет, есть человек, который ими занимается, по чистоте в целом тоже ок. А вот на просрочку попадала. Есть кассы самообслуживания. Троечку можно поставить.
Следующий супермаркет Пятерочка зарабатывает твердую четверку. Особенно после модернизации магазина рядом с домом. Там поставили самокассы, кассиры, кстати, работают все уже давно, чисто, пахнет выпечкой, фрукты и овощи свежие. Почему 4? Ну, скажем, чуть не дотягивает до идеального в моём понимании магазина. Какие-то мелочи портят впечатление, например, дверцы холодильника не закрываются, и иногда подводит ассортимент, например, нет хорошей мороженой рыбы.
А если у меня есть время и желание нести сумки, то я выберу при прочих равных Перекресток. Чисто, светло, есть кассы самообслуживания. А вот по свежести продуктов и персоналу хочу отдельно сказать. Недавно слышала разговор заведующей отделом с сортировщикам фруктов. Сортировщик спросил, оставлять ли такое яблоко на полке.А руководитель ответила: «Ты себе домой взял бы такое? Нет, значит убирай.» Это говорит о многом. Да, возможно, в Перекрёстке выше цены, но отношение к работе, к магазину, к клиенту явно отличается.
Наверное, состояние супермаркета зависит от руководителя, не могу говорить о других магазинах этих сетей, но ведь каждая торговая точка работает на рейтинг бренда в целом. И даже в другом районе, и в другом городе я буду понимать, в какой магазин в пойду в первую очередь, а какой обойду стороной.
Так вот про ближайшие ко мне в центре города. Выбор продуктов примерно одинаковый, разница в свежести товара, особенно фруктов и овощей, в наличии просрочек, а еще в чистоте зала, качестве обслуживания, удобстве - кассы быстрого обслуживания.
Начну с плохого. В Солнечном круге отвратные плесневелые фрукты и овощи, часто бывают просроченные молочные продукты, спасибо честному знаку, их касса не пропускает, вечно грязь на полу, даже на входе, бывает, лежат картонки как в 90е, и снаружи не убираются урны и грязные стены и ступени, а еще не всегда приветливый персонал и нет касс самообслуживания. Ах да, еще воняет курицей гриль из печки, неужели их сейчас кто-то покупает. Но бывает альтернативный ассортимент продуктов. Первое место в антирейтинге, это самый ближайший к дому магазин, поэтому всё-таки хожу.
В Магните часто все заставлено высокими каталками пустыми или с товаром, видимо, совсем нет склада, куда можно убрать, но они загораживают товар и создают ощущение беспорядка. Персонал специфический, по свежести овощей и фруктов нареканий почти нет, есть человек, который ими занимается, по чистоте в целом тоже ок. А вот на просрочку попадала. Есть кассы самообслуживания. Троечку можно поставить.
Следующий супермаркет Пятерочка зарабатывает твердую четверку. Особенно после модернизации магазина рядом с домом. Там поставили самокассы, кассиры, кстати, работают все уже давно, чисто, пахнет выпечкой, фрукты и овощи свежие. Почему 4? Ну, скажем, чуть не дотягивает до идеального в моём понимании магазина. Какие-то мелочи портят впечатление, например, дверцы холодильника не закрываются, и иногда подводит ассортимент, например, нет хорошей мороженой рыбы.
А если у меня есть время и желание нести сумки, то я выберу при прочих равных Перекресток. Чисто, светло, есть кассы самообслуживания. А вот по свежести продуктов и персоналу хочу отдельно сказать. Недавно слышала разговор заведующей отделом с сортировщикам фруктов. Сортировщик спросил, оставлять ли такое яблоко на полке.А руководитель ответила: «Ты себе домой взял бы такое? Нет, значит убирай.» Это говорит о многом. Да, возможно, в Перекрёстке выше цены, но отношение к работе, к магазину, к клиенту явно отличается.
Наверное, состояние супермаркета зависит от руководителя, не могу говорить о других магазинах этих сетей, но ведь каждая торговая точка работает на рейтинг бренда в целом. И даже в другом районе, и в другом городе я буду понимать, в какой магазин в пойду в первую очередь, а какой обойду стороной.
Я люблю получать кэшбек и всегда с интересом изучаю предложения по этому поводу от тех сервисов, которыми пользуюсь. Так, когда мне аж три года назад выпала возможность опробовать подписку Пакет, включающую в себя программу лояльности Пятерочки и Перекрестка, не отказалась. Тогда она мне стоила один рубль. Но на следующий месяц я уже с удовольствием продила ее за свои кровные - сначала 99 рублей в месяц, потом и 199 рублей. Ну оно того стоит.
(Скриншот с сайта подписки)
(Скриншот с сайта подписки)
Сразу скажу: важно обратить внимание именно на "ДО". Да, бывает до 50% кэшбека. Например, за кофе из Пятерочки/Перекрестка я получаю ровно половину стоимости обратно (четыре стаканчика - и подписку окупила). За любимые категории, которых тут дается 5 - 20%. А за остальные покупки - 5%. Но в общем выходит неплохо. И еще по три бесплатные доставки из обоих магазинов. Тоже неплохая экономия выходит.
На работе на одном проекте столкнулся в Nuxt 4 с проблемой, когда в page-компоненте нужно делать разные редиректы через navigateTo() по различным условиям в процессе выполнения setup функции. Примерно так:
Тут возникает проблема: в конечном итоге срабатывает редирект на самый последний урл, т.е. в коде выше переход будет на /?abc=4. Я порылся в документации, не нашёл ничего встроенного, чтобы избежать срабатывания последующих вызовов navigateTo. Вроде как это поведение связано с vue router.
Вот так написать тоже нельзя:
Пришлось делать единственное решение - это завести boolean-переменную и проверять уже её.
<template>
Some page
</template>
<script lang="ts" setup>
if (1 + 1 === 2) {
await navigateTo('/?abc=1', {
redirectCode: 302,
});
}
if (2 + 2 === 4) {
await navigateTo('/?abc=2', {
redirectCode: 302,
});
}
if (3 + 3 === 6) {
await navigateTo('/?abc=3', {
redirectCode: 302,
});
}
if (4 + 4 === 8) {
await navigateTo('/?abc=4', {
redirectCode: 302,
});
}
</script>
Тут возникает проблема: в конечном итоге срабатывает редирект на самый последний урл, т.е. в коде выше переход будет на /?abc=4. Я порылся в документации, не нашёл ничего встроенного, чтобы избежать срабатывания последующих вызовов navigateTo. Вроде как это поведение связано с vue router.
Вот так написать тоже нельзя:
if (1 + 1 === 2) {
await navigateTo('/?abc=1', {
redirectCode: 302,
});
return; // так нельзя в script setup
}
Пришлось делать единственное решение - это завести boolean-переменную и проверять уже её.
let isAlreadyRedirected = false;
if (1 + 1 === 2) {
await navigateTo('/?abc=1', {
redirectCode: 302,
});
isAlreadyRedirected = true;
}
if (!isAlreadyRedirected && 2 + 2 === 4) {
await navigateTo('/?abc=2', {
redirectCode: 302,
});
isAlreadyRedirected = true;
}
if (!isAlreadyRedirected && 3 + 3 === 6) {
await navigateTo('/?abc=3', {
redirectCode: 302,
});
isAlreadyRedirected = true;
}
if (!isAlreadyRedirected && 4 + 4 === 8) {
await navigateTo('/?abc=4', {
redirectCode: 302,
});
isAlreadyRedirected = true;
}
Ещё раз - это единственное, что решило проблему. Если у вас есть какое-то другое решение, напишите плиз.На любом собесе по system design и хайлоаду вас наверняка спросят про пагинацию. И вопрос этот с подвохом, т.к. на хайлоаде БД очень большие, с миллионами записей. Например, спросят как сделать бесконечную ленту последних постов с подгрузкой. И тут главное не обос****ться как я сделал на своем собесе 😂
Итак, что мы знаем про курсоры? В PostgreSQL есть самые настоящие курсосы! Они так и называются CURSOR. В постгресе они работают только внутри транзакций.
Обратите внимание, что обязательны транзакция и конкретное имя для курсора. Можно ли это использовать в вебе? Нет. Но я на собесе начал заливать про эти курсоры постгреса и про хранение имен курсоров, хотя непонятно как это все реализовать для веба. Типа не закрывать некоторое время транзакцию и держать открытой некоторое время пока идут http запросы? 😂
Короче, в веб разработке есть так называемые курсоры, которые никакими курсорами на самом деле не являются. Это обычные WHERE условия в SQL! Но за каким-то х***м это называется курсором.
Вот SQL получения первого списка постов для ленты:
Далее браузер в http запросе для получения следующих 20 постов передает payload:
И бэк делает SQL запрос:
Вот эта строка:
Такой запрос с псевдо-курсором намного быстрее, чем юзанье OFFSET когда постгрес читает все подходящие записи в таблице и тут же скипает часть их.
Итак, что мы знаем про курсоры? В PostgreSQL есть самые настоящие курсосы! Они так и называются CURSOR. В постгресе они работают только внутри транзакций.
BEGIN; DECLARE zhopa_cursor CURSOR FOR SELECT id, title, created_at FROM posts; -- Получаем 10 строк: FETCH 10 FROM zhopa_cursor; -- Получаем еще следующие 10 строк сразу после места, где остановились до этого: FETCH 10 FROM zhopa_cursor; CLOSE zhopa_cursor; COMMIT;
Обратите внимание, что обязательны транзакция и конкретное имя для курсора. Можно ли это использовать в вебе? Нет. Но я на собесе начал заливать про эти курсоры постгреса и про хранение имен курсоров, хотя непонятно как это все реализовать для веба. Типа не закрывать некоторое время транзакцию и держать открытой некоторое время пока идут http запросы? 😂
Короче, в веб разработке есть так называемые курсоры, которые никакими курсорами на самом деле не являются. Это обычные WHERE условия в SQL! Но за каким-то х***м это называется курсором.
Вот SQL получения первого списка постов для ленты:
SELECT id, title, created_at FROM posts ORDER BY created_at DESC, id DESC LIMIT 20;
Далее браузер в http запросе для получения следующих 20 постов передает payload:
"last_created_at": "2026-01-15 12:30:00+00", "last_id": 12345,
И бэк делает SQL запрос:
SELECT id, title, created_at FROM posts WHERE (created_at, id) < ($1, $2) ORDER BY created_at DESC, id DESC LIMIT 20;
Вот эта строка:
WHERE (created_at, id) < ($1, $2)это и есть как бы наш курсор, хотя нифига это не курсор.
Такой запрос с псевдо-курсором намного быстрее, чем юзанье OFFSET когда постгрес читает все подходящие записи в таблице и тут же скипает часть их.
Ну что, любая тема для горячих споров - сравнение "там и тут". Смотрим на цены на продукты в крупных супермаркетах Англии и России. Перекрёсток играет за Россию, а Tesco за Англию, хотя, корректнее говорить Великобритания, ведь Англия - это только часть Соединённого Королевства.
Курс британского фунта считаем 105,69 рублей. Цены у Tesco окончательные, все налоги включены в отличие США, где "врут" с ценами, не добавляя в них налоги.
Сыр Чеддер в Теско. Это совершенно обычный английский сыр.
Курс британского фунта считаем 105,69 рублей. Цены у Tesco окончательные, все налоги включены в отличие США, где "врут" с ценами, не добавляя в них налоги.
Сыр Чеддер в Теско. Это совершенно обычный английский сыр.
£3.35 за пачку 400 грамм или £8.38 за кило. В рублях это 885,6822 рублей за кило.
Перекрёсток, сыр Брест-Литовск Гауда, полутвердый 45%, 200г.
Перекрёсток, сыр Брест-Литовск Гауда, полутвердый 45%, 200г.
Очередной миф на сайте "Современный учебник JavaScript":
https://learn.javascript.ru/comparison
https://learn.javascript.ru/comparison
Цитата:
Откуда дровишки? Правда о JavaScript написана только в одном месте - в документации языка. Поэтому смотрим доку:
https://262.ecma-international.org/16.0/index.html
Ага, значит, ищем IsLooselyEqual:
Вот и весь ответ. В JS есть чёткий алгоритм нестрогого сравнения, который назван IsLooselyEqual, а всё остальное - отсебятина.
В Javascript при нестрогом сравнении null равен undefined не потому, что они оба привелись к 0, а потому что в пункте 2 чётко сказано, если первый оператор null и второй оператор undefined, то нужно вернуть true.
При сравнении значений разных типов JavaScript приводит каждое из них к числу.
Откуда дровишки? Правда о JavaScript написана только в одном месте - в документации языка. Поэтому смотрим доку:
https://262.ecma-international.org/16.0/index.html
EqualityExpression : EqualityExpression == RelationalExpression 1. Let lRef be ? Evaluation of EqualityExpression. 2. Let lVal be ? GetValue(lRef). 3. Let rRef be ? Evaluation of RelationalExpression. 4. Let rVal be ? GetValue(rRef). 5. Return ? IsLooselyEqual(rVal, lVal).
Ага, значит, ищем IsLooselyEqual:
The abstract operation IsLooselyEqual takes arguments x (an ECMAScript language value) and y (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. It provides the semantics for the == operator. It performs the following steps when called: 1. If SameType(x, y) is true, then a. Return IsStrictlyEqual(x, y). 2. If x is null and y is undefined, return true. 3. If x is undefined and y is null, return true. 4. NOTE: This step is replaced in section B.3.6.2. 5. If x is a Number and y is a String, return ! IsLooselyEqual(x, ! ToNumber(y)). 6. If x is a String and y is a Number, return ! IsLooselyEqual(! ToNumber(x), y). 7. If x is a BigInt and y is a String, then a. Let n be StringToBigInt(y). b. If n is undefined, return false. c. Return ! IsLooselyEqual(x, n). 8. If x is a String and y is a BigInt, return ! IsLooselyEqual(y, x). 9. If x is a Boolean, return ! IsLooselyEqual(! ToNumber(x), y). 10. If y is a Boolean, return ! IsLooselyEqual(x, ! ToNumber(y)). 11. If x is either a String, a Number, a BigInt, or a Symbol and y is an Object, return ! IsLooselyEqual(x, ? ToPrimitive(y)). 12. If x is an Object and y is either a String, a Number, a BigInt, or a Symbol, return ! IsLooselyEqual(? ToPrimitive(x), y). 13. If x is a BigInt and y is a Number, or if x is a Number and y is a BigInt, then a. If x is not finite or y is not finite, return false. b. If ℝ(x) = ℝ(y), return true; otherwise return false. 14. Return false.
Вот и весь ответ. В JS есть чёткий алгоритм нестрогого сравнения, который назван IsLooselyEqual, а всё остальное - отсебятина.
null == undefined; // вернёт true
В Javascript при нестрогом сравнении null равен undefined не потому, что они оба привелись к 0, а потому что в пункте 2 чётко сказано, если первый оператор null и второй оператор undefined, то нужно вернуть true.
Чтобы мозг не раскисал, учу Си. Язык простой и одновременно довольно сложный. А ещё в нём есть куча undefined behaviour - неопределённое поведение компилятора для пограничных случаев, которых на самом деле масса.
Вот пример простейшей функции:
& - это оператор побитового И, который сравнивает последовательно биты двух чисел и ставит в соответствующий бит возвращаемого числа 1, только если оба бита - это 1, иначе поставит туда 0.
Вроде всё просто и кажется, что функция всегда должна вернуть 0, ведь "побитовый и" с нулём всегда вернёт ноль.
Но проблема кода здесь связана со спецификацией Си. Код небезопасен, потому что теоретически компилятор может делать всё что угодно! Программа может "упасть", компилятор может удалить код и прочее. Компилятор имеет право делать что угодно в этом случае. Undefined behaviour - это поведение программы, для которого стандарт языка не накладывает никаких требований, стандарт не говорит, что должно или не должно произойти!
Т.е. писать код таким образом в Си - опасно. Даже переполнение обычного signed int (он же просто int) в Си - это уже undefined behaviour!
Вот пример простейшей функции:
int get_zero(void) {
int num;
return num & 0;
}
Переменная num не инициализирована, значит там могут сидеть любые "мусорные" биты.& - это оператор побитового И, который сравнивает последовательно биты двух чисел и ставит в соответствующий бит возвращаемого числа 1, только если оба бита - это 1, иначе поставит туда 0.
Вроде всё просто и кажется, что функция всегда должна вернуть 0, ведь "побитовый и" с нулём всегда вернёт ноль.
123 // 00000000 00000000 00000000 01111011 0 // 00000000 00000000 00000000 00000000Сравнение битов двух чисел выше всегда вернёт 0, т.к. второе число тоже 0. Неважно, какие там будут биты у первого числа, всегда в итоге 0.
Но проблема кода здесь связана со спецификацией Си. Код небезопасен, потому что теоретически компилятор может делать всё что угодно! Программа может "упасть", компилятор может удалить код и прочее. Компилятор имеет право делать что угодно в этом случае. Undefined behaviour - это поведение программы, для которого стандарт языка не накладывает никаких требований, стандарт не говорит, что должно или не должно произойти!
Т.е. писать код таким образом в Си - опасно. Даже переполнение обычного signed int (он же просто int) в Си - это уже undefined behaviour!
int x = 2147483647; // Максимальное значение x = x + 1; // Опачки - undefined behaviour - рисково!Вот такое приходится учить. А кто-то жалуется на сложности Golang.
На многих сайтах регистрация аккаунта осуществляется через email-адрес. Одно мыло - один аккаунт, вроде всё просто. Если забанить такого пользователя, то он не сможет зарегистрироваться снова на тот же самый email. Но это теоретически.
А практически при наличии одной электронной почты на Gmail можно создавать в интернет-сервисах огромное количество аккаунтов, не меняя адреса. Дело в том, что Gmail игнорирует регистр символов и наличие точек в имени пользователя.
Допустим есть пользователь c такой гугловской почтой:
Сколько таких комбинаций возможно? Очень много!
Мало того, можно подобавлять точки в адрес:
Даже если убрать точки из оригинала:
Представьте, сколько десятков тысяч комбинаций можно сделать с точками и изменениями регистра букв. Можно насоздавать тысячи вредительских аккаунтов, если сайт не защитился от этой "фишки" гуглопочты. Банить устанешь.
А практически при наличии одной электронной почты на Gmail можно создавать в интернет-сервисах огромное количество аккаунтов, не меняя адреса. Дело в том, что Gmail игнорирует регистр символов и наличие точек в имени пользователя.
Допустим есть пользователь c такой гугловской почтой:
vasya.pupkin.example@gmail.comЕсли поменять регистр букв в имени юзера и отправить письмо на:
Vasya.PUPkin.example@gmail.comто ему придёт письмо в настоящий ящик!
Сколько таких комбинаций возможно? Очень много!
Мало того, можно подобавлять точки в адрес:
va.s.ya.pu.p.k.in.example@gmail.comи ему тоже придёт письмо в ящик-оригинал.
Даже если убрать точки из оригинала:
vasyapupkinexample@gmail.comто письмо тоже придёт!
Представьте, сколько десятков тысяч комбинаций можно сделать с точками и изменениями регистра букв. Можно насоздавать тысячи вредительских аккаунтов, если сайт не защитился от этой "фишки" гуглопочты. Банить устанешь.






