<?xml version='1.0' encoding='utf-8' ?>

<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:atom10='http://www.w3.org/2005/Atom'>
<channel>
  <title>Первый рукописный блог рунета™</title>
  <link>https://ermouth.dreamwidth.org/</link>
  <description>Первый рукописный блог рунета™ - Dreamwidth Studios</description>
  <lastBuildDate>Tue, 23 Jan 2018 23:22:45 GMT</lastBuildDate>
  <generator>LiveJournal / Dreamwidth Studios</generator>
  <lj:journal>ermouth</lj:journal>
  <lj:journaltype>personal</lj:journaltype>
  <image>
    <url>https://v2.dreamwidth.org/11294976/2595908</url>
    <title>Первый рукописный блог рунета™</title>
    <link>https://ermouth.dreamwidth.org/</link>
    <width>100</width>
    <height>100</height>
  </image>

<item>
  <guid isPermaLink='true'>https://ermouth.dreamwidth.org/703765.html</guid>
  <pubDate>Tue, 23 Jan 2018 23:22:45 GMT</pubDate>
  <title>JavaScript 2018</title>
  <link>https://ermouth.dreamwidth.org/703765.html</link>
  <description>&amp;nbsp;JS это нынче например вот так:&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;no more imperative javascript in 2018, javascript is a fancy lisp flavor from now on &lt;a href=&quot;https://t.co/jAmR1DwyDT&quot;&gt;pic.twitter.com/jAmR1DwyDT&lt;/a&gt;&lt;/p&gt;&amp;mdash; Alexey Orlenko (@aqrln) &lt;a href=&quot;https://twitter.com/aqrln/status/954182903159717889?ref_src=twsrc%5Etfw&quot;&gt;January 19, 2018&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br type=&quot;_moz&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=ermouth&amp;ditemid=703765&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://ermouth.dreamwidth.org/703765.html</comments>
  <category>javascript</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://ermouth.dreamwidth.org/703296.html</guid>
  <pubDate>Sat, 18 Nov 2017 01:17:00 GMT</pubDate>
  <title>CVE-2017-12635</title>
  <link>https://ermouth.dreamwidth.org/703296.html</link>
  <description>В CouchDB обнаружилась &lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2017-12635&quot;&gt;пара&lt;/a&gt; &lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2017-12636&quot;&gt;дырок&lt;/a&gt;, которые вместе дают возможность RCE. Это первая критическая уязвимость за 5 лет кстати, и она очень любопытна.&lt;br /&gt;&lt;br /&gt;Я &lt;a href=&quot;https://ermouth.dreamwidth.org/677940.html&quot;&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=&quot;https://github.com/davisp/jiffy&quot;&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=&quot;http://docs.couchdb.org/en/1.6.1/couchapp/ddocs.html#validate-document-update-functions&quot;&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=&quot;https://justi.cz/security/2017/11/14/couchdb-rce-npm.html&quot;&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=&quot;https://www.dreamwidth.org/tools/commentcount?user=ermouth&amp;ditemid=703296&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://ermouth.dreamwidth.org/703296.html</comments>
  <category>javascript</category>
  <category>couchdb</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://ermouth.dreamwidth.org/702989.html</guid>
  <pubDate>Sun, 10 Sep 2017 15:06:57 GMT</pubDate>
  <title>CouchDB Photon</title>
  <link>https://ermouth.dreamwidth.org/702989.html</link>
  <description>&lt;p&gt;Написал админку для CouchDB – &lt;a href=&quot;https://github.com/ermouth/couch-photon&quot; target=&quot;_blank&quot;&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=&quot;http://jquerymy.com/dw/CouchDBPhoton_10CC8/Photon1.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;Photon-1&quot; border=&quot;0&quot; alt=&quot;Photon-1&quot; src=&quot;http://jquerymy.com/dw/CouchDBPhoton_10CC8/Photon1_thumb.jpg&quot; width=&quot;790&quot; height=&quot;531&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt; В результате &lt;a href=&quot;http://jquerymy.com/kod/photon1.pdf&quot; target=&quot;_blank&quot;&gt;три эскиза&lt;/a&gt; превратились в полное приложение за две с небольшим недели:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://jquerymy.com/dw/CouchDBPhoton_10CC8/2017091017.32.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;Снимок-экрана-2017-09-10-в-17.32&quot; border=&quot;0&quot; alt=&quot;Снимок-экрана-2017-09-10-в-17.32&quot; src=&quot;http://jquerymy.com/dw/CouchDBPhoton_10CC8/2017091017.32_thumb.jpg&quot; width=&quot;790&quot; height=&quot;458&quot;&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=&quot;http://jquerymy.com/dw/CouchDBPhoton_10CC8/2017091018.00.10.png&quot; target=&quot;_blank&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;Снимок экрана 2017-09-10 в 18.00.10&quot; border=&quot;0&quot; alt=&quot;Снимок экрана 2017-09-10 в 18.00.10&quot; src=&quot;http://jquerymy.com/dw/CouchDBPhoton_10CC8/2017091018.00.10_thumb.png&quot; width=&quot;790&quot; height=&quot;514&quot;&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=&quot;https://www.dreamwidth.org/tools/commentcount?user=ermouth&amp;ditemid=702989&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://ermouth.dreamwidth.org/702989.html</comments>
  <category>ide</category>
  <category>couchdb</category>
  <category>mysoft</category>
  <category>javascript</category>
  <category>photon</category>
  <category>jquerymy</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://ermouth.dreamwidth.org/702740.html</guid>
  <pubDate>Thu, 27 Jul 2017 01:52:40 GMT</pubDate>
  <title>Couchbox</title>
  <link>https://ermouth.dreamwidth.org/702740.html</link>
  <description>&lt;p&gt;Месяц назад мы запустили публичную бету &lt;a href=&quot;https://vezdelegko.ru/&quot; target=&quot;_blank&quot;&gt;vezdelegko.ru&lt;/a&gt;, сервиса бронирования экскурсий, отелей и транспорта. Сервисы бронирования – сами по себе штука сложная, это как магазин, по которому надо вести учёт ассортимента на каждый день, причём ассортимент день ото дня меняется и цены зависят от дня и количества. Причём в магазине куча отделов, и партнёры сами управляют своим ассортиментом. &lt;/p&gt; &lt;p&gt;Дополнительно, в нашем случае сервис делался с прицелом на очень существенную масштабируемость как по ёмкости, так и по географии. Это автоматом предполагает архитектуру из многих узлов и распределённое хранение/обработку данных с последующей их репликацией и агрегацией. Под такую схему я придумал специальную архитектуру узла, которая потребовала платформы исполнения, это и есть &lt;a href=&quot;https://gitlab.com/Couchbox/couchbox&quot; target=&quot;_blank&quot;&gt;Couchbox&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://gitlab.com/Couchbox/couchbox/&quot; target=&quot;_blank&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px&quot; title=&quot;Снимок экрана 2017-07-27 в 2.26.24&quot; border=&quot;0&quot; alt=&quot;Снимок экрана 2017-07-27 в 2.26.24&quot; src=&quot;http://jquerymy.com/dw/Couchbox_4FC8/201707272.26.24.png&quot; width=&quot;800&quot; height=&quot;221&quot;&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=&quot;https://aws.amazon.com/ru/lambda/details/&quot; target=&quot;_blank&quot;&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=&quot;http://cloudwall.me/&quot; target=&quot;_blank&quot;&gt;CloudWall&lt;/a&gt; и &lt;a href=&quot;http://ddoc.me/&quot; target=&quot;_blank&quot;&gt;Ddoc Lab&lt;/a&gt;. Выглядит это примерно так:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://jquerymy.com/dw/Couchbox_4FC8/201707273.52.11.png&quot; target=&quot;_blank&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;Снимок экрана 2017-07-27 в 3.52.11&quot; border=&quot;0&quot; alt=&quot;Снимок экрана 2017-07-27 в 3.52.11&quot; src=&quot;http://jquerymy.com/dw/Couchbox_4FC8/201707273.52.11_thumb.png&quot; width=&quot;820&quot; height=&quot;357&quot;&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=&quot;http://jquerymy.com/dw/Couchbox_4FC8/201707274.29.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;Снимок-экрана-2017-07-27-в-4.29&quot; border=&quot;0&quot; alt=&quot;Снимок-экрана-2017-07-27-в-4.29&quot; src=&quot;http://jquerymy.com/dw/Couchbox_4FC8/201707274.29_thumb.jpg&quot; width=&quot;821&quot; height=&quot;647&quot;&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=&quot;https://www.dreamwidth.org/tools/commentcount?user=ermouth&amp;ditemid=702740&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://ermouth.dreamwidth.org/702740.html</comments>
  <category>jquerymy</category>
  <category>javascript</category>
  <category>inliner</category>
  <category>couchbox</category>
  <category>couchdb</category>
  <category>mysoft</category>
  <category>cloudwall</category>
  <category>design</category>
  <category>es6</category>
  <category>ide</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
</channel>
</rss>
