• Какие технологии нужно знать для создания мессенджера?

    @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 комментария
  • Как установить курсор после выделения?

    lidacriss
    @lidacriss
    wtf
    Ответ написан
    Комментировать
  • Как сделать закрытие консоли если будет нажатие на кнопку?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Многопоточный вариант
    import time
    from threading import Thread
    
    run = True
    
    def ticker():
        while run:
            time.sleep(1)
            print('Тик')
            time.sleep(1)
            print('Так')
    
    
    # Запуск функции ticker в отдельном потоке.
    # Параметр daemon=True нужен чтобы
    # дочерний поток умирал вместе с основным
    # в случае внештатного выхода.
    Thread(target=ticker, daemon=True).start()
    
    while run:
        command = input('Для выхода введите "exit"\n')
        if command.lower() == 'exit':
            run = False

    Асинхронный вариант
    import asyncio
    import signal
    
    def shutdown():
        # Отменяем все задачи, кроме вызвавшей
        for task in asyncio.Task.all_tasks():
            if task is not asyncio.tasks.Task.current_task():
                task.cancel()
    
    
    async def user_io():
        loop = asyncio.get_event_loop()
        # Ждём действия от пользователя
        while True:
            # Запускаем input() в отдельном потоке и ждём его завершения
            command = await loop.run_in_executor(None, input, 'Для выхода введите "exit"\n')
            if command.lower() == 'exit':
                shutdown() # Отменяем все задачи
                break      # и выходим из цикла
    
    
    # Сопрограмма, выполняемая параллельно с ожиданием пользовательского ввода
    async def task_manager():
        counter = 0
        while True:
            try:
                await asyncio.sleep(1)
            except asyncio.CancelledError:
                break # Выходим из цикла, если задачу отменили
            counter += 1
            print("I'm a task manager {}!".format(counter))
    
    
    if __name__ == '__main__':
        # Устанавливаем обработчик Ctrl+C
        signal.signal(signal.SIGINT, lambda n, f: shutdown())
    
        # Запускаем цикл событий
        loop = asyncio.get_event_loop()
        # Задача ждущая завершения сопрограм user_io и task_manager
        main_task = asyncio.wait([user_io(), task_manager()])
        try:
            loop.run_until_complete(main_task)
        except asyncio.CancelledError:
            # Позволяем main_task завершиться
            loop.run_until_complete(main_task)
        loop.close()
    Ответ написан
    2 комментария
  • Для чего в PyQt указывается ObjectName?

    @zaswed
    например в css стилях
    QPushButton#exit_button {
        border-image: url(resources/icons/64/exit.png);
    }
    QPushButton#config_button {
        border-image: url(resources/icons/64/config.png);
    }


    config_button и exit_button имена объектов
    Ответ написан
    1 комментарий
  • Как установить PyQt5 для Python 3.6 (windows)?

    x67
    @x67
    попробуй использоватьpip3 install pyqt5
    Ну и неплохо бы читать гайды перед установкой
    Ответ написан
    5 комментариев
  • Как установить PyQt5 для Python 3.6 (windows)?

    @Dim_M
    Всем глубокоуважаемый привет. Сам долго мучился с этим вопросом.
    С начало
    pip3 install pyqt5
    потом
    pip install PyQt5-tools
    ищешь в C:\Python36\Lib\site-packages\pyqt5-tools ярлык designer.exe
    Рисуешь окна и кнопки в designer.
    Сохраняешь в С:\ test.ui и командой С:/test.ui -o С:/test.py конвертируешь питон
    или батник сделать.
    PS
    в pycharm можно настроить открытие designer.exe
    Ответ написан
    Комментировать
  • Кириллица и кодировка в MS-DOS QBasic?

    NeiroNx
    @NeiroNx
    Программист
    Там кодировка CP866. Лишь некоторые блокноты способны с ней работать - попробуйте Notepad++
    в консоли перез дапуском программы можно сменить кодировку на CP1251:
    mode con codepage select=1251
    Имхо изучали бы лучше питон - он так же прост.
    Ответ написан
    2 комментария
  • Как отсортировать массив, если часть значений - undefined?

    0xD34F
    @0xD34F Куратор тега JavaScript
    arr.sort((a, b) => !a.date ? 1 : !b.date ? -1 : a.date - b.date)

    или

    arr.sort((a, b) => (a.date || Infinity) - (b.date || Infinity))
    Ответ написан
    2 комментария
  • Как запустить HTML5 валидацию формы перед AJAX?

    Audiophile
    @Audiophile Автор вопроса
    Наконец-то нашёл более-менее простой способ.

    Нужно прописать нечто такое перед инструкциями в tryToLogin():

    if(!$('.login-form')[0].checkValidity()) {
            $('.login-form__submit').off( "click" ).click().click(function (e) {
                e.preventDefault();
                tryToLogin();
            });
            return false;
        }


    Т.е. если браузер сообщает, что проверка не пройдена, мы анбиндим функцию с клика на сабмит, кликаем сабмит (браузер покажет нативные сообщения), и сразу же биндим функцию обратно.
    Ответ написан
    4 комментария
  • .net visual basic удалить значение из массива?

    @dmitryKovalskiy
    программист средней руки
    Array.Copy(sourceArray,1,destinationArray,0,sourceArray.Length-1)

    Примерно так можно
    Ответ написан
    Комментировать
  • .net visual basic удалить значение из массива?

    Если правильно понял вопрос, то никак)Сужу по с#
    Только новую копию делать и копировать.
    Ответ написан
    Комментировать
  • Как правильно вызвать одну форму из другой?

    @cicatrix
    было бы большой ошибкой думать
    Visual Basic учит вас плохому.
    Он позволяет создать класс формы без явного вызова конструктора. Уходите с него сн C#

    Всегда явно указывайте при помощи слова New:
    frm2 = New Form2
    frm2.Show()
    Ответ написан
    Комментировать