LINUX.ORG.RU

Сообщения omegatype

 

Использовать VPN только для ресурсов её сети

Подскажите как победить корпоративных администраторов при подключении к корпоративному VPN и заставить использовать VPN только для тех ресурсов, которые внутри VNP?

Дано:

  • Arch Linux
  • l2tp
  • KDE
  • NetworkManager

До подключения VPN:

route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 enp0s31f6
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 enp0s31f6

После подключения VPN:

route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         0.0.0.0         0.0.0.0         U     50     0        0 ppp0
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 enp0s31f6
10.0.102.1      0.0.0.0         255.255.255.255 UH    50     0        0 ppp0
188.65.107.46   192.168.1.1     255.255.255.255 UGH   100    0        0 enp0s31f6
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 enp0s31f6
192.168.1.1     0.0.0.0         255.255.255.255 UH    100    0        0 enp0s31f6

При это весь интернет-трафик начинает маршрутизироваться через VPN:

traceroute google.com
traceroute to google.com (173.194.73.101), 30 hops max, 60 byte packets
 1  10.0.102.1 (10.0.102.1)  2.353 ms  3.085 ms  3.085 ms
 2  41.107.rekkon.ru (188.65.107.41)  5.219 ms  5.368 ms  5.549 ms
 3  10.80.202.9 (10.80.202.9)  3.287 ms  3.238 ms  3.262 ms
 4  rascom.inet2.ru (85.112.122.13)  3.301 ms  3.577 ms  3.596 ms
 5  google-gw.rascom.as20764.net (81.27.254.18)  3.740 ms  3.762 ms  3.710 ms
 6  108.170.250.99 (108.170.250.99)  4.665 ms  3.560 ms 108.170.250.146 (108.170.250.146)  2.847 ms
 7  216.239.50.132 (216.239.50.132)  18.863 ms 209.85.249.158 (209.85.249.158)  19.732 ms *

Если же в настройках NM поствить Use only for resources on this connection, то:

route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 enp0s31f6
10.0.102.1      0.0.0.0         255.255.255.255 UH    50     0        0 ppp0
188.65.107.46   192.168.1.1     255.255.255.255 UGH   100    0        0 enp0s31f6
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 enp0s31f6
192.168.1.1     0.0.0.0         255.255.255.255 UH    100    0        0 enp0s31f6

интернет-трафки начинает тормозить, но маршрутизироваться через локальное соединение, а корпоративные ресурсы отваливаются.

У меня есть подозрение, что это происходит из-за того, что DNS не работает. VPN подсовывает два сервера:

$ cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 10.0.0.2
nameserver 10.10.0.2
nameserver 192.168.1.1

До которых с текущей таблицей маршрутизации мы идём через локальную сеть, хотя должны использовать ppp0:

$ traceroute 10.0.0.2
traceroute to 10.0.0.2 (10.0.0.2), 30 hops max, 60 byte packets
 1  _gateway (192.168.1.1)  0.497 ms  0.468 ms  0.452 ms
 2  * * *

Итого вопрос: **как сказать NM «маршрутизируй полученные при VPN-соединении DNS-сервера через эту же самую VPN-сеть»?

Ну или же как-то иначе подойти к решению задачи?

 , , , ,

omegatype ()

Подскажите хороший корпус и плату формата mini-atx под домашний сервер?

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

Основная цель сервера - хостинг бекапов, хостинг фильмов и музыки для DLNA-клиентов + экспериментаторство.

 , , ,

omegatype ()

Запилить опрос про инструменты таймтрекинга в команде?

А какой инструмент у вас используют для учета времени, потраченного сотрудниками на ту или иную задачу? Мы рассматриваем gitlab, устраивает сейчас всем, кроме time tracking-а. Он там, с одной стороны как бы есть, но вменяемую таблицу типа «Иванов за неделю делал такие-то задачи и потратил на это столько-то времени».

