• Что делать при ошибке CSRF token missing?

    Hivemaster
    @Hivemaster
    Админ, который хочет программировать
    Читать документацию, конечно. Там это описано.
    Ответ написан
    3 комментария
  • Что из себя представляет должность администратора баз данных?

    Melkij
    @Melkij
    PostgreSQL DBA
    являясь собственно DBA последние сколько-то там лет...

    Основная рутина:
    - внесение изменений схемы данных без даунтайма собственно приложения
    - выполнение каких-то массивных операций над данными (удалить половину данных из полутеррабайтной таблички, например)
    - исследование проблем производительности со стороны базы
    - решение в целом проблем на серверах баз, не только производительности
    - текущее сопровождение: бекапы, репликация, переезды с одних серверов на другие, настройка новых серверов, минорные обновления базы
    - major обновления базы
    - заведение пользователей и организация прав доступа
    - консультации разработчикам "как лучше сделать"
    - консультации "так это работать не будет, придётся менять"
    Ответ написан
    Комментировать
  • Как посмотреть тело функции в python?

    drygdryg
    @drygdryg
    Python-разработчик
    Поскольку самая популярная и эталонная реализация Python: CPython имеет открытый исходный код, вы можете найти исходники встроенных функций в репозитории с исходными кодами CPython: https://github.com/python/cpython.
    Некоторые встроенные функции написаны не на Python, а на том языке, на котором написан сам интерпретатор Python: на Си, поэтому, скорее всего, там вы не найдёте легкочитаемый исходный код функций sum, min, max и др.
    Но в случае, когда функция или любой другой объект написан на Python, посмотреть его исходный код можно с помощью inspect.getsource:
    >>> import inspect
    >>> import requests
    >>> print(inspect.getsource(requests.get))
    def get(url, params=None, **kwargs):
        r"""Sends a GET request.
    
        :param url: URL for the new :class:`Request` object.
        :param params: (optional) Dictionary, list of tuples or bytes to send
            in the query string for the :class:`Request`.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        :return: :class:`Response <Response>` object
        :rtype: requests.Response
        """
    
        return request("get", url, params=params, **kwargs)

    Получить исходный код встроенной функции или метода, реализованного на Си внутри CPython, таким способом не получится:
    Попытка получить исходный код функции sum

    >>> import inspect
    >>> print(inspect.getsource(sum))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/lib/python3.10/inspect.py", line 1139, in getsource
        lines, lnum = getsourcelines(object)
      File "/usr/lib/python3.10/inspect.py", line 1121, in getsourcelines
        lines, lnum = findsource(object)
      File "/usr/lib/python3.10/inspect.py", line 940, in findsource
        file = getsourcefile(object)
      File "/usr/lib/python3.10/inspect.py", line 817, in getsourcefile
        filename = getfile(object)
      File "/usr/lib/python3.10/inspect.py", line 797, in getfile
        raise TypeError('module, class, method, function, traceback, frame, or '
    TypeError: module, class, method, function, traceback, frame, or code object was expected, got builtin_function_or_method


    Также можно использовать IPython для получения того же результата более коротким путём:
    In [1]: import requests
    
    In [2]: %psource requests.get
    def get(url, params=None, **kwargs):
        r"""Sends a GET request.
    
        :param url: URL for the new :class:`Request` object.
        :param params: (optional) Dictionary, list of tuples or bytes to send
            in the query string for the :class:`Request`.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        :return: :class:`Response <Response>` object
        :rtype: requests.Response
        """
    
        return request("get", url, params=params, **kwargs)
    Ответ написан
    Комментировать
  • Почему все говорят что писать ботов это сложно?

    Vindicar
    @Vindicar
    RTFM!
    А сложность начинается, как только задачи, стоящие перед ботом, перерастают уровень примера в документации видеотуториале пятилетней давности.

    Нужно сделать несколько под-команд у команды. Напишу цепочку if-elif-else, делов то. Ой, а теперь простыня кода на пять экранов, в которой фиг чего найдёшь. Потому что нет привычки структурировать код.

    Нужно, чтобы несколько команд/событий формировали цепочку (сценарий). Например, пользователь отправил тре сообщения, первое с именем, второе с возрастом, третье с адресом. Ой, а как это сделать вообще? Не зная понятия "конечный автомат" (finite state machine, FSM), очень трудно догадаться, как тут поступить.

    Нужно, чтобы ботом могли пользоваться несколько человек. Ой, их данные перепутались! Потому что бот использует глобальные переменные.

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

    Нужно добавить боту графический интерфейс - админку. Ой, а работает или интерфейс, или сам бот! Потому что нужно представлять, как устроено большинство GUI-фреймворков, и как устроена асинхронное приложение. А заодно понимать многопоточность, вопросы синхронизации действий между двумя потоками, и особенности работы с asyncio в многопоточных приложениях. Потому что одним потоком тут обойтись будет очень непросто.

    Нужно хранить данные в БД. Ой, а почему у меня проблемы при записи в БД имени пользователя? А потому что погромист собирает SQL-запрос через форматирование строк. Надо было почитать доки, чтобы наткнуться на prepared statements, они же parameterized queries.

    Нужно хранить данные в БД. Вот только данные имеют связи многие-ко-многим. Я знаю! Я буду просто добавлять или удалять столбцы в таблицу! Потому что не освоены даже азы проектирования БД. Тут уже nuff said. И да, я такое видел на этом сайте.

    Незнание средств языка и основных приемов построения алгоритмов и структур данных приводит к диким велосипедам, которые создают больше проблем, чем пользы. Особенно если к этому добавляется нежелание находить и читать документацию на фреймворк, на котором построен бот.
    Ответ написан
    1 комментарий
  • Как в python создать interface?

    Vindicar
    @Vindicar
    RTFM!
    typing.Protocol играет роль интерфейса, с той поправкой, что наследоваться от него потом необязательно - главное, чтобы набор полей/методов соответствовал.

    abc.ABC - это именно абстрактный класс, он требует наследование от себя для соответствия, и часто предполагает наличие какой-то частичной реализации функциональности.

    В отличие от него, typing.Protocol обычно применяется только для описания контракта класса, но не для частичной реализации. Так как он не требует наследования, он хорошо подходит для описания структуры объекты, который мы ожидаем на входе - без жётской привязки этого объекта к нашей иерархии классов.

    "Обычно", потому что и то, и то можно использовать "не по назначению".
    Ответ написан
    9 комментариев
  • При вводе команды в консоли отображается ошибка `NoneType` object is not supscriptable, что делать?

    Vindicar
    @Vindicar
    RTFM!
    f"""**{cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]}**"""

    За такое надо калечить.
    Во-первых, это абсолютно нечитаемый кусок кода. Вперемешку вывод пользователю, sql запрос и команды питона.
    Во-вторых, привычка использовать format() для составления SQL запросов приводит к весёлым последствиям, когда требуется подставить строку. Гугл "sql инъекция".
    В-третьих, ты не проверяешь, что вернул тебе fetchone(). С какого перепугу ты решил, что у тебя гарантируется наличие записи с таким id в таблице? Всегда исходи из того, что запрос может потерпеть неудачу, и продумывай, что бот должен делать в таком случае.
    Ответ написан
    Комментировать
  • Парсинг цен с Wildberries на Java?

    reaferon
    @reaferon
    Я бы больше озаботился первым пунктом. Потому как современный парсинг озонов и вб ой как не прост. Очень быстро они даже самые хитрые схемы вычисляют. Во всяком случае Озон. Думаю, с ВБ ситуация схожая.
    Ответ написан
    Комментировать
  • Какие книги изучать по электронике и цифровой электронике?

    @VT100
    Embedded hardware & software.
    Теоретические основы электротехники (минимум - законы Ома, Джоуля-Ленца и правила Кирхгофа). Цепи постоянного и переменного (реактивности, трансформаторы) тока. Операторные(?) расчёты цепей переменного тока.
    Потом можно попробовать с базовыми знаниями прочесть какую-нибудь "мурзилку" (Сворень, Борисов, Айсберг и пр.). Может даже - не осваивать, а именно читать. Осваивать, разве что, начертание и чтение схем.
    Потом - перейти к нормальным букварям и средней школе. Хоровиц и Хилл, Титце и Шенк, Харрисы. Я в универе перечитывал мурзилки (в свете новых знаний). Осваивал - по Хоровицу и Хиллу и справочнику Шило.
    Ответ написан
    Комментировать
  • Какой шрифт оптимально выбрать для сайта?

    olegtix
    @olegtix
    Веб-разработчик
    На вкус и цвет фломастеры...

    Самые популярные шрифты:
    roboto, open sans, montserrat, rubik.

    Вообще не стоит зацикливаться на шрифте, если у вас не супер дизайнерский лендинг/многостраничник.
    Ответ написан
    1 комментарий
  • Зачем именно нужны связи в бд?

    @deliro
    Когда к тебе придёт менеджер и скажет: "эй, hrnsywtfczlh, а почему у нас тут вот заказов отгруженных на 15 миллионов, а получателей даже не в базе?", тогда-то ты и поймёшь, зачем нужны связи в БД. Но сперва поседеешь.
    Ответ написан
    7 комментариев
  • Как публиковать статьи на сайте?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    Статьи какие нибуть по этому поводу.

    Вы не поверите, но документация по ASP net или любой учебник.
    Ответ написан
    Комментировать
  • Можно ли эмулировать нажатие на кнопку на сайте библиотекой Бютифул суп?

    Maksim_64
    @Maksim_64
    Data Analyst
    beatifulsoup это парсер для html и xml документов. И к нажатиям кнопок не имеет никакого отношения от слова совсем.
    Ответ написан
    1 комментарий
  • Не понимаю суть ошибки, можете объяснить?

    Vindicar
    @Vindicar
    RTFM!
    from sqlite import db_start, create_profile, edit_profile
    from main import balance


    main импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который ...
    Ну ты понял.

    Быстрого волшебного решения тут нет. Разбирайся с областями видимости, избавляйся от глобальных переменных.
    Например, почему у тебя при создании нового профиля используется balance? Т.е. новый пользователь получает столько денег, сколько было у последнего активного?
    Почему вообще у тебя вещи, специфичные для одного пользователя, лежат то в глобальных переменных, то в данных машины состояний (state)? Бери их из БД , когда они потребуются.
    Ответ написан
    6 комментариев
  • Как решить ошибку RuntimeWarning: Enable tracemalloc to get the object allocation traceback?

    @igor6130
    Вы запускаете асинхронные функции как синхронные. В ошибке об этом сказано.
    Ответ написан
    3 комментария
  • Трудоустройство без диплома, но с сертификатом об окончании курсов программирования. Можно ли?

    xez
    @xez
    TL Junior Roo
    Всем плевать на корочки, а тем более на какой-то там сертификат.
    Важны только ваши знания и умения.
    Это точно.
    Ответ написан
    8 комментариев
  • Что происходит в момент добавления нового столбца в БД?

    Melkij
    @Melkij
    PostgreSQL DBA
    https://ru.stackoverflow.com/q/721985/203622

    Вот есть таблица с 1000 записей. В ней 9 колонок. На 3 из них есть индексы.

    На такой мелочи без разницы. Перезапись такой крохи штука быстрая.

    1. Возможно ли дозапись новой колонки в существующую структуру? Или под капотом происходит полное копирование всех данных в новую таблицу (табличное пространство?)

    В зависимости от конкретного alter table add column.
    Если вы добавляете add column score float default random() - то будем переписывать всю таблицу и перестраивать все существующие индексы.
    Если default с константой и у вас pg11 или новее - то обновим в системном каталоге описание таблицы, а саму таблицу трогать не будем.
    Если нет default (т.е. null) - то без оглядки на версию базы просто обновим описание таблицы и сами файлы таблицы трогать не будем.

    2. Происходит ли пересоздание индексов?

    да, если выполняется table rewrite

    3. Происходят ли какие-то еще важные для понимания сути работы в БД процессы?

    классическая история частых даунтаймов, что для операции нужна эксклюзивная блокировка. То есть для взятие блокировки не должно быть совсем никого, кто эту таблицу трогал в транзакции, начавшейся до alter table. Если у вас в это время работает какая-то аналитика на 10 минут или pg_dump - будут приключения, нужен statement_timeout
    Ответ написан
    2 комментария
  • Какое приложение написать для понимания ООП?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Ты не поймешь сути ООП, если будешь писать в одиночку. Нужно проецировать это на команду.
    Ответ написан
    Комментировать
  • Топовый вуз или средний со свободным временем и самообразованием?

    BasiC2k
    @BasiC2k
    .NET developer (open to job offers)
    Если по завершении ВУЗа, Вы будете иметь опыт работы, это будет более ценно, чем диплом из топового ВУЗа.
    Ответ написан
    3 комментария
  • Переквалификация из админа в программисты?

    xez
    @xez
    TL Junior Roo
    1. Все шансы. Возраст значения не имеет, имеет значение только скилл.
    2. У кого как. Кто-то как губка впитывает, кому-то надо грызть гранит науки. Нет однозначного ответа. С должным усердием за 9-12 месяцев натаскаться можно (но это не точно)
    3. Выбирайте то, что нравится, к чему душа лежит. С опытом админа, с пониманием сетей, легко и весело, легче и веселей, чем без такого опыта, будет разбираться с интеграциями, а это бэкенд.
    4. Я бы брался за все подряд. Экспертиза лишней не бывает. Фулстак, к слову, ирл почти не встречается.
    5. Это миф. Желание из детского сада получить наньку в эксклюзивное пользование.

    Мои советы:
    1. Залезть в джуны без опыта довольно трудно. Все хотят сеньеров. Поэтому нарабатывайте опыт. Пишите пет-проекты, автоматизируйте текущую работу; результаты все должны быть в гите. Это должно помочь.
    2. Никому не нужен человек прочитавший одну книгу или прослушавший один курс. Читайте все, смотрите все лекции, проходите все курсы (в рамках выбранной темы, конечно).
    3. Многие it конторы проводят стажировки с обучением (банки особенно). Не знаю как сейчас - раньше это был самый простой способ попасть в стажеры->джуны.
    Ответ написан
    1 комментарий
  • Как превратить подстроку вида "min ( a, b )" в "a min b"?

    mayton2019
    @mayton2019 Куратор тега Java
    Bigdata Engineer
    Поскольку случай - очень простой, то он решается шаблоном. Но если вместо а или б может быть
    тоже выражение - тогда нужно определять свою грамматику. Например:
    min ( min(a,b) , min (c,d) )
    Тогда умные дядьки-теоретики берут язык описания грамматик. EBNF типа. И пытаются
    свой новояз описать в терминах например EBNF https://en.wikipedia.org/wiki/Extended_Backus%E2%8...
    Описывают что такое число. Какое оно. Отрицательное? Вещественное? Экспоентциальное?
    Короче надо описать вообще все что может быть. Описывают функцию минимума.
    Потом по этой грамматике создают парсер. Программно. И парсер на выходе выдает
    дерево. Где корень - это вся грамматика а на листиках будут висеть числа. Или терминалки не помню
    как они это называют. И вот когда ты уже получил это чортово дерево - можно ПРИСТУПАТЬ ко второй
    части задачи - а именно к транформации в инфиксную форму. Но ты сначала реализуй хотя-бы первую
    часть.

    Это все теория и она требует погружения. Я думаю что эта задача и ей подобные в частных случаях
    решаются проще. Если например твой язык поддерживает регулярки - то перечисли макс. число
    вариантов что будут на входе и выбери через матчинг подходящий. Это - быстрее.
    Ответ написан
    Комментировать