Lars Bak

Nov. 11th, 2013 03:23 pm
ermouth: (Default)

Прекрасное из обсуждения производительности js и Java:

But if you really want to compare the two, here's an interesting datapoint for you: HotSpot, which is one of the more popular, and also more performant JVM implementations out there, was created by a team of guys which included, among other people, a guy named Lars Bak. But actually, HotSpot didn't appear out of thin air, it was based on the sourcecode of the Anamorphic Smalltalk VM, which was created by a team of guys which included, among other people, a guy named Lars Bak.

V8, which is one of the more popular, and also more performant JavaScript implementations out there, was created by a team of guys which included, among other people, a guy named Lars Bak. But actually, V8 didn't appear out of thin air, it was based on the sourcecode of the Anamorphic Smalltalk VM, which was created by a team of guys which included, among other people, a guy named Lars Bak.”

Такие дела. Интересно, что визуально код на смолтоке у меня легко в голове распознаётся, но я ни строчки на нём не написал о_О

ermouth: (Default)

Движок двинаньюса написан на не самом быстром языке и работает на не самой быстрой БД – тем не менее показывает прекрасную производительность. Это при том что каждая страница содержит динамические подборки, выбираемые по тегам и “радиусу” на оси времени.

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

Кэш – в оперативной памяти, полностью синхронный. Используется просто очень большой javascript-объект, hash table. Главные ключи формируются из параметра вызова шаблонизатора блока.

Получается, что каждый экземпляр приложения (при многопоточной реализации) имеет свой полный экземпляр кэша. Это неэкономно, на первый взгляд, с точки зрения использования RAM. Тем не менее, при моих прикидках у меня получалось, что мне никогда не нужно будет больше гигабайта памяти на ядро процессора – и Амазон EC2 прекрасно подошел.

Главная фича – как блоки инвалидировать, как кэшу узнать, что блок пора пересчитать при следующем запросе.

Для этого помимо главной хэш-таблицы сформированы ещё несколько индексов из указателей. Они содержат группировки блоков по разным признакам, в частности по тегам и по временнЫм диапазонам. Помещение блока в кэш автоматически помещает его во все связанные таблицы. Как только наступает соответствующий признак, инвалидируется вся таблица.

В какие именно таблицы указателей помещать, решает конкретный шаблонизатор – на основании параметров, с которыми он был вызван. Например, если мы запросили вывод списка заголовков по теме Культура, только с картинками – результат будет положен и в таблицу тега “Культура”, и в таблицу признака “С картинками”, и в таблицу блоков, отрендерённых шаблонизатором “Список заголовков”. Это называется “полностью ассоциативный кэш”.

Теперь надо узнать, когда эти таблицы инвалидировать.

CouchDB имеет интерфейс, уведомляющий подключеного клиента о появлении или обновлении документа в той или иной БД. По такому уведомлению новый док загружается и кэшируется в RAM, а все блоки, на которые он мог бы повлиять, отмечаются как устаревшие. Это очень быстрая операция, потому что итератор просто обходит все объекты по нужным хэш-таблицам и сбрасывает признак готовности.

Физически объекты из памяти не удаляются – потому что они скорее всего будут вскоре заново сгенерированы и поверх переписаны, это раз. И потому, что удаление, скажем, 50К объектов (например, мы обновили какой-то часто используемый шаблонизатор) вызовет stall на время сборки мусора.

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

В однопроцессорной системе можно удалять по ttl, причём это вполне можно делать асинхронно. Но так как у нас система многопоточная (несколько одинаковых экземпляров js-процесса, по которым раскидываются запросы), гораздо проще по минимуму нагрузки эти потоки по очереди рестартовать – так и сделано.

С помощью этой же механики происходит рестарт потока при падении – оно очень живучее.

Со старта обслужено примерно 1.5М запросов к серверу, даже не чихнуло ничего.

.net to JS

Oct. 21st, 2013 11:21 pm
ermouth: (Default)

Снимок экрана 2013-10-21 в 23.05.51 

Компилятор MSIL’а в javascript – jsil.org. Альфа совсем, но LLVM тоже когда то альфой был.

На картинке кросс-компайл того, что в дотнете называется multicast delegates, а в js никак специально не называется – хотя по такому принципу построена jQuery например или там express.js. Это вообще оч распространённый сценарий в js-мире.

Оч круто – хотя и очень глючно пока.

ermouth: (ang)

Вообще, удивляет диспропорция наград и общественного признания между Тимом Бернерсом-Ли и Брендоном Айком.

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

Теперь связка js+браузер+WebGL становится платформой для игр. РПГ причём, реального времени – потому что стало хватать производительности. Пока это всё продукты кросс-компиляции с C++ в js – потому что бОльшая часть игр написана на C++ – но это не навсегда.

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

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