И всё это в отчет, который можно и начальству показать, и самому проанализировать на предмет улучшения выхлопа команды.

 , , ,

omegatype ()

Определение публичного API в Python

Есть библиотека на Python со множеством сущностей. Часть сущностей разработчик библиотеки считает приватными, а часть - публичными. Что значит «приватный» и «публичный» в контексте этого треда и моего вопроса:

  • Приватный = «я не предполагаю, что сторонние пользователи будут использовать эти интерфейсы, я не уверен в стабильности этого интерфейса, не хочу показывать его во вне и хочу зарезервировать за собой право менять интерфейс без предупреждения»
  • Публичный = «я предполагаю, что сторонние пользователи будут использовать эти интерфейсы, я буду стараться их не ломать, или, по крайней мере, ломать gracefully, например через deprecation warning-и, release note-ы или иные инструменты»

Теперь возникает технический и организационный вопрос, как выделить публичные интерфейсы, и тут есть варианты:

  1. Через соглашение об именовании приватных сущностей, например _my_variable или _MyClass. Плюсы:
  • Описано в PEP-8

Минусы:

  • По-умолчанию, я предполагаю свой класс «приватным» в контексте библиотеки, т.к. лучше сначала всё закрыть и запретить, и только потом разрешить/открыть малую часть. Это значит, что 90% моих классов, которые по сути приватны, будут начинаться с _? Код превратится в кашу!
  1. При помощи __all__ Плюсы:
  • Описано в PEP

Вопросы:

  • __all__ говорит «это можно импортировать», но не говорит, где импортировать - для внутреннего использования внутри библиотеки или для внешнего пользователем. Вариантом решения тут могло бы быть именование package, начиная с _, например:
mylib/__init__.py
mylib/_gears/__init__.py  # <-- тут __all__ = ['X']
mylib/mylib.py  # <-- тут from ._gears import X

и тогда код вида from mylib import Y будет явно публичным, но from mylib._gears import X - «ошибочным», т.к. мы явно залезаем в приватную часть либы.

Минусы/вопросы:

  • Так кто-то еще делает? Выглядит велосипедно немного?…
  1. Есть версия, что «The RealDefinition™ is that whatever we include in the docs is public, otherwise not.» Плюсы:
  • Просто и понятно

Минусы:

  • Требует документации
  • Недостаточно формально. Если с приватными пакетами можно явно сказать «у вас в импорте подчеркивание, сами виноваты», то тут надо «а где это описано в документации? вы уверены, что можете это импортировать? давайте читать доки…»

NOTE: другие языки или изменения языка программирования как способ решить задачу не рассматривается. Пожалуйста, не советуйте, этого! Это вопрос про Python.

 , , ,

omegatype ()

Помогите отладить freeze в Arch при старте VM в VirtualBox

Хост - arch, гость - windows 7. Стартую гостевую ОС и буквально в течение минуты хост фризится - GUI не отвечает, alt+shift+f1-8 не переключают терминалы. В journalctl не вижу причины, может кто подскажет? Пробовал отключать pae\nx - не помогает, все-равно фриз.

