ermouth: (ang)
В общем, мы в Хакатоне прошли во II тур. Посмотреть наше подглючивающее приложение и плюсануть можно (и даже нужно!) тут http://hackathon.koding.com/entries/bismedia

Любопытно, но я после беглого просмотра работ 242 участников II тура не увидел ни одного, кто бы справился с разбором TOSов в реальном времени о_О
ermouth: (ang)

server-emulationПридумалась тут на днях офигенная концепция как на клиенте, в браузере, разрабатывать и отлаживать серверный js-код, работающий с БД. Из картиночки справа в общем всё понятно.

В нашем типичном стеке серверных технологий – node.js + express + cradle + CouchDB – достаточно заменить только cradle.js на PouchDB.

Обвес, позволяющий проделывать весь этот трюк в браузере, оказался на удивление несложным в целом. Я его как proof of concept написал за вечер, а на следующий вечер у меня уже заработал серверный код, полностью написанный в нашей самопальной IDE.

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

Промисы – модная и очень удобная штука, мы активно используем. Коллбэки – фу, промисы – кул. Беда в том, что синтаксис промисов иногда существенно отличается от библиотеки к библиотеке, там нет единого стандарта.

Исторически так сложилось, что на клиенте мы используем модель jQuery.Deferred – которая не очень то удачна, по-честному. Ну и оказалось что для node.js нет либы, которая повторяла бы синтаксис $.Deferred – чему я был очень удивлён.

В результате перебора bluebird.js, затем lie.js [ага, var Promise = require("lie")] и затем Q.js оказалось, что проще всего имитировать $.Deferred под нодом с помощью Q. Ну, как известно “то, что вы ищете, вы найдёте в самом последнем месте”, да.

Так вот, в самом простейшем варианте код выделки симулякра $.Deferred из Q.defer умещается в 20 строк:


var Q = require("q");
var Promise = function(){
 var q = Q.defer(),
 qp = q.promise,
 pi = {
  then:function(a,b){return qp.then(a,b);},
  fail:function(a,b){return qp.fail(a,b);},
  done:function(a,b){return qp.done(a,b);},
  progress:function(a,b){return qp.progress(a,b);},
  promise: function(){return q.promise;},
  resolve:function(a,b){q.resolve(a,b); return pi;},
  reject:function(a,b){q.reject(a,b); return pi;},
  notify:function(a,b){q.notify(a,b); return pi;},
  isResolved:function(a,b){return q.isFulfilled(a,b);},
  isRejected:function(a,b){return q.isRejected(a,b);},
  state: function(){ 
   var state = qp.inspect().state;
   return state==="fulfilled"?"resolved":state;
  }
 };
 return pi;
}


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

Сегодня кста выяснилось, что node.js даже последних сборок использует уже не поддерживаемую Гуглом версию V8. А нод много где в продакшене используется о_О

ermouth: (Default)

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

Проект – диспетчерская для дорожной организации. Основная задача – распределение техники по участкам на даты и ведение отчётности по фактической занятости. Всего получилось три веб-приложения, естессно jQuery.my.

Вот скриншотик фрагмента одного из приложений – непосредственно перемещение техники между участками. Вместе с техникой “тащится” привязанный к ней поп-ап, это новая фича в jQuery.my.

Снимок-экрана-2014-10-23-в-23.49.05

Ещё в рамках проекта мы впервые попробовали сделать удалённый датчик работы тяжёлой техники. Датчик собирает данные и сливает их на сервер, если есть связь, или сохраняет до тех пор, пока связь не появится, и потом сливает.

Интересно, как мы этот датчик делали.

Сначала я подумал, что для этой цели идеально подойдёт Tessel, и даже уже начал делать первый подход к снаряду. Первый подход породил вот такую конструкцию:

IMG_1248

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

Ну то-есть, это javascript-микроконтроллер с модулями GPRS и GPS, с камерой, акселерометром и SD-ридером.

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

На телефоне – PhoneGap-приложение, написанное на javascript. Для накопления и репликации данных оно использует технологии, на которых работает cloudwall.me – они стали приемлемо надёжными. В общем, отладка этого всего хозяйства, конечно, доставила, и пока всё неидеально, но задачу поставленную мы решили. 

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

А у меня какая-то дикая по силе депрессия, фак.

