Pull to refresh
79
62.4
Send message

Частично переписал рейкаст по Брезенхему-Доку (нет, ну правда, «колесо пред-рассчитанных лучей» от @Swamp_Dokдало прямо роскошный буст к скорости) под чистые 8 бит старого доброго 6502-го.

Всё, как и обещал в камменте: 16 бит в первом приближении как бы не быстрее 8 бит, потому что выковыривать нибблы из байта на процессоре, который даже сместить на 4 бита одной командой не может (надо использовать 4 сдвига на 1 бит) — такое себе, а в этих 16 битах старший и младший байты живут в основном самостоятельными жизнями, довольно редко взаимодействуя в переносе (что ещё больше углубляет мой восторг от гениальности алгоритма «Брезентыча», если это вообще возможно). Я уже мысленно собрал уровни из тех замечательных крошек-чанков 16х16 клеточек и даже продумал, как бы нам хранить в одном байте 4 клетки, чтобы пореже из памяти тянуть (итого 2 бита на клетку — пустота, стенка, первый моб и второй моб из двух возможных на один чанк), да и даже как именно нам связывать такие чанки, как анимировать переходы и т. д, но, судя по всему — не пригодится. Не похоже, чтобы было где хранить данные для повторного использования, не похоже, чтобы можно было быстро вытащить нужные биты.

Разберу сейчас подробно один из 8 вариантов ветвления (раньше было два — шаг по X, смещение по Y и наоборот, а сейчас добавились ещё и варианты для разных знаков шага и смещения, ибо индивидуальная обработка каждого случая позволяет ещё кучу тактов сэкономить). Самый простой вариант — первый, X и все в плюс.

Дам этот кейс скрином, ибо.
Дам этот кейс скрином, ибо.

Координаты игрока мы храним нормальными 16-битными, 8 бит на номер клетки и 8 бит на координаты в ней. Работать с ними мы будем один раз — в рамках физики. Для рейкаста они нужны отдельно в виде старшего байта, отдельно в виде младшего. Три из них мы видим в трёх верхних строчках, где они копируются в координаты луча. Четвёртая — чуть ниже, где BrezToStart вычисляется «по-старинке», там я ещё не изжил пекашный код. Зато смещение мы берём (четвёртая строчка) уже из «колеса», расчётов — ноль!

Дальше мы видим, что предыдущее значение координаты смещения стало 8-битным. Дело в том, что нам не нужно значение клетки — мы его и так знаем. А вот пиксельное значение — запомнили.

Дальше мы делаем 8-битное сложение. Первая величина — младший байт координаты смещения POS PIX, вторая — (long)BrezToStart*(long)RayDY/RayDX. Её я тоже пока вычисляю явно — но она, несомненно, напрашивается на табличное представление. В результате имеем новый POS PIX и флаг переноса.

Тут, как я уже намекал, мы можем не проверять память, если не было переноса. Ну, и полного 16-битного суммирования не делаем, максимум — инкремент (в отличие от компилятора, мы знаем, какие бывают суммы, а какие — нет).

Проверка памяти требует вычислить довольно длинный адрес. Тут я хочу пойти на грязный хак: возможно, сделать карту [32][256], чтобы ничего не умножать на 64, и старший байт писать прямо в код, в тело инструкции LDA. Кармак в Wolf3D, помнится, раздухарился ещё жёстче… да, хранение переменной прямо в коде, да ещё в 4 разных местах — тоже потребует копирования её туда-сюда. Но после входа в «основной цикл шагания» обратно мы уже не возвращаемся — возможно, я придумаю способ держать её и в коде, и в одном экземпляре. Это позволит проверять карту простым LDA $DEAD, X (где X — вторая координата, которая до 256, а вместо $DEAD мы подкидываем нашу переменную, в case 0 это будет POS CELL, которая меняется от адреса карты до него же плюс 32<<8). Хотя, возможно, через Indirect я это сделаю ещё быстрее! Не попробуешь — не узнаешь, собственно, почему я и «подсел» на эту задачу. Никакие Factorio рядом не валялись :)

Функция AddToZBuffer8Bit тоже демонстративно отрицает 16-битное суммирование — фишка в том, что переносов там не возникает! Поэтому все аргументы вычисляются через 8-битные суммы.

Ну, и косые стенки я убрал, а смещение всей сцены на доли тайла — вернул. Надо какой-то шлем там нарисовать, который «не успевает за мышкой» :) Тогда можно рефрешить рендер «через кадр», пусть дёргается вместе со статусбаром — типа фича :)

