Задать вопрос
  • Как узнать свой домашний IP на удалённом VPS в Ubuntu?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    В терминале w, Enter. Третья колонка.
    Ответ написан
    Комментировать
  • Как перевести код с Pascal на Python?

    AlexNest
    @AlexNest Куратор тега Python
    Работаю с Python/Django
    Как перевести код с Pascal на Python?

    Используя синтаксис и встроенные функции (смотреть в офф.доках / "шпаргалке") написать соответствующий код.

    ---
    Допускаю, что найдется кто-то, готовый за вас делать ваши задания, и напишет код, но в текущем виде, поскольку вы не привели попыток решения, вопрос фактически является заданием. А про задания четко написано в п.5.12 правил.
    upd:
    Самые очевидные ошибки
    from math import sqrt
    
    for i in range(289123456, 389123456+1):
        sqrtIT = sqrt(i)
        numDel = 0
        if (round(sqrtIT)) == sqrtIT:
            maxDel = 1
            for j in range(1, round(sqrtIT)): # Раз ошибка
                """
                    Собственно, первый цикл 'for i := 289123456 to 389123456 do begin' вы переделали правильно, почему второй так сделали - непонятно
                """
                round(sqrtIT)
                if (i % j == 0):
                    if maxDel == 1 and j != 1: # вторая ошибка. В питоне - не равно пишется так: !=
                        maxDel = i // j # Еще одна ошибка (из коментов)
                    if (j != round(sqrtIT)): # третья ошибка
                        numDel += 2
                    if j * j == i:
                        numDel += 1
            if numDel == 5:
                print(i, ' ', maxDel)
    Ответ написан
    2 комментария
  • Как сделать чтоб каждый пользователь Ubuntu имел свою php версию?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Не очень понятно что 2 программиста делают на одной рабочей станции. Это прям нищета какая-то.

    По теме топика. На серверах надо поднимать Docker с нужной версией как выше писали.
    На десктопах... ну у меня стоит штук 6 разных версий Java и я не ленюсь переключаться между
    ними через переменные окружения.

    Если разработчику лениво переключать или он просто не разбирается в том что он делает.. то наверное он не нужен на работе.
    Ответ написан
    3 комментария
  • Какая ОС самая быстрая для работы торгового робота на С++?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Мне кажется что ты не тем занят. Нужно очень сильно постараться чтобы ОС стала узким местом в бизнес логике.

    Собери данные профилирования.
    Ответ написан
    Комментировать
  • Форматирование смонтированного диска?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Что будет с диском 1, если его смонтировать в папку диска 2 и затем отформатировать диск 2?

    Нельзя стандартными средствами "отформатировать" "диск" который примонтирован, а "диск 2" должен быть примонтирован, чтобы в его "папку" можно было смонтировать "диск 1".
    Если наплевать на условности и зафорсить форматирование на уровне блочного устройства, то с примонтированной файловой системой на диске 2 всё будет плохо, а диску 1 ничего не будет.
    Ответ написан
    Комментировать
  • Как указать путь до файла из каталога выше python?

    @Mootfrost
    C#, C++, JS, Python
    ../ - подняться на каталог выше => ../data/
    Ответ написан
    3 комментария
  • Как грамотно создать Linux дистрибутив?

    paran0id
    @paran0id Куратор тега Linux
    Умный, но ленивый
    Читать Linux from scratch и Beyond linux from scratch.

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

    GavriKos
    @GavriKos
    Убунта. Мануалов потому что полно.
    Но "на этот вопрос невозможно дать однозначный ответ"
    Ответ написан
  • Какой впн-софт посоветуете для линукс?

    @LexPex
    PM Sysadm
    Ответ написан
    Комментировать
  • Как распространять только модификацию кода, без основы?

    @DmitrySolomennikov
    Технически то, что вы хотите - это применение патча. Если вы можете сделать git diff, то результат этой команды позднее можно применить к исходному файлу (файлам) и получить модифицированную версию.
    Делается это при помощи команды patch:
    patch < diff.patch
    где diff.patch получен как
    git diff > diff.patch
    Ответ написан
    1 комментарий
  • Будет ли скомпилированный код C++ работать на всех архитектурах процессора?

    @res2001
    Developer, ex-admin
    Даже бинарник для х64 не будет работать под х32, что уж говорить о принципиально разных архитектурах.
    В исполняемом файле содержатся машинные команды для конкретной архитектуры процессора.
    Для другой архитектуры нужен другой исполняемый файл.
    То же самое актуально и для разных ОС (бинарники для линукс и винды не совместимы). Но, обычно, есть варианты запустить бинарник от другой ОС - виртуализация, wine в линукс, WSL в винде.

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

    Тебе придётся:
    1. Сделать HTTP-запрос к хабру и получить html разметку
    2. Рекурсивно пройтись по html и css, загрузив все картинки и стили
    3. Сохранить все эти файлы, сохранив структуру. Попутно поменяв пути, чтобы браузер потом смотрел на локальные файлы, а не в интернет.

    С комментариями сложнее, так как они прогружаются динамически.

    Кмк, проще будет запустить полновесный браузер, пролистать всю страницу, раскрыв все ветки комментариев со спойлерами, и сделать печать в PDF.
    Ну и да, гораздо лучше с такой задачей справится какой-нибудь python или nodejs, вооружённые puppeteer или playwright
    Ответ написан
    2 комментария
  • Как создать в фаерволе правило, блокирующее содержащие символы?

    CityCat4
    @CityCat4
    Дома с переломом ноги
    Никак.

    Сначала научи его расшифровывать https-соединения :). Во времена нешифрованного тырнета можно было через Layer7, сейчас же после повсеместного влезания рекламистов в каждую половую щель и, как результат - повального перехода на https - никак.
    Ответ написан
    1 комментарий
  • Как скрыть openVPN?

    @Herest
    Сервисы определяют использование VPN по MTU. Стандартный размер пакета составляет 1500 байт, но при использовании туннельных протоколов, типа PPTP, L2TP, IPsec, OpenVPN, WireGuard и т.д., его размер всегда будет меньше. И проблема в том, что у каждого протокола этот MTU уникальный, поэтому сопоставить ваш MTU с тем, который по умолчанию используется в популярных протоколах, не составит большого труда. Это называется VPN Fingerprint. Вы можете сами в этом убедиться, посмотрев на вкладку с информацией о системе на сайте proiptest.com. Поэтому единственный выход - это изменить MTU сервера OpenVPN на другое значение, например 1420.

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

    HTTP/HTTPS прокси поддерживает только TCP. SOCKSv5 и shadowsocks поддерживают TCP и UDP.
    Ответ написан
    1 комментарий
  • Повышение прав для текущего пользователя в *nix-подобных системах?

    Adamos
    @Adamos
    Так это правильно, потому что sudo - это для администрирования.
    Если вы под ним пытаетесь работать, вам будет неудобно - но это не потому, что с sudo что-то не так, а потому, что вы стали делать через задницу, как в Винде.
    Вам бы расписать, что именно делается и для чего в этом процессе повышение прав. Могут подсказать более естественный путь.
    Ответ написан
    2 комментария
  • Почему systemd-journald ест много оперативки?

    xotkot
    @xotkot
    ответы это убийцы вопросов
    возможно она у вас там мешки ворочает
    картинка
    62962cc3963ff385227468.png

    если журнал за предыдущие рабочии сессии для вас не критичен то:
    /etc/systemd/journald.conf
    Storage=volatile
    RuntimeMaxUse=20M
    Ответ написан
    Комментировать
  • В чем заключаются архитектурные ошибки моего кода?

    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 комментария
  • Можно ли в Linux делегировать права на создание пользователей?

    jamakasi666
    @jamakasi666 Куратор тега Linux
    Просто IT'шник.
    Можно добавить утилиту в sudoers, тогда он будет писать sudo useradd и пароль не надо будет вводить. Но тут уже вопрос безопасности, в такой ситуации пользователь сможет добавить пользователя с правами рута, перелогиниться в него и делать что хочет.
    Ответ написан
    Комментировать