• Как выполнить http-запрос между двумя сайтами в laradock?

    @MadridianFox
    Web-программист, многостаночник
    Конкретно про ларадок не скажу, но объясню как оно вообще работает.

    Когда контейнеры запускаются в одной сети, они доступны друг другу по доменам, которые равны названию контейнера. При запуске через docker-compose немного не так. Контейнеры видят друг друга по именам сервисов.
    Т.е. если у вас вот такой docker-compose.yml
    services:
       front:
          image: ....
       back:
           image: ....

    то фронт сможет обратиться к бэку по домену back, примерно вот так:
    file_get_contents("http://back:8080/path/to/file.txt");

    Ещё, если вы хотите чтобы сервисы обращались друг к другу по публичным доменам, а не по внутренним, можете задать в docker-compose.yml у контейнеров hostname.
    но в docker-compose.yml у контейнера можно задать его hostname,
    вот так:
    services:
       front:
          hostname: site1.ru
          image: ....
       back:
           hostname: site2.ru
           image: ....
    Ответ написан
  • Не могу определиться: PHP или Python?

    DevMan
    @DevMan Куратор тега Веб-разработка
    боятся не нужно: пых хоронят практически с момента его появления. и всё никак не похоронят.
    язык наоборот только хорошеет. и инфраструктура вокруг него тоже.

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

    а записи в ТК вообще мало кого волнуют (в масштабах рынка). у меня ее вообще нет, и это никак не мешает мне работать уже 20+ лет.
    Ответ написан
  • Почему при вызове setHtml программа вылетает?

    @Sergey6661313
    res = requests.get('http://URL/'+trek+".html")
    orly?
    ну ей богу написали хотя бы "yandex.ru/index.html" для примера.

    без объяснения причин
    ну пожалуйста пользуйтесь pycharm - есть бесплатная редакция. Он честно открывает консоль для каждой запущенной программы. В которую честно пишется причина. И которая, Самое главное, не закрывается после ошибки.

    куски кода надо делать минимальными, НО запускаемыми. например такими:
    import sys
    import requests
    import os
    from PyQt5.QtWidgets import QTextBrowser
    from PyQt5.Qt import QApplication
    from PyQt5.Qt import QThread
    
    trek = "index"
    myapp = QApplication(sys.argv)
    myapp.textBrowser = QTextBrowser()
    
    class ExperementalThread(QThread):
        def run(self):
            if os.path.exists("temp/"+trek+".html"):  # Если страница уже была ранее загружена
                with open("temp/"+trek+".html") as w:
                    myapp.textBrowser.setHtml(w.read())  # ни разу не вылетело
            else:
                res = requests.get('http://yandex.ru/'+trek+".html")
                res.encoding = 'utf-8'
                with open("temp/"+trek+".html", "w") as ri:
                    ri.write(res.text)
                myapp.textBrowser.setHtml(res.text)  # И здесь
    
    thread = ExperementalThread()
    myapp.textBrowser.show()
    thread.start()
    myapp.exec()


    и ошибка соотв. будет QObject: Cannot create children for a parent that is in a different thread.
    что значит что метод setHtml пытается для себя создать отдельный поток. А потоки из потоков создавать запретил сам батюшка Ленин ( цитата от ██.██.19██г. ).

    Значит придётся использовать сигналы и слоты.
    я создал свой класс MyQTextBrowser с наследованием QTextBrowser и сигналом signal_load_html. Который в свою очередь связал с setHTML.

    # coding=utf-8
    
    import sys, requests, os                            # импортировали,
    from PyQt5.Qt        import QApplication, QThread   # импортировали,
    from PyQt5.QtCore    import pyqtSignal              # да не
    from PyQt5.QtWidgets import QTextBrowser            # выпереимпортировали.
    
    trek = "index"                                      # ну в самом деле надо же указать чему равна ваша переменная.
    myapp = QApplication(sys.argv)                      # я угадал?
                                                        # обязательно делаем отступы перед каждым классом
    class MyQTextBrowser(QTextBrowser):                 # создаём класс и наследуем QTextBrowser
        signal_load_html = pyqtSignal(str)              # назначаем сигнал (сигнал принимает значение str (строки) )
                                                        # тут тоже отступ
        def __init__(self):                             # переназначаем метод создания объектов
            super().__init__()                          # наследуем/выполняем QTextBrowser.__init__(self)
            self.signal_load_html.connect(self.setHtml) # тут связываем наш сигнал с setHtml
    myapp.textBrowser = MyQTextBrowser()                # ну и создаём вообщемто обьект нашего класса MyQTextBrowser
                                                        # обязательно делаем отступы после каджого класса.
                                                        # обязательно делаем отступы перед каждым классом
    class ExperementalThread(QThread):                  # названия придумываем на ходу
        def run(self):                                  # init не нужен сразу run
            if os.path.exists("temp/"+trek+".html"):    # Если страница уже была ранее загружена
                with open("temp/"+trek+".html") as w:   # открываем наш фаил в папке temp
                    # myapp.textBrowser.setHtml(w.read())  # вылетает? у меня кстати нет, но я читер :)
                    myapp.textBrowser.signal_load_html.emit(w.read())  # ни разу не вылетело.
            else:                                       # люблю когда много коментариев в коде
                res = requests.get('http://yandex.ru/'+trek+".html") # "Люблю говорить - это помогает думать."
                res.encoding = 'utf-8'                  # -- Томас Стернз Элиот
                with open("temp/"+trek+".html", "w") as ri: # когда этот код уже кончится?
                    ri.write(res.text)                  # тут пусто потому что в оригинале у вас был "URL" а не yandex
                # myapp.textBrowser.setHtml(res.text)   # И здесь
                myapp.textBrowser.signal_load_html.emit(res.text)  # ни разу не вылетело
                                                        # обязательно делаем отступы после каждого класса.
    thread = ExperementalThread()                       # создаём наш поток
    myapp.textBrowser.show()                            # ах да - самое главное показать окно. Иначе ничего не произойдёт
    thread.start()                                      # запускаем поток
    myapp.exec()                                        # Ой, всё!()


    p.s.
    Вообще setHtml не метод QTextBrowser. Это метод из QTextEdit (который QTextBrowser наслеует. ) Сам же QTextBrowser создан для того чтобы самостоятельно загружать и показывать страницы с интернета. (по урлу.)
    Ответ написан
  • Создание вероятности на php. Можете помочь?

    GeneMoss
    @GeneMoss
    void
    /**
     * Случайная выборка с учетом веса каждого элемента.
     * @param array $data Массив, в котором ищется случайный элемент
     * @param string $column Параметр массива, содержащий «вес» вероятности
     * @return int Индекс найденного элемента в массиве $data 
     */
    function getRandomIndex($data, $column = 'ver') {
      $rand = mt_rand(1, array_sum(array_column($data, $column)));
      $cur = $prev = 0;
      for ($i = 0, $count = count($data); $i < $count; ++$i) {
        $prev += $i != 0 ? $data[$i-1][$column] : 0;
        $cur += $data[$i][$column];
        if ($rand > $prev && $rand <= $cur) {
          return $i;
        }
      }
      return -1;
    }
    
    // Использование
    $games = [
    	['name' => 'Игра 1', 'ver' => 2], // вероятность 2/15
    	['name' => 'Игра 2', 'ver' => 0], // вероятность 0/15
    	['name' => 'Игра 3', 'ver' => 1], // вероятность 1/15
    	['name' => 'Игра 4', 'ver' => 4], // вероятность 4/15
    	['name' => 'Игра 5', 'ver' => 8], // вероятность 8/15
    ];
    $i = getRandomIndex($games);
    echo $games[$i]['name'];

    В параметре массива «ver» задается вероятность выпадения данного элемента таким образом, что вероятность выпадения каждого элемента равна ver/sum, где sum — сумма вероятностей в данном массиве (в примере это: 2 + 0 + 1 + 4 + 8 = 15).

    После миллиона испытаний получено следующее количество выпадений:
    • Игра 1 = 13.3958%
    • Игра 2 = 0%
    • Игра 3 = 6.671%
    • Игра 4 = 26.6124%
    • Игра 5 = 53.3208%

    Что до сотой доли процента совпадает с заданной вероятностью в параметре «ver».

    P. S. Суть алгоритма — имитация случайной выборки из массива, который заполнен элементами, которые дублируются с заданной частотой.
    Ответ написан