Задать вопрос
  • Пользователи оставляют на сайте ложные заявки на покупку, как узнать IP адреса тех кто отправляет заявки?

    lastuniverse
    @lastuniverse
    1. Сделайте капчу с вопросом на который надо ввести ответ.
    2. Сделайте ограничение на количество попыток ваода.
    3. Сделайте определение бот/человек
    Как определить кто выполняет действия Бот или человек?
  • Пользователи оставляют на сайте ложные заявки на покупку, как узнать IP адреса тех кто отправляет заявки?

    lastuniverse
    @lastuniverse
    А зачем гонять ip клиента на клиент и обратно? Не проще ли сразу на сервере добавить к данным заявки ip клиента?
  • Возможно ли решить задачу без циклов?

    lastuniverse
    @lastuniverse
    Владимир Проскурин
    заранее неизвестны вложенность и количество элементов

    Ваш вариант
    [].concat.apply([], array).reduce(function (res, item) { return res + item; })

    немного не доработан:)
    он не верно обработает такой массив:
    let array = [
    	[1, 2],
    	3, 4,
    	[5, [6, 7]],
    	[8, 9, 10]
    ];
  • Как отправить форму в обработчик после ввода пароля?

    lastuniverse
    @lastuniverse
    jwwwe, ответ на этот вопрос потребует рассказать Вам про всю цепочку взаимодействия клиента и сервера. По сути Вы задали очень общий вопрос.

    В самом общем случае действуйте по следующему алгоритму (расписываю очень обобщенно, на каждом из этапов есть множество нюансов):

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

    Основные нюансы:
    - пароль в обязательном порядке хранить и сверять в хэшированном виде
    - настоятельно рекомендую с идентификатором сессии использовать так называемую соль/salt
    - настоятельно рекомендую делать одноразовые идентификаторы сессии. но это наложит некоторые ограничения, связанные с отправкой правильного идентификатора в случае если клиент откроет сразу несколько вкладок с вашим сайтом. Ограничения эти можно обойти, но это потребует от Вас более углубленного понимания вопроса.
    - все странички и функционал, доступ к которым не должен производится без авторизации не должны быть доступны без проверки сессии/логинапароля.
    - для сессий желательно устанавливать сроки годности а также запоминать и проверять их на сервере
    - и много чего еще.
  • Для чего var elem = options.elem; и и в чем разница и для чего в 31 строке файла JS change, и "index.html" addEventListener('change')?

    lastuniverse
    @lastuniverse
    olya_097, итак:
    1) почему когда тут меняю на false, то ничего не меняется?
    bubbles: true

    Как сказано тут, если bubbles установленно в true, то событие будет срабатывать на самом глубоко вложенном элементе, затем на его родителе, затем на родителе родителя и так далее.
    При этом у нас слушатель события change установлен только на элементе voter, поэтому меняя значение bubbles поведение не меняется, но если же мы решим добавить свои обработчики события change на дочерние элементы, то при установленом bubbles=false такие обработчики никогда не выполнятся, поэтому, чтобы дать потенциальную возможность усовершенствовать компонент в дальнейшем и перехватывать событие change на дочерних элементах мы ставим bubbles=true

    2) this.setVote = setVote; для того чтобы задать voter.setVote(5); ?

    Нет, тут речь идет о внесении функции setVote в свойства класса function Voter(options) {...}. Это позволяет в последствии обращается к ней через экземпляр класса Voter.
    var voter = new Voter(....);
      voter.setVote(....);

    Это необходимо потому, что setVote объявлена внутри функции function Voter(options) {...} и поэтому сама по себе недоступна вне области видимости этой функции.
    !!! тут имеются "странности" js :) Дело в том что объявление функции function Voter(options) {...} так же является объявлением класса Voter, а ее содержимое конструктором класса Voter.
    elem.onmousedown = function() {
    return false;
    };
    это для того, чтобы не работало выделение?

    Тут, я честно Вам признаюсь, сам не догнал для чего :)
    4) так если выводить var elem = options.elem; alert(elem); то получится div
    почему бы написать var voteElem = querySelector('.voter').querySelector('.vote');
    а не var voteElem = elem.querySelector('.vote');?

    Тут все просто, автор как бы создает "компонент", абстрагируясь от его внутренностей, поэтому в конструктор передается именно ссылка на сам компонент voter
    а уже внутри конструктора ( внутри функции function Voter(options) {...} ) просто запоминаем ссылку на основной элемент компонента var elem = options.elem;, находим ссылку на элемент vote именно этого компонента var voteElem = elem.querySelector('.vote');.
    Так тоже можно было бы сделать
    var voteElem = querySelector('.voter').querySelector('.vote');
    , но это сразу бы превратило компонент voter в одноразовый, т.е. такой компонент мог бы присутствовать на странице только в единственном экземпляре.
  • Алгоритм переворота строки как реализовать?

    lastuniverse
    @lastuniverse
    развелось плагиаторов/копипастеров. удаляюсь со своим ответом:)
  • Не отображается русский текст в игре, что делать?

    lastuniverse
    @lastuniverse
    Константин Китманов, автор увидел json и словил эффект "нашел знакомые буквы" :)
  • Алгоритм переворота строки как реализовать?

    lastuniverse
    @lastuniverse
    Михаил, Так в чем проблема?
    1. split есть во многих языках, а там где нет, к строке как к массиву можно получить доступ другими способами.
    2. на всех языках есть функция reverе для массивов
    3. ну а join тоже либо есть, либо обратное приведение типов

    PS: дабы не вводить людей в заблуждение вы бы вместо тега "javascript" поставили тег "псевдокод"
  • Что может заменить c++?

    lastuniverse
    @lastuniverse
    Денис Загаевский, давай по порядку:
    1. как ты и сказал все компилируется в машинные коды, которые в конечном результате и выполняются процессором.
    2. Сверх быстрая Java - это не что иное как виртуальная машина, которая также является скомпилированной в машинные коды прогой, которая в свою очередь также выполняется процом.
    3. все оптимизации под конкретный проц или архитектуру, которые делают компиляторы не что иное как использование особенностей проца и архитектуры для достижения оптимального результата. То есть, обладая знаниями об особенностях проца и архитектуры вполне можно провести такие оптимизации самому.
    4. остальные виды оптимизаций по большей части относятся к пере использованию ресурсов в широком смысле (это и пере использование произведенных вычислений, выполнение некоторых вычислений с необходимой точностью заранее, например если нам требуется часто считать какие нибудь затратные мат.функции, то можно пред вычислить заранее их значения с необходимой точностью и поместить в таблицу, доставая их потом из нее а не вычисляя каждый раз заново. И еще множество других видов оптимизаций). Особенностью компиляторов является то, что этот вид оптимизаций производится достаточно обобщенно. Компилятору во многих случаях не ведом извращенный ход мыслей программиста, поэтому для таких оптимизаций можно только собрать статистику использования тех или иных данных и для наиболее часто используемых сделать кэши. Программист же способен произвести такие оптимизации сколь угодно глубоко и продуманно, где то экономя память, где то вычислительный ресурс, где то написав алгоритмы предсказания, производящие пред вычисления в параллельных потоках , а также многое другое. Единственная заковырка в том что большинство компиляторов сводят такие оптимизации на нет накладывая свои оптимизации (которые в прочем можно отключить). В случае же asm программист в полной мере может выбирать что как и когда будет работать в его программе, и может добиться гораздо более производительных результатов нежели чем обобщенные оптимизации компиляторов. Тут так же следует отметить что:
    а. это конечно же большой геморр для программиста, зачастую не оправдывающий потраченных усилий
    б. для маленьких программ добиться результатов, серьезно превосходящих результаты получаемые на других ЯП достаточно проблематично.
    Но для больших программ, производящих огромное количество различных вычислений получаемый профит может быть достаточно ощутимым.

    как то так.
  • Как дописать значение к массиву если его надо получить промисом или задержкой?

    lastuniverse
    @lastuniverse
    lex bem, вроде как то так:

    код
    // создадим массив в который будем складывать промисы
    const waitLoad = [];
    
    
    
    results = results.slice(0, 1);
    for (const key in results) {
      if (results.hasOwnProperty(key)) {
        const element = results[key];
        element.introtext = h2p(element.introtext);
        element.fulltext = h2p(element.fulltext);
        
        // добавим промис полученный в         
        waitLoad.push(
          clientGI.search(element.title)
          .then(images => {
            element.images = images.map(image => [image.url, image.thumbnail]);
            // возвращаем промис который всегда выполнится
            return Promise.resolve();
          });
        );
      }
    }
    
    
    // когда все картинки загружены выполняем какие либо действия с ними
    Promise.all(waitLoad).then(values => { 
    // ...
    });



    PS: не тестировал.
  • Что может заменить c++?

    lastuniverse
    @lastuniverse
    Денис Загаевский, а я разве не об этом? Но при этом сам по себе asm потенциально самый быстрый:)
  • Что может заменить c++?

    lastuniverse
    @lastuniverse
    Денис Загаевский, возможно вы просто не понимаете то о чем говорите?
    не буду писать много текста, по ссылкам много чего написано:
    1. https://habr.com/post/254121/ (3, 4 и 5 комментарии)
    2. https://pikabu.ru/story/sravnenie_yazyikov_program... (тоже возмущения в комментариях)
    3. https://ru.stackoverflow.com/questions/315275/%D0%...

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


    Помните мою фразу "Он при грамотном использовании будет самым быстрым"? Так вот, ее смысл в том, что все оптимизации программисту предлагается сделать самому, но если их сделать, результат будет существенно лучше чем у любых других языков.
  • Что может заменить c++?

    lastuniverse
    @lastuniverse
    Afafks, если упрощенно, то языки условно можно разделить на 2 группы:
    1. компилируемые - (C, C++, Pascal, GO и др.) программы на этих языках компилируются (преобразуются) в машинный код понятный процессору. Такие программы будут выполнятся в разы (а то и на несколько порядков) быстрее чем программы на интерпретируемых языках
    2. интерпретируемые - (Python, Perl, PHP, JavaScript и др.) программы на этих языках не преобразуются в машинный код, а выполняются другими программами (интерпретаторами)

    так же существует и нечто среднее между 1 и 2 (Java, Perl6 и др.), это языки компилируемые в байткод (не машинный код), который не понятен процессору, но понятен специальной виртуальной машине, умеющей интерпретировать этот байт код. Программы написанные на этих языках быстрее чем программы написанные на интерпретируемых языках но медленнее чем на компилируемых

    Отдельно можно выделить ассемблер, который является компилируемым языком низкого уровня (по сути является очеловеченным видом того же машинного кода с добавками синтаксического сахара). Он при грамотном использовании будет самым быстрым, но писать на нем проги целиком это скорее для задротов. На практике он используется в качестве небольших вставок (в том же С и С++) в тех местах где требуется поистине запредельная скорость выполнения.

    Это я расписал то что касается скорости выполнения.

    Также существует еще критерий, условно назовем его "удобство работы". По этому критерию языки, опять же условно можно разделить на высокоуровневые и низкоуровневые. Ассемблер однозначно относится к низкоуровневым, С и С++ более высокоуровневые, Java, Python, Perl, PHP, JavaScript еще более высокоуровневые. На самом деле градация весьма условная.

    PS: Любая программа это всегда компромисы:
    1. между скоростью выполнения и объемом съедаемой прпгой памяти (увеличить скорость можно путем кэширования результатов вычислений очень часто выполняемых программой, но это в свою очередь будет кушать больше памяти)
    2. между скоростью выполнения и удобством написания/отладки
    3. и др.

    Выбор в любом случае за Вами. А чтобы он был правильный, Вам надо как минимум:
    - определить критерии выбора ЯП и расставить приоритеты этим критериям
    - ознакомится с возможностями различных ЯП и взвесить их относительно выбранных критериев
    - Сделать выбор (за Вас его точно никто сделать не сможет)
  • Что может заменить c++?

    lastuniverse
    @lastuniverse
    Afafks, про ассемблер это была шутка. Он конечно в идеале быстрее чем С и С++, но писать на нем графику это маразм.
    По сути я этим коментарием просто попросил Вас объяснить Ваше понимание термина "мощный"
  • Какой это скрипт?

    lastuniverse
    @lastuniverse
    Jasee Cambatch, пример того, что вы называете "таблица" в студию :))

    PS: таблицы бывают очень разные
  • Какой это скрипт?

    lastuniverse
    @lastuniverse
    BRAGA96, в C нет Объектов и соответственно нет cin-ов и cout-в
  • Что может заменить c++?

    lastuniverse
    @lastuniverse
    если мощные == быстрые то assembler :))