Задать вопрос
  • Что означает '/' в 'NAME': BASE_DIR / 'db.sqlite3' в Django?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если посмотреть внимательнее, то BASE_DIR - это не строка, а экземпляр класса pathlib.Path, для которого определён оператор / между Path и str. Дока https://docs.python.org/3/library/pathlib.html
    Ответ написан
    Комментировать
  • Развалился raid1 массив или оба диска вышли из строя? Как быть в такой ситуации?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Всё нормально, на /dev/md# и не должно быть таблицы разделов. Почему возникла мысль, что что-то не так?
    Ответ написан
  • Какого посредника выбрать для интеграции crm и whatsapp?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если речь идёт о сервисах, продающих за 200 рублей в месяц и подключающих за один день - это всё имитации WhatsApp Web. Легальный WhatsApp Business API стоит дороже и подключают его порой по 2-3 недели (из-за модерации на стороне Facebook).

    Указанные два относятся к категории имитаторов Web и это вовсе не скрывают. Но второй более известный и хотя бы предоставляется в России от имени ИП, первый же имеет явно кликбейтовое название, никаких реквизитов владельцев нет, плюс из контактов на сайте только телеграм-бот, короче, я бы поостерёгся. В любом случае, Важный и Ценный Аккаунт, Который Нельзя Поменять я бы не стал отдавать в подобные сервисы, поскольку в случае бана он будет потерян.

    Поставщиков имеет смысл выбирать в первую очередь по признаку наличия интеграции под нужную CRM.
    Ответ написан
    Комментировать
  • Как исправить .OSError: [Errno 22] Invalid argument при docker-compose up?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В Windows используется COMPOSE_PATH_SEPARATOR=';', но это можно переопределить через env.

    Кроме того, в Windows компоненты пути разделяются обратным слешом, поэтому в данном случае docker-compose решил, что в COMPOSE_FILE одно имя файла, лежащего в текущем каталоге.
    Ответ написан
    Комментировать
  • Загрузочная запись в ISO образе?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Что значит "с помощью dd записал iso"? Нельзя в iso9660 просто так ковыряться внутри. Надо смонтировать (через loop device), достать файлы, внести изменения, собрать обратно.

    Чтобы диск остался загрузочным, надо понять, какой там загрузчик (вероятно, isolinux?) и пересобрать iso с учётом этого (например, для isolinux смотреть тут: https://wiki.syslinux.org/wiki/index.php?title=ISOLINUX).
    Ответ написан
    1 комментарий
  • Парсинг википедии с помощью Beautiful Soup?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Википедия, в отличие от большинства сайтов, не ставит задачу сокрытия данных от использования. Кроме её парсинга полезно рассмотреть альтернативные способы:

    1. Парсинг дампов SAX-парсером: https://dumps.wikimedia.org/ruwiki/latest/

    Главное в тексте находить нужные категории.

    2. Использование SPARQL к Wikidata: https://query.wikidata.org/

    Например, я наскоро набросал такой запрос, находящий все элементы субклассов "животное":

    select ?animal ?animalLabel where {
    # субкласс (wdt:P729) животного (wd:Q729)
      ?animal wdt:P279 ?animalSubClass.
      ?animalSubClass wdt:P279* wd:Q729.
      SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en". }
    }


    К сожалению, не всегда данные в Википедии хорошо размечены семантически, поэтому в подобную выборку может попасть не всё. Ну и полно будет извлечено из enwiki.
    Ответ написан
    Комментировать
  • SDL — это библиотека которая объединяет API разных ОС?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нет, SDL - это кроссплатформенная библиотека для работы приложений с мультимедиа (аудио-видео). Никакие "API разных ОС" (что это, системные вызовы что ли?) она не объединяет.
    Ответ написан
    Комментировать
  • Как сделать многопоточность в чат-боте Вкотакте?

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Как-нибудь так:

    l = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (0, 255, 255), (255, 255, 0)]
    
    d = {(0, 0, 255): ((0, 0, 5), (0, 0, 5), (0, 0, 23), (0, 0, 23)), (255, 0, 0): ((0, 0, 10), (0, 0, 10), (0, 0, 21), (0, 0, 21)), (0, 255, 0): ((0, 0, 15), (0, 0, 15), (0, 0, 21), (0, 0, 21)), (255, 255, 0): ((0, 0, 20), (0, 0, 20), (0, 0, 21), (0, 0, 21)), (0, 255, 255): ((0, 0, 24), (0, 0, 24), (0, 0, 21), (0, 0, 21))}
    
    d2 = sorted(d.items(), key=lambda x:l.index(x[0]))
    
    print (d2)


    Тут сортировка по индексу каждой тройки типа (255,0,0) в списке l.
    Ответ написан
    3 комментария
  • Получить дание от пользователя в telegram bot?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Сделать user_data словарём, где ключ - id пользователя

    Типа такого:

    user_data = {}

    В нужном месте вместо user_data используем user_data[message.from_user.id]

    try:
      user_data[message.from_user.id]
    except KeyError:
      user_data[message.from_user.id] = initial_data_for_new_user
    ...
    user_data[message.from_user.id] = another_data


    Но вообще-то в популярных фреймворках есть свои механизмы для FSM (Finite State Machine), с помощью которых всё это можно писать гораздо аккуратнее.
    Ответ написан
    Комментировать
  • Существуют ли аналоги remote.it (облачный cli) для linux?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если нет возможности/желания поднимать VPN, то это задача как раз для сервиса ngrok, дёшево и сердито.
    Ответ написан
    2 комментария
  • Почему получение квадрата из 3 возвращает комплексно число?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Потому что когда python видит отрицательное число в нецелой степени, он сразу включает комплексную математику. А в комплексной математике z^x считается как e^(x ln z). И получается:

    >>> cmath.exp(1/3*cmath.log(-1))
    (0.5000000000000001+0.8660254037844386j)


    Решение: вынести минус, тогда будет использована вещественная математика:

    >>> -(1**(1/3))
    -1.0
    Ответ написан
    Комментировать
  • Как определить и скопировать метод сжатия?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Похоже, автор игры схитрил и создаёт внутри архива каталог с именем "." (точка). Именно так устроены, например, файлы отсюда: https://3909.zendesk.com/hc/en-us/articles/3600532...

    Во многих системах точка означает текущий каталог, поэтому распаковать и тем более запаковать такой архив не получится.

    Вот тут предлагают переименовать каталог внутри архива с помощью 7zip.
    Ответ написан
    1 комментарий
  • Как составить SQL запрос для группировки?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ну для начала надо правильно сделать JOIN таблиц cabs и trips. Для лучшего понимания советую посмотреть, что возвращает:

    SELECT * FROM cabs,trips;

    Как это исправить рассказывать я уже рассказывать не буду - это элементарные основы.

    Далее, не надо писать COUNT на что попало, нужно чётко понимать, что должен делать запрос. В данном случае если не использовать группировку, запрос должен извлечь из базы все строки по принципу:

    компания1 ... поездка1
    компания1 ... поездка2
    компания2 ... поездка1
    ... итд

    Нужно сгруппировать по компании, а поездки агрегировать функцией их количества, например, так:

    SELECT company_name, COUNT(*) AS trips_amount ... GROUP BY company_name;

    В SQL при использовании агрегирующих функций все неагрегированные столбцы надо завести в GROUP BY. В некоторых случаях можно обойтись фиктивной агрегацией. Например, если мы хотим вместе с компанией выводить её адрес, который у всех строк и так будет одинаковый, можно сделать так:

    SELECT company_name, MIN(company_address), ... GROUP BY company_name;

    Хотя разумнее так (и заодно всплывут различия в компаниях с одним распространённым именем типа ООО "Вектор" и разными адресами):

    SELECT company_name, company_address, ... GROUP BY company_name, company_address;

    И в конце всё это надо отсортировать. Некоторые базы типа MySQL позволят сделать ORDER BY trips_amount DESC, а вот в Oracle, например, нельзя использовать тут алиасы, придётся сделать ORDER BY COUNT(*) DESC.
    Ответ написан
  • Как сделать скрипт на удаление всех людей из канала в тг?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Надо убрать лишнюю строку

    with app:
    Ответ написан
    Комментировать
  • Как написать бота для рассылки в WhatsApp?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Официально - WhatsApp Business API. Неофициально, нелегально и рискованно. - попытками эксплуатировать браузерный WhatsApp Web.

    Нужно отметить, что к спаму WhatsApp относится очень отрицательно и официально разрешит рассылать только по заранее одобренным шаблонам.
    Ответ написан
    Комментировать
  • Аналог .strftime() для unixtime (time.time())?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    from time import strftime,time,localtime
    print (strftime("%Y-%m-%d", localtime(time())))
    Ответ написан
  • Как запустить задачу из бота aiogram python?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Как-то так:

    async def main():
      polling_task = asyncio.create_task(dp.start_polling())
      ... прочие действия...
    
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    Ответ написан
  • Md5 хэш + соль, как соль помогает в усложнении пароля?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Предположим, у нас есть база на миллион хешированных неизвестных паролей, мы хотим перебрать миллион вариантов паролей, чтобы найти их среди хешированных.

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

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

    Таков общий принцип. Вопрос уязвимости md5 сейчас не рассматриваем, тем более что солить можно при любом алгоритме хеширования.
    Ответ написан
    3 комментария