• Как практиковаться в программировании?

    delphinpro
    @delphinpro
    frontend developer
    На мой взгляд лучший вариант изучения языка - писать то что именно тебе нужно, или хотя бы интересно.

    Я начал изучать программирование лет двадцать назад, поэтому мой опыт может показаться странным, но все же. В моем распоряжении был компьютер на 386 процессоре и монохромный монитор с 4 градациями цвета (белый, серый, темный и черный). Конечно я видел и цветные мониторы и 95 винду на них. Мне тоже хотелось окошечки, графический интерфейс и все такое прочее. Хочется - сделаем. Книжки в зубы (в библиотеке O_o), редкие походы в компьютерные клубы, за инфой из интернета (сколько поместится на дискету?) - и вперед, пилить оконный менеджер под ДОС на турбопаскале.
    Конечно, свою винду я не написал =) Но зато паскаль выучил, объектное программирование, детально разобрался как работает компьютер и операционная система, что такое резидентные программы в досе.
    А потом купил нормальный комп =)

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

    А что поднятие одним файлом всех контейнеров, всех сетей, и всех волюмов, с последующим освобождением всего одновременно уже не является достаточным преимуществом? Да ещё и без конфликта имён
    Ответ написан
    Комментировать
  • Палевно ли переводить криптовалюту из США в СНГ?

    1. В момент покупки крипты будет видно, что ты на что-то потратил деньги.

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

    Если не через биржу, то это будет эквивалентно передаче налички из рук в руки - никто ничего не увидит, если специально не будет искать транзакции.

    3. Если ты будешь переводить очень большую сумму, то тобой в любом случае заинтересуются и будут вопросы задавать.

    4. Следует различать "СНГ" и конкретные страны. Переводить "в СНГ" не запрещено. Запрещено только в РФ и РБ.
    Ответ написан
    Комментировать
  • Насколько Spring Security хорошо защищает твой бакэнд?

    Spring Security это фреймворк. Степень безопасности сильно зависит от программистов, которые им пользуются. Если всё в приложении делается правильно и тестируется, то в защите сомнений быть не может.

    Okta и подобное это уже готовые серверы авторизации. Если у вас есть бюджет на подобные дорогие удовольствия, то стоит. Но в большинстве случаев, эти расходы необоснованны. Особенно для малых и средних компаний.
    Ответ написан
    1 комментарий
  • Какой бесплатный мониторинг ресурсов (аналог zabbix agent) установить для vps linux ubuntu?

    А зачем искать аналог zabbix, если можно использовать сам zabbix? Он бесплатный, его можно установить на ubuntu, у него есть веб-интерфейс (и вполне можно интегрировать в grafana/prom, если хочется)

    https://www.zabbix.com/documentation/current/en/ma...
    Ответ написан
    2 комментария
  • Требуется захват вывода команды в subproccess python в реальном времени как реализовать?

    Vindicar
    @Vindicar
    RTFM!
    Используешь Popen(), перехватываешь ввод-вывод (stdin, stdout и stderr, передаёшь туда константу PIPE). Дальше используешь свойства stdin, stdout, stderr - это файлоподобные объекты (пайпы).
    Тут есть ряд подводных камней. Обычно чтение из файла - блокирующая операция, т.е. пока дочерний процесс не напишет что-то в пайп - твоя программа будет висеть и не реагировать на действия пользователя. В питоне неблокирующее чтение из пайпа доступно только под unix, а под виндой - только начиная с 3.12. Если нужна поддержка винды, будет практичнее запустить отдельный поток, который читает данные из процесса. Например, так:

    import collections
    import signal
    import subprocess
    import threading
    import time
    
    
    class ChildProcessReader(threading.Thread):
        def __init__(self, args: list[str], *, encoding: str | None = None, errors: str = 'ignore', exit_timeout: float = 1.0):
            super().__init__(name=f'Monitor {args!r}', daemon=True)
            self._encoding = encoding
            self._errors = errors
            self._exit_timeout = exit_timeout
            self._queue = collections.deque()
            self._child = subprocess.Popen(args,
                stdin=subprocess.DEVNULL,  # стандартный вход отключен
                stdout=subprocess.PIPE,  # перехватываем стандартный вывод
                stderr=subprocess.STDOUT,  # стандартный вывод ошибок направляем на стандартый вывод
            )
            self.start()
        
        @property
        def running(self) -> bool:
            '''Возвращает True, если процесс ещё жив.'''
            return self._child is not None
        
        @property
        def output(self) -> collections.deque:
            '''Очередь, в которую будут складываться получаемые от процесса строки.'''
            return self._queue 
        
        def stop(self) -> None:
            '''Останавливает процесс - сначала "по хорошему", потом принудительно.'''
            if self._child is None:
                return
            try:
                self._child.send_signal(signal.CTRL_C_EVENT)
                self._child.wait(self._exit_timeout)
            except subprocess.TimeoutExpired:
                self._child.terminate()
            except KeyboardInterrupt:
                pass
            finally:
                self._child = None
        
        def run(self) -> None:
            '''Тело потока.'''
            try:
                while self._child.poll() is None:  # рабочий цикл крутится, пока дочерний процесс жив.
                    stdout_data = self._child.stdout.read1()
                    if self._encoding is not None:
                        stdout_data = stdout_data.decode(self._encoding, errors=self._errors)
                    self._queue.append(stdout_data)
            except KeyboardInterrupt:
                pass
            finally:  # по выходу из цикла завершаем процесс
                self.stop()
    
    
    if __name__ == '__main__':
        child = ChildProcessReader(
            # выполняемая команда
            ['ping', '-t', '127.0.0.1'],
            # кодировка, в которой отдаёт данные твой процесс. None - отдавать байты как есть.
            encoding='cp866', errors='ignore',
            # сколько ждать завершения процесса
            exit_timeout=1.0
        )
        # процесс (и поток) стартуют немедленно по созданию экземпляра класса
        try:
            while child.running:
                # вместо просто цикла тебе лучше периодически выполнять код ниже иным способом
                # например, если у тебя GUI на tkinter, используй метод .after()
                try:  # пытаемся получить очередную строку от процесса
                    data = child.output.popleft()
                except IndexError:  # ничего нет, буфер пуст
                    # это просто реакция на отсутствие текста. Можно вообще ничего не делать.
                    print('.', end='', flush=True)
                    time.sleep(0.1)  # 
                else:  # получили строку, обрабатываем
                    print(f'\n> {data!r}')
        except KeyboardInterrupt:
            print('\nStopping')
        finally:  # в итоге надо будет прибить дочерний процесс
            child.stop()
    Ответ написан
    Комментировать
  • Как склонять слова в Python?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Первая же ссылка в гугле, если правильно, по-русски, вопрос задать https://pypi.org/project/Petrovich/
    Как в слове из трех букв допустить четыре ошибки? Исчо! Вместо ещё
    Ответ написан
    2 комментария
  • Как работает код на C# в приведённом примере?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    а еще можно освоить пошаговую отладку, и посмотреть что прилетает в
    validNumber = int.TryParse(readResult, out numValue);
    после чего и думать ;)
    ну или так ))
    namespace ConsoleApp4
    {
        internal class Program
        {
            static void Main(string[] args)
            {
                string? readResult;
                int numValue;
    
                Console.Write("Enter an integer value between 5 and 10: ");
    
                do
                {
                    readResult = Console.ReadLine();
                    bool validNumber = false;
                    validNumber = int.TryParse(readResult, out numValue);
    #if DEBUG
                    Console.WriteLine($"debug 'numValue='{numValue}");
                    Console.WriteLine($"debug 'validNumber='{validNumber}");
    #endif
                    if (validNumber == true)
                    {
                        if (numValue < 5 || numValue > 10)
                            Console.Write($"You entered {numValue}. Please enter a number between 5 and 10: ");
                    }
                    else Console.Write("Sorry, you entered an invalid number, please try again: ");
    
                } while (numValue < 5 || numValue > 10);
    
                Console.WriteLine($"Your input value ({numValue}) has been accepted.");
            }
        }
    }
    ваш код работает абсолютно корректно, что смутило не понятно вообще ))
    2WhBpyZ.png

    ps подправил код, еще лайфхак, может понравится ;))
    pps и еще по мелочи, может понравится ;)
    namespace ConsoleApp4
    {
        internal static class Program
        {
            static void Main(string[] args)
            {
                var numValue = 0;
                var inValidValue = false;
                var validNumber = false;
                "Enter an integer value between 5 and 10:".print();
                do
                {
                    validNumber = int.TryParse(Console.ReadLine(), out numValue);
                    inValidValue = numValue < 5 || numValue > 10;
    #if DEBUG
                    $".. debug 'numValue={numValue}'".print();
                    $".. debug 'validNumber={validNumber}'".print();
                    $".. debug 'validValue={inValidValue}'".print();
    #endif
                    if (validNumber)
                    {
                        if (inValidValue)
                            $"You entered {numValue}. Please enter a number between 5 and 10: ".print();
                    }
                    else "Sorry, you entered an invalid number, please try again: ".print();
                } while (inValidValue);
                $"Your input value ({numValue}) has been accepted.".print();
            }
            static void print(this string s) => Console.WriteLine(s);
        }
    }

    .. почувствуйте разницу ;)))

    ppps .. кхм.. думал извращения закончились )))
    namespace fanc_minimal
    {
        internal static class Program
        {
            static void Main(string[] args)
            {
                string checkValue(bool goodValue, bool correctNumber, int Value) => (goodValue, correctNumber) switch
                {
                    (true, true) => $"Your input value ({Value}) has been accepted.",
                    (false, true) => $"You entered {Value}. Please enter a number between 5 and 10:",
                    _ => "Sorry, you entered an invalid number, please try again:"
                };
    
                Console.WriteLine("Enter an integer value between 5 and 10:");
                for (var validValue = false; !validValue; )
                {
                    var validNumber = int.TryParse(Console.ReadLine(), out var numValue);
                    Console.WriteLine(checkValue(validValue = numValue >= 5 && numValue <= 10, validNumber, numValue));
                }
            }
        }
    }
    но это пример оголтелого минимализма строк ))
    читаемость уже резко страдает... зато в одном флаконе много фишек, которых в книгах не найти. всем успехов в кодировании ))
    .. продолжаем издеваться над стереотипами ;))
    namespace func_next
    {
        internal static class Program
        {
            static void Main(string[] args)
            {
                const int min = 5;
                const int max = 10;
                var value = min - 1;
                var stop = false;
    
                bool success() => value >= min && value <= max;
    
                string check() => (int.TryParse(Console.ReadLine(), out value), stop = success()) switch
                {
                    (true, true) => $"Your input value ({value}) has been accepted. Press Enter to Exit )))",
                    (true, false) => $"You entered {value}. Please enter a number between 5 and 10:",
                    _ => "Sorry, you entered an invalid number, please try again:"
                };
    
                for ("Enter an integer value between 5 and 10:".print(); !stop; check().print()) ;
            }
            static void print(this string s) => Console.WriteLine(s);
        }
    }
    .. и снова.. лишь пример перфекционизма.. но код содержит взаимозависмости, не допустимые в большом проекте ))
    .. но уж сильно захотелось уйти от вложенных if .. ну и показать мощь сишныхfor )))
    ... тут уже скорее ретушь.. чуть поближе к продашен стилю
    namespace func_next
    {
        internal static class Program
        {
            static void Main(string[] args)
            {
                const string welcome = "Enter an integer value between 5 and 10:";
                const int min = 5;
                const int max = 10;
                var value = min - 1;
                var stop = false;
    
                bool success() => value >= min && value <= max;
                bool valid() => int.TryParse(Console.ReadLine(), out value);
    
                string check() => (valid(), stop = success()) switch
                {
                    (true, true) => $"Your input value ({value}) has been accepted.",
                    (true, false) => $"You entered {value}. Please enter a number between 5 and 10:",
                    _ => "Sorry, you entered an invalid number, please try again:"
                };
    
                for (welcome.print(); !stop; check().print()) ;
            }
            static void print(this string s) => Console.WriteLine(s);
        }
    }
    .. кхи.. перфекционизм цветет.. но сам не ожидал некоторых вещей )) .. но тут уже и логика прозрачная и читаемая ))
    namespace func_next
    {
        internal static class Program
        {
            static void print(this string s) => Console.WriteLine(s);
            static void Main(string[] args)
            {
                const int min = 5;
                const int max = 10;
                var value = min - 1;
    
                string welcome() => $"Enter an integer value between {min} and {max}:";
                string accepted() => $"Your input value ({value}) has been accepted.";
                string repeat() => $"You entered {value}. Please enter a number between {min} and {max}:";
                const string ups = "Sorry, you entered an invalid number, please try again:";
    
                bool valid() => int.TryParse(Console.ReadLine(), out value);
                bool success() => value >= min && value <= max;
    
                var stop = false;
    
                string check() => (valid(), stop = success()) switch
                {
                    (true, true) => accepted(),
                    (true, false) => repeat(),
                    _ => ups
                };
    
                for (welcome().print(); !stop; check().print()) ;
            }
        }
    }
    шарм ситуации в том, что тушка программы сводится к строкеfor (welcome.print(); !stop; check().print()) ; а все остальное - лишь определение "понятий"... обожаю функциональный стиль ))
    ..чем дальше в лес, тем веселее ))
    namespace func_next
    {
        internal static class Program
        {
            static void print(this string s) => Console.WriteLine(s);
            static void Main(string[] args)
            {
                var min = 5;
                var max = 10;
                var value = min - 1;
    
                string welcome() => $"Enter an integer value between {min} and {max}:";
                string accepted() => $"Your input value ({value}) has been accepted.";
                string repeat() => $"You entered {value}. Please enter a number between {min} and {max}:";
                const string ups = "Sorry, you entered an invalid number, please try again:";
    
                var valid = false;
                bool get() => valid = int.TryParse(Console.ReadLine(), out value);
                bool success() => value >= min && value <= max && valid;
    
                var stop = false;
    
                string check() => (get(), stop = success()) switch
                {
                    (true, true) => accepted(),
                    (true, false) => repeat(),
                    _ => ups
                };
    
                for (welcome().print(); !stop; check().print()) ;
            }
        }
    }
    .. тут уже полшага до модификации min/max на ходу ;))
    ... как и было обещано.. но см в каментах.. ответ превысил 10к символов ;))
    uznwPSD.png

    (примеры реализованы в vs 2022, dotnet 8, по тому и без юзингов )) .. но каждая версия из ответа и каментов, испытана в студии, абсолютно рабочая, и все идентичны по поведению исходному коду вопроса ))
    Ответ написан
  • Как ОС загружается с разделом boot на софтверном рэйде?

    @pfg21
    ex-турист
    grub классически использует систему "MBR gap".
    первый кластер содержит классический boot.img размером 442 байта, в который ничего "большого" не впихнешь.
    поэтому после идет "разрыв" между первым кластером и началом первого раздела (хватает пары-тройки мегабайт) в который вписывается core.img бинарный код, динамически компилируемый грубом во время grub-install из своих модулей, для загрузки с текущего набора фс и разделов.

    т.е. в boot.img содержится только загрузчик core.img.
    а размер core.img уже не ограничен 442 байтами и может многое чего хитрого загрузить.

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

    4 дня работаешь на нормальной работе, 1 день преподаёшь.
    Преподавание - это 90% педагогики и 10% собственно программирования.
    Прогрессировать, очевидно, будешь только в умении доносить какие-то знания до людей сильно глупее тебя (ну или хотябы в умении не сходить с ума от того что на паре студенты ничего не делают)
    Ответ написан
    4 комментария
  • Какой курс по asp.net core вы можете посоветовать?

    nozd
    @nozd
    C#
    Не видео, но книга "Lock A. - ASP.NET Core in Action - 2023"

    Это самое актуальное издание, сам ещё не смотрел. До этого читал 2-ую редакцию.

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

    Да, из-за этого - об этом и говорится в ошибке.
    Решить можешь тремя вариантами:
    1. Скопируй DLL из того проекта в этот.
    2. Скопируй сам проект
    3. Упакуй тот проект как nuget-пакет
    Ответ написан
  • Почему эта команда работает в отдельном окне и ничего не возвращает?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    Кажется запуск отдельным окном происходит из-за Start-Process.

    Добавьте после Write-Host команду Pause, отдельной строкой.
    Тогда окно не будет закрываться, и всё увидите.
    Ответ написан
    Комментировать
  • Почему эта команда работает в отдельном окне и ничего не возвращает?

    @NortheR73
    системный инженер
    Потому что Start-Process так работает: по умолчанию не генерирует никакого вывода и на ОС Windows открывает новое окно.
    Вариант №1:
    Start-Process -FilePath "docker" -ArgumentList "version" -NoNewWindow -PassThru

    Вариант №2:
    Start-Process -FilePath "docker" -ArgumentList "version" -NoNewWindow -RedirectStandardOutput <output file> -RedirectStandardError <error file>

    Остальные примеры есть в первоисточнике - ссылка выше
    Ответ написан
    6 комментариев
  • Как определить, какую версию nuget установит Install-PackageProvider и как этот nuget взаимодействует с .NET SDK?

    Install-PackageProvider выбирает версию для установки провайдера вне зависимости от установленного .NET.
    Тот Nuget, который ты таким образом установишь не имеет отношения к тому Nuget, который будет использоваться при сборке.
    А версия будет выбрана максимальная из совместимых с той, которую ты указал, по правилам semver.
    Тоесть какая-то из 2.x.x

    Как узнать какая версия подходит для .net 6.0? Является ли она обратно совместимой?

    Никакая. .NET SDK тащит свой nuget client.
    То что ты устанавливаешь при помощи Install-PackageProvider будет использоваться только с командой Install-Package для работы с пакетами в винде.
    Ответ написан
    4 комментария
  • Почему надо явно добавлять пакет Microsoft.NET.Test.Sdk в гл проект, если в одном из пакетов он уже есть?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Так нужно, потому что ссылки не транзитивны. Средства разработки не могут взять метаданные (описания сборок, классов и т.д.), которые нужны для работы и компилятора, и других средств разработки (IDE, в частности), из ссылок того проекта (по факту - тоже сборки), на который ссылается текущий. Так что для использования какой либо сборки (в данном случае - из состава пакета), ссылку на нее нужно добавлять в проект явно.
    Ответ написан
    2 комментария
  • Как собрать ядро linux которая развертывает C# приложение?

    Используй systemd для этого.

    Если приложение графическое, то используй какой-нибудь kiosk mode.
    Ответ написан
    6 комментариев
  • Я усложняю или так правильно?

    yellow79
    @yellow79
    Senior Software Engineer
    По ссылке нет никаких принятых сообществом правил. Это просто чья-то фантазия, о чём писал Расс Кокс в issue данного репозитория.

    Интерфейсы в go принято объявлять там, где они будут использоваться, а не там, где создаётся структура реализующая данный интерфейс. У вас функции возвращают интерфейс, так в go не принято, функция может принимать значения и интерфейсы, но возвращать должна значения, исключение интерфейс error.

    Я бы вам рекомендовал ознакомиться с переводом советов от Дэйва Чейни, многое прояснится, там же есть ссылка на оригинал. Сам регулярно перечитываю данный материал
    Ответ написан
    Комментировать
  • Дистрибутив Linux с поддержкой Windows-программ?

    Adamos
    @Adamos
    Переход на Линукс - это революция, нужно использовать ее нестабильность для того, чтобы менее болезненно расстаться с прошлым.
    Нужно вернуться к построению техпроцесса и спросить себя, почему вообще были выбраны эти программы, что именно в них делается и почему все это делается именно так.
    Вполне может оказаться, что единственная причина их использования - потому что так исторически сложилось, никто даже не пытался работать по-другому.

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

    И только если выяснится, что имеет место вендор-лок и разрушить его невозможно - тогда хвататься за Wine.

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

    Lorien_Elf
    @Lorien_Elf
    Keep calm and drop database
    Из документации:

    Команда CREATE USER теперь является просто синонимом CREATE ROLE. Единственное отличие в том, что для команды, записанной в виде CREATE USER, по умолчанию подразумевается LOGIN, а в виде CREATE ROLE подразумевается NOLOGIN.

    Команды grant надо выполнять в той БД, в которой у вас создан пользователь.
    Ответ написан
    1 комментарий