LINUX.ORG.RU

Сообщения 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
()

Сервис для мониторинга времени в пути на автомобиле в течение дня?

Уважаемым специалистам по всему - не порекомендуете ли вы сервис, который позволил бы задать на карте (дефолт-сити) две точки А и Б, и, по яндекс-навигатору (или ещё чему?) отображать историю времени в поездке на автомобиле с учетом пробок, т.е. выбирая оптимальный маршрут.

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

 , ,

omegatype
()

Python line_profiler и @property

Использую line_profiler из Jupyter, наткнулся на затруднение:

from time import sleep

%load_ext line_profiler

class Foo:

    @property
    def foo(self):
        sleep(.1)        

    def bar(self):
        sleep(.1)

Вот такой код:

%lprun -f Foo.bar Foo().bar()

работает нормально, а вот этот:

%lprun -f Foo.foo Foo().foo

не работает с warning-ом:

UserWarning: Could not extract a code object for the object <property object at 0x7f0bb0608048>

Кто-нибудь сталкивался? line_profiler-ом вообще property толком не отладить? Что порекомендуете на замену?

 , ,

omegatype
()

Интерактивное обновление графиков jupyter?

Задача: наблюдать формирование графика в процессе его формирования. В jupyter.

Вариант решения: pyqtgraph

%gui qt

import numpy as np
import pyqtgraph as pg
from time import sleep

win = pg.GraphicsWindow()
qplt = win.addPlot()
curve = qplt.plot()

for i in range(8):
    sleep(.5)
    curve.setData(np.random.random(size=16))
    curve.update()

Проблема: график обновляется только после того, как отработала _вся_ ячейка.

Как отрисовывать график online? Какие, может быть, _иные_ подходы есть к этой задаче (свет клином на pyqtgraph не сошелся...)?

 , , ,

omegatype
()

Отступы у preview фотографий в Digikam?

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

Кто-нибудь замечал чрезвычайно огромные отступы у preview-шек фотографий в digikam по вертикали?

https://i.postimg.cc/JzzBc6ks/Screenshot-20181201-233149.png

Как бороться? Гугл что-то сходу не помог.

 , ,

omegatype
()

jupyter и matplotlib для «больших» векторов? Как не сливать Matlab-у?

Цель: применить jupyter/python/matplotlib/<ещё что-то?> к задаче радиотехники.

Дано: 3276799 комплексных числа. Необходимо визуально оценить спектр.

Вот такой тестовый код вешает (!!!) kernel в jupyter-е (попробовал на двух машинах):

%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt

fig, axis = plt.subplots(nrows=1, figsize=(16, 8))

n = 3276799

t = np.arange(n)
x_t = np.random.random(n) + 1j * np.random.random(n) + np.sin(2 * np.pi * .05 * t)
x_t -= x_t.mean()
x_f = np.fft.fft(x_t)

axis.plot(np.abs(x_f))

Для сравнения вот такой matlab-овский код:

n = 3276799;
t = 1 : n;
x_t = rand(n, 1) + 1j * rand(n, 1) + sin(2 * pi * .05 * t');
x_t = x_t - mean(x_t);
x_f = fft(x_t);
plot(abs(x_f));

отрабатывает и отрисовывает график за доли секунды.

Раунд спора с научруком на тему Matlab vs Jupyter/python/matplotlib был эпично проигран! :'-(

Вопрос: что не так в python-ом коде? Как решить такую задачу в jupyter?

P.S. Только, пожалуйста, не надо говорить, что визуально оценивать 3М точек, это не по фэншую. Если matplotlib для этого не предназначен, то порекомендуйте альтернативу. Решать такую задачу можно и нужно и Matlab её решает успешно.

 , , ,

omegatype
()

Актуальная версия статьи «Что каждый программист должен знать о памяти»?

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

Народ, подскажите, есть статья What every programmer should know about memory, Part 1 и тред Что каждый программист должен знать о памяти, всё это от 2007-ого года. В предисловии статьи рекомендуют уделить большое внимание актуальности, т.к. технологии и подходы меняются. Вопрос: актуальная ли данная статья сейчас? И вопрос вдогонку: что можно почитать (обзорный + средний уровень) по вопросу о том, что программисты должны знать о памяти сейчас?

 

omegatype
()

Алгоритмы и структуры данных

Уважаемые специалисты! Посоветуйте, пожалуйста, книгу/курс по алгоритмам и структурам данных!

Требования:

  • достаточно фундаментальное изложение материала;
  • актуальность;
  • если на английском - не проблема, может, даже лучше.

Во много хотелось бы повысить собственную квалификацию и систематизировать знания для интервью. Грубо говоря, если бы вы нанимали сотрудника и в требованиях писали «знание основных алгоритмов и структур данных» - в рамках какой литературы/курса вы бы это требование предъявляли?

 , ,

omegatype
()

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