ermouth: (Default)
IMG_1269

Открыли бету мобильной версии, в общем-то, первую в нашей истории. По клику на картинку сразу она и откроется, хотя на десктопе довольно страшненькая.

При наличии десктопной версии (наш случай) мобильная версия не требует индексирования – индексируется основная. По этой причине мобильную версию не обязательно делать html-статикой, это может быть веб-приложение.

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

Именно так тут и сделано. Приложение это – один манифест jQuery.my. Единственный браузер, в котором не заработало из тех, что мы дотянулись – первый iPhone 2007 года.

Я в самом деле очень этим горд, хотя оно такое всё довольно простенькое.

Дело в том, что это приложение – milestone ещё и с другой стороны. Оно полностью написано в специализированном IDE для манифестов, который теперь встроен в портальную CMS.

Изнутри редактор выглядит так:

Снимок экрана 2014-10-22 в 2.32.02

jQuery.my два года всего с небольшим. Оно вполне боевой стало технологией.

Ломаю голову, как мне это всё маркетить.

ermouth: (ang)

Снимок экрана 2014-09-24 в 0.01.07

Сделан целиком в редакторе из предыдущего поста. Редактор этот встроен в корпоративный интранет заказчика как веб-приложение.

В разделе “Прайс-листы” не только таблицы, но и интерактивные калькуляторы “с памятью”. Калькуляторы эти генерятся при выгрузке сайта на S3 – пользователь просто копипастит прайс из экселя, а парсер всё это в калькуляторы превращает.

Вообще, конечно, многообещающая технология. Скорость вёрстки прототипов или статических сайтов какая-то просто нереальная.

Интересно, что при сохранении документа с сайтом в CouchDB, сайт сразу, без выгрузки на S3, доступен в виде превью. Все файлы сайта хранятся как аттачи к документу базы, а они (аттачи) доступны в CouchDB по пермалинкам.

Также замечу, что статического хостинга дешевле чем  Amazon S3 просто не существует в природе. Счёт в доллар за месяц при 50К посещений – вполне себе реальность.

UPD. Спасибо [livejournal.com profile] service_picky за ценное замечание насчёт названия файла для скачивания. Pricelist.xls – это неудбно, надо писать в названии компанию, чтобы файлы не путались.

ermouth: (Default)

Мы его всё же сделали, приложение такое. Хранит целые статические сайты одним документом в CouchDB. Сейчас в бою тестируем, делаем реальный проект в нём.

Снимок-экрана-2014-09-12-в-20.16

Инклюд там, обработка исходников кастомизируемыми препроцессорами, хранимыми прямо в документе и куча других вкусностей. Приложение целиком сделано в моём новом IDE, в 4 руки, общие затраты времени – порядка 12 часов.

Объём кода после minify/gzip – 6 Кб. Javascript рулит!

ermouth: (ang)

Переделали ещё один сайт СМИ – pravdasevera.ru. Стало так:

Снимок экрана 2014-08-22 в 21.26.00

А было до этого вот так:

Снимок экрана 2014-08-22 в 21.27.16

Ну, как водится всё javascript, в облаках и заточено под редакционный цикл новостного СМИ.

Из предыдущей самописной CMS было перезалито 30000+ материалов, сегодня редакция начала работу в новой системе.

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

ermouth: (ang)
Я примерно в феврале прорабатывал вариант создания полностью браузерной CMS для простеньких сайтов. То-есть сайт хранится в браузерной IDB и собирается в браузере, а готовые страницы и ресурсы пакуются каждая в gzip и пишутся прямо на Amazon S3. Это облачное хранилище статики, ничего кроме выдачи файлов оно не умеет, но там есть милая опция – привязать свой домен к бакету. В gzip пакуем потому что S3 сам по себе не умеет отдавать ресурсы с компрессией, их надо туда сразу класть пред-компресснутые.

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

Дело в том, что с помощью средств браузера не сделать progressive jpeg. Чем он для веба важен – хорошо расписано на Хабре. С учётом особенностей статических сайтов – там обычно много графики – использование progressive jpeg это must.

Вообще, обычный JPEG в браузере можно сделать двумя способами.

Первый – сделать canvas, что-то на нём нарисовать и потом экспортнуть в JPEG с помощью .toDataURL, раскодировав получившийся base64 в binary. Сделать таким способом progressive jpeg решительно никак.

