Ответы пользователя по тегу JavaScript
  • Какие обязанности клиентской и серверной части?

    @nirvimel
    Если все, чем вы занимаетесь в web, сводится к CRUD, тогда роль бекенда в вашей работе может сводиться к:
    1. Аутентификация юзера.
    2. Проверка прав доступа.
    3. Валидация данных от юзера.

    Когда вы столкнетесь с более тяжелыми приложениями с некоторой бизнес логикой (даже!), тогда вы поймете, что фронэнд занимает такую долю в проекте, какую долю занимает кнопка "Пуск" во всей ОС Windows.
    Ответ написан
    Комментировать
  • Что я не понимаю в замыканиях?

    @nirvimel
    Сама функция inBetween вызывается на этой строке.
    alert( filter(arr, inBetween(3, 6)) ); // 3,4,5,6
    Обратите внимание, она не передается в filter, а именно вызывается в этом месте. Дальше из себя она возвращает другую функцию function(x), внутри нее переменные a и b принимают конкретные значения 3 и 6 в этот момент. Дальше возвращенная функция function(x) передается в filter в качестве параметра func, именно она и вызывается в этой строке:
    if (func(val)) {
    Ответ написан
    Комментировать
  • Как объяснить разную скорость выполнения вложенных циклов в разных языках?

    @nirvimel
    Меня как-то не устроило то, как вы оценили производительность Python, поэтому я взялся чуть подправить ваш пример для демонстрации совершенно других результатов. Запуск моего примера кроме установки numpy (pip install numpy), потребует установку еще одной интересной библиотеки (pip install numba) с ее установкой могут быть связанны некоторые трудности на различных ОС (она зависит еще и от llvm), но, поверьте, оно того стоит, полученные цифры производительности должны вам понравиться.
    Для демонстрации реальной скорости вычислений в моем примере миллион итераций это довольно мало, камень не успевает хорошо прогреться. Обратите внимание, я заменил миллион итераций на 100 миллионов, поэтому полученный результат надо разделить на 100 для сравнения с другими языками. Вот, собственно, сам код:
    from numba import jit
    import numpy
    
    
    @jit
    def inner_func(a_list, b_list):
        sum = 0
        j = 0
        for y in range(0, 16):
            for x in range(0, 16):
                p = a_list[j] - b_list[j]
                sum += p * p
                j += 1
        return sum
    
    
    @jit
    def outer_func(a_list, b_list):
        sum = 0
        for g in range(0, 100000000):  # 100 000 000 == 10^8 !!!
            sum += inner_func(a_list, b_list)
        return sum
    
    
    def main():
        maxint = numpy.iinfo(numpy.intc).max
        a_list = numpy.random.randint(maxint, size=256)
        b_list = numpy.random.randint(maxint, size=256)
        sum = outer_func(a_list, b_list)
        print(sum)
    
    
    if __name__ == '__main__':
        main()

    Если вам удалось это запустить и полученные цифры вас впечатлили, то я бы попросил подправить в вашем вопросе ту часть, которая касается Python, для восстановления справедливости в отношении этого великолепного языка.
    Ответ написан
  • Какая опасность в динамическом подключении скрипта?

    @nirvimel
    Если теги не фильтруются и спец.символы не экранируются, то возможен XSS.

    Надо экранировать символы, например, так по-простому, или специальными библиотеками, типа этой.
    Ответ написан
    2 комментария
  • Возможно ли "потоковое" скачивание множества файлов с сайта?

    @nirvimel
    Можно использовать TAR в качестве архива. Это дает:
    1. Нулевую дополнительную нагрузку на сервер по причине отсутствия компрессии.
    2. Возможность программно писать такой "архив" на лету прямо в открытое tcp соединение (со вставкой HTTP-заголовков в начале).
    3. Возможно даже написать докачку архива после обрыва соединения через "206 Partial Content" и "Content-Range:", также на лету, мгновенно, без переборки архива от начала. Это нетривиальная задача, но вполне решаемая.
    Ответ написан
    6 комментариев
  • Области применения JS в современном IT?

    @nirvimel
    Кроме js вы пробовали только php, и этот горький опыт заставил вас остановить свой выбор на js? Не стоит на таком примере делать выводы обо всех других языках. В сфере профессионалов принято не подыскивать новые задачи под единственный известный язык, но, наоборот, подбирать (и изучать при необходимости) язык исходя из стоящих задач. Прежде чем останавливать свой выбор на каком-то конкретном языке или стеке технологий вам нужно сначала определиться с тем кругом задач, о области которых вам интересно работать, и потом подходить к выбору инструментов для решения этих задач. Все зависит от того что вас интересует: web-разработка, фронтэнд, бекэнд, десктопные приложения или мобильные, разработка игр, больше/меньше заниматься пользовательским интерфейсом, может быть, системное программирования?
    Ответ написан
    7 комментариев
  • Как сделать аутентификацию в современном веб-приложении?

    @nirvimel
    Как и везде:
    1. /api/auth принимает {"login":"user", "password":"qwerty"} возвращает {"session_id":"UUID:4545633896344"}
    2. Все остальные API принимают параметр session_id, без него отвечают 401, с неверным session_id отвечают 403.
    3. Сессии не вечные, через N минут после последнего api-вызова стираются.
    4. Если клиент внезапно получает 403, то не кричит об этом юзеру сразу, а пытается перелогиниться хотя бы один раз.
    Ответ написан
  • Зачем устанавливать nginx для ghost blog?

    @nirvimel
    1. Nginx должен раздавать статические ресурсы. Раздавать статику на скрипте в production - не правильно.
    2. Он потребляет на порядок меньше памяти и раздает статику на порядок быстрее скрипта.
    3. Только Nginx позволяет сдержать DDOS Хаброэффект и прочие пиковые нагрузки. Он умеет лимитировать трафик и поможет серверу не зависнуть, не выжрать всю память и не вылететь с MemoryError. Он хорошо интегрируется с Fail2Ban. В общем Nginx - это щит который позволяет держать удар снаружи.
    4. Он ведет удобные логи, формат которых легко настаивается, существует разный удобный софт для просмотра этих логов.


    Но если у вас локалхост исключительно для разработки, то Nginx вам в общем не нужен.
    Ответ написан
    Комментировать
  • Может ли JavaScript (клиентский) работать с файловой системой?

    @nirvimel
    Из браузера - НЕТ.
    Ответ написан
    Комментировать
  • Доступ к файлам посетителя из браузера - как объяснить что запрещен?

    @nirvimel
    Объяснить так - скинуть ссылку, перейдя по которой он увидит: Все ваши файлы теперь зашифрованы, переведите $100500 на кошелек 64578934725243457938 чтобы получить ключ для расшифровки.
    Ответ написан
    Комментировать
  • Концепция создания бота в многопользовательской игре на WebSocket?

    @nirvimel
    Смешивать логику сервера и логику бота - архитектурно неправильно. В зависимости от типа игры бот может быть:
    1. Для однопользовательской - бот может быть отдельным модулем/классом. При запуске игры сервер запускает всех необходимых ботов, передает им ссылку на себя, а дальше они действуют как клиенты, подписываются на оповещения о событиях на сервере, в обработчике этих событий отрабатывают свою логику и отдают команды серверу через тот же клиентский интерфейс. Сервер может знать "своих", чтобы не путать с живым клиентом, но завязывать на этом слишком много логики на сервере не стоит.
    2. Для MMO - бот отдельный процесс ОС (может даже на другой машине), он запускается независимо и его падение не затрагивает сервер. Специальный планировщик следит за ботами и перезапускает тех, которые упали по вине кривых скриптов. Ботов можно доверить писать индусам, но сервер должен быть непотопляемым, поэтому нужно стремиться вынести за его пределы как можно больше кода.
    Ответ написан
    3 комментария
  • Как вставить текстовую строку перед заданным элементом?

    @nirvimel
    var sp2 = document.getElementById("childElement");
    var parentDiv = sp2.parentNode;
    var sp1 = document.createElement("div");
    parentDiv.insertBefore(sp1, sp2);
    sp1.outerHTML = "<h1>Result of ajax request</h1>";

    В документации есть один тонкий момент:
    If the element has no parent node, that is if it is the root node of the document, setting its outerHTML property will throw a DOMException with the error code NO_MODIFICATION_ALLOWED_ERR.

    Это означает, что свежесозданный элемент должен сначала быть подключен к DOM-дереву прежде чем свойство outerHTML становится доступным на запись. Поэтому порядок последних двух строк в примере критичен.
    Ответ написан
    5 комментариев
  • Как перебрать все возможные комбинации цифр в числе?

    @nirvimel
    var permArr = [],
      usedChars = [];
    
    function permute(input) {
      var i, ch;
      for (i = 0; i < input.length; i++) {
        ch = input.splice(i, 1)[0];
        usedChars.push(ch);
        if (input.length == 0) {
          permArr.push(usedChars.slice());
        }
        permute(input);
        input.splice(i, 0, ch);
        usedChars.pop();
      }
      return permArr
    };
    
    document.write(JSON.stringify(permute([5, 3, 7, 1])));

    Не мое, конечно. Просто спер отсюда.
    Ответ написан
    Комментировать
  • Как вернуться к началу функции jquery?

    @nirvimel
    Завернуть весь ваш код в функцию и вызывать ее из любого места внутри ее самой:
    function setup() {
       $( "#first" ).click(function() {
       ...
       setup()
       ...
       });
    }
    Ответ написан
    Комментировать
  • При входе на сайт короткое видео и потом его скрыть?

    @nirvimel
    После того как совершите ТАКОЕ не главной, замерьте как изменился ваш траффик, переходы с главной вглубь сайта и особенно pages/visit.
    Предсказываю:
    1. Падение поискового трафика в половину. Так как гуглобот просто не дождется "окончания загрузки страницы".
    2. Падение переходов с главной вглубь. Трафик будет течь на главную, а переходов с нее не будет, трафик будет просто "испарятся". Почему так? - Спросите у маркетологов.
    3. Резко упадет pages/visit - главный критерий моей правоты.
    Ответ написан
    Комментировать
  • Как подгрузить разный контент в зависимости от клика?

    @nirvimel
    Вам поможет JqueryUI Tooltip. Его обработчик можно навешивать не на все элементы, для которых всплывающие окна, а только на контейнер их содержащий. Дальше (смотрите пример с custom-content) в обработчике вы получаете сам тот элемент который вызвал всплывающее var element = $( this ); смотрите его свойства, формируете html-фрагмент, который представляет содержимое окна (по сути шаблон + в нужных местах вставить id (или что там у вас)) и возвращаете это из обработчика в виде строки. Все. И никаких ajax-ов.
    Ответ написан
    1 комментарий
  • Реализовать простую web-программу отображения "матрицы" чисел -- какой способ выбрать?

    @nirvimel
    Для того, чтобы со стороны сервера передать какой-то сигнал в уже открытую в браузере страницу существует одна технология - WebSocket (не считая Push, которым пытались решить эту проблему во времена до появления WebSocket).
    На стороне сервера существует разные решения на Pyhon: (1) под Flask + Gevent (2) под Flask + uWSGI (3) ws4py и другие.
    Есть удобная библиотека Socket.IO, это клиент и сервер на javascript, у нее собственный высокоуровневый протокол поверх WebSocket (+ поддержка старых браузеров без WebSocket). Сервер соответственно под node.js (не совсем подходит под ваши требования). Но есть сторонние реализации сервера на Python под Flask и без Flask.
    PHP для WebSocket - не лучшее решение и причина в этом.
    Ответ написан
    Комментировать
  • Как помощью Кривой Безье плавно увеличить значение переменной?

    @nirvimel
    Есть такая библиотека на CoffeeScript.
    Если задать Smooth.METHOD_CUBIC = 'cubic' то это и будет кривая Безье.
    Ответ написан
    3 комментария
  • Как научиться делать "сайт под ключ"?

    @nirvimel
    К тому что сказал Антон Измайлов хочется добавить, что в одиночку "под ключ" берутся делать в основном отчаянные раздолбаи. Заказчикам нужно остерегаться таких "на все руки мастеров" как огня и обходить за километр. Это вообще - хороший детектор индуса-дилетанта, когда фрилансер одиночка (конторы, со своими представителями на фрилансе - исключение) горит желанием сделать заказчику под_ключ.

    Конечно, из этого правила (как из любого) есть исключения. Но если вы считаете себя таким исключением, тогда вы должны хорошо понимать то, кем являются 90% ваших "коллег"/конкурентов и с кем бок о бок вам придется работать, а точнее драться за клиентов, число которых всегда меньше числа индусов.

    Мой совет: Не стремиться стать полезным для каждого. Фриланс - это не профессия, а просто форма заработка за свой труд. Работа на фрилансе не отменяет необходимости в специализации и обретении конкретной профессии. Выберете себе сектор рынка труда и станьте профессионалом своей области. Это в будущем обеспечит (почти) постоянную трудовую занятость и достойную оплату своего труда. Тогда вам не придется конкурировать с легионом индусов и драться с ними за каждого клиента.
    Ответ написан
    3 комментария