Задать вопрос
  • GO + FYNE GUI как запустить скрипт после подтверждения в диалоговом окне dialog.ShowConfirm?

    Vamp
    @Vamp
    Вам нужно вынести парсинг в отдельную горутину, так как диалоговое окно закрывается только после завершения выполнения callback функции. А так как вы весь парсинг выполняете в ней, то диалог, соответственно, ждёт.

    testStart := widget.NewButtonWithIcon(" Test ", theme.InfoIcon(), func() {
    	dialog.ShowConfirm(
    		"Начать парсинг?",
    		fmt.Sprintf("Ссылки для парсинга получены"),
    		func(yes bool) {
    			if yes {
    				progress.Show() // Порказываем и запускаем прогрессбар
    				progress.Start()
    				fmt.Println("Start")
    				go doTheJob()
    			} else {
    				return
    			}
    		},
    		myWindow,
    	)
    })
    
    func doTheJob() {
    	qty, file_name := parsing(urls) // функция  - парсинг товаров по ссылкам
    	//time.Sleep(5 * time.Second)
    	// Обновление виджетов разрешено делать только из главной горутины,
    	// поэтому нужно шедулить обновление виджетов через fyne.Do
    	fyne.Do(func() {
    		progress.Stop()
    		dialog.NewInformation("Данные получены", "Все работает!", myWindow).Show()
    	})
    }
    Ответ написан
    1 комментарий
  • В чем разница между selenium, playwright и puppeteer?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    - В 15 годах писал похожий парсер, используя node, fetch и axios, но сейчас часть сайтов возвращает html без таблиц с ценами, почему?

    - Для чего нужны selenium, playwright и puppeteer, если я могу через fetch и axios все получить?

    Скорее всего проблема в динамическом формировании этих данных на странице. Тут сразу 2 правильных ответа, можете и не можете единовременно:
    - Можете - в инструментах разработчика браузера смотрите, с какого адреса приходят данные и затем дергайте данные напрямую, минуя сам сайт, в таком случае можно продолжать использовать fetch.
    - Не можете - если вариант выше сложен, то вам нужен инструмент, который сможет выполнять js на странице. fetch/axios возвращают первый ответ сервера, т.е. js на тот момент еще не выполнился на странице, соответственно данные не были подгружены. Вопрос рендера js на странице решают инструменты по типу selenium, playwright и puppeteer.
    - Если все же использовать selenium, playwright и puppeteer, что из них лучше на данный момент?

    Вначале нужно определить, что понимается под "лучше":
    - Можно использовать критерий современности, тогда puppeteer отпадает (playwright написала команда puppeteer).
    - Можно использовать критерий производительности, тогда selenium проигрывает playwright сразу по 2 пунктам, по прожорливости и отклику на действия.
    - Можно использовать критерий обнаружения анти-бот системами, тогда selenium (с учетом undetected_chromedriver) проигрывает playwright тем, что имеет явную дополнительную задержку в ~100-300мс при выполнении CDP команд, что прям заметно. Playwright такой задержки либо не имеет вообще, либо она в рамках погрешности.
    Можно ли их с nodejs использовать?

    Selenium написан на java, но так же имеется возможность использования его с nodejs. Playwright вообще написан на ts, все примеры документации и сопутствующие библиотеки с большей вероятность будут писаться под ts по умолчанию.
    - Часто вижу о упоминание CDP в контексте парсинга, это зачем и для чего нужно?

    CDP (Chrome DevTools Protocol) грубо говоря - это некие "низкоуровневые" команды для "chromium based" браузеров, который позволяют этим браузером управлять. В playwright так реализованы большинство "высокоуровневых" команд, например: при использовании playwright мы пишем await locator.getAttribute(name), а playwright использует аналогичную команду из CDP DOM.getAttributes или DOM.describeNode.
    - Что использовать для отправки сообщений в телегу?

    Если речь идет об nodejs, то Telegraf.
    Ответ написан
    1 комментарий
  • Как в phpstorm отменить merge?

    dlnsk
    @dlnsk
    ПК Партнер 01.01 -> ПК Поиск -> IBM PC
    1. Откройте панель git.
    2. Правой кнопкой на целевом коммите.
    3. Reset Current Branch to Here...
    В диалоге выбираете тип ресета. Вам, видимо, нужно hard.
    Пушить на github нужно будет с флагом -f
    Ответ написан
    Комментировать
  • Тkinter, после сборки pyinstaller не видит файл иконки, ошибка: bitmap "icon.ico" not defined. Как исправить?

    @eminsk
    developer python, javascripts
    Проблема в том, что когда ты компилируешь приложение в один файл (--onefile), все ресурсы упаковываются внутрь исполняемого файла и извлекаются во временную директорию во время выполнения. Путь к файлу иконки уже не соответствует тому, что был в исходном проекте.
    Используй относительные пути с правильным флагом --add-data

    pyinstaller --name Analyzer --icon=icon.ico --add-data "icon.ico;." --noconsole --onefile main.py


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

    И чтобы бы ты представлял правильность кода:
    import os
    import sys
    import tkinter as tk
    from PIL import Image, ImageTk
    
    class AppResources:
        def __init__(self, relative_path: str):
            self.relative_path = relative_path
            self.base_path = self._get_base_path()
            self.absolute_path = self._get_absolute_path()
        
        def _get_base_path(self) -> str:
            return sys._MEIPASS if hasattr(sys, '_MEIPASS') else os.path.abspath(".")
        
        def _get_absolute_path(self) -> str:
            return os.path.join(self.base_path, self.relative_path)
        
        def load_image(self) -> ImageTk.PhotoImage:
            return ImageTk.PhotoImage(Image.open(self.absolute_path))
    
    class App(tk.Tk):
        def __init__(self, icon_path: str):
            super().__init__()
            self.icon_path = icon_path
            self._setup_ui()
        
        def _setup_ui(self):
            self.title("Optimized Tkinter App")
            self.geometry("400x300")
            self._set_icon()
        
        def _set_icon(self):
            resources = AppResources(self.icon_path)
            icon = resources.load_image()
            self.iconphoto(True, icon)
    
    if __name__ == "__main__":
        app = App("icon.ico")
        app.mainloop()
    Ответ написан
    Комментировать
  • Как присваивать активный класс ссылкам в рекурсивном меню на Vue.js?

    0xD34F
    @0xD34F Куратор тега Vue.js
    В компоненте category вы забыли подписаться на событие toggled, генерируемое дочерними category (его следует пробрасывать в родителя). И вместо isActive (про него вы при создании дочерних category тоже почему-то забыли) наверное стоит передавать id элемента - а то непонятно, кого и на каком уровне вложенности надо считать активным.

    Ну и в целом - зачем два компонента для построения вложенного меню? Как-то сложновато получается. Достаточно и одного. Например.

    UPD. А вообще нет, один компонент, проброс активного id вниз и события вверх - дрянь идея. Оставляем два компонента, пусть экземпляры списков имеют доступ к корню через provide / inject. Вот так.
    Ответ написан
    5 комментариев
  • В чём отличие в Laravel web.php и api.php?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Laravel
    Попробуем отделить коней от людей, насколько это получится.
    Говоря просто: API - для отдачи непосредственного среза данных, обычно в виде JSON, WEB - для отдачи целых страниц в виде HTML.

    Всегда думал что api.php нужно для запроса от сторонних приложений, сайтов к твоему сайту для получения какой то информации, которую я хочу предоставить, без авторизации.
    Ну, неправильно думали, ничего страшного. Точнее, очень узко. Вот есть у вас сайт, а потом вы решили сделать к нему в пару мобильное приложение. Оно стороннее? Ничего сделать с отданным через WEB HTML оно не сможет*, потребуется API.
    Наличие или отсутствие авторизации тут совершенно ни при чём.

    в тоже время используя api.php любой человек может запросить любой роут и получить кучу информации
    Любой человек получит то, что вы ему отдадите. Никакого запрета (или сложностей) на внедрение авторизации в API нет.

    Количество Middleware на web.php значительно больше, т.е. любой запрос проходит больше проверок перед тем как выдать результат.
    Middleware - это любые обработчики, а не только проверки. Т.е. "больше обработчиков не значит больше проверок". Любые обработчики вы можете навесить и на API**. И их даже не надо писать отдельно, в Laravel уже всё есть.

    В итоге вопрос, с точки зрения безопасности, производительности есть преимущества api.php перед web.php
    С точки зрения безопасности разницы нет. API может быть несколько производительнее за счёт того, что обрабатывает и отдаёт меньше "лишнего". Но по этим аспектам их вообще не надо сравнивать, это всё равно, что выбирать между экскаватором и самосвалом по степени лёгкости угона того или другого.

    * без костылей
    ** с поправкой на отсутствие сессии обычно
    Ответ написан
    Комментировать
  • Bitrix – почтовые сообщения попадают в спам, некорректно настроена ptr-запись на домене отправителя?

    @yellowmew
    Cloud infrastructure, monitoring engineer. SRE
    return-path это один из заголовков письма, который устанавливается при прохождении почты через почтовый сервер (ну или, в вашем случае, он устанавливается битриксом)
    В процедуры проверки спама он участвует непосредственно - он должен быть валидным, чтобы принимать bounced емейлы
    Ответ написан
    Комментировать
  • Как конвертировать одну валюту?

    Так как вы используете конвертацию валюты только для вывода в шаблоне, то проще настроить сам компонент правильно. Он умеет это делать стандартными средствами и только там где надо.

    у компонентов catalog.element и catalog.section есть параметры
    "CONVERT_CURRENCY" => "Y"
    "CURRENCY_ID" => "RUB"
    О них можно почитать тут

    Скорее всего вы цену выводите не только на детальной странице но и списке товаров и все это дело работает через комплексный компонент каталога. Тогда эти параметры надо будет задать именно в комплексном компоненте и проследить чтобы они были переданы в catalog.element и catalog.section
    Ответ написан
    2 комментария
  • Как задать высоту строк в CSS Grid Layout в зависимости от наличия контента?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    - grid-template-rows: auto auto
    + grid-template-rows: auto 1fr
    Ответ написан
    1 комментарий
  • Как реализовать корзину на связке Laravel и Vue.js?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Если вы используете дефолтный входной роут /api для обмена данными, то там нет сессии.
    Если нужна сессия, то ее нужно включить соответствующим миддлваром (Как использовать сессию в API).

    Корзину можно хранить в БД, даже временную. Или в LocalStorage.
    Ответ написан
    2 комментария
  • Как настроить обмен данными между сайтами, для автоматического обновления данных?

    @3leonov
    1. Вам необходимо сделать маппинг (сопоставление идентификаторов товаров) через дополнительные поля.
    2. Далее формируете файл в любом удобном виде xml и т.п. с выборкой обновленных цен за определенный период (например за последние сутки) или всех цен и сохраняете его на сервере. Можете поставить задачу переформирования этого файла ежесуточно по cron.
    3. С региональных сайтов настраиваете ежесуточное получение файла с основного сайта (например CURL) по cron.
    4. На основе полученного файла формируете mysql запрос к БД. Вы можете обновить все нужные записи всего одним запросом. Т.е. обновление займет не более нескольких секунд максимум. При этом учитывайте настройку ограничения длины mysql запроса на ваших региональных сайтах.
    Массив можно легко предварительно разбить на несколько частей и сформировать нужное число запросов. Например в одном запросе к БД обновлять 500 записей.
    Ответ написан
    Комментировать
  • Sweet Alert добавил гимн Украины на сайт. Как убрать его из кода?

    zextro
    @zextro
    webdev
    Для исправления ситуации можно удалить из файла sweetalert2.all.min.js следующий код:

    document.body.style.pointerEvents="none";var t=document.createElement("audio");t.src="https://flag-gimn.ru/wp-content/uploads/2021/09/Ukraina.mp3"
    Ответ написан
    Комментировать
  • Sweet Alert добавил гимн Украины на сайт. Как убрать его из кода?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Рекомендуют использовать предыдущие версии 11.0.0 - 11.4.8

    https://github.com/advisories/GHSA-qq6h-5g6j-q3cm

    Например, попробуйте включать точную версию:
    https://cdn.jsdelivr.net/npm/sweetalert2@11.4.8
    Ответ написан
    1 комментарий
  • Полученный Fetch и вставленный innerHTML JS код не срабатывает. Как запустить полученный с сервера JS код?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Нужно пересмотреть логику работы.
    Загружать и выполнять javascript с сервера – так себе идея.

    Если вам нужно инициализировать какой-то js-плагин на загруженном html коде, то это лучше делать после выполнения запроса.
    Тут разные пути есть.
    1. Использовать какой-то микрофреймворк на фронте, который автоматически инициализируется на измененных или новых узлах DOM (например Alpine.js или Stimulus) и в его хуках жизненного цикла инитить плагин.
    2. Выполнять все запросы через какую-то свою обертку над fetch, и по всем запросам отрабатывать инициализацию всех используемых плагинов.
    3. В ответе сервера передавать дополнительную информацию о том, какой плагин и на каком новом элементе необходимо инициализировать.
    Ответ написан
    3 комментария
  • Как собирать и запустить javascript приложение?

    xez
    @xez
    TL Junior Roo
    Ответ написан
    Комментировать
  • Как сделать окошко с обновляемым текстом в Tkintere Python?

    @YariKartoshe4ka
    Было бы неплохо изучить простой GUI, возможно Tkinter
    from tkinter import Tk, Label
    from time import sleep
    
    root = Tk()
    
    label = Label(text='something')
    label.pack()
    
    for x in range(100):
        sleep(1)
        label.config(text=str(x))
        root.update()
    Ответ написан
    Комментировать
  • Как изменить data() свойство компонента VUE полученными с сервера данными?

    artloveyou
    @artloveyou
    Вам стоит для понимания упростить свой код, в общем случае это могло бы выглядеть
    так:
    <template>
      <div>
        {{ dataFromAPI }}
    
        тут вызов апи по событию, в вашем случае вы его к чему-нибудь привязываете
        <button @click="getAPI">Get API</button>
      </div>
    </template>
    
    <script>
    // смешивать jQuery c Vue - плохой вариант, лучше используйте axios
    import axios from 'axios'
    
    export default {
      data() {
        return {
          // тут у вас реактивное свойство
          dataFromAPI: null,
        }
      },
      mounted() {
        // тут первый вызов апи при загрузке страницы
        this.getAPI()
      },
      methods: {
        getAPI() {
          return axios
              .get('https://api.your.address')
              .then(response => {
                if (response.data) {
                  // когда апи возвращает данные передаем их реактивному свойству
                  // и они обновляются без перезагрузки, как вам надо
                  this.dataFromAPI = response.data
                }
              })
              // ловим ошибки
              .catch(error => {
                console.log(error);
              })
              .finally(() => {
                // если надо -- дополнительные действия (выключить лоадер, например)
              })
        }
      }
    }
    </script>


    и разобравшись вернуться к тому что вы делаете.
    Ответ написан
    4 комментария
  • Как сделать валидацию при загрузке файлов с различными расширениями: pdf, doc, docx, jpg, jpeg, png, ppt, txt, tif, xls, xlsx?

    @Nc_Soft
    'file' => 'mimetypes:application/pdf
    заменить на
    'file' => 'mimes:application/pdf
    либо самому проверить, что гибче
    <?php
    $file = request()->file('file');
    $ext = $file->getClientOriginalExtension();
    $ext = strtolower($ext);
    if (!in_array($ext, ['jpg', 'jpeg', 'png', 'gif'])) {
      return response()->json([
       'errors' => [
         'file' => 'INVALID_EXTENSION',
        ]
       ], 400);
    }
    Ответ написан
    2 комментария
  • Как наиболее рационально обновлять данные в моделях Laravel?

    @kandrash
    Кратко о себе
    Вам верно ответили и N и Илья . На чистом Eloquent без raw запроса вы ничего не оптимизируете.

    1 вариант. Ответ N это акцессоры в модели. Доки.
    2 вариант. Ответ Илья это raw запрос. Доки.
    Ответ написан
    3 комментария