• Выдаёт ошибку AttributeError: 'NoneType' object has no attribute 'get' почему и как это исправить?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    item.find("a", class_="js-item-slider")
    У вас скорее всего вот этот вызов возвращает None. А у него нет метода .get
    Вообще в таких случаях нужно полностью приводить трейс-бэк, чтобы нам не приходилось гадать на кофейной гуще.
    Ответ написан
    Комментировать
  • Как запустить несколько процессов в ffmpeg?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    ну я бы посмотрел в сторону линукса. в винде, говорят, сейчас можно фактичкески консоль линукса получить... не пробовал. давно не трогал винду.
    но если вам удастся, то посмотрите на xargs.
    Там есть ключ, ограничивающий к=максимальное количество запускаемых одновременно процессов.
    Так что можно наборы параметров командной строки передать в xargs конвейером и она вам запустит много ffmpeg'ов в разхных процессах.

    Наверно можно и через powershell, там говорят все тоже продумано круто, но, камон, это для извращенцев. На винде вы не должны этого хотеть=)

    В любом случае ищите про асинхронные вызовы из шелла или xargs под винду
    Ответ написан
  • Как развернуть проект django на сервере без git?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    github не нужен чтобы воспользоваться гитом. GIT вполне работает через ssh
    https://githowto.com/ru
    github - это всего лишь централлизованный сервис для хранения, публикации репозиториев и социальщины вокруг них. Все операции с репозиторием происходят с помощью программы git.
    GIT - это распределенная система контроля версий. Каждый клон репозитория в ней равноправен по отношению к остальным.
    Клонировать, отправлять и принимать изменения можно из любого в любой клон.
    можно даже локально в одной файловой системе в соседних каталогах сделать клоны репозитория и переносить между ними коммиты.
    Ответ написан
  • Как выбрать все значения с нескольких таблиц?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Автор вопроса сам не понимает что ему нужно сделать. Это значит, что результат не важен и мы тоже можем не париться, не углубляться и не гадать как экстрасенсы что же это действительно нужно было тому, кто сформулировал для автора эту задачу.
    Склорее всего решение не нужно ни автору ни тому кто задачу сформулировал -- никому.
    Оно также не нужно, как если бы автор вопроса спросил тут как вырезать аппендицит.
    Из вопроса не ясно есть ли в таблицах данные, какие там есть столбцы, какой диалект SQL, есть ли между данными из таблиц логическая связь. Автору скорее всего пофигу на все это. У него, наверно, есть задание и мы тут это задание должны решить заглянув в астрал и проявив чудеса предусмотрителности.

    SELECT 
      t1.f1 AS t1_f1, t1.f2 AS t1_f2, /*...*/ t1.fn AS t1_fn
     ,null  AS t2_f1, null  AS t2_f2, /*...*/ null  AS t2_fn
      /*...*/
     ,null  AS t7_f1, null  AS t7_f2, /*...*/ null  AS t7_fn
    FROM table1 t1
    UNION
    SELECT 
      null  AS t1_f1, null  AS t1_f2, /*...*/ null  AS t1_fn
      t2.f1 AS t2_f1, t2.f2 AS t2_f2, /*...*/ t2.fn AS t2_fn
      /*...*/
     ,null  AS t7_f1, null  AS t7_f2, /*...*/ null  AS t7_fn
    FROM table2 t2
    UNION
    /*...*/
    SELECT 
      null  AS t1_f1, null  AS t1_f2, /*...*/ null  AS t1_fn
     ,null  AS t2_f1, null  AS t2_f2, /*...*/ null  AS t2_fn
      /*...*/
     ,t7.f1 AS t7_f1, t7.f2 AS t7_f2, /*...*/ t7.fn AS t7_fn
    FROM tablen t7

    Формально требования выполнены.
    Ответ написан
    2 комментария
  • Как закрасить зоны на карте России?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Можно воспользоваться overpass-turbo.eu/, чтобы отфильтровать из данных OSM то, что вам нужною Вот рассмотрены примеры запросов. Там есть экспорт в kml, geojson и другие форматы.
    Подрисовать что-то и наглядно поредактировать можно в онлайн-редакторе GeoJSON. Этот формат позволяет раскрашивать полигоны и линии, делать маркеры. Примеры гуглятся легко. Кроме того, geojson легко обрабатывать программно.
    Что-то более сложное имеет смысл делать в QGIS.
    Ответ написан
    Комментировать
  • Как заменить символ строки на индекс этого символа в массиве?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    alpha = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
    alpha_map = {c: str(i) for i, c in enumerate(alpha, 1)}
    word = input()
    new_word = ''.join(f'{idx} ' if idx else orig for idx, orig in ((alpha_map.get(c), c)  for c in word))
    print(new_word)
    Ответ написан
    Комментировать
  • Для чего нужен полиморфизм?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Полиморфизм - это широкое понятие.
    Идея его в том, чтобы скрыть лишние детали реализации и сделать код более универсальным.
    К примеру у вас есть абстрактный класс Фигура, у него есть абстрактный метод нарисовать(куда: Канва). Этот метод нельзя запускать, он абстрактный. Не понятно как рисовать абстрактную фигуру.
    Зато у фигуры есть потомки: Круг(Фигура) и Квадрат(Фигура). У них метод "нарисовать" перекрыт конкретной реализацией. Это виртуальный метод (есть такой термин в некоторых ЯП).
    За счет полиморфизма мы можем нарисовать любую фигуру не зная как она рисуется. Мы знаем только как с ней общаться на уровне ее интерфейса.
    Ответ написан
    4 комментария
  • Повтор сообщения Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ну да, вы ж его в цикле отправляете. А цикл по списку. А в списке два элемента. Два раза и отправляет.
    Вы чего хотели-то?
    Имеется в виду негативная ветка внутри цикла. Если оба значения i не равны mes, то будет дважды выполнена ветка else
    Ответ написан
    Комментировать
  • Группировка с выборкой?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Делайте вместо
    COUNT(*)
    подзапрос.
    SELECT
      case when id in (1,2,3,4) then 'Начальная школа'
              when id in (5,6,7,8,9) then 'Средняя школа'
              when id in (10,11) then 'Старшая школа'
              end AS Class_type,
      (
        SELECT COUNT(*) 
        FROM class cc 
        WHERE (
          case when сс.id in (1,2,3,4,5) then 'Начальная школа'
          when cc.id in (6,7,8,9) then 'Средняя школа'
          when cc.id in (10,11) then 'Старшая школа'
        ) = (
          case when c.id in (1,2,3,4) then 'Начальная школа'
          when c.id in (5,6,7,8,9) then 'Средняя школа'
          when c.id in (10,11) then 'Старшая школа'
        )
      ), 
      SUM(case when s.ocenka>4 then 1 end) AS 'Отличники' 
    FROM class c
    GROUP BY Class_type

    Как-то так через задницу. Запутано. Не проверял, нет файрбёрда под рукой
    Ответ написан
    Комментировать
  • Pyhton PIL почему не работает нормально?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    from PIL import Image
    
    q = input("Название картинки: ")
    img = Image.open(q)
    img = img.convert("RGB")
    (w,h) = img.size
    print(w*h)
    with open("img.txt","w") as file:
        for y in range(h):
            for x in range(w):
                r, g, b = img.getpixel((x,y))
                file.write("#" if (r, g, b) == (0, 0, 0) else "_")
            file.write("\n")
    
    print(img.getpixel((0,0)))
    input("Enter что-бы завершить: ")
    Ответ написан
    5 комментариев
  • Как отправить запрос, содержащий русские буквы pymysql?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    1. Используйте уже третий питон.
    2. Используйте utf-8 в коде.
    3. Если уж приспичило, используйте юникодные строки.
    4. Не пользуйтесь виндой. Там-поди до сих пор зоопарк из cp866, сз1251 и utf-8 в консолях, шелл скриптах и везде...
    5. Приспичила винда, да и вообще, примите за правило: на входе люьой текст приводите к юникоду, на выходе выводите в целевую кодировку.
    Из какой и в какую кодировку - читайте в параметрах потокв ввода/ывода. Если там не указано, попробуйте различить связан ли поток с файлом или с терминалом. В файл можно писать любую кодировку, главное правильно сконвертировать и не смешивать. В терминал писать нужно либо в юникоде (если указана кодировка в параметрах потока, то питон сам преобразует), либо в целевой кодировке, которую можно настроить/угадать, предположить и подобрать с нескольких попыток.

    Но лучше всего пользуйтесь третьим питоном. Там с юникодом все гораздо проще и однозначнее, чем во втором.
    Ответ написан
    Комментировать
  • Подзапрос вернул более одного значения, как исправить?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Да, вопрос непонятный нифига.
    Но чего именно вы хотите?
    Вы можете лимитировать количество выдаваемых значений:
    SELECT price
    FROM Laptop
    LIMIT 1

    Можно агрегировать получив, скажем, минимальную цену:
    SELECT min(price)
    FROM Laptop

    Или можно сделать join:
    SELECT DISTINCT model, price
    FROM PC p
    JOIN  Laptop l ON l.price = p.price

    Но это тупо и бесполезно. Вы, как бы, сопоставляете ноуты с десктопами по цене и показываете рядом...
    SELECT DISTINCT p.model, p.price, l.model
    FROM PC p
    JOIN  Laptop l ON l.price = p.price

    Я бы в таком случае не разделял на отдельные таблицы эти товары, а хранил бы в одной и сделал бы джойн с самой сообой. А сравнивал бы в некоторых рамках, иначе вы требуете точного совпадения цены.
    Ответ написан
  • Как можно get запрос превратить в POST?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Плохая идея.
    Но вы можете сделать любой, в том числе и POST запрос с помощью CURL.
    Ответ написан
  • Почему не сохраняются коммиты в git?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    И из всего описания не ясно делаете вы push или нет.
    Сделайте изменения и покажите команда за командой (вместе с их выхлопом) как вы отправляете изменения на сервер.
    Ответ написан
    6 комментариев
  • Не работает telegram бот на python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Для себя я решил эту проблему забавным и простым образом.
    У меня есть VDS для хостинга сайта. С неё телеграм доступен и не блокируется. Я превратил этот сервер в собственный прокси для апи телеграма простым конфигом для nginx:
    server {
        listen tg.my_own_domain.net:8079;
        server_name tg.my_own_domain.net;
        access_log /var/log/nginx/tg.my_own_domain.net-access.log;
        error_log /var/log/nginx/tg.my_own_domain.net-error.log;
        location / {
    	proxy_set_header X-Forwarded-Host $host;
    	proxy_set_header X-Forwarded-Server $host;
    	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    	proxy_pass https://api.telegram.org/;
    	client_max_body_size 100M;
        }
    }

    Очевидно, что моё решение именно вам скорее всего не подойдёт, но кому-то может оказаться полезным, ведь для его реализации достаточно иметь лишь свою VDS вне зоны блокировки, свой домен (хотя не обязательно) и больше ничего. Nginx у вас там уже скорее всего стоит, но и поставить его не долго.

    Для желающих более правильно решить этот вопрос могу посоветовать найти на docker hub готовый образ с телеграммовским прокси или вообще универсальным прокси.

    Лично вам, скорее всего, придётся пользоваться какими-то публичными готовыми прокси-серверами, а в конфигурации бота указывать их или список их для подключения.
    Этот вариант я сейчас искать и пробовать для вас времени, к сожалению не имею. Надеюсь кто-то подхватит и добавит свой ответ.

    Кстати, чтобы вообще ничего не менять в коде бота и его конфигурации, можно на машине, где будет работать бот прописать в hosts ip зеркала телеграммовского API на домен api.telegram.org.

    Чужим непроверенным зеркалам API я бы не особо доверял, кстати.
    Ответ написан
    Комментировать
  • Почему в python вылетает ошибка list index out of range?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы вот здесь делаете присвоение.
    n = h
    n.remove(n[j])
    if h[j] not in n:
        print(h[j])

    В питоне переменные работают не так как в других языках программирования. n и h - это после присвоения два имени одного и того же объекта (списка). Удаляя из него элемент вы тут же его пытаетесь получить в этом же объекте из под другого имени.
    Вместо присвоения такого, делайте так:
    n = h[:]
    Это скопирует список, а не создаст еще одно имя старому.
    Ответ написан
    3 комментария
  • Как определить входит ли определённый отрезок времени в другой?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы можете сравнивать даты целиком на больше и меньше не приводя к строке:
    current_date >= start_date and current_date <= end_date

    А еще можно воспользоваться спорным фирменным питоновским синтаксисом:
    start_date <= current_date <= end_date
    Если все эти переменные типа datetime, то всё будет как надо.
    Ответ написан
    Комментировать
  • Как вытащить из ссылки слово REGEX?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Вот так?
    Я вас видимо не очень понял. Вот такой вот вариант еще ловите: https://regex101.com/r/5FoQLB/4
    Ответ написан
  • ПО для реализация показа рекламы в транспорте?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    У нас в городе (Белгород) в автобусах стоят такие моники. Там картинка в картинке. В нижней части прогресс-бар сближайшими остановками, указана следующая.
    В верхней части крутится плейлист из рекламы, всяких прикольных видосиков, новостей.
    Этот же телевизор, если не ошибаюсь, говорит какая остановка, какая следующая, и напоминает, что нужно присматривать за подозрительными оставленными вещами и уступать место бабушкам и дедушкам.
    Контекстной рекламы, как вы упомянули, мест, которые проезжаем нет, думаю пока нет. Мониторы появились недавно, локальные рекламодетели не вкурили еще потенциальных плюшек от такой рекламы. А можно, ведь, сделать её очень интерактивной. Можно фигачить QR-коды со скидками, делать конкурсы, викторины и заманивать прям людей толпами.

    Технически вашу задачку я бы делал, особенно если на скорую руку, так:
    • Бэкенд
      • Сервер телеметрии - Rest API на AsyncIO с хендлерами для приёма статусов, событий и треков от фронта.
      • Контент-сервер - я бы его сделал вообще каталогом с синхронизацией через rsync на фронтовые машины. Для каждого маршрута свой каталог, причем в нескольких ревизиях, чтобы можно было поправить видеоряд и настройки, а потом откатав на тестовом стенде и пробной машине переключить на всех. Возможно, что на маршрутах окажется немного разное оборудование, и какое-то не будет тянуть, скажем, видео в хай-рес, а на каком-то, возможно сломался GPS и нужно временно крутить там контент без привязки к геоданным. Просто делаются отдельные ревизии для таких клиентов.

    • Фронтенд
      • На бортовом компе (какой нибудь Raspbery или Orange Pi) крутится "локальный бэкенд" и развёрнутый на весь экран браузер, смотрящий на локалхост.
      • "Локальный бэкенд" тривиальный, на Flask или чем-то таком. Нужен для упрощения и стандартизации доступа к контенту. Своего рода слой изоляции. Один из хендлеров - веб-сокет, читающий очередь гео-событий и предоставляющий данные гео-виджету. Можно и аяксом, кстат, без всяких веб-сокетов обновлять навигационный виджет. Тут как быстрее в рамках MVP.
      • Rsync демон - синхронизирует каталог с ресурсами маршрута. Можно по ssh даже. Его задача держать все ревизии контентных папок идентичными серверу.
      • Сервис телеметрии - подключается к северу телеметрии на бэкенде и шлёт туда текущие куски трека, кидает в локальную очередь гео-события для бэкенда.
      • Сервис обновления - по расписанию проверяет хеш-сумму контентных каталогов, отправляет уведомление на API бэка о статусе загрузки новой ревизии контента. Получает в ответ сигнал о переключении на новую ревизию и перезапускает локальный бэкенд из нового каталога.
      • Фронтенд - просто хромиум или любой другой браузер, развёрнутый на полный экран и подключенный к веб-серверу на локалхосте.
      • На бэке крутится маленький локальный сайт с медиаплеером, навигационным виджетом и чем угодно вообще. Это лучше нативного прилжения, поскольку программистов и дизайнеров для веба кругом навалом, js-программистов тоже, всё это отлаженные и понятные технологии. Куда лучше, чем пилить свою балалайку со своим рендером контента. К тому же это более-менее изолированная повторяемая среда, показ можно тестировать на десктопе.


    Не сказал про плейлист.
    Все ролики-то у нас лежат в локальном доступе на БК. В связи с этим можно избавиться от локального "бэкенда" просто открывая браузером статику. Локальный веб-сервис нужен разве что для подачи данных навигационному виджету, но если будет поджимать время, то в рамках МВП можно и через статические файлы прокидывать гео-события. Маршрутка летит не со скоростью света - интерактивности хватит. Если жалко флешку убивать перезаписями, можно примонтировать маленький рам-драйв под это дело.
    Плейлист - это json-файл, в котором фактически расписание аудио и видеоряда по времени старта и остановки. Можно сделать прогрев кэша браузера вперёд по плейлисту, чтобы не фризило, но то, что можно смонтировать в монолитные ролики - нужно монтировать. Тем более браузерный плеер отлично понимает когда ему говорят откуда что играть и слушается команд из js.
    Ответ написан
    4 комментария
  • Как спарсить и скачать все картинки с сайта?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Посмотрите в сторону консольной утилиты wget. Ее вполне можно поставить и под виндой. Она (утилита) уже умеет скачивать сайт целиком вместе с картинами следуя по ссылкам со страницы на страницу.
    Прочитайте ее документацию.
    Там есть опция рекурсивной загрузки -r.
    Ответ написан
    Комментировать