Догоняющей на этом рынке будет, как обычно, Microsoft – IE не поддерживает WebGL, равно как и движок js в IE оч медленный.

0.8

Sep. 15th, 2013 04:50 pm
ermouth: (Default)

Закоммитил на гитхаб jQuery.my 0.8 – в целом против 0.7.8 багфиксовый релиз. Версии с 0.7.3 я вообще на гитхаб не выкладывал, внутренние установочно-прогонные релизы были.

Написал к этому всему markdown наконец-то – хорошо что сёдня рано встал, в 10 сел за клаву – и 6 часов вот проколбасился, 11000 знаков текста.

Нашёл заодно наконец устроивший меня markdown-редактор, Mou, с окошком пополам. Бесплатный причём. Под Мак яснодело.

Ещё бы серверный валидатор выложить сподобиться и маны к нему написать…

ermouth: (Default)

$.my вместе с новым валидатором в полный рост реализует концепцию MVVM. Декларативное связывание реализовано даже круче чем в WPF где-то – контролы в UI “сидят” прямо на том-же объекте, что передан как данные и риалтайм его мутируют.

Обратное тоже верно – окружение формы может поменять данные под формой обычным яваскриптовым синтаксисом, сказать форме перерисоваться – и она перерисуется, отразив данные.

var data = {name:””, sex:””}; $(“#someform”).my(manifest, data); //init
data.name=”John”; $(“#someform”).my(“redraw”); // update

Соответственно, для всего остального кода значение объекта data будет меняться по мере изменения контролов.

MVVM как концепт, конечно, не без подводных камней. Вот сам Госсман, чувак который ввёл понятие MVVM пишет о некоторых “прелестях” MVVM в WPF. http://blogs.msdn.com/b/johngossman/archive/2006/03/04/543695.aspx

Оно, конечно, прожорливо, особенно если сохраняет undo-историю или подвязано к зеркальным контролам с частыми изменениями (слайдеры к примеру). Я это всё пронаблюдал, когда баловался с InfoPath и Silverlight.

jQuery.my, в отличие от WPF, для решения этой проблемы вводит дополнительный опциональный параметр связи между контролом и данными под ним – delay. И этот механизм подавляет на указанный период одинаковые события – байнд выполнится только по прошествии delay миллисекунд с последнего вызова. Если за это время был ещё вызов таймер сбросится и отсчёт начнётся снова.

Аккуратное регулирование этого параметра приводит к куче интерфейсных последствий. Вот пример http://jquerymy.com/s/delay078.html

Замечу, что код этого примера, манифест который всё рисует (включая html), содержательно занимает 9 строк.

{ params:{delay:3},	
  init:[
    {row:"550px", label:"150px", rowCss:"my-row pt8 pb8"}, 
    '<h3>Зеркально-зависимые контролы, 0.7.8</h3>',
    ["3 мс", "num#num", "sli#sli.w330.ml20"],
    ["100 мс", "num#num2", "sli#sli2.w330.ml20"]
  ],
  ui: {
    "#num":  {bind:"num",  watch:"#sli",  check:/^(100|\d{1,2})$/},
    "#sli":  {bind:"num",  watch:"#num"},
    "#num2": {bind:"num2", watch:"#sli2", delay:100, check:/^(100|\d{1,2})$/},
    "#sli2": {bind:"num2", watch:"#num2", delay:100}
}}


MVVM вопщем. InfoPath в браузере. Только там манифест, модель и схема данных раздельно жили, а у меня это единая конструкция.

ermouth: (Default)

Открыли бета-версию – сайт пресс-центра правительства области. Оно не без косячков пока, но собственно для того и выкатили, чтобы уже в бою тестировать.

Снимок экрана 2013-07-09 в 0.10.56

Чтобы было понятно – до этого было так:

Снимок экрана 2013-07-09 в 0.13.57

Контент на них одинаковый, ога.

Read more... )
ermouth: (Default)

Больше для себя, зафиксировать, предыстория здесь и здесь.

Прочитал первые четыре главы http://hottheory.files.wordpress.com/2013/03/hott-a4.pdf.  Первые две главы прочитал уже на два раза. Страниц там 475, а не 600.

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

Read more... )

HoTT

Jul. 2nd, 2013 06:21 am
ermouth: (Default)

morfizm меня навёл на потрясающую совершенно базовую математическую теорию – HoTT. Собсно, у него-то шла речь о том, что несколько математиков разработали теорию и написали по ней научный 600-страничный труд используя… github. Морфизм это скорее как забавный курьёз привёл – а я пришёл в полный, неописуемый восторг.

В восторг от теории.

Я тут недавно писал про неподвижную точку, валидацию, вычислимость, то-сё… Так вот, цитатка одна:

Secondly, every type-forming rule conforms to a well-understood pattern: there is a part for formation (making a new type), a part for introduction (how to construct elements of that type), a part for elimination (how to extract information from an arbitrary element of that type), and a part for computation (how introduction and elimination interact). This uniformity makes the meta-theoretic analysis of type theory particularly simple, allowing proofs of “consistency by evaluation”.

Болд – от меня. Это вот отсюда, длинный довольно пост, который умеренно подготовленному читателю объясняет, чем же этот HoTT отличается от теории множеств.

Эта цитата соотносится с задачей из поста про неподвижную точку, да и вообще с конструкцией и идеологией jQuery.my так, как будто я про эту теорию знал, когда $.my придумывал. Я был просто потрясён.

Type-forming rule из цитаты – это манифест формы (или рекурсивно её фрагмента), прямо до мелких соответствий. То, что в цитате про inroduction, elimination и computation – это просто таки с точностью до замены терминов вот это http://jquerymy.com/tutorial/what-is-bind/. Все три этих действия у меня просто совмещены в одну функцию для краткости записи. Она просто в обе стороны работает, и для introduction, и для elimination, и для computation посредине.

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

Элемент определённого типа в моём случае – это группа отображений множества состояний html-формы на множество состояний подлежащего js-объекта. Предполагается, что есть отображения в обе стороны всегда. Такая структура называется в теоркате группоид – и как раз на основе таких структур и выстроена HoTT-теория.

Которая ни много ни мало претендует практически на роль теории множеств в современной математике. И которая… это оттуда же, следующее предложение:

It makes type theory into essentially a programming language, at the same time as a foundational system, allowing the easy verification and construction of proofs by computers.

Так вот, есть уже такой language. В крошечном масштабике и под определённый круг задач, но есть. Жду, когда же наступит этот proof by computers – это ровно та задача, что я озвучивал в посте про неподвижную точку.

Напишу письмо чувакам, как осилю 600 страниц с гитхаба. Это очень интересно.

И неожиданно. Кстати, уважаемому morfizm: в группоиде, который в этой теории базовая конструкция, каждый морфизм – изоморфизм )

Что бы это ни значило.

ermouth: (Default)

У меня впервые выплыла серьёзная задачка, в решении которой я применил понятие из сабжа – этот факт стоит зафиксировать. Раньше всякие там красивые понятия типа y-combinator или теорема Банаха были просто такими интересными зверьками. Ну, дожили вот )

Неподвижная точка функции это например вот что. Если взять калькулятор, набрать на нём какое-то число и много раз подряд нажимать на кнопку cos, в какой-то момент число меняться перестанет (либо начнёт колебаться на 1 в последнем разряде из-за округления).

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

Read more... )
ermouth: (ang)

6 недель назад я нарисовал вот такую вот черновую схемку высокопроизводительной масштабируемой CMS (Коммент для понимающих: тут хреново названо только. Frontend – это общедоступная часть сайта, Backend – админка. Пользователи – на концах зелёных стрелок, за схемой, есличо).

image

Так вот, оно взлетело, да ещё как. Результаты по скорости рендера на Амазон EC2 medium (3.8 Gb RAM, проц примерно как Core2 Duo 1.5Ггц и диск как медленный SSD) вот такие:

BI3knElCAAAtZr0

Это неделю назад, сейчас ещё быстрее. Это случайный рендер по множеству из 112500 урлов. С выборкой из БД. Более 90% страниц предполагают выборку более 50 публикаций перед рендером целиком. С последующей группировкой и фильтрацией по тегам. И с расстановкой переносов )

На реальных условиях (с запросом и ответом в gzip) тоже оттестировано. С учётом пинга до Архангельска любая страница при нагрузке до 50 запросов в секунду в 99% случаев выдаётся менее, чем за 250мс. Если тестировать прямо с ирландского амазона с нагрузкой 100 страниц в секунду, получается “менее, чем за 20мс”.

Фактически на запросы из Архангельска сервер в Ирландии начинает отвечать через 100 мс, то-есть примерно через 120 мс при наличии скриптов/css в кэше браузера начинается рендер страницы.

Если по-русски, оно летает просто )

И это полностью, до последней строчки, javascript (скептики, утритесь). При этом оно чистый, не прошедший даже черновую оптимизацию, говнокод (утритесь снова ггг).

Я знаю, на фленте есть френды, которые прямо сейчас делают что-то подобное. И тоже функциональщина. И тоже nosql, и с прицелом на highload и лёгкую масштабируемость. Присоединяйтесь )

ermouth: (Default)

Редкий случай, когда я не знаю, как оно называется в мире ООП. Мож кто подскажет?

Функция SomeNewClass – конструктор, скажем, переданный откуда-то со стороны. Объект syslib содержит какие-то системные методы.