Второй способ – вынуть из канваса raw bitmap data и закодировать jpeg прямо яваскриптом. Увы, оказывается на яваскрипте нет ни одной библиотеки, пишущей прогрессивный jpeg и работающей с приемлемой скоростью. Для обычного jpeg – есть, и весьма шустрая. Для progressive – болт.

Это, вообще-то, для js-комьюнити феноменальный случай – чтобы какой-то довольно низкоуровневой либы, реализующей общепринятый стандарт, просто не существовало.

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

Может, вам в работе попадалась какая то очень компактная либа, скажем, на C, которая пишет именно progressive jpeg? Я бы её перекомпилил в js и прикрыл бы эту брешь в js-codebase.

UPD. Есть уже вроде, попробую прикрутить. https://github.com/jrmuizel/cjpeg.js

UPD2. Хороший пример выбора нерелевантных кейвордов при поиске. Набери я сразу libjpeg emscripten, я бы получил ответ по третьей ссылке. А я искал progressive jpeg encoder javascript  в разных вариациях.

UPD3. Не, не подошло, увы. Ищем дальше.
ermouth: (ang)

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

Называется это у нас “словари” и работает это примерно так.

Источники данных

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

В силу характера документооборота это практически всегда или экселевские файлы (иногда с имитацией иерархии), или SQL-выгрузки, или веб-сервисы. Так или иначе, это всегда таблицы. Чаще – эксель.

Типичные объёмы – от сотен до единиц тысяч строк в 5-15 колонок. Связность обеспечивается в момент приёма до уровня гиперссылочной целостности – куда надо подставляются пермалинки.

Хранение

Такие данные неразумно хранить в “разобранном” виде – проще их в момент поступления в систему конвертировать в жестко унифицированный формат и хранить единой записью. В силу того, что у нас вся система – javascript, эта запись, понятно дело, json. Вопрос, какой структуры.

Коль скоро мы собираемся искать на клиенте, нам эти данные надо туда передать. Также очевидно, что перед поиском их можно будет обработать. Стало быть, надо делать представление с минимальной избыточностью, хорошо пакуемое gzip-пером уровня выдачи на скоростных режимах (ритмичное, то-есть).

Данные у нас табличные, пусть и с псевдоиерархией, так что задача это лёгкая. Мы конвертим исходные данные в массивы массивов, запоминая названия колонок.

То-есть не [{name:"John", year:1980}, {name:"Ann", year:1990}],
а примерно {cols:["name","year"], data:[["John",1980],["Ann",1990]]}

Передача

Только в силу структуры экономия против по-объектного, и, тем более, против HTML-формата, получается многократная.

Раз оно получается короткое (100Кб словарь пакуется до 10-15Кб), хранится единым куском и не требует сборки, его можно и нужно инлайнить. И мы действительно до определённого порога инлайним эти данные прямо в страницы выдачи.

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

Рендер

Рендерятся данные после рендера всей содержательной статики. За выдачу данных с вкусным интерактивом отвечают jquerymy-манифесты.

Причём к одним и тем же данным могут быть привязаны разные манифесты, а к одному манифесту – разные данные. Например, в материале о расходах бюджета http://new.dvinaland.ru/budget/-e0ut55ow вверху бюджет диаграммой, а внизу – таблицей. Это одни и те же данные. Сама страница весит 450Кб, и эти данные занимают большую часть её объёма. При передаче это всё сжимается до 65Кб, размер небольшой картинки.

Там чуть менее 3000 строк данных в 5 уровнях иерархии.

Гибкость

С точки зрения редактора это выглядит как “поставить в этом вот место виджет Таблица с поиском и привязать к ней вот эти данные”. Это всё в админке интерактивное, драг-н-дроп, можно выбрать оформление, ширины колонок, фильтры и тп.

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

С точки зрения юзера это выглядит как мгновенный отклик итерфейсов – все данные уже на клиенте и проиндексированы. Скажем, если на странице http://new.dvinaland.ru/gov внизу в справочнике наколотить gmail, можно увидеть, сколько ещё деятелей юзают вражью почту ггг.

За последние полгода эта цифра уменьшилась кратно, но остались ещё несознательные.

