Тяжело, не то что тестерам…
![Jspi Jspi](/assets/uploads/profile/uid-2/2-profileavatar-1716898959299.jpeg)
Jspi
Сообщения
-
Тяжело ли быть программистом? -
DeepSeek — новая китайская нейросетьКитай уничтожил ChatGPT — главная тема прямо сейчас. Китайский DeepSeek с командой в 200 человек за 3 дня обошёл ChatGPT в App Store.
За $6 млн китайцы создали то, на что OpenAI потратила $6,6 млрд и 4500 сотрудников. DeepSeek работает быстрее и бесплатно (а для россиян без VPN).
Второй удар: Alibaba представили новую модель Qwen2.5-1M, которая может бесплатно генерить картинки и видео, обрабатывать огромные (!) объёмы кода, книги и базы данных. Скорость обработки в 7 раз быстрее.
Дальше — больше. В ответ на $100 млрд Трампа на «суперкомпьютер» Китай выделяет $137 млрд на развитие ИИ.Взлёт DeepSeek связывают с падением рынка акций компаний из США и рынка криптовалют.
-
Выгорание в ИТ миф или нет?зато 300к в наносек
-
В чем разница между фронтендом и бекендом? -
JavaScript мемы@kirilljs эй, че сразу бить то…
-
Программисты раньше и сейчас -
Программисты c GPT и без
Раньше при ком-то такой фигни не было -
Проблема с дублированием данных при вызове return вместо reply.send - FastifyПользователь @kirilljs написал в Проблема с дублированием данных при вызове return вместо reply.send - Fastify:
const userService = new UserService();
Лучше не создавать сервис каждый раз в функции, это лишние затраты
-
Проблема с дублированием данных при вызове return вместо reply.send - FastifyВо первых ты описал
createNewUser()
как асинхронную функцию, и она у тебя ничего не возвращает, а также ты нигде await не используешь, у тебя тогда и try не будет ничего ловитьПопробуй вместо
userRepository.save(user)
написать асинхронную функцию простую (например таймер), и сделай там console.log(), посмотри сколько сообщений выдаст, сделай такой дебаггинг -
pm2 автоматический restart при перезагрузки сервераПользователь @kirilljs написал в pm2 автоматический restart при перезагрузки сервера:
Далее нам необходимо запустить скрипт startup, который как раз отвечает за автоматический запуск pm2 после перезагрузки сервера:
Поправка: команда startup просто показывает команду, при исполнении которой сервис pm2 будет загружать автоматически сохраненные процессы
-
PageProps Type Errors in Next.js. Type '{ slug: string; }' is missing the following properties from type 'Promise<any>'После обновления Next js до 15 версии, в динамических маршрутах разработчики некоторые изменения, что приведет к ошибкам при сборке проекта.
пример:
Type error: Type 'Props' does not satisfy the constraint 'PageProps'. Types of property 'params' are incompatible. Type '{ slug: string; }' is missing the following properties from type 'Promise<any>': then, catch, finally, [Symbol.toStringTag]
Разработчики сделали динамические параметры асинхронными, поэтому нужно будет поменять типы, и получать их мы должны, например, через
await
до 15 версии:
// СТАРЫЙ КОД type Props = { params: { slug: string; }; }; export async function generateMetadata({ params: { slug } }: Props) { const { category } = await fetchData(slug); ... } } export default async function Page({ params: { slug } }: Props) { const data = await fetchData(slug); ... }
после 15 версии:
// НОВЫЙ КОД type Props = { params: Promise<{ slug: string; }>; }; export async function generateMetadata(props: Props) { const { slug } = await props.params; const { category } = await fetchData(slug); ... } } export default async function Page(props: Props) { const { slug } = await props.params; const data = await fetchData(slug); ... }
-
Оптимизация React js приложений. Использование функции debounde()Пользователь @kirilljs написал в Оптимизация React js приложений. Использование функции debounde():
И почему onInput, а не onChange
onInput отлавливает все изменения значения в
<input />
, даже такие как нажатие клавиш и вставку текста, поэтому он предпочтительнее в данном случае -
Оптимизация React js приложений. Использование функции debounde()Пользователь @kirilljs написал в Оптимизация React js приложений. Использование функции debounde():
Простыми словами, мы колбэчим submitHandler через debounceHandler то как оно должно быть по спецификации JS
не понял вопроса, напомню, чтчо тут не используется никаких форм, фактически все обработчики привязаны к onInput событию, функция
debounce()
- самописная -
Оптимизация React js приложений. Использование функции debounde()Допустим мы имеем очень абстрактный компонент, который имеет поле ввода текста, кнопку отправки этого текста на сервер, и сообщение о состоянии отправки данных на сервер
Пример кода
// функция иммитации запроса на сервер function fakeFetch(val: string) { return new Promise<string>(function (resolve) { setTimeout(function () { resolve(`Сервер получил сообщение: ${val}`); }, 1000); }); } // самый простой пример компонента function App() { const [val, setVal] = useState(''); const [response, setResponse] = useState(''); const inputHandler = (e: React.ChangeEvent<HTMLInputElement>) => { setVal(e.target.value); setResponse(''); }; const submitHandler = async () => { setVal(''); setResponse('отправка ...'); const resp = await fakeFetch(val); setResponse(resp); }; return ( <> <input type="text" value={val} onInput={inputHandler} /> <button onClick={submitHandler}>Отправить</button> <p>{response}</p> </> ); }
Теперь перед нами встала задача заменить поведение: отправлять данные не по кнопке, а автоматически. Однако мы не может просто так повесить функцию в обработчик inputHandler(), мало того что он будет неоправданно часто отправлять запросы на сервер, так еще и будет сбивать значение
val
. Но если мы добавить функциюdebounce()
, то она решит эти вопросы.Функция debounce()
debounce() - это функция-обертка, которая ограничивает число выполнений переданной в нее функции, некоторым промежутком времени. Если точнее, то, пока промежуток времени не прошел, то зарегистрированная функция не будет исполнятся, а пока она не исполнилась, новый вызов функции будет замещать старый, исключая повторное выполнение.
пример:
function debounce(func, delay: number) { let timeoutId: number; return (...args) => { clearTimeout(timeoutId); timeoutId = setTimeout(() => func(...args), delay); }; }
Как правильно использовать в React компоненте
function App() { const [val, setVal] = useState(''); const [response, setResponse] = useState(''); const inputHandler = (e: React.ChangeEvent<HTMLInputElement>) => { setVal(e.target.value); setResponse(''); debounceHandler(); }; const submitHandler = useCallback(async () => { setResponse('отправка ...'); const resp = await fakeFetch(val); setVal(''); setResponse(resp); }, []); const debounceHandler = useMemo(() => { return debounce(submitHandler, 800); }, [submitHandler]); return ( <> <input type="text" value={val} onInput={inputHandler} /> {/* <button onClick={submitHandler}>Отправить</button> */} <p>{response}</p> </> ); }
При изменении стейта функциональный компонент вызывает свою функцию каждый раз, и без мемоизации мы бы получали каждый раз новый обработчик
debounceHandler()
иsubmitHandler()
. Но для того чтобы все работало нам необходимо передать одну функцию в debounce один раз!Поэтому мемоизируем submitHandler() через
useCallback
(линтер обычно потребует указатьsubmitHandler
как зависимостьdebounceHandler
) и саму функциюdebounceHandler()
вuseMemo
, (т.к debounce() возвращает функцию) -
Создание пользователя и базы данных, настройка доступов, установка пароляСначала необходимо войти в систему как суперпользователь базы данных на сервере postgresql. Опять же, самый простой способ подключиться в качестве пользователя postgres — это перейти на пользователя postgres unix на сервере базы данных с помощью команды su следующим образом:
$ su postgres
Далее заходим в среду PostgreSQL
$ psql
В случае успеха вы должны увидеть следующее:
postgres=#
В командной строке PostgreSQL создайте базу данных, имя пользователя и пароль, а затем предоставьте весь доступ этому новому пользователю. Например:
CREATE DATABASE {database}; CREATE USER {user} WITH PASSWORD 'password'; GRANT ALL ON DATABASE {database} TO {user};
выходим из среды PostgreSQL
$ \q
профит!
-
Ошибка: permission denied for schema public (Postgresql 15)Если вылезла подобная ошибка:
driverError: error: permission denied for schema public
PostgreSQL версии 15+ может выдать сообщение об ошибке, что у вас нет разрешения на создание чего-либо внутри общедоступной схемы, если заранее явно не указать, кому разрешено это делать.
Нам нужно явно предоставить разрешения пользователю.
- Сначала заходим в cli Нашей СУБД
sudo su postgres psql -d {database}
- далее назначаем права
GRANT ALL ON SCHEMA public TO {user};
- выходим
\q
{database}
- имя базы данных
{user}
- имя пользователя -
Zod + Nestjs (вместо сlass-validator)@Manul поэтому и приходится велосипедить)
-
Vue.js и React — необычное сравнение