Задать вопрос
  • Какой самый адекватный вариант инкапсуляции в JS?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    1. Просто переменные в замыкании, как в Вашем примере. Из плюсов - работает везде, из минусов - переменные общие для всех инстансов
    2. Просто соглашение, что определенные имена считать приватными и не трогать, общепринятым таким соглашением являются имена начинающиеся с подчеркивания _ - работает везде, но по факту ничего не делает, все на совести кодера
    3. Поля символы (Symbol()) - нужен es2015+, по факту тоже не совсем приватные, из вне к ним можно доступ получить если есть доступ к символу (или сами его отдадите, или есть возможность получить все символы объекта), но уникальность символа дает достаточную приватность. Я лично предпочитаю именно этот вариант
    4. объект в WeakMap с текущим this в качестве ключа - es2015+, полная приватность, но достаточно громоздко, суть в том, что в конструкторе мы создаем новый объект для хранения приватных свойств и сохраняем его в WeakMap с ключом this, а там где нужно извлекаем по this
    Ответ написан
    3 комментария
  • Намного ли webpack сложнее чем gulp?

    bingo347
    @bingo347
    Crazy on performance...
    Во-первых, это разные вещи, webpack - это бандлер (сборщик если по-русски), gulp - таскраннер (запускалка задач)
    Во-вторых, их можно использовать как совместно так и раздельно
    В-третьих, gulp потихой теряет актуальность, ибо npm вполне умеет быть таскраннером

    Что проще? все же webpack, тут почти всегда все задается декларативным конфигом в виде js объекта, а в gulp надо писать код в функционально-императивном стиле
    Ответ написан
    1 комментарий
  • Как функция получает доступ к себе при рекурсивном вызове?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    в текущей области видимости 'func' не объявлена

    как раз таки объявлена. В любой именованной функции ее имя создается в момент вызова (наравне с arguments и this) и ссылается на саму функцию. Наиболее наглядно это показывают именованные функциональные выражения:
    var f = function func() {
      console.log(func.name); // 'func'
    };
    console.log(f.name); // 'func'
    console.log(func.name); // Reference error так как func нет в этой области видимости
    Ответ написан
    Комментировать
  • Как на веб хостинг установить десктопную ubuntu?

    bingo347
    @bingo347
    Crazy on performance...
    вопрос зачем? запускать gui софт? дешевле по ресурсам будет просто поставить X-сервер и делать его проброс через ssh, тогда запускаемые на сервере утилиты будут исполнятся там, а рисоваться у Вас. Естественно на системе, в которой рисуем тоже должны быть иксы, хотя на wayland и на винду есть костыли, насчет макоси не уверен, а большинство DE/WM линукса с этим будут нормально работать. Ну и так как данных по сети будет гоняться меньше, данный вариант будет шустрее, чем проброс всего десктопа через vnc
    Так же стоит учесть, что на сервере скорее всего нет видеокарты (совсем, даже встроенной в проц), для многих современных gui приложений это станет проблемой.

    ну и если не трудно, объясните мне, какой в этом практический смысл?
    Ответ написан
    3 комментария
  • Почему файлы не загружаются на сервер посредством AJAX?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Вы отдаете заголовок xhr.setRequestHeader('Content-Type', 'multipart/form-data')
    а отдаете просто файл
    Так понимаю на сервере php, так что буду основываться на этом, хоть и не помню его толком
    вариант 1: оборачивать файл в FormData и отправлять его, читаем про него тут https://developer.mozilla.org/ru/docs/Web/API/FormData
    вариант 2: если отдаем как есть, то читаем файл из php://input если передавать только файл, там будет только он
    Ответ написан
    Комментировать
  • Ошибка при установки плагина nodejs и как ее исправить?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Когда вы все уже научитесь читать вывод программ?..
    Ошибка в синтаксисе JSON в файле package.json
    Ответ написан
    3 комментария
  • Как лучше организовать структуру такого проекта?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Общие части выделить в npm модули, по подключению есть три варианта:
    1. решение в лоб, npm link, я бы не использовал, так как это больше для отладки модулей
    2. npm вполне себе нормально работает с git репозиториями, как через ssh так и через http, лучше через ssh, так как если репо приватный, на http придется при каждой установке/обновлении вводить пароль, автоматизировать не получится, а на ssh можно пару ключей повесить
    3. немного гиковское, зато самое гибкое - поднять свой npm репозиторий, в конфиге npm направить на него либо отдельный скоуп (@scope/module) или вообще все, если репо умеет проксировать (и кэшировать) неизвестные ему модули на официальный репо
    Ответ написан
    Комментировать
  • Как выгрузить файлы в удалённый репозиторий?

    bingo347
    @bingo347
    Crazy on performance...
    На удаленной машине нужно создать bare репозиторий:git init --bare project_name.gitгде project_name - имя проекта
    на локальной машине, в папке проекта:
    git remote add origin project_url
    git push -u origin remote_branch_name
    где project_url - url проекта, например при доступе по ssh и работе git из под пользователя git: git@server.com:/path/to/project_name.git
    remote_branch_name - как текущая ветка будет называться на удаленном репозитории, например master
    Ответ написан
    6 комментариев
  • Как можно быстро создать список хешей sha256 и MD5 из словаря?

    bingo347
    @bingo347
    Crazy on performance...
    простейший скрипт на баше:
    for l in $(cat text.txt); do
      echo $l | md5sum >> md5.txt;
      echo $l | sha256sum >> sha256.txt;
    done;
    Ответ написан
    Комментировать
  • Как сгруппировать объекты из массива по определенному полю объекта, используя метод Reduce?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    function groupByDate(arr) {
      //свертка массива во временный объект, с датами в качестве ключей
      const temp = arr.reduce((acc, elem) => {
        // делим строку по пробелу и извлекаем 0й элемент '2018-03-05 12:00' -> '2018-03-05'
        const date = elem.date.split(' ')[0];
        //если ключа-даты еще нет в объекте, записываем туда пустой массив
        if(!acc[date]) {
          acc[date] = [];
        }
        // ложим текущий элемент в соответствующий массив
        acc[date].push(elem);
        return acc;
      }, {});
      // извлекаем все ключи получившегося объекта в массив
      // и преобразуем массив ключей в массив значений
      return Object.getOwnPropertyNames(temp).map(k => temp[k]);
    }
    Ответ написан
    5 комментариев
  • Чем отличаются эти две записи?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    в 1 случае Вы сразу создали новый объект на основе прототипа AllElemetsParent и присвоили его в переменную CreateNewElement
    во 2 случае, вы присвоили свойству prototype объекта CreateNewElement ссылку на то что хранится в AllElemetsParent, если CreateNewElement - функция, то при вызове ее с оператором new будет создаваться новый объект на основе прототипа AllElemetsParent, он поступит в функцию как объект this и будет возвращен оператором new
    Ответ написан
    Комментировать
  • Как установить модуль Node.js на машине без интернета?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Для начала теория:
    1. Сам репозиторий npm располагается по адресу https://registry.npmjs.org/
    работает он по принципу http+rest+json
    2. Метаданные конкретного пакета можно получить по адресам:
    https://registry.npmjs.org/$package
    https://registry.npmjs.org/$package/$version
    где $package - имя пакета, $version - нужная версия или latest для самой последней
    3. в методанных по адресам https://registry.npmjs.org/$package/$version обязательно присутствует объект dist содержащий поля shasum (контрольная сумма архива) и tarball (ссылка на сам архив упакованный tar+gz), качаем архив по ссылке, при необходимости проверяем контрольную сумму
    4. там же могут содержаться объекты dependencies и devDependencies, формат как в файле package.json

    Базовую теорию рассказал, начать с этим писать свой npm/yarn уже можно, но не нужно
    Действуем:
    1. Пишем скрипт, который выкачивает tarball пакета и всего дерева его зависимостей и запускаем на машине где есть интернет
    2. Копируем все это на целевую машину
    3а. Устанавливаем все пакеты как расписал Константин Китманов через npm install ./package.tgz
    Однако npm может опять же захотеть интернет, чтоб подтянуть зависимости, поэтому:
    3б. Делаем установку вручную:

    в папке проекта создадим node_modules:
    mkdir node_modules

    распакуем туда архивы, package меняем на имя пакета, version - на версию:
    tar -xzf package-version.tgz node_modules/package

    если у нас при подтягивании зависимостей получилось 2 версии одного пакета, то старшую ложим в свой node_modules а младшие в node_modules тех пакетов, которые затребовали такую версию

    некоторые пакеты потребуют компиляции c++ части, тут понадобится python2 и build-essential в системе, которые можно поставить из deb пакетов (как выдернуть deb пакет из любого репозитория apt расписывать не буду, там принципы похожие), для компиляции достаточно запустить:
    npm build path/to/unpacked/package
    Ответ написан
    Комментировать
  • Как разместить картинку как на макете?

    bingo347
    @bingo347
    Crazy on performance...
    /*блок родителя*/
    .parent-block {
      position: relative;
      width: 100%;
      max-width: 1330px;
      margin: auto;
    }
    /*блок картинки*/
    .image-block {
      position: absolute;
      right: 0;
      transform: translateX(60%);
    }
    Ответ написан
    Комментировать
  • Выбор ОС, какая для программиста?

    bingo347
    @bingo347
    Crazy on performance...
    хочется подтянуть знания unix систем

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

    Ну а так, для новичка, я бы выбирал между Linux Mint + Cinnamon и Deepin + DDE

    Fedora, Ubuntu, CentOS, openSUSE

    Fedora - тестовый полигон RedHat, имхо но даже Arch стабильнее...
    Ubuntu - неплохой выбор для начала, посоветованый мной Mint сделан на основе нее
    CentOS - взяли федорино горе, допилили все то г., что RH толкает за бабки... на десктопе не юзал, ибо на серверах ее хватило по уши...
    openSUSE - будет лучшим выбором, если Вы в отличии от меня сторонник rpm/yum (я лично предпочитаю dpkg/apt, хотя нет, лучше emerge ничего так и не придумали)
    Ответ написан
  • Alpine или kali linux?

    bingo347
    @bingo347
    Crazy on performance...
    kali - дистр основанный на debian, основная цель - предоставить из коробки набор по для тестирования безопасности и вскрытия уязвимостей, вообщем то все это можно получить и на обычном debian при желании, и на любом другом linux
    alpine - если не ошибаюсь самостоятельный дистр, направленный на минимальность затрачиваемых ресурсов, сам по себе, на мой взгляд, не особо то жизнеспособен, разве что на встраиваемых системах, но имеет большую популярность благодаря проекту docker с его идеологией "1 контейнер - 1 сервис"
    Ответ написан
    Комментировать
  • Как вызвать два setTimeout в цикле?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    function delay(t) {
      return new Promise(resolve => setTimeout(resolve, t));
    }
    //...
    clients.reduce((p, {person, city, sum}, i) => p.then(() => delay(10000 * (i + 1))).then(() => {
      //show code
    }).then(() => delay(15000 * (i + 1))).then(() => {
      //hide code
    }), Promise.resolve());
    Ответ написан
    Комментировать
  • Как написать функцию выбора и возврата рандомного цвета?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    function randColor() {
      var c = Math.floor(Math.random() * 0xffffff).toString(16);
      if(c.length < 6) {
        c = '0'.repeat(6 - c.length) + c;
      }
      return '#' + c;
    }
    Ответ написан
    Комментировать
  • Linux Ubuntu, Mint как избавится от локализации в консоле?

    bingo347
    @bingo347
    Crazy on performance...
    alias git='LANG=en_US.UTF-8 git'
    в .bashrc
    Ответ написан
    Комментировать