Category: технологии

Category was added automatically. Read all entries about "технологии".

404

мы их теряем!

Make: 1976

Прямо сейчас выходят на пенсию люди, для которых make был новомодной технологией, которую притащили хипстеры.
404

технологическая ненависть

Я понял, что меня раздражает больше всего. Это когда презентуют технологию, которая берёт две (N) невообразимо сложные штуки (разной структуры) ставит их рядом, объединяет и представляет новую штуку, которая по своей сложности равна декартову произведению штук снизу, плюс ненулевая константа своих тараканов.
404

математика не прощает

Если кто-то помнит, некоторое время назад я писал пост о том, что нельзя просто так "подмухлевать" и получить консистеный результат в математики. Сейчас оно меня снова укусило.

Я пишу код "попробовать" вместо QuadTree, NxN tree (т.е. делить область на более чем попалам по каждой координате). С учётом, что хранение "хвоста" точек до ~10-15 шт в виде массива быстрее, чем раскладывание их по дереву, есть мысль, что векторизация разделения дерева тоже будет эффективнее (мой эстимейт - 4х4, т.к. это ближе всего к тем же 15).

В ходе обобщения существующего кода мне нужно было переписать функцию find_subrange. Функция берёт итервал [start;end], точку coords, и используя глобальную константу SPLITS возвращает "подинтервал" в котором находится точка и номер (считая с нуля).

Старый код, заточенный под SPLITS=2 делал так:
let middle =(start + end)/SPLITS as f64; 
if coord <= middle {
    (start, middle, 0) }
else {
    (middle, end, 1)
}

Грубо и эффективно.

Теперь попробуем обобщить этот код.

Введём обозначения:
L = end - start (длина исходного отрезка).
D = coord - start (длина отрезка от начала исходного отрезка до точки)
Ls = L/SPLITS (длина одного подинтервала)

ии... и всё взрывается.
Формула для индекса: i = [D/Ls] (целая часть от деления длины исходного отрезка на длину одного подинтервала).

Эта формула почти правильная. Кроме ситуации, когда coord = end. Разумеется, она возвращает SPLITS, т.е. если мы считаем с нуля, она возвращает "число подотрезков в интервале +1". Абсолютно разумное понятное поведение, которое говорит нам, что нельзя работать с отрезками "просто так".

Объяснение в цифрах. Пусть у нас исходный отрезок [0;2], SPLITS=2. Ожидаем два подинтервала [0;1] и [1;2]
Теперь, вопросы:
0.5 левый.
1.5 - правый.
А вот кому принадлежат точки 0, 1, и 2 - это вопрос открытый. Я буду пробовать с 1.0 и говорить про последствия для 0 и 2.

Если 1 - это левый отрезок, то тогда 2 - правый (всё хоршо), а вот 0 - вне отрезка.
Если 1 - это правый отрезок, то тогда 0 - в левом отрезке (всё хорошо), а 2 - вне отрезка.
Если 1 - это и в левом и правом (что решит проблему и 0 и 2), то у нас проблема ещё большего масштаба, мы-то хотим один отрезок для точки, и два нам точно всё сделает ещё хуже.

... Мышки плакали, кололись, но продолжали жрать кактус.

let i = std::cmp::min(SPLITS-1, (D/LS) as usize);

Enjoy your math. Тесты прошли. Пока что. Но я уверен, что мне эта проблема ещё 100500 раз аукнется.

... Или, сцепить зубы, и заявить что мы всё-таки работаем с полу-интервалами? Тогда вся математика отлично сходится, но в граничных точках начинаются неприятные эффекты. Возможно, при отказе от массива корней внутри пикселов оно станет не таким уж сложным?
404

Ну, с апгрейдом меня

Был — Core 2 Quad (4 ядра 2.5GHz), стал — AMD Ryzen 5 5600X  (6 ядер, 3.4GHz) вместе с X570-P. И, главное, я не ошибся с памятью — я сумел засунуть в Ryzen ECC'шную память. Буквально в последний момент я осознал, что буфферизованную/регистровую нельзя, и нашёл единственную опцию небуфферизованной ECC памяти (2x Kingston 16GB 3200MHz DDR4 ECC CL22)

Переезд с древней SSD Intel 320 (40Gb) на умеренно модную NVME ещё в переди (я не хочу переустанавливать систему из-за такой ерунды, как смена платформы), так что полную скорость и отзывчивость системы ещё не видно. А в принципе, переткнул устройства, настроил с какого грузиться — работает. Хотя есть несколько беспокоящих меня сообщений в dmesg, но это всё потом.

А для ощущения прироста я взял свой растовый код, взял baseline от предыдущего бенчмарка и запустил его снова.

Запись в QuadTree с использованием f64 — улучшение в 2 раза. Поиск по дереву стал быстрее в 4.6 раза.

