• Локальная клиент-серверная программа на python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Прочитайте что такое REST API и прекратите использовать дендрофекальный метод проектирования. Нужно правильно выбирать технологии под задачу.
    Вы бы ещё свою шину данных под вашу ERP разработать попробовали. А что, подключаешься к GPIO на материнке и голыми битами по проводам, с контрольными суммами... Вам еще не кажется TCP избыточным? Может UDP? Вон кто-то выше Web RTC для ERP посоветовал. Давайте ещё как следует поелозим вдоль OSI.
    Ответ написан
  • В чём актуальность диплома на тему "Модуль GSM мониторинга общественного транспорта"?

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

    К примеру, если бы GSM был бы не принципиален, то слабо покрыт рынок устройств, способных эффективно отдавать треки по медленным коротковолновым радиоканалам. В зонах действия общественного транспорта, правда это не так актуально, но вот, к примеру, двунаправленный QRP-пейджер для путешественников, горных туристов, выживальщиков - это прикольная тема. Да, сигнал "со мной всё ок, я вот тут, иду вот сюда" будет отправляться несколько часов, но приборчик висит на палатке солнечной батарейкой к небу и размотанной антенной на дереве и есть не просит.

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

    Лично мне не понятно почему до сих пор никто не сделал голосовой автоответчик, который по уникальному добавочному номеру остановки отвечал бы коротким рассказом когда какой автобус приедет, а какие сегодня не ждать. Если хотите в этом поучаствовать, у меня есть домен для такого проекта steptobus.ru, давайте сколлаборируемся.

    Если тема транспорта не сильно принципиальна, но GSM и GPS ваша тема, то могу предложить идею ПРАВИЛЬНОГО детского телефона-трекера.
    Все эти смарт-часы у детей живут от силы пару дней от батареи, а в остальное время лежат разряженные и забываются перед любым выходом из дома. Нормальный детский трекер должен быть как тамагочи, то есть грамотно и вовремя напоминать ребенку о необходимости зарядки, о том, что нужно подойти к окошку, если давно не ловились спутники, о том что его ищут родители. Нет смысла трезвонить о низком заряде, если ребёнок не дома или таскает прибор в кармане. В этих случаях нужно уйти глубже в энергосберегающий режим, чтобы хоть реже, но по-прежнему бесперебойно и регулярно отправлять на сервер сведения о статусе. Тревожная кнопка должна быть эффективной и надёжной, а прибор должен уметь сам после безуспешного обзвона по кругу аварийных номеров родителей дозвониться в 112 и внятным голосом робота зачитать в линию координаты и имя ребёнка, контакты родителей и проиграть звуки, записанные при последней активности вокруг устройства.
    Девайсу нужны крутые сменные панельки и набор stl-шаблонов для кастомизации с помощью 3д-принтера. Девайсу нужна "уютная кроватка" - кредл для зарядки. Девайсу, лежащему в рюкзаке, висящему на ключах или верхней одежде, нужен дополнительно лёгкий браслет с кнопкой и радиолинком. Такой браслет - это выносная тревожная кнопка, способ быстро найти сам девайс, удаленно мониторить состояние, температуру и шевеления ребенка, а также его удаление от Трекера. Спроектируйте такой трекер в форм-факторе брелка для ключей и чтобы жил от заряда месяц с регрессией частоты выхода на связь и это будет крутой социально значимый проект. Если вы умудритесь добавить в трекер еще и аварийный коротковолновый радио-маяк, то дети с таким прибором не будут безнадёжно теряться в лесу.

    Ещё туристам вроде меня не хватает нормального удобного трекера для ведения походного голосового журнала. В принципе, можно найти хороший диктофон с фиксацией времени, плюс отдельный GPS-логгер, и это будет нормальное решение. Но сейчас прям вот хорошего комплексного решения нет. Мне очень нравился мой старый добрый Holux M241. В нём не хватает диктофона и пищалки для сигнализации о необходимости заменить батарею. Если бы похожий девайс умел при наличии GSM сливать треки на сервер, то это было бы прикольное устройство для любых путешественников. Идеально было бы вообще запись звука не выключать никогда. Тогда ничего не забудешь и отчет по путешествию потом писать проще, если проиндексировать голос.
    Ответ написан
    Комментировать
  • Как ускорить выполнение preg_replace (в массиве 100 паттернов)?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Так себе идея обрабатывать теги регулярками, но...
    Пощупать вашу проблему я не могу ввиду страшной аллергии к ПХП.
    Могу предложить ряд оптимизацией обобщенного характера.
    1. Проанализировать регулярки, найти зависимости и "скомпилировать" их в одну регулярку или небольшую группу из нескольких. Обрабатывать регулярки можно эвентуально. То есть дополнительно анализировать матчи программно и в зависимости от контекста подставлять соответствующую замену. Ещё можно пир компиляции регулярок в одну поименовать группы уникально так, чтобы по имени проматченной группы можно было найти нужную замену в словаре замен.
    2. Если замены более-менее однотипные, например одни теги заменяются на другие, то можно вообще построить общую универсальную простую регулярку на тег, а программно смотреть по словарю чему соответствует матч и делать нужную замену.

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

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    А что у вас не получается-то? Ни разу не трогал VK API, но вот же у них в документации всё про этот метод ваш: https://vk.com/dev/messages.getConversationMembers
    И в результате он пользователей вам вернёт. Выбирайте случайного и пользуйтесь.
    random.choice(users.items)
    Вот и будет вам случайный из них.

    Такое ощущение, что народ просто натыкается в какой-нибудь мурзилке для хацкеров на тривиальный пример кода VK-бота, у этих хацкеров мгновенно загорается над головой лампочка и начинает жечь. Так жжот, что ни документацию читать ни гуглить не хочется, а хочется сразу запрограммировать идею. После двухнедельных мытарств в поисках ответа на ютубе, в инстаграмме и твиттере методом скролла хакерских тредов с котиками кто-то подсказывает юному гению про этот чудесный ресурс, где всем бесплатно всё делают.
    Вот и рождаются такие вопросы "Я ХЗ что-то я вот тут вот написал" (списал) "но не работает, что делатькакбытьпамагите!, чтотасламалося". И ни ошибки, ни сути проблемы, ничего не ясно. Ясно только что автор вопроса скорее всего не вдупляет совершенно НИЧЕГО, и ему придётся рассказывать про арифметику, про то как сложение делать, что такое цифры и какие бывают буквы, чтобы он что-то понял. Ну или чудом угадать что ему, всё таки, надо и написать работающий код, чтоб отстал и ушел.
    Ответ написан
    3 комментария
  • Как сделать dict из list?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    key = ['a', 'b', 'c']
    # есть три list данных:
    data = [
        [1],
        [4,5],
        [2, 6, 8],
    ]
    print(dict(zip(key, data)))
    #{'a': [1], 'b': [4,5], 'c': [2,6,8]}
    Ответ написан
    1 комментарий
  • Как привязать прогресс бар к проверки файлов на диске os.walk()?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ну вот объясните, или это тут надо отдельным вопросом задавать?
    Почему я нашел готовое разжеванное решение прямо по формулировке вашего вопроса в гугле в виде ссылки на отличную подробную статью?
    https://habr.com/ru/post/81532/
    Почему я нашел, а вы нет?
    Ответ написан
    Комментировать
  • Как решить задачу?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    В питоне строки - это объекты и у этих объектов есть встроенные функции (называются они "методы").
    Так вот, у строки есть такие методы:
    > '1234567'.isdigit()
    True
    > '123.45.67'.isdigit()
    False
    > '1234567'.isalpha()
    False
    > 'Smith'.isalpha()
    True

    Только вам бы следовало проверять еще и длину и вообще все условия, озвученные в задании.
    Дальше думайте. Вы должны пройти этот путь самостоятельно.
    Попробуйте собрать введённые строки в список и пройти по нему циклом. В цикле вы можете сделать проверки и распределение строк по соответствующим переменным.

    Вообще сейчас выскажу довольно "капитанскую" мысль, но такие задания обычно не дают без предварительной информации как их делать. Вы видимо пренебрегли теоретической частью. То, как вы пытаетесь решить эту задачу, даже если вам удастся это, будет неправильным решением. Слышали выражение "ректальная тонзилитомия"? Могу ошибаться, но кажется это когда гланды удаляют через задницу. Вот даже если это бы удалось, делать так неправильно, а вы в своём коде именно этим, фигурально выражаясь, и занимаетесь.
    Я понимаю, что вы хотели здесь получить готовое решение с пояснениями, но это не добавит вам знания и не заменит тот теоретический курс, на который вы, видимо, забили.
    Ответ написан
    7 комментариев
  • Почему так работает SQL выборка из поля типа float?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Я отвечу чуть более развёрнуто.
    Дело в том, что float хранит дробные числа в двоичном формате.
    Кроме двоичных мы работаем с десятичными числами и тут возникает проблема.
    К примеру, число 1/3 (одна третья) в десятичной системе счисления будет записываться как бесконечная (периодическая) десятичная дробь 0.33333(3). А вот в троичной системе счисления это число запишется конечной троичной дробью: 0.1 (читается, как "ноль целых и одна третья").
    По такой же схеме у нас десятичное число 0.5 (ноль целых и пять десятых) равно в двоичной 0.1 (ноль целых и одна вторая). 0.25 [10] == 0.01 [2]; 0.75 [10] == 0.5 [10] + 0.25 [10] == 0.11 [2].

    А теперь, внимание, на десятичное число 0.2 (ноль целых и две десятых), для перевода в двоичную систему счисления нам нужно сложить это число из членов двоичного ряда:
    ==1/2, 1/4, 1/8, 1/16, 1/32, 1/64, 1/128, 1/256, 1/512, 1/1024 ...
    0. 0    0    1    1     0     0   ( 1      1      0      0 )

    В круглых скобках обозначен период двоичной дроби. То есть двоичной дробью в конечном количестве знаков после двоичной запятой задать десятичное число 0.2 (ноль целых и две десятых) НЕЛЬЗЯ!

    Если у нас есть лишь конечное количество знаков, то ими представить в точности 2/10 в двоичной системе счисления одним числом невозможно.
    Чему конкретно получится равным "обрзанное" (округлённое конечно) число будет зависеть от того по какой именно двоичный разряд мы его округлили.

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

    Итак, чтобы сравнить два числа на равенство, скажем a и b, нужно выбрать некое e=0.0000001, которое будет определять точность сравнения и проверять условие: abs(a-b)<e - модуль разности сравниваемых чисел должен быть меньше выбранной точности. Если условие соблюдается, то числа считаем условно равными с заданной точностью. Если нет - не равными.

    Добавлю, что, как отметили выше, цены и денежные суммы вообще в формате с плавающей точкой хранить "плохая примета"=). Для этого есть специальные форматы, которые не создают таких сюрпризов при переводе из/в десятичную систему.
    Вот замечательная статья на хабре про это: Потеря точности из Double во Float или «Куда пропа...
    Ну и еще есть: Что нужно знать про арифметику с плавающей запятой, Наглядное объяснение чисел с плавающей запятой, Разбираемся в числах с плавающей точкой, и т.д.
    Ответ написан
    Комментировать
  • Как вывести спираль из звездочек с разделителем на Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    n = 16
    
    c = {True: '*', False: ' '}
    r = list(range(n//2))
    for sy in (1, -1):
        for y in r[::sy]:
            s = []
            for sx in (1, -1):
                for x in r[::sx]:
                    d = -2 if (sx, sy) == (-1, 1) else 0
                    s.append(c[x >= y+d and not y % 2 or x < y+d and not x % 2])
    
    
            print(''.join(s))

    Вот пример для четного N.
    Ответ написан
    Комментировать
  • Что посоветуете для изучения Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Странно, что имея опыт разработки на других языках вы задаёте такой вопрос.
    Если вам обязательно нужна книга, то, вот, прочитайте Луца по диагонали.
    Структуры приложений разные для разных применений, но в целом структуру пакета определяет setuptools. Это встроенный инструментарий работы с пакетами.
    Оптимальные структуры имеет смысл искать на гитхабе по ключевым словам "project template" и "cookiecutter".
    "Тиражирование" модулей через https://pypi.org/.
    Для тестирования есть несколько встроенных альтернатив и миллион сторонних. Выбирайте любую. Для начала не важно.
    Как вы знаете для Java есть много всего типа maven, а для python есть что-то подобное? Или, так как язык не компилируемый, для него такого не нужно?

    Все ваши потребности на первых порах слихвой покроют setuptools, pip, и github пайплайны.
    На вашем уровне, наверно, рано лезть глубже. Придёт со временем.

    Из IDE: Pycharm (вполне достаточно бесплатной Community Edition) и Visual Studio Code.
    Ответ написан
    Комментировать
  • Как указать путь к каталогам за пределами каталога в котором нахожусь?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Путь может быть абсолютным или относительным. Различать их просто: абсолютный путь начинается с '/', а относительный нет.
    Есть специальный виртуальные каталоги везде в файловой системе: ".." - он означает каталог верхнего уровня относительно текущего; '.' - текущий каталог.
    './media/user/Server/data/users/'+DirName+'/posts' - это у вас относительный путь. Он указан относительно текущего.
    Если у вас media лежит в '/root/subroot/media...', то
    Абсолютный путь у вас будет: /root/subroot/media/user/Server/data/users/
    Ответ написан
    6 комментариев
  • Время от времени отключается Bluetooth мышь?

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    В питоне функции и классы - это тоже объекты. У них есть особый синтаксис объявления, после объявления эти объекты доступны по имени как и любой другой объект с именем (переменная).

    Лирическое отступление. В питоне переменные работают не так же как в Си. В Си переменная - это ящичек, а значение в нём как бы лежит. В питоне объект - это как чайный пакетик, а имя как ярлычок на ниточке. Можно к одному пакетику несколько ярлычков привязать, то есть несколько имён. В Си это достигается указателями. В питоне, получается, всё "как бы указатели" и разыменовываются они неявно, под капотом. Но сейчас не о том...

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

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

    Итак:
    my_object_instance = MyClass()
    my_object_instance = my_decorator1(my_object_instance)
    my_object_instance2 = my_decorator2(my_object_instance)

    В этом примере дважды задекорирован объект. Здесь при первом декорировании оригинал нам, судя по коду, не нужен (или декоратор его не менял, смотря что за декоратор, может просто зарегал где-то в списке...), а при втором декорировании нам остаётся доступным и оригинал и задекорированная версия.

    Пока всё просто и не ясно причем тут собаки и чем эти декораторы отличаются от обычных функций. На второй вопрос ответ прост -- ничем особенным. Просто мы такой смысл вкладываем в эти функции. Такая абстрактная концепция.

    В Питоне есть синтаксический сахар, чтобы декорировать объявления функций и классов.

    Иногда хочется наглядно модифицировать или зарегистрировать в каком-то глобальном реестре класс или функцию, но объявление при этом сильно менять не хочется.
    Можно так:
    my_pretty_functions = {}
    
    def my_deco(decorated_function):
        '''Это декоратор, который не меняет декорируемый объект, 
        лишь регистрирует его в словаре'''
        my_pretty_functions[decorated_function.__name__] = decorated_function
        return decorated_function
    
    def my_function(x):
        return x ** 2
    
    # вот декорирование вручную, без сахара
    my_function = my_deco(my_function)
    
    # Но в питоне же есть сахар для этого, и вот альтернативный вариант декорирования:
    @my_deco
    def my_other_function(x):
        return x ** 3

    Эти два способа декорирования работают одинаково, просто "собака" - это синтаксический сахар.

    Не все декораторы такие безобидные. Декоратор может вернуть совершенно другую функцию или вообще что угодно. Тогда это что угодно окажется под оригинальным именем функции, а оригинальная функция вовсе может быть потеряна (выброшена) или засунута в новую с помощью так называемого "замыкания".

    Но замыкания - это отдельная большая история, а узнать об этом вы сможете, к примеру, на занятиях по питону на otus.ru, где я скоро, надеюсь, стану преподавать=).

    Спрашивайте сто не понятно. Я тут не рассмотрел даже малой доли от разных способов применения декораторов в народном хозяйстве. Надо будет состряпать специальный курс про это.
    Ответ написан
    Комментировать
  • Как спарсить файл в bash и сгенерировать список IP?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    - как-то заставить этот скрипт отрабатывать раз в сутки (например) средствами cron

    sudo crontab -e
    И добавьте туда @daily ивоттутстрокуизсоседнегорешения
    Ответ написан
    2 комментария
  • Как редактировать изображение без скачивания на пк?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    в коде, который запущен не на пк, а на хостинге

    Нет существенной разницы. У вас, разве что, может не быть прав записи в файловую систему, или отдельные её части.
    Но ничто не мешает загрузить изображение миниатюры по ссылке прямо в память не сохраняя его в файл. Тут же в памяти вы можете создать картинку черного квадрата, вставить туда миниатюру, вписать текст и не сохраняя отправить в http-запросе.
    Если у вас есть изображение в виде байтов, которые не загружены из файла, а загружены из интернета, то нет никакой разницы.
    Вы эти байты можете отдать конструктору картинки и получите объект-картинку со всеми вытекающими. Если ваша библиотека работы с картинками умеет загружать только из файла, то, ок, создайте на основе вашей строки байт объект: io.BytesIO:
    f = io.BytesIO(b"some initial binary data: \x00\x01")
    ff = open('file_contained_same_bytes', 'rb')

    f и ff по интерефейсу не будут различаться, вы можете загрузить картинку как из первого, так и из второго.
    Ответ написан
    Комментировать
  • Что использовать для получения TCP-пакетов в python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вот простой пример.
    Для описанных вами задач скорее всего не потребуется asyncio.
    Конечно, может быть ваше устройство шлёт данные с огромной скоростью и не каждая БД успеет их принимать, или данным в потоке нужна нетривиальная и трудоёмкая обработка, а может быть их требуется обогащать доп-запросами к другим API, тогда вам, может быть и пригодится асинхронная работа. Но, чтобы сделать окончательный вывод, нужно больше подробностей.
    Ответ написан
  • Сервис для создания своих карт?

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    r = requests.get('https://api.cas.chat/check?user_id=' + str(message.from_user.id))
    print(r.text)


    Если обратиться к тексту через квадратные скобки, то подразумевается в скобках индекс символа: 'qwerty'[3]=='r'
    TypeError: string indices must be integers
    Это означает что индекс должен быть целым числом, а не строкой 'ok'
    Ответ написан
    3 комментария
  • Как защитить код если предлагают помощь с разработкой?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Стоит ли давать и какие есть варианты защитить код?

    Нет вариантов защитить код, если вы отдадите его исходники.
    Вы можете сделать систему плагинов и дать исходники её интерфейсов.
    Поднимите тестовый инстанс вашего бота и заведите отдельный репозиторий с плагинами в открытом доступе.
    Люди смогут делать плагины а ваш тестовый стенд будет подтягивать релизы из мастер-ветки.
    Если всё хорошо, то плагины можно забирать в основную инсталляцию.
    Для бота плагины можно делать в виде дополнительных обработчиков тех или иных событий.
    Ответ написан
    1 комментарий
  • Как подключить скрипт PYTHON в Windows?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Сэкономлю вам время.
    Судя по вашему вопросу (наивности и "полноты" его постановки, формулировкам), у вас ничего не получится как бы полно вам ни рассказали здесь о методах, которыми можно было бы достичь желаемого. Для вас это будет слишком сложно. Очень многому, слишком многому придется научиться, прежде чем задавать такой вопрос с надеждой что-то полезное сделать на базе ответов.
    Ответ написан
    Комментировать