• Как организовать файловое хранилище пользователей (виртуальная фс или нативная)?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    А тут все зависит от количества и размера файлов, от количества пользователей и от распределения файлов по пользователям. Поясняю, если пользовтелей много (миллионы) а файлов у них мало (десятки) то у Вас будет много папок, а в них мало файлов, это не экономный расход файловой системы, будет много уходить на оглавление, и будет папка с медленным доступом (в которой лежат папки пользователей). Если пользователей мало, а файлов много, то так же, будут папки с очень большим оглавлением. Тут можно или выбрать файловую систему, которая решает эти проблемы или самому сбалансировать дерево папок, чтобы поиск был оптимальным. Как добиться оптимального поиска, сделать сбалансированную структуру папок, чтобы в каждой было не много и не мало файлов с очень различающимися названиями. Например, можно сделать 2х или 3х уровневую систему папок, в которой лежат файл переименованные в HEX, например /EA8D253F/2145AE32/F259C201 Нам нужно генерировать случайные имена папок и файлов, а потом в базу данных писать этот путь. это будет оптимально для любой файловой системы и любого кол-ва файлов, просто увеличте длину имен, алфавит и вложенность папок (в завистмости от особенности файловой системы и своих нужд, это нужно изучать). Кроме всего, это решает кучу проблем - файлы с одинаковыми именами и файлы со странными символами в именах (в том числе арабские, китайские и прочие UTF8 имена), исполняемые файлы и вообще вопрос безопасности, относительную деперсонализацию данных, и прочее... Про FTP лучше забудьте, ни какие пользователи по FTP ходить не должны, это архаичный протокол позднего проволочного века, применяемый сейчас только мной и прочими извращенцами. А если Вы еще будете вычислять для файлов хеши, несколько разных хешей на всякий случай, и хранить их вместе с именами и всеми метаданными, в базе, то можно избавиться от дублирования на диске (есть случаи, когда у разных пользователей большой процент одинаковых файлов). Вот тут кое-какие наброски: /lib/impress.files.js#L111-L174 даже файлы на винте сжимаются двумя ZIP и GZIP в зависмсти от размера. Берите, дарю методу...
    Ответ написан
  • Какой тип конфиг-файла лучше всего использовать для Node.js?

    Robur
    @Robur
    Знаю больше чем это необходимо
    1) основная особенность - то что при правильной работе, параметры берутся не только из этого файла но и из реальных переменных окружения. Это позволяет иметь разные настройки в разной среде (локально одни, на продуктовом сервере другие, у Васи - третьи). Плюс разные вещи типа паролей и ключей не хранятся в исходном коде, а хранятся там где этот код будет выполняться.
    2) Формат понимаемый всеми. Удобен если ваши конфиги обрабатываются или генерятся где-то еще кроме ноды
    3) удобен тем что можно запихать туда какую-то логику.

    берите 3+1
    все что может зависеть от среды выполнения - в .env, все остальное - в js - конфиг где вы все это читаете и собираете в кучу
    Ответ написан
    2 комментария
  • Умерла-ли флешка?

    POS_troi
    @POS_troi
    СадоМазо Админ, флудер, троль.
    Тащите в гарантию.
    Имеет место проблема или с контроллером или с самой флэш памятью.

    И неужели так быстро могли изюзаться чипы памяти?

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

    В общем в гарантию, если нет гарантии то в мусор, хотя перед мусором можно попробовать потыкать палкой в контроллер (прошивка), но данные будут утеряны и юзать такую флешку потом это такое себе удовольствие, влюбой момент потеря данных это без проблем.
    Ответ написан
    5 комментариев
  • Умерла-ли флешка?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    R.I.P.

    Однозначно. Сталкивался как раз с таким - флэшка внезапно перестала писаться. Пока чухался с тем, чем ее проверить (данных на ней не было) - она и читаться перестала :(

    Скорее всего, имел место брак. Наверное, еще гарантия, раз апрель. Тащите к продавану, пусть меняет по гарантии.
    Ответ написан
    4 комментария
  • Стоит ли использовать json web tokens?

    AlexanderMint
    @AlexanderMint
    Web Developer
    JWT это возможность подписать нужный тебе "текст", отдать кому то и проверить его (что он не был изменен) в дальнейшем когда он тебе придет обратно. Много проектов его используют, полет нормальный.

    Пароли в нем не хранят, как и любую приватную информацию, ведь любой JWT можно просмотреть без ключа.
    А утечка secret key это не проблема JWT, а вашей организации.

    P.S. шифрование и JWT мало чем связанны, а ключ - это всего лишь подпись, его утечка ведет за собой возможность подделать токен
    Ответ написан
    2 комментария
  • Как имитировать событие change?

    miraage
    @miraage
    Старый прогер
    VanillaJS:
    var event = new Event('change');
    var elem = document.getElementById('userName');
    elem.dispatchEvent(event);

    jQuery:
    $('#userName').trigger('change');
    Ответ написан
    1 комментарий
  • Как исправить ошибку [Intervention] Unable to preventDefault inside passive event listener due to target being treated as passive. See?

    А что не понятно? Нельзя вызывать event.preventDefault() внутри пассивного обработчика. А обработчики для тач-событий пассивны по умолчанию.

    Так что либо не вызывать preventDefault(), либо регистрировать обработчик как-то так:
    element.addEventListener(handleEvent, { passive: false });

    Подробнее здесь
    Ответ написан
    4 комментария
  • G"gulp" не является внутренней или внешней командой, исполняемой программой или пакетным файлом?

    x264
    @x264
    У меня тоже не запускается, если запускать так: npm gulp [task_name]
    но если в package.json в переменной scripts прописать команды в которых участвует gulp, то у меня все работает.

    Для примера публикую кусок package.json
    {
      "name": "project name",
      "version": "1.0.0",
      "description": "Landing page",
      "main": "gulpfile.js",
      "scripts": {
        "editorconfig": "editorconfig-cli",
        "stylelint": "stylelint 'source/sass/**/*.scss' --syntax scss",
        "test": "npm run editorconfig",
        "build": "gulp style",
        "start": "gulp [task_name]"
      },
      "author": "Vasya Pupkin",
      "license": "ISC",
    ...


    Я запускаю npm run start или npm run build все работает, как и любые команды если их прописать в package.json
    Вместо [task_name] нужно прописать свою команду. ))
    Ответ написан
    1 комментарий
  • Javascript try..catch?

    Как в случае браузерного, так и в случае серверного Javascript конструкция try/catch используется для отлова исключений в синхронных операциях (пример: десериализация JSON-данных или валидация данных которые ввёл пользователь). Если требуется обрабатывать ошибки в асинхронных операциях, то ошибка либо передается в callback-функцию (В Node.js общепринятым шаблоном вызова callback-функции является вызов вида callback(err, results), где лишь один из аргументов может принимать значения отличные от null.), либо в более сложных случаях генерируется событие 'error' объекта класса EventEmitter.

    В Node.js try/catch используется очень редко (в основном только при парсинге JSON-данных), это объясняется тем что большинство операций в Node.js асинхронны, как правило ошибку передают в callback-функцию или генерируют событие "error" у объекта класса EventEmitter.

    Вот пример иллюстрирующий, что try/catch не отловит исключение возникшее при выполнении асинхронной операции:

    function myApiFunc(callback)
    {
      /*
       * Пример некорректного перехвата исключений
       * в асинхронных операциях
       */
      try {
        doSomeAsynchronousOperation(function (err) {
          if (err)
            throw (err);
        });
      } catch (ex) {
        callback(ex);
      }
    }

    Дело в том, что исключение бросается и, соответственно , должно ловиться в том контексте, в котором вызывается функция. В данном примере try/catch и вызов функции бросающей исключение выполнятся в разных контекстах в силу асинхронности функции doSomeAsynchronousOperation.
    Ответ написан
    Комментировать
  • Как высчитывать количество дней до определенной даты?

    nyakove
    @nyakove
    Можно и не тащить сторонние библиотеки, все решается парой строчек кода

    let datestring = document.querySelector('#date').innerText; // получаем дату "Ч"
    let regexp = /(\d{2})\.(\d{2})\.(\d{4})/;
    let dateX = new Date(datestring.replace(regexp, '$2/$1/$3')); // парсим из нее дату с заменой строки в понятный JS формат (имеется в виду же 1 марта?)
    let dateToday = new Date(); // дата на момент захода на страницу
    let days = Math.floor((dateX - dateToday) / 86400000) // количество целых дней до ожидаемого дня
    Ответ написан
    Комментировать
  • Как мне сделать анимацию (встряхивание) CSS?

    Как вариант:
    animista.net
    Можно настроить анимацию так, как захочется. И без установки библиотек
    Ответ написан
    Комментировать
  • Какие есть оффлайн шпаргалки по JS, Node, MongoDB, Express?

    qork
    @qork
    { background: #F00B42 }
    Комментировать
  • Как правильно верстать такие переходы?

    profesor08
    @profesor08 Куратор тега CSS
    Трансформация обертки и обратная трансформация контента. Фоновое изображение должно быть дочерним блоком.
    Ответ написан
    Комментировать
  • Каким образом лучше обращаться к элементу по id?

    Stalker_RED
    @Stalker_RED
    const $ = selector => document.querySelectorAll(selector)
    $('#hello .world').forEach(...)


    Плюсы: коротко, работает не только с id но и с любыми css-селекторами
    Минусы: может взорвать кому-то моск, потому что слишком похоже на jQuery :)
    Но можно использовать другой символ

    Часто бывает удобно сразу сконвертировать в массив
    const $ = selector => Array.from(document.querySelectorAll(selector))
    Ответ написан
    3 комментария
  • Каким образом лучше обращаться к элементу по id?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    2-й Сильно сокращает кол-во символов в файле, но не известно, на сколько быстр
    Во-первых, если используется gzip, то разница в размере с первым вариантом незначительная. Во-вторых, сделайте бенчмарк и узнаете (спойлер алерт - это экономия на спичках).
    Ответ написан
    5 комментариев
  • Как сделать плавное перемещение элемента по нажатию клавиш?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Такое поведение происходит из-за того, что вы ловите событие нажатия, и из-за настроек компьютера.

    Точно так же в любом текстовом поле, если нажать букву и держать, она сначала появится один раз, затем пауза, затем она станет добавляться с регулярной частотой.

    Вместо этого используйте состояния. Когда клавишу нажали, игра перешла в состояние «едем вверх» например. И по таймеру или requestAnimationFrame() обновлять координаты игрока и дисплей.

    Когда клавишу отпустили, игра перешла в состояние «всё, не едем».
    Примерно так
    var player = {x:200, y:200, el:document.getElementById('player')};
    player.el.style.left = '' + Math.round(player.x) + 'px';
    player.el.style.top  = '' + Math.round(player.y) + 'px';
    
    var delta = {x:0, y:0};
    
    document.addEventListener('keydown', function(e){
      if(     e.key == 'ArrowRight') delta.x = 1;
      else if(e.key == 'ArrowLeft')  delta.x = -1;
      else if(e.key == 'ArrowUp')    delta.y = -1;
      else if(e.key == 'ArrowDown')  delta.y = 1;
    });
    
    document.addEventListener('keyup', function(e){
      if(     e.key == 'ArrowRight') delta.x = 0;
      else if(e.key == 'ArrowLeft')  delta.x = 0;
      else if(e.key == 'ArrowUp')    delta.y = 0;
      else if(e.key == 'ArrowDown')  delta.y = 0;
    });
    
    var ts = null;
    function step(timestamp) {
      if(!ts) ts = timestamp;
      var passed = timestamp - ts;
      //if(passed < 200) return window.requestAnimationFrame(step);
      ts = timestamp;
      if(delta.x || delta.y) {
        player.x += delta.x * passed / 10;
        player.y += delta.y * passed / 10;
        player.el.style.left = '' + Math.round(player.x) + 'px';
        player.el.style.top  = '' + Math.round(player.y) + 'px';
      };
      window.requestAnimationFrame(step);
    }
    
    window.requestAnimationFrame(step);


    При таком подходе можно одновременно зажимать, скажем, стрелку влево и стрелку вверх – точка поедет по диагонали.
    Фиддл.
    Ответ написан
    Комментировать
  • Почему ноут не видит вторую плашку ОЗУ?

    @BeatHazard
    Во первых твой ноутбук поддерживает общий объем памяти до 16 гигов.
    Во вторых в нем разъем для оперативной памяти DDR3L, атрибут L означает пониженное энергопотребление, в данных разъемах используется напряжение 1,35 В, обычные DDR3 к нему не подойдут, в них используется 1,5 В, а вторая плашка которую ты вставил как раз DDR3.
    Различие в частотах в принципе большой разницы не играет, даже плашки с разными частотами должны работать вместе по наименьшей частоте, однако иногда возникают проблемы в совместимости модулей от разных производителей, так что рекомендуется брать плашки одного производителя со схожими характеристиками , либо самые распространенные и универсальные, например Kingston.
    Ответ написан
    2 комментария
  • Почему ноут не видит вторую плашку ОЗУ?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Плохая затея подружить плашки разной частоты. Даже тот факт, что они разного производителя - уже нехорошо.

    Ваш ноутбук поддерживает 16Гб, так что лучше для полного счастья докупить две плашки по 8Гб и поставить.
    Запомните:
    Тип - DDR3L SODIMM
    Частота - 1600
    Так будет работать точно.

    Насчет частоты в CPU-Z - она и должна быть 800 (реальная), а эффективная 1600, потому что используется двойная скорость передачи данных (DDR), при которой обмен данными происходит дважды во время одного тика DRAM.
    Ответ написан
    5 комментариев
  • Зачем нужны prototype если все ключи и методы можно задать в конструкторе?

    @Melagomania
    Определять метод в конструкторе = создавать новую копию функции для каждого нового экземпляра класса. Это не есть хорошо: создав 10 экземпляров класса, мы получим 10 одинаковых функций (зачем?).
    Записывая метод в prototype, мы не присваиваем его непосредственно объекту. Метод окажется в свойстве __proto__ созданного экземпляра. Каждый экземпляр нашего класса имеет свойство __proto__ и это свойство у каждого экземпляра ссылается на ОДИН и то тот же объект, в который мы и записали наш метод, используя prtototype. Такми образом, записав функцию func в prototype и потом создав 10 экземпляров класса, мы получим всего ОДНУ функцию func, сохраненную в __proto__. Все созданные объекты будут использовать эту ЕДИНСТВЕННУЮ функцию, хранящуюся в общем месте.
    Вот как-то так.
    Ответ написан
    Комментировать
  • Что можно написать на Node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js

    Часто применяется для:

    1. Локальные приложения и утилиты командной строки
    • Сборщики и трансляторы
    • Пакетная обработка и сценарии отложенной обработки
    • Скрипты, CLI (интерфейсы командной строки)
    • Генерация документации, отложенное формирование отчетов
    • Сценарии тестирования для других систем

    2. Серверы
    • Серверы веб-приложений и SPA
    • Серверы и API для мобильных приложений
    • Любые другие веб-API (RPC, JSON, REST)
    • Серверы сообщений и трансляция событий (чаты, игры, интерактив)
    • Заплаты на уже готовые системы, написанные на других языках, для реализации вебсокетов, SSE, лонг-пулинга и т.д., т.е. для затыкания дыр, для решения проблем в узких местах уже работающих систем.

    3. Клиенты
    • Оконные приложения (nw.js, node-webkit)
    • Кравлеры, парсеры и сбор данных

    4. Железо
    • Программирование микроконтроллеров (arduino, espruino, tessel)
    • Промышленная автоматизация

    Редко применяется (но подходит) для:
    • CMS, публикация контента (просто ниша уже занята и в этой задаче нода не дает чего-то принципиально нового или сверх соблазнительного).
    • Массовая электронная коммерция и торговля (не применяется для массовых движков магазинов, но используется отдельными крупными компаниями для торговых и платежных задач в качестве дополнительного средства к уже имеющемуся ПО, по сути закрывает узкие места).

    И плохо подходит:
    • Вычисления и моделирование, со скоростью математических операций нода и JS, как не типизированный язык, не дают хороших показателей
    • Научные приложения (по тем же причинам)
    Ответ написан
    10 комментариев