Задать вопрос
  • Как одновременно заставить работать корпоративный VPN и "свой" и где взять все домены\подсети заблоченных сайтов?

    liaFcipE
    @liaFcipE Автор вопроса
    Если сперва запустить Amnezia VPN с раздельным тунелированием, а потом - Cisco Any Connect
    То они более не конфликтуют и работают вместе (Windows).
    Ответ написан
    Комментировать
  • Как из строки с путём получить элемент массива?

    liaFcipE
    @liaFcipE
    <?php
    
    $string = "k1/k2/k3";
    $keys = explode('/', $string);
    
    $arr = [];
    
    $current = &$arr;
    foreach ($keys as $key) {
        $current = &$current[$key];
    }
    
    $current = "last nested item";
    var_dump($arr);
    
    /*
    array(1) {
      ["k1"]=>
      array(1) {
        ["k2"]=>
        array(1) {
          ["k3"]=>
          &string(16) "last nested item"
        }
      }
    }
    */


    Как воображение вообще дошло до '[\'' . $v . '\']'?
    Ответ написан
    5 комментариев
  • Почему более 100% загрузка ЦП в Docker на сервере Debian с 1 ГБ оперативной памяти VPS?

    liaFcipE
    @liaFcipE
    > У меня странная вещь с моим VPS
    > 1 ядром \ 1 ГБ ОЗУ
    > WireGuard, Pteradacryc Daemon NODE + Docker. А сам Docker запускает небольшой игровой сервер на 350-450 МБ.

    А что странного то тут?) У вас буквально VPS за сотку, а вы там докер запускаете)
    Вы буквально удивляетесь, почему ваш ВАЗ 2110 не разгоняется за 5 сек до 200 км/час))
    Ответ написан
  • Как очистить HTML от всех аттрибутов?

    liaFcipE
    @liaFcipE
    В любом +\- редакторе есть замена по регуляркам, просто сделать замену навскидку по <\s*([a-zA-Z0-9]+)([^>]*[^\/])> на пустую строку (регулярку не проверял).

    А так, скрипт на лобом языке написать 5 минут, даже без особых навыков, в эру то чатов жпт... Ему можно даже просто скормить HTML и порпросить почистить.
    Ответ написан
  • Обьясните в чём суть инкапсуляции?

    liaFcipE
    @liaFcipE
    В основном это защита от самого себя и своих коллег-обезъян. В первую очередь это контроль доступа, предотвращение кривого изменения состояния объекта и наконец возможность изменять внутреннюю реализацию без изменения внешнего интерфейса.

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

    Это не про защиту от хакеров.
    Ответ написан
  • Как установить старый проект на Windows?

    liaFcipE
    @liaFcipE
    > Докер ужасно работает на Windows.
    Нормально все работает. никакой глобально разницы не вижу.
    Просто надо помнить, что если используется WSL2 - хранить файлы проекта надо так же в файловой системе WSL2, иначе будет тормознуто все.
    Ответ написан
    Комментировать
  • Как запустить composer i в контейнере PHP что бы он остался в статусе Up?

    liaFcipE
    @liaFcipE
    Ну потому, что ты запускаешь композер... И все, это весь твой ENTRYPOINT, который отработав отдает код 1. Ты же не запускаешь свой условный php-fpm и правда этому удивляешься?

    > что бы при старте контейнера в нем сразу загружались все перечисленные зависимости из файла composer.json

    В этом не то, чтобы много смысла, Dockerfile это не про старт контейнера, а его сборку. Если тебе нужно будет обновить зависимости - ты будешь пересобирать весь образ? Это не очень логично.

    Можно запустить любой готовый образ композера с командой install, чтобы у тебя приехали все зависимости.
    Можно зайти в шелл запущенного контейнера php и сделать composer i.
    Можно конечно написать рабочий Dockerfile, который делает RUN composer i, а в ENTRYPOINT'е имеет запуск демона php-fpm...
    Ответ написан
    Комментировать
  • Выключается монитор при включении холодильника (на 1-2с), варианты фикса?

    liaFcipE
    @liaFcipE Автор вопроса
    Внезапно исправилось тем, что просто подключил провод по более короткому Display Port (самый обычный нищий провод с коробки от моника).

    Было по 3ех метровому HDMI (покупал кстати отдельно и за дорого по меркам кабеля, он вроде весь в оплетке, толстенный, металлические насадки, DEXP Premium)

    Я буквально проверил так:

    Вырубил холодильник с розетки, воткнул обратно - монитор погас.
    Сменил кабель, сделал тоже самое - монитор не гаснет.
    Ответ написан
  • Существуют ли программы для реверс инженеринга минифицированного кода на JS?

    liaFcipE
    @liaFcipE
    Никак, вообще. Сборщиков и плагинов масса, замотать фарш после сборки JSX => JS обратно... Такая себе затея. В итоге ты никак не получишь нормального кода, который хоть чуточку можно поддерживать.

    Зачем вообще заниматься такой ерундой, если создать реплику почти любого фронтенда куда проще того, что ты хочешь сделать...
    Ответ написан
    4 комментария
  • Возможно ли через 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 комментария