Tags:
+6
Comments16
, отчитываюсь: дыня серебристая «армянский огурец» на эхиноцистис — 2 из 2-х ОК. Снизу она, сверху — арбуз, «нервных огурцов» на отдельное жилище каждому не хватило.
@Demosfen, отчитываюсь: дыня серебристая «армянский огурец» на эхиноцистис — 2 из 2-х ОК. Снизу она, сверху — арбуз, «нервных огурцов» на отдельное жилище каждому не хватило.

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

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

Надрезал, срезал, приложил к мясистой стенке стебля, стараясь, чтобы не провалилось в полость, а прижалось косым срезом именно «к мясу». Судя по промежуточному результату — таки прижалось.

Первые эксперименты уже переросли настолько, что чуть ли не цвести собираются, а на дворе пока только апрель начался. Поэтому я и не особо рассчитывал на что-то, кроме эксперимента как такового. Да и сорта арбузов там «что за столом выплюнул», никак не связанное со средней полосой.

Дыня, которая просто дыня — у меня тоже как-то больше похожа на труп.

Итого можно сказать, что удалось «запрячь» это похабное инвазивное растение в какую-то полезную деятельность. Ещё бы научиться на корне борщевика кориандр выращивать — вообще супер было бы :)

Tags:
Total votes 3: ↑3 and ↓0+5
Comments2

Интересно, до какой скорости можно разогнать 6502-е ядро с современными технологиями?

Допустим, у нас есть чиплет «6502 + 64К SRAM», выполненный в максимально быстром исполнении, вплоть до экзотики типа арсенида галлия (ядро проектировали не дураки и уложились в три с половиной тысячи транзисторов, что тогда было немало для кремния, а сейчас — для арсенида галлия тоже, насколько я знаю, очень до фига).

…и есть несколько кремниевых чиплетов с умножителем, DRAM и прочей веселухой. Или даже один кремниевый чиплет с этим всем, плюс с бутлоадером, который прогружает наши 64К с некоего SPI и после этого снимает с 6502-го ресет.

Собираем их в микросборку, цепляем к портам 6502-го, которые замаплены в ключевые адреса его крошечной памяти.

Команды 6502-го выполняются фиксированное время, причём довольно небольшое (в тактах. А арсенид галлия этих тактов нам даёт не просто много, а очень много). Пульнул той же DDR указание, занимается своими делами, через некоторое время прочитал от неё ответ. Мы с точностью до команды знаем, когда за ним лезть в порт.

Фактически мы получаем, что у нас в SRAM крутится микрокод. Но мы имеем к нему полный доступ и можем напихать туда команд типа «логарифм по основанию ква с половинкой кря и ограничением результата от гага до муму», смотря какие мы там нейросети, графоний или обработку звука мы там делаем.

Ну то есть в камментах я такое уже высказывал, но тут мне именно сама архитектура больно шибко зашла. Там даже система команд просто кричит — «сделайте на мне движок микрокода!!!»

Вопрос, правда, в количестве транзисторов в GaAs. SRAM шибко большая, но там за единицу времени переключается только одна ячейка, а остальные спят сном праведника. А вот три с половиной тысячи ключей самого 6502-го могут выдать огоньку, превышающего возможности технологии. Тут я не шибко великий технолог по чипам, увы.

Tags:
Total votes 3: ↑3 and ↓0+5
Comments7

Ну вот, в очередной раз напророчил, блин.

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

Вот и дожили до дня, когда AMD на вопрос о съёмной оперативной памяти отвечает — «невозможно, слишком длинные линии получаются».

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

Не суть важно, вынуть старый (или сдохший) SODIMM из материнки — или вынуть из него процессор и переставить в новый, большой и живой.

А вот следующий шаг, который надо сделать — и который опять никто не сделает. Посмотрим ещё через три года, как я снова был прав, но рыночек снова порешал по самому тупому и деструктивному пути.

Всё стало плохо в тот момент, когда айтишники стали плыть по течению, как простые потребители.

Tags:
Total votes 3: ↑2 and ↓1+4
Comments0
Я отмоделировал на выходных, как должен смотреться «Вольф на Денди».
Я отмоделировал на выходных, как должен смотреться «Вольф на Денди».

