?

Log in

программистское, две ссылки - Поклонник деепричастий [entries|archive|friends|userinfo]
Anatoly Vorobey

[ website | Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Links
[Links:| English-language weblog ]

программистское, две ссылки [мар. 31, 2010|09:03 pm]
Anatoly Vorobey
(интересно будет только программистам)

1. Совершенно замечательное демо трехмерного путешествия по губке Менгера. Смотреть в любом браузере, кроме Эксплорера. Весь код укладывается в 512 байт!

Там используется интересный алгоритм, который называется ray-marching. Должно быть не очень сложным и поучительным упражнением сделать unobfuscation всему этому коду и подробно объяснить, как он работает. Рекомендую; если кто-то сделает это, дайте ссылку и я сюда помещу.

2. Длинная, подробная и интересная запись о том, что неправильно делали разработчики Tcl/Tk, и почему этот язык/среда потеряли в значительной степени свой mindshare к 2010-му году. Трудно подытожить всю эту запись в одном предложении, не буду и пытаться; замечу только, что по мере того, как автор объяснял, что таким-то и таким-то образом у программистов постепенно портилось мнение о Tcl и Tk-программах, я кивал головой: да, именно так я и думал, именно такие - зачастую ложные - впечатления у меня формировались пять и десять лет назад. Все это вместе можно читать как мини-руководство к тому, как не развивать и не поддерживать популярный язык программирования. Комментарии, кое в чем успешно спорящие с автором, тоже интересны.
СсылкаОтветить

Comments:
[User Picture]From: incogn1too
2010-03-31 06:33 pm
Очень радуют такие посты. Спасибо.
(Ответить) (Thread)
[User Picture]From: dmarck
2010-03-31 06:36 pm
Про тикль хорошо. Надо б попереводить, но и времени мало, и язык, увы, для меня не совсем лёгок (оборотов там необычных -- для меня -- хватает)...

Upd: Just to clarify: язык заметки, а не тикль, хотя, конешно, за эти годы его я тоже насмерть позабыл ;-)

Edited at 2010-03-31 18:40 (UTC)
(Ответить) (Thread)
From: saccovanzetti
2010-03-31 09:06 pm
Мозилла 2-я подвисает
(Ответить) (Thread)
From: spicausis.lv
2010-03-31 09:14 pm
Деобфусцировал, насколько мог, тут: http://spicausis.lv/jspongy/ , но принцип действия ускользает от понимания: как генерируется мочалка из простого, скучного массива представляется мне полной мистикой. Очень надеюсь, что кто-нибудь сможет прокомментировать код как следует: интересно!
(Ответить) (Thread)
[User Picture]From: avva
2010-03-31 09:49 pm
Очень неплохо! Я добавлю то, что понял, когда сам примерно до того же дошел.

Массив sponge в вашей нотации - всего лишь вспомогательный трюк для того, чтобы выделить "среднюю треть" из 128 элементов. Он заполнен единицами с 43-й по 86-й элемент, и нулями во всех остальных местах.

Главный цикл работает вот как. Сначала мы вычисляем наше текущее положение, в трехмерных координатах, внутри мочалки - это X,Y,Z: обратите внимание, что они одинаковы для всех точек битмапа и могут быть вынесены за пределы циклов, они зависят только от time. time помогает нам симулировать наше движение внутри мочалки. Далее, в главном цикле для каждой точки битмапа мы вычисляем направление, в котором должен двигаться "луч зрения", когда мы смотрим под соответствующим углом из нашей точки X,Y,Z; числа u, v, w дают нам сдвиг координат для каждого небольшого шага вдоль луча зрения. Двигаясь этими шажками в третьем вложенном цикле, мы на каждом шагу уменьшаем число света, которое мы хотим нарисовать в точке (x,y) - это число h. Почему уменьшаем число света? - потому что чем дальше препятствие, в которое упрется взгляд, тем светлее мы его делаем. Когда мы прекратим третий цикл, в h будет число от 0 до 127, где 0 - самый белый, 127 - самый черный цвет. Мы умножаем его на два и делаем значением opacity данной точки внутри битмапа, не ставя никаких RGB-значений, одну opacity (для этого i двигается по индексам 3, 7, 11... - это opacity последовательный точек, в то время как 0,1,2 4,5,6 8,9,10 - их RGB-значения).

Мы хотим остановить третий цикл в тот момент, когда наш луч зрения упрется в препятствие. Препятствие для нас - когда мы натыкаемся на первую или третью треть ребра куба, а не на серединную треть, которая вырезана; причем это рекурсивно спускается на вложенные кубики. Этим занимается четвертый цикл. Значение m может меняться так: 1, 3, 9, 27 - и все, если оно еще раз увеличится, то цикл закончится. Каждое из этих значений соответствует уровню рекурсии вложения кубиков. Для каждого из них мы смотрим на 7 последних бит координат X, Y, Z после умножения на m и проверяем с помощью массива sponge, не попали ли мы в "среднюю дырку" по данной координате. Если попали по двум или трем, четвертый цикл заканчивается на маленьком значении m, и третий цикл делает следующий шажок. Если попали всего по одной или нулю, причем для всех уровней m, то мы прекращаем третий цикл и останавливаем луч и записываем, сколько освещения здесь надо, и переходим к следующей точке.

