Category: лытдыбр

Category was added automatically. Read all entries about "лытдыбр".

404

растовое

Ещё одна, не очевидная в начале вещь, состоит в том, что Rust очень сильно struct-centric. Существенная часть времени уходит на написание структур, причём не только «основопологающих», но и кучи вспомогательных. Это близко к 'data driven programming', когда приходится думать о типах полей их смысле много больше, чем (например) в питоне.

В питоне артикуляция смысла вложенного элемента (условного foo['bar'][3]['baz']) глубоко опциональна и служит только повышению читаемости. В Rust — фактически, обязательна.

Это и раздражает, и облегчает потом написание кода (потому что все поля уже поименованы, как на входе, так и на выходе, так что свободы манёвра в коде мало).

А ещё, я просто не могу не писать кипятком от borrowck...

Смотрите, цикл обхода quadtree (4 потомка у ноды), который передаёт 'data' в один из потомков (простите, жж и код несовместимы):

Collapse )
404

очевидная оптимизация

(вдогонку к предыдущему посту)

Да, казалось бы, очевидная оптимизация: сначала lattice 2x2 (я даже думал, сделать её 2x1, с диагональными значениями), а потом уже более частая lattice по точкам, которые уже не корни. 

Однако, одна-единственная в цикле 'if' сделала так, что просто профигачить lattice 23х23 быстрее, чем сначала lattice 2x2, а потом только по избранным, 23х23. Если что, на первой итерации из примерно 2М точек выпиливается 200к, т.е. 10%.

if жрёт больше, чем 10%.

Код с оптимизацией:

Rendered in 439.320679ms, 217054 roots
Rendered and uprendered in 44.161920525s, 306692 roots

Код без оптимизации:

Rendered in 43.830699015s, 306692 roots

При этом что-либо мутить тут бесполезно — 23х23 — это 529 уравнений на пиксел, в сумме 1096934400 уравнений. Я пытался его заменить на 982981050 (разница 113953350). Один 217 тысяч if'ов стоит больше, чем 113 миллионов уравнений. Каждое уравнение — два деления и два синуса. 217 тысяч if'ов дороже, чем полмиллиарда flop (f32)?!!!

Я просто не верю. У меня где-то баг.

Вот код с if'ом:

fn up_render<F>(canvas: &mut Canvas, f: &F, lattice_dim:usize) where

    F: Fn(Float, Float) -> Float

{

    for pixel in canvas.iter(){

        if canvas.img[pixel.index]!=0u32 {

            if pixel.sign_change_on_lattice(f, &canvas, lattice_dim){

                canvas.set_pixel(&pixel, 0);

            }

        }

    }

}

Код без if'а, соответственно, без строчки «if canvas.img[pixel.index]!=0u32 {»

Collapse )
404

Застрял в математике

Как для уравнения F(x,y)=0 понять, есть ли точки её графика в прямоугольнике (x,y);(x+dx, y+dy)? Сначала задача была простой, а ща я просто даже и не знаю...
404

и ещё рефакторинг

Важный milestone: getPath сократилась до 100 строк, а всё это покрыто 60+ тестами. Надо бы больше, но некоторые кейсы я просто не могу нормально написать без софтмоков, а их ещё делать. (О чём речь: я не могу использовать untitest.mock, потому что это python2, и не могу использовать mock, потому что ограничения проекта). Мне предложили делать тесты, которые skip, если нет модуля mock, но эту штуку ещё отдельно писать надо.

На горизонте строки 425-994, которые представляют из себя остаток getSVG (из которой я, собственно, getPath и несколько других функций и вытащил). Да-да, добрая такая функция на 500+ строк, которая всё ещё делает Почти Всё.

В целом, я ощущаю, что оно чуть-чуть из рук выскользает, потому что в новом коде довольно много тестами не покрыто, но хочется дальше деребанить getPath. Но надо-таки покрывать то, что уже надёргано. Цикломатическая сложность понизилась, и самое-самое время начинать заморачиваться с тестами всяких corner case'ов, потому что в них как раз баги и обитаются...

Вот, например, из вытащенного:

def toSpline(edge):
    bspline = edge.Curve.toBSpline(edge.FirstParameter, edge.LastParameter)
    if bspline.Degree > 3 or bspline.isRational():
        try:
            bspline = bspline.approximateBSpline(0.05, 50, 3, 'C0')
        except RuntimeError:
            print("Debug: unable to approximate bspline")
    return bspline


