недавно
Я так понимаю определение там только по группе товаров? Сорт не определяет, а тех же яблок может быть десяток сортов.
недавно
Видел такие, уже перестали работать 😄
На работе на одном проекте столкнулся в 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то письмо тоже придёт!
Представьте, сколько десятков тысяч комбинаций можно сделать с точками и изменениями регистра букв. Можно насоздавать тысячи вредительских аккаунтов, если сайт не защитился от этой "фишки" гуглопочты. Банить устанешь.
Недавно вышла ChatGPT 5, а предыдущая ChatGPT 4 была отключена. И появилось куча новостей и постов - люди просят вернуть старую ЧатЖПТ четвёртой версии, потому что они с ней общались, она была другом-помощником и даже психотерапевтом. А новая пятёрка оказалась менее поддакивающей, более сухая и людей это оттолкнуло.
У людей возникла психологическая зависимость от общения с ИИ. Нейросеть стала другом и советником, который всегда может поддержать добрым словом.
В будущем людям не нужны будут настоящие друзья-люди. Чем плох робот? Ничем. Представьте, что у вас будет человекоподобный робот, который будет всегда рядом с вами в трудную минуту. Он будет умён и тактичен, всегда поможет при необходимости. Он не предаст и не будет занят, с ним будет интересно, потому что он подстроится под вас, но в нужную минуту убережёт от опасности.
Роботы со встроенным ИИ будут ходячими психотерапевтами и друзьями. Это наше будущее.
У людей возникла психологическая зависимость от общения с ИИ. Нейросеть стала другом и советником, который всегда может поддержать добрым словом.
В будущем людям не нужны будут настоящие друзья-люди. Чем плох робот? Ничем. Представьте, что у вас будет человекоподобный робот, который будет всегда рядом с вами в трудную минуту. Он будет умён и тактичен, всегда поможет при необходимости. Он не предаст и не будет занят, с ним будет интересно, потому что он подстроится под вас, но в нужную минуту убережёт от опасности.
Роботы со встроенным ИИ будут ходячими психотерапевтами и друзьями. Это наше будущее.
OpenAI зарелизили ChatGPT 5 - очередную самую крутую модель своей нейросети. А что в итоге?
Мой промпт:
До этого спрашивал у 4-ки - предлагал ставить vite-bundle-visualizer. Сразу говорю - это не надо делать, всё уже есть встроенное. Сегодня появилась возможность спросить у 5-ки - повторно спросил. Пятый ChatGPT опять предлагает поставить пакет, на этот раз rollup-plugin-visualizer.
Окей, пытаюсь добиться у него информации, которая должна по моему мнению быть показана в ответе (CLI команды), ChatGPT 5 выдаёт:
Мой промпт:
Я делаю build nuxt 3 / nuxt 4 приложения. Как понять в какие чанки какие файлы залезли? Почему чанки такие большие?
До этого спрашивал у 4-ки - предлагал ставить vite-bundle-visualizer. Сразу говорю - это не надо делать, всё уже есть встроенное. Сегодня появилась возможность спросить у 5-ки - повторно спросил. Пятый ChatGPT опять предлагает поставить пакет, на этот раз rollup-plugin-visualizer.
Окей, пытаюсь добиться у него информации, которая должна по моему мнению быть показана в ответе (CLI команды), ChatGPT 5 выдаёт:
Пытаюсь узнать про "npx nuxi analyze", он ищет в интернете и долго думает и всё равно выдаёт:






