Задать вопрос
  • Почему нет профсоюза IT-работников?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Я погуглил и обнаружил, что только ит-профсоюзов заявляющих себя как общероссийские несколько штук. Первый, похоже, ещё в 2003-м году начал существование. И ещё есть куча региональных. Так что вопрос в том, почему вы в них не вступаете.
    Ответ написан
    Комментировать
  • Как запретить плагинам сервера, занимать порты?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    При запуске JVM передать параметр -Djava.security.policy=server.policy, а в файле server.policy написать

    grant {
        permission java.net.SocketPermission "127.0.0.1:25565", "connect,accept,resolve";
    };

    JVM не позволит программам занимать иные порты, кроме указанных в политике. Правда, она ещё много чего запретит и скорее всего вам придётся долго и кропотливо выяснять, какие ещё права нужны вашему серверу для нормальной работы.
    Ответ написан
    3 комментария
  • Асинхронность Django+Celery/Tornado?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Асинхронный код сложнее. Выбирать Торнадо стоит тогда, когда ваш сервер должен обрабатывать тысячи одновременно открытых соединений. Для вашей задачи вполне подойдёт связка из Django и Celery или просто из Django и запускаемых кроном management commands.
    Ответ написан
    1 комментарий
  • Почему выбрасывает ошибку первой миграции Django?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    При создании БД на сервере ей надо было задать кодировку UTF-8.
    Ответ написан
    Комментировать
  • Как сделать ненавязчивые уведомления о новых сообщениях в мессенджере?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    При открытии окна со списком сообщений ставить таймут на запуск через 15-30 секунд javascript-функции, которая получит из этого окна список всех сообщений с меткой "непрочитано", отправит ajax'ом список их идентификаторов специальной вьюхе и в случае положительного ответа поставит им отметку "прочитано". Вьюха на серваке получается предельно быстрая - всего-то надо сделать пакетное обновление по списку первичных ключей. И нужно написать management command запускаемую кроном раз в 10 минут, выгребающую из базы все сообщения старше 10 минут с меткой "непрочитано" и отправляющую письмо "У вас есть непрочитанные сообщения". Причём после отправки надо где-нибудь поставить метку, что пользователю такому-то тогда-то было отправлено уведомление, и не отправлять новых до тех пор, пока пользователь не прочитает хоть одно сообщение.
    Ответ написан
  • Как получить практический опыт в управлении проектами?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Чтобы начать чем-то управлять, придётся сначала побыть управляемым. Устраиваешься в проект программистом/админом/консультантом, проходишь через жизненный цикл проекта наблюдая как что работает и какие проблемы возникают. На следующем проекте (или этом же, если он "вечный") начинаешь себя проявлять: показываешь умение и готовность решать вопросы, находить решения, разговаривать с людьми - коллегами, руководством, заказчиками, умение убеждать и вдохновлять, умение предугадывать желания заказчика и будущие проблемы и т.д. и т.п. Естественным образом рано или поздно начнёшь "тащить" проекты, а после этого менеджером назначат даже если сопротивляться будешь.

    Ответ на похожий вопрос.
    Ответ написан
    Комментировать
  • Правильно ли так работать с git и phpStorm?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    1. Вести разработку вне системы контроля версий - зло;
    2. Править прод - зло;
    3. Не уметь писать тесты с моками - горе.
    Ответ написан
    Комментировать
  • Как переопределить if в python?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Прежде всего хочу заметить, что настолько больших возможностей по расширению языка, как в Lisp'ах, никакой другой язык не предоставляет. Но в некоторых языках, в том числе в Python, можно немного поколдовать с кодом на этапе его разбора.

    dumb_translator.py
    import ast
    import sys
    
    class DumbLisp(ast.NodeTransformer):
        def fix(self, source, result):
            ast.copy_location(result, source)
            ast.fix_missing_locations(result)
            return result
    
        def visit_Expr(self, node):
            if isinstance(node.value, ast.Tuple):
                t = node.value
                if isinstance(t.elts[0], ast.Name):
                    if t.elts[0].id == 'newif':
                        _else = [ast.Expr(value=t.elts[3])] if len(t.elts) == 4 else []
                        _if = ast.If(test=t.elts[1],
                                    body=[ast.Expr(value=t.elts[2])],
                                    orelse=_else)
                        self.generic_visit(_if)
                        return self.fix(node, _if)
                    elif t.elts[0].id == 'define':
                        assign = ast.Assign(targets=[ast.Name(id=t.elts[1].id, ctx=ast.Store())],
                                            value=t.elts[2])
                        return self.fix(node, assign)
                    else:
                        call = ast.Expr(value=ast.Call(func=t.elts[0], args=t.elts[1:], keywords=[]))
                        return self.fix(node, call)
            return node
    
    
    with open(sys.argv[1]) as fh:
        tree = ast.parse(fh.read())
        DumbLisp().visit(tree)
        code = compile(tree, filename=sys.argv[1], mode="exec")
        exec(code)

    test.dl
    (define, a, 1)
    
    (newif, a == 1, (print, 'Yes'), (print, 'No'))

    Запускаем
    python dumb_translator.py test.dl

    Естественно, пример предельно простой, а потому в качестве s-форм приходится использовать кортежи. Но есть полноценный фронтенд компилятора Python, транслирующий в python-байткод диалект Lisp близкий к Clojure - Hy.
    Ответ написан
    1 комментарий
  • Какие технологии лучше изучать в java ee?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Хотя бы в общих чертах надо знать все стандарты входящие в Java EE.
    Ответ написан
    Комментировать
  • Обязательно ли разбираться с администрированием серверов?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Например Heroku полностью изолирует программиста от платформы. Но делает это не за адекватные деньги.
    Ответ написан
    Комментировать
  • Как работают и для чего нужны обобщенные связи в Django?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    Есть у вас, предположим, модель новости и её можно комментировать, для чего используется модель комментария. А через месяц эксплуатации сайта заказчик захотел ещё и статьи, и чтобы их тоже можно было комментировать. А потом ещё события всякие - театральные премьеры, киносеансы, концерты. И обзоры ресторанов маячат впереди. Вот только ForeignKey может указывать только на конкретную модель. Придётся либо все модели наследовать от общего корня, либо по новой писать модель комментариев и весь сопроводительный код для каждой комментируемой модели. И то, и другое - решение плохое. Выход - обобщённые отношения, позволяющие одну модель комментариев использовать для неопределённо большого круга заранее неизвестных моделей.
    Ответ написан
    4 комментария
  • Хорошая ли идея учиться на специалиста по ИБ?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Нормальных знаний по программированию ВУЗы тоже не дают.
    Ответ написан
    Комментировать
  • Как составить образовательную программу на лето?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Я крайне рекомендую любому студенту искать на лето стажировку. Во-первых, это даст намного больше знаний и умений, чем вы сможете приобрести самостоятельно или в универе. Во-вторых, это даст стаж, который очень пригодится при трудоустройстве после получения диплома.
    Ответ написан
    2 комментария
  • Как сделать закрытие консоли если будет нажатие на кнопку?

    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 комментария
  • Можно ли создать искусственный интеллект на java?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    На сегодняшний день человечество не умеет создавать ИИ. Ни на каком из языков.

    Для задачи подбора музыки Java вполне подойдёт. Посмотрите на связку из Apache Mahout и Apache Spark. Ещё могут пригодится Neuroph и Java-ML.
    Ответ написан
    2 комментария
  • VIM & Python в 2018?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Перечисленное вами Vim обеспечить может,
    но...
    Emacs лучше.
    Ответ написан
  • Как загружать файлы с именами в UTF-8 в Django Admin?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    Такого не должно возникать и лучше всё-таки выяснить первопричину, но возможен и костыль:

    from os.path import splitext
    from transliterate import slugify
    
    def slugify_upload(instance, filename):
        name, ext = splitext(filename)
        return slugify(name) + ext
    
    
    class Dancer(models.Model):
        photo = models.ImageFiled(upload_to=slugify_upload, ...)
        ...

    Библиотека.
    Ответ написан
    4 комментария
  • Реализация redis pub/sub в tornado?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Tornado
    Седой и строгий
    Библиотеки brukva и toredis уже не обновлялись по нескольку лет. Зато Tornado в последнем обновлении окончательно перешёл на использование очереди событий asyncio, что даёт возможность использовать свежие и хорошие библиотеки. Например aioredis:
    import asyncio
    import aioredis
    from tornado import web, websocket
    from tornado.ioloop import IOLoop
    
    connections = []
    
    class WSHandler(websocket.WebSocketHandler):
        def open(self):
            connections.append(self)
    
        def on_message(self, message):
            ...
    
        def on_close(self):
            connections.remove(self)
    
    
    class GetHandler(web.RequestHandler):
        def get(self):
            self.render("chat.html")
    
    
    async def consumer(channel):
        while await channel.wait_message():
            msg = await channel.get(encoding='utf-8')
            for connection in connections:
                await connection.write_message(msg)
    
    
    async def setup():
        connection = await aioredis.create_redis('redis://localhost')
        channel = await connection.subscribe('notifications')
        asyncio.ensure_future(consumer(channel))
    
    
    application = web.Application([
        (r'/', GetHandler),
        (r'/chat/', WSHandler),
    ])    
    
    
    if __name__ == '__main__':
        application.listen(8000)
        loop = IOLoop.current()
        loop.add_callback(setup)
        loop.start()

    Естественно, это максимально упрощённый пример, в реальном коде соединения не стоит держать в глобальной переменной, а при завершении работы сервера стоит отписаться от канала и закрыть соединение с redis.
    Ответ написан
    Комментировать
  • Как импортировать модуль, храня его имя в переменной?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    for module in sys.argv[1:]
        __import__(module)
    Ответ написан
    Комментировать
  • $0.005 per Elastic IP address not attached to a running instance per hour (prorated)?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Да.

    To ensure efficient use of Elastic IP addresses, we impose a small hourly charge if an Elastic IP address is not associated with a running instance, or if it is associated with a stopped instance or an unattached network interface. While your instance is running, you are not charged for one Elastic IP address associated with the instance, but you are charged for any additional Elastic IP addresses associated with the instance.
    Ответ написан
    Комментировать