ermouth: (ang)
Ура-ура. Полторы недели тестировал всячески и оптимизировал, в тч под IE8, будь он неладен.

Доступно на гитхабе, через bower install jquerymy или на jquerymy.com.

Новые фичи манифеста – require и files. Массив require позволяет при старте формы проверять и догружать если надо какие-то данные или библиотеки/плагины. Объект files – включать в манифесты binary data инлайном, да так, что эти дата при старте формы получают сессионный URL.

Оптимизирован сценарий связанных списков master-detail, обновляющих друг друга.

Ещё чуть-чуть – и код перевалит за 100Кб. Начал 2 года назад с 10Кб.

Общее количество манифестов jquerymy, появившихся за это время – более 200. Основное применение – коммерческие онлайн-приложения бэкэндов.
ermouth: (ang)
В рамках одного проекта вот родилось, хоть и не было заявлено как требование. Регэксп-индикатор наличия нецензурной лексики, а попросту мата

/\w{0,5}[хx]([хx\s\!@#\$%\^&*+-\|\/]{0,6})[уy]([уy\s\!@#\$%\^&*+-\|\/]{0,6})[ёiлeеюийя]\w{0,7}|\w{0,6}[пp]([пp\s\!@#\$%\^&*+-\|\/]{0,6})[iие]([iие\s\!@#\$%\^&*+-\|\/]{0,6})[3зс]([3зс\s\!@#\$%\^&*+-\|\/]{0,6})[дd]\w{0,10}|[сcs][уy]([уy\!@#\$%\^&*+-\|\/]{0,6})[4чkк]\w{1,3}|\w{0,4}[bб]([bб\s\!@#\$%\^&*+-\|\/]{0,6})[lл]([lл\s\!@#\$%\^&*+-\|\/]{0,6})[yя]\w{0,10}|\w{0,8}[её][bб][лске@eыиаa][наи@йвл]\w{0,8}|\w{0,4}[еe]([еe\s\!@#\$%\^&*+-\|\/]{0,6})[бb]([бb\s\!@#\$%\^&*+-\|\/]{0,6})[uу]([uу\s\!@#\$%\^&*+-\|\/]{0,6})[н4ч]\w{0,4}|\w{0,4}[еeё]([еeё\s\!@#\$%\^&*+-\|\/]{0,6})[бb]([бb\s\!@#\$%\^&*+-\|\/]{0,6})[нn]([нn\s\!@#\$%\^&*+-\|\/]{0,6})[уy]\w{0,4}|\w{0,4}[еe]([еe\s\!@#\$%\^&*+-\|\/]{0,6})[бb]([бb\s\!@#\$%\^&*+-\|\/]{0,6})[оoаa@]([оoаa@\s\!@#\$%\^&*+-\|\/]{0,6})[тnнt]\w{0,4}|\w{0,10}[ё]([ё\!@#\$%\^&*+-\|\/]{0,6})[б]\w{0,6}|\w{0,4}[pп]([pп\s\!@#\$%\^&*+-\|\/]{0,6})[иeеi]([иeеi\s\!@#\$%\^&*+-\|\/]{0,6})[дd]([дd\s\!@#\$%\^&*+-\|\/]{0,6})[oоаa@еeиi]([oоаa@еeиi\s\!@#\$%\^&*+-\|\/]{0,6})[рr]\w{0,12}/i

Неидеальный, каэш, но в целом очень приличный. 

IDE

Jul. 27th, 2014 10:24 pm
ermouth: (Default)

Такой milestone в некотором смысле – я написал первый в своей жизни IDE, заточенный под разработку и тестирование jQuery.my-форм.

Снимок экрана 2014-07-27 в 21.53.28

Интересно, что IDE сам по себе тоже приложение jQuery.my – на картинке в редакторе кода открыт сам редактор этого кода, центральный компонент. И кнопкой Play можно запустить в IDE превью самого себя.

Вот например редактор показывает живое превью самого себя во всплывающем окошке:

Снимок экрана 2014-07-27 в 22.01.23

Из интересных фич:

  1. Каждая вкладка помнит своё undo, хотя это всё части одного json-объекта
  2. Код валидируется в реальном времени, причём не только синтаксически, но и структурно
  3. Позволяет включать в json-объекты файлы как ресурсы (вообще нигде в вебовых IDE не видел, удобно просто супер, форма например с картинками, которая не зависит от внешних ресурсов совсем)
  4. Есть кнопка Play (превью), которая работает мгновенно – компилирует манифест и запускает его либо в модальном диалоге, либо фуллскрин, либо инлайн, причём может с имитацией чужого окружения
  5. Превью может помнить, что вы в него наколачивали при прошлом запуске (запоминает state разрабатываемого приложения)
  6. Сам редактор – приложение jQuery.my и поэтому в одну короткую строку встраивается в любое другое jQuery.my приложение как контрол (есть же контролы rich-editor’ов, почему бы не быть контролу, который сразу IDE?)
  7. Так же легко, в одну строку, это приложение встраивается в любую веб-страницу.

Хвалите меня, немногочисленные читатели ) Устал чёто как собака.

PS. Мне пришли компоненты робота – микроконтроллеры, камеры, акселерометры, серво и тд. Начал проектировать.

ermouth: (ang)

Открыли публичную бета-версию обновлённого портала областного правительства, в продолжение их пресс-центра (ровно год прошёл, да). Сначала скриншотики, кликабельны

2
1

Теперь чем оно всё круто.

0. Скорость

Вся система целиком, до последней строчки – javascript, и при этом практически любая страница после первого захода видна менее чем через секунду после клика (в России, в 120мс пинга до хостинга). Всё потому, что как и на пресс-центре применено блочное кэширование и в 99% случаев страницы отдаются целиком из кэша в RAM, даже без обращения к БД.

1. Облачная распределённая платформа

Оно плотно интегрировано с пресс-центром, это не просто одна CMS и стилистика, это единая платформа в облаках. Из соображений усиления периметра безопасности платформа состоит из нескольких компонентов, связанных только по https – скажем, головной сайт не хранит и не обрабатывает данные форм и авторизации, это делает специальный ресурс. Также на фронтэнде невозможно авторизоваться в админку – её там просто нет.

2. Импорт данных

Эта платформа импортирует данные из других систем – телефонные справочники приходят в SQL-формате, ежемесячные обновления бюджета – в CSV, афиши – в JSON и т.д. После импорта данные приводятся в унифицированный внутренний формат, а потом отображаются в виде табличек, диаграмм, списков ссылок и т.д.

Особенно полезны для вдумчивого читателя интерактивные диаграммы бюджета. На секторы можно кликать. Смею предположить, что такое представление бюджета для народа – лучшее по простоте навигации из всех, что я видел. Оно основано на одной заброшенной австралийской инициативе 5-летней давности по раскрытию open data. Мы из этого сделали технологию, в которой данные обновляются в один клик.

3. Контроль устаревания

Все материалы имеют “срок годности” – дату, после которой система начнёт напоминать о необходимости обновления. Такой фичи я просто вообще нигде в CMS не встречал, а для большого госпортала она абсолютно необходима. На предыдущей версии портала нереальные завалы неактуального старья – и про то, что информация протухла редактор портала мог узнать только случайно.

Мы сделали механику для исключения такого рода бардака.

4. Обращения и вообще формы

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

Использовать СНиЛС как на госуслугах – не вариант, это другой класс защиты персональных данных, мы бы не поместились в сроки и бюджет. Да и неудобный он до смерти, “интернет по паспорту”.

Остался мобильник. Вообще нам стоило существенных усилий убедить коллег из правительства, что это приемлемая авторизация. И примерно в тот момент, что мы всё же убедили, что это концептуально верно, Медведев предложил простые госуслуги оказывать через авторизацию по SMS. К июлю. Ну вот мы и сделали к июлю под это целую платформу.

---

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

Началось всё вот с такой картинки:

image

Ну и да,  вся эта система управляется приложениями jquerymy. Внутри системы даже IDE есть простенький для горячей замены кода системы из браузера прямо, тоже на $.my.

Такие дела.

ermouth: (ang)
Расчехлю журнальчег похвастаться.

Выкатил jQuery.my 0.9.9. Обновил сайт jquerymy.com, теперь есть русская версия и офигительные демки с возможостью редактирования их исходного кода и запуска прямо на странице, в песочнице.


Контент написан в расширяемый редакторе наподобие того, что в Medium.

Вот демка этого редактора http://jquerymy.com/ru/meditor.html, всё интерактивное. То-есть это как OLE-объекты в Ворде примерно работaет. Есчо демка пишет в локалСторидж, так что а) перезагрузка страницы не убьёт правки, если вы редактируете, б) лучше не аттачить картинки больше мегабайта-двух.
ermouth: (Default)

Рабочий год закончился в 4 утра на любопытном моменте.

Я летом придумал название для всей облачной кухни, что мы делаем. Домен даже купил. Картинка вот нарисовалась.

CloudWall

Рабочий 2013 у меня закончился на том, что я вынес на CDN первую часть разделяемого системами кода и спланировал реорганизацию системы так, чтобы такого кода было очень много. То-есть все неспециализированные приложения, библиотеки, css и шаблоны системы будут загружаться с CDN во всех инсталляциях.

Идеально, чтобы с конкретного экземпляра системы грузилось только ядро, данные и специфичные только для инсталляции приложения/шаблоны. Всё остальное надо держать на CDN. Так и будет.

Технологически для начала это будет S3. Оказалось, что S3 вполне в состоянии отдавать упакованные файлы – если их туда класть уже за-gzip-ленными с исходным расширением и ставить Content-encoding явно. Как-то мне не приходило это в голову, я смотрел на всякие чуть не Akamai, а решение то под боком.

То, что грузится с CDN, будет кэшироваться в localStorage, а вновь загруженные обновления сначала проверяться и в случае сбоя отбрасываться. То-есть примерно механика Last Known Good Config в винде.

Помимо этого будет полное версионирование, то-есть конкретный апп может попросить не последнюю, а какую-то точную версию подлежащего кода (это значит апп просто будет жить в iframe).

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

У меня пальцы чешутся рассказать что это будет, но не могу. Поэтому всё так расплывчато написал, просто чтобы зафиксировать день рождения CloudWall.

И да, с Новым Годом, с новым счастьем )

ermouth: (Default)

Снимок экрана 2013-12-25 в 15.28.33Я недавно наткнулся на эмулятор Mac OS 7 в браузере. На javascript. Поигрался с любопытной игрушкой – и как-то не придал особого значения.

Именно с System 7 кста я в своё время пересел на Win95. Правда, это была 7.5, но не так уж они с 7.0 и отличаются.

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

В эмуляторе выложен всякий софт того времени – Microsoft Word 4.0 и Excel 2, Aldus (ещё не Adobe) PageMaker 2 и тп. И этот софт прекрасно работает, примерно с той скоростью, как я помню. Я не сразу осознал значение этого – а оно имхо довольно интересное явление само по себе.

Снимок экрана 2013-12-25 в 15.26.28

Дело в том, что эмулятор полноценной графической ОС это уже куда менее игрушка, чем всякие там ZX-Spectrum и подобные. Под Макосью 7.6 работали Adobe Photoshop 4, Quark XPress 3.32 и Macromedia Freehand 5.5 – на этих продуктах держалось тогда процентов 90 западной издательской индустрии. Всей вообще. Ну, где-то Illustrator был вместо Freehand.

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

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

И ещё замечу, что весь комплект из Макоси, Ворда, Экселя и Пижамкера при передаче по сети “весит” 10Мб, передаётся в один javascript-файл и кэшируется на клиенте. По этому параметру современные веб-решения просто вообще далекоооо отстают.

Всё это вместе открывает очень любопытные перспективы поставки старых приложений бандлами. Единственные ограничение – localStorage браузера, но это пройдёт.

В общем, готов поспорить, что в 2014, макс в 2015 мы увидим полный порт Win95 на яваскрипте.

ermouth: (Default)

С год примерно назад написал про этот концепт, вот и вот. Год был для nodejs-комьюнити очень бурным, в том числе и в плане взаимопроникновения клиентских и серверных технологий. Что в результате:

  • Browserify, который позволяет запускать код для node.js в браузере
  • JSDOM – имплементация HTML DOM для node.js, оч шустрая
  • node-webkit – позволяет открыть из нода окошко Хрома и использовать его как часть приложения, в тч серверного (то-есть например попросить “а нарисуй мне <div> вот с таким текстом вот таким шрифтом и скажи, сколько он высотой”)

Сам я тоже этот концепт юзал везде, где можно и мне кажется, что оно становится трендом. Вот например http://artsy.github.io/blog/2013/11/30/rendering-on-the-server-and-client-in-node-dot-js/

Это очень радует.

MEAN

Dec. 8th, 2013 09:48 pm
ermouth: (ang)

MEAN – это Mongo DB + express.js + angular.js + node.js. Это такой новый LAMP – и он сыграет такую же роль в развитии небольших интерактивных многопользовательских проектов и особенно сервисов, как в своё время “сыграл” LAMP при взрывном росте количества небольших сайтов.

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

Как это было в LAMP

Хороший пример LAMP – Битрикс, который умеет всё, но ничего не умеет хорошо и быстро. Когда Битрикс был маленький, он был быстрый (хотя и дырявый). А потом стала ограничивать платформа – потому что иногда нужна быстрая key-value БД, а у тебя под рукой только MySQL. Потому что для организации расширяемой бизнес-логики по-хорошему язык должен поддерживать функции как объекты первого класса – а php это заумел только с 5.3 (медленно и через жопу). Потому что апач – это приемлемо для “классического” около-REST веб-сервера, но совсем плохо для организации IM-обмена. Ну итд.

Ровно то же самое будет происходить с MEAN. Покомпонентно в нём два слабых звена – Angular и Mongo. Разбираю.

Mongo DB

Это прекрасная NoSQL БД, когда у проекта нет дизайна. Не от русского слова “дизайн”, а от английского “design”. Ну то-есть нужна какая-то БД. Когда заранее неизвестно, что точно от БД требуется, но хорошо бы, чтобы БД умела всё, мало ли что понадобится. MongoDB (как и MySQL) такая и есть.


  1. Key-value – умеет, но небыстро, до Redis или Couchbase как до звёзд.

  2. Map-reduce – умеет, но очень медленно, до CouchDB как до звёзд.

  3. Репликация – умеет, но криво и ненадёжно, с Couchbase не сравнить даже.

  4. Индексы – умеет, но медленнее SQL.

  5. Geospatial index как бы есть, но нечеловеческий.

  6. Fault-tolerance вроде ничего, но для решения, которое настолько плохо масштабируется – до Riak как до звёзд.

  7. Write lock настолько страшен, что блокирует целую таблицу даже для чтения – то-есть как MyISAM в MySQL, но без вкусности в виде полнотекстового поиска в качестве компенсации )). Для асинхронного javascript-мира блокировка кста вообще абсолютное зло.

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

Angular

Всё, что нужно знать про Angular – это то, что если вы писали на php например
<div>Width = <?php echo (width/2.54); ?>см</div>, с помощью Angular вы будете писать
<div>Width = { {someObj.width/2.54;}}см</div>.

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

Зато оно позволяет очень быстро делать простые какие-то проекты с несложным интерактивом.

UPD. После написания поста в ЖЖ вскрылась уязвимость. Код Angular выше исполнялся и заменялся на null, пришлось вставить пробел между { и {. Таким образом мы имеем явную проблему с Angular – типа XSS. Пусть оно называется XSAS – cross site angular scripting. Чёто не особо улыбается проверять юзеринпуты на то, могут ли они быть Angular-кодом.

Итого

В любом случае MEAN – это отличная альтернатива LAMP. Уже вовсю появляются хостинги под него (Nodejitsu, Heroku), codebase под js растёт бешенными темпами, оно всё модульное и легко настраивается.

Но это неуниверсальное решение для небольших проектов.

ermouth: (ang)

Сёдня в процессе переписки в твиттере народился прекрасный по сжатости код:

window.addEventListener("keyup",function(e){var o=e.target;
if(o.nodeName[7]=="A")
with(o.style)height=0,height=o.scrollHeight+"px"})

Этот код, если его разместить при загрузке на страницу, сделает все textarea на странице автомасштабирующимися под набор. Не только те, что уже есть, но и те, что в будущем вставятся в DOM.

132 символа и никаких там библиотек – чистая Vanilla )

cylon.js

Nov. 12th, 2013 04:16 am
ermouth: (Default)

Снимок экрана 2013-11-12 в 4.12.22

Мой вертолёт с него управляется вот так:

Снимок экрана 2013-11-12 в 4.14.27

Я, кажется, знаю, чем займусь в новогодние каникулы )

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. 5th, 2025 11:33 pm
Powered by Dreamwidth Studios