• Как изменить приоритет логических ядер при SMT на Windows 11?

    vitaliy2
    @vitaliy2 Автор вопроса
    1. Перейдите в Панель управления → Электропитание.
    2. Нажмите "Создание схемы управления питанием".
    3. Выберите за основу схему "Высокая производительность".
    4. Скопируйте вручную все настройки из Вашей старой схемы (обычно "Сбалансированная") в новую схему, чтобы новая схема была максимально похожа на старую.
    5. Установите созданную схему в качестве текущей.

    Готово. Дело в том, что в схеме "Высокая производительность" присутствуют некоторые скрытые настройки, которые как раз и влияют на приоритет логических ядер. При использовании этой схемы приоритет будет отдаваться именно отдельным физическим ядрам.
    Ответ написан
    Комментировать
  • Разбор и анализ текста на японском языке, с чего начать?

    Для начала Вы понимаете, что японская грамматика полностью основывается на определении + определяемом? Даже сложные предложения (сложносочинённые и сложноподчинённые) можно рассматривать как определение одного предложения другим. Причём определение всегда стоит перед определяемым (на самом деле есть исключения, но мы здесь их рассматривать не будем — с ними итак всё понятно, можно будет расширить алгоритм по аналогии).

    Если понимаете, я бы предложил такой алгоритм:

    1. Вначале разбираем предложение на слова. Делается это от первого символа к последнему. Для реализации алгоритма нужны:
    1) Словарь со списком слов, причём в словаре должны быть пометки о частях речи + дополнительная информация, например, v1/v5 для глаголов.
    2) Список правил для всех форм для всех частей речи в Вашей программе (делается вручную). Например, прошедшая форма v1-глагола 食べる образуется взятием основы (кот. здесь образуется отбросом る) и добавлением た. Получится 食べた. Благодаря этому, когда мы встретим в речи 食べた, мы сможем понять, что это прошедшая форма глагола 食べる. Именно такой принцип используется в расширении Rikaichan для браузера (которое позволяет наводить указатель мыши на слова и смотреть их значения, а также говорит, в какой форме стоит слово).
    3) Список исключений (очень мал)

    В Вашем случае после разбора на слова получится такое предложение:
    私たちは   彼を   よき   先輩として   尊敬   している

    2. Идём с конца (можно и с начала, но для реализации будет проще с конца). В конце у нас ожидаемо стоит сказуемое, являющееся определяемым. Для разбора предложения мы хотим установить зависимости между словами. Это сродно расстановке круглых скобок, чтобы явно обозначить, какое слово/предложение зависит от какого.

    Итак, вот пример разбора:
    私たちは彼をよき先輩として尊敬している — исходная фраза.
    私たちは彼をよき先輩として尊敬   している — выделение первого определяемого. Мы знаем, что это определяемое, т. к. это глагол.
    私たちは彼をよき先輩として   尊敬   している — выделение определения. 尊敬 является определением слову している. Мы это узнали, т. к. сущ + する говорит о том, что определение определяет прямо следующее за ним слово, а не более позднее слово или определённую фразу. Скобки не ставим: будем считать, что когда скобок нет, все определения являются определениями последнему слову в этой группе.
    私たちは彼をよき   先輩として   尊敬   している — 先として является вторым определением к слову している, т. к. сущとして + глагол говорит о том, что сущとして определяет этот глагол. Аналогично, скобки пока не нужны, т. к. оба этих определения относятся к последнему слову в данной группе.
    私たちは彼を   よき   先輩として   尊敬   している — よき является третьим определением к слову している, т. к. наречение + глагол говорит нам об этом.
    私たちは   彼を   よき   先輩として   尊敬   している — 彼を является четвёртым определением к слову している, т. к. сущを + глагол говорит нам об этом.
    私たちは   (彼を   よき   先輩として   尊敬   している) — 私たちは является определением ко всей впереди-стоящей фразы до конца части сложносочинённого или сложноподчинённого предложения. Об этом нам говорит частица は. Соответственно, мы обязаны поставить здесь скобки, т. к. в противном случае 私たちは указывало бы на слово している, а мы хотим, чтобы оно указывало на фразу 彼をよき先輩として尊敬している. Ну вот и готово, мы сделали разбор фразы!
    私たちは(彼をよき先輩として尊敬している) — тоже самое без пробелов.

    Пример 2 (более сложный):
    趣味を仕事にしたら趣味は無くなることになるだろう (после разбития на слова: 趣味を   仕事に   したら   趣味は   無く   なる   ことに   なるだろう)

    趣味を仕事にしたら趣味は無くなることに   なるだろう — выделение первого определяемого.
    趣味を仕事にしたら趣味は無くなる   ことに   なるだろう — слово ことに является определением для なるだろう (об этом нам говорит конструкция "сущに + глагол").
    趣味を仕事にしたら趣味は無く   (なる   ことに)   なるだろう — слово なる является определением для こと (об этом нам говорит конструкция "глагол + сущ"). Поскольку なる относится не к последнему слову в данной группе, мы вынуждены поставить скобки, чтобы было видно, что なる относится к ことに. Как результат у нас вышло, что вся фраза なることに является определением слова なるだろう. В реальной жизни оно так и есть, значит мы всё делаем правильно.
    趣味を仕事にしたら趣味は   ((無く   なる)   ことに)   なるだろう — слово 無く является определением для なる (об этом нам говорит конструкция "наречие + глагол"). Обозначаем это с помощью скобок, т. к. если бы мы их не поставили, 無く прилегало бы к конечному слову なるだろう. Кстати, ВАЖНО: мы видим, что это третье слово подряд, которое прилегает прямо к следующему слову (т. е. имеем конструкцию вида a → b → c → d → e и т. д.). В этом нет ничего удивительного: большинство слов будут прилегать прямо к следующему, и есть только 4 исключения из этого правила (будут описаны ниже).
    趣味を仕事にしたら   趣味は   (((無く   なる)   ことに)   なるだろう) — слово 趣味は прилегает к всей следующей части сложносочинённого предложения. Об этом нам говорит частица は — она вводит тему для всего последующего предложения, а значит сущは является определением для всего предложения. Обозначаем это скобками: явно стало видно, что 趣味は определяет всё, что стоит далее.
    趣味を仕事に   したら   (趣味は   (((無く   なる)   ことに)   なるだろう)) — здесь мы видим глагол в условной форме, что говорит нам о сложносоч/сложноподч предложении, а значит данный глагол снова определяет всё предложение. Соответственно, берём всё предложение в скобки.
    趣味を   (仕事に   したら)   (趣味は   (((無く   なる)   ことに)   なるだろう)) — слово 仕事に определяет したら, ибо это сущに + глагол.
    (趣味を   仕事に   したら)   (趣味は   (((無く   なる)   ことに)   なるだろう)) — слово 趣味を также определяет したら, ибо это сущを + глагол. Впихиваем его внутрь скобки.
    Ну вот и готово. Мы получили все зависимости слов в предложении. Для каждого слова или подфразы мы можем сказать, какое слово/подфразу она определяет. Скобки полностью расставлены. Если убрать пробелы, получится (趣味を仕事にしたら)(趣味は(((無くなる)ことに)なるだろう)). Зная эти зависимости и значения слов, компьютер может понять смысл фразы.

    В большинстве случаев определения определяли прямо следующее за ним слово. Но есть случаи, когда это не так:
    1. は — влияет на всё последующее (до конца части сложного предложения).
    2. Сложные предложения с помощью частиц けど、のに、から、ので и форм したら、すれば — также влияет на всё последующее.
    3. Перечисления — несколько определений указывают на одно и тоже слово, т. к. принцип "влияет прямо на следующее слово" здесь немного нарушается.
    4. Большая сложность с частицей が. Здесь уже объяснять не буду — додумайте сами. PS. Вроде, неодназностей нет в конструкциях типа сущのない/сущがない. Вероятно, кроме ない можно использовать и другие глаголы.
    5. Может быть есть и другие случаи, про которые я не вспомнил.

    В целом в итоге принцип должен понятен, думаю.

    Разбирать предложение необязательно с конца, можно и с начала, но так может быть сложнее для реализации. Примеры:
    私たちは彼をよき先輩として尊敬している — исходная фраза
    私たちは   <彼をよき先輩として尊敬している — отделяем первое определение. Также мы встретили частицу は, которая является особым случаем, поэтому введём треугольную скобку, которая говорит о том, что текущее определение влияет на всю фразу (до конца части сложного предложения). Закроем эту скобку, когда достигнем этой части. Положим эту скобку в стек: когда достигнем конца части сложного предложения, закроем скобку на этом месте и уберём её из стека.
    私たちは   <[彼を   よき先輩として尊敬している — находим новое определение 彼を. Мы видим, что это именно определение, а не определяемое, т. к. это сущを. Поскольку текущая группа ещё не завершилось (определяемое ещё не найдено), введём квадратные скобки, которые сообщают нам, что мы в поиске определяемого. Аналогично, положим эту скобку в стек, чтобы успешно закрыть её, как только мы найдём первое определяемое. PS. На самом деле аналогичную операцию мы обязаны были проделать и с 私たちは, но поскольку в японском не бывает более одного определения на は (т. е. не бывает более одной темы), я опустил квадратную скобку — её роль итак успешно выполнит треугольная скобка.
    私たちは   <[彼を   よき   先輩として尊敬している — находим новое определение (よき). Мы знаем, что это определение, т. к. это наречие.
    私たちは   <[彼を   よき   先輩として   尊敬している — находим новое определение (先輩として).
    私たちは   <[彼を   よき   先輩として   尊敬   している — находим новое определение (尊敬).
    私たちは   <[彼を   よき   先輩として   尊敬   している] — наконец-то находим определяемое. Убираем из стека "[" и закрываем квадратную скобку. В стеке остаётся "<".
    私たちは   <[彼を   よき   先輩として   尊敬   している]> — мы видим, что часть сложного или несложного предложения закончилась: это является триггером к закрытию треугольной скобки в стеке.
    私たちは   ((彼を   よき   先輩として   尊敬   している)) — разбор предложения окончен. Заменяем треугольные и квадратные скобки на круглые.
    私たちは   (彼を   よき   先輩として   尊敬   している) — упрощаем выражение (удаляем лишние скобки).
    Готово. Без пробелов будет 私たちは(彼をよき先輩として尊敬している). Мы можем использовать этот результат для компьютерного понимания речи. Как видно, результат вышел аналогичным, как когда мы делали разбор с конца, а не с начала предложения. При этом писать алгоритм именно для компьютера было немного сложнее.

    [ПРОДОЛЖЕНИЕ ОТВЕТА В ПЕРВЫХ КОММЕНТАРИЯХ]
    Ответ написан
    4 комментария
  • Где посмотреть логи, если из-за сайта зависает браузер?

    Зайдите сюда chrome://inspect/#pages и нажмите "pause" на нужной вкладке (не открывая Dev Tools, оно итак откроется). После этого выполнение Javascript приостановится и будет запущен отладчик.
    Ответ написан
  • Что за ошибка в моем расширении после последнего обновления хрома?

    Если пишет такую ошибку, значит Вы уже нажимали кнопку упаковки хотя бы 1 раз ранее. В этом случае Google Chrome создал в родительской папке файл XXX.pem. Нужно просто указать путь к этому файлу во втором поле перед повторным нажатием кнопки "Упаковать расширение".
    Ответ написан
    3 комментария
  • Почему тормозит NGINX + NodeJS WebSocket + MySQL при 2000+ подключениях?

    1. Не сказана, какая нагрузка на сервер. Может быть, в этот момент процессор или диск загружен на 100% — поэтому и тормозит.
    2. Если Вы уже прошлись по всем узким горлышкам, и видите, что нигде загрузки нет, вероятно, у Вас просто неправильные настройки. Например, в nginx по умолчанию стоит очень маленькое количество соединений, и как только к Вам подключится такое количество пользователей, всё начнёт виснуть. Например, если worker_processes стоит 2, а worker_connections — 1000, то nginx сможет одновременно обслуживать не больше 2000 запросов, остальные запросы будут ставиться в очередь. Решение — поставить их на максимум (сколько не жалко оперативки). Соединение отъедает где-то 10 КБ памяти, поэтому если Вы поставите 100 тыс соединений, то nginx сможет отожрать до 1 ГБ памяти.
    Ответ написан
  • Как сделать переадресацию GET запросов с сохранением параметров?

    С изменением пути:
    return 301 https://example.com/newPage$is_args$args;

    Без изменения пути:
    return 301 https://example.com$request_uri;

    Если же имелось ввиду проксирование, то:
    proxy_pass        http://…;
    proxy_set_header  Host <подставить>;
    proxy_set_header  Connection "";
    
    # Также если нужно изменить путь, то, возможно, нужно добавить rewrite:
    rewrite .* /newPath;
    Ответ написан
    Комментировать
  • Как составить конфигурационный файл NGINX для перенаправления гугл-бота?

    Попробуйте так:
    if ($args ~ "(&|^)_escaped2A_fragment_(?:[&=]|$)") {

    И как Вы составляете запрос к своему серверу?
    Ответ написан
    Комментировать
  • Как с помощью async выполнить n-ое количество параллельных запросов?

    Либо так:
    await Promise.all(...promises)

    Либо так:
    const p1 = callSomeAsyncFunction(),
          p2 = callAnotherAsyncFunction(),
          p3 = callAnotherAsyncFunction();
    
    await p1;
    await p2;
    await p3;


    Во втором примере мы сразу запустили три функции одновременно. Далее, когда они уже начали работу, мы ожидаем завершение всех трёх функций. При этом, поскольку они уже исправно запущены и выполняют нужные действия, никакой лишней задержки не будет, ведь они уже запущены.
    Ответ написан
    Комментировать
  • Зачем нужен активный Type-c кабель?

    Возможно, чтобы сообщить о своих характеристиках. Представьте, вы взяли тоненький кабель, и заряжаете с его помощью телефон токами 3А. Такой кабель просто расплавится. Соответственно, пока кабель не сообщит о том, что по нему можно гнать 3А, возможно, устройства и не станут гнать по нему 3А.

    Конечно же, чтобы сообщить о возможностях, будут использоваться самые простые команды, т. е. кабель останется простым устройством. По крайней мере, если я угадал, для чего нужен активный кабель.

    По факту получается, что активный кабель может обладать более большим набором функций, например, зарядка более высокими токами, а может что-то ещё.
    Ответ написан
    Комментировать
  • Почему в вк пустой h1?

    Шаблоны / шаблонизаторы. Наверняка, там иногда что-то есть, поэтому из шаблона не убирают.

    Ну и конечно же, пустые теги тоже очень часто могут иметь значение, как с точки зрения css, так и js.
    Ответ написан
  • Для чего нужен bind?

    Вы что-то путаете. Пока ты не кликнул на квадрат, выводится Вася, а если кликнул, то Вова, т. е. всё правильно.

    Вероятно, Вам нужно учить JS. Что такое объекты, переменные, простые значения vs объекты и т. д. (а лучше вообще весь JS).

    Хотя по идее всегда должно выводиться "Вася", а не "Вова"

    Что за :) Учите JS.
    Ответ написан
  • Как работает % в js?

    Вы путаете операцию деления "/" и взятия остатка от деления "%".
    Ответ написан
    Комментировать
  • Почему нельзя определить функцию через global?

    С чего вы взяли, что нельзя? Более чем можно, и работает всё исправно. Вы что-то путаете.
    Ответ написан
    Комментировать
  • Async/await и правильность codestye?

    Первое что бросается в глаза — использованы пробелы вместо табов, это быдлокодерство (почему — гуглить по запросу "Tab indent space alignment"). Также после if нужен пробел.

    if (createUser(123, 123, 1, 123)) писать бессмысленно, т. к. функция createUser() всегда сразу же возвращает промис ещё до начала фактического выполнения функции. Только потом спустя функция начнёт выполняться, и в тот момент, когда выполнение дойдёт до return или throw, функция заполнит этот промис результатом или ошибкой. Т. е. суть в том, что async-функция — это функция, возвращающая промис. Раньше вам приходилось самому возвращать промис, а теперь функция возвращает его за вас. (PS. В реальности, если вдаваться в подробности, то на самом деле функция начнёт выполняться сразу же до первого await, но даже если await'ов не будет, возвращён будет всё-равно промис).

    Чтобы решить проблему, нужно либо написать createUser(123, 123, 1, 123).then(bool => { ... }), либо обернуть вызов функции в другую async-функцию, чтобы была возможность использовать await. Конечно же, такая обёртка тоже вернёт промис.

    Также нужно отметить, что try catch писать необязательно, вместо этого можно отловить ошибку прямо в указанной выше обёртке (или с помощью .then(value => {}, err => {})). Т. е. отловить ошибку рано или поздно придётся, но необязательно это делать в каждой функции — чаще всего достаточно один раз в конце.
    Ответ написан
  • Любые фотографии ВК доступны просто по ссылке?

    Перебрать ссылку нереально. Раз у вас есть ссылка, значит у вас был доступ к фотке. А раз был доступ, то вы итак могли сохранить фото на комп без всяких ссылок.

    Итог: никакой уязвимости нет.

    PS. Для перебора всей базы нужно перебрать примерно 64^11 * 16^5 * 10^9 * ~10^5 = 7.73 * 10^39 вариантов. Если перебирать по 100 млн в секунду, то на это понадобится 2453426 320882048 046080519 лет (2 септиллиона лет, т. е. 2453 секстиллиона или 2453426 квинтиллионов).
    Ответ написан
    3 комментария
  • Как сохранить файл из request?

    А причём тут node? Точно не помню, но инфа в интернете есть, наверное, надо загрузить файл (как по обычной ссылке) и дальше уже работать как с обычным файлом.
    Ответ написан
    Комментировать
  • Почему эта ошибка появилась?

    Там же написано: EADDRINUSE. Порт уже используется, а вы снова хотите его открыть. Вначале закройте программу, которая использует этот порт, а потом запускайте ваш скрипт. Не исключено, что ваш же скрипт его и использует, просто вы пытаетесь запустить скрипт второй раз, а первый ещё не закрыли.

    Ну и если читать не умеете, хотя бы гуглом научитесь пользоваться.
    Ответ написан
    3 комментария
  • Как вызывать скрипт каждые 30 минут?

    cron подойдёт для вызова любых скриптов, в т. ч. и node
    Ответ написан
    Комментировать
  • Почему после вызова промиса код не выполняется и процесс не умирает?

    Потому что Model.findOne() возвращает промис, который никогда не выполняется. В итоге оператор await ждёт этот промис вечно. Ну пусть ждёт, вдруг промис всё-таки когда-нибудь выполнится, и выполнение функции find() продолжится, а после него и скрипт завершится.
    Ответ написан
    2 комментария
  • Почему могут быть такие медленные показатели nodejs + redis?

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

    А console.log действительно может работать долго, лучше между замерами его не вызывать.

    Конечно же, после редиса должен ещё проснуться node.js-скрипт :)
    Но обычно просыпание должно занимать до 1 мс, а два просыпания — до 2 мс. 6–12 мс — действительно многовато. Вероятно, просыпание выполняется долго из-за того, что большую часть времени скрипт и redis бездействуют. Ну или прерывания не срабатывают вообще или срабатывают, но из-за сильного бездействия система всё-таки решает, что лучше так быстро не будить скрипт.

    Попробуйте потестить под нагрузкой. Если пинг упадёт до 1 мс, то всё норм. Да, 1 мс — это может показаться много, но обычно запросы группируют пачками, и таких пачек вряд ли будет послано больше двух, ну максимум трёх в совсем сложных запросах, что даст суммарно до 3 мс пинга — не так страшно.

    Кто-то может подумать, а чего вообще так долго всё будится. Потому что каждое бужение отнимает процессорное время, и система, допустим, может сделать максимум 50 тыс бужений в секунду, загрузив одно ядро на 100%. Теперь представьте 10 скриптов и 10 редисов, которые что-то делают каждую 1 мс — это уже 20 тыс бужений, что загрузит одно ядро на 40%. И при этом суммарный пинг будет 2 мс. Для пинга 1 мс придётся сделать 40 тыс бужений — это 80% загрузки.

    Лучше всего эту проблему решают прерывания — скрипт будится только тогда, когда ему на сокет пришли данные или он, допустим, слушает клавиатуру, и пользователь нажал клавишу на клавиатуре, и т. д. В итоге получится, что если 10 скриптов ничего не делают и ничего не слушают, то и процессор не будет загружен. А если делают, то 80% загрузки — не так страшно, ведь у нас на сервере не одно ядро.

    PS. Ещё кстати может влиять ваша виртуалка. Я бы посоветовал потестить напрямую, ведь это та особенность, где виртуалка реально может влиять.

    PS. В node.js console.log блокирует скрипт, по крайней мере при выводе в файл. Т. е. считайте, что это примерно как вызвать fs.appendFileSync(). Да и при выводе в консоль тоже вроде медленно работает, хотя лучше проверить. И ещё не факт, что сама функция быстрая, хотя это уже должно слабже влиять.

    Да, действительно, убрал консольный вывод и стало сразу 1-2 мс. Если честно, то ожидал увидеть 0, как заявлено разработчиками 100000 в сек

    100к в секунду redis действительно без проблем выполнит. Но запрос дойдёт до редиса же не сразу, а после выполнения результат дойдёт до скрипта тоже не сразу. Т. е. каждый запрос всё-равно будет занимать порядка 1 мс, но при этом таких запросов можно послать 100 тыс в секунду. Это как в интернете у вас 100 мбит, но когда вы заходите на сайт, всё-равно 10–1000 мс из-за пинга. Но зато вы можете зайти на 10 таких сайтов сразу — тогда получится использовать канал намного эффективнее.
    Ответ написан
    2 комментария