Ох как не хочется даунгрейдить пакеты :(

journalctl –boot=-1 https://pastebin.ubuntu.com/p/Dc9pr4td7Q/

 , , ,

omegatype ()

Роутер для домашнего сервера

Народ, подскажите, имеется:

  • [LAN-подключение] два телевизора, по которым необходимо по DLNA смотреть HD и UHD соответственно
  • [LAN-подключение] PC-сервер, который это раздает + качает торренты на ~10 MBps
  • [LAN-подключение] PC-рабочая станция, (сёрфинг сети)
  • [WiFi-подключение] 4 мобильных устройств, которые смотрят you-tube и прочие video
  • возможность в будущем купить iptv-пакет

Возможность связать по LAN устройства уже есть, еще есть wi-fi роутер от xiaomi, но это все не тенет. Рассматриваю вариант купить некий машрутизатор, например, Mikrotik hEX PoE 5x10/100 Mbps USB RB960PGS, к которому уже подключить wi-fi точку по LAN.

Есть ли варианты роутеров без wifi, но с хорошей пропускной способностью на такие требования?

 , , ,

omegatype ()

VPN не работает если написать правило на polkit?

Постоянно отваливается VPN в ubuntu, каждый раз при включении просит пароль. Нашел в сети рецепт со созданию правила polkit:

root@System-Product-Name:/etc/polkit-1/localauthority/50-local.d# cat 10-network-manager.pkla 
[Let user modify system settings for network]
Identity=unix-user:XXX
Action=org.freedesktop.NetworkManager.settings.modify.system;org.freedesktop.NetworkManager.network-control
ResultAny=no
ResultInactive=no
ResultActive=yes

root@System-Product-Name:/etc/polkit-1/localauthority/50-local.d# pwd
/etc/polkit-1/localauthority/50-local.d
root@System-Product-Name:/etc/polkit-1/localauthority/50-local.d# 

Делаю systemctl restart polkit и VPN отказывается подключаться вообще (икона не реагирует, а слайдер в настройках переходит в положение вкл без вопросов но сети нет)

Кто-нибудь сталкивался? Ubuntu 20.04

 ,

omegatype ()

Отрендерить сообщение от looger-а в файл в привязке к тесту pytest

Народ, подскажите с правильной организацией логгирования?

Есть функция, в процессе работы которой возникает промежуточный объект - экземпляр класса A. Этот объект создается, используется для вычисления результата функции и отбрасывается, т.е. на выход не поступает, что-то вроде:

def f(p: int):
    a = A()
    # ....
    return p

Во время отладки необходимо анализировать состояние объекта a, но этот объект в виде текста не представим, его нужно рендерить в файл.

Решение «в лоб» - это что-то типа:

def f(p: int, path_to_render_a: Optional[str]=None):
    a = A()
    if path_to_render_a:
        render(a, path_to_render_a)
    # ....
    return p

Ну это (или же коллбэк) усложняет интерфейс функции f, и, особенно, если функция находится глубже, то требует «проброса» этого параметра через остальные функции.

Если использовать logging:

def f(p: int):
    a = A()
    logger = logging.getLogger('my_function')
    logger.info(a)
    # ....
    return p

То, для конечного потребителя, получается, в принципе, неплохо - если хочешь заняться отладкой, пиши хэндлер и рендери в нем, что-то типа:

class MyHandler(logging.Handler):
    def emit(self, record):
        if isinstance(record.msg, A):
            a = record.msg
            print('A received:', a, 'rendering!')

Проблема начинается при тестировании - у нас используется pytest, т.е. тест для функции f выглядит следующим образом:


@pytest.mark.parametrize('p', [1, 2])
def test_my_function(p: int):
    assert f(p) == p

И тут становится непонятно - в какой файл рендерить a, чтобы сохранить привязку к конкретному запуску теста?

Решение «в лоб» - задавать пробрасывать имя теста через хэндлер, типа:

import logging

import pytest

logging.basicConfig(level=logging.DEBUG)


class A:
    ...


def f(p: int):
    a = A()
    logger = logging.getLogger('my_function')
    logger.info(a)
    # ....
    return p


class MyHandler(logging.Handler):

    def __init__(self):
        super().__init__()
        self.current_path = None

    def emit(self, record):
        if isinstance(record.msg, A) and self.current_path:
            a = record.msg
            print('A received:', a, 'rendering to:', self.current_path)


logger = logging.getLogger('my_function')
handler = MyHandler()
logger.addHandler(handler)


@pytest.mark.parametrize('p', [1, 2])
def test_my_function(request, p: int):
    handler.current_path = request.node.name
    assert f(p) == p

Не могу точно описать почему, но это решение мне не нравится.

Можно в начале теста очищать список хэндлеров у логгера и создавать каждый раз новый хэндлер, который рендерит в конкретную директорию под текущий тест, но.. может есть какой-то более правильный подход?

 , ,

omegatype ()

Оценка сложности кода/структуры проекта графами?

Вопрос к подступающей пятнице,

есть проект, (на Python, но в общем случае не важно) – есть ли инструменты, позволяющие оценить и выявить сложность кода статическим анализом?

Например, графами, чтобы наглядно видеть зависимость вызовов, и, как следствие, линейный граф == хороший код, дерево == хороший код, ацикличный граф - норм, цикличный и запутанный == выявлены ноды (функции или классы), которые нарушают «нормальность».

В какую сторону копать?

 , , ,

omegatype ()

Generics в Python или помогите победить mypy

Вот в таком MWE:

from typing import Generic, TypeVar

import dataclasses

T = TypeVar('T')


@dataclasses.dataclass()
class A(Generic[T]):
    attr: T


A(attr=0)  # OK!


@dataclasses.dataclass()
class B(A[float]):
    ...


B(attr=float(0))  # Argument "attr" to "B" has incompatible type "float"; expected "T"

mypy ругается на последнюю строчку ошибкой «Argument „attr“ to „B“ has incompatible type „float“; expected „T“. Но ведь класс B уточнил, что T - это float, так что все должно быть нормально.

 , , , ,

omegatype ()

Утилита для просмотра больших графов с метаданными?

Добрый вечер, коллеги!

В преддверии пятницы хочется нового: есть граф с большим количеством метаданных (т.е. к каждой ноде приязано по словарю со строками, числами и прочими параметрами). Количество узлов слишком велико для рендрегинга графвизом (500 узлов, и, если, метаданные все сконертировать в строку, то label-ы получаются огромными и граф - нечитаемым).

Какой утилитой можно посмотреть такой граф? Граф есть в языке программирования, и я готов писать скрипт-ковертер в заданный формат.

В идеале - что-то типа tensorboard из tensorflow.

 , ,

omegatype ()

Сокрытие исходников - подскажите RPC-решение для пайтоновской программы

Есть функция на python, исходники которой необходимо закрыть от внешнего пользователя. Рассматриваем вариант решения с web-сервером, предоставляющим api типа «объект на входе-объект на выходе». Выполняться вызов при этом может до 10 минут.

Вопрос - подскажите решение для огранизации такого вот «сервиса»? Смотрим на https://grpc.io/

UPD: вопрос, надо или не надо закрывать исходники - решается не мной и, к сожалению, обсуждению не подлежит. Вопрос к техническим специалистам, которые в состоянии работать в режиме «дано менять нельзя» (полезный, кстати, в реальной жизни режим).

 , , , ,

omegatype ()

Визуальное отображение прямоугольных сущностей на плоскости (поле «в клеточку»)

Привет специалистам LOR-а!

Имеется задача - поле «в клеточку» заполнено цифрами, при этом количество клеток много больше уникального количества цифр. По факту эти цифры - идентификаторы сущностей, которые «располагаются» на плоскости. Сущности только прямоугольные и, например, какая-то занимает 4 клетки:

.  .  .  .  .  .
.  1  1  .  .  .
.  1  1  .  .  .
.  .  .  .  .  .
.  .  .  .  .  .

Какая-то одну или две:

.  .  .  .  .  .
.  1  1  .  .  .
.  1  1  .  2  2
.  .  .  .  2  2
.  3  .  .  .  .

Теперь хочется как-то отрисовать это визуально, но возникают случаи вида:

.  .    .    .    .    .
.  .    .    .    .    .
.  223  223  224  224  .
.  223  223  .    .    .
.  .    .    .    .    .

Т.е. рядом дву сущности - 224 и 223, и их ID «похожи». Визуально трудно различить.

В результате возникает проблема: каким образом создать алгоритм перехода от целочисленного ID к строковому так, чтобы строчки максимально отличались друг от друга визуально? P.S. Готового критерия степени «визуального» отличия у меня, разумеется, нет, помимо очевидно факта, что 221 больше отличается от 223, чем, например, от «А0».

 

omegatype ()

Подскажите инструменты для создания визуализации flow нескольких процессов?

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

Хочется визуализировать это на временной диаграмме, чтобы наглядно представить ответы на вопросы «есть ли моменты, где какое-то ядро долго простаивает», «что выполняется на таком-то ядре в заданный момент времени». Визуально хочется получить что-то вроде http://twimgs.com/ddj/images/article/2009/0910/091023hillar_f6.gif

Основной инструмент разработки - Python, пока рассматривал варианты:

matplotlib:
+ простой
+ красивый
- результирующие изображения могут быть длинными, а тут на выходе растр, которые скроллить не хочется сильно
- возможно, сложно будет организовать подписывание процессов (например, если визуально процесс короткий и на картинке нет места для имени этого процесса)

pyqt:
+ скорее всего, можно что угодно и как угодно
+ если подписи не будут помещаться, можно убрать их в pop-up подсказки при наведении указателя
- сложный

 , , , ,

omegatype ()

Как заставить numpy падать при overflow?

Возможно ли добиться падения вот такого кода?

import numpy as np

np.seterr(all='raise')

print(np.int8(128))
print(np.abs(np.int8(-128)) == -128)

Допустим, с отсутствием исключения при прямом приведении 128 в int8 еще можно смириться, но вот модуль - хотелось бы, чтобы упал.

 ,

omegatype ()

Порекомендуйте кабель HDMI под 4K@60Hz на 10 метров?

Занялся тут вопросом подключения ТВ к компьютеру и запутался в режимах и версиях HDMI… вот, например, для ДС есть вариант за 780 рублей, а есть и за вариант за 2900.

  1. У этих кабелей всегда были такие различия в ценах (на порядки)?
  2. Нет привычных иным кабелям ферритовых колец нигде - это не нужно в hdmi?
  3. 10 м на таком разрешении и частоте - реально?
  4. И, главное, надо ли? Вот, например, в спецификации HDMI сказано, что 4к можно передавать и с меньшими частотами обновления :/

 

omegatype ()

Amarok умер?

Долгое время пользовался amarok-ом, проблем не знал - он становился лучше с каждым релизом!.. Пока его не выкинули из основных репов арча, т.к. он «подпротух» по зависимостям: https://www.reddit.com/r/archlinux/comments/9bwbgn/what_happened_to_amarok_ca...

Последний релиз https://amarok.kde.org/ в марте прошлого года. Тут https://wiki.archlinux.org/index.php/Talk:Amarok тишина.

Собственно, сабж! Раньше думал «подожду порта», теперь по ходу надо на что-то переходить... Clementine выглядит хорошо, но судя по ее gui она тоже на старых либах, не день другой - протухнет.

 , , ,

omegatype ()

Объединить два PIPE-а в Linux для синхронного чтения

Доброго времени суток, товарищи!

Есть две команды, которые выдают на stdout бесконечный бинарный поток. В моем приложении на python необходимо читать оба потока с буфером N байт, и обрабатывать пары буферов. Т.е. я не могу обработать N байт от одного потока, не получив N байт другого. Получил пару - отбросил пару.

Вопрос: при таких условиях объединять потоки проще в python или какими-то средствами linux? Что бы, например, читать результирующий поток буферами по 2N байт и всякий раз получать первые N-байт от одного и последние - от второго.

 , ,

omegatype ()

Generic (?) и typing в Python3

Тут в в соседнем треде человек спрашивал «что нельзя описать тайпхинтами» в python.

Вот в примере из документации: https://docs.python.org/3/library/typing.html#typing.Type

функция:

def make_new_user(user_class: Type[User]) -> User:
    # ...
    return user_class()

Вот тут явно неправильный возвращаемый тип. Мы не возвращаем объект типа User, мы возвращаем объект типа user_class, которым может быть User, а может быть и его потомком.

p = make_new_user(ProUser)
p.  # вот на этом месте PyCharm мне ничего не подсказывает из методов ProUser, думая, что у меня в p сидит User.

 ,

omegatype ()

Python vs PIPE в задаче RTL-SDR

Доброго времени суток!

Ставлю эксперимент с донглом rlt-sdr, задача - получить код, который непрерывно читает пачки сэмплов с донгла.

Пробую реализовать следующим образом: запустить при помощи Popen процесс rtl_sdr с выходом на stdout, затем - бесконечно захватывать чанки нужного размера.

Пробую:

import time
from subprocess import Popen, PIPE

fs = 240e3
ts = 1. / fs
chunk_size = 1024 * 2
n_chunks = 256

with Popen(['rtl_sdr', '-f', '433e6', '-s', str(fs), '-d', '0', '-'], stdout=PIPE) as rtl_sdr:

    previous_t = time.time()
    for i in range(n_chunks):

        t = time.time()
        approx_ts = 2 * (t - previous_t) / chunk_size  # coefficient 2 is for two IQ components
        previous_t = t

        print(f'~ts = {1e6 * approx_ts:0.6f} us\t'
              f'error = {1e6 * (approx_ts - ts):0.6f} us ({100. * (approx_ts - ts) / ts:0.6f}%)')

        buffer = rtl_sdr.stdout.read(chunk_size)

Код начинает выдавать последовательности типа

~ts = 0.008382 us	error = -4.158285 us (-99.798834%)
~ts = 0.006519 us	error = -4.160147 us (-99.843538%)
~ts = 0.008615 us	error = -4.158052 us (-99.793246%)
~ts = 0.006752 us	error = -4.159915 us (-99.837950%)

Каким образом промежутки между rtl_sdr.stdout.read-ами могут быть меньше, чем период дискретизации, умноженный на количество принимаемых сэмплов?!

В рамках эксперимента начинают брать чанки бОльше, параметр chunk_size = 1024 * 256:

~ts = 4.168489 us	error = 0.001822 us (0.043733%)
~ts = 4.164660 us	error = -0.002007 us (-0.048162%)
~ts = 4.165357 us	error = -0.001310 us (-0.031442%)

О, чудо! Нормальные показатели. Для референса пробую тоже самое при помощи https://github.com/roger-/pyrtlsdr:

import time
from rtlsdr import RtlSdr
from contextlib import closing

fs = 240e3
ts = 1. / fs
chunk_size = 1024 * 2
n_chunks = 256

with closing(RtlSdr()) as sdr:

    # configure device
    sdr.sample_rate = fs
    sdr.center_freq = 433e6
    sdr.gain = 'auto'

    previous_t = time.time()
    for i in range(n_chunks):

        t = time.time()
        approx_ts = (t - previous_t) / chunk_size  # coefficient 2 is for two IQ components
        previous_t = t

        print(f'~ts = {1e6 * approx_ts:0.6f} us\t'
              f'error = {1e6 * (approx_ts - ts):0.6f} us ({100. * (approx_ts - ts) / ts:0.6f}%)')

        buffer = sdr.read_samples(chunk_size)

И показатели нормальные:

~ts = 4.217378 us	error = 0.050711 us (1.217069%)
~ts = 4.208996 us	error = 0.042329 us (1.015903%)
~ts = 4.207715 us	error = 0.041049 us (0.985169%)

даже для chunk_size = 1024 * 2!

Вопрос: что за фигня у меня с Popen? Откуда у него данных больше, чем физически должен выдавать девайс и только при случае маленького буфера в read???!!

Чем меня не устраивает подход с pyrtlsdr? Тем, что я (пока) уверен, что после каждого read_samples я буду получать случайную начальную фазу, и, как следствие, читаемые чанки будут некогерентными.

Призываю радиолюбителей и технарей!

 , , , ,

omegatype ()

RSS подписка на новые темы