• Возможно ли через PWSH / CMD изменить заголовок запускаемой программы?

    liaFcipE
    @liaFcipE Автор вопроса
    Да, выгрузка user32.dll, но через PWSH, меня устраивает.

    # Helper functions for building the class
    $script:nativeMethods = @();
    function Register-NativeMethod([string]$dll, [string]$methodSignature)
    {
        $script:nativeMethods += [PSCustomObject]@{ Dll = $dll; Signature = $methodSignature; }
    }
    function Add-NativeMethods()
    {
        $nativeMethodsCode = $script:nativeMethods | % { "
            [DllImport(`"$($_.Dll)`")]
            public static extern $($_.Signature);
        " }
    
        Add-Type @"
            using System;
            using System.Runtime.InteropServices;
            public static class NativeMethods {
                $nativeMethodsCode
            }
    "@
    }
    
    Register-NativeMethod "user32.dll" "bool SetWindowText(IntPtr hWnd, string lpString)"
    Add-NativeMethods
    
    $myprocess = start-process Notepad -Passthru
    
    # If you change the title immediately nothing will happen because the process isn't done loading.
    sleep 1
    
    [NativeMethods]::SetWindowText($myprocess.MainWindowHandle, "something")


    соус
    Ответ написан
    Комментировать
  • Удобно ли использование windows приложений в macos?

    liaFcipE
    @liaFcipE
    Не имеет смысла, у меня есть и мак и айфон и даже айпад, ниразу ничего ни с чем не интегрировал, лишь разок подключал айфон как еще одну камеру, 1 раз за все время, на час.

    Parallels работает неплохо, но это не для простых юзеров, удобно не будет.
    Не мучайте родителей, проще для них и вас будет так же - Windows.

    Брать MacBook не на M процессорах смысла - 0, возьмите любой нормальный ноут на винде, тем более, что щас выбор огромный и цены нормальные.

    p.s. был опыт попытки посадить девушку на мак, юзер не деревянный, успехом не увенчалось. Сидит в итоге на виндовом десктопе.
    Ответ написан
    7 комментариев
  • Как перенсти проект из одной версии в другую?

    liaFcipE
    @liaFcipE
    Так раз у тебя есть старый винт и это винда - найди на нем ноду, что была и попроси у нее вывести свою версию. Но проблема врядли в версии ноды.

    Лок файла у тебя вообще нет в репе, и ты его не случайно удалил, у тебя последний комит 8 месяцев назад, а сам лок файл вообще в гитигноре.

    Step-by-step гайд тут не сделать, сидеть и разбираться точечно.

    Тут лишь два совета могу дать:

    1. Всем проектам в package.json можно указать версию node & npm.
    2. Хранить лок файл, как вообще его можно не хранить, зачем вы его в игнор кинули?

    //

    В твоем проекте node-sass, в систему как минимум надо ставить Python2, хз как такое можно было сделать даже в 2020 году, делалось по очень пожилому гайду, проще все переделать нормально, да и быстрее скорее всего.

    Хотел глянуть что там, но ставить питон желания нет. Используй в будущем нормальный sass сборщик, на жаваскрипте, а не тот, что в бинарь собирается.
    Ответ написан
    1 комментарий
  • Не пойму работу Object.assign() для documentElement?

    liaFcipE
    @liaFcipE
    > не понимаю, почему не работает 2й.

    document.querySelector('.layers__container').style.transform = `rotateX(${moveY})`
    document.querySelector('.layers__container').style.transform = `rotateY(${moveX})`


    Потому, что ты перетираешь значение style.transform двумя разными значениями, второе заменяет первое.

    > метод Object.assign инлайново прописал для documentElement АТРИБУТ style.
    Не совсем, он буквально сделал:

    document.documentElement.style.prop1 = "value1";
    document.documentElement.style.prop2 = "value2";

    Сам он ничего не прописывал, это уже логика работы DOM ноды и ее API.
    Просто прочти документацию к Object.assign, лучше в отрыве от DOM API, ибо у DOM API и его объектов есть свои магические методы, геттеры, сеттеры и прочее:

    65a456eb32d63620125871.png

    > console.log(Object.entries(document.documentElement)) то выведутся все пары ключ+значение

    У "простых" объектов - да, но все сложнее. Если посмотреть MDN описание для Object.entries, то можно увидеть, что он отдает только перечисляемые свойства: An array of strings representing the given object's own enumerable string-keyed property keys.
    Ответ написан
    1 комментарий
  • Почему неправильно перемешиваются элементы в массиве?

    liaFcipE
    @liaFcipE
    1. Где декларация функции shuffle?
    2. Чего вы ожидали от вызова shuffle(questionsDat);?

    Даже если допустить, что функция у вас где-то есть, то что этот вызов должен сделать? В теории функция shuffle может напрямую изменить входящий массив, но обычно так никто не делает, обычно все идут по пути иммутабельности. Т.е. вам нужно использовать то, что возвращает shuffle.

    Если хотите мутировать исходный массив, можно взять Array.sort и Math.random.

    questionsDat.sort(() => .5 - Math.random())
    Ответ написан
  • Axios vs Fetch NodeJS - CPU and Memory usage сравнение?

    liaFcipE
    @liaFcipE
    Зачем вы сравниваете эффективность таких вещей? Там же разница будет на уровне погрешности (по моему мнению).

    Я на нашел сходу инфы о том, что нативный fetch основан на node:http, мне казалось это отдельный WebAPI, со своей спецификацией.

    Просто выберите то, что удобнее и проще. Fetch прост, с минимум фич, в то время как Axios - полноценный фреймворк, который что только не умеет.

    В крайнем случае - напишите бенчмарк, дело 5ти минут, но сомневаюсь, что там будет что-то интересное.
    Ответ написан
    Комментировать
  • Как сконфигурировать бэк и фронт через api?

    liaFcipE
    @liaFcipE
    Причем тут VDS, зачем вам вообще нода? Чистый Vue это больше о SPA. Вы о SPA или SSR/G?

    Если вы хотите классический SPA, то вам (не) нужна нода, она нужна для сборки и локальной разработки, но на выходе у вас статика (html, js, css и еще какой-то набор ассетов аля картинки, шрифты и так далее).

    Что там делает API и как он живет - фронту не важно и его не касается, ему не важно какой там стек, фронту важно одно - адрес, где бекенд живет и чтобы бекенд отдавал ответы на запросы в нужном фронту формате.

    Поэтому что вам конфигурировать? Что вы хотите?
    Ну в общих чертах вам нужен:

    nginx, который:
    - Отдает статику на 80/443 с вашим index.html и набором ассетов.
    - Дает доступ к API проксипасом на условный путь /api юзая php-fpm линком с другого контейнера.

    Как вы это упакуете на уровне докера - хз, делайте как удобно. Только понимайте, что фронт для локальной разработки нужно запускать в dev режиме, через nodejs, (HMR там и все такое) а для пре\прода - собирать в статику.

    Поэтому, я бы вообще локально фронт не запускал в докере, а работал прямо на машине, в докере держал бы только всю инфру бекенда.

    Да и как вы хотите хранить проекты? Монореп или все таки разные репы? Если разные - можете вообще сделать для каждого проекта сборку в docker имаджы и сторить их где-то в Gitlab Registry или аналогах с независимым деплоем фронта и бека. кароче вариантов масса. Выбирайте по возможностям и средствам. Возможно вам проще нанять прошаренного девопса.
    Ответ написан
    Комментировать
  • Как сделать интервальное нажатие клавиш на MacOS Sonoma?

    liaFcipE
    @liaFcipE
    Нажималось где? Что-то на веб-странице или что-то из контролов самого браузера?
    Если на веб-странице - просто используй JavaScript, тригернуть клик на нужном DOM-элементе сможет даже человек с лишней (или недостающей) хромосомой:

    // click on button every 30s
    setTimeout(() => {
      document.querySelector("Селектор твоей кнопки").click();
    }, 30 * 1000);


    Этот код можно просто вставить в браузерную консоль, упаковать в браузерное расширение, использовать TamperMonkey для менеджмента скриптов или даже обернуть в скрпт для ноды на основе puppeteer.

    Если что-то их контролов браузера - бери AHK и ему подобные утилиты, которые работаю на MacOS. Там такой же, простецкий скриптовый язык, как JS.
    Ответ написан
    1 комментарий
  • Как правильно хранить данные и создавать новые блоки без перерисовки всего компонента при скролле?

    liaFcipE
    @liaFcipE
    В общем виде, я бы делал как-то так:

    const LIMIT = 10;
    
    const getProducts = async (offset, limit) => { ... }
    
    function App () {
      const [offset, setOffset] = useState(0);
      const [products, setProducts] = useState([])
    
      useEffect(() => {
        getProducts(offset, LIMIT).then(products => setProducts(v => [...v, ...products]))
      }, [offset]);
    
      return <RenderProducts onScroll={() => { // increment offset }} />
    }


    Конечно, ваш бекенд должен уметь отдавать данные по limit & offset.
    И лучше вынести всю работу с данными в стор, тогда не нужен будет уродливый useEffect.

    Что-то вроде (nanostores):

    // store.ts
    const LIMIT = 30;
    
    export const $products = map({
      offset: 0,
      products: [],
      isLoading: true
    })
    
    onMount($products, () => {
      fetchProducts()
    })
    
    const fetchProducts = action($products, "fetchProducts", async store => {
      const { products, offset } = store.get();
    
      // TODO: add error handling
      store.setKey("isLoading", true);
      const newPartOfProducts = await api.getProducts(offset, LIMIT);
      store.setKey("products", [...products, ...newPartOfProducts ]);
      store.setKey("isLoading", false);
    });
    
    const incrementOffset = action($products, "incrementOffset", store => {
      const { offset } = store.get();
      store.setKey("offset", offset + LIMIT);
      fetchProducts()
    })
    
    export const $productsMutations = { incrementOffset }
    
    // App.tsx
    
    function App () {
      const { isLoading, products } = useStore($products)
    
      return (
        <Fragment>
          <RenderProducts onScroll={$productsMutations.incrementOffset} products={products} />
          {isLoading && <LoadingIndicator />}
        </Fragment>
      )
    }
    Ответ написан
    6 комментариев
  • Как составить запросы postman?

    liaFcipE
    @liaFcipE
    Ну и дела, как же вас так учат? Неужели тебе просто дали задание и ранее не показывали как работать с Postman? Там же интерфейс, что справится даже моя бабуля.

    Давай, допустим, что ты уже разобрался с тем, как работает UI постмана, знаешь что такое collection и environment.
    Давай зайдем на нужную тебе страницу, так, добавить в корзину, имеется каталог и кнопка добавить товар в корзину.

    Давай откроем инструменты разработчика и зайдем во вкладку сеть, готово?
    Теперь нажмем на кнопку добавления товара и о чудо! В инструментах разрабочтика виден запрос add, его параметры и ответ:

    65064be46c94f492329084.png

    Теперь мы можем создать новый запрос в ранее созданой коллекции и понять следующее:

    - Запрос идет на адрес https://shop.mts.ru/api/v1/cart/add
    Можно сразу вынести https://shop.mts.ru - в переменные окружения (та самая environment), назовем ее base_url, теперь эндроинт запроса для нас - {{ base_url }}/api/v1/cart/add

    Что мы еще увидели в панели разработчика?
    - Тип запроса - POST
    - Тело запроса: {id: "677070"}, где 677070 - идентификатор добавляемого товара, его тоже можно вынести в переменные среды.

    На данный момент все, уже рабочий запрос на добавление товара в корзину, далее можно сделать тоже самое с удалением и изменением товара в корзине.

    Уловил примерно как это работает? Удачи.
    Ответ написан
    3 комментария
  • Почему получается число отличное от калькулятора?

    liaFcipE
    @liaFcipE Автор вопроса
    Спасибо всем, в 4 часа ночи, мне не удалось понять, что при конвертации шестнадцатеричного числа в десятичное я выйду за Number.MAX_SAFE_INTEGER.

    Решил с помощью BigInt, как и намекнул Rsa97

    function hexToSignedInt(hex) {
        hex.length % 2 !== 0 && (hex = "0" + hex);
        
        const hexAsNumber = BigInt("0x" + hex);
        const maximalValue = BigInt(Math.pow(2, hex.length / 2 * 8));
    
        if (hexAsNumber > maximalValue / 2n - 1n) {
           return Number(hexAsNumber - maximalValue)
        }
    
        return Number(hexAsNumber);
    }
    
    const result = hexToSignedInt("FFFFFFFFFFFFCCFF") // -13057n
    console.log(result);
    Ответ написан
    Комментировать
  • Как в VS code Remote SSH установить права доступа для графического интерфейса?

    liaFcipE
    @liaFcipE
    Не надо ему давать root и запускать от него. Дайте папке права юзера\группы, от короторой запускается бекенд вскода.
    Ответ написан
    Комментировать
  • Как собрать проект Node.js?

    liaFcipE
    @liaFcipE
    > на Ангуляре можно набрать ng build и он соберёт пачку файлов
    > не получится "установить зависимости"

    Прочитав комментарии объясню: никак.
    Ты не понимаешь как работает Nodejs, не понимаешь что такое бекенд и фронтенд.

    Твой код, с запуском node.js сервера (createServer из node:http) не может работать собственно без самой ноды.
    Сбор статики тебе не поможет, эта статика исполняется в браузере, на клиенте. В браузере нет Node.JS.
    Тебе же нужно совсем другое окружение и исполнение кода на сервере, самой нодой. И чуточку изучения матчасти.
    Ответ написан
    1 комментарий
  • Как завести видеокарту Sapphire Radeon RX 580 2048sp?

    liaFcipE
    @liaFcipE
    На чем сборка? OpenCore? Clover?

    Надеюсь OC. RX 580 это Polaris 10 and 20 series:
    Highest Supported OS: Current/Ventura (13)
    Initial Supported OS: Sierra (10.12)

    Для работы нужны классические: Lilu.kext, WhateverGreen.kext
    Все это есть в GPU Buyers Guide

    Если юзаешь OC - просто пройдись по гайду от начала до конца и собери новый конфиг, там есть куча нюансов с чипсетом, материнками, BIOS и прочее.

    Обрати внимание на ремарку:

    Regarding Polaris, basically every model of card is supported as long as it’s running either a Polaris or Baffin core. Lower end cards like the RX 550 may run a Lexa core, meaning no support in macOS.

    The only brands you should avoid with the Polaris series would be XFX (460/560 models), PowerColor, HIS and VisionTek as many users have had bootloader and macOS boot issues. Other users have found fixes/workarounds, though nothing consistent. This seems to be caused by having an odd VBIOS that doesn't communicate well with macOS and the only real solution is flashing another VBIOS, which is not ideal for most users.
    Ответ написан
  • Стоит ли переходить с FullHD на 2k?

    liaFcipE
    @liaFcipE
    Смотря какая диагональ, привычки, зрение. Твоя карта нормально выдаст fps в QHD.
    Перекатился с 24" fullhd на 32" QHD, во всем устраивает, тоже 3060 12gb.

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

    > будет ли dlss в 2к так же делать картинку мыльной
    Мыло есть мыло, больше разрешение - надо больше ресурсов на рендер картинки, возможно где-то не сможешь поставить пресет DLSS в качество, от чего будет еще мыльнее. Это напрямую с монитором и не связано по моему мнению.
    Ответ написан
    Комментировать
  • Как заменить в массиве число нацело делящихся на 3 строкой "пропускам 3 "?

    liaFcipE
    @liaFcipE
    [1,2,3,6,4,12,3,8,15,55,54,4].map(v => v % 3 ? v : "skip 3")
    // (12) [1, 2, 'skip 3', 'skip 3', 4, 'skip 3', 'skip 3', 8, 'skip 3', 55, 'skip 3', 4]
    Ответ написан
    Комментировать
  • Можно ли заменить javascript языком dart/flutter?

    liaFcipE
    @liaFcipE
    Вы написали какую-то ерунду, из которой можно сделать лишь один вывод: вы не знаете JS.
    Изменений в языке, которые ломали бы текущий API - нет (почти), обратная совместимость - основной пункт новых спек языка. Сам язык обновляется, добавляется новый сахар, новые webAPI, etc.

    Но прикладной слой... Мода и подходы довольно часто меняются, но яблоко от яблони... Как правило делают что-то новое, почти с тем же API, конфигурацией, что и у предшественника, только проще, быстрее в работе, сборке или чем-то еще, возможно начинают использоваться какие-то новые, нативные фичи и прочее (это я про всякую сборку, тест-раннеры и др., но лично мне это наоборот нравится, есть свои плюсы)

    > может ли flutter заменить его

    Он точно так же в контекте браузера собирается в JS, как и например TS. Браузер, сейчас, не умеет исполнять ничего, кроме JS. Только, по моему мнению в вебе flutter никому не нужен, слабое комьюнити, а м.б. и Dart вместе с flutter отправится в https://killedbygoogle.com через какое-то время...
    Ответ написан
    1 комментарий
  • Это считается браком для монитора 144гц?

    liaFcipE
    @liaFcipE
    Это вполне нормально для черный - белый цветов, особенно на VA матрице и особенно на бюджетных.
    Это явление называется black level smearing.

    Со временем станет пофиг, привыкнешь.
    Как вариант - сделай фон рабочего стола не черной заливкой))

    Определенный игровой монитор с частотой 144 Гц может иметь указанную скорость отклика пикселя GtG (от серого к серому) 4 мс, однако это всего лишь маркетинговые махинации, поскольку на самом деле это не относится к средней скорости перехода пикселя, а скорее к максимально возможной.

    Таким образом, пиксели могут перейти от 80% серого к 60% серого за 4 миллисекунды, как указано, но , например, им может потребоваться более 30 миллисекунд, чтобы перейти от 0% серого (черного) к 20% серого .

    Мониторы с панелью VA, в частности, имеют очень медленные переходы пикселей от темных к серым или ярким оттенкам (время нарастания), что приводит к большому количеству видимых ореолов (т.е. следов) за быстро движущимися объектами, когда задействовано много темных пикселей. в сцене.

    Это затрагивает большинство мониторов VA, за исключением изогнутых игровых дисплеев Samsung Odyssey G9 , Neo G9 и G7 и KTC M27T20 .


    Ну или можешь попробровать чутка затюнить, но многого оно не даст.
    https://www.displayninja.com/what-is-va-smearing/
    Ответ написан
  • Как лучше создать дерево через Proxy?

    liaFcipE
    @liaFcipE
    const $ = new Proxy(
      {},
      {
        get(_, n) {
          return (children, attrs) => {
            const _ = document.createElement(n);
            [children]
              .flat()
              .forEach(v => v && _.appendChild(typeof v !== "object" ? document.createTextNode(v) : v));
            Object.entries(attrs || {})?.forEach(([k, v]) => _.setAttribute(k, v));
            return _;
          };
        },
      }
    );
    
    const DOM = $.div(
      [
        $.span("first child span"),
        $.span([
          "second child span",
          $.button("button inside second span", { type: "button", id: "nicebutton" }),
        ]),
      ],
      { id: "root" }
    );
    
    console.log(DOM);


    648c6fc8a7407953194956.png
    Ответ написан
    3 комментария