Задать вопрос
  • Как реализовать зачет урока в реляционной базе данных?

    Все уровни выше users_on_lessons называются денормализацией - хранить эти данные необязательно, их можно вычислить из других по цепочке связей.
    "Правильно" в данном случае не существует, вы выбираете на каждом конкретном проекте между скоростью и консистентностью. Храните денормализованные данные? Тогда придётся обеспечивать их связность, чтобы не оказалось, что в users_on_lessons пользователь привязан к одному топику, а в users_on_topics к другому. Храните только "жёсткие" данные? Тогда будьте готовы считать нужное.

    Я в данном случае не вижу необходимости в денормализации в том виде, в котором вы её реализовали. Курсов относительно немного (а пользователь всегда работает только с одним из них в момент времени), в каждом курсе относительно немного глав, в главе немного топиков, в топике немного уроков. Посчитать по уроку где там пользователь в этом дереве совсем не сложно прямо на клиенте, а ведь ещё у нас есть возможность кешировать данные.
    Ответ написан
    2 комментария
  • Как спарсить текущую погоду в зависимости от месторасположения юзера?

    1. Зачем парсить, если существует куча сервисов с API?
    2. По geoip или как-нибудь ещё узнаешь локацию пользователя, и сопоставляешь со страницами на сайте.
    Например если пользователь в Алматы, то парсишь https://www.gismeteo.kz/weather-almaty-5205/
    А если в Астане, то парсишь https://www.gismeteo.kz/weather-astana-5164/
    Ответ написан
    Комментировать
  • Как сделать так, чтобы данные, которые я пишу в тг бота, заполняли сперва первую строчку в таблице postgre?

    Vindicar
    @Vindicar
    RTFM!
    Почитай хотя бы про основы реляционных БД.
    У каждой таблицы должен быть первичный ключ - иными словами, такое поле/комбинация полей, которая будет уникальной для каждой записи.
    Тогда алгоритм будет такой: спрашиваешь пользователя, какую запись он хочет редактировать, запоминаешь её ключ, затем переходишь в режим редактирования, где поочерёдно спрашиваешь значения столбцов.
    Подразумевается, что ты знаешь, как сделать сценарий, чтобы бот последовательные сообщения обрабатывал по-разному. Если не знаешь - читай, как реализуется finite state machine (FSM) в выбранной тобой библиотеке.
    Ну и да:
    data = message.text.strip()
    cur.execute(f"INSERT INTO {tableName} ({column_name}) VALUES ('{data}')")

    Это - готовая SQL инъекция. И если вставку tableName и column_name еще можно оправдать (хотя ты их тоже не проверяешь на допустимость), то данные так вставлять нельзя. Есть правильный способ.
    Ответ написан
    Комментировать
  • Существует ли дистрибутив линукс готовый к работе в домене из коробки?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Примерно любой дистрибутив, в котором можно сделать условный apt/yum/etc install realmd sssd.
    Ответ написан
    7 комментариев
  • Что за ошибки в Ubuntu?

    @AlexVWill
    Ничем не опасно, эта фигня у многих появляется, у меня в том числе. Забей или через редактирование конфига Grub просто скрой вывод ошибок при загрузке, они всеравно в логе тоже видны.
    Ответ написан
    Комментировать
  • AttributeError: 'NoneType' object has no attribute 'get_text'. Как решить?

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

    Использовал для этого телеграмм-бота от одного сервиса.

    Вообще это уже сильно пахнет скамом, так что я бы уже тут задумался.

    телефон и ноут рабочие, по левым сайтам с них не ползаю и лишнего не устанавливаю, так что вирус вряд ли мог подхватить;

    Сильное заявление, которое невозможно проверить.

    симка для аккаунта телеграмма куплена с рук (уже была верифицирована);

    Очень опасное занятие. Если симка для аккаунта создана в рамках корпоративного тарифа - "организация" имеет очень много контроля над ней. (Не буду утверждать, что доступно даже чтение смс, тк не знаком с возможностями)

    с использованием программы AmneziaVPN

    Вообще пахнет паранойей, но лучше её из исходников собирать. Не думаю, что тут она виновата.

    Вообще я ставлю на следующие варианты:
    1. Кто-то просто взял в руки твой телефон (или куда там у тебя ещё телеграм установлен)
    2. Владелец симки смог увидеть твои входящие смс и при этом знал заранее твой пароль от телеграма, либо смог его подобрать, либо смог сменить пароль, имея доступ к твоей резервной почте.
    3. Кто-то смог получить удалённый доступ к устройству, где установлен твой телеграм и ты залогинен.

    Проверь историю входов в аккаунт и активные сессии. Проверь, что ты знаешь обо всех активных сессиях и никто посторонний не имеет доступа к ним (это не какой-нибудь публично доступный компьютер, например)
    Ответ написан
    3 комментария
  • Где ошибка в строке запроса к PosgreSQL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В запросе, использующем более одной таблицы, все имена полей должны указываться как минимум с алиасом таблицы.

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

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Если надо с чатиком, то нужна какая-то серверная часть. Серверную часть можно написать и на python, например, используя фреймворк django, но php или java какие-нибудь могут быть популярнее. Плюс какие-то базы данных там наверняка понадобятся, так что надо знать SQL. Клиентскую часть надо писать на разных языках в зависимости от платформы.
    Если это веб-приложение, то нужны javascript, typescript или scala. Плюс надо использовать один из сотни фреймворков, иначе задолбаетесь все с нуля писать. Ну и html c CSS надо знать, для оформления страницы.
    Если это приложение для смартфонов, то java или C++ + немножко java на андроиде, objective-c или swift на айфонах.
    Если это для винды приложение, то можно С++, java или python.
    Ответ написан
    Комментировать
  • Как отчистить глобальное окружение python?

    phaggi
    @phaggi
    лужу, паяю, ЭВМы починяю
    Разобраться, как работают виртуальные окружения. Создавать их для каждого проекта, активировать и из них производить установку библиотек посредством pip для данного проекта.

    Что касается «глобального интерпретатора», то это тот, папка которого указана первой в системном path.
    Ответ написан
    Комментировать
  • Как отчистить глобальное окружение python?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    В свойствах проекта для каждого проекта устанавливается интерпретатор. Если пакеты вы ставите из пичарма, то они будут ставиться в окружение выбранного интерпретатора. Создайте виртуальное окружение (можно прямо из окна настроек пичарма) и ставьте пакеты в него.
    Ответ написан
    Комментировать
  • Как показать работодателю реализованные проекты?

    php666
    @php666
    PHP-макака
    нужно приложить портфолио из реализованных проектов
    не надо в такие места идти просто. это изначально неадекватное требование для программиста, который как правило работает в команде и даже если репозиторий будет публичный, весь код представляет собой смесь работы разных людей. никто не будет вытаскивать из репы твои коммиты и смотреть, что ты там делал.

    скорее всего hr-ы тупо скопипастили текст вакансии, но от этого не легче, это первый звоночек, что компания "рога и копыта" и какие hr, такой и остальной персонал
    Ответ написан
    Комментировать
  • Как будет выглядеть этот Go код на Python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    import socket
    import ssl
    
    def test_connection(address):
        certs_return = ""
        context = ssl.create_default_context()
        context.check_hostname = False
        context.verify_mode = ssl.CERT_NONE
    
        try:
            with socket.create_connection((address, 443), timeout=10) as sock:
                with context.wrap_socket(sock, server_hostname=address) as ssock:
                    cert = ssock.getpeercert()
                    for (issuer, entry) in cert['issuer']:
                        certs_return += "{}={}\n".format(issuer, entry)
        except Exception as e:
            certs_return = "0"
    
        return certs_return
    Ответ написан
    2 комментария
  • Как в Python, используя logging, записать в traceback пойманного исключения значения локальных переменных функции?

    Vindicar
    @Vindicar
    RTFM!
    Попробуй создать свой LoggerAdapter или Filter. Вообще в доках есть секция на эту тему, почитай, может, найдешь что полезное.
    По сути, схема работы logging такая:
    • Logger предоставляет интерфейс генерации логов приложению, и создаёт объект-запись.
    • LoggerAdapter вызывается логгером, чтобы дополнить запись специфичной для программы контекстной информацией.
    • Filter определяет, какие записи реально выводить в лог, и может их менять
    • Formatter делает из записи строку.
    • Handler записывает записи по назначению.


    Либо, если тебя устраивает вариант делать это вручную, ты можешь передать в параметр exc_info методов логгера кортеж вида (класс исключения, объект исключения, трейсбэк). Тогда ты можешь подставить свой трейсбэк вместо "родного".
    Ответ написан
    Комментировать
  • Как вывести данные из двух таблиц?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ошибка детская, она вот в этом: "Есть 2 таблицы, в которых одинаковые поля".
    Очень часто новички, которые не понимают, как работает база данных, делают подобное.
    И всегда потом приходится переделывать, даже если очень не хочется.
    Потому что в БД не должно быть таблиц с одинаковыми полями. Собственно, сообразительные новички уже на этом вопросе, "как выбрать из двух таблиц" начинают понимать, что у них что-то пошло не так.

    Так что надо просто сделать одну таблицу, записать в неё данные из всех таблиц с одинаковыми полями, и выбирать из неё обычным способом.

    Имя таблицы, кстати, тоже очень странное. Наверняка там внутри тоже треш и угар и вот её-то как раз и надо разделить, только не горизонтально, а вертикально. Судя по составу полей, нужна одна таблица city и одна таблица people, в которой указывается только city id
    Ответ написан
    2 комментария
  • Как исправить ошибку 'NoneType' object has no attribute 'find_all'?

    nki
    @nki
    bezkart.ru готовая система лояльности
    Это значит, что переменная block пустая. Т.е. ваш soup.find ничего не нашел.
    Ответ написан
    Комментировать
  • Почему в данных таблицы все не по порядку?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    SQL не гарантирует какого-либо определённого порядка строк в выборке за исключением явно заданного через SORT BY.
    Ответ написан
    Комментировать
  • Что можно смотреть/слушать во время учёбы?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    сложно себя заставить начать или читать продолжительное время

    Воля развивается только тренировкой.

    Была хорошая рекомендация включать хорошо знакомый сериал в новом окне/на втором мониторе параллельно с обучением.

    Это плохая рекомендация. Вы снизите концентрацию и либо станет ещё сложнее изучать, либо сформируется иллюзия компетентности.
    Ответ написан
    Комментировать
  • Как определить есть ли противоречия в цепочке логических выражений?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Алгоритм называется "обход в глубину на графе". Работает за линию, все очень быстро. Правда, его придется применить несколько раз.

    Все неравенства "==" замените на пару "<=" и ">=".
    Добавьте неравенства 1 < 2, 3 < 4 и т.д. для каждой пары соседних на числовой прямой чисел во входных данных

    Постройте граф: Каждой переменной и уникальному числу во входных данных сопоставьте одну вершину. Проведите для каждого неравнества ребро от меньшей вершины к большей, раскрашенное в 2 цвета: черный, если неравнество нестрогое (<=), белый - иначе.

    Теперь, если в этом графе нет циклов, содержащих белые ребра (строгие неравенства) - то противоречий нет: Все циклы целиком из черных ребер означают, что все вершины имеют одинаковое значение. Можно эти вершины все объединить в одну новую. Раз белые ребра (<) циклов не образуют, то получившийся граф будет ациклическим и можно назначить всем вершинам какие-то числовые значения, удовлетворяющие условиям. Проблема может еще быть, что нет целых решений вроде 1== a < b < c == 2, но это можно потом проверить в топологической сортировке жадно назначая всем вершинам числа. Или противоречия вида 2==3. Тоже решается после получения компонент связности.

    Итак, алгоритм: найдите в этом графе компоненты сильной связности. Потом проверьте все ребра. Если белое ребро (строгое неравнество) имеет оба конца в одной и той же компоненте - вы нашли противоречие.

    Теперь надо постараться назначить кадой компоненте числовое значение так, чтобы не было противоречий. Это можно делать жадно, назначая каждой компоненте минимально возможное значение.

    Пройдитесь по компонентам в топологическом порядке (они в таком виде уже будут получены алгоритмом выше). Если в компоненте есть вершина-число, то назначаете всей компоненте это значение. Если есть несколько вершин-чисел - то это противоречие. Также посмотрите все обратные ребра из всех вершин в компоненте. Если они ведут в другую компоненту, то обновите минимально возможное значение в данной компоненте как равное, или на 1 большее уже известного значения для второй компоненты (в зависимости от цвета ребра, т.е. строгости неравнества). Если получили, что это минимально возможное значение больше уже фиксированного за счет вершины-числа - то вы нашли противоречие.

    В конце вы получите для каждой компоненты ее численное значение без каких-либо противоречий.
    Ответ написан
    4 комментария
  • Правильно ли я понял суть транзакций в веб приложениях?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Все, абсолютно все люди путают транзакции с блокировками. Это какая-то массовая галлюцинация.
    Хотя там все просто, как 2х2
    Транзакции используются для консистентности. Чтобы когда выполняется больше одного запроса, изменяющего данные, то были выполнены либо все, либо ни одного.
    А чтобы не было race condition используются блокировки.

    Делаете SELECT FOR UPDATE, который блокирует строку, чтобы больше никто из нее не мог читать. Любой процесс, который захочет прочесть это же значение, будет стоять и ждать.
    Дальше вы делаете свои проверки, и потом сам апдейт, который отпустит блокировку.
    Процесс, который ждал своей очереди, получит уже измененное значение, и проверка не пройдет.
    Ответ написан
    Комментировать