Задать вопрос
  • Не получается загрузить видео на VK через REST API и httpclient (java) - на POST сервер возвращает HTTP 406 Not Acceptable. В чем может быть проблема?

    @sherlock342342 Автор вопроса
    Проблема в неполной документации VK REST API. В ней ничего не сказано про то-что по каким-то причинам сервису по загрузке видео не нравится Transfer-Encoding: chunked

    Аналогичные сервисы VK по загрузке фото, аудио или документов пока не замечены в подобном.

    После модификации кода использующего java httpclient и указанием конкретного Content-Length (что выключает chunked режим) - все заработало.

    Надеюсь кому-то будет полезно.
    Ответ написан
    Комментировать
  • Верное у меня представление о разработке fullstack web приложений?

    AgentSmith72
    @AgentSmith72
    JS - это моё хобби
    Зависит от компании. бычно фронт занимается своими делами, а бэк своими.

    В лучшем случае, вы будете делать то, что говорит Тим-лид. Если нужно делать фронт на готовое от Бэка api, то значит в команде все хорошо. В редких случаях, фронту приходится мокать данные с Бэка, и работать со статичными данными.

    В худшем случае, это поддержка какого-нибудь сайта, где rest api и не пахнет.

    Если вы фронтэндер, то познакомьтесь с Postman. Например в виде гугл плагина. Научитесь работать с ответами роутов сайта. Вы можете создать свой проект, только фронт часть, а через Postman брать ответы с любого сайта, например api городов и стран, и встроить этот api в свой проект. Вам тогда вообще бэк знать не нужно будет.

    Проект по ссылке не столько не актуален, сколько ниже качества, чем нужно.

    Бэк часть:
    • Не рабочая концепция проекта.
    • Не профессиональная архитектура. Обычно используется архитектура вида валидатор-контроллер-сервис-репозиторий. В данном случае это был бы ProductsService (директория products + класс в ней ProductsService). Также в этом сервисе лежал бы класс репозитория этого сервиса, где хранились бы методы запросов к базе данных. Запрос бы попадал в валидатор, затем в контроллер, оттуда в сервис, а сервис бы вызывал соответствующий метод в репозитории.
    • База данных. Нет внешнего ключа у продукта к категориям.
    • Нет типизации. Это нужно для статичных анализаторов, проверяющих код на ошибки. Пример public string $name - как свойство класса. public function getById(int $id) - как метод класса
    • Нет валидации запроса. Например, что поля формы должны не содержать определённые символы, или быть конкретного типа. (Очистка от тэгов , используемая в модели, должна находится ещё до того как запрос попадёт в контроллер.)
    • Коды и текстовки раскиданы по разным файлам. Всё должно лежать в одном файле, классе, куда будут обращаться все классы за результатом.
    • Отсутствует MVC. В каждом файле создаётся новый класс, и дескриптор подключения, хотя это повторяющееся действие нужно вынести в отдельный класс.
    • Коды ответа. Не соответствуют действительности. При создании не нужно возвращать 200. 200 подразумевает, что в ответе есть дополнительные данные. Правильный вариант 201


    Фронт часть:
    • JQuery это рудимент.
    • Bootstrap не используется, если есть нормальный отдел разработки.
    • Стили страницы не разбиты на верхнюю и нижнюю части.
    • Не используется отложенная загрузка скриптов.
    • Вместо файлов JS для каждого типа CRUD достаточно одного JS файла
    • HTML код в JS. Загрузка JS это одна из самых затратных операций. Чем больше размер файла, тем выше время загрузки. Что сильно отщутимо на мобилке.
    • Везде используется POST запрос. В restfull api POST для создания, GET - для получения, DELETE - для удаления, Patch - для обновления части модели, PUT - Для обновления всех полей модели.

    Этого курса достаточно, чтобы сделать востребованный на рынке restfull api проект.
    Ответ написан
    6 комментариев
  • Как узнать точный перевод description в python owm?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Перевод и не нужен по сути. По ссылке, которую вы привели, есть таблица кодов погоды. Достаточно будет перевести их вручную и подобрать иконку, а в коде ориентироваться на ID.

    Например, такой код сейчас вернет код 721:
    weather = mgr.weather_at_place('London,GB')
    print(weather.weather.weather_code)


    По таблице это `haze` (туман). Пусть ему соответствует такой смайл: U+1F32B

    Дальше уже можно сделать свой словарь с юникодом и ID погоды. Где ключи словаря - ID, а значения - юникоды.

    weather_emojis = {721: '\U0001F32B', 500: '\U00001111'} # и тд


    И отправлять уже так:

    emo = weather_emojis[w.weather_code]

    В результате это уже одна строчка кода (ну плюс еще одна на словарь), и полная независимость от языка
    Ответ написан
    Комментировать
  • Как удалить русские буквы в текстовом файле?

    Vindicar
    @Vindicar
    RTFM!
    Только русские? А что насчёт иероглифов? Или речь о всех символах, не входящих в ASCII?
    В первом случае:
    import re
    s = "privet брат"
    s1 = re.sub('[а-яё]', '', s, flags=re.I)

    Во-втором случае:
    s1 = s.encode('ascii', errors='ignore').decode('ascii')
    Ответ написан
    2 комментария
  • Как скачать другую страницы через selenium?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Есть driver.page_source, который возвращает не отрендеренный код страницы
    Есть
    driver.execute_script("return document.getElementsByTagName('html')[0].innerHTML")
    , который возвращает innerHTML
    Ответ написан
    Комментировать
  • Как получить значение объекта с сервера если он написан с использованием знака -?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    let apiUsAirIndex = data.current.air_quality['us-epa-index'];
    Ответ написан
    Комментировать
  • Как достать превью видео с youtube автоматически?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Не знаю, может ли дискорд автоматом такое получить, но в любом случае, превью можно получить через ID видео:
    https://img.youtube.com/vi/VIDEO_ID/hqdefault.jpg, где VIDEO_ID - id видео,

    Как пример:
    from urllib import parse
    
    url = 'https://www.youtube.com/watch?v=jNQXAC9IVRw'
    
    video_id = parse.parse_qs(parse.urlparse(url).query)['v'][0]
    
    thumbnail_url = f'https://img.youtube.com/vi/{video_id}/hqdefault.jpg'
    Ответ написан
    1 комментарий
  • Как указать диапазон ячеек количество - 1?

    @tim8ska
    Руководитель IT проектов в крупнейшей автокомпании
    Сумм не является формулой массива, поэтому только ей не обойтись. Я обычно для таких целей использую ИНДЕКС.
    Важно, чтобы у вас не было пустых строк в столбце, иначе формула работать не будет. Для пустых значений лучше используйте 0.
    =СУММ(B2:ИНДЕКС(B:B;СЧЕТЗ(B:B);1))
    Означает следующее: суммируется диапазон от B2 до последней ячейки. Индекс подставляет эту ячейку из массива. Счётз считает количество не пустых значений.
    Ответ написан
    5 комментариев
  • Как переходить между input'ами нажатием на кнопки стрелок?

    Real_Fermer
    @Real_Fermer
    Программист PHP
    Пример

    var start = document.getElementById('start');
    start.focus();
    start.style.backgroundColor = 'green';
    start.style.color = 'white';

    function dotheneedful(sibling) {
    if (sibling != null) {
    start.focus();
    start.style.backgroundColor = '';
    start.style.color = '';
    sibling.focus();
    sibling.style.backgroundColor = 'green';
    sibling.style.color = 'white';
    start = sibling;
    }
    }

    document.onkeydown = checkKey;

    function checkKey(e) {
    e = e || window.event;
    if (e.keyCode == '38') {
    // up arrow
    var idx = start.cellIndex;
    var nextrow = start.parentElement.previousElementSibling;
    if (nextrow != null) {
    var sibling = nextrow.cells[idx];
    dotheneedful(sibling);
    }
    } else if (e.keyCode == '40') {
    // down arrow
    var idx = start.cellIndex;
    var nextrow = start.parentElement.nextElementSibling;
    if (nextrow != null) {
    var sibling = nextrow.cells[idx];
    dotheneedful(sibling);
    }
    } else if (e.keyCode == '37') {
    // left arrow
    var sibling = start.previousElementSibling;
    dotheneedful(sibling);
    } else if (e.keyCode == '39') {
    // right arrow
    var sibling = start.nextElementSibling;
    dotheneedful(sibling);
    }
    }
    Ответ написан
    Комментировать
  • Каким образом взаимодействует сегодня Back-End и Front-End?

    Zraza
    @Zraza
    Помог ответ? Отметь решением!
    Нет, не все сайты работают так (с разделением на фронт/бэк) - некоторые по-старинке. И не всегда новый подход оправдан.
    В основном имеет смысл там, где много интерактива - при старом подходе все равно приходится делать апи для всяких lazy-load/поиска/фильтрации, решать где/как будут хранится шаблоны, в каком формате передавать и пр. При новом подходе за все это отвечает фронт, бэк предоставляет только данные.

    • Чаще всего используется http+json для взаимодействия фронт-бэк, но есть варианты.
    • С помощью React мы запрос не делаем. React это что-то вроде продвинутого шаблонизатора. Запрос мы делаем через js (browser api). Бэк только отдает json.


    Преимущества:
    1. Можно разделить работу фронт и бэк команд
    2. Можно переписать фронт/бэк, используя интерфейс API как контракт взаимодействия
    3. Между фронтом и бэком бегают чисто данные, без шаблонов. Но см. п. 3 недостатков.
    4. Перенос нагрузки с бэка на фронт (редко это оправдано, но все же).
    5. Интерфейс становится более отзывчивым (если делать все хорошо)
    6. Проще протестировать поотдельности


    Недостатки:
    1. Больше кода, больше компетенций, сложнее система
    2. Проблемы с индексацией, задейсвуются смешанные варианты (SSR)
    3. Размер кода на фронте, больше нагрузка на устройства


    Наверняка не все перечислил - то, что быстро пришло на ум.
    Ответ написан
    Комментировать
  • Как исправить проблему с require в nuxt?

    IwanQ
    @IwanQ
    Плохие времена часто дают прекрасные возможности
    require(`@/uploads/${this.song.file}`).default
    Ответ написан
    Комментировать
  • Как через window сделать глобальную переменную const?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Через defineProperty()
    Object.defineProperty(window, "test", {
      value: "QnA"
    });
    Присвоение нового значения ошибки не вызовет, но и не сработает: сохранится указанное значение.
    проверки
    test = "X"; 
    test // "QnA"
    
    var test = "Y";
    test // "QnA"
    
    window.test = "Habr";
    test // "QnA"
    
    const test = "Z" // Uncaught SyntaxError: redeclaration of var test

    Тут не указано writable: false – оно и так по умолчанию false. И именно это свойство дескриптора определяет, можно ли назначить новое значение.

    Если переменная/свойство уже были декларированы ранее, то надо явно указать writable: false, чтобы свойство стало «константным».
    var test = "Habr";
    
    Object.defineProperty(window, "test", {
      value: "QnA",
      writable: false,
    });
    Ответ написан
    Комментировать
  • Как вывести строку по id php ?id=1?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вопрос хороший, но здесь мы упираемся в главную беду пхп - ВСЕ учебники в интернете, и особенно видео - показывают как писать адов говнокод из прошлого века.

    1. Получение значения из адресной строки

    Чтобы получить значение переменной, которую передали в строке запроса (это то что после знака вопроса), надо обратиться к переменной $_GET

    То есть в данном случае можно написать $id = $_GET['id']. Имя получаемой переменной ($id) может быть любым и не обязательно совпадать с переданным значением. А вот в индекс массива $_GET разумеется надо писать именно то имя, которое в адресной строке. То есть если site.com/?id=1 то в $_GET['id'] будет значение 1.

    2. Валидация данных

    Далее очень желательно проверить, что мы в переменной получили то что хотели, а так же что мы вообще хоть что-то получили.

    Сначала надо проверить наличие в массиве $_GET нужного ключа. В данном случае это можно сделать с помощью оператора isset() (хотя вообще она для проверки наличия ключей в массивах не рекомендуется)
    Если для показа информации используем отдельную, специальную страницу, которая только занимается показом данных по айди, то после проверки на существование надо выдать ошибку.

    Затем, поскольку id может быть только целым числом больше нуля, то лучше проверить и это тоже и тоже выдать ошибку.

    3. Соединение с БД.

    в "config.php" должно быть написано не то что там сейчас а вот это (со своими параметрами подключения разумеется)
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $link = mysqli_connect($host, $user, $pass, $db_name);
    $link->set_charset("utf8mb4");


    4. SQL

    Запрос, который нам нужен, выглядит так:
    SELECT * FROM `product` WHERE id=1

    5. Выполнение запроса в РНР

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

    Важно, чтобы данные в БД всегда попадали отдельно от самого запроса. Это непреложное правило, которое надо соблюдать всегда.
    Для этого надо
    1. Заменить все переменные в запросе на специальные маркеры, которые называются плейсхолдеры или параметры, а по сути - просто знаки вопроса
    2. Подготовить запрос к исполнению с помощью функции prepare(). Эта функция принимает строку запроса и возвращает экземпляр специального класса stmt, с которым в дальнейшем и производятся все манипуляции
    3. Привязать переменные к запросу.
    4. Выполнить подготовленный ранее запрос с помощью с помощью execute()
    5. Получить результат запроса через get_result()
    6. и дальше конкретную строку из БД с помощью уже знакомой fetch_assoc


    В коде это будет так
    $sql = "SELECT * FROM `product` WHERE id=?";
    $stmt = $link->prepare($sql);
    $stmt->bind_param("s", $id);
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_assoc();


    bind_param() принимает в качестве параметров все переменные, которые должны попасть в запрос, в том же самом порядке, в котором стоят плейсхолдеры в запросе. Но кроме того, сначала в этой функции должны быть указаны типы для всех переменных, в виде строки, где тип переменной обозначается одной буквой. То есть букв в этой строке должно быть ровно столько, сколько дальше будет переменных. К счастью, можно особо не париться с типами и для всех переменных указывать тип "s".

    6. Вывод данных.

    Важно понимать, что в момент вывода данных никакой работы с БД уже быть не должно!
    Должны быть только переменные РНР с уже полученными данными.
    Ответ написан
    1 комментарий
  • Как обработать двухфакторную аутентификацию Google?

    SoreMix
    @SoreMix
    yellow
    2fa гугла (да и не только) по сути является просто секретной строкой, на основе которой генерируются коды. Установите библиотеку pyotp, достаньте вашу секретную строку (обычно либо сайт ее даёт в чистом виде, для использования в других приложениях, либо даёт хотя бы возможность сгенерировать QR код, который можно прочитать камерой и из него достать строку; альтернативный вариант - открыть логи запросов в браузере и сгенерировать новый 2fa код, он где нибудь отразиться в истории), далее просто делаете
    import pyotp
    code = pyotp.TOTP(secret_line).now()

    И отправляете этот код через requests, точно так же как и отправляет обычный браузер
    Ответ написан
    1 комментарий
  • Сайт возвращает 404 при отправке запроса requests?

    delvin-fil
    @delvin-fil
    Crazy Linux-admin
    import requests
    
    headers = {
        'User-Agent': ('Mozilla/5.0 (Windows NT 6.0; rv:14.0) Gecko/20100101 '
                       'Firefox/14.0.1'),
        'Accept':
        'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language':
        'ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3',
        'Accept-Encoding':
        'gzip, deflate',
        'Connection':
        'keep-alive',
        'DNT':
        '1'
    }
    
    url = f'https://subtitry.ru/'
    response = requests.post(url, headers=headers).text
    print(response)
    Ответ написан
    Комментировать
  • Как извлечь get параметр с url?

    @yaroslav1996
    Можно так.

    const query = new URLSearchParams(window.location.search);
    const {lpkay1, lpkay2} = Object.fromEntires(query.entries());
    Ответ написан
    Комментировать
  • Спавн бесконечного количества воркеров CELERY?

    @reqww Автор вопроса
    celery -A your_app_name worker --pool=solo -l info
    Ответ написан
    Комментировать
  • Что такое Mixins?

    @kyern
    Быдлокодер без стажа
    Вот довольно хорошее объяснение mixin "на пальцах".
    Ответ написан
    Комментировать
  • Cмысл декоратора property?

    AtomKrieg
    @AtomKrieg
    Давай я поищу в Google за тебя
    "чем отличается первый метод от второго?"
    первый метод нужно вызывать без скобок и он прикидывается обычной переменной-членом класса, хотя внутри может быть спрятана весьма замысловатая логика. Обычный геттер, только более удобный.
    Ответ написан
    1 комментарий