Я сделяль. Ну как «отмоделировал» — ну, так, плюс-минус. Но в целом — да, из тайлов 32×30, часть которых имеет скошенные углы, можно сложить вполне играбельный шутер. Основной адресат, конечно, @Swamp_Dok— но побегать-поглядеть приглашаются все желающие, ибо появилось наконец где побегать и на что поглядеть.

Досбокс кладёт наглухо — код «буквально-учебно-школьный», оптимизации ровно ноль. Чтобы лучше читалось, ага. Так что если оська в принципе не умеет в DOS16 — будет пошаговая стратегия :(

Я б не стал это делать под DOS16, но просто это не проект-самоцель, а ответвление «по-быстрому» от другого проекта, чисто любопытство удовлетворить. Поэтому так уж вышло. Заранее пардон всем тем, кому я любопытство раззадорил, а побегать не дал.

Tags:
Total votes 5: ↑5 and ↓0+9
Comments22

@Demosfen, скажите, это считается за хорошую, среднюю или плохую совместимость?

Если не очень видно — могу вообще прямо макро сделать в области срастания.
Если не очень видно — могу вообще прямо макро сделать в области срастания.

Арбуз взял абы какой, без планов выращивать, просто попрактиковаться. Чего ели, из того и набрал семян. Прививал на «нервный огурец» эхиноцистис (ну потому что это не настоящий совсем уж «бешеный огурец», но тоже какой-то не самый уравновешенный из огурцов — выстреливает семенами из своих двухствольных плодов), метод — «в укол», то есть просто лезвием безопасной бритвы вырезал точку роста и косо срезанный арбуз туда ткнул, по фотке, наверное, видно, что срез смотрел влево (там хоть как-то срослось, а справа всё по нулям, надо было шкурку чуть поскоблить, наверное).

Прижал нано-прищепкой (деревянные такие), губки узковаты (сжимают очень локально и сильнее, чем нужно — это усилие бы на площадь в 2-3 раза больше распределить…) и накрыл потом отрезанной бутылкой. Снизу осталась огромная щель, заткнул её влажной тряпкой и больше не трогал — тряпка сама высохла, потом её достал, ещё через пару дней бутылку снял, ещё вот дня два без всего, только подсветка и полив — вроде полёт пока нормальный.

Рядом виден второй колпак (справа) — под ним всё так же, но пока на стадии «тряпка высохла, вынимаем тряпку». Ещё третий запланировал «в шесть семядолей» — привить арбуз на арбуз и потом на «нервный огурец», но огурец ещё не подрос :) Больше семядолей для бога питательных веществ, даёшь нечеловеческую многоножку! :-D

Оно должно так выглядеть или там явные признаки того, что всё опять сдохнет, как в прошлом году с лагенарией у меня (не) вышло?

Tags:
Total votes 2: ↑2 and ↓0+2
Comments8

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

Магический дристалл Телефон в форме шестигранной призмы. Чисто выпендриться, не ищите в этом смысл.
Магический дристалл Телефон в форме шестигранной призмы. Чисто выпендриться, не ищите в этом смысл.

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

Концы «кристалла» скрывают под собой камеру (одну, естественно — зачем ему вторая, если его можно просто повернуть), микрофон, динамик и снабжены двумя слегка затупленными серебристо-нержавеечными «остриями» (точнее, «тупиями», чтобы ладони не разодрать). Для красоты, прочности (догадываетесь ведь, чем именно он будет обычно ударяться при падении?) и в качестве аварийной зарядки (основная — беспроводная), путём подачи 5-8 вольт в любой полярности. Сам девайс состоит из эпоксидки во имя хоть какого-то практического смысла (полная непотопляемость), но «тупия» отвинчиваются, чтобы добраться через водозащитную резинку до симки и SPI, т. к. нам это чудо как-то шить-перепрошивать придётся явно не один раз, в том числе и «раскирпичивать» наверняка.

Аккумулятор влезет весьма немаленький, но из-за проблем теплопроводности (да и из-за закрытости документации на мощные SoC) придётся ставить мелкий холодный проц «из открытых» и в плане ведроида плясать от всяких проектов типа «Ведро for x86» или скорее «Репликанта». А подходящую для его форм-фактора клавиатуру уже изобрели.

Tags:
Total votes 1: ↑0 and ↓1-1
Comments0

Уловисто пошли «затылочные лампочки». В этот раз, правда, не «Старт», а «Эра» — без характерного отверстия в коробке, но внутри всё вполне даже «затылочное» :)

