Задать вопрос
  • Как правильно обрабатывать ошибки при чтении файла?

    @Everything_is_bad
    освой уже гугл, через который бы ты узнал про with open() и перестал бы мучатся с close
    Ответ написан
    Комментировать
  • Как правильно обрабатывать ошибки при чтении файла?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Использовать with.

    try:
        with open('test.txt', 'r') as file:
            print("File exists and is accessible.")
    except FileNotFoundError:
        print("File does not exist.")
    except PermissionError:
        print("File exists but cannot be accessed.")
    Ответ написан
    Комментировать
  • Как правильно обрабатывать ошибки при чтении файла?

    Vindicar
    @Vindicar
    RTFM!
    Тебе правильно написали про with, а я добавлю в чём проблема:
    # допустим, это наш код
        try:
            file = open("config.json", "r")  # исключение может произойти тут
            config = json.load(file)  # или тут
            print(config)
        except FileNotFoundError:
            print(">>> Файл не найден!")
        except PermissionError:
            print(">>> Доступ запрещен!")
        finally:
            print(">>> Файл закрылся!")
            file.close()

    У тебя две разные ошибки, на которые требуются разные реакции.
    Если исключение произойдёт в open(), то переменная file не будет создана, так как до присваивания дело просто не дойдёт. Если же исключение произойдёт в load(), то переменная file будет существовать, файл бдует открыт, и его нужно будет закрыть. Таким образом, тебе нужно или обработать эти ошибки отдельно, или использовать другие средства (вроде оператора with) для закрытия файла.
    Ответ написан
    Комментировать
  • Каким способом лучше запечатать окружения для разных стеков с минимальными потерями производительности?

    @d-stream
    Готовые решения - не подаю, но...
    ну собственно даже без докера это разруливается
    начиная от javapath для разных версий jdk/jre
    и заканчивая строго прописанными явно зависимостями или packagelock

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

    ну либо сделать свой образ уже набитый всем и собирать в нём - тогда ну почти незаметно будет
    Ответ написан
    2 комментария
  • Какой посоветуете фреймворк (с роутингом, orm и мидлваре) для Golang?

    Не рекомендую даже пробовать.
    В Go не принято использовать такое. Какие-то люди пишут и ORM (например Gorm), и различные роутеры, но это пользуется всё меньшей популярностью. В результате вы не получите много информации, когда вам понадобится решать какие-то проблемы с этими монстрами.
    Я когда-то приходил в Go с навыками Symfony + Doctrine ORM, и тоже не понимал, как они без этого живут. И в результате понял, что в подавляющем большинстве проектов эти монстры просто не нужны и становятся обузой, когда проект развивается. Да, поначалу всё хорошо и быстро, а когда в проект приходят новые сложные фичи, начинается борьба не только с этими фичами, но и с самим фреймворком, и, особенно, с ORM. В результате получается Франкенштейн, пляшущий на костылях. Всё это еле ворочается, а Доктрина выплёвывает такие запросы, что их даже читать страшно.

    P.S. Если вот всё же хотите пойти против системы и пользоваться наворотами, то можно рассмотреть связку Gin + Gorm
    Ответ написан
    3 комментария
  • Как сконфигурировать Nginx для https сервера?

    @99insania99
    В чем смысл делать использовать https в скрипте, а потом перед ним ставить прокси https nginx'ом? Получается шифруем, дешифруем, шифруем, дешифруем... nginx https -> http node.js
    Ответ написан
    5 комментариев
  • Что предпринять, если не работает сайт через СloudFlare (на 31.03.2025)?

    mr_nu11
    @mr_nu11
    у меня 50 сайтов отпало, люди ругаются, думал слазить по старинке на letsencrypt! сайт letsencrypt хостится на cloudflare и это замкнутый круг, сервер попросту не может отправить запрос на регистрацию и выдачу сертов. Делай сервак в РФ говорили они! ага щас, был бы сейчас на забогорном серваке, то и проблем не знал certbot и перекатка всех NS A. Пробовал ZeroSSL он не выдает RU доменам.

    по итогу, проштудировал аналоги в рф, ценник за услугу от 9к в месяц, типа ддос гвардов. Проштудировал забугор, тоже накладно или просят вязать карту. Даже иранский сервис пробовал зарегать, по итогу смс не приходит и в том числе и на sms-activate :)))

    это просто деверсия малого бизнеса. Все сайты с клаудами лежат! с VLESS vps никаких проблем, несколько дней назад вбанили только один из vps ip, но я все порты позакрывал или сменил, навесил фильтры всякие, сменил SNI на telegram org и заблокировать не могут)

    куда можно перекатиться чтоб letsencrypt накатывался автоматически и такая же проксификация была как у cf
    Ответ написан
    9 комментариев
  • Как сделать на сайте цитаты, как в Telegram?

    взять тег <blockquote> и стилизовать.
    Ответ написан
    Комментировать
  • Что предпочтительнее в python - проверять значение в словаре или обработать исключение исключение?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы можете сами произвести замеры, но ставлю на то, что быстрее окажется проверка по словарю, поскольку она делается за ~O(1) благодаря хешированию.
    Однако я бы предложил чуть более эффективню схему:
    D = dict()
    NOTFOUND = object()
    
    def f1(x):
        result = D.get(x, NOTFOUND)
        if result is NOTFOUND:
            result = D[x] = long_calculation()
        return result


    Не поленитесь (как я), сделайте замеры. Всем тут будет интересно.
    А ещё в питоне как-то не принято экономить на спичках в ущерб чтаемости и прозрачности кода.
    Но если всё как следует "посахарить"... Лучше всего такое кэширование смотрится в виде декоратора.

    UPD:
    Забавно. Я ошибся и с исключением действительно выходит быстрее. На это указал уже автор вопроса, а я на всякий случай пересчитал, причем по отдельности для прогрева, для повторного взятия и для неполучения из прогретого хеша.

    import time
    from math import tan, atan
    import timeit
    
    
    NOTFOUND = object()
    
    
    def long_calculation(x):
        return atan(tan(x) / 2)
    
    
    def f1(x):
        if x not in D:
            D[x] = long_calculation(x)
        return D[x]
    
    
    def f2(x):
        try:
            return D[x]
        except:
            D[x] = long_calculation(x)
        return D[x]
    
    
    def f3(x):
        result = D.get(x, NOTFOUND)
        if result is NOTFOUND:
            result = D[x] = long_calculation(x)
        return result
    
    
    FUNCS = (
        (f1, 'get triple'),
        (f2, 'except'),
        (f3, 'get once'),
    )
    
    
    def work(f, gap=0.1, count=1000):
        for x in range(0, count):
            f(x + gap)
    
    
    D = {}
    number = 10000
    
    for func, descr in FUNCS:
        print(f'{func.__name__} ({descr}):')
        print(f'  Cache empty:', timeit.timeit(f"work({func.__name__})", setup=f'D=dict()', globals=globals(), number=number))
        print(f'  Total reuse:', timeit.timeit(f"work({func.__name__})", setup=f'D=dict(); work({func.__name__})', globals=globals(), number=number))
        print(f'  Total miss :', timeit.timeit(f"work({func.__name__})", setup=f'D=dict(); work({func.__name__}, gap=0.2)', globals=globals(), number=number))

    И вот результат:
    f1 (get triple):
      Cache empty: 2.8940897800493985
      Total reuse: 1.7486431139986962
      Total miss : 1.6964515489526093
    f2 (except):
      Cache empty: 1.2670072519686073
      Total reuse: 1.2622331579914317
      Total miss : 1.2547212480567396
    f3 (get once):
      Cache empty: 1.6983374420087785
      Total reuse: 1.6465996010228992
      Total miss : 1.6999219709541649
    Ответ написан
    2 комментария
  • Что предпочтительнее в python - проверять значение в словаре или обработать исключение исключение?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Easier to ask for forgiveness than permission. This common Python coding style assumes the existence of valid keys or attributes and catches exceptions if the assumption proves false. This clean and fast style is characterized by the presence of many try and except statements. The technique contrasts with the LBYL style common to many other languages such as C.

    https://docs.python.org/3/glossary.html
    Ответ написан
    1 комментарий
  • Говорят,что не надо знать матем. при изучении программирования, но почему все задачи математические?

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

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

    В универах и остальных заведениях подобного характера математику и программирование скрещивают для того чтобы будущий программист научился на самом базовом уровне выстраивать алгоритмы решения задачи. Грубо говоря, шаг 1 + шаг 2 + шаг 3 + шаг 4 + шаг 5 = результат. Если тебе чисто рассказывать про переменные, циклы, массивы и т.д. ты не поймешь нахрена это все надо и как это использовать чтобы зарабатывать деньги. Если тебе с нулевой дать решать бизнес задачи то это только лишнее грузилово мозга в и так не совсем простой сфере. Поэтому и используют математику как самое простое где можно показать как использовать те или иные конструкции в языках программирования и научить склеивать это все так чтобы получить результат требуемый.
    Ответ написан
    Комментировать
  • Говорят,что не надо знать матем. при изучении программирования, но почему все задачи математические?

    Maksim_64
    @Maksim_64
    Data Analyst
    1. Способов изучать программирование множество, большинство не требуют чего то большего чем школьная программа.

    2. На работе математические требования зависят от области применения.

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

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Потому что эти задачи придумали те, кто любит раздувать собственную важность и претендовать на обладание сакральным знанием. Попробуйте сменить источник учебного материала.
    Ответ написан
    Комментировать
  • Регистрация по номеру телефона?

    @knigaman
    Первый запрос = принимаем на сервере номер телефона, генерируем токен (случайная строка длиной, предположим, 64 символа - цифры, буквы большие и маленькие), отправляем его на клиент. Генерируем код доступа, отправляем его смской на телефон. В зависимости от логики можем и не отправлять (если допустим у нас метод для логина а такого юзера еще нет (он еще не зарегистрирован)).

    Второй запрос = отправляем с клиента токен (тот 64 символьный полученный от сервера) и строку с кодом из смс. Проверяем на сервере токен и код из смс, если все ок - пускаем в аккаунт.

    Примечания:
    1) токены и сами попытки входа должны жить определенное количество времени, предположим 5 минут.
    2) попытки ввода кода (неправильные вводы) должны быть ограничены разумным числом (ну допустим 5 попыток)
    3) если можно то лучше код сделать длиннее - хотя бы 6 цифр, а лучше 8 и более.
    4) попытки входа в аккаунт можно ограничить, но тогда будет можно абузить эту "фичу" и блокировать вход чувакам, тут выбираем меньшее из зол исходя из бизнес требований
    5) можно экономить на смсках и доставлять код в последних цифрах номера / голосовой озвучкой, отправлять в вк, ватсап, телеграм, вайбер

    500 айкью примечания для кое какой защиты от слива бюджета:
    1) можно юзать капчу (можно не всегда а когда начинается аномалия по отправке кодов - всплеск количества отправок)
    2) как уже и говорил разделение входа и регистрации
    3) ставим бот защиту от какого нибудь сервиса по защите от ддос/бот атак
    4) иногда можно не отправить код а отправить клиенту респонс что код отправлен, если клиент вводит код - скорее всего это атака. человек же запросит код повторно (потому что он тупо ему не пришел)
    5) иногда можно отправить код не сразу а через предположим, 30 секунд - если ввели код раньше - значит что-то не так
    Ответ написан
    9 комментариев
  • Не могу установить OC Kali Linux на click bios 5?

    15432
    @15432
    Системный программист ^_^
    У вас включен Secure Boot, который проверяет цифровую подпись загрузчика на носителе. У загрузчика на флешке подпись отсутствует, что UEFI и сообщает. Для корректного запуска нужно отключить Secure Boot в другом разделе настроек, либо записать на флешку дистрибутив системы с цифровой подписью, которую примет ваш ПК.
    Ответ написан
    Комментировать
  • Когда язык может стать узким местом?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Во-первых, язык влияет на производительность программистов, а не программ. Узким местом может стать платформа, в вашем случае виртуальная машина CPython. Но при разработке сетевого ПО в целом и web-приложений в частности главный тормоз - это ввод/вывод. Издержки на него на порядки превосходят издержки на интерпретацию, так что последняя практически не влияет на производительность. В то же время CPython хорошо справляется с вводом/выводом с помощью Asyncio и способен решать проблему c10k.

    Во-вторых, это зависит от того, что именно делают ваши микросервисы с каждым запросом. Например, для обычного интернет-магазина на очень синхронном Django 300 rps - это вполне обычная нагрузка, о которой не стоит беспокоится, если в команде разработчиков нет умственно отсталых и криворуких.
    Ответ написан
    Комментировать
  • Для каких целей Golang лучше?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    Микросервис в двух словах - это самостоятельная сетевая единица со своим потоком исполнения, своим URI и своим маленьким (как правило REST) API для которой поднимать nginx setup избыточно.
    Ответ написан
    5 комментариев
  • Для каких целей Golang лучше?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Go создавался для простой разработки асинхронных сетевых серверов и в этом блещет. Например написать на нём что-нибудь вроде Nginx сильно проще, чем на C.
    Ответ написан
    1 комментарий
  • В чем смысл использования Golang как веб сервер?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    А теперь возьмите не синтетический тест, а реальную задачу сложнее перекладки json'ов, например, с шифрованием, дайте серьëзную длительную нагрузку и посмотрите латентность по процентилям.
    Ответ написан
    Комментировать
  • В чем смысл использования Golang как веб сервер?

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

    Тесты есть разные, Го примерно идет в ногу с Джавой и Шарпом, особенно в случае многопоточных нагруженных серверов. А если посмотреть сколько он потребляет при этом памяти, то даже выходит вперед по эффективности.

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

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

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