Мне нужны тесты на:
1) кривые с Degree > 3
2) isRational (насколько я понимаю, это кривая Безье, описывающаяся полиномом с дробной степенью)
3) На ситуацию, что кривую не аппроксимировать.

Понятно, что моки спасут отца русской демократии, но мне хотелось бы записать в тесты всё-таки настоящий результат - с такой самой кривой, у которой такие загогулины.
404

ceph blog

Потратил ещё один день, разбираясь в typecode'ах, guid'ах, и прочих потрошках GPT. Выяснил как именно ceph всё делает в этой области, и это было очень интересно (консистентная обработка транзакции в 6Тб размером за одну операцию записи - это круто!). Заодно добровольно-принудительно познакомился с sgdisk, про существование которого знал, но в мануалы не вчитывался.

Меж тем, Мой Баг признали багом и пофиксили (https://github.com/ceph/ceph/pull/10093), теперь жду бэкпорта в jewel, чтобы продеплоить на поломанной лаборатории посмотреть, что оно реально прошло.

Плюс: баги фиксят
Минус: всего три недели интенсивного размахивания кувалдой и я нашёл место, куда если стукнуть, то всё разваливается.
404

user's rant

Блядская крита. Ну я понимаю, фичи и всё такое. Но почему в mypaint я просто могу начать рисовать, а в крита - боль и интеллект?

Вот простейший пример: я рисую. Хочу удалить. Переворачиваю перо - не стирает. Ладно, generic "разные кисти настрой сам", для второй кисти выбираю "erase".

Ну какого хрена под стёртым клетчатка "transparent" вместо белого фона на котором я начинал рисовать?

Второе - почему я не могу рисовать по стёртым областям? Не, я понимаю, selection, раз стёр, то на этом слое больше ничего нет.

Но эргономика? Эргономика!

Блин, я понимаю, что фич больше. А рисовать лучше в mypaint.
404

психоделика от циски

Утянуто у тов. Томилина из fb.

http://www.cisco.com/cisco/web/support/RU/108/1089/1089265_crs-ios-xr-bp.pdf

Медитативный текст:

Процесс и нити
Процесс и государства нити
Заблокированные государства процесса и процесса
Самолет ткани
Обзор Самолета контроля
Инструкции по модернизации
Как Отправлен Внутренний Пакет?

Нейтрино является сообщением, передающим операционную систему, и сообщения являются основными средствами коммуникаций Межпроцесса среди всех нитей.

Рассмотрите не местный случай:
Перерыв программного обеспечения в ядро.

Все было расцеплено в интерфейсе IPC, который позволяет клиент-серверу быть абсолютно отдельным.

Инфраструктура существует для обеспечения возможности измерить.

Выпустите выставочный процесс ospf команда для проверки статуса нитей.

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

Я просто не могу дальше читать.
404

tcp over tcp

По мотивам комментариев на хабре. Задача.

Предположим, у вас есть N установленных tcp-соединений. Каждое из них ведёт себя так, как хочет - и вы это не можете контролировать.

Задача: получить новый stream-протокол, с гарантиями уровня tcp, но с latency, которая будет не более, чем у лучшего из данных соединений, а по возможности, с ещё меньшей latency (что будет особо заметно, если на всех tcp-соединениях случайным образом возрастают потери, по-очереди в случайные моменты времени).

Наивный подход "слать во все tcp" не работает, если у них разная скорость (в какой-то момент в одну из tcp данные перестанут влезать).

Это новая идея или кто-то такое уже делал?

Чисто теоретически, оно может быть очень интересно multihomed системам и критичным к latency приложениям (которые не хотят верить udp).
404

Сильные аргументы

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

Но иногда бывает так, что попадаешь в best case для технологии - и тогда технология просто расцветает.

Сейчас поднимал новую ноду в проекте. Где-то в середине осознал, что ошибся с ролями - и на ноде много мусора. Некритично, но засрано. Вычищать руками - то ещё удовольствие.

Вместо этого я просто сказал rebuild instance и перезапустил ansible для этой ноды, с изменённым списком групп для сервера. Главным раздражением было, то, что пришлось делать ssh-keygen -R не только для доменного имени, но и для IP'шника.

Сервер поднялся и отконфигурировался в полном объёме до того, как я дописал этот пост.