• Вопрос связанный с replace Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    stroka = input()
    new_stroka = stroka.replace("[b]", "<.b>")
    new_stroka = new_stroka.replace("[/b]", "<./b>")
    print(new_stroka)

    Строки в питоне неизменяемые. replace создаёт новую строку с замененными последовательностями. А вы результат первой замены затираете результатом второй.
    Ответ написан
    1 комментарий
  • Как организовать хранилище музыки?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Yariik, вот этой фразой вы расставили точки над Ё.
    например у меня есть стабильная большая аудитория, и тут приходи жалоба, на меня виходят и тут же блокируют сервер, а с ним всю музику, значить нужно хранить где то копии всего, вопрос где


    Теперь я вам готов ответить. Купите несколько HDD и недорогой комп. Поставьте комп в чулан, a диски настройте в программный RAID-массив (какой тип RAID выбрать - это отдельный вопрос, отдельно и задавайте). Нужно, чтобы было резервирование на случай выхода из строя одного диска.
    На компе поставьте линукс, поднимите SAMBA, попросите у провайдера белый IP.
    Настройте nginx на раздачу каталога с музыкой в виде статики.

    Этого достаточно. Ваш "серьёзный" подход и размышления о рисках говорят сами за себя. Не будет никакой аудитории и вами никто не заинтересуется.
    Если бюджет для вас настолько критичен, что вопрос встаёт даже в проблематичности бэкапа, то никакой рекламы и раскрутки сервиса вы не обеспечите.

    Если я вас не убедил, подключите себе CDN Cloudflare поверх домашнего хранилища и попробуйте. Никто не мешает сайт вашего сервиса держать на VDS? Источник данных на домашнем компе, а раздавать публично через CDN Cloudflare.

    P.S. Имеет смысл не брать для RAID-массива диски одной серии. Желательно иметь запасной пустой комплект в отключенном состоянии на подмену. Если вылетит один диск, не исключено что на подходе и другие. Первое, что нужно делать - это синкануть на свежий и по одному плавно выводить все выжившие диски из RAID заменяя свежими.

    Но... кажется это не по вашим бюджетам, сударь.
    Ответ написан
  • Возможно ли сделать табло на одном микроконтроллере?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    А что если для проигрывания звука вот такое юзать:
    https://aliexpress.ru/item/32641284367.html?spm=a2...
    Ответ написан
    Комментировать
  • АПИ карт, как получить координаты и размер объекта?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Можно и через API и кучей способов такое сделать.
    К примеру, можно сделать запрос через API overpass-turbo.eu к данным OSM и вытащить определенного типа объекты в определенном радиусе. Размеры объектов потом вычислять на основе их координат, например с помощью библиотеки GDAL.
    Можно импортнуть данные OSM ваших окрестностей в postgres, например, с помощью osm2pgsql.
    Расширение postgis позволяет практически любые вычисления делать с гео-объектами. К примеру можно взять охватывающий прямоугольник и сконвертировать его проекцию в метры. Разница координат углов будет размером описанного прямоугольника.

    В инете полно статей как работать с гео-данными в postgis. Пробуйте, задавайте конкретные вопросы, будем отвечать.
    Ответ написан
    Комментировать
  • Как при вызове метода в методе дочернего класса, передать объект материнского класса?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ну и каша же у вас в... понимании. Вы сами поняли что написали-то?
    У вас наследование противоречит нарисованной диаграмме.
    class A()
    class B(A)
    class C(A)

    Что вы подразумеваете под передачей объекта в метод?
    Если методы не классовые, то вызывают их у объектов, а не у классов.
    Если вы пытаетесь вызвать метод класса С из объекта типа B, то у вас не получится, поскольку и B и С непосредственные потомки A.

    Опишите ваши классы кодом как есть, иначе по этому бессвязному изложению ничего не ясно.
    Ответ написан
    Комментировать
  • Установил python kivy. Почему не работает первая программа?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    pip install pillow
    Вот у вас красным по белому написано:
    5ecca2c591b8f005785541.png
    что нет модуля PIL в наличии. Скачайте дистрибутив в виде инсталлятора или вон как я выше показал поставьте его. Хотя у вас винда... ничего не гарантирую.
    Читайте внимсательно сообщения об ошибках. Обычно там всё есть. А на этом ресурсе принято прводить полный текст сообщения об ошибке в виде текста, а не в виде скриншота.
    Ответ написан
    Комментировать
  • Как исправить проблему с кодировкой (UnicodeEncodeError: 'latin-1' codec can't encode characters..) в тг боте?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    qr = pyqrcode.create(x.encode('utf-8'))
    И приводите в следующий раз, пожалуйста, полный текст ошибки. Там еже всё указано где проблема. Какого черта вы заставляете гадать на кофейной гуще?
    Думаете интерпретатор вам этот весь "мусор" просто так написал?
    Так и задали бы вопрос: написал программу - не работает, памагити!
    Ответ написан
    Комментировать
  • Как получить все комбинации элементов строки в срезе?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    У вас произведение строки трижды на себя. Строка длиной 3. Итого 3**3 == 27 вариантов.
    Каждому элементу можно поставить в соответствие порядковый номер.
    for i in range(27): 
        print(f'{i:2}:', i // 9 % 3, i // 3 % 3, i % 3)

    Числа после двоеточий - это индексы в исходной строке.
    Вы можете теперь получить (вычислить) любой i-ый элемент вашей последовательности:
    s = 'abc'
    def g(i):
        return s[i // 9 % 3], s[i // 3 % 3], s[i % 3]
    
    for i in range(len(s) ** 3):
        print(g(i))

    Можно обобщить:
    def g(s, i):
        n = len(s)
        return [
            s[i // n**(n-j-1) % n]
            for j in range(n)
        ]
    
    my_custom_string = 'abc'
    for i in range(len(my_custom_string) ** len(my_custom_string)):
        print(g(my_custom_string, i))


    Ну и раз уж пошла такая пьянка, можно сделать ваше умножение индексируемым:
    import itertools
    import functools
    import operator
    
    
    class Producti: 
         def __init__(self, *iters, repeat=1): 
             iters = [list(it) for it in iters]
             self.iters = iters * repeat
             self._len = functools.reduce(operator.mul, map(len, self.iters)) 
    
         def __len__(self): 
             return self._len 
    
         #def __iter__(self): 
         #    return (self[i] for i in range(len(self))) 
    
         def __getitem__(self, idx): 
             if isinstance(idx, slice): 
                 return (self[i] for i in range(len(self))[idx])
             if idx >= len(self):
                 raise IndexError(f'product index out of range')
             r = [] 
             d = 1 
             for it in self.iters: 
                 r.append(it[idx // d % len(it)]) 
                 d *= len(it) 
             return tuple(r[::-1]) 
    
    
    for x in Producti('abc', repeat=3)[3:7]: 
         print(x)

    Единственное, чем нам приходится жертвовать по сравнению со штатным product'ом - это распаковкой элементных итераторов. Нам это нужно, чтобы заранее знать как приводить число к индексам.
    P.S.
    Кстати, метод "__iter__", в принципе, не нужен, iter(Producti('aa', '12')) проитерируется теперь и так (когда есть исключение по выходу за пределы len).
    Ответ написан
    Комментировать
  • Автономные пасечные весы какие компоненты лучше выбрать?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    О, прикольная задачка. Там вам посоветовали уже годную статью.
    В качестве датчика веса можно взять китайские тензо-датчики, которые на том де алиэкспрессе в ассортименте.
    В качестве контроллера я бы взял ESP-8266. Бывают уже с готовым радио-модулем, а можно сделать на основе вайфай, тогда в качестве концентратора можно использовать обычный дешевый роутер вроде MR3020 со вставленным GSM-свистком.
    Вопрос насколько кустарно вы хотите решить задачу.
    Если планируется какое-то производство, то можно посмотреть на энергоэффективные техас-инструментовские контроллеры. Если быстренько для себя и родных, а также для опенсорса сделать повторяемое решение из легко доступных компонентов, то ESP8266 и роутер с кастомной прошивкой.

    Современные контроллеры достаточно энергоэффективны, чтобы контроллировать параметры хоть раз в 5 минут. Отсылать накопленные пакеты можно и раз в час.

    Кстати, вы можете кроме перечисленных (веса и температуры) добавить датчики:
    • температуры (внутри/снаружи)
    • влажности (внутри/снаружи)
    • уровня шума (внутри/снаружи)
    • веса
    • открытия крышки
    • освещённости внутри улья (для дополнительного фактора контроля разрушения улья)

    Можно настроить два уровня логирования: критический - тогда связь инициируется аварийно и смс о нештатной ситуации улетает сразу, и периодический - это штатно по расписанию.

    Можно добавить охранные функции: по пороговому значению внешнего шума включать запись и отсылать пакетами. При экстремальном превышении температуры трубить тревогу.

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

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

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

    Сжатую инфу по улью можно зранить на самом терекере внутри. Так за счет стандартизации можно легко и быстро перекреплять ульи между пасеками. Чтобы не рисовать план пасеки вручную и не встраивать в каждый трекер дорогой и энергоёмкий GPS? можно воспользоваться встроенным в некоторые модули ESP-8266 блютусом и геотегировать улей просто оставив на крышке смартфон на несколько минут.

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

    trapwalker
    @trapwalker
    Программист, энтузиаст
    [a-zA-Z0-9]+
    Но у вас плохие требования к паролю.
    Они выдают непрофессионализм разработчиков, которые внедряют такие требования.
    Это признак того, что пароль лежит в открытом (не хешированном) виде в БД.
    Это провоцирует делать слабые пароли.
    Это выглядит как поделка студентов.

    Если и вводить ограничения, то минимальные:
    - пароль должен быть не пустым. Всё.

    Однако следует делать предупреждения если:
    - пароль содержит кириллицу, или любые символы, которые сложно набрать на любой произвольной клавиатуре. Большая проблема пароль с юникод-символами, если вы хотите ввести его на смартфоне. Большая проблема с кириллицей, если вы хотите войти с компа в турции в отпуске, потеряв, к примеру, телефон.
    - пароль слишком короткий;
    - хеш пароля находится в списке наиболее распространённых паролей;
    - пароль выглядит как набранный с инвертированным капс-локом.

    Эти предупреждения должны быть заметны, но не должны запрещать создать такой пароль. Обсуждать можно только то, что касается списка самых распространённых паролей, скажем тысячи самых популярных. Ну и короткие (меньше 6 знаков).
    Пароль следует хешировать с только что сгенерированной солью. Хранить соль нужно рядом с хешем. Также рядом можно указать название алгоритма хеширования. Прямо в одной строке. Это не снизит безопасность, зато избавит вас от проблем связанных с переходом на новые алгортимы хеширования.
    Ответ написан
  • Python: можно ли в модуль импортировать обычный текстовый файл json?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Импортировать нельзя.
    Загрузить и присвоить содержимое json-файла переменной внутри модуля можно.
    Вы объясните что вам надо, а вам расскажут как это делать правильно. Судя по вашему вопросу вам не поможет никакой ответ на него.
    Ответ написан
    Комментировать
  • Как однозначно переопределить сложение?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    1. Нужно, чтобы классы A, B, C, D были потомками одного абстрактного класса Base. Абстрактный класс должен декларировать общий для них интерфейс.
    2. Нужно сделать ещё один класс G - потомок от Base. G должен содержать внутри список элементов класса Base. Кроме этого G должен реализовывать все абстрактные методы своего интерфейса путём вызова соответствующих методов вложенных в свой список объектов.
    3. Класс Base должен перекрывать метод сложения __add__. Результатом сложения возвращается экземпляр G, содержащий список из складываемых элементов.
    Ответ написан
    Комментировать
  • Как написать такую валидацию в regex?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    https://regex101.com/r/sXBK61/1
    ^[A-Za-zА-Яа-я]+([\-`][A-Za-zА-Яа-я]+)*$
    Ответ написан
    Комментировать
  • Алгоритм поиска кратчайшего пути через все вершины?

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

    Эта задача называется задачей коммивояжера:
    Задача коммивояжёра относится к числу трансвычислительных: уже при относительно небольшом числе городов (66 и более) она не может быть решена методом перебора вариантов никакими теоретически мыслимыми компьютерами за время, меньшее нескольких миллиардов лет.
    Ответ написан
    8 комментариев
  • Переходить ли с windows 10 на linux?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    О, а я сейчас выскажу оппозиционную точку зрения.
    Поставил сестре на старый ноут убунту и она горя не знает. Браузер (файрфокс), фильмы, детям учеба удалённо - всё это тянет.
    Да, с офисом проблема. Однако для бытовых нужд лично мне и родственникам хватает гугловских облачных решений. Если гуглдокс устраивает, то можно забить на винду.
    Про SSD очень правильно сказали. Это резко улучшит быстродействие. Правда не удивлюсь, если винда и его умудрится загрузить на 100% фуллтайм. ХЗ почему так происходит. Судя по всему основной тупняк именно из-за того.
    Причем на ноуте с 8 гигами оперативы винда 10ка также тупит со 100% использованием диска на кой-то хрен.
    Ответ написан
    6 комментариев
  • Как загружать большие mp3 файлы на сайт?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Ну кто так вопросы составляет, блин!?
    проект в который я хочу загрузить музыку (mp3), длительность дорожек больше 2 часов.

    "Загрузить" - это имеется в виду единоразовая акция? Через FTP rsync не подойдёт? Или это пользователи будут "загруЖАТЬ" такие здоровенные треки?
    Что бы по щелчку на плей все быстро воспроизводилось

    Так в чем вопрос, в том, чтобы быстро воспроизводилось или загружалось на сайт?
    Бывает download, а бывает upload. Проясните в чем именно вопрос. Или тут целых два вопроса?
    Если акция одноразовая то загружать (upload) треки можно как угодно. Это делает какой-то знающий специалист, а загрузка всё равно будет длиться не быстрее, чем пропустит интернет-канал.

    Если upload от пользователей, то выше ответили, нужно нормальный прогресс отобразить и скорость вы не увеличите, поскольку она ограничена пропускной способностью канала.

    Если речь о download для пользователей, то убедитесь, что у вас веб-сервер поддерживает и настроен на докачку файлов с произвольного места. Тогда проигрывание на странице можно запускать не дожидаясь полной загрузки.
    Однако будьте осторожны, бывает вот такая атака.
    Ответ написан
  • Как умножить в таблице два значения, полученный результат вывести отдельно?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Вы не написали о какой БД идёт речь.
    Некоторые поддерживают вычисляемые поля. Значение такого поля не хранится в БД, оно вычисляется в процессе запроса "ленивым" образом незаметно, а для SQL выглядит как обычное поле.

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

    Однако я вам рекомендую не поддаваться на все эти соблазны и не хранить никакого кода в БД. Если вы прямо в SQL-запросах каждый раз будете перемножать эти величины, когда это нужно, то ничем это решение не будет менее эффективным чем предыдущие два. Формула у вас не так сложна и вполне очевидна, чтобы не наворачивать лишних сущностей.

    Первое решение ищется по строке "%my_db% calculated fields"/
    Второе: "%my_db% trigger on update"
    Третье и гуглить не надо. Просто умножайте всегда.
    Ответ написан
    Комментировать
  • Плавится провод +5v?

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

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Как-то так
    SELECT n.id, n.name
    FROM names n JOIN tags_names tn ON tn.goods_id = n.id
    GROUP BY n.id, n.name
    HAVING COUNT(DISTINCT tn.tag_id) = (SELECT COUNT(t.id) FROM tags t)
    Ответ написан
    Комментировать
  • Парсер на Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Зачем парсер, когда у youtube есть API?
    Ответ написан
    Комментировать