<?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>2021-11-22T19:36:12Z</updated>
  <dw:journal username="ermouth" type="personal"/>
  <entry>
    <id>tag:dreamwidth.org,2016-12-24:2595908:705215</id>
    <link rel="alternate" type="text/html" href="https://ermouth.dreamwidth.org/705215.html"/>
    <link rel="self" type="text/xml" href="https://ermouth.dreamwidth.org/data/atom/?itemid=705215"/>
    <title>Impossible chessboard puzzle</title>
    <published>2021-11-22T19:36:12Z</published>
    <updated>2021-11-22T19:36:12Z</updated>
    <category term="math"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Написал лонгрид про прекраснейшую задачу (сабж):&lt;br /&gt;&lt;br /&gt;Узник 1 (У1) заходит и видит шахматную доску, на которой в каждой клетке лежит монетка, орлом или решкой. Охранник кладёт под одну из клеток доски ключ, У1 это видит. У узника после этого есть право перевернуть ровно одну монету, любую.&lt;br /&gt;&lt;br /&gt;Затем У1 выходит и входит У2, и он должен только по расположению орлов и решек указать, под какой клеткой лежит ключ.&lt;br /&gt;&lt;br /&gt;-----&lt;br /&gt;&lt;br /&gt;Вот тут &lt;a href="https://cloudwall.me/etc/impossible-chessboard-puzzle"&gt;https://cloudwall.me/etc/impossible-chessboard-puzzle&lt;/a&gt; я разбираю подходы к решению и всякие усложнения (типа доска не совсем шахматная).&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=ermouth&amp;ditemid=705215" 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:705013</id>
    <link rel="alternate" type="text/html" href="https://ermouth.dreamwidth.org/705013.html"/>
    <link rel="self" type="text/xml" href="https://ermouth.dreamwidth.org/data/atom/?itemid=705013"/>
    <title>AI и плейлисты</title>
    <published>2020-03-21T21:06:22Z</published>
    <updated>2020-03-21T21:07:13Z</updated>
    <category term="music"/>
    <category term="whatisthematrix"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Это надо зафиксировать: Ютуб мне впервые составил плейлист органной музыки, который я слушаю уже час &amp;ndash; и заходит.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=ermouth&amp;ditemid=705013" 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:704378</id>
    <link rel="alternate" type="text/html" href="https://ermouth.dreamwidth.org/704378.html"/>
    <link rel="self" type="text/xml" href="https://ermouth.dreamwidth.org/data/atom/?itemid=704378"/>
    <title>Хватательное</title>
    <published>2019-09-03T19:42:12Z</published>
    <updated>2019-09-03T19:42:12Z</updated>
    <category term="hard"/>
    <category term="ui"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Сменил айфон &amp;ndash; с 7 на Х &amp;ndash; и обратил внимание на занятный феномен, который уже наблюдал, когда переезжал с 1 на 4 и с 5 на 7.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;У меня маленькая ладонь, первый айфон был в самый раз. Когда появилась четвёрка, я полдня подбирал к ней новый хват, то-есть такое расположение пальцев, чтобы до всех углов дотягиваться. С пятёрки на семёрку это уже был не полдня, а день-два.&lt;br /&gt;&lt;br /&gt;С десяткой я уже несколько дней так и не могу наловчиться одной рукой комфортно доставать большим пальцем до дальнего верхнего угла &amp;ndash; приходится изворачиваться. &lt;br /&gt;&lt;br /&gt;Забавно, что такое ощущение, будто руки &amp;laquo;думают&amp;raquo;, перебирают варианты сами. Интересно даже, какой в результате получится хват.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=ermouth&amp;ditemid=704378" 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:704134</id>
    <link rel="alternate" type="text/html" href="https://ermouth.dreamwidth.org/704134.html"/>
    <link rel="self" type="text/xml" href="https://ermouth.dreamwidth.org/data/atom/?itemid=704134"/>
    <title>Исследование 6502 методами, принятыми в нейробиологии</title>
    <published>2018-06-04T20:19:50Z</published>
    <updated>2018-06-04T20:19:50Z</updated>
    <category term="whatisthematrix"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Could a Neuroscientist Understand a Microprocessor?&amp;nbsp;&lt;a href="http://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1005268"&gt;http://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1005268&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Я примерно на третьем абзаце отмотал до начала посмотреть дату &amp;ndash; не первоапрельская ли шутка, до того круто.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=ermouth&amp;ditemid=704134" 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: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="javascript"/>
    <category term="couchdb"/>
    <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="javascript"/>
    <category term="ide"/>
    <category term="photon"/>
    <category term="mysoft"/>
    <category term="jquerymy"/>
    <category term="couchdb"/>
    <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="couchdb"/>
    <category term="jquerymy"/>
    <category term="cloudwall"/>
    <category term="mysoft"/>
    <category term="javascript"/>
    <category term="ide"/>
    <category term="design"/>
    <category term="inliner"/>
    <category term="es6"/>
    <category term="couchbox"/>
    <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>
  <entry>
    <id>tag:dreamwidth.org,2016-12-24:2595908:702009</id>
    <link rel="alternate" type="text/html" href="https://ermouth.dreamwidth.org/702009.html"/>
    <link rel="self" type="text/xml" href="https://ermouth.dreamwidth.org/data/atom/?itemid=702009"/>
    <title>Саппорт-франкенштейн</title>
    <published>2017-04-26T22:49:16Z</published>
    <updated>2017-04-28T08:20:58Z</updated>
    <category term="around"/>
    <category term="саппорт"/>
    <category term="biz"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">У меня на протяжении нескольких последних дней была уникальная возможность много-много раз пообщаться с саппортом крупной организации. Всё общение я записывал, а заодно аккуратно считал, сколько раз я пересказывал одну и ту же историю, со сколькими людьми я общался, сколько ждал и пр.&lt;br /&gt;&lt;br /&gt;Случай, конечно, выдающийся &amp;ndash; я пообщался в общей сложности с 16 людьми, и при такой выборке уже начинают хорошо проглядывать и контуры внутренней организации процесса, и характер системных проблем.&lt;br /&gt;&lt;br /&gt;До этого у меня никогда не было такого масштаба наблюдений &amp;ndash; и я неверно представлял себе главную проблему. Я полагал, что основной недостаток саппортов крупных сервисов массового обслуживания &amp;ndash; некомпетентность.&lt;br /&gt;&lt;br /&gt;В самом деле куда более тяжёлая проблема там &amp;ndash; бюрократическая организация.&lt;br /&gt;&lt;br /&gt;Дело в том, что современный крупный саппорт &amp;ndash; это расчленёнка, франкенштейн. Структура с отделами, департаментами, уровнями и всякими другими признаками состоявшейся бюрократии, &lt;em&gt;аппарата&lt;/em&gt;. У всех подобных структур есть характерные особенности:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;оформление (заявок соседнему департаменту, эскалэйт, отказ и пр) становится ритуалом, полностью вытесняющим из сознания необходимость помочь: передал заявку &amp;ndash; спи спокойно&lt;/li&gt;&lt;li&gt;бюрократы непрерывно лгут или юлят, потому что их прикрывает аппарат&lt;/li&gt;&lt;li&gt;бюрократы чрезвычайно невнимательны и искажают информацию &amp;ndash; потому что когда сообщение передано дальше, ответственность конкретного бюрократа кончается&lt;/li&gt;&lt;li&gt;жесткие ритуальные барьеры между уровнями ведут к отрицательному отбору &amp;ndash; топовые позиции оказываются заселены бесполезными зверушками, особо тщательно защищаемыми аппаратом&lt;/li&gt;&lt;li&gt;бюрократы неприятно-вежливы и начинают ханжески поучать, услышав слово &amp;laquo;говно&amp;raquo;, например&lt;/li&gt;&lt;li&gt;низовые исполнители, ещё не вовлечённые в общую гниль, оказываются самыми настойчивыми (но всё равно некомпетентными).&lt;/li&gt;&lt;/ul&gt;Саппорт-франкнштейн, организация-расчленёнка, не работает как команда &amp;ndash; если умений конкретного подразделения не хватает, другие не помогают &amp;ndash; потому что по пути теряется информация, плюс искусственные барьеры исключают совместную работу.&lt;br type="_moz" /&gt;&lt;br type="_moz" /&gt;Конечно, это даёт на выходе холостой цикл, нередко деструктивный, в сколь-нибудь нестандартных ситуациях. Франкенштейн начинает беспорядочно дёргать всеми своими частями и, бывает, крушит что-нибудь по пути. Каждый отдел, уровень и тп начинают рефлекторно отползать кратчайшим путём в направлении восстановления комфорта &amp;ndash; в результате вместо совместного решения проблемы случается паралич.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;Мне совсем скоро нужно будет сконструировать саппорт на заказ &amp;ndash; не чудовищно-массовый, но ситуационно очень сложный. Скорее всего, без этих наблюдений я бы тоже сделал франкенштейна. Думаю, что с учётом нового опыта я буду делать всё таки&amp;nbsp;&lt;a href="http://ermouth.dreamwidth.org/693559.html"&gt;осьминога&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=ermouth&amp;ditemid=702009" 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:701467</id>
    <link rel="alternate" type="text/html" href="https://ermouth.dreamwidth.org/701467.html"/>
    <link rel="self" type="text/xml" href="https://ermouth.dreamwidth.org/data/atom/?itemid=701467"/>
    <title>ZX Spectrum</title>
    <published>2017-04-24T13:23:39Z</published>
    <updated>2017-04-24T13:25:28Z</updated>
    <category term="hard"/>
    <category term="around"/>
    <category term="diary"/>
    <dw:security>public</dw:security>
    <dw:reply-count>3</dw:reply-count>
    <content type="html">Спектруму 35 лет! У меня была Дельта-С, мод на компонентах производства СССР.&lt;br /&gt;&lt;br /&gt;Спектрум &amp;ndash; прекрасная машина в том смысле, что для создания чего угодно, работающего с нормальной скоростью, нужно пис&amp;aacute;ть на ассемблере. То-есть Спектрум как минимум мотивировал&amp;nbsp;&lt;em&gt;просто&lt;/em&gt; изучать ассемблер.&lt;br /&gt;&lt;br /&gt;Более того, Z80 мотивировал изучать ассемблер &lt;em&gt;глубоко&lt;/em&gt;.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Первое, для чего мне захотелось учить асм &amp;ndash; Game of Life Конвея. На Бейсике оно, конечно, еле ворочалось. Что интересно, прирост скорости после первого переписывания на асме меня тоже не устроил, и я стал копаться дальше.&lt;br /&gt;&lt;br /&gt;И обнаружил, что, как сейчас помню, индексная адресация кратно медленнее просто сложения и выборки. Типа, 20 тактов против 6.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Этот прирост меня тоже не устроил, и после дальнейшего углубления в детали оказалось, что если сделать самомодифицирующийся код, можно выиграть ещё процентов 20 скорости.&lt;br /&gt;&lt;br /&gt;Причём мне тогда казалось, что самомодицирующийся код &amp;ndash; это вполне себе ок, даже благо. То-есть, если Лисп (про который я тогда только читал и никогда не видел) делает же рерайт куска исполняющейся программы, почему тогда в ассемблере этот трюк массово не юзают? Ведь выигрыш в скорости же )&lt;br /&gt;&lt;br /&gt;Почему это не айс для асма, я и сам понял довольно быстро &amp;ndash; уж&amp;eacute; когда &lt;a href="http://ermouth.dreamwidth.org/195778.html"&gt;писал программу&lt;/a&gt; для решения кубика-рубика. Я затрудняюсь точно подобрать определение для отладки самомодифицирующихся программ, даже &amp;laquo;адский мозговзрывающий кошмар&amp;raquo; довольно мягко, по-моему )&lt;br /&gt;&lt;br /&gt;Думаю, не преувеличу, если скажу что целое поколение инженеров началось со Спектрума.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=ermouth&amp;ditemid=701467" 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:701193</id>
    <link rel="alternate" type="text/html" href="https://ermouth.dreamwidth.org/701193.html"/>
    <link rel="self" type="text/xml" href="https://ermouth.dreamwidth.org/data/atom/?itemid=701193"/>
    <title>Иконка лжи</title>
    <published>2017-04-23T17:19:05Z</published>
    <updated>2017-04-23T17:19:05Z</updated>
    <category term="video"/>
    <category term="whatisthematrix"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Внезапно без конкретной необходимости задумался, как бы я стал рисовать иконку (пиктограмку) понятия &amp;laquo;ложь&amp;raquo;.&lt;br /&gt;&lt;br /&gt;Первой ассоциацией проявился символ 𝓛 ) Icon of Lie.&lt;br /&gt;&lt;br /&gt;Сразу ещё вспомнился один прекрасный момент про ложь, и Гугл мне даже видео подсунул:&lt;br /&gt;&lt;br /&gt;&lt;iframe width="853" height="480" src="https://www.youtube.com/embed/8keZbZL2ero?rel=0" frameborder="0" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=ermouth&amp;ditemid=701193" 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:701056</id>
    <link rel="alternate" type="text/html" href="https://ermouth.dreamwidth.org/701056.html"/>
    <link rel="self" type="text/xml" href="https://ermouth.dreamwidth.org/data/atom/?itemid=701056"/>
    <title>Многомоторный электролёт – IV</title>
    <published>2017-04-22T08:54:00Z</published>
    <updated>2017-04-22T08:54:00Z</updated>
    <category term="flight"/>
    <category term="video"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Чуть больше полугода назад &lt;a href="https://ermouth.dreamwidth.org/667272.html" target="_blank"&gt;пис&amp;aacute;л про Lilium&lt;/a&gt;, аккуратный такой электролёт необычной компоновки. Так вот, эта штука полетела в прототипе:&lt;br /&gt;&lt;br /&gt;&lt;iframe width="853" height="480" src="https://www.youtube.com/embed/ohig71bwRUE?rel=0" frameborder="0" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;br /&gt;Что интересно, у Lilium похоже и правда есть незначительная проблема со стабильностью &amp;ndash; похожая на ту, что я в прошлом посте предположил. В ролике видно, смотреть примерно с 1:27 &amp;ndash; эта штука явно роняет нос при крене и вынуждена немного проседать, чтобы выровняться. Особенно хорошо заметно, если поставить замедление вдвое.&lt;br /&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=701056" 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:298</id>
    <link rel="alternate" type="text/html" href="https://ermouth.dreamwidth.org/298.html"/>
    <link rel="self" type="text/xml" href="https://ermouth.dreamwidth.org/data/atom/?itemid=298"/>
    <title>Test</title>
    <published>2016-12-24T20:26:57Z</published>
    <updated>2016-12-24T20:26:57Z</updated>
    <category term="test"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Test&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=ermouth&amp;ditemid=298" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
</feed>
