• Почему не происходит выполнение кода в горутинах?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    Второй листенер запускайте в main, а не в goroutine
    config.startListener()  // не нужно go config.startListener()
    //обязательно уберите for{}, это плохая конструкция
    select{}    //хотя бы так, а если оставить листенер в main треде то и это необязательно
    Ответ написан
    2 комментария
  • Как настроить перенаправление трафика с основного inet интерфейса на tap интерфейс?

    @younghacker
    Прежде чем заворачивать default gateway через ваш tap интерфейс сначала нужно добавить роут до вашего VPN сервера через ваш eth (или что там у вас) сетевой интерфейс и назначить ему самую маленькую метрику. После этого добавить шлюз по умолчанию через tap интерфейс и дать ему метрику побольше.

    Вот часть моей таблицы маршрутизации
    $ ip route
    default via 10.22.0.5 dev tun0
    10.22.0.1 via 10.22.0.5 dev tun0
    10.22.0.5 dev tun0  proto kernel  scope link  src 10.22.0.6
    80.232.124.241 via 172.16.35.1 dev eth0
    172.16.35.0/24 dev eth0  proto kernel  scope link  src 172.16.35.254  metric 100


    Другими словами когда у вас маршрут по умолчанию заворачивается в tap интерфейс то система не должна потерять маршрут к VPN серверу через eth интерфейс.
    Ответ написан
    Комментировать
  • Обучение программированию ребенка?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Изначально, учить нужно не языкам и технологиям, а базовым принципам устройства этого мира, пониманию логики и принятия решений, умению находить новые решения простых задач с максимально возможным результатом.

    Всё это должно быть в игровой форме и максимально быть интересным и простым для понимания.

    Например, на прогулке можно спросить:
    Как отмерить ровно 2м веревки, если есть длинная верёвка неизвестной длины и рядом столб, диаметром 50 см?

    И подобные.

    Как только он научится правильно принимать простые логические решения, он - уже программист!

    Останется ему (уже без Вашей помощи!) выучить любой язык, чтобы стать кодером и воплотить логику своих мыслей в алгоритм в виде кода.
    А 3D, C, OSI или еще что - это уже вопрос десятый...
    Ответ написан
    69 комментариев
  • Где в Linux определены базовые команды, доступные без переменной окружения PATH?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Linux никакие команды не ищет, если PATH пустой. Поиск внешних исполняемых файлов идет ТОЛЬКО по каталогам, которые прописаны в PATH.

    В Windows всегда предварительно проверяется текущий каталог, кроме того есть куча алиасов через вроде dosset и реестр

    в Linux команды могут быть:
    встроенную в оболочку (pwd, echo)
    alias, который может ссылаться на внешнюю программу
    Внешние файлы, которые лежат в папках указанных в PATH

    узнать что за команда внутренняя или внешняя можно через команду type или which:
    $ type type
    type is a shell builtin

    $ type which
    which is /usr/bin/which
    Ответ написан
    Комментировать
  • Как избежать статических списков в классах python?

    @Alexander1705
    Когда вы объявляете переменные-члены, так как вы это сделали, они связаны с классом, а не с объектом. По аналогии с С++, вы создали переменные-члены elements и N статическими.

    Вам нужно создавать переменные-члены в конструкторе, а не в определении класса:
    class Vector:
    
      def __init__(self, N):
        self.elenent = []
        self.N = N
        for i in range(N):
          self.element.append(0)
    
      def __str__(self):
        out_str = ""
        for i in range(self.N):
          out_str = out_str +  str(self.element[i]) + " "
        return out_str
    
      def generate(self):
        random.seed()
        for i in range(self.N):
          self.element[i] = float(random.randint(1, 100))


    Или использовать специальную переменную __slots__:
    class Vector:
    
      __slots__ = ['element', 'N']
    
      def __init__(self, N):
        self.elenent = []
        self.N = N
        for i in range(N):
          self.element.append(0)
    
      def __str__(self):
        out_str = ""
        for i in range(self.N):
          out_str = out_str +  str(self.element[i]) + " "
        return out_str
    
      def generate(self):
        random.seed()
        for i in range(self.N):
          self.element[i] = float(random.randint(1, 100))


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

    Если я правильно понял вашу проблему, то вам нужно после каждого printf еще сделать fflush(stdout)
    Ответ написан
    Комментировать
  • Как залинковать библиотеку в Visual Studio?

    @Sumor
    Правой кнопкой на проект, меню «свойства». Там вас интересует два параметра.
    1. С/С++ → «Общие» в правом списке свойств нужна первая: «Дополнительные каталоги включаемых файлов» (Additional Include Directories). Укажите путь к папке с файлами *.h из вашей библиотеки. Обычно это папка include.
    2. Компоновщик (Linker) → «Общие» в правом списке «Дополнительные каталоги библиотек» (Additional Library Directories). Укажите путь к папке с файлами *.lib из вашей библиотеки. Обычно это папка Lib.
    После этого можно добавлять #include и использовать функции из библиотеки.
    Ответ написан
    1 комментарий
  • DigitalOcean как замена хостингу. Как всё грамотно настроить?

    @neol
    Во-первых, безопасность - это процесс, а не состояние.
    Чтобы система была более-менее безопасной, нужно:
    - быть в курсе существующих уязвимостей в используемом софте (как минимум следить за ubuntu security notices )
    - ставить апдейты
    - использовать достаточно стойкие пароли и периодически их менять
    - отключать неиспользуемые сервисы
    - если возможно, максимально ограничивать доступ по сети (например, не выставлять mysql на всеобщее обозрение)
    - отключать неиспользуемые модули, плагины, расширения, фичи etc.
    - делать бекапы
    - всегда строго соблюдать принцип минимальных привилегий
    - не подключаться к серверу с ненадежных систем (подключение с домашнего десктопа, на котором детишки гоняют пиратские игры, а вы смотрите "порно онлайн бесплатно без смс" - не очень хорошая идея).

    Эти довольно простые советы в стиле КО на самом деле дают практически 100% защиту от "автоматических" взломов (имеются в виду боты, которые сканируют все подряд в поисках уязвимых систем и троянчики, вытаскивающие сохраненные пароли). Все остальное больше зависит от вашего кода, чем от каких-то настроек.
    Ответ написан
    Комментировать
  • Зачем нужны методы доступа?

    @PokimonFromGamedev
    Ведущий разработчик Kotlin
    В Java принято писать геттеры и сеттеры к переменным, а сами переменные делать приватными.
    Причины 3:
    1) После того, как код написан и пару лет поработал, будет легко добавить функциональность в геттер или сеттер не изменяя кода, которых их использует.
    2) Инкапсуляция. Например так можно разрешить читать значение переменно, но запретить изменять его.
    3) Соглашение JavaBeans требует этого + есть стандарт на имена геттеров и сеттеров.

    С# клон Java, поэтому 2 первый причины тут так-же действуют
    Но Microsoft всегда все усложняет, поэтому в язык были добавлены свойства.
    Они те же геттеры\сеттеры, только с вырви глазным синтаксисом и кучей новых ключевых слов.
    Ответ написан
    1 комментарий