• Стоит ли учить php в 2021 году для разработки web приложений и сайтов?

    Nordic_Alf
    @Nordic_Alf
    PHP Developer
    Многие хейтят Php, что он медленный, старый, много утечек памяти, нет нормальной асинхронности

    Та те хейтеры - студенто-школьники, которые один раз хелоуворлд написали прям в одном файле на 2м курсе не дойдя даже до ООП.

    Конечно учи, если тянет в бэкенд веба, хороший язык для старта. Проектов хороших и новых куча, денег куча, работы куча(в том числе удалённой!), решений куча. Язык быстрый, любые задачи решает, асинхронность прикручивается, всё что душе угодно. Реально очень востребованный язык, никуда он не умирает и вакансий меньше не становится.
    То есть это не тот язык, где страшно за будущее пока учишь его. С PHP ты всегда найдёшь первую работу. Личное имхо - только в CMS не лезь, иди по пути фреймворков, ООП, паттернов, SOLID, хорошего бэкенда в общем. Удачи!
    Ответ написан
  • Почему не работают заголовочные файлы?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Потому что так работает система "модулей" в СИ++ (никакие это не модули, а атавизм времен C без плюсов. От этого куча проблем, но по нормальному сделать никак не могут).

    Каждый cpp файл подключает объявления из остальных "модулей" через include хедеров. Потом каждый "модуль" собирается в объектный файл в котором есть реализации каких-то методов, а каких-то - нет, но они там используются. А потом линковщик собирает все объектные файлы в один исполняемый файл, где все-все-все реализованно.

    Вы же пытаетесь скомпилировать только один модуль сразу в исполняемый файл. Компилятор не находит реализацию класса A (она же в A.cpp. В A.h - только декларация).

    Если в проекте больше одного cpp файла - используйте систему сборки, вроде Cmake (есть и под windows).

    Или если хотите руками - тогда надо сначала собрать все объектные файлы и потом из них исполняемый:
    g++ -c a.cpp -o a.o
    g++ -c main.cpp -o main.o
    g++ a.o main.o -o main.exe
    Ответ написан
    4 комментария
  • Почему не работает перегрузка класса?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Оператор не должен возвращать указатель на объект. Он должен возвращать ссылку.

    Если же у вас указатель, к которому вы применяете операцию ++, то вызывается не перегруженный оператор, а используется арифметика указателей - просто сдвигается адрес в памяти на следующий.

    Попробуйте (*p)++.
    Ответ написан
    2 комментария
  • Почему функция не возвращает указатель на объект класса?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    if (!a)	{
        a->s = s;
        cout << 5;
        return a; //ошибка, не возвращает указатель на обьект класса
    }


    У вас тут a==NULL - пустой указатель. Вы пытаетесь его члену что-то присвоить (то. что программа не упала - вам дико повезло). потом вы возвращаете этот же пустой указатель.

    Вам надо создавать новый объект через new в этом случае.
    Ответ написан
    3 комментария
  • Почему объект класса из вектора некорректно выполняет функцию класса?

    vabka
    @vabka
    Токсичный шарпист
    Вы только зарезервировали место в векторе, но в нём данных нет.
    Нужно добавить в него экземпляр класса
    Ответ написан
    2 комментария
  • Почему объект класса из вектора некорректно выполняет функцию класса?

    Наверное есть больше вариаций. Предложу три.

    1) Добавление объекта в контейнер(вектор) с помощью метода контейнера(push_back) и вызова конструктора при создании объекта который будет инициализировать поля.
    2) Создание объекта, вызов метода set и добавления объекта в вектор при помощи метода контейнера(push_back, insert, etc).

    Здесь демо двух вариаций:
    #include <iostream>
    #include <vector>
    #include <Windows.h>
    using namespace std;
    
    class Animal {
    
    	string name;
    	string gender;
    	int age;
    
    public:
    	
    	// Default constructor
    	Animal() {
    		name = "";
    		gender = "";
    		age = 0;
    	}
    	
    	// Constructor which can be called when creating an object
    	Animal(string n, string g, int a) {
    		name = n;
    		gender = g;
    		age = a;
    	}
    
    	void set(string n, string g, int a) {
    		name = n;
    		gender = g;
    		age = a;
    	}
    	
    	void const print() {
    		cout << "Животное: " << name << endl << "Пол: " << gender << endl << "Возраст: " << age << endl;
    	}
    };
    
    
    int main() {
    	SetConsoleCP(1251);
    	SetConsoleOutputCP(1251);
    	setlocale(LC_ALL, "Russian");
    	
    	/* Creating a vector container and adding an object by calling the constructor of the Animal class and calling the container-vector method */
    	vector <Animal> animals;
    	animals.push_back(Animal("dog", "male", 3));
    	
    	// Creating an object and calling the set method
    	Animal cat;
    	cat.set("cat", "male", 1);
    	animals.push_back(cat);
    	
    	// Content of vector
    	for(auto animal: animals) {
    	   animal.print();
    	   cout << "" << endl;
    	}
    	
    	return 0;
    }

    Третий вариант, вектор определенной длины(трех объектов как вариация).
    #include <iostream>
    #include <vector>
    #include <Windows.h>
    using namespace std;
    
    class Animal {
    
    	string name;
    	string gender;
    	int age;
    
    public:
    	
    	// Default constructor
    	Animal() {
    		name = "";
    		gender = "";
    		age = 0;
    	}
    
    	void set(string n, string g, int a) {
    		name = n;
    		gender = g;
    		age = a;
    	}
    	
    	void const print() {
    		cout << "Животное: " << name << endl << "Пол: " << gender << endl << "Возраст: " << age << endl;
    	}
    };
    
    
    int main() {
    	SetConsoleCP(1251);
    	SetConsoleOutputCP(1251);
    	setlocale(LC_ALL, "Russian");
    	
    	vector <Animal> animals(3);
    	animals[0].set("dog", "male", 3);
    	animals[1].set("cat", "male", 1);
    	animals[2].set("pig", "female", 5);
    	
    	// Content of vector
    	for(auto animal: animals) {
    	   animal.print();
    	   cout << "" << endl;
    	}
    	
    	return 0;
    }
    Ответ написан
    Комментировать
  • Как постоянно обновлять информацию, не перезагружая страницу?

    @jenya92
    Страница сама по себе не знает, сколько раз её просматривали другие пользователи. Переменную со значением нужно хранить на сервере, а страница должна получать эти данные. К примеру браузер может обновлять эти данные следующим образом:

    <!DOCTYPE html>
    <html lang="ru">
    <head>
      <meta charset="UTF-8">
      <title>Счетчик просмотров</title>
      
    <script>
    document.addEventListener('DOMContentLoaded', function() {
        console.log('Сайт стартовал!');
        let TimeStep = 1000, // Обновляем данные раз в секунду
        url = '/get.php'; // Адрес, где хранится значение счётчика
        
        function Update(){
            console.log('Отправляем запрос...');
            let R = new XMLHttpRequest();
    		
    		R.open('POST', url, true);
    		R.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    		R.send();
    		R.onreadystatechange = function(){
    			if(R.readyState == 4){
    				switch (R.status) {
    					case 200:
                            let Re = JSON.parse(R.responseText);
                            document.getElementById('p1').innerHTML = 'Просмотров: '+Re.get;
                            console.log(Re);
    						break;
    					case 404:
    						console.log('Адрес запроса не верен');
    						break;
    					default:
                            console.log('неизвестная ошибка');
    				}
    			}
            }
            
            setTimeout(Update, TimeStep);
        }
    
        Update();
    });
    </script>
    
    </head>
    <body>
            <p  id="p1"></p>
    </body>
    </html>


    Как реализовать хранение переменной на сервере - вариантов куча, можно в базе, можно в файле. Для примера, как может быть реализована отправка счётчика:

    <?php
    
    // Получаем из Бд значение, сколько просмотров страницы было
    $AllGet = 5;
    // К примеру получили занчение, что было пять просмотров
    
    echo json_encode(array('Err'=>false,'get'=>$AllGet));
    // Отправили это значение на страницу
    
    ?>
    Ответ написан
    2 комментария
  • Нужно получить ссылку сайта после запроса, но как?

    total4c
    @total4c
    Говнокодер
    Но я не знаю как нажимать на кнопки или делать для этого запросы.

    Selenium
    Ответ написан
    Комментировать
  • Нужно получить ссылку сайта после запроса, но как?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Если запрос не сильно сложный, то можно так:
    F12 в браузере -> network
    Нажимаем кнопку на сайте, смотрим на первый запрос в списке и что он вернул. Если вернул html, из него можно распарить ссылку новую. Если редирект, то нужно брать новую ссылку из хедера Location.

    Если запрос сложный, допустим нужна авторизация, или там через js сложно сделано, то можно использовать Selenium. Там все просто. Чтобы браузер не мозолил глаза, можно задать настройку headless.

    Это в общих чертах. Если никто не сделает до завтра, то могу помочь утром.

    UPD:
    import requests
    import time
    import json
    import re
    
    
    
    BASE_URL = 'https://rezka.ag/ajax/get_cdn_series/?t={}'
    
    
    
    def parse_quality(urls, quality=None):
    
        splited = urls.split(',')
    
        if not quality:
            using_quality = splited[-1].split('http')[0]
            print('Используем максимально доступное качество ({})'.format(using_quality))
            return splited[-1].split(' or')[0].replace(using_quality, '')
    
        intext_quality = '[{}p]'.format(quality)
    
        if intext_quality not in urls:
            print('Качества {} нет в списке доступных'.format(quality))
            
            # тут уже я не выдержал и импортировал регекс
            available_qualities = re.findall(r'\[(.+?)\]', urls)
            print('Доступные варианты: ', ', '.join(available_qualities))
            return None
    
        for url in splited:
            if intext_quality in url:
                return url.split(' or')[0].replace(intext_quality, '')
    
    
    def get_urls(film_id, season, episode):
    
        payload = {'id': film_id, 'translator_id': '1', 'season': season, 'episode': episode, 'action': 'get_stream'}
    
        r = requests.post(BASE_URL.format(str(int(time.time()))), data=payload)
    
        if r.status_code != 200:
            # тут нужно будет как нибудь обработать ошибку, если запрос не прошел
            print('Ошибка')
            return
    
        data = json.loads(r.text)
    
        if data.get('success') != True:
            # тут нужно будет как нибудь обработать ошибку, если запрос не прошел
            print('Ошибка')
            print(data)
            return
    
        return data['url']
    
    
    
    if __name__ == '__main__':
        
        all_urls = get_urls(9364, 1, 1)
    
        if all_urls:
            url = parse_quality(all_urls)
    
            print(url)


    Параметры для get_urls:
    ID фильма, можно взять по ссылке в браузере
    Сезон, эпизод - тут все понятно

    Параметры для parse_quality:
    список ссылок с качеством
    желаемое качество. Например, parse_quality(all_urls, 1080)

    Если качество задано, то вернет ссылку на него, если не найдет - ошибка
    Если качество не задано, то вернет максимальное доступное

    ps:
    если весь запустить код сверху, то он вернет 1080p, но в ссылке явно будет указано 720p. В этом ошибки нет, сайт так помечает 1080p, похоже, нет там 1080 честного)

    Сырой ответ с ссылками, если интересно

    [360p]https://load.hdrezka-ag.net/tvseries/cb2beeb8822647baa8621766e5a360cc3c7ae16b/aff285f2cedd0cb70b49a97e53b8c246:2020060411/240.mp4:hls:manifest.m3u8 or https://load.hdrezka-ag.net/65af9f4fab0d894043fac8887b7da99e:2020060411/tvseries/cb2beeb8822647baa8621766e5a360cc3c7ae16b/240.mp4,[480p]https://load.hdrezka-ag.net/tvseries/cb2beeb8822647baa8621766e5a360cc3c7ae16b/aff285f2cedd0cb70b49a97e53b8c246:2020060411/360.mp4:hls:manifest.m3u8 or https://load.hdrezka-ag.net/ea218fab2e907aa2093c5bc7f9cb480d:2020060411/tvseries/cb2beeb8822647baa8621766e5a360cc3c7ae16b/360.mp4,[720p]https://load.hdrezka-ag.net/tvseries/cb2beeb8822647baa8621766e5a360cc3c7ae16b/aff285f2cedd0cb70b49a97e53b8c246:2020060411/480.mp4:hls:manifest.m3u8 or https://load.hdrezka-ag.net/92bdeccddc5661b6b786659fae6adc3b:2020060411/tvseries/cb2beeb8822647baa8621766e5a360cc3c7ae16b/480.mp4,[1080p]https://load.hdrezka-ag.net/tvseries/cb2beeb8822647baa8621766e5a360cc3c7ae16b/aff285f2cedd0cb70b49a97e53b8c246:2020060411/720.mp4:hls:manifest.m3u8 or https://load.hdrezka-ag.net/d2bb808ccb6910d8317224825ee2875d:2020060411/tvseries/cb2beeb8822647baa8621766e5a360cc3c7ae16b/720.mp4

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

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Можно запустить vlc, передав просто ссылку на видео в него.

    import subprocess
    
    vlc_path = r'X:\Soft\VLC\vlc.exe'
    video_url = 'https://pe.load.hdrezka-ag.net/tvseries/cb2beeb8822647baa8621766e5a360cc3c7ae16b/83f07fd3a01c3603cdcfacaeec6296fc:2020060217/720.mp4:hls:manifest.m3u8'
    
    subprocess.Popen([vlc_patch, video_url])
    Ответ написан
    Комментировать
  • Как сделать окошко с обновляемым текстом в 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()
    Ответ написан
    Комментировать
  • Почему не работает базовая программа на python kivy?

    BitNeBolt
    @BitNeBolt
    На сколько я помню, в классе должен быть прописан конструктор:
    def build(self):
            return
    Ответ написан
    Комментировать
  • Почему не работает базовая программа на python kivy?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    sdl2 - ImportError: DLL load failed: %1 не является приложением Win32.
    - скорее всего библиотека sdl2.dll не той разрядности. Если установлена x64, установите x32 и наоборот.
    Ответ написан
    Комментировать
  • Почему в Pascal " ((a2 and a1)>0) " не работает в отличии от "(a1>0) and (a2>0)"?

    longclaps
    @longclaps
    Открываем что там у вас вместо учебника, читаем раздел "типы данных" и узнаём, какие бывают типы данных и какие к ним применимы операции.
    Ответ написан
    6 комментариев
  • Как разместить видео справа при перекрытии места размещения div с "margin:0"?

    RAX7
    @RAX7
    Кнопку 'Contact Us' засуньте в .text, и добавить float: left; для .text
    https://jsfiddle.net/uvzb6905/
    Ответ написан
    Комментировать