Бенчи не совсем честные (или совсем нечестные), т.к. бенчится зеркальный пул, но дисков вне пула у меня сейчас нет.
Это я к тому, что такие диски нормально себя показывают при обычном использовании: киношки, торренты, всякое медиа. Понятное дело, для современных игр и работы с видео они не подойдут.
И ещё, мои диски довольно старые, у них очень большой пробег и они дико стучат бошками при нагрузке. Без нагруки иногда постукивают. Раньше я гадал из-за чего это может быть, но статья, вроде бы, ответила на этот вопрос.
Я воспользовался поводом, заблокировал все новые поступления
Странная фича, если она вынуждает пользователя отключать часть функциональности сайта.
Я уже думаю воспользоваться поводом и вообще перестать читать хабр. Большая часть статей здесь это нейрослоп, маркетинговый буллшит и реклама говёных курсов или тг-каналов. Желания читать это нет, желание писать что-то сюда тоже давно пропало.
Извиняюсь за оффтоп, но может здесь хотя бы обратят внимание. На прошлой неделе сломали личную RSS ленту и теперь в неё сваливается вообще всё, даже от заблокированных юзеров. Поддержка даже не отвечает.
Раньше активно его использовал, как раз когда пользовался express'ом. У тайпорма хорошая интеграция с nestjs, поэтому такая связка мне больше нравится. Ну и аннотации выглядят гораздо чище, чем возня с sequelize.define.
Большое спасибо за ответ. Но дело в том, что я не захожу на главную, а перехожу из RSS. К тому же, я часто читаю с мобильных устройств, а там не в каждый браузер можно поставить адблок. Наверное, придётся как-то фильровать самому по тэгам, которые можно получить из фида.
А снаружи-то как вовремя узнать что больше элементов не будет?
Снаружи "вовремя" будет тогда, когда зарезолвится промис, т.к. пока это не произойдёт ваш цикл не сможет пойти дальше. А когда промис резолвится, то он возвращает состояние итератора, где указано завершился итератор или нет.
Чему будет равно свойство done итератора во время выполнения оператора await в генераторе?
Оно будет равно false. Станет равным true лишь при выходе из функции-генератора явно (по return) или неявно (кончилось тело функции).
Сейчас и для обычных итераторов их нельзя применить. Для этого сначала нужно преобразовать в массив (с помощью Array.from или spread оператора [ ...iterable ]), а потом над ним уже совершать операции.
В качестве эксперимента я пишу библиотеку, которая добавляет эти методы прямо к итератору (изменяет его прототип, как делает SugarJS), но она далека от завершения, к тому же есть множество более качественных альтернатив: Wu, Lazy.JS и т.д.
Давайте избавимся от for-await-of и посмотрим как это можно обработать вручную. Допустим, у нас есть удалённая очередь queue с несколькими элементами.
Пример для IteratorResult<Promise>:
const queue = ... // queue это итератор
while (true) {
const { value, done } = queue.next()
// done всегда будет false, т.к. из генератора синхронно(!) мы не можем узнать закончилась ли очередь
const result = await value // здесь мы дожидаемся разрешения value
if (result === null) { break } // вот здесь нужно проверить, что нам вернулось пустое значение. Но дело в том, что null может быть вполне валидным значением, а не индикатором пустой очереди
// обрабатываем result; следующая итерация
}
Как видите, этот подход имеет недостаток — у нас нет четкого понимания, что очередь пуста. Мы не можем трактовать null как конец, если только не приняли некое соглашение, что null — это всегда конец очереди.
В случае с Promise<IteratorResult> всё несколько иначе:
const queue = ...
while (true) {
const { value, done } = await queue.next() // здесь у нас есть Promise, который возвращает текущее состояние итератора
if (done) { break } // и есть четкое понимание когда стоит прекратить цикл
// обрабатываем value; следующая итерация
}
Т.е. при подходе Promise<IteratorResult> у нас есть возможность без всяких соглашений четко дать понять, что очередь пуста, можно выходить из цикла. queue, например, может при каждом вызове next() помимо получения элемента спрашивать у очереди сколько элементов осталось и при значении 0 вернуть done = true, чтобы прервать цикл и не создать последующих запросов.
php/python/ruby etc. сами по себе интерпретируемые языки
неправда. Они компилируются в байткод, который потом исполняется виртуальной машиной.
умудряются напихать каких-то бешеных абстракций
которые нужны, чтобы код от разных вендоров работал "искаропки" и имел одинаковые интерфейсы.
ORM — «птичий» язык доступа к БД, зачем когда есть SQL
затем, чтобы вы могли выбрать данные из одной СУБД (например MySQL), "сджойнить" их с данными из другой (например MongoDB, мне это приходилось делать), закешировать на некоторое время, и всё это без кучи бойлерплейт кода каждый раз. Для любителей SQL есть Query Builder'ы, которые генерят запросы для разных диалектов SQL.
Шаблонизаторы — еще один птичий язык
а что вы предлагаете взамен? Только PHP, насколько я знаю, позволяет инлайнить код прямо в HTML, остальным языкам (React не рассматриваем) нужны шаблонизаторы. Хорошо, что есть широкоиспользуемые языки для шаблонов (Mustache, Jade/Pug и т.д.), которые позволяют не учить 100500 разных синтаксисов, а везде делать одинаково (имел несчастье работать с angular1 на фронте и php на бэкенде, один шаблонизатор немного сгладил боль).
переаллокации памяти и перекачивание данных между буферами
оверхед неизбежен, но это плата за скорость разработки.
как работает веб сервер — активизируется заново для каждого обращения
это не так. Какой-нибудь apache ещё может порождать по процессу на запрос, но, к счастью, к нему прибегают всё реже. nginx, например, имеет пул процессов, которые обрабатывают запросы пользователей. Здесь можно мне возразить, что процесс всё же порождается, но только это не веб-сервер, а какой-нибудь PHP-интерпретатор. Да, это так, но только если вы не используете fastCGI. В остальных языках чаще используется какой-нибудь встроенный в веб-фреймворк (Node.JS, Ruby Unicorn и т.д.) HTTP сервер (хотя мне тоже такое решение не особо нравится).
на Си — вполне разумное решение
нет. Это очень опасное занятие. Даже матёрые программисты допускают глупые ошибки, которые могут очень дорого обойтись. Все эти "интерпретируемые языки" зачастую неплохо отлажены и не имеют таких багов, по крайней мере, их сложнее эксплуатировать. Если хотите убер-скорость, но чтобы было безопасно, взгляните на Rust, с его zero-cost abstractions, и какой-нибудь веб-фреймворк для него или на Go и его решения.
P.S. Сам я веб-разработчик и сейчас, как раз, изучаю Rust, но всё равно не стал бы на нём писать веб.
У меня в домашнем медиа-сервере стоят 4 рефабнутых видеорегистраторных диска, объединённые в зеркальный zpool. Подключены через nvme sata райзер.
Вот бенчи погонял только что
Последовательная запись (16ГБ):
Последовательное чтение (16ГБ):
Случайная запись (4ГБ):
Случайное чтение (4ГБ):
Случайное чтение показало себя хуже всего. Я бы даже сказал чудовищно плохо. Но, если верить статье, то это как раз специфика такого рода дисков.
Команды взял отсюда, результаты мои.
Бенчи не совсем честные (или совсем нечестные), т.к. бенчится зеркальный пул, но дисков вне пула у меня сейчас нет.
Это я к тому, что такие диски нормально себя показывают при обычном использовании: киношки, торренты, всякое медиа. Понятное дело, для современных игр и работы с видео они не подойдут.
И ещё, мои диски довольно старые, у них очень большой пробег и они дико стучат бошками при нагрузке. Без нагруки иногда постукивают. Раньше я гадал из-за чего это может быть, но статья, вроде бы, ответила на этот вопрос.
Было.
Странная фича, если она вынуждает пользователя отключать часть функциональности сайта.
Я уже думаю воспользоваться поводом и вообще перестать читать хабр. Большая часть статей здесь это нейрослоп, маркетинговый буллшит и реклама говёных курсов или тг-каналов. Желания читать это нет, желание писать что-то сюда тоже давно пропало.
Уже ответили про ленту.
А можно какой-нибудь срок по фиксу этого, а то за неделю 600+ статей прилетело, 99% которых должны были быть отфильтрованы.
Извиняюсь за оффтоп, но может здесь хотя бы обратят внимание. На прошлой неделе сломали личную RSS ленту и теперь в неё сваливается вообще всё, даже от заблокированных юзеров. Поддержка даже не отвечает.
P.S. плюсанул, идея в посте нравится.
Не все платные. llama3, например, вполне можно локально запустить у себя через ollama (там ещё куча других моделей есть)
Так почему бы не вынести драйвера в отдельный пакет?
Насколько помню, будут скачиваться только те зависимости, которые явно использованы.
Раньше активно его использовал, как раз когда пользовался express'ом. У тайпорма хорошая интеграция с nestjs, поэтому такая связка мне больше нравится. Ну и аннотации выглядят гораздо чище, чем возня с
sequelize.define.NestJS + TypeORM. Полгода использую, в основном положительные впечатления. Про Express не вспоминаю даже.
Было уже
А отписка от надоедливых хабов/компаний так и не появится? Я клянчил её почти два года назад, но мне даже не ответили.
Когда вызывается
returnили мы выходим из генератора, то всё равно возвращаетсяPromise, содержащийIteratorResult. Вот пример с кодом:Т.е. последний промис разрешается сразу и возвращает
done = true. Вы можете запустить этот код и проверить самостоятельно.В каком месте я написал чушь?
Да, вы можете в
next()передать какое-нибудь значение:Таким образом можно передать генератору что угодно.
Снаружи "вовремя" будет тогда, когда зарезолвится промис, т.к. пока это не произойдёт ваш цикл не сможет пойти дальше. А когда промис резолвится, то он возвращает состояние итератора, где указано завершился итератор или нет.
Оно будет равно
false. Станет равнымtrueлишь при выходе из функции-генератора явно (поreturn) или неявно (кончилось тело функции).Сейчас и для обычных итераторов их нельзя применить. Для этого сначала нужно преобразовать в массив (с помощью
Array.fromили spread оператора[ ...iterable ]), а потом над ним уже совершать операции.В качестве эксперимента я пишу библиотеку, которая добавляет эти методы прямо к итератору (изменяет его прототип, как делает SugarJS), но она далека от завершения, к тому же есть множество более качественных альтернатив: Wu, Lazy.JS и т.д.
Давайте избавимся от
for-await-ofи посмотрим как это можно обработать вручную. Допустим, у нас есть удалённая очередьqueueс несколькими элементами.Пример для
IteratorResult<Promise>:Как видите, этот подход имеет недостаток — у нас нет четкого понимания, что очередь пуста. Мы не можем трактовать null как конец, если только не приняли некое соглашение, что null — это всегда конец очереди.
В случае с
Promise<IteratorResult>всё несколько иначе:Т.е. при подходе
Promise<IteratorResult>у нас есть возможность без всяких соглашений четко дать понять, что очередь пуста, можно выходить из цикла.queue, например, может при каждом вызовеnext()помимо получения элемента спрашивать у очереди сколько элементов осталось и при значении0вернутьdone = true, чтобы прервать цикл и не создать последующих запросов.Судя по всему, поддержку недавно добавили в V8. Не использую Chrome, так что не могу проверить.
Для этого придуман Git LFS.
неправда. Они компилируются в байткод, который потом исполняется виртуальной машиной.
которые нужны, чтобы код от разных вендоров работал "искаропки" и имел одинаковые интерфейсы.
затем, чтобы вы могли выбрать данные из одной СУБД (например MySQL), "сджойнить" их с данными из другой (например MongoDB, мне это приходилось делать), закешировать на некоторое время, и всё это без кучи бойлерплейт кода каждый раз. Для любителей SQL есть Query Builder'ы, которые генерят запросы для разных диалектов SQL.
а что вы предлагаете взамен? Только PHP, насколько я знаю, позволяет инлайнить код прямо в HTML, остальным языкам (React не рассматриваем) нужны шаблонизаторы. Хорошо, что есть широкоиспользуемые языки для шаблонов (Mustache, Jade/Pug и т.д.), которые позволяют не учить 100500 разных синтаксисов, а везде делать одинаково (имел несчастье работать с angular1 на фронте и php на бэкенде, один шаблонизатор немного сгладил боль).
оверхед неизбежен, но это плата за скорость разработки.
это не так. Какой-нибудь apache ещё может порождать по процессу на запрос, но, к счастью, к нему прибегают всё реже. nginx, например, имеет пул процессов, которые обрабатывают запросы пользователей. Здесь можно мне возразить, что процесс всё же порождается, но только это не веб-сервер, а какой-нибудь PHP-интерпретатор. Да, это так, но только если вы не используете fastCGI. В остальных языках чаще используется какой-нибудь встроенный в веб-фреймворк (Node.JS, Ruby Unicorn и т.д.) HTTP сервер (хотя мне тоже такое решение не особо нравится).
нет. Это очень опасное занятие. Даже матёрые программисты допускают глупые ошибки, которые могут очень дорого обойтись. Все эти "интерпретируемые языки" зачастую неплохо отлажены и не имеют таких багов, по крайней мере, их сложнее эксплуатировать. Если хотите убер-скорость, но чтобы было безопасно, взгляните на Rust, с его zero-cost abstractions, и какой-нибудь веб-фреймворк для него или на Go и его решения.
P.S. Сам я веб-разработчик и сейчас, как раз, изучаю Rust, но всё равно не стал бы на нём писать веб.