Что мне остается невыясненным, и я бы хотел увидеть подробно расписанным:

- почему условие в четвертом цикле < 2, хотя казалось бы надо < 3
- как именно time интерпретируется в качестве текущего места внутри мочалки, и как получается сдвиг луча зрения ("поворот")
- подробно объяснить преобразования координат и вычисления X,Y,Z, u, v, w.

Update: исправил в этом комментарии неправильные слова насчет смысла X,Y,Z.

Edited at 2010-03-31 21:58 (UTC)
(Ответить) (Parent) (Thread)
[User Picture]From: msh
2010-04-01 12:08 am
Мне кажется, значительно интереснее было бы узнать не как Tcl потерял mindshare, а как он его вообще приобрел. Я помню, как я практически одновременно изучал Tcl и тогда едва появившийся Perl 5, и с радостью выкинул книжку по Tcl и все что на нем написал как только слегка понял Perl.

Мне совершенно непонятно что может быть в Tcl привлекательного, ну кроме что Tk. Вообще его существование я могу объяснить только мощным авторитетом Sun на то время, а сейчас он застрял в каких-то замшелых нишах

Непонятное, короче, для меня явление. Типа американских стиральных машин с пропеллером.
(Ответить) (Thread)
[User Picture]From: avva
2010-04-01 12:26 am
каким пропеллером? зачем пропеллер? :-)
(Ответить) (Parent) (Thread)
[User Picture]From: msh
2010-04-01 01:29 am
Ну традиционная американская конструкция стиральной машины - это вертикальный барабан, в котором вращается пропеллер. Эта конструкция хуже европейской всем, вообще всем. Для ее существования нет никаких причин, она устарела уже лет 50 тому назад. И тем не менее - их выпускают до сих пор, и не просто выпускают улучшают и развивают

Вот это такое же непонятное мне явление, как Tcl сосуществующий с Perl и Python.
(Ответить) (Parent) (Thread)
[User Picture]From: dimrub
2010-04-01 05:23 am
ППКС. Единственный проект на Tcl/Tk, который я получил в руки, переписал на Perl/Tk при первой же возможности.
(Ответить) (Parent) (Thread)
[User Picture]From: netch
2010-04-01 06:50 am
Tcl хорош несколькими вещами:
1. Компактностью ядра - для встраивания.
2. Лёгкостью и естественностью метапрограммирования. Не настолько, как в LISP, где вообще программа и данные различаются только содержанием, но очень близко к нему - но при этом сохраняя императивность. Собственно, Tk это плотно использует - биндингам других языков приходится сильно извращаться для достижения того, что на Tcl естественно.

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

А ещё у него неплохая библиотека (например, регэкспы мощнее и быстрее перловых)
(Ответить) (Parent) (Thread)
[User Picture]From: mikhailian
2010-04-01 08:13 am
И поддержка юникода постарше и посерьёзнее, чем у многих современных языков и графических тулкитов.
(Ответить) (Parent) (Thread)
[User Picture]From: janatem
2010-04-01 05:32 am
Насчет демо: так и задумано, что изображение сильно размытое, с какими-то яркими пятнами-дефектами? К тому же оно тормозит и загружает на 100% одно процессорное ядро.

Хотя, конечно, 512 байт -- это круто!
(Ответить) (Thread)
[User Picture]From: avva
2010-04-01 08:00 am
Это просто то, чего удалось добиться в 512 байтах :)
(Ответить) (Parent) (Thread)
[User Picture]From: _ieronim
2010-04-10 06:06 pm
Давно хотелось бы почитать аналогичный текст про Перл :) Хотя я понимаю, что по сравнению с Tcl он в полном порядке, обидно, что его значимость настолько стабильно и необратимо падает.

Правда, я понимаю, что такой текст мог бы представлять собой ровно четыре слова, а именно:

CGI и Perl 6.
(Ответить) (Thread)
From: (Anonymous)
2010-04-16 07:51 am

Hardcore size optimizing JSpongy from 512 bytes to 321 bytes

Seeing some recent activity around JSpongy, I decided to have a second look at the code and size optimize it, for real. It's now down to 321 bytes, and I'm sure I can squeeze a few more bytes.

http://www.p01.org/releases/512b_jspongy/jspongy_hardcore.htm
/!\ this version is heavily optimized for size, not for speed.


Hope you appreciate this as much as the original ;)

Mathieu 'p01' Henri
http://www.p01.org
(Ответить) (Thread)
[User Picture]From: avva
2010-04-16 10:07 am

Re: Hardcore size optimizing JSpongy from 512 bytes to 321 bytes

Thanks, Mathieu :)
(Ответить) (Parent) (Thread)
[User Picture]From: gotoxy
2012-01-05 09:35 pm

Re: Hardcore size optimizing JSpongy from 512 bytes to 321 bytes

Я дико извиняюсь, но что я не так делаю? Сохраняю код по ссылке (уже уменьшенного варианта). Код весит аж 545 байт. Вроде он пишет, что размер уменшил до 321 байт. Я понимаю, что где-то чего-то недопонимаю. Но что? =)
(Ответить) (Parent) (Thread)