Крышка снимается плоской отвёрткой легко, защёлкивается обратно плотно, резисторы 5.1 и 3.6, и, главное, какое замечательное отверстие осталось от CON2 :) Из-за него я в этот раз срезал 5.1, то есть занизил мощность не очень сильно (и даже не срезал, просто перерезал дорожку). Дело в том, что отверстие позволило мне с превеликой осторожностью просверлить «юбку», не шуранув сверлом в проходящие там провода (не знаю, правда, насколько это электробезопасно — обнажать скрытый там под пластиком алюминий!) и получить длинную «самоварную трубу» с хорошей тягой (лампа работает без абажура, цоколем вверх).

Со «Стартами» отличить лампу «с той схемотехникой» от лампы с немного другой «смехотехникой» можно было в большинстве случаев по габаритам, указанным на коробке (хоть на миллиметр, а обычно отличаются). Как быть с «Эрами» — не знаю, статистики пока не набрал. Это мой первый «улов», но довольно удачный — «прямоточная труба» вот прямо порадовала :)

Tags:
Total votes 2: ↑2 and ↓0+4
Comments4

Захотелось что-то перепройти Tyrian.

Король вертикальных скроллеров в 320x200 во всей красе. Такую красоту и в наши дни не всякий покажет!
Король вертикальных скроллеров в 320x200 во всей красе. Такую красоту и в наши дни не всякий покажет!

Сказано — сделано. Но вот только засада — я помню очень хорошо, какое оружие там имба, и играть было не очень интересно.

Запустил Tyrian Gift Edition. Оружие зверски пошаффлено, поэтому ХЗ что выбирать %) Одно даже должно изменяться при переходе из эпизода в эпизод, а может, и не одно. Я этого не помню совершенно, но в хелпе так написано.

Чёрт, надо бы ещё разик перепройти, поискать это секретное оружие :) И миди-карту свою старую наконец оживить, на ней он звучал абсолютно офигенно.

А вы знаете какие-нибудь моды на Tyrian, пока у нас ещё полтора выходных есть? ;)

Tags:
Total votes 1: ↑1 and ↓0+1
Comments2

Итак, пятница уже не первый час шагает по глобусу, поэтому держите свеженький выстрел в мозги ;)

Недавнее обсуждение «тыкательного принтера», естественно, не может не будить в пытливых умах вопрос, как бы повысить его скорость печати? Не избежал этой участи и я. Физически всё просто — надо поменьше отрывать тяжёлую ручку от бумаги и рисовать как можно более длинными штрихами. Но как разбить произвольное изображение на штрихи?

Разумеется, решение для искусственно самоограниченной задачи, когда ручка движется строго по горизонтали и бумага после каждого прохода подаётся на один диаметр шарика ручки — элементарное. Берём RLE и Флойда-Стейнберга, за 15 минут пишем этот код:

#define	SQUARE(x) ((x)*(x))
#define	MAXERROR 256	//for RLE

static unsigned char Grayscale8Bit[HEIGHT][WIDTH], Dithered8Bit[HEIGHT][WIDTH];
static signed short AdditionalError[2][WIDTH];

тут мы читаем из файла Grayscale8Bit, этот код я приводить не буду

	memset (AdditionalError, 0, 2*WIDTH*sizeof(short));	//Even/odd lines buffer
	for (int y=0; y<HEIGHT; y++)
	{
		int RLEError=0;
		int PenColor = 255*(Grayscale8Bit[y][0]>127);	//Pen color can be either 0 or 255
		for (int x=0; x<WIDTH; x++)
		{
			int PixelValue = (int)Grayscale8Bit[y][x] + AdditionalError[y&1][x];	//Exact pixel value plus Floyd-Steinberg error from the prev. line
			RLEError += SQUARE (PixelValue - PenColor);	//To avoid missing contrast details such as thin vertical lines, RLE error counted as square.
			if (RLEError > SQUARE (MAXERROR))
			{
				PenColor = 255-PenColor;		//Inverse pen position (up/down)
				RLEError = SQUARE (PixelValue - PenColor);	//Begin counting new RLE error immediately
			}
			Dithered8Bit[y][x]=PenColor;		//Put proper color into the output array
			AdditionalError[!(y&1)][x] = (PixelValue - PenColor)/2;		//Put remaining error into next line buffer, not exactly Floyd-Steinberg but sort of.
			if (x) AdditionalError[!(y&1)][x-1] = (PixelValue - PenColor)/4;
			if (x<WIDTH-1) AdditionalError[!(y&1)][x+1] = (PixelValue - PenColor)/4;
		}
	}