Нового корпуса ещё нет, видеокарту/монитор я не грейдил (и рад, т.к. новые мониторы с CES'а обещаются быть особо хорошими), но look-n-feel системы стал сильно приятнее.

... Не удержался, вот бенчмарк nvme'шки. Злой бенчмарк, как и полагается от привычного к серверам человека, с fsync'ами, write through и т.д.

Надо сказать, консьюмерская nvme за сто с копейками в коротком забеге удивительно хороша. 260k+ иопсов (в сравнении с 500k у интеловского DC за килобакс). Я подозреваю, что мухлюют зверски, но для обычной десктопной нагрузки более чем.

IOPS=262k lat (usec): min=64, max=7204, avg=121.59, stdev=103.45

тест:

[job]
iodepth=32
filename=/dev/nvme0n1
readwrite=randwrite
blocksize=4k
ioengine=libaio
direct=1
time_based=1
ramp_time=2
runtime=120
buffered=0
fsync=1

... мухлёж с внутренним write-back'ом становится виден на чтении, где это чудо выжало всего 82k IOPS (RA=0). Феномен мне пока не понятен.

... Зато я знаю про форматирование. Пробую. Увы, интелы в 4k умеют форматироваться, наш герой (KINGSTON SA2000M81000G) — нет.

... пока я это писал nvme пришла в себя (видимо, флашила что-то в бэкграунде) и даёт уже более приличные 361k IOPS на чтение.

Видимо, в этом и состоит разница между 100 баксами и 1000 в контексте nvme.

Ещё, интеерсно, если write back включить, iops'ы падают с 200k+ до 4k. У меня ощущение, что этот флаг в линуксах перепутан. Нет?

Точнее, комбинация такая: write through + fsync = 260k, write back без fsync — те же 260k,  write back + fsync = 4.2k. Упс.

Ещё, код equart'а выдал

thread 1 rate: 84.36 Mpps
thread 5 rate: 85.13 Mpps
thread 3 rate: 84.96 Mpps
thread 2 rate: 84.29 Mpps
thread 4 rate: 72.06 Mpps
thread 0 rate: 72.22 Mpps

... чего явно достаточно для отрисовки 2560х1440 даже на 60Hz.

Щастье!

404

personal efficiency

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

Тут есть тоооонкая разница, определяющая то, приятная это автоматизация, или человеконенавистническая.

И personal efficiency важнее. При том, что бизнесу может быть нужно именно «роботы всё делали», в финале там всё равно будет человек. И этому человеку будет совсем не всё равно, есть ли у него могучие инструменты для работы, или он винтик, который случайно прижали между двумя необозримыми pipeline'ами.

404

Сюжет

Далёкое будущее (приправить космосом по вкусу). Человечество разделилось на две разные цивилизации. Одна использует legacy код и использует этот код для создания нового кода (он становится legacy, а в это время его используют для нового кода и т.д.). У этой цивилизации где-то глубоко внутри есть кусочки кода на C, fortran, perl и т.д. Раз выпущенная версия ПО оседает где-то там и остаётся жить навсегда.

Вторая цивилизация требует полной актуальности всего стека. Периодически сгнивает кусок софта снизу и это вызывает уничтожение рабочего софта, который полагался на этот софт. (Пишу по мотивам недавно найденного — flow-tools был выпилен из дебиана, потому что не перешёл на python3, а мейнтейнер nfdump дропнул полуподдержку flow-tools, потому что ему он перестал быть нужен как build dependency).

Эти цивилизации радикально различаются. Продукты первой цивилизации делаются на века — раз сделано, дальше работает навсегда. Стек технологий почти бесконечной глубины, и есть программисты-археологи, которые способны находить удивительные открытия в библиотеках нежележащих слоёв. Этот мир описан в Винджа (он придумал «программистов-археологов»). Эта цивилизация имеет очень низкую стоимость написания нового кода — написал и пользуешься. Но сам код необъятен, неподъёмен и размер полного стека кода может исчисляться петабайтами (что частично компенсируется массовой дедупликацией между приложениями).

Collapse )
404

О классовом разделении, часть 2

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

А в чём состоит фундаментальная особенность «возможна удалёнка»? В прошлом посте я сказал «работать руками». А сейчас я могу уже уточнить, о чём речь.

Вся рабочая деятельность человека может быть разделена на «чистую» и с сайд-эффектами. Мне не нравится слово «чистая» тут, потому что я не хочу вкладывать оценку в понятие. Так что давайте переименуем «чистую деятельность» в функциональную. У нас есть функциональная деятельность, и деятельность с сайд-эффектами.

Что такое сайд-эффекты в данном случае? Изменение окружающего мира. Выкопал котлован — сайд-эффект. Нарисовал в CAD'е какой должен быть фундамент в этом котловане — функиональная деятельность (без сайд-эффектов). Покрутил джойстик пульта у экскаватора, который копает котлован — получил сайд-эффект (котлован), залил бетон — сайд-эффект. Выбрал марку бетона — функциональная деятельность.

Так вот, современный мир настолько рудиментарно автоматизирован, что вы не можете делать нетривиальные сайд-эффекты удалённо. Вам надо быть на месте и делать руками. Даже если вы крутите джойстик робота-экскаватора, на самом деле, вам надо этого робота привести, спустить с погрузки, подключиться к нему, заправить, завести и т.д. Всё равно миллион вещей, которые нельзя сделать удалённо.

Collapse )
404

За что я не люблю айтишные диаграммы

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

How to buy: object relations chart
How to buy: object relations chart

Сравнить с https://www.guruadvisor.net/images/numero0/openstack_nova_compute.png

404

(no subject)

Вся $unverse пахнет башем. Я уверен, что когда ИИ общего назначения изобретут, его главная часть (отвечающая за сознание и интеграцию воспоминаний) будет криво эскейпить $.