Скажем, нам надо, не важно для каких целей, ограничить видимость объекта syslib из экземпляра SomeNewClass несколькими безопасными методами. Это делается вот так:

var syslib = {
	loadSafe: function() {/*some code*/},
	loadUnsafe: function() {/*some code*/},
	save: function() {/*some code*/},
	purge: function() {/*some code*/}
};

var SomeNewClass = function (syslib) {
	return {
		doSomething: function() {/*some code with syslib calls*/},
		doAnything: function() {/*some code with syslib calls*/}	
	}
}

var item = SomeNewClass ({
	loadSafe: syslib.loadSafe, 
	save: syslib.save
});


В результате методы объекта item будут видеть только два безопасных метода библиотеки syslib. Как это называется?

ermouth: (ang)

Блин, какой сюрприз неприятный. Оказывается SpiderMonkey – это движок javascript в FireFox – не поддерживает hoisting в блоках.

Такой код выполнится верно везде, кроме FF:

if (true) {
	f1();
	function f1 (){console.log("f1 called")}
}

В ff оно выбросит ошибку. Это феерическое блядство, потому что толкование стандарта, причём поперёк устоявшейся традиции – это очень грустно. Заметим, что код, не включенный в блок if, отработает верно и в FF. Это, например, так (здесь я создаю анонимную функцию и сразу её вызываю, код исполняется в lexical scope этой анонимной функции, а не в блоке):

if (true) {
    (function(){
        f1();
        function f1 (){console.log("f1 called")}
    })();
}

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

function loadSomething (key) {
    if (key) {
        load ({url:"index", complete:indexLoaded});
        function indexLoaded (data) {
            ...filter keys...
            load ({url:"content", keys:[...], complete:contentLoaded });
	}
        function contentLoaded (data) {
            ...analyze & render content...
            load ({url:"aux", keys:[...], complete:auxLoaded});
	}
	function auxLoaded (data) {
            ...so on...
	}
    } else {
	...get something else...
    }
}

Это работает везде, кроме FF. В FF это тоже заработает, если внутрь каждого блока if затолкать замыкание, которым обернуть цепочку.

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

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

Ну и конечно подогнал геморроя на ровном месте, нипочему.

ermouth: (Default)

Блин, лёг спать в 3, хотел выспаться – я давно раньше 5 не ложился. Так нет, проснулся в 5 и спать не хочется. Поэтому вот запощу ещё один сайтег наш, Архангельская типография akcent29.ru:

Снимок-экрана-2013-01-31-в-5.18

Работает это всё на jQuery.my каэш ну и ещё два моих плагина используется в открытом доступе не опубликованных. Немного подёргивается интерфейс, это доведём ещё.

Сайт эксплуатирует схему как в предыдущем примере. Поверх простой CMS обитает несколько плагинов и манифестов к ним, они и оживляют статический html. И так же, как и предыдущий пример, этот сайт сделан почти без моего прямого участия – нарисовал всё @demi4ev, заимплементил @carpogoryanin, а провёл сделку супермонстр менеджер-машина-смерти drovnin@insta.

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

Попробуем в Акценте попечататься сами, если понравится, расскажу. Хозяйка оч понравилась – ответственная, не халявник у неё как обычно в типографиях. И на стене висят дипломы тех же дизконкурсов, что и меня есть )

ermouth: (Default)

Примерно с полгода назад я выложил этот плагин в открытый доступ. За эти полгода плагин прошёл от версии 0.1 объемом в 6 кБ до версии 0.7.3 (20 кБ) которую я опубликовал только что.

Собсно, плагин этот развивается не из альтруистских побуждений. Этот плагин управляет отображением всех интерфейсов моей корпоративной системы.

Так вот, я только что задеплоил последнее базовое приложение этой системы – всё основное, что у нас было как внутрисетевые виндовые приложения, теперь в вебе.

Read more... )
ermouth: (ang)

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

Найдено в BerkeleyDB, называется sdbm. Быстрее самых быстрых md5 реализаций для js в 8 примерно раз. На вход принимает не только строки, но и объекты-массивы там – чуток подправлено для js.



function sdbmCode(s0){
 for (var s=JSON.stringify(s0),hash=0,i=0;i<s.length;i++) hash=s.charCodeAt(i)+(hash<<6)+(hash<<16)-hash;
 return (1e11+hash).toString(36);
}


Последний пост в этом году )

UPD. Даёт довольно много коллизий. 6 коллизий на словаре английских слов 213000 уникальных вхождений.

Profile

ermouth: (Default)
ermouth

November 2021

S M T W T F S
 123456
78910111213
14151617181920
21 222324252627
282930    

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 8th, 2025 12:22 pm
Powered by Dreamwidth Studios