тут мы пишем в файл Dithered8Bit, этот код тоже у каждого свой получится

Код без каких-либо капризов, отладки и подбора параметров сразу выдаёт результат:

Сверху, как нетрудно догадаться, оригинал.
Сверху, как нетрудно догадаться, оригинал.

Ну то есть задача в её куцем виде — совсем детская. Там не то что думать не пришлось, даже ошибиться негде было. Но и результат тоже, мягко говоря, так себе.

Ну а теперь вот вам по случаю пятницы головоломка: как полностью реализовать потенциал не одной, а двух степеней свободы нашего привода, да ещё с учётом того, что скорость протяжки бумаги и скорость вошканья каретки в общем случае друг другу не равны, а проходить ручкой по одному месту больше одного-двух раз — нежелательно, бумага не чугунная. Мучайтесь и ломайте головы над возможными алгоритмами такого вот обхода растра ;)

Спойлер, но вы его сразу не читайте, чтобы не сбиться со своих мыслей: я бы, наверное, обошёл сначала изолинии крупных элементов, разбивая пространство между ними на более или менее густые штриховки, а потом уже прикинул бы ошибку и добавил-убавил штрихи сообразно мелким деталям. Перо, идущее вдоль изолиний — в общем случае довольно хорошая идея, когда надо не убить разборчивость изображения, а то даже ещё и усилить её. Но, правда, это касается только фотореалистичных изображений, а в задаче-то у нас произвольные.

Tags:
Total votes 3: ↑3 and ↓0+5
Comments3
К вопросу о стабилизации плазмы, поднятому очередной публикацией на тему «реактивного двигателя со встроенным МГД».
К вопросу о стабилизации плазмы, поднятому очередной публикацией на тему «реактивного двигателя со встроенным МГД».

Начну с извинений — я дурак и забыл, что «на пробу» поставил галку «арифметическое кодирование» в GIMP. А потом удивлялся, что картинка в камменты не грузится.

В общем, вот та самая «Kreosan-tier шаровая молния», которую я тут уже неоднократно поминал добрыми и не очень словами. Имеющие доступ к таким разрядникам — могут экспериментировать на здоровье ;)

Возможно, через неё можно и настоящую молнию пропустить — гроза, воздушный шарик куба на два и мокрая нейлоновая верёвка со вплетённой тоненькой металлической проволочкой… но я пас, я ещё хоть немного пожить хочу, да и соседи не оценят. Креосану — креосаново, жене кесаря — «кесарево» или как оно там. Шаговое напряжение в мокром грунте — не игрушки.

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

После этого можно запульнуть искусственной ШМ в несколько датчиков магнитного поля и оценить порядок величин, ну и прочие промеры токов-напряжений в летящем плазмоиде произвести. Но заранее готовиться к этому — смысла нет, сначала надо подтвердить независимым экспериментом сам факт. Сенсации в тот год не случилось, так что, может быть, автор публикации в «НиЖ» сам себя обманул где-то.

А вот после этого, зная примерно, что нужно для хорошей жизни здорового счастливого покемона стабильного плазмоида — можно с новыми силами браться за тот злосчастный реактивный двигатель. Возможно, за это время его автор всё-таки сподобится сунуть в факел сначала пару электродов, чтобы посмотреть наличие разности потенциалов между разными частями плазмы, а потом — обычную галогенку на 12 вольт, поскольку её нить из-за характерной формы (форма прямой спирали без поддержек) прекрасно уловит сильные магнитные поля при малейшем движении.

Даже если двигатель окажется туфтой, по крайней мере, у нас появится возможность вместо китайских фейерверков на НГ запускать настоящие шаровые молнии! Вот только соседи не оценят этого ещё больше :-D Ладно, кончаю шутить — физикам предоставляется трибуна в камментах, можете продолжать буйство, начатое под статьёй о самом движке ;) с удовольствием почитаю, кто что скажет про притащенный мной артефакт, да и не только про него.

Tags:
Total votes 2: ↑1 and ↓10
Comments0

Ещё одна «затылочная лампа» встала на испытания :)

Отличается высотой (118 мм) и резисторами 5.1 и 3.6, причём 3.6 при отрывании с определённой вероятностью увлечёт за собой дорожку (соединил обратно каплей припоя).

