• Сайт выдает 403 Forbidden (nginx), как исправить?

    HoHsi
    @HoHsi
    Вероятнее всего ошибка ни их стороне, или же вы указываете неверный логин + пароль. 403 ошибка - отказ в доступе
    Ответ написан
  • Как составить регулярное выражение для форматирования номера телефона?

    HoHsi
    @HoHsi
    var REGEXP_PHONE = /(\d{3})(\d{3})(\d{2})(\d{2})/;
    
    var number = '1234567890';
    
    var numberObj = number.match(REGEXP_PHONE);
    
    number = "(" + numberObj[1] + ") " + numberObj[2] + "-" + numberObj[3] + "-" + numberObj[4];
    
    // Или ES6
    number = `(${numberObj[1]}) ${numberObj[2]}-${numberObj[3]}-${numberObj[4]}`;
    Ответ написан
    Комментировать
  • Курсы для фронтендера\дизайнера по завершению которых выдают сертификат (удаленно)?

    HoHsi
    @HoHsi
    Что-бы резюме выглядело солидно, не занимайтесь дро***ом с сертификатами.
    1) Заведите GitHub аккаунт и начните писать открытые библиотечки / сайты. (пусть и корявые, но со временем...)
    2) На том же гите работайте над чужими проектами. Форкайте, пытайтесь запилить свой мердж.
    3) Перестаньте уже заниматься х***ней с сертификатами / тренингами / блицами. Работайте, блеять. Портфолио будет лучше смотреться от реальных работ, а не от макулатуры.
    4) Запилите блог (!!! когда уже сами будете понимать в своей области). Пишите в него статьи, переводы, гайды. Это не столько для окружающих, сколько для вас самих. Ведь как известно ни что так не закрепляет знания. как обучение ими окружающих.

    Ваш кэп.
    Ответ написан
    Комментировать
  • Время rps зависит от ядер машинки?

    HoHsi
    @HoHsi
    Зачем вам такие ухищрения? Поставьте load-balancer Nginx и несколько беков ноды. Так и скалировать легче, и должно выйти дешевле.
    Ответ написан
  • Как проверить информацию о пользователе вошедшем на страницу?

    HoHsi
    @HoHsi
    1) Перед рассылкой сохраняете в BD id пользователя. И генерируете UUID (или что-угодно уникальное).
    2) Формируете письмо с ссылкой вида www.site.ru/sale/< uuid >
    3) Когда пользователь переходит по этой ссылке, заставляем его авторизоваться (в случае если у вас приложение, установить его).
    4) Получив от ВК ID пользователя, делаем запрос к #isMember
    5) Если такой пользователь есть в базе, то меняем ему статус (в базе, на `received` или что-угодно), а UUID ключу ставим статус `activated` (что-бы эту ссылку не шарили).
    6) Отравляем/показываем скидку/ключ на почту/ВК/на странице
    Ответ написан
    9 комментариев
  • Какую Node.js библиотеку для промисов использовать?

    HoHsi
    @HoHsi Автор вопроса
    Написал тест на производительность.

    # Requires
    Benchmark   = require 'benchmark'
    lagoon      = require 'lagoonjs'
    
    async       = require 'async'
    Q           = require 'q'
    bluebird    = require 'bluebird'
    RSVP        = require 'rsvp'
    whenpromise = require 'when'
    # mpromise    = require 'mpromise' # Не соответствует стандарту
    es6         = require 'es6-promise'
    kew         = require 'kew'
    
    # Init
    logger      = new lagoon.Lagoon()
    
    # Functions
    fakeDelay = (name)-> (delay = 3)-> (callback)=>
        # console.log "[#{ name }] +"
        setTimeout =>
            callback()
        , delay
    
    fakeDelayPromiseQ = (delay)->
        deferred = Q.defer()
    
        fakeDelay("q")(delay) =>
            deferred.resolve()
    
        return deferred.promise
    
    fakeDelayPromiseBB = (delay)->
        new bluebird (resolve, reject)->
            fakeDelay("Bluebird")(delay) =>
                resolve()
    
    fakeDelayPromiseRSVP = (delay)->
        new RSVP.Promise (resolve, reject)->
            fakeDelay("RSVP")(delay) =>
                resolve()
    
    fakeDelayPromiseWhen = (delay)->
        deferred = whenpromise.defer()
    
        fakeDelay("When")(delay) =>
            deferred.resolve()
    
        return deferred.promise
    
    # fakeDelayPromiseM = (delay)->
    #     new mpromise (resolve, reject)->
    #         fakeDelay("M")(delay) =>
    #             resolve()
    
    fakeDelayPromiseES6 = (delay)->
        new es6.Promise (resolve, reject)->
            fakeDelay("ES6")(delay) =>
                resolve()
    
    fakeDelayPromiseKew = (delay)->
        deferred = kew.defer()
    
        fakeDelay("Kew")(delay) =>
            deferred.resolve()
    
        return deferred.promise
    
    # Time
    BenchmarkAsync = (delay, times = 3)-> new Benchmark "Async#parallel X #{ times } [#{ delay }ms]", {
        defer: true
        fn: (deferred)->
            queue = []
            for [0...times]
                queue.push fakeDelay("Async")(delay)
    
            async.parallel queue, =>
                deferred.resolve()
    }
    
    BenchmarkQ = (delay, times = 3)-> new Benchmark "Q#all X #{ times } [#{ delay }ms]", {
        defer: true
        fn: (deferred)->
            queue = []
            for [0...times]
                queue.push fakeDelayPromiseQ(delay)
    
            Q.all(queue).then =>
                deferred.resolve()
    }
    
    BenchmarkBluebird = (delay, times = 3)-> new Benchmark "Bluebird#all X #{ times } [#{ delay }ms]", {
        defer: true
        fn: (deferred)->
            queue = []
            for [0...times]
                queue.push fakeDelayPromiseBB(delay)
    
            bluebird.all(queue).then =>
                deferred.resolve()
    }
    
    BenchmarkRSVP = (delay, times = 3)-> new Benchmark "RSVP#all X #{ times } [#{ delay }ms]", {
        defer: true
        fn: (deferred)->
            queue = []
            for [0...times]
                queue.push fakeDelayPromiseRSVP(delay)
    
            RSVP.all(queue).then =>
                deferred.resolve()
    }
    
    BenchmarkWhen = (delay, times = 3)-> new Benchmark "When#all X #{ times } [#{ delay }ms]", {
        defer: true
        fn: (deferred)->
            queue = []
            for [0...times]
                queue.push fakeDelayPromiseWhen(delay)
    
            whenpromise.all(queue).then =>
                deferred.resolve()
    }
    
    # BenchmarkM = (delay, times = 3)-> new Benchmark "M#all X #{ times } [#{ delay }ms]", {
    #     defer: true
    #     fn: (deferred)->
    #         queue = []
    #         for [0...times]
    #             queue.push fakeDelayPromiseM(delay)
    
    #         mpromise.all(queue).then =>
    #             deferred.resolve()
    # }
    
    BenchmarkES6 = (delay, times = 3)-> new Benchmark "ES6#all X #{ times } [#{ delay }ms]", {
        defer: true
        fn: (deferred)->
            queue = []
            for [0...times]
                queue.push fakeDelayPromiseES6(delay)
    
            es6.Promise.all(queue).then =>
                deferred.resolve()
    }
    
    BenchmarkKew = (delay, times = 3)-> new Benchmark "Kew#all X #{ times } [#{ delay }ms]", { 
        defer: true
        fn: (deferred)->
            queue = []
            for [0...times]
                queue.push fakeDelayPromiseKew(delay)
    
            kew.all(queue).then =>
                deferred.resolve()
    }
    
    results = {}
    async.eachLimit [1, 3, 100, 300, 1000, 5000, 10000, 50000, 100000, 1000000], 1, (times, cbt)->
        async.eachLimit [1, 5, 300, 1000], 1, (delay, cbd)->
            suite = new Benchmark.Suite
    
            suite.add BenchmarkAsync( delay, times )
                 .add BenchmarkQ( delay, times )
                 .add BenchmarkBluebird( delay, times )
                 .add BenchmarkRSVP( delay, times )
                 .add BenchmarkWhen( delay, times )
                 .add BenchmarkES6( delay, times )
                 .add BenchmarkKew( delay, times )
                 .on 'cycle', (event)->
                     logger.info String(event.target)
                 .on 'complete', ->
                     logger.warn "Fastest is #{ @.filter('fastest').pluck('name') }"
                     results[ times ] ?= {}
                     results[ times ][ delay ] = @.filter('fastest').pluck('name')
    
                     cbd()
                 .run { 
                     'initCount': 100
                     'async': false
                     'defer': true
                 }
        , ->
            cbt()
    , ->
        logger.log ''
        logger.log ''
        logger.log ''
        for times, resultd of results
            logger.log ''
            for delay, result of resultd
                logger.warn "Fastest is #{ result }"
    Ответ написан
  • Возможно ли асинхронно делать действия с элементами массива?

    HoHsi
    @HoHsi
    1) AMQP, и делегирование задач.
    2) Запускать дочерние процессы, разбивать массив на чанки и раздавать их сопрограммам.

    Первый способ:
    Преимущества:
    * Неограничен ни чем. Запускаете `воркеров X кол-во ядер`. Докупаете еще машину, ставите на ней ту же программу. И т.д.
    * Даже если процесс упал, часть массива не потеряется, а передастся другому воркеру.

    Недостатки:
    * Нужно время на совершение транзакции (надуманный недостаток, так как транзакция проходим за пару миллисекунд).

    Второй способ:
    Преимущества:
    * Моментальные транзакции (ну или как ответит родительский процесс).

    Недостатки:
    * Ограничен кол-во CPU.
    * Не расшияем
    Ответ написан
    Комментировать
  • Как правильно работать с CodeCanyon.net?

    HoHsi
    @HoHsi Автор вопроса
    Envato - давно сложившееся коммюнити, в меру известное у тех же стокеров и темлейтеров, поэтому какое-то впечатление можно сложить, поискав что есть на русском по смежным темам, например такое
    материалов немного - просмотри по диагонали

    что касается непосредственно codecanyon, то нужно выяснить - банят они идиотов или нет. Стоки типа Шаттерстока - банят, 5 попыток на экзамен и все, типа Фотолии - не банят. Если не банят - большей частью пунктов (кроме лицензии) можно не заморачиваться и действовать уже по реакции их approval team.

    В продаже скриптов же я сходу кокурентов и не вспомню, поэтому тебе ничего не остается как проникнуться духом codecanyon.

    Проникаться следующим образом:
    1) запрос в Гугл: "codecanyon approval process" и просматриваешь на всех энватовских и не только форумах
    2) просматриваешь все заголовки форума codecanyon.net/forums/topic/codecanyon/65 и полезные топики, например, этот, там знаковые сообщения, хоть и общие
    3) делаешь запрос в хелп, например, по лицензиям (хотя я бы почитал вообще все топики)и складываешь впечатление
    4) ну и всякое https://forums.envato.com/tags/code можно просмотреть, хотя тут болmit покупатели, похоже

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

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

    HoHsi
    @HoHsi
    <div class="task-status task-active selected">Active</div>
    <div class="task-status task-stop">Stop</div>
    <div class="task-status task-done">Done</div>


    // 1, и самое главное, не вызывайте по многу раз функции, это б** самое медленное место в JS.
    // Вы сделали правильно, а вот предыдущий ответчик, увы.
    
    // 2. Кложурка - наше все. ()()
    ;(function($){
        // Выполнится, только после прогрузки страницы
        $(function{
            var $taskStatus = $('.task-status'); // Доллар как бы показывает, что это JQ объект
    
            // 3. В HTML можно убрать selected, что-бы код смотрелся гармончнее
            // Тогда следуте добавть
            /*
            $taskStatus.first().addClass('selected');
             */
    
            $taskStatus.on('click', function(){
                var $this = $(this);
    
                // Зачем, что-то менять если это и так уже `selected`
                if(!$this.hasClass('selected')){
                    var $other = $taskStatus.not( $this );
    
                    // Тем самымы, даже при малом FPS, не будет мерцания
                    $this.addClass('selected');
                    $other.removeClass('selected');
                };
            });
        });
    })(jQuery);


    И как всегда, минутка рекламы CoffeeScript
    do ($ = jQuery)->
        $ ->
            $taskStatus = $('.task-status')
    
            $taskStatus.on 'click', ->
                $this = $(this)
    
                unless $this.hasClass('selected')
                    $other = $taskStatus.not( $this )
    
                    $this.addClass('selected')
                    $other.removeClass('selected')
    Ответ написан
  • Nginx (прокси) и Node.js на разных машинах?

    HoHsi
    @HoHsi
    У моих проектов обычно такой конфиг:
    upstream backend {
        # Тут можете установить адреса всех бэкендов
        server 127.0.0.1:7800;
    }
     
    server {
        listen       80;
        server_name  www.test.ru test.ru;
        #####################################
        # GZIP
        #####################################
        gzip on;
        gzip_vary on;
     
        gzip_disable "MSIE [4-6]\.";
        gzip_types text/plain 
                   text/css 
                   application/json 
                   application/x-javascript 
                   text/xml 
                   application/xml 
                   application/xml+rss 
                   text/javascript 
                   application/javascript;
    
        #####################################
        # Locations
        #####################################
        # Static
        location /public {
            # Trust Proxy
            add_header Host $host;
            add_header X-Real-IP $remote_addr;
            add_header X-Forwarded-For $proxy_add_x_forwarded_for;
     
            expires 30d;
            root /apps/test.ru/;
        }
     
        # Proxy
        location / {
            # Trust Proxy
            add_header Host $host;
            add_header X-Real-IP $remote_addr;
            add_header X-Forwarded-For $proxy_add_x_forwarded_for;
     
            # expires 3m;
            proxy_pass http://backend;
        }
    }
    Ответ написан
    Комментировать
  • Как настроить csso для gulp c изменением структуры?

    HoHsi
    @HoHsi
    Используйте CleanCSS, он чистит гораздо лучше. Пруф cssbench

    Как настроить csso? Как я предполагаю это нужно сделать в package.json, но в каком именно?

    Нет, туда даже не стоит лезть, если вы не знаете зачем он. Это простой манифест файлов, там не хранятся настройки.

    Если уж и настраивать, то в таске галпа.
    Ответ написан
    Комментировать
  • Как заставить браузер выполнять скрипты на определенной странице и в определенное время?

    HoHsi
    @HoHsi
    var sec = 60; // Выполняется раз в минуту
    
    setInterval(function(){
      // Тут вызов функции
    }, sec * 1000);


    Так чаще всего поступают в сети интернет
    Ответ написан
    6 комментариев
  • Как избавиться от лишних отступах в EJS?

    HoHsi
    @HoHsi Автор вопроса
    Нашел проблему
    579 строка lib/ejs.js
    line = line.replace('\n', '');
    self.truncate = false;


    нужно добавить:
    line = line.replace('\r\n', '');
    line = line.replace('\n', '');
    self.truncate = false;
    Ответ написан
  • Как в Angular $rootScope передать переменную из шаблона?

    HoHsi
    @HoHsi Автор вопроса
    Можно сделать так
    <script type="application/json" json-data ng-model="screens")>{...<JSON>...}</script>
    Ответ написан
    Комментировать
  • Как отключить дебаг в HTML в Jade?

    HoHsi
    @HoHsi Автор вопроса
    Просто вешается обработчие ошибок через
    app.use (err, req, res, next)->
        res.sendStatus 500

    В таком случае ошибка рендаринга jade не выводится на экран
    Ответ написан
    Комментировать
  • Почему gulp.js не копирует папку?

    HoHsi
    @HoHsi Автор вопроса
    Решение весьма простое:
    К gulp.src дописывается база
    CoffeeScript
    gulp.src "./path/to/coffee/or/any/*.coffee", { base: './' }
        .pipe gulp.dest "./js/"


    В таком случае все зарендарится
    в ./js/path/to/coffee/or/any/*.js
    Ответ написан
    Комментировать
  • Как определиться с фреймворком?

    HoHsi
    @HoHsi
    Мне не понятно, это разделение фреймворков на группы, что они делают и для каких задач предназначены фреймворки из первой группы и из второй?

    Какие задачи решают фреймворки из первой и второй группы?

    Первая группа - фронтэнд - фреймворки работающие на стороне клиента. Т.е. в браузере
    Вторая группа - языки + фреймворки для бекэнда - серверной стороны.
    Общего между ними 0, это абсолютно разные вещи для разных задач.

    Используют ли их вместе, или только один?

    Если вы имеете ввиду, использовать ли Angular и Ember (или Ruby on Rails + node.js), то ответ 100% нет. Это взаимозаменяемые вещи.

    Какие задачи решают фреймворки из первой и второй группы?

    Первая группа занимается пользовательской частью. Рендарит Dom, выполняет клиентские вычисления, Ajax
    Вторая - серверные фреймы. На их основе пишется сам сайт, его основа. Или же REST.

    Для какое задачи достаточно будет знать только ангуляр, а для какой только рельсы?

    Это не взаимоисключающие вещи. Ангуляр рендарит клиента, обновляет поля, html, сортирует таблицы. RoR отвечает на post/get, выступает в роли REST.

    Подведя итог, если знаний 0, начните либо с фронтэнда (1 группа) или с бекэнда (2 группа). За частую это разный подход к мышлению.

    Если нет знаний даже в JQ, но сайтик хочется берите для начала JS+PHP (но быстро бросайте, как только появятся скиллы). После этого переключайтесь на Coffee (замена JS) + Node.js

    Ссыли в Сибире:
    PHP
    node.js
    jquery.com
    coffeescript
    Ответ написан
  • Как очистить папку не полностью, но только те файлы которые будет создавать gulp?

    HoHsi
    @HoHsi
    А в чем проблема удалить все? У вас же остаются исходники, а галп их собирает за миллисекунды.

    Есть вариант с выделением папки под зарендаренные Jade, и последующая очистка их через:
    gulp-clean

    Второй вариант сделать самописный плагин к gulp, который проверяет все html файлы и если не найдет их .jade аналог, то затрет
    Ответ написан
  • Какие языки программирования нужны для мега скромной 3d mmorpg?

    HoHsi
    @HoHsi
    Факторов гораздо больше:
    * Есть ли готовый движок или пишется с 0
    * Есть ли знания в каком-то из языков
    * Есть ли понимание архитектуры клиент-сервер

    По факту если знаний нет, и графика не нужна, а нужно быстро нах*ярить, берите для клиента love2d.
    С сервером сложнее, тут двигом не обойтись. Но если есть желание, гляньте в сторону
    Производительность:
    Go, C++
    Скорость разработки и переносимость:
    C#, Java
    Ответ написан
    Комментировать
  • Что сделать что бы работало?

    HoHsi
    @HoHsi
    Смотрите, JS асинхронный. Это значит, все функции, которые имеют "время простоя" запускаются одновременно (в вашем случае это setTimeout. Это асинхронная функция).
    В вашем коде все setTimeout инициализируются и запускаются. А после все через равный промежуток времени (2 с), исполняются.

    Если вы пришли из питона или PHP (или другого языка без Event Loop). То там все функции (pause, sleep и т.д) останавливают выполнение кода. В JS же они просто запускаются и продолжается выполнение.

    Возможно будет полезно:
    javascript.ru/unsorted/async
    https://www.google.ru/webhp?sourceid=chrome-instan...
    Ответ написан
    Комментировать