<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dw="https://www.dreamwidth.org">
  <id>tag:dreamwidth.org,2016-12-24:2595908</id>
  <title>Первый рукописный блог рунета™</title>
  <subtitle>О, да</subtitle>
  <author>
    <name>ermouth</name>
  </author>
  <link rel="alternate" type="text/html" href="https://ermouth.dreamwidth.org/"/>
  <link rel="self" type="text/xml" href="https://ermouth.dreamwidth.org/data/atom"/>
  <updated>2018-01-23T23:22:45Z</updated>
  <dw:journal username="ermouth" type="personal"/>
  <entry>
    <id>tag:dreamwidth.org,2016-12-24:2595908:703765</id>
    <link rel="alternate" type="text/html" href="https://ermouth.dreamwidth.org/703765.html"/>
    <link rel="self" type="text/xml" href="https://ermouth.dreamwidth.org/data/atom/?itemid=703765"/>
    <title>JavaScript 2018</title>
    <published>2018-01-23T23:22:45Z</published>
    <updated>2018-01-23T23:22:45Z</updated>
    <category term="javascript"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">&amp;nbsp;JS это нынче например вот так:&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="twitter-tweet" data-lang="en"&gt;&lt;p lang="en" dir="ltr"&gt;no more imperative javascript in 2018, javascript is a fancy lisp flavor from now on &lt;a href="https://t.co/jAmR1DwyDT"&gt;pic.twitter.com/jAmR1DwyDT&lt;/a&gt;&lt;/p&gt;&amp;mdash; Alexey Orlenko (@aqrln) &lt;a href="https://twitter.com/aqrln/status/954182903159717889?ref_src=twsrc%5Etfw"&gt;January 19, 2018&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br type="_moz" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=ermouth&amp;ditemid=703765" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2016-12-24:2595908:703296</id>
    <link rel="alternate" type="text/html" href="https://ermouth.dreamwidth.org/703296.html"/>
    <link rel="self" type="text/xml" href="https://ermouth.dreamwidth.org/data/atom/?itemid=703296"/>
    <title>CVE-2017-12635</title>
    <published>2017-11-18T01:17:00Z</published>
    <updated>2017-11-18T01:20:26Z</updated>
    <category term="couchdb"/>
    <category term="javascript"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">В CouchDB обнаружилась &lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2017-12635"&gt;пара&lt;/a&gt; &lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2017-12636"&gt;дырок&lt;/a&gt;, которые вместе дают возможность RCE. Это первая критическая уязвимость за 5 лет кстати, и она очень любопытна.&lt;br /&gt;&lt;br /&gt;Я &lt;a href="https://ermouth.dreamwidth.org/677940.html"&gt;примерно год назад пис&amp;aacute;л&lt;/a&gt; о довольно сложной ситуацией с json-парсерами в разных экосистемах. У меня был период ресёча на предмет &amp;laquo;не заморочиться ли написанием координатора json-вебстримов на ином, чем пара erlang+js, зверьке&amp;raquo; &amp;ndash; потому что пара эта не блещет производительностью.&lt;br /&gt;&lt;br /&gt;И дырка в CouchDB возможна только потому, что &lt;a href="https://github.com/davisp/jiffy"&gt;erlang/jiffy&lt;/a&gt; и нативный json-парсер в js ведут себя по-разному. В erlang-е возможно создать два свойства внутри объекта под одним ключом, и при выборке будет отдаваться первое. В js создать такой объект невозможно, и при парсе json-а c повтором ключа всегда берётся последнее вхождение.&lt;br /&gt;&lt;br /&gt;В CouchDB есть встроенный механизм аутентификации, и учётные записи в нём &amp;ndash; json-документы произвольной структуры с несколькими обязательными полями, лежащие в специальном бакете _users. У пользователей есть поле roles[], в котором задаются группы, и есть специальная hard-coded группа _admins, которая даёт круто больше прав.&lt;br /&gt;&lt;br /&gt;Обычный пользователь не может поменять список своих ролей, но может поменять другие поля учётки, и контролируется это специальной неудаляемой js-функцией &lt;a href="http://docs.couchdb.org/en/1.6.1/couchapp/ddocs.html#validate-document-update-functions"&gt;встроенного валидатора&lt;/a&gt; бакета с профилями пользователей.&lt;br /&gt;&lt;br /&gt;Но можно, будучи залогиненным, отправить свой профиль с полями &lt;code&gt;roles:[&amp;quot;_admin&amp;quot;],roles:[]&lt;/code&gt; &amp;ndash; и стать админом, потому что валидатор увидит последний массив и разрешит запись профиля, а при контроле прав доступа будет использоваться первый.&lt;br /&gt;&lt;br /&gt;Подробный рассказ об уязвимости: &lt;a href="https://justi.cz/security/2017/11/14/couchdb-rce-npm.html"&gt;justi.cz/security/2017/11/14/couchdb-rce-npm.html&lt;/a&gt;, уже выпущено обновление CouchDB в ветках 1.x и 2.x, в котором дырки нет.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;К счастью, так сложилось, что во всех без исключения системах на CouchDB, которые мы сделали, уязвимость имеет значительно м&amp;eacute;ньшую тяжесть, а&amp;nbsp; в некоторых системах закрывается даже без необходимости накатывания новой версии БД. &lt;br /&gt;&lt;br /&gt;Дело в том, что мы никогда не пользуемся встроенной авторизацией для юзеров фронтэнда (где есть возможность саморегистрации и управления своим профилем), плюс мы никогда не храним эти профили в системном бакете _users.&lt;br /&gt;&lt;br /&gt;В бакете _users в лучшем случае живут профили пользователей бэкэнда, и ими всегда управляют или администраторы, или специальный сервис на js с кучей дополнительных проверок.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=ermouth&amp;ditemid=703296" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2016-12-24:2595908:702989</id>
    <link rel="alternate" type="text/html" href="https://ermouth.dreamwidth.org/702989.html"/>
    <link rel="self" type="text/xml" href="https://ermouth.dreamwidth.org/data/atom/?itemid=702989"/>
    <title>CouchDB Photon</title>
    <published>2017-09-10T15:06:57Z</published>
    <updated>2017-09-10T15:15:17Z</updated>
    <category term="photon"/>
    <category term="ide"/>
    <category term="jquerymy"/>
    <category term="mysoft"/>
    <category term="couchdb"/>
    <category term="javascript"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">&lt;p&gt;Написал админку для CouchDB – &lt;a href="https://github.com/ermouth/couch-photon" target="_blank"&gt;Photon&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;То-есть уже есть две – Futon (исторически первый) и Fauxton (для новых версий). Второй – модный, но совсем неудобный, плюс в угоду моде очень сильно страдает информационная плотность. Первый – существует только для версий до 1.6.1 (актуальная – 2.1), тоже не слишком удобный, но всё прекрасно с информационной плотностью. Плюс у обоих проблемы с обновлением – то-есть поставил CouchDB и живи потом всегда со встроенной админкой в той версии, которая была на момент установки.&lt;/p&gt; &lt;p&gt;Я решил сделать и удобный, и с нормальной информационной плотностью, и обновляемый независимо от самой БД. Дополнительным ограничением было отсутствие любых опен-сорцных библиотек, происходящих из крупных корпораций. Последние события показали что их опен-сорц с гнильцой (привет, Фейсбук и Реакт).&lt;/p&gt; &lt;p&gt;Первые эскизы нарисовались в конце августа, примерно так:&lt;/p&gt; &lt;p&gt;&lt;a href="http://jquerymy.com/dw/CouchDBPhoton_10CC8/Photon1.jpg" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Photon-1" border="0" alt="Photon-1" src="http://jquerymy.com/dw/CouchDBPhoton_10CC8/Photon1_thumb.jpg" width="790" height="531"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt; В результате &lt;a href="http://jquerymy.com/kod/photon1.pdf" target="_blank"&gt;три эскиза&lt;/a&gt; превратились в полное приложение за две с небольшим недели:&lt;/p&gt; &lt;p&gt;&lt;a href="http://jquerymy.com/dw/CouchDBPhoton_10CC8/2017091017.32.jpg" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Снимок-экрана-2017-09-10-в-17.32" border="0" alt="Снимок-экрана-2017-09-10-в-17.32" src="http://jquerymy.com/dw/CouchDBPhoton_10CC8/2017091017.32_thumb.jpg" width="790" height="458"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Установка – просто курлом или копипастой засунуть в базу 1 (один) json-документ объёмом 1.5 мега. Обновление потом по одному клику из интерфейса, с AWS S3 CDN, так сейчас очень много кто делает.&lt;/p&gt; &lt;p&gt;Конечно же, приложение никогда не существовало в виде исходных файлов на файловой системе, вся разработка – в браузере, в CloudWall. Выглядит это примерно так:&lt;/p&gt; &lt;p&gt;&lt;a href="http://jquerymy.com/dw/CouchDBPhoton_10CC8/2017091018.00.10.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Снимок экрана 2017-09-10 в 18.00.10" border="0" alt="Снимок экрана 2017-09-10 в 18.00.10" src="http://jquerymy.com/dw/CouchDBPhoton_10CC8/2017091018.00.10_thumb.png" width="790" height="514"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;На картинке Photon запущен в окошке в среде разработки и просматривает сам себя: функция слева – исходник в IDE, функция открытая в окошке – она же, но в коде уже собранного Photon-а. Рефлект рефлекта, редкий зверёк.&lt;/p&gt; &lt;p&gt;Оч здорово получилось в целом, кто юзает CouchDB – рекомендую.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=ermouth&amp;ditemid=702989" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2016-12-24:2595908:702740</id>
    <link rel="alternate" type="text/html" href="https://ermouth.dreamwidth.org/702740.html"/>
    <link rel="self" type="text/xml" href="https://ermouth.dreamwidth.org/data/atom/?itemid=702740"/>
    <title>Couchbox</title>
    <published>2017-07-27T01:52:40Z</published>
    <updated>2017-07-27T01:53:54Z</updated>
    <category term="couchbox"/>
    <category term="es6"/>
    <category term="couchdb"/>
    <category term="jquerymy"/>
    <category term="cloudwall"/>
    <category term="design"/>
    <category term="inliner"/>
    <category term="javascript"/>
    <category term="mysoft"/>
    <category term="ide"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">&lt;p&gt;Месяц назад мы запустили публичную бету &lt;a href="https://vezdelegko.ru/" target="_blank"&gt;vezdelegko.ru&lt;/a&gt;, сервиса бронирования экскурсий, отелей и транспорта. Сервисы бронирования – сами по себе штука сложная, это как магазин, по которому надо вести учёт ассортимента на каждый день, причём ассортимент день ото дня меняется и цены зависят от дня и количества. Причём в магазине куча отделов, и партнёры сами управляют своим ассортиментом. &lt;/p&gt; &lt;p&gt;Дополнительно, в нашем случае сервис делался с прицелом на очень существенную масштабируемость как по ёмкости, так и по географии. Это автоматом предполагает архитектуру из многих узлов и распределённое хранение/обработку данных с последующей их репликацией и агрегацией. Под такую схему я придумал специальную архитектуру узла, которая потребовала платформы исполнения, это и есть &lt;a href="https://gitlab.com/Couchbox/couchbox" target="_blank"&gt;Couchbox&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;a href="https://gitlab.com/Couchbox/couchbox/" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Снимок экрана 2017-07-27 в 2.26.24" border="0" alt="Снимок экрана 2017-07-27 в 2.26.24" src="http://jquerymy.com/dw/Couchbox_4FC8/201707272.26.24.png" width="800" height="221"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;География узлов и характер распространения данных предполагал версионированную мастер-мастер репликацию между узлами, по сложной топологии, различной для разных типов данных. Такие штуки прекрасно умеет делать моя любимая CouchDB, поэтому основной набор данных хранится в CouchDB, размазанный по всему графу узлов так, что все данные минимум дублированы.&lt;/p&gt; &lt;h3&gt;Code follows data&lt;/h3&gt; &lt;p&gt;Нативная CouchDB хранит в базах не только данные, но и код для predefined map/reduce запросов, по которым строятся высокоэффективные persistent индексы. Этот код, на JS или Erlang, хранится в документах рядом с данными и может распространятся между узлами в тех же потоках репликации, что и сами данные.&lt;/p&gt; &lt;p&gt;Couchbox, наша платформа, расширяет это всё механикой &lt;em&gt;хуков&lt;/em&gt;, реагирующих на изменения документов в базе, и &lt;em&gt;эндпоинтов&lt;/em&gt; – REST–концов, обрабатывающих входящие запросы через https. То-есть в те же специальные документы, где в обычной CouchDB живёт код функций индексов, для Couchbox-а можно добавить ещё и код функций хуков и внешних REST API эндпоинтов. Получается распределённая платформа приложений.&lt;/p&gt; &lt;p&gt;Особо примечателен факт, что с точки зрения установленного софта узлы не различаются вообще. &lt;/p&gt; &lt;p&gt;Весь специфический код, определяющий функциональную роль узла, приходит через БД. То-есть по мере обновления документов с кодом все обработчики по-горячему аккуратно заменяются на новые версии. Обработчики устроены примерно как &lt;a href="https://aws.amazon.com/ru/lambda/details/" target="_blank"&gt;амазоновские лямбды&lt;/a&gt;, функции без сохранения состояния, поэтому горячая замена вполне возможна.&lt;/p&gt; &lt;h3&gt;Файлы – это очень скучно&lt;/h3&gt; &lt;p&gt;Важный момент, как именно код функций попадает в БД.&lt;/p&gt; &lt;p&gt;Код лямбд вообще не существует в виде исходных файлов. Он создаётся в специализированной среде разработки, основанной на &lt;a href="http://cloudwall.me/" target="_blank"&gt;CloudWall&lt;/a&gt; и &lt;a href="http://ddoc.me/" target="_blank"&gt;Ddoc Lab&lt;/a&gt;. Выглядит это примерно так:&lt;/p&gt; &lt;p&gt;&lt;a href="http://jquerymy.com/dw/Couchbox_4FC8/201707273.52.11.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Снимок экрана 2017-07-27 в 3.52.11" border="0" alt="Снимок экрана 2017-07-27 в 3.52.11" src="http://jquerymy.com/dw/Couchbox_4FC8/201707273.52.11_thumb.png" width="820" height="357"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;То-есть, сорцы, из которых собираются лямбды, хранятся в PouchDB в браузерах разработчиков, реплицируются в CouchDB на какой-то из узлов, собираются, а затем распространяются по остальным узлам. &lt;/p&gt; &lt;h3&gt;Деплой обновлений и скорость разработки&lt;/h3&gt; &lt;p&gt;Такая архитектура расслаивается на три части по критерию обслуживания:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Убунта, CouchDB, Redis, node.js и nginx – фундамент со временем между рестартами в месяцы. Для обновления или рестарта фундамента нужен доступ к каждому узлу через терминал. &lt;/li&gt; &lt;li&gt;Couchbox – платформа приложений с временем между обновлениями сейчас в недели, скоро станет в месяцы. Разрабатывается на файловой системе в обычных IDE, для обновления на узлах нужен доступ через терминал.&lt;/li&gt; &lt;li&gt;Код приложений, очень гибкий, может обновляться и дополняться с высокой частотой. Для разработки и отладки как клиентской (UI), так и серверной части (REST API) приложений не нужно ничего, кроме браузера. Код деплоится по узлам автоматом.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Общий объём кода, написанного в браузере для этой системы, перевалил за 100К SLOC и пока всё просто прекрасно. Стартскрин бэкэнда выглядит сейчас вот так:&lt;/p&gt; &lt;p&gt;&lt;a href="http://jquerymy.com/dw/Couchbox_4FC8/201707274.29.jpg" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Снимок-экрана-2017-07-27-в-4.29" border="0" alt="Снимок-экрана-2017-07-27-в-4.29" src="http://jquerymy.com/dw/Couchbox_4FC8/201707274.29_thumb.jpg" width="821" height="647"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Я, в общем, доволен – это самая сложная штуковина, которую я когда-либо придумывал, и её получилось не просто сделать как задумано, но ещё и в плановые сроки почти уложиться. Как с самой платформой, так и с приложениями на ней.&lt;/p&gt; &lt;p&gt;И да, Couchbox is MIT licensed. Опенсорц наше всё.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=ermouth&amp;ditemid=702740" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
</feed>