Как можно догадаться по этому обстоятельству — 5.1 я оставил, сильно занизив мощность (но почему-то глазом этого обстоятельства всё равно не видно). 5.1 там с краю — возможно, его оторвать было бы проще и безопаснее для дорожек.

Как её отличить от позапрошлой «затылочной лампы», у которой тоже 118 мм, но резисторы 4.3 параллельно с 3.0 (в камментах к посту про первую «затылочную лампу» — наука не знает. Пропорция там та же, поэтому не уверен, что это важно.

Поиск хорошего удлинителя-зарядника продолжается. Если не будет ещё вариантов — будем считать этот победителем, вероятность, что куплю, вскрою и распишу внутрянку постом — более 50%.

Tags:
Total votes 2: ↑2 and ↓0+3
Comments0

Вопрос в аудиторию: существуют ли, попадались ли кому-то адекватные удлинители со встроенным USB PSU? Да-да, я про эти нынешние модные «три розетки на 220 и четыре на 5 вольт».

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

Методом перебора искать, сами понимаете, даже уже и не смешно :(

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

Tags:
Total votes 2: ↑2 and ↓0+2
Comments6
2041 оттенок несерого, или Как впихнуть невпихуемое.
2041 оттенок несерого, или Как впихнуть невпихуемое.

Легко обозначить на диаграмме четыре цвета! И 16 — не проблема. Все 256 оттенков серого, пожалуй, человеческий глаз уже не различит. А как различить тысячу и более?

На помощь приходят они! Палитры «в стиле тепловизора». Как же их получить?

Попробуем сначала тривиальное решение. Повторим один канал от 0 до 255 четыре раза подряд, а при помощи другого — различим эти повторы. Бррр, и некрасиво, и отличающиеся на единичку цвета часто похожи друг на друга меньше, чем отличающиеся на 256.

Нет, нужно что-то непрерывное! Давайте сначала перейдём от чёрного к зелёному, потом — к красному, потом — к белому, потом — к синему? Уже лучше! Но всё-таки белый светлее синего, а зелёный — красного, и хотя синие звёзды таки горяче́е — синий цвет зрение воспринимает как холодный…

Да, вот теперь лучше! Чёрный — синий, синий — зелёный, зелёный — красный, красный — жёлтый, жёлтый — белый! Прекрасные дополнительные диапазоны таились в комбинациях нескольких каналов сразу! А можно ли ещё больше?

От чёрного до серого — 128, от серого до светло-синего — 128, от него до чисто синего — 128, потом до зелёного 256 и потом до сине-зелёного, и только от него уже к красному, и потом от него сначала к пурпуру, а только от пурпура — к жёлтому и потом — к белому! Хорошо, но светло-синий светлее синего, а между сине-зелёным и красным — явный грязно-тёмный провал.

Ладно, пусть будет от чёрного — к серому, от него — к синему, от него — к светло-синему, а от него уже — к зелёному, а в переходе от сине-зелёного к красному пусть сначала быстро разгорается красный и медленно затухает сине-зелёный, а потом — наоборот! Две тысячи уникальных оттенков, плавно нарастающих по «психологической температуре»!

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

	int c,x=0;
	for (c=0;c<192;c++,x++)
	{
		Test[y][x][0]=c;
		Test[y][x][1]=c;
		Test[y][x][2]=c;
	}
	for (c=0;c<192;c++,x++)
	{
		Test[y][x][0]=191-c;
		Test[y][x][1]=191-c;
		Test[y][x][2]=192+c/3;
	}
	for (c=1;c<128;c++,x++)
	{
		Test[y][x][0]=c;
		Test[y][x][1]=c;
		Test[y][x][2]=255;
	}
	for (c=1;c<256;c++,x++)
	{
		Test[y][x][0]=127-c/2;
		Test[y][x][1]=127+c/2;
		Test[y][x][2]=255-c;
	}
	for (c=1;c<256;c++,x++)
	{
		Test[y][x][0]=0;
		Test[y][x][1]=255;
		Test[y][x][2]=c;
	}
	for (c=1;c<256;c++,x++)
	{
		int Br = 127-abs(c-128);
		Test[y][x][0]=c  +Br/4;
		Test[y][x][1]=255-c +Br/4;
		Test[y][x][2]=255-c +Br/2;
	}
	for (c=1;c<256;c++,x++)
	{
		Test[y][x][0]=255;
		Test[y][x][1]=0;
		Test[y][x][2]=c;
	}
	for (c=1;c<256;c++,x++)
	{
		Test[y][x][0]=255;
		Test[y][x][1]=c;
		Test[y][x][2]=255-c;
	}
	for (c=1;c<256;c++,x++)
	{
		Test[y][x][0]=255;
		Test[y][x][1]=255;
		Test[y][x][2]=c;
	}

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

А гость нашей программы — профессиональная логарифмическая палитра, цельнотянутая из какого-то научного журнала то ли конца 80-х, то ли начала 90-х, когда тепловизоры только завоёвывали свою экологическую нишу (увы, авторство по этой причине вряд ли удастся установить, она очень долго переходила из рук в руки). Обратите внимание, как в ней идут цвета: первые несколько отличаются очень сильно, а последние — на какую-то несчастную единичку в одном разряде одного канала. Вот она — работа профессионалов!

А какие палитры для приведения одноканального HDR (с неподвластным глазу SNR) к трёхканальному обычному изображению (с подвластным глазу SNR) знаете вы?

Tags:
Total votes 2: ↑2 and ↓0+2
Comments6

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

Может, ей в светодиодной плате и алюминиевом цоколе тоже несколько отверстий сделать, чтобы прямотоком продувало?

Tags:
Total votes 2: ↑2 and ↓0+2
Comments12
Зачем филин в ветер поднимает уши?
Зачем филин в ветер поднимает уши?

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

Дело в том, что совы вообще и филины в частности — офигенные «сонары». Его не видно и не слышно, а он сидит и всё слышит. Даже то, что не видит (а видит он тоже на зависть всем нам, даже днём).

А среда-то движется. И скорость распространения звуковой волны «по ветру» и «против ветра» отличается на плюс-минус скорость этого самого ветра (нет, это не эффект Доплера, потому что источник и приёмник звука взаимно неподвижны. Частота не меняется, меняется только фаза за счёт «скорости доставки» волны от источника к приёмнику).

То есть без учёта скорости движения среды можно получить неточную оценку разности фаз между левым и правым ухом (настоящими, которые для слуха). 10 м/с относительно 330 м/с — вроде пустячок, но для той точности, с которой филин наводится на шуршание вкусной толстой крыски под снегом — это уже может быть критично. И, чтобы учесть эту скорость движения среды — надо иметь ещё два уха-флюгера, которые из перьев и на макушке. Шёлковые, пружинистые и умеренно парусные. И поднимать их повыше каждый раз, когда дует ветер — чтобы точно его измерить.

А вы что думаете по этому поводу? Проверить относительно нетрудно — подуйте филину на перьевые уши так, чтобы не задеть остального филина, и филин возьмёт неправильный курс на столь аппетитную для него крыску.

Tags:
Total votes 5: ↑5 and ↓0+5
Comments10

Поскольку сегодняшняя суббота — это снова суперпятница, снова держите суперпятничное.

Электромобили — конечно, круто. Но мы забыли старые добрые микролитражки! Да, у них ДВС. Но у них мощность такая, что если пересчитать заряд электромобиля в работу ТЭЦ и сравнить с микролитражками, то по экологичности они уделают любого илона маска и никакая эффективность сжигания топлива на ТЭЦ его не спасёт. Почему бы не посостязаться не с ним, а с «Трабантом»? Думаете, проще него сделать нельзя? Ха, подержите моё пиво.

При изготовлении этого фотошопа «Оки» ни одна нейросеть не пострадала. Кто вспомнил юмористический псевдодокументальный сайт «Ока-тюнинг» — тот молодец. Кто вспомнил СеАЗ С-3Д — тот вообще титан.
При изготовлении этого фотошопа «Оки» ни одна нейросеть не пострадала. Кто вспомнил юмористический псевдодокументальный сайт «Ока-тюнинг» — тот молодец. Кто вспомнил СеАЗ С-3Д — тот вообще титан.

И это, заметьте, не какой-то квадрик с крышей, по сути остающийся квадриком! Это таки двухместная городская нанолитражка, с единственной дверью (разумеется, правой) и массой прикидочно под мотодвижок воздушно-масляного охлаждения кубиков на 300-400. И даже можно взять с собой пару сумок и кошку! Колёса, правда, почти царапают изнутри фары и задние огни, но разве ж это беда? Чем не идеал минимализма?

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

Я считаю, что сейчас это вообще самый перспективный класс. Предельно бюджетно, при этом экологично, ломаться там примерно нечему, на парковке раза в 2-3 компактнее, практично, ну и реально в плане массового производства, наконец. Подушки безопасности там тоже вполне помещаются, не совсем «капсула смерти». Потенциальный массовый автомобиль для сугубо практических нужд, причём для людей с далеко не айтишными зарплатами.

А для сельской местности — вариант чуть дороже, с полным приводом, который может утащить небольшой прицеп, и люком в полу для зимней рыбалки а вот фиг, для рыбалки нужна ещё и автономная печка по типу «Запорожца», которая позволяет не окоченеть при остановленном движке, а для неё места уже нет.

Tags:
Total votes 6: ↑5 and ↓1+5
Comments8

Вот почему я считаю, что над «нео-Фидо» надо активнее работать. P2p как-то больше ассоциируется с политическими проблемами и всякими бриарами, а ведь произошедшее в нашем климате, в общем-то, норма жизни. «Инфобезопасных» решений — море, а «противокатастрофических» — ровно ноль. А ведь это совершенно разные задачи.

Когда сидишь по уши в снегу и не можешь на метр от печки отойти, а надо весточку подать родным — не нужны никакие тайные чаты и приватные подписки. Нужен протокол, который позволяет синхронизироваться за то время, пока машина по трассе пролетает мимо через твою зону покрытия, обменяться хотя бы парой килобайт текста (предполагается, что ключ от него есть только у адресата, иначе мы открываем огромные ворота для жуликов всех мастей) и прицепить свою геометку для обратного сообщения, чтобы остальные клиенты знали, в какую сторону приоритетно надо отправлять ответ.

Задача, не только не тождественная «политическим» p2p-мессенджерам, а во многом противоположная ей (в части гео так уж точно). И самая сложная часть в этом — это сделать это решение общепринятым, потому что без массового покрытия эта система не значит ровно ничего.

Tags:
Total votes 7: ↑7 and ↓0+8
Comments5

На дворе снова пятница, а у меня снова высокая температура (похоже, кто-то в электричке обчихал). Поэтому снова держите порцию пятничного малярийного бреда:

Допустим, верна гипотеза о том, что тёмная материя — это сверхлёгкие частицы (настолько лёгкие, что их дебройлевская волна размером эдак с Галактику). А такую большую долю массы составляют потому, что их не просто много, а хтонически огромное количество. То есть, будучи притянутыми гравитацией ядра той или иной галактики, они образуют пушистый ком размытой квантовой неопределённости (или как оно там называется), туннелирующий сквозь абсолютно всё и не взаимодействующий практически ни с чем. Особенно друг с другом. Так и клубятся вокруг центра масс — они везде одновременно и при этом нигде конкретно.

А теперь в порядке бреда: а если не совсем «ни с чем»? Ведь они самой «густой» частью своей волновой функции находятся под горизонтом событий ядра. Могут ли они образовать «мостик», по которому энергия ядра понемногу удирает аж из самой сингулярности? Да-да, туннельный эффект на галактических масштабах ^______^

И контрольный в голову — а что, если эта утечка и есть тёмная энергия? Может ли она как-то «расталкивать» галактики или просто ослаблять на больших дистанциях гравитацию?

Ломайте пока головы, а я пошёл держать ноги в тепле — «я очень занят (на клеточном уровне)» © Башорг :)

Tags:
Total votes 5: ↑5 and ↓0+8
Comments4

Наверное, самая безумная и несбыточная моя мечта — Викикодия, хранящая не отдельные сниппеты, а хостящая суровую сетку из функционирующих проектов. Вплоть до их сборки в бинарник (придётся прикрутить онлайн-компиляцию, да).

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

Сохранить можно только версию статьи, нормально скомпилировавшуюся. Естественно, до патрулирования она недоступна никому, кроме автора и модераторского состава, иначе количество «закладок» быстро станет астрономическим.

Кроме мощного инструмента поддержания порядка в проектах, без превращения их в классификацию животных по Борхесу, эта штука обещает (а чего б ей не обещать, всё равно ж несбыточная!) околонулевой порог вхождения в опенсорс. Связность функций множества проектов, от базовой математики до целевого функционала, и единообразная структура, в которой не надо копаться, чтобы собрать себе персональный билд со своими хотелками.

Которые, возможно,модсостав одобрит для всех.

Tags:
Total votes 2: ↑2 and ↓0+2
Comments13

Information

Rating
119-th
Registered
Activity