• Как правильно делать промисы?

    Внимательно почитайте. Ваш пример слишком синтетический, ну и я никак не могу понять вашу логику, почему вы ждете что каждый then будет с задержкой, Promise то у вас один и он уже зарезолвился через 5 секунд, в каком месте вашего кода вы ждете что задержка сработает еще раз ?
    https://habr.com/ru/company/mailru/blog/269465/
    Ответ написан
    2 комментария
  • Как правильно делать промисы?

    bootd
    @bootd
    Гугли и ты откроешь врата знаний!
    p исполнится через 5 секунда, а then - это то, что будет после 5 секунд. Если вы хотите, что бы все then были через 5 секунд, то then должен возвращать также промис. А у вас then ничего не возвращает, а просто показывает alert. Оберните вызов alert в промисы с таймером и тогда будет счастье
    Ответ написан
    Комментировать
  • Как правильно делать промисы?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const wait = time => new Promise(r => setTimeout(r, time));
    
    wait(1000)
      .then(() => { console.log(1); return wait(1000); })
      .then(() => { console.log(2); return wait(1000); })
      .then(() => { console.log(3); });
    Ответ написан
    Комментировать
  • Как подменить ответ сервера заданным файлом?

    chmv
    @chmv
    squid. Несколько лет назад настраивал на нем баннерорезалку таким образом, что он мне вместо рекламы выдавал картинку с моего http сервера. Т.е. как раз то, что Вам нужно. Некоторые запросы можно отправить не на оригинальный сайт, а на свой. Т.е., чтобы выполнить запрос, squid пойдет не на оригинальный сайт, а туда, куда скажете.
    Ответ написан
    1 комментарий
  • Можно ли узнать информацию о добавляемом на сервер аудиофайле?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Если эта информация прописана в id3 теге mp3 файла, то можно. Например, ffmpeg или его утилита ffprobe умеют читать эти данные из mp3 файла:
    ffprobe -v quiet -print_format json  -show_format  music.mp3

    Результат:
    {
        "format": {
            "filename": "music.mp3",
            "nb_streams": 2,
            "nb_programs": 0,
            "format_name": "mp3",
            "format_long_name": "MP2/3 (MPEG audio layer 2/3)",
            "start_time": "0.025056",
            "duration": "219.350204",
            "size": "7072585",
            "bit_rate": "257946",
            "probe_score": 51,
            "tags": {
                "title": "Rihanna - Work (Feat. Drake)(VipMusic.In)",
                "artist": "VipMusic.In",
                "album": "Rihanna - ANTi (2016) - VipMusic.In",
                "composer": "VipMusic.In",
                "copyright": "VipMusic.In",
                "publisher": "VipMusic.In",
                "genre": "[VipMusic.In]"
            }
        }
    }

    Имейте в виду, что могут загрузить Metallica, прописав в тегах файла, будто это Лепс.

    Ещё вариант – подключаться к api какого-то музыкального сервиса опознавания записи по звуку – напр. EchoNest вроде бы может принимать upload'ы и идентифицировать треки.
    Ответ написан
    Комментировать
  • Как поставить дефолтное значение в input type="number"?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Вам просто нужно задать начальное состояние

    state = {
        valueMin: this.props.min || '',
        valueMax: ''
      }
    
    // в рендере убрать условие у первого инпута в value
    <input
      type="number"
      value={valmin}
      onChange={(e) => this.handleChangeMin(e)}
    />


    codesandbox
    Ответ написан
    Комментировать
  • Как набираться опыта и формировать портфолио?

    Vlad_IT
    @Vlad_IT
    Front-end разработчик
    Итак, я учусь на geekbrains веб-разработке.

    Ошибка номер один. Из всех новичков, что я видел, с гикбрайнса самые слабые. Их не учат учиться, их учат повторять, не давая нормальную теоретическую и практическую базу. Задания очень слабые, а курсы поверхностные.
    статьи и пр. это конечно хорошо, но применять на практике то, что прочитал, это совершенно другое, а особенно в боевых условиях

    Пока не будете читать, так и будете практиковать визуальные эффекты на jQuery. Нужна база. В начале 25% теории 75% практики. Читайте https://css-tricks.com , большую книгу css (она немного устарела, гриды не рассматривают, но основная база очень полезная), смотрите Юрия Артюха (если хотите делать крутые анимации), лазьте по https://www.awwwards.com/ и разбирайтесь, как люди так делают. А также практикуйтесь, сделайте себе сайт, сайт другу, сайт девушке - всем.

    UPD: В чем сложно придумать себе близкую к боевому задачу? Боевую задачу вам вряд-ли кто-то даст, т.к. без опыта боевых задач, вы сделаете не боевое решение. Вот там "боевые" задачи.
    1) Сделайте калькулятор произведения матриц - разминочка.
    2) Сделайте игру арканоид, хоть на дивах (а раньше, когда мы учили программирование, новичков привлекала разработка игр, а сейчас почему-то сайты. Раньше было романтичнее как-то).
    3) Сделайте приложение учета личных финансов, в котором есть такие функции
    - личный счет
    - форма добавления денег в личный счет с комментарием и выбором группы доходов (долг, зп, заказ, подарок и.т.д.).
    - форма снятия денег с личного счета с комментарием и выбором группы расхода (вернул долг, купил домой что-то, купил технику, еду, потратил на женщину и.т.д.)
    - Вывод списка доходов и расходов с фильтром, сортировкой и категориями.
    - создание расписания автоматического пополнения (зп) или снятия (аренда, абонентская плата) средств с личного счета.
    - создание простого графика расходов и доходов. Я бы сюда добавил еще прогнозирование доходов и расходов хотя бы через линейную регрессию (да, я люблю машинное обучение),
    - добавление нескольких счетов
    Эта задача норм, и типа боевая, и для себя пригодится, и на гитхаб можно выложить - красота.
    Ответ написан
    14 комментариев
  • Как из py скрипта запустить exe с аргументами?

    BuriK666
    @BuriK666
    Компьютерный псих
    os.system("command arg1 arg2")

    import subprocess
    subprocess.call(['command', 'arg1', 'arg2'])
    Ответ написан
    Комментировать
  • Как делать запрос с сервера на сайт и проходить авторизацию?

    С какой авторизацией?

    Через basic auth так:
    $auth = base64_encode("username:password");
    $context = stream_context_create(['http' => ['header' => "Authorization: Basic $auth"]]);
    $homepage = file_get_contents("http://example.com/file", false, $context );
    Ответ написан
    Комментировать
  • Как избежать дублирования кода при создании полей форм?

    @Yan-s
    Это не проблема прогнать подходящий формат с данными элементов форм через foreach и сгенерировать так всю форму. Просто очень часто формы и их элементы должны быть заверстаны и кастомизированы не одинаково. И даже если сперва вам это не понадобится, рано или поздно такая потребность сделает всю вашу абстракцию бесполезной.

    Наверное лучшее что можно сделать в плане организации кода, это применять компоненты на фронте.
    Ответ написан
    2 комментария
  • Как изменить кодировку на PHP?

    @galliard
    Ни на какую. Первоначально твоя строка выглядела как
    \u0430\u0432\u044b\u0430\u0432\u044b\u0430
    Но ты, видимо, встроил это строку прямо в строку запроса, и mysql посчитал обратные слеши экранирующими символами и не записал их.

    А вообще это формат, которым функция json_encode кодирует русские символы, если вторым параметром не передать константу JSON_UNESCAPED_UNICODE. Чтобы исправить текущую строку, можешь раскодировать и закодировать заного

    json_encode(json_decode('"\u0430\u0432\u044b\u0430\u0432\u044b\u0430"'), JSON_UNESCAPED_UNICODE);
    Ответ написан
    4 комментария
  • React как тебя заставить при нажатии на дочерний элемент не отрабатывать onClick родительского?

    glem1337
    @glem1337
    При клике на одном из узлов DOM, событие click "всплывает" вверх по дереву до тех пор пока не достигнет корня или не будет отменено в явном виде.

    React передает в обработчик события "синтетический" объект события, который, помимо прочего имеет метод stopPropagate. Этот метод (как и его нативный аналог) останавливает дальнейшее "всплытие" события вверх по дереву DOM. Вот как можно использовать этот метод на практике:

    var Block = React.createClass({
        handleClose: function(e) {
            e.stopPropagation();
            alert('close');
        },
        handleClick: function(e) {
            alert('click');
        },
        render: function() {
            return (
                <div onClick={this.handleClick}>
                    <span>Foo Bar Baz</span>
                    <span onClick={this.handleClose}> &#215;</span>
                </div>
            );
        }
    });


    Проще говоря вам надо применить e.stopPropagation(); при клике на нужный вам элемент(лайк)
    Ссылка на вопрос на stackoverflow: https://ru.stackoverflow.com/questions/537267/reac...
    Ответ написан
    3 комментария
  • Как вывести id?

    glem1337
    @glem1337
    Ответ написан
    Комментировать
  • Как убрать полностью блок на телефоне?

    mtvphnx
    @mtvphnx
    Двигаю пиксели, играюсь со шрифтами
    А js можно использовать? Есть такая штука - https://github.com/hgoebl/mobile-detect.js
    Подключаешь:
    <script src="https://cdnjs.cloudflare.com/ajax/libs/mobile-detect/1.4.1/mobile-detect.min.js"></script>

    Пишешь скрипт, который будет навешивать css или убирать, если обнаружен мобильник.
    Выстави в инструментах разработчика мобильную версию > какой-нибудь телефон, например iphone 6 и перезагрузи страницу. Блок пропадет, независимо от ориентации экрана.
    Вот код: https://codepen.io/matvey-phoen1x/pen/eKQPag
    Ответ написан
    1 комментарий
  • Как выделить все содержимое контейнера div и скопировать в буфер обмена?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    var content = document.querySelector(".entry-content");
    var button = document.querySelector("#button");
    
    function copyToClipboard(el) {
    	var range;
    	if (document.selection) {
    		range = document.body.createTextRange();
    		range.moveToElementText(el);
    		range.select().createTextRange();
    	} else if (window.getSelection) {
    		range = document.createRange();
    		range.selectNode(el);
    		window.getSelection().addRange(range);
    	} else return;
    	
    	document.execCommand("copy");
    	
    }
    
    button.addEventListener('click', () => copyToClipboard(content));


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

    YardalGedal
    @YardalGedal
    yeah boy
    json.dumps(KEYBOARD_STEP_1, ensure_ascii=False).encode("utf-8")
    Ответ написан
    1 комментарий
  • Веб скраппинг,парсинг на Python?

    @vl12
    Скрэпинг - одна из наверно 4 основных тем работ на фрилансе. (Остальные - это создание вебприложений, нейросети, высшая математика или статистика - они попадаются чуть реже. Но надо знать отдельные фреймоворки. Для математики и нейросетей нужно высшее образование.)
    Заработок - в среднем 30$ за сайт, но посидеть над каждым сайтом надо будет несколько полных дней. Т.е. реально получится где-то по 1-2$/час. Почасовую на скрепинг найти сложней, если заказчик не новичок и сравнивал цены. Это при условии что вы разбираетесь в фреймворках для скрэпинга. Также учтите, что многие сайты не скрэпятся как html, ибо они динамические на JS, нужно изучать доп. фреймворки, и может стоять всякая защита. Большинство сайтов-гигантов не скрэпятся. С фейсбук сейчас вообще очень сложная ситуация.
    При этом там толпы, реально толпы, индусов, демпящих цены.
    Есть плохие заказчики, тянущие сроки. Т.е. можете работать полный день целую неделю. А то и месяц - за 20$. Минус 20% которые возьмет биржа фриланса (процент может отличаться).

    Имхо, фриланс - это для тех у кого нет работы, по каким-то жизненным причинам. Или много свободного времени, в которое можно подрабатывать. Но его должно быть много, ибо проблемы требуют много часов на поиск решений.
    И скрэпинг - это для тех, кто не любит возится с frontend. Который займет основное время при разработке веб-приложений, на том же django.
    Ответ написан
    Комментировать
  • Какие технологии нужно знать для создания мессенджера?

    @Levhav
    Возьмусь за разработку проектов любой сложности.
    Я в своих проектах делаю так:
    Приложение пишем на cordova на html5 (сразу получается кросплатформеное)
    Сообщение доставляем по вебсокетам
    На сервере используем связку php+mysql для логики приложения и CppComet для доставки сообщений

    В итоге получается что требует всё это минимум работы и минимум знаний но на выходе будет web версия и мобильное приложение на обе платформы.

    Вот минимальный пример чата который можно за 15 минут закатать внутрь приложения на cordova.

    И быстродействие нормальное так как самая важная часть по доставке сообщений на C++ реализована, и в тоже время вы не тратите кучу своего времени на написание бизнес логики приложения на чём то сложнее чем javascript и php.
    Особенно такой подход хорошо идёт на фрилансе где не многие заказчики имеют бюджет на оплату нескольких месяцев работы для команды программистов которые будут писать нативные приложения под каждую из платформ.
    Ответ написан
    Комментировать
  • Как правильно организовать структуру класса?

    Если что-то попроще, но при этом более-менее ООПшное, то можно как-то так:

    class Plugin {
    
    	constructor (rawUrl, rawName) {
    		this.url = new UrlParser(rawUrl);
    		this.name = new NameParser(rawName);
    	}
    
    	doSomething () {
    		// code
    	}
    }
    
    function userCode() {
        new Plugin("example.com", "FooBar").doSomething()
    }


    Если хотите побольше DI и всего такого, но при этом не потерять лёгкость использования, то можно так:

    class Plugin {
    
    	constructor (urlParser, nameParser) {
    		this.url = urlParser;
    		this.name = nameParser;
    	}
    	
    	doSomething () {
    		// code
    	}
    
    }
    
    Plugin.init = function (url, name) {
    	return new Plugin(
    		new UrlParser(url),
    		new NameParser(name)
    	);
    }
    
    function userCode() {
    	Plugin.init("example.com", "FooBar").doSomething()
    }


    UrlParser и NameParser - это классы, которые парсят всё необходимое, а потом внутри имеют свойства для обращения к ним.

    class UrlParser {
    
    	constructor (urlString) {
    		var result = this.matchUrlStrign(urlString)
    		
    		this.anchor = result[0];
    		this.path   = result[1];
    		// etc
    	}
    }


    Соответственно, в плагине используете как-то так:
    this.url.anchor
    Ответ написан
    3 комментария