• Как установить что-то под рутом Docker в образе Jupiter NoteBook?

    karabanov
    @karabanov Куратор тега Docker
    Системный администратор
    GRANT_SUDO=yes говорит о том, что внутри контейнера ты можешь использовать sudo.

    Зайти в контейнер под привелигерованным пользователем можно так:
    docker exec -u root -it <имя_контейнера> bash
    Но это дыра в безопасности.
    Ответ написан
    Комментировать
  • Двоичное дерево - зачем оно нужно и как оно получается?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Для начала поймите, как реализованы связные списки. Вот двоичное дерево - это почти тоже самое, только у каждого элемента 2 ссылки а не одна. Просто способ организации данных, который обладает какими-то полезными свойствами.

    Все внутри реализовано на указателях, массивах и структурах (тупо группа различных переменных, объедененных в один тип).

    Словарь в питоне, он же ассоциативный массив, действительно, реализован на основе хеш таблицы. Реализован внутри интерпретатора Питон. Это другая структура данных, сделанная на основе массивов и списков (которые реализованы на указателях).

    Но ассоциативный массив можно реализовывать и двоичными деревьями поиска. Например структура set в языке C++ - реализована деревом. Такой ассоциативный массив работает ассимптотически медленнее (логарифм операций вместо константы для поиска/вставки/удаления). Но обладает важным свойством - элементы там упорядочены. Можно найти минимальный ключ, обойти все ключи в порядке возрастания, подсчитать что-то на отрезке ключей. Плюс не нужно придумывать хороший хеш. В хеш-таблицах, если хеш плохой - можно получить O(n) операции. Или может не повести и будет куча коллизий даже для хорошего хеша. В двоичных деревьях поиска (большинстве) гарантирован худший случай за логарифм. В некоторых задачах лучше использовать именно эту структуру, чем хеш-таблицу.

    Плюс есть всякие другие структуры данных на основе деревьев: дерево отрезков, двоичная куча, бор.
    Ответ написан
    Комментировать
  • Как мне правильно построить структуру данных для игры?

    @acwartz
    Тут должна быть ваша реклама.
    У вас проблема не с SQLite а целиком со знаниями баз данных и SQL в частности.

    Можно все поместить в одну таблицу(сообщения, достижения, перки, бонусы и многое другое), тогда столбцов у меня выходит порядка 25-27

    Нельзя так, это все разные сущности, которые вы захотите расширять новыми полями и что более важно - связывать их с новыми сущностями, например дать игрокам возможность групповых чатов, или например вложения в сообщения лепить или ещё бог весть что, и не сможете этого сделать после выхода вашего ПО в свет. Придется писать очень замудреные скрипты по миграции данных в т.ч. тех которые и не менялись даже.

    Пользователи это таблица Users где есть поле ID котрое получает значение при вставке записи и это значение не меняется.
    Есть сообщения это таблица Messages.
    где есть Autokey получающее значение при вставке записи, есть поле-индекс DateCreate с датой и временем создания сообщения, есть поле Message - текст сообщения, так же поля От кого (ссылка на Users.ID) и кому (Users.ID)

    Есть ачивки, таблица Achivements:
    Поле UserID (Users.ID) связь с тем кто ачивку получил
    Поле даты и времени получения,
    поле идентификатора ачивки
    поле описания ачивки
    поле с картинкой ачивки

    Бонусы, таблица Bunuses:
    Поле UserID (Users.ID) связь с тем кто бонус получил
    Поле даты и времени получения,
    поле идентификатора бонуса
    поле описания бонуса
    поле с картинкой бонуса
    поле обозначающее позитивный или негативный бонус
    поле даты и времени завершения действия бонуса, если NULL то бонус вечный

    Таблица с перками - Perks:
    Поле UserID (Users.ID) связь с тем кто бонус получил
    Поле даты и времени получения,
    поле идентификатора перка (PerkID)

    это все легко расширяется новыми полями и если надо обрастает новыми связями с новыми изменениями.
    А если вы все в кучу кидаете, на кой вам вообще база данных?
    загоняйте все в json/xml.
    Ответ написан
    1 комментарий
  • Как исправить ошибку java.io.IOException: Cannot run program "python3": CreateProcess error=2, на Windows 10?

    Vindicar
    @Vindicar
    RTFM!
    error=2 означает что исполняемый файл не найден.
    Причин может быть несколько.
    Я подозреваю, что ява пытается запустить питон просто командой 'python3', без абсолютного пути. Тогда нужно, чтобы директория с бинарником питона была добавлена в %PATH%. Если точно прописана, то можно попробовать Монитор Ресурсов (в виндовс вроде из коробки есть), чтобы посмотреть, какие именно файлы пытается открыть java.
    Ответ написан
    1 комментарий
  • Как после авторизации перенаправлять обратно на страницу, с которой ушёл?

    @alekssamos
    Программист любитель
    Так обычно же передаётся GET параметр next? Подробней здесь
    UPD: А, ещё про referer подумал, тоже может пригодится.
    back_url = request.get["next"] or request.META["HTTP_REFERER"] or request.path
                    # ещё можешь добавить reverse("index")
    
    return redirect(back_url)
    Ответ написан
    Комментировать
  • Как после авторизации перенаправлять обратно на страницу, с которой ушёл?

    @FlooJack

    Почитай тут ОБЯЗАТЕЛЬНО, рекомендую на всякий случай.

    А так самый простой пример: return redirect("https://www.djangoproject.com")

    И так же просмотрите как чел сделал:
    Как реализовать авторизацию на Django?


    Пример из док:
    from django.http import HttpResponse
    from django.template import loader
    
    def my_view(request):
        # View code here...
        t = loader.get_template('myapp/index.html')
        c = {'foo': 'bar'}
        return HttpResponse(t.render(c, request), content_type='application/xhtml+xml')
    Ответ написан
    Комментировать
  • Простой и эффективный способ подсчета просмотров страницы на django?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    Я бы сделал так:

    models.py
    class PageHit(models.Model):
        url = models.CharField(unique=True)
        count = models.PositiveIntegerField(default=0)

    decorators.py
    from functools import wraps
    from django.db.models import F
    from django.db import transaction
    
    def counted(f):
        @wraps(f)
        def decorator(request, *args, **kwargs):
            with transaction.atomic():
                counter, created = PageHit.objects.get_or_create(url=request.path)
                counter.count = F('count') + 1
                counter.save()
            return f(request, *args, **kwargs)
        return decorator

    views.py
    from .decorators import counted
    
    @counted
    def some_view(request):
        ...

    Репозиторий демонстрационного проекта.

    Или можно написать middleware, который будет делать то же самое для всех запросов.
    Ответ написан
  • Классы в Python?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    class Engine:
      version = "v1.0.0"
    
      def pi(self, arg):
          if arg == "-v":
              ...
    
    t_script = Engine()
    t_script.pi("-v")
    Ответ написан
    Комментировать
  • В чём отличие @Decorator от @Decorator()?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Декоратор - это функция, которой на вход подаётся функция и вернуть он должен тоже функцию. Например:
    @decorator 
    def foo():
     ..

    Эквивалентно foo = decorator(foo)

    Теперь про случай из вопроса. В качестве декоратора вместо обычной функции вы используете класс (точнее его объект):
    @FuncDec()
    def foo():
        print('Hello')

    Эквивалентно foo = FuncDec()(foo), а именно:
    • создаётся объект FuncDec (вызывается конструктор __init__)
    • этот объект вызывается (__call__) вместе с параметром foo
    • объект вернул функцию wrapper, которая и будет в дальнейшем выполняться вместо объявленной foo
    • профит

    Но если убрать скобки, то получится эквивалент foo = FuncDec(foo)
    То есть просто вызов конструктора, который у вас не принимает параметров - поэтому и ругается.
    Ответ написан
    Комментировать