<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-8066257029149636095</atom:id><lastBuildDate>Thu, 10 Jan 2019 09:29:14 +0000</lastBuildDate><category>Технологическое</category><category>Kalpa</category><category>Qt</category><category>Госмессенджер</category><category>статьи</category><category>English</category><category>STM</category><category>cmake</category><category>Заметки архитектора</category><category>Клименко</category><category>аси</category><category>бпла</category><category>дроны</category><category>микроконтроллер</category><category>прогнозы</category><category>программирование</category><category>сельское хозяйство</category><category>форсайт</category><title>Oleg</title><description></description><link>https://oleg.kalpa.ru/</link><managingEditor>noreply@blogger.com (Oleg Shall)</managingEditor><generator>Blogger</generator><openSearch:totalResults>36</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-7419471113263375263</guid><pubDate>Fri, 30 Nov 2018 00:11:00 +0000</pubDate><atom:updated>2018-11-30T03:11:50.629+03:00</atom:updated><title>Текущее и управление</title><description>&lt;br /&gt;Есть у меня друг. С ним мы много раз говорили об управлении предприятиями и каждый раз наш разговор наталкивался на рифы противоположных аксиом, на которые каждый из нас опирается в ходе своих размышлений. Он считает, что управление — суть гуманитарная задача, которую может решить только человек. Человеку нужен человек. Человек всегда будет хотеть говорить с человеком.&lt;br /&gt;&lt;br /&gt;Я же считаю, что управление (по большей части) задача технологическая и ее можно и нужно формализовать в наборы алгоритмов. Конечно в компании есть, будут и должны быть поэты, романтики и мастера своего дела, которые применяют нестандартные таланты управленцев, экономистов, инженеров и переговорщиков, но их творческое начало должно приводить в движение и создавать наборы алгоритмов. Таких людей не бывает много. Именно такие алмазы и определяют индивидуальное лицо предприятия. Значит надо максимизировать творческое начало художников бизнеса дав им необходимый набор инструментов. Очень часто в компании весьма много сотрудников выполняют формальную функцию, которую, опять же, можно формализовать и оптимизировать.&lt;br /&gt;&lt;br /&gt;И вот настает эпоха цифровых технологий и цифровых двойников. Понятно, что цифровые подходы должны активно использоваться и в управлении и текущей жизни компании, но инструментов обеспечения такой трансформации у фирм явно недостаточно. Что происходит сейчас? Что обычно делает предприниматель на старте? Он запускает фирму на бумажке, работает на бумажке, использует свой мозг и здравый смысл, и только после осознания своих естественных ограничений, начинает использовать внешние подпорки. Электронные таблицы, бухгалтерские программы, CRM, склад, автоматизация общения с партнерами и клиентами. Но это все происходит a posteriori, как результат неспособности совладать с нарастающей сложностью управляемых процессов. Я уже не говорю о чувстве “ложной компетентности”, которое часто захлестывает предпринимателей, играя с ними злую шутку.&lt;br /&gt;&lt;br /&gt;Я хочу изучить другой подход. Начать строить компанию как софт-проект. Попытаться изначально описать сложность в коде и модифицировать его по мере нарастания сложности. Решить вопросы формализации процессов, происходящих в моей же создаваемой фирме.&lt;br /&gt;&lt;br /&gt;Принцип таков. Если чего-то нет в коде, то этого нет в теле компании. Если сотрудника нет в пространстве формализованного бизнес-процесса или описанного ранее алгоритма, то его действий не существуют. Если происходит деловое общение вне информационного пространства, то факта этого общения не существует. Ошибки сотрудников должны отрабатываться в коде (Виновата прежде всего система). Прогнозы взаимодействия модели и реальности должны анализироваться на основе внутренней модели. Если модель не соответствует реальности, она должна быть изменена. Действия цифровой модели сотрудника и его процесса можно автоматизировать и тестировать.&lt;br /&gt;&lt;br /&gt;В моей системе я не желаю слышать фразу :”Наверное девочка что-то напортачила (не поняла)”.&lt;br /&gt;&lt;br /&gt;Это трудная задача и еще трудней ее решить без поддержки, без инвестиций. Тем интересней результат, тем занятнее процесс. Да, я знаю мнение многих. АСУ не решает задач, не снижает сложность и только увеличивает число работников. В известном смысле это и будет попыткой ответить на этот вопрос.&lt;br /&gt;&lt;br /&gt;Получается эдакий bootstrapping. Попытка вытянуть себя за волосы из болота традиционных подходов к управлению и создать новый набор деловых инструментов. Особо надо отметить, что полученный набор инструментов будет доступен другим потребителям (конечно если это им будет интересно). Ведь слабо решен один из главных вопросов современного бизнеса — прямое и постоянное взаимодействие продавца с покупателем до, во время и после покупки.&lt;br /&gt;&lt;br /&gt;На чем собираемся выходить. В работе есть несколько проектов.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Работа с ресторанами. Заказы столиков, планирование, доставка, контроль продаж, контроль качества работы кухни и официантов, (возможно контроль склада). Предоставление возможности пользователям напрямую выбирать нужный ресторан и через единое приложение напрямую взаимодействовать с алгоритмами и персоналом ресторана.&lt;/li&gt;&lt;li&gt;Работа с фитнес-центрами, салонами красоты, бассейнами и танцевальными клубами. Регистрация, планировка, работа с клиентами, продажа основных и дополнительных услуг, организация мероприятий.&lt;/li&gt;&lt;li&gt;Продажа косметики и сопутствующих товаров.&lt;/li&gt;&lt;li&gt;Интегрированная система организации отдыха. (Да заинтересуются профсоюзы и санатории)&lt;/li&gt;&lt;li&gt;Сеть небольших специализированных магазинов. (на меня вышли коллеги с подобных предложением) Автозапчасти, сантехника, бытовая химия.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Это все будет реализовано в одном едином приложении (и мобильном тоже), что позволит пользователю делать больше дел сразу, а предпринимателю стремительно расширять свою абонентскую базу.&lt;br /&gt;&lt;br /&gt;И конечно, заказная разработка на основе нашей платформы. Деньги нужны прямо сейчас.&lt;br /&gt;&lt;br /&gt;На этих задачах мы сможет исследовать принципы построения своей фирмы, изучить вопросы внутреннего управления и продаж. И если этот опыт будет интересным, то наработанные модули будут доступны для продажи и другим предпринимателям.&lt;br /&gt;&lt;br /&gt;А если наш путь заинтересует инвесторов, мы будет очень рады обсуждать тонкости взаимодействия.</description><link>https://oleg.kalpa.ru/2018/11/blog-post.html</link><author>noreply@blogger.com (Oleg Shall)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-7265317132482978467</guid><pubDate>Thu, 12 Jul 2018 14:38:00 +0000</pubDate><atom:updated>2018-07-13T12:43:39.332+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">STM</category><category domain="http://www.blogger.com/atom/ns#">Технологическое</category><category domain="http://www.blogger.com/atom/ns#">микроконтроллер</category><category domain="http://www.blogger.com/atom/ns#">программирование</category><title>Если лампы зажигают, значит это кому-то нужно.</title><description>&lt;br /&gt;&lt;div style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;Плавное возгорание лампочки&lt;/h2&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://images.unsplash.com/photo-1448745799564-e2c1ed534c94?ixlib=rb-0.3.5&amp;amp;ixid=eyJhcHBfaWQiOjEyMDd9&amp;amp;s=4b751a5b26c774840149b0f291d446bb&amp;amp;dpr=1&amp;amp;auto=format&amp;amp;fit=crop&amp;amp;w=1000&amp;amp;q=80&amp;amp;cs=tinysrgb&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;426&quot; src=&quot;https://images.unsplash.com/photo-1448745799564-e2c1ed534c94?ixlib=rb-0.3.5&amp;amp;ixid=eyJhcHBfaWQiOjEyMDd9&amp;amp;s=4b751a5b26c774840149b0f291d446bb&amp;amp;dpr=1&amp;amp;auto=format&amp;amp;fit=crop&amp;amp;w=1000&amp;amp;q=80&amp;amp;cs=tinysrgb&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;В сети можно встретить кучу статей и видео на эту тему, но на мой взгляд очень много интересной теоретической и практической части остаются без внимания. В этой статье вы узнаете о:&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;ul&gt;&lt;li&gt;таймерах;&amp;nbsp;&lt;/li&gt;&lt;li&gt;широтно-импульсной модуляции (ШИМ/PWM);&amp;nbsp;&lt;/li&gt;&lt;li&gt;прерываниях;&amp;nbsp;&lt;/li&gt;&lt;li&gt;начальной инициализации в CubeMX.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Вся теоретическая и практическая части относится к микроконтроллерам STM32 в моем случае это STM32F407VG, но ничего страшного, если есть другой микроконтроллер STM с наличием светодиодов и таймеров общего назначения.&lt;/div&gt;&lt;h3&gt; Перывания&lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Прерывания представляют собой некоторый запрос, который нужно срочно обработать. Для этого выполнение основной программы останавливается и вызывается код прерывания (обработчик прерывания), после выполнения которого, управление возвращается к основной программе. Соответственно, чтобы надолго не задерживать выполнение основной программы, выполнение кода обработчика должно занимать мало времени.&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;В ARM процессорах управлением прерываний занимается Nested vectored interrupt controller (NVIC). Он позволяет назначать приоритет прерываниям. И в случае если во время выполнения прерывания случиться более приоритетное прерывание, то выполнения текущего прерывания будет остановлено, и начнет выполняться более приоритетное (рисунок ниже).&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;img height=&quot;240&quot; src=&quot;https://cdn-images-1.medium.com/max/800/0*DKTm6HouxRGtl5C1.jpg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot; width=&quot;640&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Временная диаграмма прерываний&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;h3&gt;Таймеры&lt;/h3&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Микроконтроллеры серии STM32 имеют около 10 таймеров. Первым таймером, которым вы уже вероятно пользовались в функции void HAL_Delay(uint32_t Delay) является system timer, который присутствует практически во всех ARM Cortex-M процессорах. По умолчанию CubeMX настраивает данный таймер на генерацию прерываний с частотой 1 кГц. А код обработчика прерывания просто выполняет инкремент переменной uwTick библиотеки HAL.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Кроме данного таймера у STM32F3 так же имеются таймеры TIM1-TIM14. Данные таймеры облают большими возможностями чем system timer и имеют следующие возможности:&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;ul&gt;&lt;li&gt;генерация прерываний с заданной частотой&amp;nbsp;&lt;/li&gt;&lt;li&gt;измерение длительности сигналов&amp;nbsp;&lt;/li&gt;&lt;li&gt;генерация сигнала с широтно-импульсной модуляцией (PWM), которая используется для управления большим количеством периферии. Например, c помощью широтно-импульсной модуляции управляются сервоприводы и бесколлекторные двигатели. Мы будем использовать PWM для плавного возгорания и затухания светодиодов. Пример таких сигналов приведен на рисунке ниже.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://cdn-images-1.medium.com/max/800/0*puh2iPM8R_HPm5gl.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://cdn-images-1.medium.com/max/800/0*puh2iPM8R_HPm5gl.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Пример сигналов с широтно-импульсной модуляцией&lt;br /&gt;&lt;br /&gt;По функциональности таймеры в STM32 делятся на следующие группы: &lt;br /&gt;&lt;ol&gt;&lt;li&gt;базовые таймеры. Умеют только генерировать прерывания с заданной частотой;&amp;nbsp;&lt;/li&gt;&lt;li&gt;таймеры общего назначения. Имеют весь функционал базовых таймеров, но также могут измерять длительность импульсов и генерировать сигналы с широтно-импульсной модуляцией;&lt;/li&gt;&lt;li&gt;расширенные таймеры. Умеют делать тоже самое, что и таймер общего назначения, но имеют дополнительные возможности по генерации сигналов для управления двигателями и периферией.&lt;/li&gt;&lt;/ol&gt;Рассмотрим общую структуру таймера на примере таймера общего назначения, представленного на рисунке ниже. Не пугайтесь ее, все проще, чем кажется, тем более далеко не все элементы нужно понимать для осознания работы таймеров ;)&lt;br /&gt;&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;img height=&quot;477&quot; src=&quot;https://cdn-images-1.medium.com/max/800/0*3v5xoNtglTiEqOLv.jpg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot; width=&quot;640&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Схема таймера общего назначения&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Из основных элементов таймера выделим счетчик (CNT counter) и каналы (TIMx_CH1 — TIMx_CH4).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Рассмотрим сначала работу счетчика. На рисунке ниже изображена линия CK_PSC, от которой работает таймер. Обычно она подключена к системной шине и соответственно работает на частоте процессора. Прежде чем попасть на счетчик частота тактового сигнала уменьшается в PSC + 1 раз (данной значение можно настроить), и потом попадает на счетчик. Счетчик представляет собой обычный регистр. Каждый такт с CK_CNT, увеличивает, либо уменьшает его значение на 1. В случае увеличения, в какой-то момент счётчик достигает значения, которое равно значению в auto-reload регистре. В этот момент генерируется событие, например прерывание, и потом счетчик сбрасывается в 0. После чего весь процесс повторяется снова.&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/0*ig7en5A9qhNezLPC.jpg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Счетчик таймера&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Так например, допустим что частота процессора 48 МГц, счетчик тактируется от системной шины, значение PSC равно 479, а значение autorelaod register равно 1999. В этом случае счетчик инкрементируется с частотой 100 КГц (48000000 / (479+1) = 100000), и с частотой 50 Гц генерирует прерывания (100000 / (1999+1) = 50).&lt;br /&gt;&lt;br /&gt;Второй важной частью таймера является канал, обеспечивающий возможности изменения длительности входных сигналов, и генерации ШИМ. Центральной частью канала является capture/compare регистр (рисунок ниже).&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/0*pnC-dp4vsYqzOkas.jpg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Схема первого канала таймера&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;В режиме сравнения capture/compare регистр заранее записывается некоторое значение, которое постоянно сравнивается со значением счетчика. В случае если это значение меньше или равно значению счетчика, то канал на выходе выдает логическую 1, и если больше логический 0. Например, если значение счетчика изменяется от 0 до 500, то записав в capture/compare 400 или 200, то можно получить на выходе канала сигналы, как показано на рисунке ниже. Так же в момент, когда значение capture/compare равно значению счетчика, можно генерировать прерывания.&lt;/span&gt;&lt;br /&gt;&lt;img height=&quot;342&quot; src=&quot;https://cdn-images-1.medium.com/max/800/0*C1-Bs33zanvLcXGc.jpg&quot; width=&quot;640&quot; /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;В режиме захвата, в результате некоторого события, например, изменения напряжения на пине, в capture/compare регистр записывается текущее значение счетчика, и может вызваться прерывание. Из последнего отметим что таймер имеет один счетчик, но может иметь несколько каналов (таймеры STM32 обычно имеют 4 канала).&lt;br /&gt;Реализация плавного возгорания&lt;br /&gt;&lt;br /&gt;Выше описанной теоретической базы достаточно, чтобы реализовать поставленную задачу. Если время для подачи напряжения на светодиод очень мало, то светодиод не успеет полностью возгореть из-за этого он будет выглядеть неярко. И наоборот, если время для подачи напряжения на светодиод велико, то он будет выглядеть ярко. Регулировать время подачи напряжения позволит нам широтно-импульсная модуляция.&lt;br /&gt;&lt;br /&gt;Для начала попытаемся сделать неяркое свечения светодиода. Для этого нужно понять с какой частотой должен обновляться счетчик и на какую долю его периода нужно подавать напряжение. Допустим счетчик обновляется с частотой 1Гц, то есть он за 1 секунду достигает какого-то значения записанного в auto-reload регистре и обнуляется. Допустим мы на 1*10^-3 секунды подадим напряжение на диод, то остальные 999*10^-3 секунды напряжение в светодиоде будет равно нулю. Очевидно, что простой в 0.999 секунды будет заметен для глаза, а 0.001 хватает для полного возгорания диода (проверено на практике).&lt;br /&gt;&lt;br /&gt;Увеличим частоту обновления счетчика, теперь она будет равна 1кГц, соответственно период будет равен 1*10^-3с, который будет состоять из 1мкс подачи напряжения и 999мкс из нулевого напряжения на светодиоде. Получается диод должен возгорать на 1 микросекунду за каждую миллисекунду. Этого должно хватать…&lt;br /&gt;&lt;br /&gt;Давайте теперь запрограммируем это. Для того, чтобы вручную не писать инициализацию воспользуемся средством CubeMX. Для начала необходимо выбрать плату, затем найти пины, которые отвечают за диоды (в STM32F407 это PD12-PD15), нажать на них и в выпадающем списке нужно выбрать TIMx_CHx.&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/0*q0L1vr7ES2Olvtjl.jpg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Инициализация светодиодов&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Затем найти в правой части окна выбрать привязанный к светодиодам таймер и настроить каналы на ШИМ.&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/0*JIsA9dpz0bI8w7n1.jpg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Инициализация каналов таймера на ШИМ&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Затем посмотрим на конфигурацию тактирования. Здесь я ничего не менял. Из рисунка видно, что частота процессора является 16МГц.&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;img height=&quot;244&quot; src=&quot;https://cdn-images-1.medium.com/max/800/0*XQvgEqOlSb61IK4Q.jpg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot; width=&quot;640&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Clock configuration&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div&gt;Далее «идем» во вкладку Configuration и нажимаем на наш таймер.&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;img height=&quot;228&quot; src=&quot;https://cdn-images-1.medium.com/max/800/0*6AXZwI3_Z5VZPSRY.jpg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot; width=&quot;640&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Configuration&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Теперь преступим к инициализации таймера в соответствии с рассчитанными значениями. В вкладке «Parameter Settings» настраиваем значения Prescaler. Я выставил его на 15, значит частота, с которой будет инкрементироваться счетчик будет 16МГц(частота процессора)/(15+1)=1МГц.&lt;br /&gt;&lt;br /&gt;Там же инициируем значение Auto-reload регистра я выставил его в 1000. Следовательно частота обновления счетчика будет 1000/1МГц=1кГц. Именно такие значения мы получили в расчете выше. Далее установим поле Pulse в каждом канале нашего таймера в 1. Этот параметр синоним Capture/Compare регистру и в данном случае соответствует времени (1мкс) подачи напряжения в светодиод (ШИМ).&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;img height=&quot;263&quot; src=&quot;https://cdn-images-1.medium.com/max/800/0*84I3cVt7eqCYrhRc.jpg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot; width=&quot;640&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Инициализация таймера&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Далее перейдем во вкладку NVIC Settings и включим там прерывание. Это прерывание возникает тогда, когда значение счетчика равно значению в Auto-reload регистре. (Расскажу чуть позже зачем оно нам нужно).&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;img height=&quot;47&quot; src=&quot;https://cdn-images-1.medium.com/max/800/0*4fvduLHjzSC8QGaD.jpg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot; width=&quot;640&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Включение прерывания&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Теперь генерируем код и открываем проект в среде разработки! В main’e после инициализации необходимо стартовать ШИМ на каждом инициализированном канале при помощи функции HAL_TIM_PWM_Start(tim4, TIM_CHANNEL_1).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img height=&quot;367&quot; src=&quot;https://cdn-images-1.medium.com/max/800/0*RL0Vz_VvSVH-1ptq.jpg&quot; width=&quot;640&quot; /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Перепрошьем контроллер, и если вы все сделали правильно, то диод должен гореть неярко.&lt;br /&gt;&lt;br /&gt;Как заставить диод гореть неярко мы разобрались — очень быстро включаем и тут же выключаем не давая ему полностью загореться, а глаз в свою очередь не видит простоя. Для того, чтобы он горел ярче необходимо увеличить время подачи напряжения на диод, то есть, чтобы он постепенно возгорал необходимо постепенно увеличивать значения счетчика capture/compare регистра.&lt;br /&gt;&lt;br /&gt;Так как мы включили прерывание, которое будет вызывать обработчик каждый раз, когда значение счетчика будет равно значению Auto-reload регистра, то можно с частотой 1кГц (частота обновления счетчика) увеличивать это значение на 1 или уменьшать в случае затухания.&lt;br /&gt;&lt;br /&gt;Перейдем в файл stm32f4xx_it.c и найдем созданную CubeMX’ом функциюvoid TIM4_IRQHandler(void). Это обработчик прерывания, в котором поместим алгоритм программы.&lt;br /&gt;&lt;br /&gt;&lt;img height=&quot;640&quot; src=&quot;https://cdn-images-1.medium.com/max/800/1*uXI05skXIxcPSb1SGYTvng.png&quot; width=&quot;582&quot; /&gt; &lt;br /&gt;&lt;br /&gt;Из листинга программы видно что CurrentPulse увеличивается до тех пор пока не достигнет 1000, что соответствует максимальному значению Auto-reload регистра. При такой конфигурации время возгорания как и время затухания равно 1мс(период обновления счетчика)*1000=1с.&lt;br /&gt;&lt;br /&gt;Для того, чтобы работа прерывания по таймеру началась, необходимо в main’е его стартовать и убрать старт ШИМа из предыдущего примера, так как он находится в каждом обработчике.&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;img height=&quot;343&quot; src=&quot;https://cdn-images-1.medium.com/max/800/0*HtW_bet0oxxpkVTb.jpg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot; width=&quot;640&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Старт таймера и его прерывания&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;После перепрошивки диоды должны плавно возгорать и затухать.&lt;br /&gt;&lt;br /&gt;Надеюсь статья была написана доступным языком.&lt;br /&gt;Удачи!&lt;br /&gt;&lt;br /&gt;(c) Elijah Shall https://vk.com/@gener_it-plavnoe-vozgoranie-lampochki&lt;/div&gt;</description><link>https://oleg.kalpa.ru/2018/07/blog-post.html</link><author>noreply@blogger.com (Oleg Shall)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-3265106231704735988</guid><pubDate>Sat, 23 Jun 2018 15:29:00 +0000</pubDate><atom:updated>2018-07-12T18:29:21.361+03:00</atom:updated><title>Слово о сложности</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img height=&quot;400&quot; src=&quot;https://cdn-images-1.medium.com/max/800/0*qszUx8AWzGAzq5ME.jpg&quot; width=&quot;394&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Очень часто молодые (и даже не очень молодые) разработчики находятся в плену весьма распространенного заблуждения. Они полагают, что возможно описать сложное простым и даже создать нечто, которое позволит управлять сложное простым. Именно подобные люди мучительно ищут пути создания систем управления экономикой, финансами, юридическими тонкостями, цифровыми моделями всего сущего через посредство простых и понятных обывателю (и даже наивному ребенку) инструментов, и рычагов, и единых для всего методов.&lt;br /&gt;&lt;br /&gt;Заблуждение это настолько устойчиво и старо, что говорили о нем еще со времен древних греков. В новое время серьезно это вопрос поставил Годфрид Лейбниц в своей работе «Рассуждения о метафизике» 1686 года. Потом про это весьма успешно думали и Гёдель, и Гильберт, и Колмогоров, и Чейтин. Всё без толку. Разработчики, часто, не склонны к философскому осмыслению реальности.&lt;br /&gt;&lt;br /&gt;В этом аспекте интересно поговорить об особенностях измерений. Есть даже математические основания для формулирования законов измерений. И они просты. Чем точнее и тоньше мы хотим измерить объект нашего интереса, тем больше энергии мы должны приложить к самому процессу измерения и (что очень важно!), тем сильнее физически разрушится измеряемый объект.&lt;br /&gt;&lt;br /&gt;Можно весьма приблизительно измерить физические параметры любимой крысы сантиметром, но для точного анализа ее внутреннего убранства придется ее убить и поковыряться внутри.&lt;br /&gt;&lt;br /&gt;Важно понимать, что когда мы разглядываем удивительные микрофотографии внутреннего рецептора мухи, сделанные электронным микроскопом, эта муха уже давно мертва. И дело даже не в том, что она шевелится и не дает фотаться. Просто поток излучения, обуславливающее необходимое разрешение в электронной микроскопии, не совместим с жизнью изучаемой бедняги.&lt;br /&gt;&lt;br /&gt;В физике дело еще суровей. Для постижения тайн ядра необходимы энергии очень значительные. Что делают коварные физики? Они уничтожают мишени, атакуя их высокоэнергетическими пучками. Читай разрушают объект исследования. А потом смотрят что там из этого трупа ядра гелия интересного вылетело.&lt;br /&gt;&lt;br /&gt;Кстати, вопросы квантовых вычислений и (берем выше) телепортации объектов (Скотти! Поднимай) упирается именно в вопросы измерений. Ведь если мы будем измерять Спока недостаточно точно, то прилетит совсем не тот Спок. А если точно, то изначального Спока неизбежно надо убить и затратить на это надо огого сколько энергии. (Что же будет с бессмертной душой Спока)&lt;br /&gt;&lt;br /&gt;К чему же я так долго подводил?&lt;br /&gt;&lt;br /&gt;Дело в том, что процесс программирования можно описать именно в терминологии измерений. Программирование, как и любое описание чего угодно — суть измерение объекта, точного или не очень описания его сложности. Здесь начинают работать наши законы.&lt;br /&gt;&lt;br /&gt;Чем точнее мы хотим описать реальность, тем больше энергии для этого надо затратить. И здесь совершенно не помогут волшебные средства «упрощающие» жизнь исследователя-программиста.&lt;br /&gt;&lt;br /&gt;Если вы думаете, что ваш любимый «удобный» язык программирования или среда манипуляции фигурами на экране позволяет вам не думать о сложностях — вы находитесь в плену заблуждений. Язык или среда будет очень приблизительно и очень не точно делать свою работу. А если вам потребуется детальное описание процессов, более тонкая модель, вы неизбежно углубитесь, разберёте проблему до атомов и затратите на это много энергии.&lt;br /&gt;&lt;br /&gt;Кстати, вы не заметили, что новые модные языки заметно упростились? Go, Rust, Swift. Языки упростились но усложнились концепции, усложнилась описываемая реальность, а значит, что энергии для описания реальности потребуется очень много. </description><link>https://oleg.kalpa.ru/2018/06/blog-post.html</link><author>noreply@blogger.com (Oleg Shall)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-7314334844557298895</guid><pubDate>Mon, 28 May 2018 13:08:00 +0000</pubDate><atom:updated>2018-05-28T16:29:59.767+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Госмессенджер</category><category domain="http://www.blogger.com/atom/ns#">Клименко</category><title></title><description>&lt;div class=&quot;graf graf--p graf--leading&quot; id=&quot;2c64&quot; name=&quot;2c64&quot; style=&quot;line-height: 1.58; text-shadow: rgba(0, 0, 0, 0.2) 0.7px 0.7px 0px;&quot;&gt;Вот год назад был дикий хайп с Клименко во главе на тему российского мессенджера.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-YGFcK2L8n2g/WwwEIuRhmnI/AAAAAAAAds8/l18bH-3dCWg_-9tdV2rcOl7yctVXz1OpgCLcBGAs/s1600/Image_01.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;934&quot; data-original-width=&quot;1400&quot; height=&quot;424&quot; src=&quot;https://2.bp.blogspot.com/-YGFcK2L8n2g/WwwEIuRhmnI/AAAAAAAAds8/l18bH-3dCWg_-9tdV2rcOl7yctVXz1OpgCLcBGAs/s640/Image_01.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: left;&quot;&gt;Тогда я, при поддержке “Национальной ассоциации корпоративных директоров”, инициировал попытку обсуждать эту затею в рамках созданного Клименко оргкомитета. Была написана официальная бумага и передана в адрес советника президента. В самом деле, ассоциация штука серьезная, имеет право на законодательную инициативу. В ней живут разные очень компетентные люди. Ассоциация присутствует в 80% компаний с государственным участием. Почему бы нам не сказать “пару умных слов” по этому вопросу. Ответа не поступило. Как происходило обсуждение этого вопроса — не известно. Кому выдали денег — не ясно. Кто победил, за какие заслуги — один Клименко знает.&lt;/div&gt;&lt;br /&gt;Ну да Бог с ним, с ответом. Мы же в текущем моменте живем. Что сейчас? Богопротивный телеграм запрещают и активно закрывают. И вот мой вопрос!&lt;br /&gt;&lt;br /&gt;Где же обещанный наш, российский мессенджер? Чем он великолепен? Какие у него отличительные качества?&lt;/div&gt;</description><link>https://oleg.kalpa.ru/2018/05/blog-post_28.html</link><author>noreply@blogger.com (Oleg Shall)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://2.bp.blogspot.com/-YGFcK2L8n2g/WwwEIuRhmnI/AAAAAAAAds8/l18bH-3dCWg_-9tdV2rcOl7yctVXz1OpgCLcBGAs/s72-c/Image_01.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-6172538772715534514</guid><pubDate>Sun, 28 Jan 2018 10:51:00 +0000</pubDate><atom:updated>2018-05-21T16:05:56.444+03:00</atom:updated><title>О децентрализации</title><description>&lt;div class=&quot;graf graf--p graf-after--h3&quot; id=&quot;ca14&quot; name=&quot;ca14&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Как же  радостно наблюдать за бурными обсуждениями светлого децентрализованного  будущего. Вот расставим мы по всей “ивановской” майнинг-центры и,  натурально, все банки и нотариальные конторы немедленно исчезнут. Но  мысли о том, что и это уже было под солнцем не покидают.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;graf graf--p graf-after--h3&quot; id=&quot;ca14&quot; name=&quot;ca14&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;graf graf--p graf-after--p&quot; id=&quot;9644&quot; name=&quot;9644&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Каких-нибудь  жалких 20 лет назад мир почтовых систем был совершенно децентрализован.  Апофеоз децентрализации! На каждом малюсеньком предприятии в углу  пылился (и умирал раз в год) серверок, который гонял почту на  собственном домене. Правда когда серверок ветшал работа фирмы  останавливалась на пару часов (или дней) и под вопли директора в телефон  призывался приходящий админ. И конечно каждый приличный гик держал свой  сервер дома. Что имеем теперь? Несколько централизованных мировых  почтовых, очень даже контролируемых “сами знаете кем”, хабов.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;graf graf--p graf-after--p&quot; id=&quot;9644&quot; name=&quot;9644&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;graf graf--p graf-after--p&quot; id=&quot;8a96&quot; name=&quot;8a96&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Веб-сайты.  Ну конечно, как только появились сайты они начали плодиться у каждого  на фирмеах и в домашних подсобках. Что сейчас? Крупные централизованные  хост-площадки для сайтов-визиток. Да и нужны ли вообще эти самые сайты?  Все вроде уже закончили самовыражаться вычурными шрифтами, кислотными  обоями и анимированными снежинками. Для публикации фоток и цитат  мудрецов вполне достаточно ленты новостей фейсбука и вконтакта. Даже  narod.ru уже кажется не жив.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;graf graf--p graf-after--p&quot; id=&quot;207c&quot; name=&quot;207c&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Мессенджеры!  Конечно заря была централизованная. Icq. Кто же не помнит! Но тут же  взбунтовались техноанархисты и вспомнили о децентрализации. Свободу  попугаям! И придумали jabber/xmpp. Ну совершеннейшая же децентрализация.  И опять у каждого приличного гика в подсобке пылился собственный  серверок. Что в итоге? Совершеннейшая централизация с подробными  записями.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;graf graf--p graf-after--p&quot; id=&quot;5c4a&quot; name=&quot;5c4a&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;graf graf--p graf-after--p&quot; id=&quot;5c4a&quot; name=&quot;5c4a&quot;&gt;Если  хотите мы как-нибудь поговорим о природе этого явления. А сейчас просто  помолчим и проникнемся молодецким азартом блокчейн-децентрализаторов. И  это было…&lt;/div&gt;&lt;div class=&quot;graf graf--p graf-after--p&quot; id=&quot;0ab7&quot; name=&quot;0ab7&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;graf graf--p graf-after--p&quot; id=&quot;0ab7&quot; name=&quot;0ab7&quot;&gt;Как я воспринимаю историю с блокчейном.&lt;/div&gt;&lt;ol class=&quot;postList&quot;&gt;&lt;li class=&quot;graf graf--li graf-after--p&quot; id=&quot;7a2f&quot; name=&quot;7a2f&quot; style=&quot;text-align: justify;&quot;&gt;Это  конечно социальный и технологический эксперимент в ходе которого  отрабатываются сложности работы большого распределенного регистра,  алгоритмов консенсуса и, что много важней, создание социального феномена  и реакцию на него со стороны фирм, сообществ и отдельных лиц.&lt;/li&gt;&lt;li class=&quot;graf graf--li graf-after--li&quot; id=&quot;9911&quot; name=&quot;9911&quot; style=&quot;text-align: justify;&quot;&gt;Конечно  алгоритм, реализованный в bitcoin, совершенно избыточен. В реальной  практике построения регистра для нужд государства такие фокусы  совершенно не нужны.&lt;/li&gt;&lt;li class=&quot;graf graf--li graf-after--li&quot; id=&quot;68e1&quot; name=&quot;68e1&quot; style=&quot;text-align: justify;&quot;&gt;Для  государственных нужд будет построен регистр, работающий на ограниченном  числе резервирующих серверов и поддерживающий адекватный и быстрый  алгоритм консенсуса (к примеру RAFT). А разнообразные институты  гражданского контроля будут снаружи мониторить целостность цепи.&lt;/li&gt;&lt;li class=&quot;graf graf--li graf-after--li&quot; id=&quot;d2cb&quot; name=&quot;d2cb&quot; style=&quot;text-align: justify;&quot;&gt;И конечно, вы серьезно думаете, что у государства не найдется способов заставить всех перейти на нужный регистр?&lt;/li&gt;&lt;/ol&gt;&lt;div class=&quot;graf graf--p graf-after--li&quot; id=&quot;143c&quot; name=&quot;143c&quot;&gt;В итоге всем будет радостно узнать, что ходы каждого наконец будут записаны.&lt;/div&gt;&lt;div class=&quot;graf graf--p graf-after--li&quot; id=&quot;143c&quot; name=&quot;143c&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;graf graf--p graf-after--p graf--trailing&quot; id=&quot;e8b0&quot; name=&quot;e8b0&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Занятно  будет наблюдать как проявится осознание блокчейн-евангелистов, когда  они поймут, что их руками и их головами создается божественный регистр  всеобщих грехов.&lt;/div&gt;&lt;/div&gt;</description><link>https://oleg.kalpa.ru/2018/01/blog-post.html</link><author>noreply@blogger.com (Oleg Shall)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-1389072457930863797</guid><pubDate>Fri, 12 May 2017 06:34:00 +0000</pubDate><atom:updated>2018-07-12T18:40:47.025+03:00</atom:updated><title>Зажрались мы</title><description>&lt;br /&gt;&lt;br /&gt;Зажрались мы. Пора навести порядок! Сколько же можно? Такая террористическая опасность, а тут люди в мессенджерах общаются. Нет у них государственного мышления и осознания сложности момента.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ну и конечно производителей мессенджеров развелось. Вот я например.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Причем совершенно не вижу острой необходимости привязываться к номеру телефона. Как раз напротив, вижу дополнительное преимущество в том, чтобы зайти в свой аккаунт с другого устройства и спокойно и безопасно общаться и решать задачи.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ну да кому это интересно. Представитель Роскомнадзора Вадим Ампелонский лучше знает.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Если мессенджер не выполняет требование Роскомнадзора по регистрации в России или идентификации пользователей, то по решению суда он может быть заблокирован. За неисполнение требований законодательства на владельца мессенджера может быть наложен штраф: для физлиц от 3000 до 5000 рублей; для должностных лиц — от 30 тысяч до 50 тысяч рублей; на юридических лиц — от 800 тысяч до одного миллиона.&lt;br /&gt;&lt;br /&gt;В декабре 2016 г. руководитель Роскомнадзора Александр Жаров объяснял, зачем нужна привязка мессенджера к конкретному номеру абонента оператора связи. По словам руководителя Роскомнадзора, речь не идет о проникновении в личную переписку людей. Привязка к номеру нужна спецслужбам, чтобы идентифицировать человека, который в случае чрезвычайной ситуации или террористической атаки пользовался этим номером. «Пока мессенджеры не заключают ни с кем договоров, не платят никаких налогов и живут замечательно», — говорил Жаров. По его словам, после этого операторы «выстроят с мессенджерами товарно-денежные отношения и, таким образом, они опосредованно тоже внесут лепту в российскую экономику».&lt;br /&gt;&lt;div alt=&quot;0&quot; id=&quot;SL_balloon_obj&quot; style=&quot;display: block;&quot;&gt;&lt;div class=&quot;SL_ImTranslatorLogo&quot; id=&quot;SL_button&quot; style=&quot;background: rgba(0, 0, 0, 0) url(&amp;quot;moz-extension://c2265124-57b5-4a4b-913b-ab7d05899308/content/img/util/imtranslator-s.png&amp;quot;) repeat scroll 0% 0%; display: none; opacity: 1;&quot;&gt;&lt;/div&gt;&lt;div id=&quot;SL_shadow_translation_result2&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;div id=&quot;SL_shadow_translator&quot; style=&quot;display: none;&quot;&gt;&lt;div id=&quot;SL_planshet&quot;&gt;&lt;div id=&quot;SL_arrow_up&quot; style=&quot;background: rgba(0, 0, 0, 0) url(&amp;quot;moz-extension://c2265124-57b5-4a4b-913b-ab7d05899308/content/img/util/up.png&amp;quot;) repeat scroll 0% 0%;&quot;&gt;&lt;/div&gt;&lt;div id=&quot;SL_Bproviders&quot;&gt;&lt;div class=&quot;SL_BL_LABLE_ON&quot; id=&quot;SL_P0&quot; title=&quot;Google&quot;&gt;G&lt;/div&gt;&lt;div class=&quot;SL_BL_LABLE_ON&quot; id=&quot;SL_P1&quot; title=&quot;Microsoft&quot;&gt;M&lt;/div&gt;&lt;div class=&quot;SL_BL_LABLE_ON&quot; id=&quot;SL_P2&quot; title=&quot;Translator&quot;&gt;T&lt;/div&gt;&lt;/div&gt;&lt;div id=&quot;SL_alert_bbl&quot; style=&quot;display: none;&quot;&gt;&lt;div id=&quot;SLHKclose&quot; style=&quot;background: rgba(0, 0, 0, 0) url(&amp;quot;moz-extension://c2265124-57b5-4a4b-913b-ab7d05899308/content/img/util/delete.png&amp;quot;) repeat scroll 0% 0%;&quot;&gt;&lt;/div&gt;&lt;div id=&quot;SL_alert_cont&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id=&quot;SL_TB&quot;&gt;&lt;table cellspacing=&quot;1&quot; id=&quot;SL_tables&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;right&quot; class=&quot;SL_td&quot; width=&quot;10%&quot;&gt;&lt;input id=&quot;SL_locer&quot; title=&quot;Lock-in language&quot; type=&quot;checkbox&quot; /&gt;&lt;/td&gt;&lt;td align=&quot;left&quot; class=&quot;SL_td&quot; width=&quot;20%&quot;&gt;&lt;select id=&quot;SL_lng_from&quot; style=&quot;background: rgb(255, 255, 255) url(&amp;quot;moz-extension://c2265124-57b5-4a4b-913b-ab7d05899308/content/img/util/select.png&amp;quot;) no-repeat scroll 100% 0px;&quot;&gt;&lt;option value=&quot;auto&quot;&gt;Detect language&lt;/option&gt;&lt;option value=&quot;af&quot;&gt;Afrikaans&lt;/option&gt;&lt;option value=&quot;sq&quot;&gt;Albanian&lt;/option&gt;&lt;option value=&quot;ar&quot;&gt;Arabic&lt;/option&gt;&lt;option value=&quot;hy&quot;&gt;Armenian&lt;/option&gt;&lt;option value=&quot;az&quot;&gt;Azerbaijani&lt;/option&gt;&lt;option value=&quot;eu&quot;&gt;Basque&lt;/option&gt;&lt;option value=&quot;be&quot;&gt;Belarusian&lt;/option&gt;&lt;option value=&quot;bn&quot;&gt;Bengali&lt;/option&gt;&lt;option value=&quot;bs&quot;&gt;Bosnian&lt;/option&gt;&lt;option value=&quot;bg&quot;&gt;Bulgarian&lt;/option&gt;&lt;option value=&quot;ca&quot;&gt;Catalan&lt;/option&gt;&lt;option value=&quot;ceb&quot;&gt;Cebuano&lt;/option&gt;&lt;option value=&quot;ny&quot;&gt;Chichewa&lt;/option&gt;&lt;option value=&quot;zh-CN&quot;&gt;Chinese (Simplified)&lt;/option&gt;&lt;option value=&quot;zh-TW&quot;&gt;Chinese (Traditional)&lt;/option&gt;&lt;option value=&quot;hr&quot;&gt;Croatian&lt;/option&gt;&lt;option value=&quot;cs&quot;&gt;Czech&lt;/option&gt;&lt;option value=&quot;da&quot;&gt;Danish&lt;/option&gt;&lt;option value=&quot;nl&quot;&gt;Dutch&lt;/option&gt;&lt;option value=&quot;en&quot;&gt;English&lt;/option&gt;&lt;option value=&quot;eo&quot;&gt;Esperanto&lt;/option&gt;&lt;option value=&quot;et&quot;&gt;Estonian&lt;/option&gt;&lt;option value=&quot;tl&quot;&gt;Filipino&lt;/option&gt;&lt;option value=&quot;fi&quot;&gt;Finnish&lt;/option&gt;&lt;option value=&quot;fr&quot;&gt;French&lt;/option&gt;&lt;option value=&quot;gl&quot;&gt;Galician&lt;/option&gt;&lt;option value=&quot;ka&quot;&gt;Georgian&lt;/option&gt;&lt;option value=&quot;de&quot;&gt;German&lt;/option&gt;&lt;option value=&quot;el&quot;&gt;Greek&lt;/option&gt;&lt;option value=&quot;gu&quot;&gt;Gujarati&lt;/option&gt;&lt;option value=&quot;ht&quot;&gt;Haitian Creole&lt;/option&gt;&lt;option value=&quot;ha&quot;&gt;Hausa&lt;/option&gt;&lt;option value=&quot;iw&quot;&gt;Hebrew&lt;/option&gt;&lt;option value=&quot;hi&quot;&gt;Hindi&lt;/option&gt;&lt;option value=&quot;hmn&quot;&gt;Hmong&lt;/option&gt;&lt;option value=&quot;hu&quot;&gt;Hungarian&lt;/option&gt;&lt;option value=&quot;is&quot;&gt;Icelandic&lt;/option&gt;&lt;option value=&quot;ig&quot;&gt;Igbo&lt;/option&gt;&lt;option value=&quot;id&quot;&gt;Indonesian&lt;/option&gt;&lt;option value=&quot;ga&quot;&gt;Irish&lt;/option&gt;&lt;option value=&quot;it&quot;&gt;Italian&lt;/option&gt;&lt;option value=&quot;ja&quot;&gt;Japanese&lt;/option&gt;&lt;option value=&quot;jw&quot;&gt;Javanese&lt;/option&gt;&lt;option value=&quot;kn&quot;&gt;Kannada&lt;/option&gt;&lt;option value=&quot;kk&quot;&gt;Kazakh&lt;/option&gt;&lt;option value=&quot;km&quot;&gt;Khmer&lt;/option&gt;&lt;option value=&quot;ko&quot;&gt;Korean&lt;/option&gt;&lt;option value=&quot;lo&quot;&gt;Lao&lt;/option&gt;&lt;option value=&quot;la&quot;&gt;Latin&lt;/option&gt;&lt;option value=&quot;lv&quot;&gt;Latvian&lt;/option&gt;&lt;option value=&quot;lt&quot;&gt;Lithuanian&lt;/option&gt;&lt;option value=&quot;mk&quot;&gt;Macedonian&lt;/option&gt;&lt;option value=&quot;mg&quot;&gt;Malagasy&lt;/option&gt;&lt;option value=&quot;ms&quot;&gt;Malay&lt;/option&gt;&lt;option value=&quot;ml&quot;&gt;Malayalam&lt;/option&gt;&lt;option value=&quot;mt&quot;&gt;Maltese&lt;/option&gt;&lt;option value=&quot;mi&quot;&gt;Maori&lt;/option&gt;&lt;option value=&quot;mr&quot;&gt;Marathi&lt;/option&gt;&lt;option value=&quot;mn&quot;&gt;Mongolian&lt;/option&gt;&lt;option value=&quot;my&quot;&gt;Myanmar (Burmese)&lt;/option&gt;&lt;option value=&quot;ne&quot;&gt;Nepali&lt;/option&gt;&lt;option value=&quot;no&quot;&gt;Norwegian&lt;/option&gt;&lt;option value=&quot;fa&quot;&gt;Persian&lt;/option&gt;&lt;option value=&quot;pl&quot;&gt;Polish&lt;/option&gt;&lt;option value=&quot;pt&quot;&gt;Portuguese&lt;/option&gt;&lt;option value=&quot;pa&quot;&gt;Punjabi&lt;/option&gt;&lt;option value=&quot;ro&quot;&gt;Romanian&lt;/option&gt;&lt;option value=&quot;ru&quot;&gt;Russian&lt;/option&gt;&lt;option value=&quot;sr&quot;&gt;Serbian&lt;/option&gt;&lt;option value=&quot;st&quot;&gt;Sesotho&lt;/option&gt;&lt;option value=&quot;si&quot;&gt;Sinhala&lt;/option&gt;&lt;option value=&quot;sk&quot;&gt;Slovak&lt;/option&gt;&lt;option value=&quot;sl&quot;&gt;Slovenian&lt;/option&gt;&lt;option value=&quot;so&quot;&gt;Somali&lt;/option&gt;&lt;option value=&quot;es&quot;&gt;Spanish&lt;/option&gt;&lt;option value=&quot;su&quot;&gt;Sundanese&lt;/option&gt;&lt;option value=&quot;sw&quot;&gt;Swahili&lt;/option&gt;&lt;option value=&quot;sv&quot;&gt;Swedish&lt;/option&gt;&lt;option value=&quot;tg&quot;&gt;Tajik&lt;/option&gt;&lt;option value=&quot;ta&quot;&gt;Tamil&lt;/option&gt;&lt;option value=&quot;te&quot;&gt;Telugu&lt;/option&gt;&lt;option value=&quot;th&quot;&gt;Thai&lt;/option&gt;&lt;option value=&quot;tr&quot;&gt;Turkish&lt;/option&gt;&lt;option value=&quot;uk&quot;&gt;Ukrainian&lt;/option&gt;&lt;option value=&quot;ur&quot;&gt;Urdu&lt;/option&gt;&lt;option value=&quot;uz&quot;&gt;Uzbek&lt;/option&gt;&lt;option value=&quot;vi&quot;&gt;Vietnamese&lt;/option&gt;&lt;option value=&quot;cy&quot;&gt;Welsh&lt;/option&gt;&lt;option value=&quot;yi&quot;&gt;Yiddish&lt;/option&gt;&lt;option value=&quot;yo&quot;&gt;Yoruba&lt;/option&gt;&lt;option value=&quot;zu&quot;&gt;Zulu&lt;/option&gt;&lt;/select&gt;&lt;/td&gt;&lt;td align=&quot;center&quot; class=&quot;SL_td&quot; width=&quot;3&quot;&gt;&lt;div id=&quot;SL_switch_b&quot; style=&quot;background: rgba(0, 0, 0, 0) url(&amp;quot;moz-extension://c2265124-57b5-4a4b-913b-ab7d05899308/content/img/util/switchb.png&amp;quot;) repeat scroll 0% 0%;&quot; title=&quot;Switch languages&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td align=&quot;left&quot; class=&quot;SL_td&quot; width=&quot;20%&quot;&gt;&lt;select id=&quot;SL_lng_to&quot; style=&quot;background: rgb(255, 255, 255) url(&amp;quot;moz-extension://c2265124-57b5-4a4b-913b-ab7d05899308/content/img/util/select.png&amp;quot;) no-repeat scroll 100% 0px;&quot;&gt;&lt;option value=&quot;af&quot;&gt;Afrikaans&lt;/option&gt;&lt;option value=&quot;sq&quot;&gt;Albanian&lt;/option&gt;&lt;option value=&quot;ar&quot;&gt;Arabic&lt;/option&gt;&lt;option value=&quot;hy&quot;&gt;Armenian&lt;/option&gt;&lt;option value=&quot;az&quot;&gt;Azerbaijani&lt;/option&gt;&lt;option value=&quot;eu&quot;&gt;Basque&lt;/option&gt;&lt;option value=&quot;be&quot;&gt;Belarusian&lt;/option&gt;&lt;option value=&quot;bn&quot;&gt;Bengali&lt;/option&gt;&lt;option value=&quot;bs&quot;&gt;Bosnian&lt;/option&gt;&lt;option value=&quot;bg&quot;&gt;Bulgarian&lt;/option&gt;&lt;option value=&quot;ca&quot;&gt;Catalan&lt;/option&gt;&lt;option value=&quot;ceb&quot;&gt;Cebuano&lt;/option&gt;&lt;option value=&quot;ny&quot;&gt;Chichewa&lt;/option&gt;&lt;option value=&quot;zh-CN&quot;&gt;Chinese (Simplified)&lt;/option&gt;&lt;option value=&quot;zh-TW&quot;&gt;Chinese (Traditional)&lt;/option&gt;&lt;option value=&quot;hr&quot;&gt;Croatian&lt;/option&gt;&lt;option value=&quot;cs&quot;&gt;Czech&lt;/option&gt;&lt;option value=&quot;da&quot;&gt;Danish&lt;/option&gt;&lt;option value=&quot;nl&quot;&gt;Dutch&lt;/option&gt;&lt;option selected=&quot;selected&quot; value=&quot;en&quot;&gt;English&lt;/option&gt;&lt;option value=&quot;eo&quot;&gt;Esperanto&lt;/option&gt;&lt;option value=&quot;et&quot;&gt;Estonian&lt;/option&gt;&lt;option value=&quot;tl&quot;&gt;Filipino&lt;/option&gt;&lt;option value=&quot;fi&quot;&gt;Finnish&lt;/option&gt;&lt;option value=&quot;fr&quot;&gt;French&lt;/option&gt;&lt;option value=&quot;gl&quot;&gt;Galician&lt;/option&gt;&lt;option value=&quot;ka&quot;&gt;Georgian&lt;/option&gt;&lt;option value=&quot;de&quot;&gt;German&lt;/option&gt;&lt;option value=&quot;el&quot;&gt;Greek&lt;/option&gt;&lt;option value=&quot;gu&quot;&gt;Gujarati&lt;/option&gt;&lt;option value=&quot;ht&quot;&gt;Haitian Creole&lt;/option&gt;&lt;option value=&quot;ha&quot;&gt;Hausa&lt;/option&gt;&lt;option value=&quot;iw&quot;&gt;Hebrew&lt;/option&gt;&lt;option value=&quot;hi&quot;&gt;Hindi&lt;/option&gt;&lt;option value=&quot;hmn&quot;&gt;Hmong&lt;/option&gt;&lt;option value=&quot;hu&quot;&gt;Hungarian&lt;/option&gt;&lt;option value=&quot;is&quot;&gt;Icelandic&lt;/option&gt;&lt;option value=&quot;ig&quot;&gt;Igbo&lt;/option&gt;&lt;option value=&quot;id&quot;&gt;Indonesian&lt;/option&gt;&lt;option value=&quot;ga&quot;&gt;Irish&lt;/option&gt;&lt;option value=&quot;it&quot;&gt;Italian&lt;/option&gt;&lt;option value=&quot;ja&quot;&gt;Japanese&lt;/option&gt;&lt;option value=&quot;jw&quot;&gt;Javanese&lt;/option&gt;&lt;option value=&quot;kn&quot;&gt;Kannada&lt;/option&gt;&lt;option value=&quot;kk&quot;&gt;Kazakh&lt;/option&gt;&lt;option value=&quot;km&quot;&gt;Khmer&lt;/option&gt;&lt;option value=&quot;ko&quot;&gt;Korean&lt;/option&gt;&lt;option value=&quot;lo&quot;&gt;Lao&lt;/option&gt;&lt;option value=&quot;la&quot;&gt;Latin&lt;/option&gt;&lt;option value=&quot;lv&quot;&gt;Latvian&lt;/option&gt;&lt;option value=&quot;lt&quot;&gt;Lithuanian&lt;/option&gt;&lt;option value=&quot;mk&quot;&gt;Macedonian&lt;/option&gt;&lt;option value=&quot;mg&quot;&gt;Malagasy&lt;/option&gt;&lt;option value=&quot;ms&quot;&gt;Malay&lt;/option&gt;&lt;option value=&quot;ml&quot;&gt;Malayalam&lt;/option&gt;&lt;option value=&quot;mt&quot;&gt;Maltese&lt;/option&gt;&lt;option value=&quot;mi&quot;&gt;Maori&lt;/option&gt;&lt;option value=&quot;mr&quot;&gt;Marathi&lt;/option&gt;&lt;option value=&quot;mn&quot;&gt;Mongolian&lt;/option&gt;&lt;option value=&quot;my&quot;&gt;Myanmar (Burmese)&lt;/option&gt;&lt;option value=&quot;ne&quot;&gt;Nepali&lt;/option&gt;&lt;option value=&quot;no&quot;&gt;Norwegian&lt;/option&gt;&lt;option value=&quot;fa&quot;&gt;Persian&lt;/option&gt;&lt;option value=&quot;pl&quot;&gt;Polish&lt;/option&gt;&lt;option value=&quot;pt&quot;&gt;Portuguese&lt;/option&gt;&lt;option value=&quot;pa&quot;&gt;Punjabi&lt;/option&gt;&lt;option value=&quot;ro&quot;&gt;Romanian&lt;/option&gt;&lt;option value=&quot;ru&quot;&gt;Russian&lt;/option&gt;&lt;option value=&quot;sr&quot;&gt;Serbian&lt;/option&gt;&lt;option value=&quot;st&quot;&gt;Sesotho&lt;/option&gt;&lt;option value=&quot;si&quot;&gt;Sinhala&lt;/option&gt;&lt;option value=&quot;sk&quot;&gt;Slovak&lt;/option&gt;&lt;option value=&quot;sl&quot;&gt;Slovenian&lt;/option&gt;&lt;option value=&quot;so&quot;&gt;Somali&lt;/option&gt;&lt;option value=&quot;es&quot;&gt;Spanish&lt;/option&gt;&lt;option value=&quot;su&quot;&gt;Sundanese&lt;/option&gt;&lt;option value=&quot;sw&quot;&gt;Swahili&lt;/option&gt;&lt;option value=&quot;sv&quot;&gt;Swedish&lt;/option&gt;&lt;option value=&quot;tg&quot;&gt;Tajik&lt;/option&gt;&lt;option value=&quot;ta&quot;&gt;Tamil&lt;/option&gt;&lt;option value=&quot;te&quot;&gt;Telugu&lt;/option&gt;&lt;option value=&quot;th&quot;&gt;Thai&lt;/option&gt;&lt;option value=&quot;tr&quot;&gt;Turkish&lt;/option&gt;&lt;option value=&quot;uk&quot;&gt;Ukrainian&lt;/option&gt;&lt;option value=&quot;ur&quot;&gt;Urdu&lt;/option&gt;&lt;option value=&quot;uz&quot;&gt;Uzbek&lt;/option&gt;&lt;option value=&quot;vi&quot;&gt;Vietnamese&lt;/option&gt;&lt;option value=&quot;cy&quot;&gt;Welsh&lt;/option&gt;&lt;option value=&quot;yi&quot;&gt;Yiddish&lt;/option&gt;&lt;option value=&quot;yo&quot;&gt;Yoruba&lt;/option&gt;&lt;option value=&quot;zu&quot;&gt;Zulu&lt;/option&gt;&lt;/select&gt;&lt;/td&gt;&lt;td align=&quot;center&quot; class=&quot;SL_td&quot; width=&quot;8%&quot;&gt;&lt;div id=&quot;SL_TTS_voice&quot; style=&quot;background: rgba(0, 0, 0, 0) url(&amp;quot;moz-extension://c2265124-57b5-4a4b-913b-ab7d05899308/content/img/util/ttsvoice.png&amp;quot;) repeat scroll 0% 0%;&quot; title=&quot;Listen to the translation&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td align=&quot;center&quot; class=&quot;SL_td&quot; width=&quot;8%&quot;&gt;&lt;div class=&quot;SL_copy&quot; id=&quot;SL_copy&quot; style=&quot;background: rgba(0, 0, 0, 0) url(&amp;quot;moz-extension://c2265124-57b5-4a4b-913b-ab7d05899308/content/img/util/copy.png&amp;quot;) repeat scroll 0% 0%;&quot; title=&quot;Copy translation&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td align=&quot;center&quot; class=&quot;SL_td&quot; width=&quot;8%&quot;&gt;&lt;div id=&quot;SL_bbl_font_patch&quot;&gt;&lt;/div&gt;&lt;div class=&quot;SL_bbl_font&quot; id=&quot;SL_bbl_font&quot; style=&quot;background: rgba(0, 0, 0, 0) url(&amp;quot;moz-extension://c2265124-57b5-4a4b-913b-ab7d05899308/content/img/util/font.png&amp;quot;) repeat scroll 0% 0%;&quot; title=&quot;Font size&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td align=&quot;center&quot; class=&quot;SL_td&quot; width=&quot;8%&quot;&gt;&lt;div id=&quot;SL_bbl_help&quot; style=&quot;background: rgba(0, 0, 0, 0) url(&amp;quot;moz-extension://c2265124-57b5-4a4b-913b-ab7d05899308/content/img/util/bhelp.png&amp;quot;) repeat scroll 0% 0%;&quot; title=&quot;Help&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td align=&quot;right&quot; class=&quot;SL_td&quot; width=&quot;15%&quot;&gt;&lt;div class=&quot;SL_pin_off&quot; id=&quot;SL_pin&quot; style=&quot;background: rgba(0, 0, 0, 0) url(&amp;quot;moz-extension://c2265124-57b5-4a4b-913b-ab7d05899308/content/img/util/pin-on.png&amp;quot;) repeat scroll 0% 0%;&quot; title=&quot;Pin pop-up bubble&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id=&quot;SL_shadow_translation_result&quot; style=&quot;visibility: visible;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;SL_loading&quot; id=&quot;SL_loading&quot; style=&quot;background: rgba(0, 0, 0, 0) url(&amp;quot;moz-extension://c2265124-57b5-4a4b-913b-ab7d05899308/content/img/util/loading.gif&amp;quot;) repeat scroll 0% 0%;&quot;&gt;&lt;/div&gt;&lt;div id=&quot;SL_player2&quot;&gt;&lt;/div&gt;&lt;div id=&quot;SL_alert100&quot;&gt;Text-to-speech function is limited to 200 characters&lt;/div&gt;&lt;div id=&quot;SL_Balloon_options&quot; style=&quot;background: rgb(255, 255, 255) url(&amp;quot;moz-extension://c2265124-57b5-4a4b-913b-ab7d05899308/content/img/util/bg3.png&amp;quot;) repeat scroll 0% 0%;&quot;&gt;&lt;div id=&quot;SL_arrow_down&quot; style=&quot;background: rgba(0, 0, 0, 0) url(&amp;quot;moz-extension://c2265124-57b5-4a4b-913b-ab7d05899308/content/img/util/down.png&amp;quot;) repeat scroll 0% 0%;&quot;&gt;&lt;/div&gt;&lt;table id=&quot;SL_tbl_opt&quot; style=&quot;width: 100%px;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; width=&quot;5%&quot;&gt;&lt;input checked=&quot;1&quot; id=&quot;SL_BBL_locer&quot; title=&quot;Show Translator&#39;s button 3 second(s)&quot; type=&quot;checkbox&quot; /&gt;&lt;/td&gt;&lt;td align=&quot;left&quot; width=&quot;5%&quot;&gt;&lt;div id=&quot;SL_BBL_IMG&quot; style=&quot;background: rgba(0, 0, 0, 0) url(&amp;quot;moz-extension://c2265124-57b5-4a4b-913b-ab7d05899308/content/img/util/bbl-logo.png&amp;quot;) repeat scroll 0% 0%;&quot; title=&quot;Show Translator&#39;s button 3 second(s)&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td align=&quot;center&quot; width=&quot;70%&quot;&gt;&lt;a class=&quot;SL_options&quot; href=&quot;moz-extension://c2265124-57b5-4a4b-913b-ab7d05899308/content/html/options/options.html?bbl&quot; target=&quot;_blank&quot; title=&quot;Show options&quot;&gt;Options&lt;/a&gt; : &lt;a class=&quot;SL_options&quot; href=&quot;moz-extension://c2265124-57b5-4a4b-913b-ab7d05899308/content/html/options/options.html?hist&quot; target=&quot;_blank&quot; title=&quot;Translation History&quot;&gt;History&lt;/a&gt; : &lt;a class=&quot;SL_options&quot; href=&quot;moz-extension://c2265124-57b5-4a4b-913b-ab7d05899308/content/html/options/options.html?feed&quot; target=&quot;_blank&quot; title=&quot;ImTranslator Feedback&quot;&gt;Feedback&lt;/a&gt; : &lt;a class=&quot;SL_options&quot; href=&quot;https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;amp;hosted_button_id=GD9D8CPW8HFA2&quot; target=&quot;_blank&quot; title=&quot;Make a small contribution&quot;&gt;Donate&lt;/a&gt;&lt;/td&gt;&lt;td align=&quot;right&quot; width=&quot;15%&quot;&gt;&lt;span id=&quot;SL_Balloon_Close&quot; title=&quot;Close&quot;&gt;Close&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description><link>https://oleg.kalpa.ru/2017/05/blog-post.html</link><author>noreply@blogger.com (Oleg Shall)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-3304889629054473321</guid><pubDate>Wed, 10 May 2017 17:04:00 +0000</pubDate><atom:updated>2017-05-10T20:13:15.849+03:00</atom:updated><title>Dead Moroz</title><description>Некоторое время назад позвонил мой друг. Он занимался переговорным процессом и налаживанием отношений с инвесторами. Мой друг - человек довольно влиятельный, с репутацией благородного, честного и добропорядочного гражданина, радеющего за судьбу нашей страны и располагающий внушительными связями в деловой среде. Его, как и меня, трудно заподозрить в стартаповском фетишизме. К счастью мы с ним уже вошли в тот возраст, когда молодецкая дурь ушла, а старческий маразм еще далеко. Меня не интересует стартап как процесс, инвестиции как способ повышения чувства собственной важности и &quot;дутый рост&quot; во имя оценки компании. Меня интересует выпуск продукта, его жизненный цикл и бизнес. Такая вот старомодная позиция.&lt;br /&gt;&lt;br /&gt;Он принес мне печальные новости. Ни одна из его, вполне конструктивных, переговорных линий не принесла ожидаемого результата. Несмотря на явный интерес к проекту инвестор сохраняет осторожность. Я начинаю разделять точку зрения некоторых наблюдателей о том, что наши отечественные инвесторы более походят на Деда Мороза. Эдакий мифологический персонаж о котором все говорят, некоторые даже утверждают что его видели и пишут об этом сказочные книги, но существует ли он в реальности? Большой вопрос.&lt;br /&gt;&lt;br /&gt;Мы с нашими инициативами постучали в другие двери. Конкурс &quot;Generation-S&quot; отмел нас на старте. ФРИИ пригласил в предакселератор на весьма (с их точки зрения) привлекательных условиях. Они дают 2 миллиона и 970 (как бы не ошибиться) забирают как оплату за курс по продвижению проекта и его упаковки для повышения инвестиционной привлекательности. За это просят смехотворные 15% в бизнесе. (разумеется в случае успеха). А ведь это только начало. А ну как инвестор подтянется. Смущает меня такой деловой подход.&lt;br /&gt;&lt;br /&gt;А ведь разговор идет о попытке предоставить множеству бизнесов, магазинчиков и предпринимателей к конечному пользователю в его телефоне. И сделать это максимально комфортным образом через одно маленькое приложение. И дать каждой фирме создать &quot;свое приложение&quot; в этом мире.&lt;br /&gt;&lt;br /&gt;Ну что же. Значит не судьба. Буду двигаться своим ходом. Маленькими шажочками, копеечка к копеечке. А конкуренты на этом пути у меня огого какие. Придется интенсивней раскручивать пращу и метить точней.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;</description><link>https://oleg.kalpa.ru/2017/05/dead-moroz.html</link><author>noreply@blogger.com (Oleg Shall)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-8689172758215296117</guid><pubDate>Tue, 14 Mar 2017 13:09:00 +0000</pubDate><atom:updated>2017-09-18T18:46:24.588+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">бпла</category><category domain="http://www.blogger.com/atom/ns#">дроны</category><category domain="http://www.blogger.com/atom/ns#">сельское хозяйство</category><title>Куда бы дроны приткнуть?</title><description>Есть у меня весьма приятные знакомые, которым очень хочется помочь и добрым советом и деятельным участием. Они занимаются попытками внедрить в наш простой российский обиход беспилотные летательные аппараты, известные в народе как “БПЛА”.&lt;br /&gt;&lt;br /&gt;Многие из нас отцы и рады были рождению сыновей, потому как хочется же в вертолетики поиграть. Все купили, все поиграли. Курс и фарватер, проложенный АСИ на пути технической модернизации нашей богохранимой державы, предполагает использование оных в деле народного хозяйства. На примере наших домашних вертолетиков мы знаем, что летают они мало, заряжаются долго, многих циклов перезарядки дешевые китайские батареи не выдерживают (а своих-то вроде и нет). А куда деваться? На дворе прогресс и трансгуманизм. Вот и создаются на Руси-матушке различные предприятия для этих самых БПЛА. Естественно, с опаской взирая на успехи американских гигинтов, создаются и кластеры объединяющие это все в едином народно-хозяйственном порыве. Все же тоже хотят возить пиццу и пирожки в городе дронами.&lt;br /&gt;&lt;br /&gt;Но слабо это, слабо! Нужен размах! Ну какая пицца? Давайте думать как внедрять новые технологии на тучных нивах Ставропольского края. Сели, думаем. Вроде как на бумаге есть дроны с грузоподъемностью до 100 кг., но сколько они летают не очень ясно, сколько заряжаются... Вопросы, вопросы…&lt;br /&gt;&lt;br /&gt;Вроде как хорошо бы учинить не аккумуляторные БПЛА, но с ДВС, но не ясно кто такими аппаратами занимается. Другой вопрос насколько они автономны? В смысле беспилотны. В смысле способны без участия человека выполнять какие-то полезные в деловой жизни операции.&lt;br /&gt;&lt;br /&gt;Конечно надо предложить “товар лицом” и показать аграрию с натруженными руками практическую пользу от внедрения столь высоких и даже заоблачных технологий в практическую деревенскую жизнь. Сели думать. Ну да, сейчас они могут полетать, могут сфотать где бараны съели всю траву а где еще нет. Могу посмотреть где поспела культура и не пора ли ее собирать, могут порадовать деревенских детишек директора колхоза. Но побежит ли крестьянин, сверкая мозолистыми пятками, покупать такое чудо?&lt;br /&gt;&lt;br /&gt;А вот если бы дрон смог сам переносить из коровника на склад бидоны с молоком. Хотя бы за пару километров. Тогда да. Экономический эффект налицо. Ну или дрон смог бы сам пасти овец перегоняя их на тучные склоны, или сам стоги соломы с поля в силосную яму сваливать. Или хотя бы органический кизяк собирать. Причем сам! Без пульта!&lt;br /&gt;&lt;br /&gt;И вот тут мой технический мозг понимает, что и энергоресурсов таких у батарейного дрона нет и надо делать большие аппараты. А начинка из Искусственного Интеллекта еще должна научиться кизяк распознавать.&lt;br /&gt;&lt;br /&gt;Короче. Дорожная карта АСИ — дело конечно хорошее, но между “кропотливой работой” над презентационным слайдом для форсайт-конференций и софтом для распознавания и транспортировки кизяка — дистанция огромна. И ее все равно надо преодолевать ученым и инженерам, чтобы кулак- кровопийца смог экономически эффективно заменить дюжину батраков на красивый дрон с блестящими боками и пропеллерами и заставить его собирать кизяк.</description><link>https://oleg.kalpa.ru/2017/03/blog-post_87.html</link><author>noreply@blogger.com (Oleg Shall)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-2755461614878581703</guid><pubDate>Tue, 14 Mar 2017 13:09:00 +0000</pubDate><atom:updated>2017-06-24T10:38:23.902+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">аси</category><category domain="http://www.blogger.com/atom/ns#">форсайт</category><title>Удивительные дела.</title><description>Удивительные дела творятся в нашем государстве.&lt;br /&gt;&lt;br /&gt;На фоне обилия людей снующих, организующих самые разнообразные процессы, показывающих друг другу фигуры на презентациях и собирающих разнообразные конференции, возможность делать реальные дела исчезающе мала.&lt;br /&gt;&lt;br /&gt;Недавно имел удовольствие присутствовать на собрании людей, собирающихся сделать очередной “форсайт-кэмп”. Я человек прямой и сразу же задал вопрос о цели этого мероприятия. (А на него планируется где-то из государственных и региональных бюджетов добыть изрядную сумму денег). Ну вот зачем в очередной раз собирать людей? Будет ли там возможность взаимодействовать с реальными инвесторами? Молчание. Для кого собирается этот очередной форум? Чтобы опять помусолить “дорожные карты” АСИ, с наслаждением и придыханием воспроизвести набор загадочных слов, ощутить свою причастность к делу технического прогресса, послушать “визионеров”, которые готовят свои доклады по итогу просмотра канала Discovery-Science.&lt;br /&gt;&lt;br /&gt;Движуха ради движухи. Конференция ради конференции. Сколько уже их было? Сколько еще будет? Проведем еще одну!&lt;br /&gt;&lt;br /&gt;Ах да! Надо провести бизнес-тренинги и научить молодежь “упаковывать проекты”.&lt;br /&gt;&lt;br /&gt;Да Бог же с вами!</description><link>https://oleg.kalpa.ru/2017/03/blog-post_14.html</link><author>noreply@blogger.com (Oleg Shall)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-7726850886540409416</guid><pubDate>Fri, 20 Jan 2017 08:17:00 +0000</pubDate><atom:updated>2018-05-21T16:00:53.343+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Kalpa</category><category domain="http://www.blogger.com/atom/ns#">статьи</category><title>Сторителлинг</title><description>Рассказывал одному из переговорщиков суть моего проекта. Ну вот просто так, по шагам.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;И придумали люди веб-страницы и стали они множиться под солнцем. И каждый желал себе не волов, но страниц красивых с анимацией и вертикальными параллаксами. И приумножились они и стало их как песка морского... :)&lt;/li&gt;&lt;li&gt;Чтобы в них не потеряться люди придумали поисковые системы. Теперь все зависит от положения в поисковом запросе.&lt;/li&gt;&lt;li&gt;И придумали люди мобильные платформы. И вот тут-то все недостатки веб-решений всплыли и стали выпуклыми. Да насколько, что люди предпочитают пользоваться специально написанными для телефонов и планшетов программами.&amp;nbsp;&lt;/li&gt;&lt;li&gt;И вот опять все стало повторяться. (Ибо нет ничего нового под солнцем.) Каждый магазинчик и каждая лавчонка, не говоря уже о крупных предприятиях, захотели и себе написать приложения. И будет их скоро как песка морского.&lt;/li&gt;&lt;li&gt;Но мы же не можем в свои телефоны поставить миллионы приложений!&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Опять встал вопрос о передаче удаленно исполняемых приложений на сторону клиента. Об этом думают все и всяк на свой лад.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Google вот внедряет концепцию Instant Application. Но, как он сам говорит, это (фактически) стримминг приложений, терминальное решение. Оно требует серьезного и стабильного канала связи. Но дело даже не в этом. Дело в том, что хостить графические приложения на стороне сервера для терминальной трансляции клиенту - очень дорогое и совершенно непродуктивное занятие.&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;А вот мы, в рамках проекта Kalpa, придумали срединное решение. Оно позволит:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Передавать интерфейс удаленного приложения максимально компактно,&amp;nbsp;&lt;/li&gt;&lt;li&gt;Графика создается на стороне клиента&lt;/li&gt;&lt;li&gt;Сервер может обрабатывать на порядки больше сессий нежели в терминальном режиме.&amp;nbsp;&lt;/li&gt;&lt;li&gt;А программу писать как простую десктопную&lt;/li&gt;&lt;li&gt;И безопасно конечно. Потому что у клиента ничего не остается. Можно с любовницей переписываться. Жена не узнает.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;И создать можно очень интересное глобальное решение. Интернет приложений.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Боты - жалкие шутки. Реальные удобные интерфейсы непосредственно в коммуникаторе или карте - выбор нового времени.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Вот такая история.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;</description><link>https://oleg.kalpa.ru/2017/01/blog-post_20.html</link><author>noreply@blogger.com (Oleg Shall)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-5297498299699483673</guid><pubDate>Thu, 19 Jan 2017 17:52:00 +0000</pubDate><atom:updated>2017-05-10T18:31:05.292+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Kalpa</category><title>К вопросу о кросплатформенности в деле создания мобильных приложений.</title><description>Интересно отметить, что разработчики используют нативные средства создания мобильных приложений. Для платформы Android использует Java, для ios -- Objective-C, для MsPhone -- C#. А для десктопов пишут вообще бог знает на чем.&lt;br /&gt;&lt;br /&gt;На практике это означает необходимость содержать несколько команд для поддержки, порой весьма сложного, комплекса FrontEnd систем. Эти команды должны обладать специфическими и значительными компетенциями в своем мире.&lt;br /&gt;&lt;br /&gt;Наш подход несколько иной. Используя С++ мы получили возможность разрабатывать системы для всех платформ в единой кодовой базе. Нет необходимости привлекать разработчиков для разных платформ. Компетенции можно поддерживать на высоком уровне, а из взаимозаменяемость позволяет разработчикам без дополнительного обучения заниматься разными платформами.&lt;br /&gt;&lt;br /&gt;Мы определенно считаем такой подход значительно более экономичным.</description><link>https://oleg.kalpa.ru/2017/01/blog-post_19.html</link><author>noreply@blogger.com (Oleg Shall)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-1306900691757408704</guid><pubDate>Thu, 05 Jan 2017 07:24:00 +0000</pubDate><atom:updated>2017-05-10T18:31:05.285+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Kalpa</category><category domain="http://www.blogger.com/atom/ns#">Заметки архитектора</category><title>К вопросу об организации оркестратора кластера в деле бесшовного ввода новых версий Kalpa-системы.</title><description>Страшное дело - организация взаимодействия в большой системе взаимодействующих узлов.&lt;br /&gt;Первое и основное дело, с каким придется столкнуться - реализация плавного, бесшовного обновления всей системы на новые версии. Причем делать это надо не дергая пользователей. Пусть они спокойно доработают свою сессию на старой версии. Для обеспечения такой плавности необходима одновременная работа как всего серверного хозяйства в старой версии, так и плавный ввод в работу версии новой.&lt;br /&gt;Итак. В системе существует служба &quot;SystemControl&quot;. Она отвечает:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;За контроль топологии системы. Знает какие узлы существуют в системе и какие службы эти узлы обслуживают.&lt;/li&gt;&lt;li&gt;Мониторит отказ отдельных узлов и перебалансировку топологии системы.&lt;/li&gt;&lt;li&gt;Осуществляет плавное обновление системы.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Каждая служба (кроме слоя сервера приложений) имеет свой набор сетевых портов ожидания. Каждая версия использует только один из трех портов. SystemControl всегда знает расписание портов текущей и прошлой версии. Таким образом можно одновременно держать несколько версионных слоев служб на всем пространстве узлов.&lt;/div&gt;&lt;div&gt;Схематиченый сценарий ввода в работу новой версии все системы таков.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Соединение специальной утилитой с SystemControl и инициация протокола запуска новой версии системы.&lt;/li&gt;&lt;li&gt;Загрузка через SystemControl исполняемых файлов и библиотек всех служб системы.&lt;/li&gt;&lt;li&gt;Активация новой версии SystemControl на новом порте ожидания.&lt;/li&gt;&lt;li&gt;Новая версия SystemControl (из общей со старой версией базы) получает список всех рабочих узлов системы и через старую версию NodeControl, работающую на каждом узле, передает файлы и библиотеки новой версии на каждый узел.&amp;nbsp;&lt;/li&gt;&lt;li&gt;На каждом рабочем узле активируется новая версия NodeControl на новом порте ожидания.&lt;/li&gt;&lt;li&gt;После того как получено подтверждение о запуске новой версии NodeControl начинается процесс активации внутренних служб согласно текущей топологии системы. Стартуют все службы кроме серверов приложения.&lt;/li&gt;&lt;li&gt;После подтверждения старта внутренних служб новая версия SystemControl начинает процесс активации слоя новых версий серверов приложений. Для этого -&amp;gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;SystemControl соединяется со старой версией NodeControl (на узле AS) и отключает старый сервер приложений.&lt;/li&gt;&lt;li&gt;SystemControl соединяется с новой версией NodeControl (на узле AS) и активирует новую версию сервера приложений.&lt;/li&gt;&lt;li&gt;В службе ASControl все активные AS-серверы удаляются и &quot;взводится&quot; первый рабочий сервер приложения.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Каждый последующий запущенный сервер регистрируется в ASControl, что происходит практически мгновенно.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;SystemControl перехватывает управление соединяясь со старой версией NodeControl на всем пространстве запущенных узлов и получает доступ к статистической информации о системе.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Когда на всех узлах AS (ApplicationServer) прекращается обслуживание последней доживающей пользовательской сессии, можно с уверенностью сказать, что все пользователи, использующие старый слой сервера, завершили свою работу.&amp;nbsp;&lt;/li&gt;&lt;li&gt;После завершения работы последнего пользователя старой версии все уровни внутренних служб гасятся через NodeControl каждого узла.&lt;/li&gt;&lt;li&gt;После гасятся сами NodeControl, ASControl и SystemControl старой версии.&lt;/li&gt;&lt;li&gt;Система полностью и плавно переходит на новую версию.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Простой системы (в части обработки поступающих запросов на установку новой сессии) минимален (несколько миллисекунд).&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Такая архитектура позволяет держать несколько версионных слоев системы одновременно. Считаю, что 3 одновременно работающих версии более чем достаточно даже для весьма масштабного кластера.&lt;/div&gt;</description><link>https://oleg.kalpa.ru/2017/01/blog-post.html</link><author>noreply@blogger.com (Oleg Shall)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-9037723020126382652</guid><pubDate>Tue, 13 Dec 2016 08:19:00 +0000</pubDate><atom:updated>2017-05-10T18:31:05.298+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Госмессенджер</category><title>Новости госмессенджеров.</title><description>&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;«Развитие IT-технологий является приоритетом работы правительства Республики Крым. Наш президент в своём послании Федеральному собранию назвал развитие цифровой экономики вопросом национальной безопасности и технологической независимости России. Глава государства обратил особое внимание на риски, связанные с цифровыми технологиями, и необходимость защиты от киберугроз», — отметил Сергей Аксёнов.&lt;br /&gt;Андрей Назаров уточнил, что свои разработки программисты могут представить на третьем ялтинском форуме в апреле следующего года. Отметим, что Назаров также занимает пост председателя правления Ялтинского международного экономического форума.&lt;br /&gt;Госконтрактом с крымским правительством уже заинтересовались разработчики российского мессенджера Dialog, которые участвуют в конкурсе Института развития интернета на создание государственного мессенджера для федеральных чиновников.&lt;br /&gt;&lt;br /&gt;«Мы готовы принять участие и в разработке закрытого безопасного мессенджера для крымских чиновников, в свете чего планируем проведение масштабной презентации корпоративного мессенджера Dialog в дни прохождения ялтинского форума в апреле 2017 года», — заявил Андрей Кузнецов, директор по информационным технологиям мессенджера Dialog.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://russian.rt.com/russia/article/341179-chinovniki-krym-messendzher&quot; target=&quot;_blank&quot;&gt;https://russian.rt.com/russia/article/341179-chinovniki-krym-messendzher&lt;/a&gt;</description><link>https://oleg.kalpa.ru/2016/12/blog-post.html</link><author>noreply@blogger.com (Oleg Shall)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-8036590256354919203</guid><pubDate>Mon, 12 Dec 2016 08:48:00 +0000</pubDate><atom:updated>2018-07-12T18:08:49.705+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Qt</category><category domain="http://www.blogger.com/atom/ns#">Технологическое</category><title>Новости часа.</title><description>К вопросу о моем&amp;nbsp;&lt;a href=&quot;http://oleg.kalpa.ru/2016/12/qtcpsocket-disconnected.html&quot; target=&quot;_blank&quot;&gt;сообщении про QTcpSocket&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Может еще рано радоваться, но тикету присвоили статус &quot;Important&quot;.&lt;br /&gt;Надеюсь все же разобраться. Я конечно приготовился делать свой HeartBeat. И даже провел подготовительные работы. Но все же...</description><link>https://oleg.kalpa.ru/2016/12/blog-post_12.html</link><author>noreply@blogger.com (Oleg Shall)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-6226425997060537581</guid><pubDate>Mon, 12 Dec 2016 04:33:00 +0000</pubDate><atom:updated>2018-07-12T18:09:06.092+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Qt</category><category domain="http://www.blogger.com/atom/ns#">Технологическое</category><title>Опять про QTcpSocket и disconnected</title><description>Казалось бы, все понятно и все ситуации разобраны. Ан нет.&lt;br /&gt;Известная история. Как определить, что tcp-соединение разорвано? Ответ - настройки keepalive.&lt;br /&gt;&lt;br /&gt;На стороне сокета, читающего данные все работает нормально.&lt;br /&gt;На стороне сокета пишущего данные опять проявился сюрприз.&lt;br /&gt;Если между фактом разрыва и отработкой попыток KeepAlive в сокет не было записано данных, то все отрабатывается штатно. QTcpSocket выбрасывает disconnected.&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;b&gt;НО&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;Если после разрыва в сокет были записаны данные, сигнал о разрыве не выбрасывается. Более того, write фиксирует успех записи данных. bytesToWrite показывает 0, что означает, что данные уже записаны в канал. state сокета показывает QAbstractSocket::ConnectedState.&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;Не поленился написал тестовый пример для демонстрации описываемого эффекта.&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;style type=&quot;text/css&quot;&gt;p, li { white-space: pre-wrap; } &lt;/style&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;!--StartFragment--&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #429099;&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #3d648a; font-weight: 600;&quot;&gt;SocketTransport&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #508169;&quot;&gt;onConnected&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style=&quot;color: grey;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #00577f;&quot;&gt;qDebug&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;()&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #59784b;&quot;&gt;&quot;OnConnected&quot;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #80714d; font-weight: 600;&quot;&gt;mSocket&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ae4f4f;&quot;&gt;setSocketOption&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #3d648a; font-weight: 600;&quot;&gt;QAbstractSocket&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #e0a072; font-weight: 600;&quot;&gt;KeepAliveOption&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #429099;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4b7f81; font-weight: 600;&quot;&gt;Idle&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #429099;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4b7f81; font-weight: 600;&quot;&gt;Count&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #429099;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4b7f81; font-weight: 600;&quot;&gt;Interval&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b36d3a; font-weight: 600;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #508169;&quot;&gt;setsockopt&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #b36d3a; font-weight: 600;&quot;&gt;static_cast&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #429099;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;span style=&quot;color: #80714d; font-weight: 600;&quot;&gt;mSocket&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ae4f4f;&quot;&gt;socketDescriptor&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;()),&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #00577f;&quot;&gt;IPPROTO_TCP&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #00577f;&quot;&gt;TCP_KEEPIDLE&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt;               &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #4b7f81; font-weight: 600;&quot;&gt;Idle&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b36d3a; font-weight: 600;&quot;&gt;sizeof&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4b7f81; font-weight: 600;&quot;&gt;Idle&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;))&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;color: #00577f;&quot;&gt;qDebug&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;()&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #59784b;&quot;&gt;&quot;Error&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #59784b;&quot;&gt;setsockopt&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #59784b;&quot;&gt;IPPROTO_TCP,&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #59784b;&quot;&gt;TCP_KEEPIDLE&quot;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b36d3a; font-weight: 600;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #508169;&quot;&gt;setsockopt&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #b36d3a; font-weight: 600;&quot;&gt;static_cast&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #429099;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;span style=&quot;color: #80714d; font-weight: 600;&quot;&gt;mSocket&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ae4f4f;&quot;&gt;socketDescriptor&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;()),&lt;/span&gt;&lt;span style=&quot;color: #00577f;&quot;&gt;IPPROTO_TCP&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #00577f;&quot;&gt;TCP_KEEPCNT&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt;               &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #4b7f81; font-weight: 600;&quot;&gt;Count&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b36d3a; font-weight: 600;&quot;&gt;sizeof&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4b7f81; font-weight: 600;&quot;&gt;Count&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;))&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;color: #00577f;&quot;&gt;qDebug&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;()&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #59784b;&quot;&gt;&quot;Error&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #59784b;&quot;&gt;setsockopt&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #59784b;&quot;&gt;IPPROTO_TCP,&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #59784b;&quot;&gt;TCP_KEEPCNT&quot;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b36d3a; font-weight: 600;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #508169;&quot;&gt;setsockopt&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #b36d3a; font-weight: 600;&quot;&gt;static_cast&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #429099;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;span style=&quot;color: #80714d; font-weight: 600;&quot;&gt;mSocket&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ae4f4f;&quot;&gt;socketDescriptor&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;()),&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #00577f;&quot;&gt;IPPROTO_TCP&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #00577f;&quot;&gt;TCP_KEEPINTVL&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt;               &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #4b7f81; font-weight: 600;&quot;&gt;Interval&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b36d3a; font-weight: 600;&quot;&gt;sizeof&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4b7f81; font-weight: 600;&quot;&gt;Interval&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;))&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;color: #00577f;&quot;&gt;qDebug&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;()&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #59784b;&quot;&gt;&quot;Error&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #59784b;&quot;&gt;setsockopt&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #59784b;&quot;&gt;IPPROTO_TCP,&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #59784b;&quot;&gt;TCP_KEEPINTVL&quot;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #80714d; font-weight: 600;&quot;&gt;mTimer&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #508169;&quot;&gt;start&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: grey;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;style type=&quot;text/css&quot;&gt;p, li { white-space: pre-wrap; } &lt;/style&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;!--StartFragment--&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #429099;&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #3d648a; font-weight: 600;&quot;&gt;SocketTransport&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #508169;&quot;&gt;writeData&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style=&quot;color: grey;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #00577f;&quot;&gt;qDebug&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;()&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #59784b;&quot;&gt;&quot;BYTES&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #59784b;&quot;&gt;to&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #59784b;&quot;&gt;write&quot;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #80714d; font-weight: 600;&quot;&gt;mSocket&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ae4f4f;&quot;&gt;bytesToWrite&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;()&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #80714d; font-weight: 600;&quot;&gt;mSocket&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #508169;&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b36d3a; font-weight: 600;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #80714d; font-weight: 600;&quot;&gt;mSocket&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #508169;&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;()==&lt;/span&gt;&lt;span style=&quot;color: #3d648a; font-weight: 600;&quot;&gt;QAbstractSocket&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #e0a072; font-weight: 600;&quot;&gt;UnconnectedState&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: silver; font-size: x-small;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;color: #00577f; font-size: x-small;&quot;&gt;qDebug&lt;/span&gt;&lt;span style=&quot;color: grey; font-size: x-small;&quot;&gt;()&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #59784b; font-size: x-small;&quot;&gt;&quot;Unconnected&lt;/span&gt;&lt;span style=&quot;color: silver; font-size: x-small;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #59784b; font-size: x-small;&quot;&gt;state&quot;&lt;/span&gt;&lt;span style=&quot;color: grey; font-size: x-small;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;color: #3d648a; font-weight: 600;&quot;&gt;QCoreApplication&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #508169;&quot;&gt;processEvents&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;color: #b36d3a; font-weight: 600;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #3d648a; font-weight: 600;&quot;&gt;QUuid&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt;      &lt;/span&gt;&lt;span style=&quot;color: #4b7f81; font-weight: 600;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3d648a; font-weight: 600;&quot;&gt;QUuid&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #508169;&quot;&gt;createUuid&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #3d648a; font-weight: 600;&quot;&gt;QByteArray&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4b7f81; font-weight: 600;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #4b7f81; font-weight: 600;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #508169;&quot;&gt;toByteArray&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #00577f;&quot;&gt;qDebug&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;()&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4b7f81; font-weight: 600;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4b7f81; font-weight: 600;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #508169;&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #00577f;&quot;&gt;qDebug&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;()&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #80714d; font-weight: 600;&quot;&gt;mSocket&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #508169;&quot;&gt;write&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4b7f81; font-weight: 600;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4b7f81; font-weight: 600;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #508169;&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;());&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;//qDebug()&amp;lt;&lt;msocket .flush=&quot;&quot; span=&quot;&quot;&gt;&lt;/msocket&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: silver;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;//QCoreApplication::processEvents();&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: grey;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://drive.google.com/open?id=0B1NCPMWs3oAFVjk3ZVJSNUZIWTg&quot;&gt;https://drive.google.com/open?id=0B1NCPMWs3oAFVjk3ZVJSNUZIWTg&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;!--EndFragment--&gt;&lt;/pre&gt;Определяем параметры KeepAlive и по таймеру пишем в сокет данные. Выдергиваем кабель и получаем описываемый эффект. (по ссылке архив с полным примером). Все тестировалось в Linux c Qt5.7 и Qt5.8&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;На всякий случай вчера запостил сообщение в Qt-группу и открыл тикет. Что-то мне подсказывает, что результата не будет.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;Значит придется делать свои heartbeat эхозапросы. Не ждать же пока ситуация разрешится сама.&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;Если я не прав, очень прошу наставить на путь истинный.&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;</description><link>https://oleg.kalpa.ru/2016/12/qtcpsocket-disconnected.html</link><author>noreply@blogger.com (Oleg Shall)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-8160968761835202181</guid><pubDate>Wed, 07 Dec 2016 11:39:00 +0000</pubDate><atom:updated>2018-07-12T18:10:13.811+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">cmake</category><category domain="http://www.blogger.com/atom/ns#">Qt</category><category domain="http://www.blogger.com/atom/ns#">Технологическое</category><title>Cmake заметки.</title><description>После того как cmake научился для Qt5 автоматически &quot;мокать&quot; необходимые заголовки многие разучились это делать руками. А это иногда нужно.&lt;br /&gt;Вот например, есть у вас в одном проекте класс с одинаковым именем, но в разных пространствах имен (и в разных каталогах, разумеется). И не говорите, что так не бывает. Еще как бывает.&lt;br /&gt;Так вот, стандартная опция&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;set(CMAKE_AUTOMOC ON)&lt;/blockquote&gt;будет генерить файлы с одинаковыми именами в каталоге сборки и обязательно приведет к ошибке.&lt;br /&gt;Что делать? Мокать файлы самому. Для этого.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Установим set(CMAKE_AUTOMOC OFF)&lt;/li&gt;&lt;li&gt;Определим переменную header set(header ..... ) в которой перечислим необходимые для moc заголовочные файлы.&lt;/li&gt;&lt;li&gt;Скажем qt5_wrap_cpp(moc ${header})&lt;/li&gt;&lt;li&gt;В add_library добавим ${moc}&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;После этих манипуляций cmake будет рад в каталоге сборке создать внутренние служебные каталоги с созданными moc-файлами. Конфликтов имен при такой сборке не будет.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;</description><link>https://oleg.kalpa.ru/2016/12/cmake.html</link><author>noreply@blogger.com (Oleg Shall)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-5712126419906333528</guid><pubDate>Sun, 04 Dec 2016 08:31:00 +0000</pubDate><atom:updated>2017-05-10T18:31:50.609+03:00</atom:updated><title>Web и мобильные решения.</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;Технологии Web создавались давно и с совершенно определенной целью. И пошли они в мир и стали популярными. Каждый захотел завести свой сайт и стало их великое множество. Для поиска кусков текста в них люди придумали поисковые машины. Благо все сайты могут быть доступными через одно единственное приложение - браузер.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;На настольных компах недостатки web-решений были терпимыми, но с приходом мобильных платформ пользователь обнаружил недостатки со всей яркой выпуклостью. И он сделал свой выбор!&lt;br /&gt;90% народа на телефонах и планшетах предпочитает специально созданные приложения их web-версиям. Спираль развития технологий начала свой новый виток и вот уже опять все новые и новые фирмы (и даже отдельные люди) захотели создавать свои собственные приложения для телефонов и работать со своими клиентами именно через них. И это верно и хорошо!&lt;br /&gt;Но мы же не можем поставить на свои телефоны тысячи приложений.&lt;br /&gt;Можно использовать терминальный подход и стримить приложения в телефон. Можно в приложения встроить обычный браузер.&lt;br /&gt;Но можно пойти по срединному пути. Нужно научиться создавать множество сетевых быстрых и удобных мобильных приложений и доставлять их пользователю через один единственных клиент. И надо переосмыслить принципы доступа с множеству приложений. Опора на проактивность и интегральные решения могут стать возможностью создать новую экосистему сетевых приложений.&lt;br /&gt;&lt;br /&gt;И мы говорим фирмам.&lt;br /&gt;Вы же все равно собираетесь заказывать мобильные приложения. Давайте поиграем в новую игру. В новую проактивную экосистему где ваши услуги будут доступны пользователю сразу и по запросу. Не надо создавать отдельное приложение. Мы создадим вашу фрагмент мозаики и добавим его целое произведение.&lt;br /&gt;Кому нужна эта глупая реклама и &quot;продвижение&quot; в поисковых запросах.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</description><link>https://oleg.kalpa.ru/2016/12/web.html</link><author>noreply@blogger.com (Oleg Shall)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-6763739295079553532</guid><pubDate>Sat, 03 Dec 2016 08:48:00 +0000</pubDate><atom:updated>2017-06-24T10:39:07.339+03:00</atom:updated><title>QtCreator 4.2_rc1 (Новая версия. Найденные проблемы.)</title><description>В QtCreator (с некоторых пор) активно использую clang-режим для фоновой постоянной проверки корректности программы. Средство весьма дорогое.&lt;br /&gt;В 4.2 длительное использование большого числа открытый файлов приводит к захвату значительных объемов памяти. Редко используемые файлы, которые однако же открыты в проекте, не выгружаются. (хотя эта особенность была заявлена) Становится практически нормой держать &quot;в голове&quot; 8-9 гигов для работы clangbackend в активном проекте. Хорошая штука, к которой я очень быстро привык. Очень не хочется с ней расставаться.&lt;br /&gt;&lt;br /&gt;В clang-режиме при вводе и редактировании QObject::connect первый аргумент (объект генерирующий сигнал) не автокомплетится. При автокомплете сигналов и слотов в новой нотации выставляются скобки (как и в 4.1)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;При редактировании конструктора родительский конструктор не автокомплетится.&lt;br /&gt;Автозакрытие и контроль скобок обрабатывается некорректно. (Дозволяет создавать лишние)&lt;br /&gt;&lt;br /&gt;Вроде починили постоянные проблемы в настройке системы сборки cmake+makefile+codeblocks. Раньше все норовил переключиться на сmake+ninja+codeblocks.&lt;br /&gt;&lt;br /&gt;И конечно особо мерзкий баг - неверно выставляемые #define при создании нового класса. Всегда в дефайнах указывалась полная нотация пространства имен.&lt;br /&gt;&lt;br /&gt;Указать эти ошибки в баг-репортах или сами увидят?&lt;br /&gt;&lt;br /&gt;</description><link>https://oleg.kalpa.ru/2016/12/qtcreator-42rc1.html</link><author>noreply@blogger.com (Oleg Shall)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-6419060100453823497</guid><pubDate>Wed, 09 Nov 2016 14:20:00 +0000</pubDate><atom:updated>2017-05-10T18:31:59.995+03:00</atom:updated><title>Kalpa проактивный бизнес-коммуникатор. Презентация бизнес-плана.</title><description>&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;485&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;//www.slideshare.net/slideshow/embed_code/key/xiHLP4dAeo8hig&quot; style=&quot;border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;&quot; width=&quot;595&quot;&gt; &lt;/iframe&gt; &lt;br /&gt;&lt;div style=&quot;margin-bottom: 5px;&quot;&gt;&lt;strong&gt; &lt;a href=&quot;https://www.slideshare.net/olegshalnev/kalpa-bp-1609271&quot; target=&quot;_blank&quot; title=&quot;Kalpa business plan presentation&quot;&gt;Kalpa business plan presentation&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;https://www.slideshare.net/olegshalnev&quot; target=&quot;_blank&quot;&gt;Oleg Shalnev&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;&lt;br /&gt;&lt;b&gt;Презентация дополнена и улучшена.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;margin-bottom: 5px;&quot;&gt;&lt;strong&gt; &lt;a href=&quot;https://www.slideshare.net/olegshalnev/kalpa-bp-1609271&quot; target=&quot;_blank&quot; title=&quot;Kalpa business plan presentation&quot;&gt;Kalpa business plan presentation&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;https://www.slideshare.net/olegshalnev&quot; target=&quot;_blank&quot;&gt;Oleg Shalnev&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;</description><link>https://oleg.kalpa.ru/2016/11/kalpa.html</link><author>noreply@blogger.com (Oleg Shall)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-4417210000827757538</guid><pubDate>Tue, 08 Nov 2016 07:40:00 +0000</pubDate><atom:updated>2017-08-08T09:35:32.349+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">статьи</category><title>О децентрализации</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;Как же радостно наблюдать за бурными обсуждениями светлого децентрализованного будущего. Вот расставим мы по всей &quot;ивановской&quot; майнинг-центры и, натурально, все банки и нотариальные конторы немедленно исчезнут. Но мысли о том, что и это уже было под солнцем не покидают.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Каких-нибудь жалких 20 лет назад мир почтовых систем был совершенно децентрализован. Апофеоз децентрализации! На каждом малюсеньком предприятии в углу пылился (и умирал раз в год) серверок, который гонял почту на собственном домене. Правда когда серверок ветшал работа фирмы останавливалась на пару часов (или дней) и под вопли директора в телефон призывался приходящий админ. И конечно каждый приличный гик держал свой сервер дома. Что имеем теперь? Несколько централизованных мировых почтовых, очень даже контролируемых &quot;сами знаете кем&quot;, хабов.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Веб-сайты. Ну конечно, как только появились сайты они начали плодиться у каждого на фирмеах и в домашних подсобках. &amp;nbsp;Что сейчас? Крупные централизованные хост-площадки для сайтов-визиток. Да и нужны ли вообще эти самые сайты? Все вроде уже закончили самовыражаться вычурными шрифтами, кислотными обоями и анимированными снежинками. Для публикации фоток и цитат мудрецов вполне достаточно ленты новостей фейсбука и вконтакта. Даже narod.ru уже кажется не жив.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Мессенджеры! Конечно заря была централизованная. Icq. Кто же не помнит! Но тут же взбунтовались техноанархисты и вспомнили о децентрализации. Свободу попугаям! И придумали jabber/xmpp. Ну совершеннейшая же децентрализация. И опять у каждого приличного гика в подсобке пылился собственный серверок. Что в итоге? Совершеннейшая централизация с подробными записями.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Если хотите мы как-нибудь поговорим о природе этого явления. А сейчас просто помолчим и проникнемся молодецким азартом блокчейн-децентрализаторов. И это было...&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Как я воспринимаю историю с блокчейном.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;Это конечно социальный и технологический эксперимент в ходе которого отрабатываются сложности работы большого распределенного регистра, алгоритмов консенсуса и, что много важней, создание социального феномена и реакцию на него со стороны фирм, сообществ и отдельных лиц.&lt;/li&gt;&lt;li&gt;Конечно алгоритм, реализованный в bitcoin, совершенно избыточен. В реальной практике построения регистра для нужд государства такие фокусы совершенно не нужны.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Для государственных нужд будет построен регистр с адекватным алгоритмом консенсуса, работающий на ограниченном числе резервирующих серверов и поддерживающий адекватный и быстрый алгоритм консенсуса (к примеру RAFT). А разнообразные институты гражданского контроля будут снаружи мониторить целостность цепи.&amp;nbsp;&lt;/li&gt;&lt;li&gt;И конечно, вы серьезно думаете, что у государства не найдется способов заставить всех перейти на нужный регистр?&lt;/li&gt;&lt;/ol&gt;В итоге всем будет радостно узнать, что ходы каждого наконец будут записаны.&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Занятно будет наблюдать как проявится осознание блокчейн-евангелистов, когда они поймут, что их руками и их головами создается божественный регистр всеобщих грехов.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Вы же этого хотели?&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;</description><link>https://oleg.kalpa.ru/2016/11/blog-post_8.html</link><author>noreply@blogger.com (Oleg Shall)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-1303550796927493365</guid><pubDate>Wed, 02 Nov 2016 05:02:00 +0000</pubDate><atom:updated>2017-08-08T09:35:59.198+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">прогнозы</category><title>Прогнозы и предсказания.</title><description>В этом очередном прогнозе интересна следующая часть.&lt;br /&gt;&lt;h4&gt;&lt;span style=&quot;background-color: white; font-family: &amp;quot;roboto slab&amp;quot; , serif;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Все услуги будут доступны через единый интерфейс&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;&lt;br /&gt;&lt;ul style=&quot;background-color: white; box-sizing: border-box; font-family: &amp;quot;Roboto Slab&amp;quot;, serif; font-size: 16px; list-style: none; margin: 0px; outline: none; padding: 23px 0px 2px 43px;&quot;&gt;&lt;li dir=&quot;ltr&quot; style=&quot;box-sizing: border-box; margin: 0px 0px 10px; outline: none; padding: 0px 0px 0px 33px; position: relative;&quot;&gt;&amp;nbsp;&lt;div dir=&quot;ltr&quot; style=&quot;box-sizing: border-box; display: inline; margin-bottom: 15px; outline: none;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: 700; outline: none;&quot;&gt;Современные интерфейсы изменят то, как мы планируем наш день.&lt;/span&gt;&amp;nbsp;Все сервисы, которые вы захотите заказать, — от поездок и заказа пищи до услуг няни — будут доступны через единый интерфейс. Поставщики услуг будут конкурировать за место в нем в плане цены и комиссии.&lt;/div&gt;&lt;/li&gt;&lt;li dir=&quot;ltr&quot; style=&quot;box-sizing: border-box; margin: 0px 0px 10px; outline: none; padding: 0px 0px 0px 33px; position: relative;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;box-sizing: border-box; display: inline; margin-bottom: 15px; outline: none;&quot;&gt;Главной проблемой станет борьба за место по умолчанию. Поставщики услуг будут бороться за то, чтобы стать стандартным поставщиком в интерфейсах, которыми мы пользуемся каждый день. Чтобы выжить в условиях конкуренции, им придется больше заниматься рентабельностью своих услуг, чем построением бренда и отношений с клиентами.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Ровно эту мысль я и стараюсь донести уже довольно давно. Интересно другое! В Китае эту мысль уже поняли и активно развивают непосредственно в инициативе WeChat.&lt;br /&gt;Экосистема сетевых приложений должна и будет развиваться через единственный интерфейсный канал.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://rb.ru/story/5-predictions-by-belski/&quot;&gt;http://rb.ru/story/5-predictions-by-belski/&lt;/a&gt;</description><link>https://oleg.kalpa.ru/2016/11/blog-post.html</link><author>noreply@blogger.com (Oleg Shall)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-7428440191483368139</guid><pubDate>Sun, 16 Oct 2016 13:07:00 +0000</pubDate><atom:updated>2017-05-10T18:32:12.773+03:00</atom:updated><title>Почему никто не хочет общаться с вашим чат-ботом</title><description>&lt;div class=&quot;tr_bq&quot;&gt;&lt;br /&gt;&lt;/div&gt;Уже не раз пришлось публично сомневаться в прогностических способностях аналитиков, предсказывающих успех чат-ботов. &lt;br /&gt;&lt;br /&gt;Выражу сомнения еще раз. &lt;br /&gt;&lt;br /&gt;В мессенджерах можно и нужно передавать удобные графические интерфейсы.&lt;br /&gt;&lt;br /&gt;И мы знаем как это сделать. &lt;br /&gt;&lt;br /&gt;Именно поэтому мы развиваем нашу платформу и предлагаем InterfaceMessaging.&lt;br /&gt;Мы можем встраивать приложения непосредственно в мессенджер. И даже дополнительно ничего ставить не надо.&lt;br /&gt;&lt;br /&gt;Инвесторы, вы прогораете с инвестициями в боты? Может уже пора исследовать альтернативы?&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Ботам &lt;a href=&quot;http://venturebeat.com/2016/08/02/why-chatbots-are-replacing-apps/&quot;&gt;предрекали&lt;/a&gt; блестящее будущее, в котором они заменяют бизнесу мобильные приложения, но ничего подобного не происходит. Даже по трендам поиска в Google &lt;a href=&quot;https://www.google.ru/trends/explore?q=chatbots&quot;&gt;видно&lt;/a&gt;: чат-боты резко набрали популярность в апреле 2016 года, когда Facebook открыл для них свой Messenger, и так же быстро её растеряли. Недавно предприниматель Андрей Загоруйко &lt;a href=&quot;https://vc.ru/p/5-fail&quot;&gt;признался&lt;/a&gt;, что его стартап, интеллектуальный помощник для клиентов интернет-магазинов Quest.ai, провалился. И это лишь один из примеров.&lt;br /&gt;&lt;br /&gt;В основе этого хайпа лежала следующая идея: поскольку люди очень много времени проводят именно в мессенджерах, мы добавим туда ботов и пользователи начнут с ними взаимодействовать&lt;br /&gt;&lt;br /&gt;Продакт-дизайнер Дэн Грувер &lt;a href=&quot;http://dangrover.com/blog/2016/04/20/bots-wont-replace-apps.html&quot;&gt;посчитал&lt;/a&gt;, что для заказа пиццы в диалоге с ботом нужно нажать на экран 43 раза — против нескольких нажатий в хорошо спроектированном мобильном приложении или на мобильной версии сайта.&lt;/blockquote&gt;&lt;span style=&quot;background-color: white; font-family: , &amp;quot;blinkmacsystemfont&amp;quot; , &amp;quot;roboto&amp;quot; , &amp;quot;open sans&amp;quot; , &amp;quot;helvetica neue&amp;quot; , sans-serif; font-size: 13px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: white; font-size: 13px;&quot;&gt;&lt;span style=&quot;font-family: , &amp;quot;blinkmacsystemfont&amp;quot; , &amp;quot;roboto&amp;quot; , &amp;quot;open sans&amp;quot; , &amp;quot;helvetica neue&amp;quot; , sans-serif;&quot;&gt;http://secretmag.ru/article/2016/10/13/sergej-korol/?utm_source=sffb&amp;amp;utm_medium=social&amp;amp;utm_campaign=glavnaya-problema-sostoit-v-tom--chto-obsch&lt;/span&gt;&lt;/span&gt;</description><link>https://oleg.kalpa.ru/2016/10/blog-post.html</link><author>noreply@blogger.com (Oleg Shall)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-5531350796014145636</guid><pubDate>Tue, 23 Aug 2016 06:45:00 +0000</pubDate><atom:updated>2017-06-24T10:40:52.037+03:00</atom:updated><title></title><description>&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;485&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;//www.slideshare.net/slideshow/embed_code/key/mdZpQ9sr3cRabu&quot; style=&quot;border-width: 1px; border: 1px solid #CCC; margin-bottom: 5px; max-width: 100%;&quot; width=&quot;595&quot;&gt; &lt;/iframe&gt; &lt;br /&gt;&lt;div style=&quot;margin-bottom: 5px;&quot;&gt;&lt;strong&gt; &lt;a href=&quot;https://www.slideshare.net/olegshalnev/iri-presentation-3&quot; target=&quot;_blank&quot; title=&quot;Iri presentation (3)&quot;&gt;Iri presentation (3)&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;https://www.slideshare.net/olegshalnev&quot; target=&quot;_blank&quot;&gt;Oleg Shalnev&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;</description><link>https://oleg.kalpa.ru/2016/08/iri-presentation-3.html</link><author>noreply@blogger.com (Oleg Shall)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-2885368365180292549</guid><pubDate>Sat, 21 Mar 2015 14:09:00 +0000</pubDate><atom:updated>2017-05-10T18:44:16.205+03:00</atom:updated><title></title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;«Косвенно &lt;a href=&quot;http://www.gazeta.ru/tech/2015/03/20/6606733/Edward_Snowden_predupredil_IT-specialistov.shtml?fb_action_ids=1601344450103254&amp;amp;fb_action_types=og.recommends&quot; target=&quot;_blank&quot;&gt;тезисы Сноудена&lt;/a&gt; подтверждает опрос IT-специалистов, проведенный нами в конце 2014 года. 46% респондентов сообщили, что потеря их мобильного устройства и последующая кража корпоративной информации из его памяти подвергнут риску их компании», — сообщил «Газете.Ru» Оськин. &lt;/blockquote&gt;&amp;nbsp;А я в рамках проекта KalpaCloud давно именно об этом и говорил. Основа безопасности лежит в архитектуре программных систем.&lt;br /&gt;Вы построили мир на вебе, публичной почте. Вы гоняете данные на сторону клиента, которые хранятся во внутренних кешах браузера.&lt;br /&gt;Что же вы еще хотите? Безопасности?&lt;/div&gt;</description><link>https://oleg.kalpa.ru/2015/03/it-2014.html</link><author>noreply@blogger.com (Oleg Shall)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8066257029149636095.post-800584757828273662</guid><pubDate>Sun, 01 Mar 2015 12:59:00 +0000</pubDate><atom:updated>2017-05-10T18:44:38.119+03:00</atom:updated><title>Сравнение WiredTiger c Postgres (домашний тест)</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Когда говорят интересно и показывают фигуры о прекрасном всегда хочется почесать затылок и понять что же есть на самом деле. Не скрою, я весьма воодушевился сообщением о выходе мотора баз данных WiredTiger. Он, как говорят, настолько хорош, что его взяли на вооружение в MongoDB.&lt;br /&gt;&lt;br /&gt;Значит надо проверить.&lt;br /&gt;&lt;br /&gt;Учинил простой тест. Создается таблица из двух полей. Ключ - строка, значение- строка. Ключ, понятное дело, primary key. Для поля &quot;value&quot;&amp;nbsp;строится индекс. В варианте с Pg получается два индекса. (Как рулит первичным ключем &amp;nbsp;WT еще надо разбираться. Но фактически &amp;nbsp;WT создает только 2 файла а Pg 3(один с данными и 2 с индексами. Значит Pg будет оперировать собственно таблицей и двумя индексами, что всяко сложно)&lt;br /&gt;Добавляемые строки - случайные UUID&lt;br /&gt;&lt;br /&gt;В WT создание таблицы выглядит вот так.&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;ret = session-&amp;gt;create(session, &quot;table:access&quot;, key_format=S,value_format=S,columns=(key, value)&quot;);&lt;br /&gt;ret = session-&amp;gt;open_cursor(session, &quot;table:access&quot;, NULL, NULL, &amp;amp;cursor);&lt;br /&gt;session-&amp;gt;create(session, &quot;index:access:value&quot;, &quot;columns=(value)&quot;);&lt;/span&gt;&lt;/blockquote&gt;&lt;div&gt;Тест для Wt&lt;/div&gt;&lt;div&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;QTime tm;&lt;br /&gt;&amp;nbsp; &amp;nbsp; tm.start();&lt;br /&gt;&amp;nbsp; &amp;nbsp; for(int i=0; i&lt;1000000 font=&quot;&quot; i=&quot;&quot; nbsp=&quot;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;{&lt;/span&gt;&lt;!--1000000--&gt;&lt;!--1000000--&gt;&lt;!--1000000--&gt;&lt;!--1000000--&gt;&lt;/1000000&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; QByteArray keyarray=QUuid::createUuid().toString().remove(&#39;{&#39;).remove(&#39;}&#39;).toLocal8Bit();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; QByteArray valuearray=QUuid::createUuid().toString().remove(&#39;{&#39;).remove(&#39;}&#39;).toLocal8Bit();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cursor-&amp;gt;set_key(cursor, keyarray.data());&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cursor-&amp;gt;set_value(cursor, valuearray.data());&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ret = cursor-&amp;gt;insert(cursor);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;tm .elapsed=&quot;&quot; font=&quot;&quot;&gt;&lt;/tm&gt;&lt;!--1000000--&gt;&lt;!--1000000--&gt;&lt;!--1000000--&gt;&lt;!--1000000--&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; qDebug()&amp;lt;&amp;lt;&quot;Insert million of pairs&quot;&amp;lt;&lt;tm .elapsed=&quot;&quot; font=&quot;&quot;&gt;&lt;/tm&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Тест для Pg&lt;/div&gt;&lt;div&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp;for(int i=0; i&lt;1000000 br=&quot;&quot; i=&quot;&quot; nbsp=&quot;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Command.prepare(&quot;insert into test(id, value) values(:id, :value)&quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Command.bindValue(&quot;:id&quot;, &amp;nbsp; &amp;nbsp;QUuid::createUuid().toString());&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Command.bindValue(&quot;:value&quot;, QUuid::createUuid().toString());&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Command.exec();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;!--1000000--&gt;&lt;!--1000000--&gt;&lt;!--1000000--&gt;&lt;!--1000000--&gt;&lt;!--1000000--&gt;&lt;!--1000000--&gt;&lt;!--1000000--&gt;&lt;!--1000000--&gt;&lt;/1000000&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;WT использует отложенную модель записи, потому в PG отключим fsync.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Запускаем тест несколько раз и замерим время работы процедуры на пространстве возрастающих данны По итогу пяти прогонов для WiredTiger получил такие результаты в секундах   &lt;br /&gt;&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;/span&gt;&lt;li&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;97 &amp;nbsp; &amp;nbsp;(Круто)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;316 &amp;nbsp;(Прилично)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;743&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;1188&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;2193&lt;/span&gt;&lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;b&gt;&lt;b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--1000000--&gt;  Для Postgres получил &lt;br /&gt;&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;li&gt;500&lt;/li&gt;&lt;li&gt;690&lt;/li&gt;&lt;li&gt;1000&lt;/li&gt;&lt;li&gt;1196&lt;/li&gt;&lt;li&gt;955&lt;/li&gt;&lt;/ol&gt;На пятом миллионе WT скис окончательно спустившись до&amp;nbsp;&lt;b&gt;2193&lt;/b&gt;&amp;nbsp;секунд. При этом Postgres дает стабильные и прогнозируемые результаты.&lt;br /&gt;Давайте не будем забывать, что WiredTiger это ядро, менеджер записей, а Postgres - полновесная база данных со всем набором вытекающих из этого сложностей.&lt;br /&gt;&lt;br /&gt;Для очистки совести я добавил шестой миллион записей в Pg в одной транзакции. Получил результат&amp;nbsp;&lt;b&gt;611.&lt;/b&gt;&lt;br /&gt;Честно не очень понимаю что за фигуры показывают на презентации свидетели Wt и Mongo.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Вывод. Конечно я не великий спец в тестировании и со своими драными лаптями зря полез в эту тему, но мне все же кажется, что лучшее - враг хорошего.потому, сижу спокойно на Postgresql иногда поглядывая на новомодные штуки.    &lt;/div&gt;</description><link>https://oleg.kalpa.ru/2015/03/wiredtiger-c-postgres.html</link><author>noreply@blogger.com (Oleg Shall)</author></item></channel></rss>