• Необходимо ли выносить docker окружение в отдельный репозиторий?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Правильно - хранить код в одном репозитории.
    На проде не требуется даже иметь гит или что там у вас в качестве системы контроля версий.
    Нужно настраивать CI/CD так, чтобы в контейнер на прод выкатывались только нужные файлы и каталоги, ничего лишнего.
    Очень удобно, когда в девелоперском окружении код работает без докера, но сопутствующие вещи вроде БД и прочих сервисов удобно держать в контейнерах и на девелоперской машине. Так проще развёртывать среду разработки и быстрее вводить сотрудников в процесс. Технически нет особых проблем, чтобы настроить удалённую отладку прямо внутри контейнера. так можно приблизить девелоперское окружение к продовой конфигурации.

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

    Храните всё, что нужно для CI/CD в том же репозитории где код. Там же у вас лежат тесты (не нужные в продакте), вспомогательные скрипты, артефакты тулинга и прочее.
    Поищите, в гитхабе есть много так называемых "КукиКаттеров". Это инструмент, для шаблонизации проектов на разных стеках. Как правило в созданной по такому шаблону заготовке проекта уже есть всё не обходимое для CI/CD.
    Ответ написан
    6 комментариев
  • Почему не запускается .sh по крону?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    В кронтабе надо указывать абсолютные пути и программы, которыми нужно открывать файлы.
    * * * * * /bin/sh /root/script.sh >> /tmp/script.log

    Добавил в пример как сделать, чтобы выхлоп скрипта добавился в файл и вы могли понять что там поломалось и как работает.
    Ответ написан
    2 комментария
  • Какие существуют бесплатные сервисы для расчета расстояний между координатами на карте?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Зачем вам сторонние сервисы? Если на входе координаты, то можно использовать локально либу https://gdal.org/
    Если точки уже в постгресе, то поставьте postgis и там все необходимые функции прямо в базе. Хоть на лету считайте, хоть агрегируйте.
    Могу написать вам лично такой веб-сервис незадорого=)
    Ответ написан
    1 комментарий
  • Запрос в MySQL. Есть идея?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    например так:
    SELECT t.*
    FROM my_table t
    WHERE NOT EXISTS(
      SELECT null FROM my_table t2 WHERE t2.link_id = t.link_id and t2.flag=0
    )

    Можно и с джойном:
    WITH tt AS(SELECT DISTINCT link_id WHERE flag = 0)
    SELECT t1.*
    FROM
        my_table t1
        LEFT JOIN tt t2 ON t2.link_id = t.1link_id
    WHERE t2.link_id is None
    Ответ написан
    3 комментария
  • Как понять [:,: 0] в python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Дополню немного ответ @sergey-gornostaev
    Это срез, вернее даже два.
    Дело в том, что в питоне объекты могут поддерживать протокол __getitem__, этот метод вызывается когда объект употребляется с квадратными скобками справа. Значение, указанное в квадратных скобках, будет передано в качестве аргумента этому методу.
    Тут есть два нюанса:
    В обычном выражении на питоне запятая означает что результат выражения - это кортеж. То. что вычислилось между запятыми, будет элементами кортежа:
    x=1,2,3
    Второй нюанс заключается в том, что в квадратных скобках питон поддерживает особый такой "синтаксический сахар" называемый срезами (slice).
    Вам действительно лучше почитать про срезы в книге. В общем у среза есть три аргумента и все необязательные. Если аргумента три то срез "под сахаром" выглядит так: 3:10:2 - "с третьего включительно по десятый исключительно с шагом 2".
    Срез 3::2 - означает "с третьего включительно до последнего включительно с шагом 2"
    Шаг можно опустить, по умолчанию он равен 1 и тогда не нужно второе двоеточие. Можно также не указывать и начало среза (типа сначала). Так : означает срез "от начала включительно до конца включительно с шагом 1".
    Такие срезы можно указать через запятую.
    Фактически фрейм - это трёхмерный массив. Первые два измерения - это высота и ширина, третье - это компоненты цвета.
    В вашем примере операцию проводят над всеми пикселями от верха и до низа, по всей ширине но в определённом канале.

    Правда, почитайте книгу. Такие вещи нужно осваивать последовательно, а не наскоком.
    Ответ написан
    2 комментария
  • Как провести конкатенацию в цикле for PYTHON?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    1. Форматируйте код с указанием языка программирования.
    2. Аккуртано работайте с отступами, иначе и себя запутаете и всех вокруг и работать будетнекорректно.
    3. Приводите полный код, ччтобы не приходилось гадать что там за пределами ваших обрезков. Где присваивается add_url? Может там пусто вообще всегда было и ничего не теряет.
    4. Читайте, блин, внимательно свой вопрос после написания! Вам что лень перечитать? Вот нам не лень ответить, а вам лень читать? Что за наглое неуважение к сообществу? Какая такая "add_ur"? Где она у вас в коде, блин?!
    5. Используйте форматные строки для сборки таких вещей по шаблону. В них сложнее ошибиться и накосячить.

    Резюмирую. Вы крайне невнимательно понадёргали строчек из кода, повставляли как попало, что-то пропустили, отступы поломали, что-то не увидели и теперь хотите, чтобы мы заварили кофе погуще и гадали что у вас там за пределами ваших примеров вы проглядели.

    Замените
    'http://site.com/' + add_url + '?=' + str(i)
    на
    f'http://site.com/{add_url}?={i}'
    для третьего питона или для второго:
    'http://site.com/{add_url}?={i}'.format(i=i, add_url=add_url)


    Печатайте add_url прямо там, где поставляете и рядом печатайте результат подстановки. И вы увидите что у вас там не все гладко
    Ответ написан
    Комментировать
  • Где почитать про подключение подобных DIY камер?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Такой камере нужна плата видео-захвата. К расбери-пи ее (плату) можно подключить через USB. Камера эта аналоговая, как вам выше написали, и у нее нет tx/rx.
    К RPi продаётся вот такая готовая камера, которая подключается отдельным шлейфиком. Но если вы хотите ее подключать на расстоянии от малинки, то вариант не для вас. Купите дешевую USB-веб-камеру.
    Ответ написан
    3 комментария
  • Как найти последнее общие значение во всем содержимом списка и получить номер позиции содержимого в списке?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    from itertools import groupby
    print(
        [
            (k, list(l))
            for k, l in
            groupby(
                enumerate(rows),
                key=lambda row: row[1][-1]
            )
        ]
    )
    Ответ написан
    2 комментария
  • Как получить unicode строку из строки hex?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Есть стандартный модуль bas64. В его составе есть функции b16encode и b16decode.
    Это правильный способ закодировать и раскодировать строку в hex и обратно.
    Если у вас это было сделано иначе, то нужно разбираться как было закодировано.
    Поэтому я и спросил откуда берется строка и просил привести пример побольше, чем то, что вы написали.
    Ответ написан
    Комментировать
  • Можно ли в геттерах создавать новые сущности?

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

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

    Короче, мало данных для конкретных рекомендаций. Однако менять внутреннее состояние объекта в читающем (по логике вещей) методе, а тем более в геттере свойства -- это плохая идея, она ухудшит код.
    Ответ написан
  • Получится ли открыть несколько wget?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Нет подвоха. Можно даже с помощью xargs такое сделать.
    Ответ написан
    Комментировать
  • Как правильно вывести текст из генерации?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Приложите голову к монитору и держите минут 30. Буду считывать исходники. Долго, согласен, но у вас мыслительный сигнал какой-то слабый.
    Ответ написан
    1 комментарий
  • Как обработать страницу скриптом перед отправкой клиенту в nginx'e?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Напишите сервис-обёртку. Этот сервис будет работать локально на другом порту и роутиться nginx'ом на урл нужный. Запросы он полностью проксирует на оригинальный локальный сервис, но ответ обрабатывает перед выдачей клиенту. Можно на каком-нибудь flask'е его замутить.
    Ответ написан
    7 комментариев
  • Обязательно ли использовать асинхронные функции с asyncio?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вся эта асинхронщина нужна для одной единственной цели - не ждать, пока другие процессы работают.
    Если вы можете обойтись без асинхронного кода и вам не мешают блокировки на время доступа к БД, то зачем вам вообще asyncio и aiohttp? Используйте тогда flask и запускайте gunicorn'ом много одинаковых процессов с вашим приложением и работайте в них синхронно.

    Если вы в асинхронном коде сделаете блокирующий вызов к БД и будете ждать пока она ответит, то вы в этом месте убиваете всё полезное, что даёт вам асинхронщина, но оставляете все неудобства, ведь асинхронный код сложнее синхронного, его труднее писать, труднее отлаживать, труднее тестировать, труднее читать.
    Ответ написан
    Комментировать
  • Можно ли подключить Bluetooth мышь с USB-модулем через USB-хаб монитора?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Можете.
    Но скорее всего мышь у вас не Bluetooth. Многие путают Bluetooth устройства и устройства беспроводные с радио-трансмиттером и USB-донглом в комплекте.
    Бывают действительно Bluetooth мыши и клавиатуры, и, если у ноутбука есть встроенный Bluetooth, то такие девайсы можно спаривать без USB-донгла. Однако, если донгл идёт в комплекте, то скорее всего там не Bluetooth.
    Ответ написан
    Комментировать
  • Как доставать id чата из id беседы с помощью регулярки?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Жесть.
    int('2000000179'[1:])
    int('2000000003') - 2000000000

    Решил вырезать другу аппендицит. Слышал, что он растёт внизу живота. Скажите, его можно достать через задницу, если нет, то куда тыкать ножиком?
    Ответ написан
    1 комментарий
  • Как отсортировать словарь по значению?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    {
        key: value 
        for _, key, value in 
        sorted(
            (-int(v), k, v)
            for k, v in
            workers.items()
        )
    }
    Ответ написан
    Комментировать
  • Как организовать работу с mongodb и докером на локалке и сервере?

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

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

    Монга - это schema less БД, которая толерантно относится структуре коллекций и не валится при запросе несуществущих полей. Нужно стараться писать код максимально толерантно к отсутствию наполнения БД.

    В любом случае у вас в БД есть обычно:
    1. структура (в случае монги, как я уже сказал, это не так важно)
    2. справочники
    3. пользовательские данные
    4. производные данные (кэш), которые можно безболезненно удалить, а затем они перегенерятся сами по мере запросов.

    Нужно писать код так, чтобы он всю структуру и технические справочники, отсутствующие в предоставленной БД и необходимые для работы, умел инициализировать сам. Или, на худой конец, сделайте команду или скрипт init_db.

    Если какие-то тестовые данные нужны для тестов или отладки, то можно сделать скрипт, который заполнит БД ими. Это называется фикстуры.

    Никогда не храните код в БД. Всякие хранимые процедуры и прочее в БД - это зло. Код должен быть в системе контроля версий, а БД к этому не приспособлены. Если уж нужны хранимки, то храните их в системе контроля версий и заливайте их в БД при инициализации или миграциями.
    Ответ написан
    2 комментария
  • В чем разница между 'AND' и '&'?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    разница в том, что `and` - это логическая операция, её нельзя перекрыть, то есть нельзя у объекта реализовать метод, который будет реализовывать свой алгоритм вычисления результата операции.
    Связано это со стандартными оптимизациями логических выражений, которые (оптимизации) есть почти во всех языках.
    Грубо говоря операция `and` (конъюнкция) принимает два аргумента (слева и справа) и возвращает значение первого попавшегося ложного или последнего истинного, если все истины.
    Например:
    'one' and 0  # вернёт 0
    '' and 13  # вернёт ''
    3 and 5  # вернёт 5

    Дезъюнкция (or) работает похожим образом, но возвращает первый попавшийся истинный рагумент, или последний ложный, если ложны оба:
    3 or 5  # вернёт 3
    '' or 'hello'  # вернёт 'hello'
    None or 0 # вернёт 0

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

    Операции & | по своему принципу работы ничем не отличаются от сложения, вычитания, умножения, деления, проверки на равенство и неравенство и многих других операций. Все эти операции могут быть перекрыты. То есть написав такой класс:
    Class MyClass:
        def __and__(self, right_argument):
            result = 'что угодно'
            print(f'Фигасе: {self} & {right_argument} -> {result}')
            return result
    
    a = MyClass()
    b = MyClass()
    print('Вот так вот:\n', a & b)

    Фигасе: <__main__.MyClass object at 0x7f3df1aeb588> & <__main__.MyClass object at 0x7f3df1aeb438> -> что угодно
    Вот так вот:
     что угодно


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

    Я просто уверен, что автор вопроса не поймёт до конца то, что я тут объяснял, но, возможно, кому-то пригодится.

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Похоже ботов кинулись писать даже те, кто вообще программировать не умеет. Надеюсь эта волна не докатится до медицины.

    Напишите свою функцию, куда передайте текст и набор слов, а внутри по циклу ищите каждое пока не найдёте первое попавшееся.
    Ответ написан
    Комментировать