• Оптимальный формат хранения изображения в текстовом виде?

    Griboks
    @Griboks
    Оптимальный вариант - это открыть бинарный формат в блокноте. Конечно, некоторые символы будут странно выглядеть, но зато это самый оптимальный вариант.
    Ответ написан
    Комментировать
  • Сколько запросов в секунду может обрабатывать telegram бот на long_polling?

    vabka
    @vabka
    Токсичный шарпист
    Когда стоит задуматься о переходе на webhook?

    В принципе изначально следует задуматься о переходе на вебхук. long polling - это больше про разработку, чем про прод.

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

    @Dementor
    программист, архитектор, аналитик
    Я так понимаю, у полей нужно прописать XML_ID, но 1с-ник говорит, что в 1с у этих полей нет таких кодов

    Тогда пропишите те, которые есть! У вас уже есть специалист, которому вы платите, зачем вы пишете тут вопросы? Обычно из-за "а мне в интернетах совсем по другому сказали" хаос на проекте только усугубляется.
    Ответ написан
    Комментировать
  • Стоит ли изучать сразу много разного или лучше сперва углубиться во что-то одно?

    meowto16
    @meowto16
    Делаю штуки
    Если программирование только хобби - можно учить что угодно и как угодно
    Но на работе от вас не потребуют веб-разработку и C#, Unity одновременно)
    Ответ написан
    Комментировать
  • Telegram Bot: требует ID пользователя, где его взять?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Дополню Евгений Колотилин - даже если Вы подставите id из внешнего источника - пользователь не увидит сообщений от бота, пока сам ему не напишет впервые.
    Ответ написан
    Комментировать
  • Использовать методы или самому писать функции?

    @dan_kosenko
    Node.js Developer
    В каких ситуациях есть смысл:
    • Улучшить свои знания. Допустим самому попробовать реализовать какие-то алгоритмы, чтобы лучше понимать как работает поиск, сортировка, обход древовидных структур и так далее;
    • Специфичные требования. Например вам нужна высокая производительность, ваш основной стек на Back-end - это Node.js. Так вышло, что вам не хватает производительности и поэтому вы берёте и переписываете нужный NPM пакет на на c++;
    • Раз коснулись темы NPM, то другой пример. В NPM миллионы пакетов на любой случай жизни и так бывает, что нецелесообразно тянуть зависимость ради пару десятков строчек кода.

    Когда НЕ стоит изобретать велосипед:
    • Проверенные алгоритмы. Например не стоит в продакшене самому писать библиотеки для работы с шифрованием, если конечно у вас не стоит такая задача. Самописная криптография грозит тем, что вы можете допустить ошибку в шифровании и получить уязвимость, а аудит вашего кода скорее всего не будут проводить десятки экспертов.
    • Придумывать новые фреймворки. Тут просто без должного опыта ничего хорошего не получится.
    • Ограниченные ресурсы и время. Программисты чаще всего работают на кого-то и им выделяются конкретные ресурсы и время на проект. Создание/проектирование новых библиотек, фреймворков и компонентов занимает достаточное большое количество времени. И таким образом вы просто не выполните поставленные задачи, если будете придумывать велосипеды.

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Значит сразу скажу что у меня для вас - плохие новости. DynamoDb как и многие ему подобные облачные key-value решения расчитаны на выборку по сету ключевых полей. Обычно это хеш-ключ и ключ диапазона. В этом случае вы платите немного. Если вдруг вы решили выбирать по не-ключевым полям это уже будет другое тип запроса. Называется scan. Его можно писать на любом языке разработки но суть в том что будет выбрана ВСЯ таблица. Если она большая - то charge за текущий период вас неприятно удивит. Фиксить это почти невозможно. Это неправильный дизайн и неправильное использование AWS Dynamo. Вам следует вообще отказаться от использования Dynamo и думать над тем как НЕ делать сканов в будущем. Можете теоретически создать индекс по хвосту от строки. Но индекс с точки зрения Динамо - это копия таблицы просто по другому расположенная и реплицируемая. Вобщем не советую тоже.
    Ответ написан
    3 комментария
  • Заслуживает ли проект крестики нолики быть в портфолио?

    Anopeng
    @Anopeng
    Веб-программист, учу фронт и бек
    Если просто крестики-нолики, то нет. Слишком просто, да и в интернете полно примеров. Но если ты сделаешь какие-то необычные крестики-нолики, то вполне.

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

    Или дополнительно сделай искуственный интеллект, который будет играть в качестве второго игрока - тоже хорошее решение.

    И не обязательно увеличивать размер поля или создавать бота - придумай что-то оригинальное! Например, добавь третьего игрока, чтобы это были не просто крестики-нолики, а... Крестики-нолики-галочки :D

    Но на одних классических играх, у тебя мало шансов создать привлекательное портфолио. Создай какое-нибудь сложное приложение на JS (идей в интернете полно), например аналог планировщика задач Jira. Или, еще лучше, придумай что-то своё и реализуй.

    Фронтенд - это сложная профессия. Тебе нужно выполнить очень много работы, чтобы стать профессионалом. Если ты думал, что достаточно написать 5-15 проектов, то тебе точно не сюда. Желаю удачи :D
    Ответ написан
    2 комментария
  • С какой целью при вызове bot_token телеграма может быть использован метод os.environ.get('BOT_TOKEN')?

    AlexNest
    @AlexNest Куратор тега Python
    Работаю с Python/Django
    Этот код получает токен из Переменных окружения. Нужно, в т.ч. чтобы можно было выкладывать код в открытый доступ (или передавать другим программистам) и не давать доступ к подобным, конфиденциальным данным
    Ответ написан
    2 комментария
  • Как юридически правильно оформить биржу фриланса?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Итак открываете ООО, заключаете договор с Киви банком, нанимаете юриста.
    https://freelance.ru/pages/safe-deal.html
    https://freelance.ru/offer.html
    https://freelance.ru/rules.html
    Ответ написан
    Комментировать
  • Может ли Битрикс24 заменить low-code BPM систему?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    есть ли у продуктов вроде ELMA преимущество перед Битрикс24


    Безусловно есть.
    Например Битрикс24 это не low-code BPM система.
    Ответ написан
    Комментировать
  • Как переделать telegram bot под serverless архитектуру?

    Viji
    @Viji
    Associate DevOps Engineer
    В облаке selectel есть возможность запуска бессерверных функций и тебе не надо ходить ни к какому aws.

    https://selectel.ru/services/cloud/serverless/
    Ответ написан
    1 комментарий
  • В чем заключаются архитектурные ошибки моего кода?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    class Calculation():
    
      def __init__(self, calculation):
        #init
        self.calculation = calculation

    Вы сделали класс `Вычисления`, чтобы проводить вычисления, пока проводятся вычисления вычислений над вычислениями, которые вычисляются как аргумент вычислений для вычисления состояния вычислений.

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

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

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

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

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

    Вот тут у вас, очевидно, можно написать проще и без лишних повторений, провоцирующих ошибки:
    if i % self.inflation_indexation_period==0 and i != 0:
            if i not in range(0, self.inflation_indexation_period):
              init_indexation_inflation *= self.sales_init.inflation_indexation
            else:
              init_indexation_inflation = 1
            inflation_indexations.append(round(init_indexation_inflation, 5))
          else:
            inflation_indexations.append(round(init_indexation_inflation, 5))

    Лучше так:
    if i % self.inflation_indexation_period==0 and i != 0:
            if i in range(self.inflation_indexation_period):
              init_indexation_inflation = 1
            else:
              init_indexation_inflation *= self.sales_init.inflation_indexation
    
          inflation_indexations.append(round(init_indexation_inflation, 5))

    Функция get_inflation_indexations у вас имеет опасный побочный эффект. Она имеет префикс get_ но модифицирует контекст объекта. Это кэширование? Чем обусловлено такое поведение? Если такое делается "на всякий случай". то это плохая практика неявного внедрения побочного эффекта. Если нарочно, то такое надо документировать и корректно называть и описывать метод в докстринге.

    Опять же, get_inflation_indexations и get_value_indexations очень похожи по коду. Это повод вынести такую логику в отельную функцию, она будет проще и её будет проще тестировать!
    А у вас эти функции отличаются именами атрибутов внутри и магическими константами, которые в коде делать не хорошо, тем более без пояснений, тем более в кусках такого похожего кода.

    Перестаньте использовать i в качестве переменной для итерирования нетривиальных сущностей, отличных от протсого счетчика. i - это индекс. Используйте человеко-понятное название переменной для этого!

    Используйте декоратор итераторов enumerate. Это сделает код более прозрачным и читабельным, чем код с параллельными счетчиками. Увидев enumerate читатель кода сразу поймёт, что это простой счетчик итерируемых сущностей, что не нужно ожидать скачков этого счетчика и каких-то сложных корреляций.

    А вот здесь вообще всё плохо:
    count = 0
        revenue_list = []
        for i in total_price:
          revenue = i*total_value[count]
          revenue_list.append(revenue)
          count+=1

    count - это "количество", а вы его используете как "индекс" и никак иначе!
    i - это индекс, а вы туда суёте фактически цену!
    У вас total_price и total_value параллельные одноразмерные списки, их нужно состегнуть с помощью zip и пронумеровать с помощью enumerate (если надо, а здесь не надо!).
    Весь этот кусок понятнее, проще, короче и более питоничнее записать в такой форме:
    revenue_list = [price * value for price, value in zip(total_prices, total_values)]


    Итого вся вот эта громоздкая плохо читабельная функция:
    def get_revenue(self):
        '''Получить итоговую выручку'''
        total_price = []
        for i in self.get_inflation_indexations():
          price = self.sales_init.price*i
          total_price.append(price)
    
        total_value = []
        for i in self.get_value_indexations():
          value = self.sales_init.sales_volume*i
          total_value.append(value)
    
        count = 0
        revenue_list = []
        for i in total_price:
          revenue = i*total_value[count]
          revenue_list.append(revenue)
          count+=1
    
        return revenue_list

    Легко и читабельно для питониста заменяется на вот такую:
    def get_revenue(self):
        '''Получить итоговую выручку'''
        indexations = self.get_inflation_indexations()
    
        init_price = self.sales_init.price
        total_prices = [init_price * x for x in indexations]
    
        init_volume = self.sales_init.volume
        total_values = [init_volume * x for x in indexations]
    
        return [price * value for price, value in zip(total_prices, total_values)]


    И везде не стоит использовать параллельные счетчики, используйте итераторы, распаковку, зипы, енумервторы и функциональный стиль, ведь он сокращает код и делает его проще.

    Что это за ерунда:
    def get_interest_expenses(self):
        '''процентные расходы'''
        interest_expenses_list = []
        return interest_expenses_list


    Зачем много раз считать одно и то же целиком, чтобы взять только очередной кусочек из всего посчитанного?!
    Это вообще бред. Учитесь основам алгоритмизации и не надо программировать на питоне как не на питоне.

    Вот такое вообще жесть: self.get_revenue()[count]
    Отчего не сохранить в промежуточную переменную?!

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

    Удачи.
    Ответ написан
    3 комментария
  • Как исправить причину стоп телеграм бота на питон?

    @IKIQ
    Телеграм для уменьшения нагрузки на свои серверы периодически банит лонгполлинги
    Решение - или автоматически перезапускать бота, или, что предпочтительнее, использовать вебхуки

    Вот есть вопрос по теме https://qna.habr.com/q/417341
    Ответ написан
  • Как построить график по массиву с данными?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Мне кажется, вы плохо искали. Первое, что попалось в гугле, по-моему, вполне подходит.
    Ответ написан
    Комментировать
  • Как правильно создать условие в функции?

    AlexNest
    @AlexNest Куратор тега Python
    Работаю с Python/Django
    Собственно, текст сообщение будет всегда будет строкой, даже если в нем будет просто цифра, поэтому стоит проверить, является ли все символы в нем - цифры
    Ответ написан
    Комментировать
  • Как правильно создать условие в функции?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    message.text.isalpha()
    Или
    message.text.isdigit()
    Ответ написан
    1 комментарий
  • Как сделать, чтобы при нажатии кнопки выводился текст на дисплей?

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

    iggor-markin
    @iggor-markin
    Python Developer
    В документации есть пример работы с файлами. Это находится на главной странице репозитория. А вообще, уже отвечали.
    # sendDocument
    doc = open('/tmp/file.txt', 'rb')
    tb.send_document(chat_id, doc)
    tb.send_document(chat_id, "FILEID")
    Ответ написан
  • Что сейчас с вакансиями Front-end?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Странная я бы сказал. Я не снимал лычку что работаю в компании, но за последний месяц 4 холодных звонка.
    Разошлись по ценнику. я начинаю от 240 тр. или от 200 по ТК.
    И в тот же месяц ок 350 на фрилансе. Понятно что тут я сам себе директор, программист, бизнес аналитик и прочее. Но в общем жизнь в ати есть и очень активная
    Ответ написан
    4 комментария