• Как отслеживать новые посты в группах и профилях соц. сетей?

    @wawa
    Кури офиц. апи соц. сетей и кодь. Ваш кэп :)
    Конкретно по ВК есть мощное апи (!есть лимиты).
    По остальным к апи сложнее получить доступ (если возможно), так что проще парсинг делать. При этом соблюдать лимиты (хз какие), чтобы аккаунт не забанили (актуально для FB, и инсты когда профиль скрыт от незалогиненных юзеров)
    Ответ написан
    Комментировать
  • Как развить абстрактное мышление?

    @wawa
    Кострикин. Введение в алгебру. Часть 1.
    Мне помогает.
    Ответ написан
    5 комментариев
  • Почему python получает 503 при обращении к серверу на Virtualbox?

    @wawa Автор вопроса
    Просто порт на убунте был чем-то занят. И почему-то это что-то отвечало вперед uwsgi при запросе из пайтон. В то время как запросы из других клиентов попадали на uwsgi.
    Сменил порт и локалхост на 192.168.*.* и всё ок.
    Ответ написан
    Комментировать
  • Отключить кеширование всех файлов Django?

    @wawa
    Такая же проблема. Пока сам через браузер не пройдешь по url к стилям - они не обновятся и вместо этого сервер отдает 304.
    Статику отдает Nginx, настройки по дефолту. Как обычно поступают с такой проблемой? Не хочется использовать ManifestStaticFilesStorage, ибо это больше похоже на "я не знаю как настроить хедеры nginx для правильного кеширования, поэтому забью-ка я браузер пользователя устаревшим мусором".
    Ответ написан
    Комментировать
  • Как ускорить SELECT с высокой вариативностью высокоселективных WHERE и сортировкой?

    @wawa Автор вопроса
    Всем спасибо. Мне уже помогли.
    Проблема в том, что дефолтное default_statistics_target=100 маловат для гистограмм по моей таблице с 4 млн строк. Поставил на 1000, пересчитал стату, и теперь pg строит планы разумнее.
    Ответ написан
    Комментировать
  • Как ускорить пагинацию в Django?

    @wawa Автор вопроса
    Имела место ошибка.
    Изначально в целях оптимизаций я решил ограничить максимальный offset, ибо юзеру не нужно глубоко листать и куда разумнее поиграть с фильтром поиска. По-моему нередкий приём (хабр например).
    Так как джанго пагинатор не имеет возможность ограничить offset, сделано следующее:
    qs = MyModel.objects.filter(...)
    objects = qs[:MAX_PAGE * PER_PAGE]  #2
    paginator = Paginator(objects, PER_PAGE)
    page = paginator.page(...)

    Да, такой подход всегда дёргает из БД больше записей чем нужно, но (MAX_PAGE * PER_PAGE) - не большой (~500) и оверхед незаметен. Хотя может позже и напишу свой пагинатор.
    Как ожидалось в строке 2 происходит запрос к БД и возвращает список объектов, который ниже передаётся пагинатору. Далее пагинатору нужно знать сколько вообще есть объектов, и он сначала, рассчитывая на QuerySet, пробует вызвать .count() и в случае неудачи вызывает .__len__(). Я полагался на второй случай и ошибся.
    Оказывается в строке 2 возвращается не список, а всё еще QuerySet. Нет, я в курсе, что он ленивый, но на слайсинге "ленивость" не применима. Верно?
    Так или иначе, то что получено в строке, 2 имеет метод count(), и в пагинаторе он благополучно вызывается и инициирует запрос к БД. При этом запрос какой-то чудовищный (GROUP BY зачем-то юзается).
    Именно это и тормозило работу. А решение таково:
    qs = MyModel.objects.filter(...)
    objects = list(qs[:MAX_PAGE * PER_PAGE])  #2 !!!
    paginator = Paginator(objects, PER_PAGE)
    page = paginator.page(...)

    Неравнодушным как всегда спасибо!
    Ответ написан
    Комментировать
  • Почему и как Django влияет на time.localtime?

    @wawa Автор вопроса
    Да, джанго влияет на time.localtime(), посредством os.environ['TZ'] и time.tzset() если установлен USE_TZ=True. И в отличие от моего предположения, что настройки джанги влияют только на саму джангу (django.utils.timezone.local()), оказалось, что в итоге ВСЕ aware datetime.datetime созданные в таком окружении будут использовать TIMEZONE, подсунутый джангой. Ох уж эти глобальные переменные.
    Ответ написан
    Комментировать
  • Зачем max_length в URLField, ведь стандарта нет?

    @wawa Автор вопроса
    from django.core.validators import URLValidator

    field = models.TextField(validators=[URLValidator()])
    Ответ написан
    Комментировать
  • Почему в с++ не могут избавиться от переполнения буфера?

    @wawa
    Почему в с++ не могут избавиться от переполнения буфера?

    А кто не может? Познакомьте их с теми, кто может.
    Ответ написан
    Комментировать
  • Почему runserver не работает через django-admin, хотя работает через manage.py?

    @wawa Автор вопроса
    В общем так.
    При помощи django-admin.exe и python -m django завести runserver не удалось.
    По-моему это windows специфик проблема, но все-таки я запустил проект без manage.py.
    Если посмотреть на доки версий >=1.8, то там используется django-admin (т.е. бинарник). Однако в более старых версиях использовался обычный django-admin.py, который сохранился и в версии 1.11. Вот через него всё работает:
    path\to\venv\Scripts\activate.bat
    python path\to\venv\Scripts\django-admin.py runserver --pythonpath=path\to\project_dir --settings=config.settings.dev
    Ответ написан
    Комментировать
  • Альтернатива Visual Studio?

    @wawa
    мои 5 копеек:
    CodeLite, VSCode
    Ответ написан
    Комментировать
  • Столкнулся со странным объявлением структуры - где о таком прочитать?

    @wawa
    1) Это не C, а С++ (смотрю на тег вопроса)
    2) Число полей структуры не может быть переменным. Здесь их три: NumSrtucts, Size, Offsets.
    3) Offsets это указатель, которому в конструкторе присваивается выделенная в куче память. И размер это памяти варьируется динамически на момент вызова конструктора, но хранится эта память вне структуры, а как было сказано в куче (динамической памяти) и структура лишь хранит адрес этого участка кучи в Offsets.
    Ответ написан
    Комментировать
  • Правильно ли сразу начинать изучение C++?

    @wawa
    НЕ В КОЕМ СЛУЧАЕ!!!
    Начни с Python (очень хорош и практичен, вправит мозги), потом Haskell (очень хорош, не самый практичный, но ВПРАВИТ мозги). А уже потом, если опускайся в низкоуровневые дебри C/C++.
    Ответ написан
    Комментировать