Jekyll2021-08-21T17:12:12+00:00https://hikkings.github.io/feed.xmlХиккингиРедко, но метко!
Хиккинги #42021-08-20T21:00:00+00:002021-08-20T21:00:00+00:00https://hikkings.github.io/2021/08/20/reload<p>Привет из ада!</p>
<p>Это четвёртый выпуск журнала «Хиккинги».</p>
<p><a name="head-menu"></a>Сегодня в номере:</p>
<ul>
<li><a href="#head-whatmakesus">«Что нами движет?»</a>. Философия антиволевика.</li>
<li><a href="#head-automl">«AutoML»</a>. Обзор Google AutoML.</li>
<li><a href="#head-pagination">«Pagination»</a>. Особенности реализации постраничной загрузки записей из БД.</li>
<li><a href="#head-ytdntv">«YouTube DarkNet TV»</a>. Партнёрский материал о телевидении XXI века.</li>
<li><a href="#head-meditation">«Гигиена ума»</a>. Всё, что вы знаете и что не знаете о медитации.</li>
<li><a href="#head-digest">«Дайджест интересностей»</a>. Да, и такое бывает!</li>
</ul>
<p><br /><br /></p>
<h1 id="что-нами-движет"><a name="head-whatmakesus"></a>Что нами движет?</h1>
<blockquote>
<p>Вам случалось любоваться Матрицей, её гениальностью?.. Миллиарды людей живут полноценной жизнью… во сне. (агент Смит, фильм “Матрица”)</p>
</blockquote>
<blockquote>
<p>- Всё это нереально?</p>
<p>- Что есть реальность? И как определить ее? Весь набор ощущений: зрительных, осязательных, обонятельных — это сигналы рецепторов, электрические импульсы, воспринятые мозгом.</p>
<p>(Нео и Морфеус, фильм “Матрица”)</p>
</blockquote>
<p>Каждый человек живёт в собственной реальности, имеющей не очень много общего с реальностью других. Ведь восприятие окружающего мира, людей, событий зависит от текущей, моментальной активности мозга.</p>
<p>Человеческий мозг является сетью из более чем 85 миллиардов <a href="https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD">нейронов</a>, а число соединений между ними стремится к поистине громадным числам. (Для сравнения: полностью исследованный <a href="https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D0%BD%D0%B5%D0%BA%D1%82%D0%BE%D0%BC">коннектом</a> дождевого червя, нервная система которого состоит из 300 нейронов, насчитывает 7000 соединений между нейронами.) Образование и изменение связей между нейронами обусловлено: 1) ДНК - генетическим кодом, полученным в результате слияния генетического кода родителей; 2) нервной деятельностью - воспитание, жизненный опыт, переживания: да, даже простая простая мысль может изменить структуру соединений между нейронами.</p>
<p>ДНК меняется в течение жизни - в процессе накопления <a href="https://ru.wikipedia.org/wiki/%D0%9C%D1%83%D1%82%D0%B0%D1%86%D0%B8%D1%8F">мутаций</a>: иногда они просто случаются, самопроизвольно, но случаются и из-за воздействия окружающей среды (радиация, мутагенные вещества, <a href="https://www.nkj.ru/news/28438/">вирусы</a>). Нервная деятельность тоже не является чем-то упорядоченным и неизменным: начиная с того, что при детальном рассмотрении окружающий мир очень хаотичен и непредсказуем, заканчивая тем, что мозг, как центральный процессор нервной деятельности, обслуживается, питается и вообще - обслуживается - веществами из кровеносной системы.</p>
<p>Электрические импульсы в мозге передаются химически - с помощью особых веществ - <a href="https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BC%D0%B5%D0%B4%D0%B8%D0%B0%D1%82%D0%BE%D1%80">нейромедиаторов</a>. От их количественного изменения - переизбытка или недостатка определённых нейромедиаторов - <a href="https://geektimes.ru/post/288084/">зависит состояние психики человека</a>, т.е. процесс высшей нервной деятельности - сознание, ощущения, восприятие, память, мышление, намерения и т.п. Именно этим обуславливается эффект от кофе, шоколада, алкоголя, наркотиков: преодолевая защитную систему мозга (<a href="https://ru.wikipedia.org/wiki/%D0%93%D0%B5%D0%BC%D0%B0%D1%82%D0%BE-%D1%8D%D0%BD%D1%86%D0%B5%D1%84%D0%B0%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B1%D0%B0%D1%80%D1%8C%D0%B5%D1%80">гемато-энцефалический барьер</a>) <a href="https://ru.wikipedia.org/wiki/%D0%9F%D1%81%D0%B8%D1%85%D0%BE%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D0%B5_%D0%B2%D0%B5%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%BE">психоактивные вещества</a> из кровеносной системы попадают в мозг и воздействуют на количество нейромедиаторов в нейронах, что приводит к тому, что мозг в целом начинает работать по-другому, потому что фактически меняются <a href="https://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%B1%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%B0">синаптические веса</a> нейронов, т.е. вероятности прохождения различными путями электрохимического сигнала от одних нейронов к другим. Например, <a href="https://pohmelje.ru/serotonin-i-vozdejstvie-alkogolja-na-mozg/">алкоголь приводит к смещению баланса</a> самых важных нейромедиаторов и их рецепторов (нейронов, восприимчивых к конкретным типам нейромедиаторов): дофамина (<a href="http://www.beloveshkin.com/2014/12/dopamine-1.html">“система поощрения”</a>; изменение высших когнитивных функций: реакции, внимания), серотонина (усиление передачи сигнала между нейронами; усиление восприимчивости серотониновых рецепторов, что приводит к ощущению удовольствия и опьяняющих эффектов), <a href="https://ru.wikipedia.org/wiki/%D0%93%D0%B0%D0%BC%D0%BC%D0%B0-%D0%B0%D0%BC%D0%B8%D0%BD%D0%BE%D0%BC%D0%B0%D1%81%D0%BB%D1%8F%D0%BD%D0%B0%D1%8F_%D0%BA%D0%B8%D1%81%D0%BB%D0%BE%D1%82%D0%B0">ГАМК</a> (приводит к <a href="https://ru.wikipedia.org/wiki/%D0%A2%D0%BE%D1%80%D0%BC%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%28%D1%84%D0%B8%D0%B7%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F%29">торможению</a> нервной системы). Употребление <a href="https://ru.wikipedia.org/wiki/%D0%9B%D0%A1%D0%94">ЛСД</a>, который представляет собой молекулу, близкую по структуре к серотонину, приводит к переизбытку серотонина, что увеличивает «влияние» вторичных сигналов в мозге, и возникают галлюцинации.</p>
<p>Не только нейромедиаторы воздействуют на деятельность мозга через рецепторы. Различные железы в мозге и теле выделяют <a href="https://ru.wikipedia.org/wiki/%D0%93%D0%BE%D1%80%D0%BC%D0%BE%D0%BD%D1%8B">гормоны</a> - активные вещества, регулирующие сложные процессы: рост, развитие, обмен веществ, настроение, чувство голода или насыщения, половое влечение, жажда, эмоции, реакции на изменения условий среды, поддержание гомеостаза (баланса внутренней среды организма). При этом изменение концентрации гормонов (“гормональный фон”) обуславливается, в свою очередь, множество внешних и внутренних факторов: возрастные изменения организма, наследственность, заболевания, климатические и экологические условия, образ жизни, беременность.</p>
<p>На механизмы перестроения связей влияет миелин. Постоянно работающие нейроны с течением времени покрываются оболочкой из миелина. Это то самое “белое вещество”, которое значительно повышает эффективность нейронов как проводников электрических импульсов. Это то вещество, которое провоцирует мозг к перестроению своих связей: выработка миелина у ребенка максимальна при рождении, а к семи годам она снижается. С достижением периода полового созревания человека выработка миелина вновь возрастает (это происходит из-за того, что нам, как млекопитающим, нужно осуществить новую настройку своего мозга на поиск брачного партнера), с окончание полового созревания падает. С уровнем миелина можно связать “пластичность” мозга; мозг «миелинирует» весь наш жизненный опыт. Так что если в период юношества у человека будут эпизоды, когда он получает незаслуженное вознаграждение, то он накрепко запоминает, что награду можно получить и без усилий.</p>
<p>На формирование связей между нейронами влияет многократное повторение опыта или пережитые сильные эмоции (что по сути механизм воздействия одномоментного выброса гормонов/нейромедиаторов, связанных с системами поощрения). Кроме того, новые отростки у нейронов образуются при его активной стимуляции электроимпульсами (что, к слову, доступно и при <a href="https://hikkings.github.io/2017/01/09/second.html#head-ts">магнитной или электрической стимуляции</a>, т.е. активно используемые нейроны могут спровоцировать рост дендритов (приёмников электрических импульсов) других, соседних нейронов, что приведёт к созданию синаптической связи, которая на уровне сознания, возможно, будет восприниматься как неожиданная связь между двумя идеями.</p>
<p>Возвратимся к реальности, к общей реальности, которая представляет собой комок традиций, верований - коллективного бессознательного от наших древних предков, которые вышли из пещеры и увидели Хаос; древних предков, чью ДНК мы носим в каждой клетке нашего организма. Возвратимся к нашей реальности из людей и событий, которые сформировали и покрыли миелином основу нашей психики в младенческом и юношеском возрасте. К нашей реальности, где каждый момент времени каждая вдыхаемая или съедамая молекула, каждый фотон, пролетевший миллионы световых лет и попавший в наши глаза, каждый вирус, который преодолел множество систем защит наших организмов, каждое квантовое взаимодействие в процессе химических реакций меняет нас, наше восприятие, эту нашу реальность…</p>
<p>Контролируем ли мы своё поведение? Контролируем ли мы своё восприятие? Контролируем ли мы своё будущее?</p>
<blockquote>
<p>- Если ты уже знаешь будущее, тогда почему тебя удивил мой уход? Или когда тебя спровоцировал репортер? Почему ты вообще ведешь спор, если знаешь, чем все это закончится?</p>
<p>- У меня нет выбора. Все предопределено. Даже мои ответы.</p>
<p>- А ты лишь переживаешь череду движений? Самое сильное создание во вселенной - на самом деле лишь марионетка.</p>
<p>- Мы все марионетки, Лори. Просто я вижу нити.</p>
<p>(Доктор Манхэттен и Лори Юпитер, фильм “Хранители”)</p>
</blockquote>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<h1 id="automl"><a name="head-automl"></a>AutoML</h1>
<p>В конце курса <a href="https://www.kaggle.com/learn/intro-to-machine-learning">Intro to Machine Learning</a> на Kaggle есть “бонусный” (скорее, маркетинговый) <a href="https://www.kaggle.com/alexisbcook/intro-to-automl">урок</a> по использованию Google AutoML Tables. Google Cloud предлагает $300 и 3-месячную триалку для того, чтобы пощупать их облачную платформу. Google AutoML Tables - один из продуктов для автоматизации процесса создания и обучения модели: на вход подаётся датасет (предварительно заливаемый на Google Cloud Storage), указываются target-параметры, бюджет проекта (выраженный во времени работы нод; <a href="https://cloud.google.com/automl-tables/pricing">~$20 в час</a> за “92 n1-standard-4 equivalent machines in parallel”); на выходе получается модель, которую можно развернуть на мощностях Google Cloud (“$0.005 per GiB per hour per machine”), либо экспортировать в виде TensorFlow package для специального Docker-контейнера и развернуть на своих мощностях.</p>
<h2 id="подготовка">Подготовка</h2>
<p>Для начала необходимо подключить $300 триалку, чтобы потренироваться бесплатно. Подробно об этом можно почитать на <a href="https://cloud.google.com/free">страничке</a>, посвящённой бесплатному использованию продуктов Google Cloud. Создаётся проект (<a href="https://console.cloud.google.com/projectcreate">New project</a>), привязываются billing-данные карточки, на счету оказывается $300 кредитов, в локальной валюте, для использования продуктов.</p>
<p>После создания проекта необходимо создать Cloud Storage для хранения датасетов (а также результатов batch predictions, самой экспортированной модели). Это делается с помощью функции <a href="https://console.cloud.google.com/storage/browser">Create bucket</a>.</p>
<h2 id="создание-модели">Создание модели</h2>
<p>Для создания модели я использовал предлагаемый в курсе на Kaggle <a href="https://www.kaggle.com/alexisbcook/automl-tables-wrapper">AutoML Tables Wrapper</a>. Это обёртка над гугловыми библиотеками для работы с Google Cloud (storage, automl_v1beta1), которая 1) заливает на Google Cloud Storage csv-датасет для обучения, выставляет nullable-флаги у столбцов на основе входных данных, заливает тестовый датасет, для которого нужно получить predictions; 2) отправляет запрос на создание модели с указанием бюджета обучения, target-параметром; 3) скачивает результирующий csv.</p>
<p>Получить predictions у модели можно двумя способами: online и batch. Online - в случае, если запросы посылаются к REST-сервису развёрнутой в Google Cloud или у себя модели; batch - если подаётся большой csv/json/BigQuery кусок данных. Подробно о различиях можно прочитать в статье <a href="https://cloud.google.com/ai-platform/prediction/docs/online-vs-batch-prediction">Online versus batch prediction</a>. Для меня различие состояло прежде всего в том, что в случае batch predictions происходящее внутри трудно (невозможно?) отследить: predictions по отдельным строкам различались в batch и online-результатах; кроме того, в batch prediction results был файл с ошибками, из которых следовало, что некоторые не-nullable столбцы содержали null (хотя этот флаг во wrapper’е выставляется по объединению данных train- и test-датасетов). Причину этого вижу в своей криворукости либо в необходимости более тщательной очистки и подготовки и проверки метаданных перед обучением, либо в beta-статусе самой платформы AutoML Tables.</p>
<p>В случае возникновения ошибок при использовании wrapper’а рекомендую также иметь в виду <a href="https://www.kaggle.com/learn-forum/225075">тред</a> на Kaggle: в силу определённых причин модель может работать только с датасетами, расположенных в bucket’ах того же региона (рекомендуется использовать us-central1).</p>
<p>В самом простом случае необходимо задать соответствующие переменные:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">amw</span> <span class="o">=</span> <span class="n">AutoMLTablesWrapper</span><span class="p">(</span><span class="n">project_id</span><span class="o">=</span><span class="n">PROJECT_ID</span><span class="p">,</span>
<span class="n">bucket_name</span><span class="o">=</span><span class="n">BUCKET_NAME</span><span class="p">,</span>
<span class="n">dataset_display_name</span><span class="o">=</span><span class="n">DATASET_DISPLAY_NAME</span><span class="p">,</span>
<span class="n">train_filepath</span><span class="o">=</span><span class="n">TRAIN_FILEPATH</span><span class="p">,</span>
<span class="n">test_filepath</span><span class="o">=</span><span class="n">TEST_FILEPATH</span><span class="p">,</span>
<span class="n">target_column</span><span class="o">=</span><span class="n">TARGET_COLUMN</span><span class="p">,</span>
<span class="n">id_column</span><span class="o">=</span><span class="n">ID_COLUMN</span><span class="p">,</span>
<span class="n">model_display_name</span><span class="o">=</span><span class="n">MODEL_DISPLAY_NAME</span><span class="p">,</span>
<span class="n">train_budget</span><span class="o">=</span><span class="n">TRAIN_BUDGET</span><span class="p">)</span>
</code></pre></div></div>
<p>Запустить обучение: <code class="language-plaintext highlighter-rouge">amw.train_model()</code> и получить результаты: <code class="language-plaintext highlighter-rouge">amw.get_predictions()</code></p>
<h2 id="использование-google-cloud-console">Использование Google Cloud Console</h2>
<p>В результате обучения (если всё прошло успешно) в Cloud Console в разделе <a href="https://console.cloud.google.com/automl-tables">AutoML Tables</a> появляется обученная модель, по которой можно увидеть основные статистики и оценки ошибки предсказаний. Сначала необходимо развернуть (deploy) модель через контекстное меню (More options). После успешного завершения процесса (по умолчанию уведомления обо всех событиях в облаке будут прилетать в виде писем на гуглопочту), можно перейти к непосредственной работе с моделью (или же сразу экспортировать). Во вкладке Test & Use можно запустить Batch predictions, отправить запрос через форму во вкладке Online prediction, а также экспортировать модель в разделе Export your model.</p>
<p>Batch predictions выполняется по csv-файлу (предварительно его нужно залить в один из backet’ов в Cloud storage, но обязательно в том же регионе, где и развёрнута модель) или по результату запроса из BigQuery (здесь нужно отметить, что поля в csv могут иметь имена, например, начинающиеся с цифры, которые в BigQuery будут некорректными, т.о. они не сматчатся, и результат запроса нельзя будет импортировать в качестве входных данных для batch prediction, так что корректируйте все входные данные ДО обучения). Результат тоже выгружается либо в BigQuery, либо в Cloud storage bucket (в том же регионе); в результате будет файл с предсказаниями и файл с ошибками.</p>
<p>Можно сделать ручной запрос к развёрнутой модели на вкладке Online prediction, просто заполнив все поля в форме и нажав Predict.</p>
<h2 id="экспортирование-и-разворачивание-модели">Экспортирование и разворачивание модели</h2>
<p>Модель можно экспортировать либо из контекстного меню у элемента списка в разделе <a href="https://console.cloud.google.com/automl-tables">AutoML Tables</a> либо уже в свойствах самой модели в разделе Export your model. Чтобы скачать модель (или развернуть вручную), сначала нужно её экспортировать в один из backet’ов в Cloud storage, а потом, используя утилиту gsutil <a href="https://cloud.google.com/sdk/docs/quickstart">Google Cloud SDK</a> скопировать файлы модели к себе. Нужно отметить, что приведённая на странице экспортирования команда <code class="language-plaintext highlighter-rouge">gsutil cp -r gs://target/* ./download_dir</code> не сработает, поскольку среди файлов, генерируемых при экспорте есть директории с символами, которые являются некорректными в Windows (по сути и в *nix-системах тоже, но там ошибка возникнет чуть позже, при запуске докер-контейнера). Поэтому лучше зайти в <a href="https://console.cloud.google.com/storage/browser">браузер Cloud Storage</a> и там исследовать и выбрать нужные файлы (всё, что без спецсимволов типа $), а потом их скачать списком, например:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gsutil <span class="nt">-m</span> <span class="nb">cp</span> <span class="nt">-r</span> <span class="s2">"gs://automl-exper-export/model-export/tbl/tf_saved_model-house_prices_model-2021-04-24T12:33:44.446633Z/assets.extra/"</span> <span class="s2">"gs://automl-exper-export/model-export/tbl/tf_saved_model-house_prices_model-2021-04-24T12:33:44.446633Z/assets/"</span> <span class="s2">"gs://automl-exper-export/model-export/tbl/tf_saved_model-house_prices_model-2021-04-24T12:33:44.446633Z/saved_model.pb"</span> <span class="s2">"gs://automl-exper-export/model-export/tbl/tf_saved_model-house_prices_model-2021-04-24T12:33:44.446633Z/variables/"</span> ./houses
</code></pre></div></div>
<p>Перед использованием Google Cloud SDK необходимо выполнить <code class="language-plaintext highlighter-rouge">gcloud init</code> и следовать указаниям.</p>
<p>После ознакомления с руководством по экспорту модели <a href="https://cloud.google.com/automl-tables/docs/model-export">Exporting models</a>, можно создать и запустить докер-контейнер, указав местоположение файлов модели: <code class="language-plaintext highlighter-rouge">docker run -v `pwd`/model-export/tbl/new_folder_name:/models/default/0000001 -p 8080:8080 -it gcr.io/cloud-automl-tables-public/model_server</code> </p>
<p>В результате на порту 8080 будет работать REST-сервер, которому можно отправлять запросы в формате JSON в объекте instances:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"instances"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"Id"</span><span class="p">:</span><span class="w"> </span><span class="mi">1461</span><span class="p">,</span><span class="w">
</span><span class="nl">"MSSubClass"</span><span class="p">:</span><span class="w"> </span><span class="mi">20</span><span class="p">,</span><span class="w">
</span><span class="nl">"MSZoning"</span><span class="p">:</span><span class="w"> </span><span class="s2">"RH"</span><span class="p">,</span><span class="w">
</span><span class="nl">"LotFrontage"</span><span class="p">:</span><span class="w"> </span><span class="mi">80</span><span class="w">
</span><span class="err">//</span><span class="w"> </span><span class="err">...</span><span class="w">
</span><span class="err">//</span><span class="w"> </span><span class="err">other</span><span class="w"> </span><span class="err">columns</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Пример отправки запроса через curl:</p>
<p><code class="language-plaintext highlighter-rouge">curl -X POST --data @request.json http://192.168.8.103:8080/predict</code></p>
<p>В ответе получает объект predictions:</p>
<p><code class="language-plaintext highlighter-rouge">{"predictions": 126945.6640625}</code></p>
<p>Из DataFrame можно сформировать JSON, например, следующим образом:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">test</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="n">read_csv</span><span class="p">(</span><span class="s">"test.csv"</span><span class="p">)</span>
<span class="n">inputs_json</span> <span class="o">=</span> <span class="n">test</span><span class="p">.</span><span class="n">iloc</span><span class="p">[:,</span><span class="mi">1</span><span class="p">:]</span> <span class="o">//</span> <span class="n">without</span> <span class="n">first</span> <span class="n">ID</span> <span class="n">column</span>
<span class="n">inputs_json</span><span class="p">.</span><span class="n">to_json</span><span class="p">(</span><span class="s">"req_all.json"</span><span class="p">)</span>
</code></pre></div></div>
<p>и добавив “обёртку”:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"instances"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="err">//</span><span class="w"> </span><span class="err">content</span><span class="w"> </span><span class="err">of</span><span class="w"> </span><span class="err">req_all.json</span><span class="w"> </span><span class="err">file</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<h2 id="отправка-запросов-к-cloud-automl-api">Отправка запросов к Cloud AutoML API</h2>
<p>Для программной отправки запросов к API (например, из python-библиотеки - к развёрнутой модели в Google Cloud) нужно подключить Cloud AutoML API в разделе <a href="https://console.cloud.google.com/apis/dashboard">APIs & Services</a> и там же создать service account в подразделе Credentials, выставив role = Owner, скачать ключ во вкладке Keys у созданного аккаунта.</p>
<p>Чтобы google.cloud.automl_v1beta1 мог взаимодействовать в Cloud AutoML API нужно задать путь к скачанному ключу через переменную окружения GOOGLE_APPLICATION_CREDENTIALS. А также иметь под рукой те же параметры, которые задавали для AutoML Tables Wrapper.</p>
<p>В итоге, из Jupyter Notebook можно отправить запрос к развёрнутой в Google Cloud модели так:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">%</span><span class="n">env</span> <span class="n">GOOGLE_APPLICATION_CREDENTIALS</span> <span class="n">d</span><span class="p">:</span>\<span class="n">YOUR_SERVICE_KEY</span><span class="p">.</span><span class="n">json</span>
<span class="n">project_id</span> <span class="o">=</span> <span class="s">'YOUR_PROJECT_ID'</span>
<span class="n">compute_region</span> <span class="o">=</span> <span class="s">'us-central1'</span>
<span class="n">model_display_name</span> <span class="o">=</span> <span class="s">'YOUR_MODEL_NAME'</span>
<span class="kn">from</span> <span class="nn">google.cloud</span> <span class="kn">import</span> <span class="n">automl_v1beta1</span> <span class="k">as</span> <span class="n">automl</span>
<span class="n">client</span> <span class="o">=</span> <span class="n">automl</span><span class="p">.</span><span class="n">TablesClient</span><span class="p">(</span><span class="n">project</span><span class="o">=</span><span class="n">project_id</span><span class="p">,</span> <span class="n">region</span><span class="o">=</span><span class="n">compute_region</span><span class="p">)</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="n">predict</span><span class="p">(</span>
<span class="n">model_display_name</span><span class="o">=</span><span class="n">model_display_name</span><span class="p">,</span> <span class="n">inputs</span><span class="o">=</span><span class="n">inputs</span>
<span class="p">)</span>
<span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">response</span><span class="p">.</span><span class="n">payload</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span>
<span class="s">"Predicted value: {}"</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">result</span><span class="p">.</span><span class="n">tables</span><span class="p">.</span><span class="n">value</span><span class="p">)</span>
<span class="p">)</span>
</code></pre></div></div>
<p>Входные данные TablesClient ожидает в виде dict, поэтому нужно преобразовать из Series в нативные python-объекты. Я это сделал (возможно, это неправильно и некрасиво) так:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">inputs_pre</span> <span class="o">=</span> <span class="n">test</span><span class="p">.</span><span class="n">iloc</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">:]</span> <span class="o">//</span> <span class="n">one</span> <span class="n">row</span> <span class="k">for</span> <span class="n">example</span><span class="p">,</span> <span class="n">without</span> <span class="n">first</span> <span class="n">ID</span> <span class="n">column</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">inputs_pre</span><span class="p">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="o">==</span> <span class="nb">str</span> <span class="ow">or</span> <span class="nb">type</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="o">==</span> <span class="nb">float</span><span class="p">:</span>
<span class="n">inputs</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">inputs</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span><span class="p">.</span><span class="n">item</span><span class="p">()</span>
</code></pre></div></div>
<h2 id="резюме">Резюме</h2>
<p>Технология интересная, прикольная, но, полагаю, для серьёзных DS/ML-инженеров пока сыровата и довольно неконтролируема (слишком ограниченный и плохо документированный формат входных данных; экспорт модели только в виде очень тяжёлого и “закрытого” контейнера с привязанным REST-сервером). Ну, и (наверное) дороговато. Тем не менее, для каких-то простых задач всё сработает из коробки, были бы достаточные бюджеты; например, в результате часа обучения (это обошлось мне в бесплатные ~$20) полученная модель (без какого-либо тюнинга) перекинула меня в top 12% в <a href="https://www.kaggle.com/c/home-data-for-ml-course">учебном соревновании на классической Ames Housing dataset</a>.</p>
<p>См. также:</p>
<ul>
<li><a href="https://medium.com/@juri.sarbach/how-to-deploy-your-automl-model-in-a-cost-effective-way-5efdd377d4d2">How to Deploy your AutoML Model in a Cost-effective Way</a></li>
<li><a href="https://csvjson.com/csv2json">csv2json</a></li>
</ul>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<h1 id="pagination"><a name="head-pagination"></a>Pagination</h1>
<p>Реализация типичной функциональности на многих сайтах - постраничного вывода (pagination) - имеет свои особенности, которые нужно учитывать, чтобы это не стало узким местом производительности в базе данных.</p>
<p>Типичная наивная реализация выборки из БД для постраничного вывода представляет собой конструкцию вида <code class="language-plaintext highlighter-rouge">ORDER BY $id1, $id2... OFFSET ($pageNum-1)*$pageSize LIMIT $pageSize</code> ($var здесь и далее - именованные аргументы запроса; это не про PHP).</p>
<ol>
<li>
<p>Поля, по которым будет выполнена сортировка (<code class="language-plaintext highlighter-rouge">ORDER BY $id1, $id2...</code>) для постраничного вывода должны быть проиндексированы (<code class="language-plaintext highlighter-rouge">CREATE INDEX</code>).</p>
</li>
<li>
<p>Нужно отказаться от использоваться <code class="language-plaintext highlighter-rouge">OFFSET</code>. Проблема в том, что сначала выбираются ВСЕ записи из таблицы, а потом указанное в <code class="language-plaintext highlighter-rouge">OFFSET</code> число записей пропускается. Вместо <code class="language-plaintext highlighter-rouge">OFFSET</code> нужно использовать фильтрацию в <code class="language-plaintext highlighter-rouge">WHERE</code>, фильтруя записи по $id < $offset. Но что, если в id есть пропуски?</p>
</li>
<li>
<p>Поэтому ещё нужно определиться с типом вывода: будет ли это бесконечный скролл или навигация по пронумерованному списку страниц. Бесконечный скролл - реализовать намного проще, и случай с пропусками имеет простое решение. Будем добавлять к запросу $current_id, с которого начинается отсчёт, т.е. будем отбирать те записи, у которых <code class="language-plaintext highlighter-rouge">WHERE id > $current_id</code>. Для первой страницы (начальный вывод бесконечного скролла) положим <code class="language-plaintext highlighter-rouge">$current_id</code> равным 0. Для того, чтобы определить, остались ли ещё записи, можно сравнивать количество уже загруженных и выведенных записей с общим количеством или в запросе делать <code class="language-plaintext highlighter-rouge">LIMIT $pageSize+1</code>, но выводить только <code class="language-plaintext highlighter-rouge">$pageSize</code> элементов и проверять, сколько элементов было фактически получено. </p>
</li>
</ol>
<p>Если же нужна именно навигация по пронумерованному списку, то либо придётся реализовывать сложные схемы с сохранением в БД и пересчётом номера страницы, связанной с записью, или количества предшествующих записей, либо пользоваться <code class="language-plaintext highlighter-rouge">OFFSET</code>, который может привести к проблемам с производительностью на больших массивах данных.</p>
<p><strong>Бонусная часть: бинарный поиск по id в таблице</strong></p>
<p>Этот подход представляет только академический интерес, т.к. производительность на несколько порядков ниже <code class="language-plaintext highlighter-rouge">OFFSET</code> из-за необходимости постоянно пересчитывать количество записей до границ поиска.</p>
<p>Добавляем много записей в тестовую таблицу (с индексом id) и создаём искусственные пропуски.</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">INSERT</span> <span class="k">INTO</span> <span class="n">tests</span><span class="p">.</span><span class="n">fb</span><span class="p">(</span><span class="n">id</span><span class="p">)</span>
<span class="k">SELECT</span> <span class="mi">100000</span><span class="o">*</span><span class="n">d6</span><span class="p">.</span><span class="n">d</span><span class="o">+</span><span class="n">d5</span><span class="p">.</span><span class="n">d</span><span class="o">*</span><span class="mi">10000</span><span class="o">+</span><span class="n">d4</span><span class="p">.</span><span class="n">d</span><span class="o">*</span><span class="mi">1000</span><span class="o">+</span><span class="n">d3</span><span class="p">.</span><span class="n">d</span><span class="o">*</span><span class="mi">100</span><span class="o">+</span><span class="n">d2</span><span class="p">.</span><span class="n">d</span><span class="o">*</span><span class="mi">10</span><span class="o">+</span><span class="n">d1</span><span class="p">.</span><span class="n">d</span> <span class="n">id</span>
<span class="k">FROM</span>
<span class="p">(</span><span class="k">SELECT</span> <span class="mi">0</span> <span class="n">d</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">1</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">2</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">3</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">4</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">5</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">6</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">7</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">8</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">9</span><span class="p">)</span> <span class="n">d1</span><span class="p">,</span>
<span class="p">(</span><span class="k">SELECT</span> <span class="mi">0</span> <span class="n">d</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">1</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">2</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">3</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">4</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">5</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">6</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">7</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">8</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">9</span><span class="p">)</span> <span class="n">d2</span><span class="p">,</span>
<span class="p">(</span><span class="k">SELECT</span> <span class="mi">0</span> <span class="n">d</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">1</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">2</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">3</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">4</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">5</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">6</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">7</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">8</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">9</span><span class="p">)</span> <span class="n">d3</span><span class="p">,</span>
<span class="p">(</span><span class="k">SELECT</span> <span class="mi">0</span> <span class="n">d</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">1</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">2</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">3</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">4</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">5</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">6</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">7</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">8</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">9</span><span class="p">)</span> <span class="n">d4</span><span class="p">,</span>
<span class="p">(</span><span class="k">SELECT</span> <span class="mi">0</span> <span class="n">d</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">1</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">2</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">3</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">4</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">5</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">6</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">7</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">8</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">9</span><span class="p">)</span> <span class="n">d5</span><span class="p">,</span>
<span class="p">(</span><span class="k">SELECT</span> <span class="mi">0</span> <span class="n">d</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">1</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">2</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">3</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">4</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">5</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">6</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">7</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">8</span> <span class="k">UNION</span> <span class="k">ALL</span> <span class="k">SELECT</span> <span class="mi">9</span><span class="p">)</span> <span class="n">d6</span>
<span class="k">DELETE</span> <span class="k">FROM</span> <span class="n">tests</span><span class="p">.</span><span class="n">fb</span> <span class="k">WHERE</span> <span class="n">id</span> <span class="o">></span> <span class="mi">0</span> <span class="k">AND</span> <span class="p">(</span><span class="k">MOD</span><span class="p">(</span><span class="n">id</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">OR</span> <span class="k">MOD</span><span class="p">(</span><span class="n">id</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span>
</code></pre></div></div>
<p>Создадим функцию, которая будет находить нужную страницу в БД <a href="https://en.wikipedia.org/wiki/Binary_search_algorithm">бинарным поиском</a> и возвращать стартовый id:</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">DROP</span> <span class="k">FUNCTION</span> <span class="n">IF</span> <span class="k">EXISTS</span> <span class="n">tests</span><span class="p">.</span><span class="n">BINID</span><span class="p">;</span>
<span class="k">DELIMITER</span> <span class="o">//</span>
<span class="k">CREATE</span> <span class="k">FUNCTION</span> <span class="n">tests</span><span class="p">.</span><span class="n">BINID</span><span class="p">(</span><span class="n">pageNumber</span> <span class="nb">INT</span><span class="p">,</span> <span class="n">pageSize</span> <span class="nb">INT</span><span class="p">)</span> <span class="k">RETURNS</span> <span class="nb">INT</span> <span class="k">DETERMINISTIC</span>
<span class="k">BEGIN</span>
<span class="k">DECLARE</span> <span class="n">L</span><span class="p">,</span> <span class="n">R</span><span class="p">,</span> <span class="n">M</span><span class="p">,</span> <span class="n">CID</span> <span class="nb">INT</span> <span class="k">DEFAULT</span> <span class="mi">0</span><span class="p">;</span>
<span class="k">DECLARE</span> <span class="n">REQCID</span> <span class="nb">INT</span> <span class="k">DEFAULT</span> <span class="mi">0</span><span class="p">;</span>
<span class="k">SET</span> <span class="o">@</span><span class="n">REQCID</span> <span class="o">=</span> <span class="p">(</span><span class="n">pageNumber</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="n">pageSize</span><span class="p">;</span>
<span class="k">SELECT</span> <span class="n">id</span> <span class="k">INTO</span> <span class="o">@</span><span class="n">L</span> <span class="k">FROM</span> <span class="n">tests</span><span class="p">.</span><span class="n">fb</span> <span class="k">ORDER</span> <span class="k">BY</span> <span class="n">id</span> <span class="k">ASC</span> <span class="k">LIMIT</span> <span class="mi">1</span><span class="p">;</span>
<span class="k">SELECT</span> <span class="n">id</span> <span class="k">INTO</span> <span class="o">@</span><span class="n">R</span> <span class="k">FROM</span> <span class="n">tests</span><span class="p">.</span><span class="n">fb</span> <span class="k">ORDER</span> <span class="k">BY</span> <span class="n">id</span> <span class="k">DESC</span> <span class="k">LIMIT</span> <span class="mi">1</span><span class="p">;</span>
<span class="n">WHILE</span> <span class="o">@</span><span class="n">L</span> <span class="o"><</span> <span class="o">@</span><span class="n">R</span> <span class="k">DO</span>
<span class="k">SET</span> <span class="o">@</span><span class="n">M</span> <span class="o">=</span> <span class="p">(</span><span class="o">@</span><span class="n">L</span> <span class="o">+</span> <span class="o">@</span><span class="n">R</span><span class="p">)</span> <span class="n">DIV</span> <span class="mi">2</span><span class="p">;</span>
<span class="k">SELECT</span> <span class="k">COUNT</span><span class="p">(</span><span class="n">id</span><span class="p">)</span> <span class="k">INTO</span> <span class="o">@</span><span class="n">CID</span> <span class="k">FROM</span> <span class="n">tests</span><span class="p">.</span><span class="n">fb</span> <span class="k">WHERE</span> <span class="n">id</span> <span class="o"><=</span> <span class="o">@</span><span class="n">M</span><span class="p">;</span>
<span class="n">IF</span> <span class="o">@</span><span class="n">CID</span> <span class="o">></span> <span class="o">@</span><span class="n">REQCID</span> <span class="k">THEN</span> <span class="k">SET</span> <span class="o">@</span><span class="n">R</span> <span class="o">=</span> <span class="o">@</span><span class="n">M</span><span class="p">;</span>
<span class="k">ELSE</span> <span class="k">SET</span> <span class="o">@</span><span class="n">L</span> <span class="o">=</span> <span class="o">@</span><span class="n">M</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
<span class="k">END</span> <span class="n">IF</span><span class="p">;</span>
<span class="k">END</span> <span class="n">WHILE</span><span class="p">;</span>
<span class="k">RETURN</span> <span class="o">@</span><span class="n">L</span><span class="p">;</span>
<span class="k">END</span><span class="o">//</span>
<span class="k">DELIMITER</span> <span class="p">;</span>
</code></pre></div></div>
<p>Результаты:</p>
<blockquote>
<p>SELECT id FROM tests.fb ORDER BY id ASC LIMIT 50 OFFSET 4950</p>
<p>50 row(s) returned 0.015 sec / 0.000 sec</p>
<p>SELECT id FROM tests.fb WHERE id >= tests.BINID(100, 50) ORDER BY id ASC LIMIT 50</p>
<p>50 row(s) returned 0.078 sec / 0.000 sec</p>
</blockquote>
<blockquote>
<p>SELECT id FROM tests.fb ORDER BY id ASC LIMIT 50 OFFSET 24950</p>
<p>50 row(s) returned 0.125 sec / 0.000 sec</p>
<p>SELECT id FROM tests.fb WHERE id >= tests.BINID(500, 50) ORDER BY id ASC LIMIT 50</p>
<p>50 row(s) returned 2.422 sec / 0.000 sec</p>
</blockquote>
<p>10 миллионов строк:</p>
<blockquote>
<p>SELECT id FROM tests.fb ORDER BY id ASC LIMIT 50 OFFSET 249950</p>
<p>50 row(s) returned 0.438 sec / 0.000 sec</p>
<p>SELECT id FROM tests.fb WHERE id >= tests.BINID(5000, 50) ORDER BY id ASC LIMIT 50</p>
<p>50 row(s) returned 26.422 sec / 0.000 sec</p>
</blockquote>
<p>Источники вдохновения по теме: <a href="https://mariadb.com/kb/en/pagination-optimization/">Pagination Optimization</a>, <a href="https://wiki.postgresql.org/images/3/35/Pagination_Done_the_PostgreSQL_Way.pdf">Pagination Done the PostgreSQL Way</a>.</p>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<h1 id="youtube-darknet-tv"><a name="head-ytdntv"></a>YouTube DarkNet TV</h1>
<p>Даркнет - как много в этом слове. Это уже не только общее название скрытых / оверлейных интернет-сетей. Этим словом молодёжь называет всякое явление, которое есть скрытая, искажённая, обратная сторона известной реальности. Ниже речь пойдёт об интернет-телевидении, которое представляет собой “даркнет ютуба”, т.е. направление в телеискусстве, раскрывающее малоизвестную часть YouTube.</p>
<p><a href="https://ytdntv.ml/">YouTube DarkNet TV</a> - это интернет-телеканал, редакторы и автоматизированные модули которого с помощью <a href="https://developers.google.com/youtube/v3/">YouTube Data API</a> отбирают самую мякотку Ютуба - видео и каналы с малым количеством просмотров и подписчиков, на которых запечатлены страннейшие видеоотрывки, личности, анимация.</p>
<p>YouTube DarkNet TV реализован в виде бэкенда с базой данных (gin-gonic + MySQL), куда собираются и где хранятся видео, редакторской панели и фронтенда с уникальным дизайном в виде старого обосранного телевизора, который управляется jQuery, и принимает сигналы от <a href="https://developers.google.com/youtube/iframe_api_reference">YouTube IFrame API</a>.</p>
<p>Редакция с радостью принимает и обрабатывает присылаемые видео (кнопкой Add video).</p>
<p>Данный материал является рекламой сервиса <a href="https://ytdntv.ml/">YouTube DarkNet TV</a>.</p>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<h1 id="гигиена-ума"><a name="head-meditation"></a>Гигиена ума</h1>
<p>Часто гоняешь навязчивые мысли по кругу? Тревожишься без объективных причин? Ощущаешь внутреннюю пустоту и бессмысленность существования? Огрызаешься и презираешь окружающих, злишься на обстоятельства? Считаешь себя не достойным лучшего или наоборот - достойным лучшего, - но ничего не можешь изменить? Потерял вкус к жизни, страдаешь от одиночества? Или ещё что-то другое? Существует крутой и универсальный рецепт для восстановления психики, инструмент для гигиены ума, Святой Грааль для достижения состояния потока, круглосуточный доступ к божественному и духовному - и абсолютно бесплатно! Властьимущие тысячелетиями скрывали этот СЕКРЕТ, и вот, наконец, агенты психовойск свободного человечества планеты Земля, наконец, раскрыли его.</p>
<p>Это секретное оружее - МЕДИТАЦИЯ. И хотя наука пока не может дать ответ, как это всё работает, тем не менее проведено большое количество исследований, экспериментов, говорящих что <a href="https://en.wikipedia.org/wiki/Mindfulness#Applications">это отлично работает</a> при проблемах с психикой. Но медитации ещё и инструмент биохакера, и дают огромный бафф на здоровье - иммунитет, органы дыхания, сердечно-сосудистую систему, когнитивные функции, на механизмы старения, гомеостаз организма вообще (достаточно загуглить “meditation respiratory system”, “meditation immune system” и всё такое…).</p>
<p>При всех этих громадных плюсах этот инструмент - идеально подходит для очень ленивых и безвольных людей, т.к. максимально простой и естественный. Если в двух словах и по-простому: всё, что нужно сделать, - это найти 10 минут в своём забитом расписании, отключить уведомления и попросить окружающих тебя не беспокоить, сесть/лечь, закрыть глаза, расслабиться и следить за дыханием - осознавать (для начала - например, внутри себя проговаривать) “вдох” и “выдох”. Больше ничего - буквально.</p>
<p>Однако, мозг, привыкший к тому, что его постоянно дёргают за ниточки “дешёвых” клиповых удовольствий вроде мессенджеров, соцсетей, просмотра новостей (“дешёвых” в том смысле, что даже эти небольшие всплески нейромедиаторов удовольствия - не являются наградой за удовлетворение каких-либо физиологических или интеллектуальных потребностей, и мозг вырабатывает привычку это делать всё чаще и чаще; в этом отношений нет никаких отличий от мозга наркозависимого) - в условиях такой информационной депривации начнёт подсовывать всё больше и больше мыслительного материала. Нужно спокойно и расслабленно (расслабон - это вообще главный фактор успеха в жизни) наблюдать за этими мыслями, проговорить их про себя, но потом возвратить внимание к своему дыханию, ко вдохам и выдохам. Сначала это будет тяжело: вроде бы сел и начал медитировать, а через полчаса очнулся от какой-то навязчивой мысли, которую гоняешь последние 29 минут. Это нормально, со временем навык медитации, навык контроля собственного внимания вырастет. Как и в любом деле, тут важна регулярность; можно выделять время для медитаций не так много, но делать это нужно каждый день.</p>
<p>Впрочем, даже от влезающих в тишину и темноту навязчивых мыслей есть своя польза: то, что они так активно “требуют” внимания - показатель того, что психическое напряжение по этим вопросам накопилось очень большое, и эти вопросы требуют сознательного решения. Но теперь они не фоновые процессы, от которых в течение дня постоянно отмахиваешься, занимаясь как будто более важной насущной текучкой, а интеллектуальная задача, которую нужно решить - так сказать, закрыть кейс. Со временем, когда навязчивые мысли будут обработаны, на поверхность сознания начнут вылезать логи подсознательных процессов. Когда мы застреваем в жизни, это всегда происходит из-за того, что мы не можем связать себя с чувствами, вызываемыми этой ситуацией. Так что медитации - ещё и отличный инструмент по работе с подсознательными страхами и переживаниями. Медитации позволят перевести саморефлексию на качественно новый уровень и познать ту самую “самость”, развить восприятие себя и своего места в мире.</p>
<p>Ещё один положительный аспект медитаций - в сферу внимания начинает постепенно возвращаться восприятие собственного тела. Учитывая что наше физиологическое тело - единственный способ взаимодействия с реальностью, возвращение связи с собственным телом улучшит связь с реальностью: с людьми, с природой. Так, медитируя, тренируя навык сознательной концентрации на внутренних ощущениях, мы вдруг обнаруживаем зажимы в мышцах тела, или даже, возможно, какие-то неприятные патологические ощущения, требующие медицинского вмешательства. Поскольку многие заболевания имеют психосоматическую природу (стресс и тревога -> постоянный выброс гормонов стресса -> нарушение гомеостаза организма), медитативное глубокое расслабление становится мощным фундаментом для саморегенерации.</p>
<p>Медитации помогают выработать самый важный навык, который можно применить для достижения своих целей, - вхождение в поток, вхождение в состояние “здесь и сейчас”. Обладая возможностью управлять концентрацией и направлением собственного внимания, ты можешь с лёгкостью двигаться по направлению к тому, что ты считаешь должным сделать, к тому, как реальность проявится через тебя. То, о чём ты думаешь, мысли, которым ты позволяешь роиться в своей голове, - двигают тебя в этом определённом направлении. Если ты научился контролировать своё внимание, ты можешь двигаться в нужном тебе направлении.</p>
<p>В конечном счёте медитации - ещё и путь к открытию в себе доступа к духовному миру, к божественному, в хорошем смысле этих слов. Всё, что человек присваивает в качестве своих достижений, всё, что человек совершает - результат не управляемых его волей обстоятельств: всё, что происходило в мире, все события, все катаклизмы, каждый взмах крыла каждого комара, каждый химический процесс в каждой бактерии в кишечнике каждого тигра - всё играло свою роль в том, что ты со своим набором ген, пережив обстоятельства, которые тебя сопровождали в течение жизни, дожил до этой минуты и читаешь эти строки (повезло!). Нет никакого другого момента, кроме здесь и сейчас, а каждая частица пространства неразрывно связана с другой. Именно об этом следует помнить всегда, именно это чувство и вырабатывают медитации.</p>
<p>Мотивирующие видео по теме: <a href="https://www.youtube.com/watch?v=9Him1Sd9pEc">“Медитация осознанности: ясное мышление, покой, убрать негатив. Как научиться медитировать”</a>, <a href="https://www.youtube.com/watch?v=0HySud3G97g">“Медитация для начинающих. Проще некуда.”</a>, <a href="https://www.youtube.com/watch?v=eObsYIaHMcI">“10 минут чтобы стать счастливее”</a>.</p>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<h1 id="дайджест-интересностей"><a name="head-digest"></a>Дайджест интересностей</h1>
<ul>
<li>
<p>Пасхалки <a href="https://geektimes.ru/post/241122/">Android 4.2</a>, <a href="https://habrahabr.ru/post/337340/">Android 8.0</a></p>
</li>
<li>
<p>Ocumetics Technology уже <a href="https://tproger.ru/news/bionic-lens/">тестирует бионические линзы</a></p>
</li>
<li>
<p>Lyrebird тестирует <a href="https://tproger.ru/news/lyrebird-ai-makes-voice/">генератор голосового аватара</a></p>
</li>
<li>
<p>Разработчик таких культовых компьютерных игр, как <a href="https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D0%B5_%D1%87%D1%83%D0%B4%D0%B5%D1%81_%28%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D0%B0%D1%8F_%D0%B8%D0%B3%D1%80%D0%B0%29">“Поле чудес”</a>, Вадим Башуров, оказывается, активен на Хабре и <a href="https://habrahabr.ru/users/papabubadiop/posts/">пишет классные приложухи и юморные посты</a></p>
</li>
<li>
<p><a href="https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BA%D0%BE%D0%B3%D0%BD%D0%B8%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D1%85_%D0%B8%D1%81%D0%BA%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9">Список когнитивных искажений</a>: знай врага в лицо! А на случай, если кто-то говорит о том, что «человек не меняется», расскажите ему о <a href="https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BF%D0%BB%D0%B0%D1%81%D1%82%D0%B8%D1%87%D0%BD%D0%BE%D1%81%D1%82%D1%8C">нейропластичности</a> — свойстве мозга, заключающемся в возможности изменяться под действием опыта.</p>
</li>
<li>
<p>Удивительная и страшная теория <a href="https://ru.wikipedia.org/wiki/%D0%A2%D0%BE%D0%BD%D0%BA%D0%B0%D1%8F_%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%92%D1%81%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9#.D0.9A.D0.BE.D1.81.D0.BC.D0.BE.D0.BB.D0.BE.D0.B3.D0.B8.D1.87.D0.B5.D1.81.D0.BA.D0.B8.D0.B9_.D0.B5.D1.81.D1.82.D0.B5.D1.81.D1.82.D0.B2.D0.B5.D0.BD.D0.BD.D1.8B.D0.B9_.D0.BE.D1.82.D0.B1.D0.BE.D1.80">космологического естественного отбора</a></p>
</li>
<li>
<p><em>На самом деле</em> использование TLS <a href="https://habrahabr.ru/company/neobit/blog/334714/">не защищает от MITM-атак</a> в случае компрометации закрытого ключа</p>
</li>
<li>
<p><a href="https://habrahabr.ru/company/cloud4y/blog/336296/">ROPEMAKER</a> — вид атаки через электронную почту, дающий злоумышленнику возможность удаленно изменять контент письма (речь идёт о письмах с HTML) в любое время после доставки</p>
</li>
<li>
<p>Отличная и подробная статья про <a href="https://habrahabr.ru/post/335906/">криптографию на эллиптических кривых</a></p>
</li>
<li>
<p>Хотите узнать, <a href="https://ru.wikipedia.org/wiki/%D0%92%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_%D1%88%D0%BA%D0%B0%D0%BB%D0%B0_%D0%B4%D0%B0%D0%BB%D1%91%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B1%D1%83%D0%B4%D1%83%D1%89%D0%B5%D0%B3%D0%BE">что будет через миллиарды лет</a>?</p>
</li>
<li>
<p><a href="https://ru.wikipedia.org/wiki/%D0%A5%D0%B8%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%8D%D0%B2%D0%BE%D0%BB%D1%8E%D1%86%D0%B8%D1%8F">Всё, что нужно знать</a> о возникновении жизни на Земле</p>
</li>
<li>
<p>Серия статей на Хабрахабре про <a href="https://habrahabr.ru/company/echelon/blog/319334/">Интернет-разведку</a></p>
</li>
<li>
<p><a href="https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%B3%D0%BD%D0%B8%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F_%D0%BF%D1%81%D0%B8%D1%85%D0%BE%D1%82%D0%B5%D1%80%D0%B0%D0%BF%D0%B8%D1%8F">Когнитивная психотерапия</a> — форма психотерапии, основанная на предположении, что причины психологических проблем и нервно-психических расстройств человека кроются в ошибках мышления, и направленная на изменение нелогичных или нецелесообразных мыслей и убеждений человека</p>
</li>
<li>
<p><a href="https://www.youtube.com/watch?v=jNQXAC9IVRw">Самое первое видео на YouTube</a></p>
</li>
<li>
<p>Из времён динозавров своими листочками (и другими частями) нам машут <a href="https://ru.wikipedia.org/wiki/%D0%96%D0%B8%D0%B2%D1%8B%D0%B5_%D0%B8%D1%81%D0%BA%D0%BE%D0%BF%D0%B0%D0%B5%D0%BC%D1%8B%D0%B5">«живые ископаемые»</a></p>
</li>
<li>
<p><a href="http://brianbrianbrianbrian.com/">Brian</a> создаёт крутую психоделическую <a href="https://brianbrian.bandcamp.com/">музыку</a> и <a href="http://cool3dworld.com/">видосы</a></p>
</li>
<li>
<p>Чтобы всегда в нужный день праздновать (или не праздновать) Пасху, пользуйтесь <a href="https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%93%D0%B0%D1%83%D1%81%D1%81%D0%B0_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B4%D0%B0%D1%82%D1%8B_%D0%9F%D0%B0%D1%81%D1%85%D0%B8">алгоритмом Гаусса</a></p>
</li>
<li>
<p><a href="https://ru.wikipedia.org/wiki/%D0%9E%D1%80%D1%83%D0%B6%D0%B8%D0%B5_%D0%BD%D0%B0_%D0%BD%D0%BE%D0%B2%D1%8B%D1%85_%D1%84%D0%B8%D0%B7%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%B0%D1%85">Оружие на новых физических принципах</a></p>
</li>
<li>
<p><a href="https://tproger.ru/news/wormbrain-in-arduino/">Учёные успешно загрузили мозг круглого червя в робота на Arduino</a></p>
</li>
<li>
<p>Существует легенда, что у русских крестьян был свой метод <a href="http://mathemlib.ru/books/item/f00/s00/z0000005/st017.shtml">умножения двух чисел</a></p>
</li>
<li>
<p>В сутках 5^5 * 4^4 * 3^3 * 2^2 * 1^1 миллисекунд</p>
</li>
<li>
<p><a href="http://telegra.ph/Anonimnyj-telefon-12-15">Сценарии деанонимизации</a> по мобильному телефону</p>
</li>
<li>
<p><a href="http://telegra.ph/Formirovanie-i-izmenenie-ustanovok-obshchestvennogo-soznaniya-12-04">Формирование и изменение установок общественного сознания</a></p>
</li>
<li>
<p><a href="http://www.inbflat.net/">20 видео</a>, которые можно включать в любом сочетании и получать удивительную музыку</p>
</li>
<li>
<p>В некоторых культурах до сих пор искусственно <a href="https://ru.wikipedia.org/wiki/%D0%98%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_%D0%B4%D0%B5%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D1%8F_%D1%87%D0%B5%D1%80%D0%B5%D0%BF%D0%B0">деформируют черепа</a></p>
</li>
<li>
<p><a href="https://www.sciencealert.com/birds-see-magnetic-fields-cryptochrome-cry4-photoreceptor">Птички видят</a> магнитные поля Земли</p>
</li>
<li>
<p>YouTube вкрысу <a href="http://musicweird.blogspot.com/2014/11/what-are-auto-generated-by-youtube.html">автоматически генерирует каналы</a> для музыкальных треков (<a href="https://www.youtube.com/channel/UC2B06SwPy2v5ER0sJfu2C0g/about">пример</a>); вообще, музыкальная база YouTube видится самой полной на данный момент, жаль, качество автоматически загружаемого материала оставляет желать лучшего…</p>
</li>
<li>
<p><a href="https://habr.com/ru/post/543282/">Утечка факта посещения</a> стороннего сайта на основе скорости загрузки favicon из кэшей Chrome</p>
</li>
<li>
<p><a href="http://dinaburg.org/bitsquatting.html">Bitsquatting</a> - перехват интернет-трафика в результате аппаратных ошибок (изменения битов, например, адресов хостов)</p>
</li>
</ul>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<p><em>До следующего прихода! Живы будем - не помрём!</em></p>Привет из ада! Это четвёртый выпуск журнала «Хиккинги». Сегодня в номере: «Что нами движет?». Философия антиволевика. «AutoML». Обзор Google AutoML. «Pagination». Особенности реализации постраничной загрузки записей из БД. «YouTube DarkNet TV». Партнёрский материал о телевидении XXI века. «Гигиена ума». Всё, что вы знаете и что не знаете о медитации. «Дайджест интересностей». Да, и такое бывает! Что нами движет? Вам случалось любоваться Матрицей, её гениальностью?.. Миллиарды людей живут полноценной жизнью… во сне. (агент Смит, фильм “Матрица”) - Всё это нереально? - Что есть реальность? И как определить ее? Весь набор ощущений: зрительных, осязательных, обонятельных — это сигналы рецепторов, электрические импульсы, воспринятые мозгом. (Нео и Морфеус, фильм “Матрица”) Каждый человек живёт в собственной реальности, имеющей не очень много общего с реальностью других. Ведь восприятие окружающего мира, людей, событий зависит от текущей, моментальной активности мозга. Человеческий мозг является сетью из более чем 85 миллиардов нейронов, а число соединений между ними стремится к поистине громадным числам. (Для сравнения: полностью исследованный коннектом дождевого червя, нервная система которого состоит из 300 нейронов, насчитывает 7000 соединений между нейронами.) Образование и изменение связей между нейронами обусловлено: 1) ДНК - генетическим кодом, полученным в результате слияния генетического кода родителей; 2) нервной деятельностью - воспитание, жизненный опыт, переживания: да, даже простая простая мысль может изменить структуру соединений между нейронами. ДНК меняется в течение жизни - в процессе накопления мутаций: иногда они просто случаются, самопроизвольно, но случаются и из-за воздействия окружающей среды (радиация, мутагенные вещества, вирусы). Нервная деятельность тоже не является чем-то упорядоченным и неизменным: начиная с того, что при детальном рассмотрении окружающий мир очень хаотичен и непредсказуем, заканчивая тем, что мозг, как центральный процессор нервной деятельности, обслуживается, питается и вообще - обслуживается - веществами из кровеносной системы. Электрические импульсы в мозге передаются химически - с помощью особых веществ - нейромедиаторов. От их количественного изменения - переизбытка или недостатка определённых нейромедиаторов - зависит состояние психики человека, т.е. процесс высшей нервной деятельности - сознание, ощущения, восприятие, память, мышление, намерения и т.п. Именно этим обуславливается эффект от кофе, шоколада, алкоголя, наркотиков: преодолевая защитную систему мозга (гемато-энцефалический барьер) психоактивные вещества из кровеносной системы попадают в мозг и воздействуют на количество нейромедиаторов в нейронах, что приводит к тому, что мозг в целом начинает работать по-другому, потому что фактически меняются синаптические веса нейронов, т.е. вероятности прохождения различными путями электрохимического сигнала от одних нейронов к другим. Например, алкоголь приводит к смещению баланса самых важных нейромедиаторов и их рецепторов (нейронов, восприимчивых к конкретным типам нейромедиаторов): дофамина (“система поощрения”; изменение высших когнитивных функций: реакции, внимания), серотонина (усиление передачи сигнала между нейронами; усиление восприимчивости серотониновых рецепторов, что приводит к ощущению удовольствия и опьяняющих эффектов), ГАМК (приводит к торможению нервной системы). Употребление ЛСД, который представляет собой молекулу, близкую по структуре к серотонину, приводит к переизбытку серотонина, что увеличивает «влияние» вторичных сигналов в мозге, и возникают галлюцинации. Не только нейромедиаторы воздействуют на деятельность мозга через рецепторы. Различные железы в мозге и теле выделяют гормоны - активные вещества, регулирующие сложные процессы: рост, развитие, обмен веществ, настроение, чувство голода или насыщения, половое влечение, жажда, эмоции, реакции на изменения условий среды, поддержание гомеостаза (баланса внутренней среды организма). При этом изменение концентрации гормонов (“гормональный фон”) обуславливается, в свою очередь, множество внешних и внутренних факторов: возрастные изменения организма, наследственность, заболевания, климатические и экологические условия, образ жизни, беременность. На механизмы перестроения связей влияет миелин. Постоянно работающие нейроны с течением времени покрываются оболочкой из миелина. Это то самое “белое вещество”, которое значительно повышает эффективность нейронов как проводников электрических импульсов. Это то вещество, которое провоцирует мозг к перестроению своих связей: выработка миелина у ребенка максимальна при рождении, а к семи годам она снижается. С достижением периода полового созревания человека выработка миелина вновь возрастает (это происходит из-за того, что нам, как млекопитающим, нужно осуществить новую настройку своего мозга на поиск брачного партнера), с окончание полового созревания падает. С уровнем миелина можно связать “пластичность” мозга; мозг «миелинирует» весь наш жизненный опыт. Так что если в период юношества у человека будут эпизоды, когда он получает незаслуженное вознаграждение, то он накрепко запоминает, что награду можно получить и без усилий. На формирование связей между нейронами влияет многократное повторение опыта или пережитые сильные эмоции (что по сути механизм воздействия одномоментного выброса гормонов/нейромедиаторов, связанных с системами поощрения). Кроме того, новые отростки у нейронов образуются при его активной стимуляции электроимпульсами (что, к слову, доступно и при магнитной или электрической стимуляции, т.е. активно используемые нейроны могут спровоцировать рост дендритов (приёмников электрических импульсов) других, соседних нейронов, что приведёт к созданию синаптической связи, которая на уровне сознания, возможно, будет восприниматься как неожиданная связь между двумя идеями. Возвратимся к реальности, к общей реальности, которая представляет собой комок традиций, верований - коллективного бессознательного от наших древних предков, которые вышли из пещеры и увидели Хаос; древних предков, чью ДНК мы носим в каждой клетке нашего организма. Возвратимся к нашей реальности из людей и событий, которые сформировали и покрыли миелином основу нашей психики в младенческом и юношеском возрасте. К нашей реальности, где каждый момент времени каждая вдыхаемая или съедамая молекула, каждый фотон, пролетевший миллионы световых лет и попавший в наши глаза, каждый вирус, который преодолел множество систем защит наших организмов, каждое квантовое взаимодействие в процессе химических реакций меняет нас, наше восприятие, эту нашу реальность… Контролируем ли мы своё поведение? Контролируем ли мы своё восприятие? Контролируем ли мы своё будущее? - Если ты уже знаешь будущее, тогда почему тебя удивил мой уход? Или когда тебя спровоцировал репортер? Почему ты вообще ведешь спор, если знаешь, чем все это закончится? - У меня нет выбора. Все предопределено. Даже мои ответы. - А ты лишь переживаешь череду движений? Самое сильное создание во вселенной - на самом деле лишь марионетка. - Мы все марионетки, Лори. Просто я вижу нити. (Доктор Манхэттен и Лори Юпитер, фильм “Хранители”) ↑ к оглавлению AutoML В конце курса Intro to Machine Learning на Kaggle есть “бонусный” (скорее, маркетинговый) урок по использованию Google AutoML Tables. Google Cloud предлагает $300 и 3-месячную триалку для того, чтобы пощупать их облачную платформу. Google AutoML Tables - один из продуктов для автоматизации процесса создания и обучения модели: на вход подаётся датасет (предварительно заливаемый на Google Cloud Storage), указываются target-параметры, бюджет проекта (выраженный во времени работы нод; ~$20 в час за “92 n1-standard-4 equivalent machines in parallel”); на выходе получается модель, которую можно развернуть на мощностях Google Cloud (“$0.005 per GiB per hour per machine”), либо экспортировать в виде TensorFlow package для специального Docker-контейнера и развернуть на своих мощностях. Подготовка Для начала необходимо подключить $300 триалку, чтобы потренироваться бесплатно. Подробно об этом можно почитать на страничке, посвящённой бесплатному использованию продуктов Google Cloud. Создаётся проект (New project), привязываются billing-данные карточки, на счету оказывается $300 кредитов, в локальной валюте, для использования продуктов. После создания проекта необходимо создать Cloud Storage для хранения датасетов (а также результатов batch predictions, самой экспортированной модели). Это делается с помощью функции Create bucket. Создание модели Для создания модели я использовал предлагаемый в курсе на Kaggle AutoML Tables Wrapper. Это обёртка над гугловыми библиотеками для работы с Google Cloud (storage, automl_v1beta1), которая 1) заливает на Google Cloud Storage csv-датасет для обучения, выставляет nullable-флаги у столбцов на основе входных данных, заливает тестовый датасет, для которого нужно получить predictions; 2) отправляет запрос на создание модели с указанием бюджета обучения, target-параметром; 3) скачивает результирующий csv. Получить predictions у модели можно двумя способами: online и batch. Online - в случае, если запросы посылаются к REST-сервису развёрнутой в Google Cloud или у себя модели; batch - если подаётся большой csv/json/BigQuery кусок данных. Подробно о различиях можно прочитать в статье Online versus batch prediction. Для меня различие состояло прежде всего в том, что в случае batch predictions происходящее внутри трудно (невозможно?) отследить: predictions по отдельным строкам различались в batch и online-результатах; кроме того, в batch prediction results был файл с ошибками, из которых следовало, что некоторые не-nullable столбцы содержали null (хотя этот флаг во wrapper’е выставляется по объединению данных train- и test-датасетов). Причину этого вижу в своей криворукости либо в необходимости более тщательной очистки и подготовки и проверки метаданных перед обучением, либо в beta-статусе самой платформы AutoML Tables. В случае возникновения ошибок при использовании wrapper’а рекомендую также иметь в виду тред на Kaggle: в силу определённых причин модель может работать только с датасетами, расположенных в bucket’ах того же региона (рекомендуется использовать us-central1). В самом простом случае необходимо задать соответствующие переменные: amw = AutoMLTablesWrapper(project_id=PROJECT_ID, bucket_name=BUCKET_NAME, dataset_display_name=DATASET_DISPLAY_NAME, train_filepath=TRAIN_FILEPATH, test_filepath=TEST_FILEPATH, target_column=TARGET_COLUMN, id_column=ID_COLUMN, model_display_name=MODEL_DISPLAY_NAME, train_budget=TRAIN_BUDGET) Запустить обучение: amw.train_model() и получить результаты: amw.get_predictions() Использование Google Cloud Console В результате обучения (если всё прошло успешно) в Cloud Console в разделе AutoML Tables появляется обученная модель, по которой можно увидеть основные статистики и оценки ошибки предсказаний. Сначала необходимо развернуть (deploy) модель через контекстное меню (More options). После успешного завершения процесса (по умолчанию уведомления обо всех событиях в облаке будут прилетать в виде писем на гуглопочту), можно перейти к непосредственной работе с моделью (или же сразу экспортировать). Во вкладке Test & Use можно запустить Batch predictions, отправить запрос через форму во вкладке Online prediction, а также экспортировать модель в разделе Export your model. Batch predictions выполняется по csv-файлу (предварительно его нужно залить в один из backet’ов в Cloud storage, но обязательно в том же регионе, где и развёрнута модель) или по результату запроса из BigQuery (здесь нужно отметить, что поля в csv могут иметь имена, например, начинающиеся с цифры, которые в BigQuery будут некорректными, т.о. они не сматчатся, и результат запроса нельзя будет импортировать в качестве входных данных для batch prediction, так что корректируйте все входные данные ДО обучения). Результат тоже выгружается либо в BigQuery, либо в Cloud storage bucket (в том же регионе); в результате будет файл с предсказаниями и файл с ошибками. Можно сделать ручной запрос к развёрнутой модели на вкладке Online prediction, просто заполнив все поля в форме и нажав Predict. Экспортирование и разворачивание модели Модель можно экспортировать либо из контекстного меню у элемента списка в разделе AutoML Tables либо уже в свойствах самой модели в разделе Export your model. Чтобы скачать модель (или развернуть вручную), сначала нужно её экспортировать в один из backet’ов в Cloud storage, а потом, используя утилиту gsutil Google Cloud SDK скопировать файлы модели к себе. Нужно отметить, что приведённая на странице экспортирования команда gsutil cp -r gs://target/* ./download_dir не сработает, поскольку среди файлов, генерируемых при экспорте есть директории с символами, которые являются некорректными в Windows (по сути и в *nix-системах тоже, но там ошибка возникнет чуть позже, при запуске докер-контейнера). Поэтому лучше зайти в браузер Cloud Storage и там исследовать и выбрать нужные файлы (всё, что без спецсимволов типа $), а потом их скачать списком, например: gsutil -m cp -r "gs://automl-exper-export/model-export/tbl/tf_saved_model-house_prices_model-2021-04-24T12:33:44.446633Z/assets.extra/" "gs://automl-exper-export/model-export/tbl/tf_saved_model-house_prices_model-2021-04-24T12:33:44.446633Z/assets/" "gs://automl-exper-export/model-export/tbl/tf_saved_model-house_prices_model-2021-04-24T12:33:44.446633Z/saved_model.pb" "gs://automl-exper-export/model-export/tbl/tf_saved_model-house_prices_model-2021-04-24T12:33:44.446633Z/variables/" ./houses Перед использованием Google Cloud SDK необходимо выполнить gcloud init и следовать указаниям. После ознакомления с руководством по экспорту модели Exporting models, можно создать и запустить докер-контейнер, указав местоположение файлов модели: docker run -v `pwd`/model-export/tbl/new_folder_name:/models/default/0000001 -p 8080:8080 -it gcr.io/cloud-automl-tables-public/model_server В результате на порту 8080 будет работать REST-сервер, которому можно отправлять запросы в формате JSON в объекте instances: { "instances": [ { "Id": 1461, "MSSubClass": 20, "MSZoning": "RH", "LotFrontage": 80 // ... // other columns } ] } Пример отправки запроса через curl: curl -X POST --data @request.json http://192.168.8.103:8080/predict В ответе получает объект predictions: {"predictions": 126945.6640625} Из DataFrame можно сформировать JSON, например, следующим образом: test = pd.read_csv("test.csv") inputs_json = test.iloc[:,1:] // without first ID column inputs_json.to_json("req_all.json") и добавив “обёртку”: { "instances": [ // content of req_all.json file ] } Отправка запросов к Cloud AutoML API Для программной отправки запросов к API (например, из python-библиотеки - к развёрнутой модели в Google Cloud) нужно подключить Cloud AutoML API в разделе APIs & Services и там же создать service account в подразделе Credentials, выставив role = Owner, скачать ключ во вкладке Keys у созданного аккаунта. Чтобы google.cloud.automl_v1beta1 мог взаимодействовать в Cloud AutoML API нужно задать путь к скачанному ключу через переменную окружения GOOGLE_APPLICATION_CREDENTIALS. А также иметь под рукой те же параметры, которые задавали для AutoML Tables Wrapper. В итоге, из Jupyter Notebook можно отправить запрос к развёрнутой в Google Cloud модели так: %env GOOGLE_APPLICATION_CREDENTIALS d:\YOUR_SERVICE_KEY.json project_id = 'YOUR_PROJECT_ID' compute_region = 'us-central1' model_display_name = 'YOUR_MODEL_NAME' from google.cloud import automl_v1beta1 as automl client = automl.TablesClient(project=project_id, region=compute_region) response = client.predict( model_display_name=model_display_name, inputs=inputs ) for result in response.payload: print( "Predicted value: {}".format(result.tables.value) ) Входные данные TablesClient ожидает в виде dict, поэтому нужно преобразовать из Series в нативные python-объекты. Я это сделал (возможно, это неправильно и некрасиво) так: inputs_pre = test.iloc[0,1:] // one row for example, without first ID column inputs = {} for i, v in inputs_pre.items(): if type(v) == str or type(v) == float: inputs[i] = v else: inputs[i] = v.item() Резюме Технология интересная, прикольная, но, полагаю, для серьёзных DS/ML-инженеров пока сыровата и довольно неконтролируема (слишком ограниченный и плохо документированный формат входных данных; экспорт модели только в виде очень тяжёлого и “закрытого” контейнера с привязанным REST-сервером). Ну, и (наверное) дороговато. Тем не менее, для каких-то простых задач всё сработает из коробки, были бы достаточные бюджеты; например, в результате часа обучения (это обошлось мне в бесплатные ~$20) полученная модель (без какого-либо тюнинга) перекинула меня в top 12% в учебном соревновании на классической Ames Housing dataset. См. также: How to Deploy your AutoML Model in a Cost-effective Way csv2json ↑ к оглавлению Pagination Реализация типичной функциональности на многих сайтах - постраничного вывода (pagination) - имеет свои особенности, которые нужно учитывать, чтобы это не стало узким местом производительности в базе данных. Типичная наивная реализация выборки из БД для постраничного вывода представляет собой конструкцию вида ORDER BY $id1, $id2... OFFSET ($pageNum-1)*$pageSize LIMIT $pageSize ($var здесь и далее - именованные аргументы запроса; это не про PHP). Поля, по которым будет выполнена сортировка (ORDER BY $id1, $id2...) для постраничного вывода должны быть проиндексированы (CREATE INDEX). Нужно отказаться от использоваться OFFSET. Проблема в том, что сначала выбираются ВСЕ записи из таблицы, а потом указанное в OFFSET число записей пропускается. Вместо OFFSET нужно использовать фильтрацию в WHERE, фильтруя записи по $id < $offset. Но что, если в id есть пропуски? Поэтому ещё нужно определиться с типом вывода: будет ли это бесконечный скролл или навигация по пронумерованному списку страниц. Бесконечный скролл - реализовать намного проще, и случай с пропусками имеет простое решение. Будем добавлять к запросу $current_id, с которого начинается отсчёт, т.е. будем отбирать те записи, у которых WHERE id > $current_id. Для первой страницы (начальный вывод бесконечного скролла) положим $current_id равным 0. Для того, чтобы определить, остались ли ещё записи, можно сравнивать количество уже загруженных и выведенных записей с общим количеством или в запросе делать LIMIT $pageSize+1, но выводить только $pageSize элементов и проверять, сколько элементов было фактически получено. Если же нужна именно навигация по пронумерованному списку, то либо придётся реализовывать сложные схемы с сохранением в БД и пересчётом номера страницы, связанной с записью, или количества предшествующих записей, либо пользоваться OFFSET, который может привести к проблемам с производительностью на больших массивах данных. Бонусная часть: бинарный поиск по id в таблице Этот подход представляет только академический интерес, т.к. производительность на несколько порядков ниже OFFSET из-за необходимости постоянно пересчитывать количество записей до границ поиска. Добавляем много записей в тестовую таблицу (с индексом id) и создаём искусственные пропуски. INSERT INTO tests.fb(id) SELECT 100000*d6.d+d5.d*10000+d4.d*1000+d3.d*100+d2.d*10+d1.d id FROM (SELECT 0 d UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) d1, (SELECT 0 d UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) d2, (SELECT 0 d UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) d3, (SELECT 0 d UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) d4, (SELECT 0 d UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) d5, (SELECT 0 d UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) d6 DELETE FROM tests.fb WHERE id > 0 AND (MOD(id, 3) = 0 OR MOD(id, 5) = 0) Создадим функцию, которая будет находить нужную страницу в БД бинарным поиском и возвращать стартовый id: DROP FUNCTION IF EXISTS tests.BINID; DELIMITER // CREATE FUNCTION tests.BINID(pageNumber INT, pageSize INT) RETURNS INT DETERMINISTIC BEGIN DECLARE L, R, M, CID INT DEFAULT 0; DECLARE REQCID INT DEFAULT 0; SET @REQCID = (pageNumber-1)*pageSize; SELECT id INTO @L FROM tests.fb ORDER BY id ASC LIMIT 1; SELECT id INTO @R FROM tests.fb ORDER BY id DESC LIMIT 1; WHILE @L < @R DO SET @M = (@L + @R) DIV 2; SELECT COUNT(id) INTO @CID FROM tests.fb WHERE id <= @M; IF @CID > @REQCID THEN SET @R = @M; ELSE SET @L = @M+1; END IF; END WHILE; RETURN @L; END// DELIMITER ; Результаты: SELECT id FROM tests.fb ORDER BY id ASC LIMIT 50 OFFSET 4950 50 row(s) returned 0.015 sec / 0.000 sec SELECT id FROM tests.fb WHERE id >= tests.BINID(100, 50) ORDER BY id ASC LIMIT 50 50 row(s) returned 0.078 sec / 0.000 sec SELECT id FROM tests.fb ORDER BY id ASC LIMIT 50 OFFSET 24950 50 row(s) returned 0.125 sec / 0.000 sec SELECT id FROM tests.fb WHERE id >= tests.BINID(500, 50) ORDER BY id ASC LIMIT 50 50 row(s) returned 2.422 sec / 0.000 sec 10 миллионов строк: SELECT id FROM tests.fb ORDER BY id ASC LIMIT 50 OFFSET 249950 50 row(s) returned 0.438 sec / 0.000 sec SELECT id FROM tests.fb WHERE id >= tests.BINID(5000, 50) ORDER BY id ASC LIMIT 50 50 row(s) returned 26.422 sec / 0.000 sec Источники вдохновения по теме: Pagination Optimization, Pagination Done the PostgreSQL Way. ↑ к оглавлению YouTube DarkNet TV Даркнет - как много в этом слове. Это уже не только общее название скрытых / оверлейных интернет-сетей. Этим словом молодёжь называет всякое явление, которое есть скрытая, искажённая, обратная сторона известной реальности. Ниже речь пойдёт об интернет-телевидении, которое представляет собой “даркнет ютуба”, т.е. направление в телеискусстве, раскрывающее малоизвестную часть YouTube. YouTube DarkNet TV - это интернет-телеканал, редакторы и автоматизированные модули которого с помощью YouTube Data API отбирают самую мякотку Ютуба - видео и каналы с малым количеством просмотров и подписчиков, на которых запечатлены страннейшие видеоотрывки, личности, анимация. YouTube DarkNet TV реализован в виде бэкенда с базой данных (gin-gonic + MySQL), куда собираются и где хранятся видео, редакторской панели и фронтенда с уникальным дизайном в виде старого обосранного телевизора, который управляется jQuery, и принимает сигналы от YouTube IFrame API. Редакция с радостью принимает и обрабатывает присылаемые видео (кнопкой Add video). Данный материал является рекламой сервиса YouTube DarkNet TV. ↑ к оглавлению Гигиена ума Часто гоняешь навязчивые мысли по кругу? Тревожишься без объективных причин? Ощущаешь внутреннюю пустоту и бессмысленность существования? Огрызаешься и презираешь окружающих, злишься на обстоятельства? Считаешь себя не достойным лучшего или наоборот - достойным лучшего, - но ничего не можешь изменить? Потерял вкус к жизни, страдаешь от одиночества? Или ещё что-то другое? Существует крутой и универсальный рецепт для восстановления психики, инструмент для гигиены ума, Святой Грааль для достижения состояния потока, круглосуточный доступ к божественному и духовному - и абсолютно бесплатно! Властьимущие тысячелетиями скрывали этот СЕКРЕТ, и вот, наконец, агенты психовойск свободного человечества планеты Земля, наконец, раскрыли его. Это секретное оружее - МЕДИТАЦИЯ. И хотя наука пока не может дать ответ, как это всё работает, тем не менее проведено большое количество исследований, экспериментов, говорящих что это отлично работает при проблемах с психикой. Но медитации ещё и инструмент биохакера, и дают огромный бафф на здоровье - иммунитет, органы дыхания, сердечно-сосудистую систему, когнитивные функции, на механизмы старения, гомеостаз организма вообще (достаточно загуглить “meditation respiratory system”, “meditation immune system” и всё такое…). При всех этих громадных плюсах этот инструмент - идеально подходит для очень ленивых и безвольных людей, т.к. максимально простой и естественный. Если в двух словах и по-простому: всё, что нужно сделать, - это найти 10 минут в своём забитом расписании, отключить уведомления и попросить окружающих тебя не беспокоить, сесть/лечь, закрыть глаза, расслабиться и следить за дыханием - осознавать (для начала - например, внутри себя проговаривать) “вдох” и “выдох”. Больше ничего - буквально. Однако, мозг, привыкший к тому, что его постоянно дёргают за ниточки “дешёвых” клиповых удовольствий вроде мессенджеров, соцсетей, просмотра новостей (“дешёвых” в том смысле, что даже эти небольшие всплески нейромедиаторов удовольствия - не являются наградой за удовлетворение каких-либо физиологических или интеллектуальных потребностей, и мозг вырабатывает привычку это делать всё чаще и чаще; в этом отношений нет никаких отличий от мозга наркозависимого) - в условиях такой информационной депривации начнёт подсовывать всё больше и больше мыслительного материала. Нужно спокойно и расслабленно (расслабон - это вообще главный фактор успеха в жизни) наблюдать за этими мыслями, проговорить их про себя, но потом возвратить внимание к своему дыханию, ко вдохам и выдохам. Сначала это будет тяжело: вроде бы сел и начал медитировать, а через полчаса очнулся от какой-то навязчивой мысли, которую гоняешь последние 29 минут. Это нормально, со временем навык медитации, навык контроля собственного внимания вырастет. Как и в любом деле, тут важна регулярность; можно выделять время для медитаций не так много, но делать это нужно каждый день. Впрочем, даже от влезающих в тишину и темноту навязчивых мыслей есть своя польза: то, что они так активно “требуют” внимания - показатель того, что психическое напряжение по этим вопросам накопилось очень большое, и эти вопросы требуют сознательного решения. Но теперь они не фоновые процессы, от которых в течение дня постоянно отмахиваешься, занимаясь как будто более важной насущной текучкой, а интеллектуальная задача, которую нужно решить - так сказать, закрыть кейс. Со временем, когда навязчивые мысли будут обработаны, на поверхность сознания начнут вылезать логи подсознательных процессов. Когда мы застреваем в жизни, это всегда происходит из-за того, что мы не можем связать себя с чувствами, вызываемыми этой ситуацией. Так что медитации - ещё и отличный инструмент по работе с подсознательными страхами и переживаниями. Медитации позволят перевести саморефлексию на качественно новый уровень и познать ту самую “самость”, развить восприятие себя и своего места в мире. Ещё один положительный аспект медитаций - в сферу внимания начинает постепенно возвращаться восприятие собственного тела. Учитывая что наше физиологическое тело - единственный способ взаимодействия с реальностью, возвращение связи с собственным телом улучшит связь с реальностью: с людьми, с природой. Так, медитируя, тренируя навык сознательной концентрации на внутренних ощущениях, мы вдруг обнаруживаем зажимы в мышцах тела, или даже, возможно, какие-то неприятные патологические ощущения, требующие медицинского вмешательства. Поскольку многие заболевания имеют психосоматическую природу (стресс и тревога -> постоянный выброс гормонов стресса -> нарушение гомеостаза организма), медитативное глубокое расслабление становится мощным фундаментом для саморегенерации. Медитации помогают выработать самый важный навык, который можно применить для достижения своих целей, - вхождение в поток, вхождение в состояние “здесь и сейчас”. Обладая возможностью управлять концентрацией и направлением собственного внимания, ты можешь с лёгкостью двигаться по направлению к тому, что ты считаешь должным сделать, к тому, как реальность проявится через тебя. То, о чём ты думаешь, мысли, которым ты позволяешь роиться в своей голове, - двигают тебя в этом определённом направлении. Если ты научился контролировать своё внимание, ты можешь двигаться в нужном тебе направлении. В конечном счёте медитации - ещё и путь к открытию в себе доступа к духовному миру, к божественному, в хорошем смысле этих слов. Всё, что человек присваивает в качестве своих достижений, всё, что человек совершает - результат не управляемых его волей обстоятельств: всё, что происходило в мире, все события, все катаклизмы, каждый взмах крыла каждого комара, каждый химический процесс в каждой бактерии в кишечнике каждого тигра - всё играло свою роль в том, что ты со своим набором ген, пережив обстоятельства, которые тебя сопровождали в течение жизни, дожил до этой минуты и читаешь эти строки (повезло!). Нет никакого другого момента, кроме здесь и сейчас, а каждая частица пространства неразрывно связана с другой. Именно об этом следует помнить всегда, именно это чувство и вырабатывают медитации. Мотивирующие видео по теме: “Медитация осознанности: ясное мышление, покой, убрать негатив. Как научиться медитировать”, “Медитация для начинающих. Проще некуда.”, “10 минут чтобы стать счастливее”. ↑ к оглавлению Дайджест интересностей Пасхалки Android 4.2, Android 8.0 Ocumetics Technology уже тестирует бионические линзы Lyrebird тестирует генератор голосового аватара Разработчик таких культовых компьютерных игр, как “Поле чудес”, Вадим Башуров, оказывается, активен на Хабре и пишет классные приложухи и юморные посты Список когнитивных искажений: знай врага в лицо! А на случай, если кто-то говорит о том, что «человек не меняется», расскажите ему о нейропластичности — свойстве мозга, заключающемся в возможности изменяться под действием опыта. Удивительная и страшная теория космологического естественного отбора На самом деле использование TLS не защищает от MITM-атак в случае компрометации закрытого ключа ROPEMAKER — вид атаки через электронную почту, дающий злоумышленнику возможность удаленно изменять контент письма (речь идёт о письмах с HTML) в любое время после доставки Отличная и подробная статья про криптографию на эллиптических кривых Хотите узнать, что будет через миллиарды лет? Всё, что нужно знать о возникновении жизни на Земле Серия статей на Хабрахабре про Интернет-разведку Когнитивная психотерапия — форма психотерапии, основанная на предположении, что причины психологических проблем и нервно-психических расстройств человека кроются в ошибках мышления, и направленная на изменение нелогичных или нецелесообразных мыслей и убеждений человека Самое первое видео на YouTube Из времён динозавров своими листочками (и другими частями) нам машут «живые ископаемые» Brian создаёт крутую психоделическую музыку и видосы Чтобы всегда в нужный день праздновать (или не праздновать) Пасху, пользуйтесь алгоритмом Гаусса Оружие на новых физических принципах Учёные успешно загрузили мозг круглого червя в робота на Arduino Существует легенда, что у русских крестьян был свой метод умножения двух чисел В сутках 5^5 * 4^4 * 3^3 * 2^2 * 1^1 миллисекунд Сценарии деанонимизации по мобильному телефону Формирование и изменение установок общественного сознания 20 видео, которые можно включать в любом сочетании и получать удивительную музыку В некоторых культурах до сих пор искусственно деформируют черепа Птички видят магнитные поля Земли YouTube вкрысу автоматически генерирует каналы для музыкальных треков (пример); вообще, музыкальная база YouTube видится самой полной на данный момент, жаль, качество автоматически загружаемого материала оставляет желать лучшего… Утечка факта посещения стороннего сайта на основе скорости загрузки favicon из кэшей Chrome Bitsquatting - перехват интернет-трафика в результате аппаратных ошибок (изменения битов, например, адресов хостов) ↑ к оглавлению До следующего прихода! Живы будем - не помрём!Хиккинги #32017-09-05T21:00:00+00:002017-09-05T21:00:00+00:00https://hikkings.github.io/2017/09/05/third<p>Привет, мир!</p>
<p>Это третий выпуск журнала «Хиккинги».</p>
<p><a name="head-menu"></a>Сегодня в номере:</p>
<ul>
<li><a href="#head-darknet">«Hidden Internet»</a>. Экскурсия в даркнет.</li>
<li><a href="#head-censored">«Интернет-цензура»</a>. Несколько утилит и технологий, препятствующих Интернет-цензуре.</li>
<li><a href="#head-wifi">«Wi-Fi эксперименты»</a>. Взлом Wi-Fi в домашних условиях и разворачивание captive portal.</li>
<li><a href="#head-messengers">«Telegram и WhatsApp»</a>. Небольшое погружение в Telegram и WhatsApp API.</li>
<li><a href="#head-android">«Android geoservice 2»</a>. Продолжение заметочек в процессе программирования под Android.</li>
<li><a href="#head-digest">«Дайджест интересностей»</a>. Есть чему удивиться!</li>
<li><a href="#head-chaos">«Хаос»</a>. Призыв смириться с Хаосом.</li>
</ul>
<p><br /><br /></p>
<h1 id="hidden-internet"><a name="head-darknet"></a>Hidden Internet</h1>
<p>Всё, с чем знаком компьютерный обыватель, — верхушка айсберга Всемирной сети. Социальные сети, новостные сайты, блогоплатформы, чаты, форумы, обычные сайты — мало того, что это только веб-часть интернета (т.е., по большому счёту, один из сотен сетевых протоколов передачи данных), так ещё и к большинству контента человека “приводят”, словно осликов, поисковые системы, манипулирующие результатами по совершенно определённым алгоритмам, не говоря ещё о коммерческой составляющей сортировки результатов поисковых запросов.</p>
<p>Бурное развитие Интернета привело к появлению такого явления как <em>нетсталкинг</em>. Люди, ведомые любопытством и исследовательским интересом, выискивают в Сети контент, который “обычными” методами не найти (сканирование широких диапазонов IP-адресов, использование редких сетевых протоколов и т.п.). Считается, что рассвет нетсталкинга связан с именем Джона Рафмана, художника из Канады, который проводил по 8-12 часов в день в поиске невероятных снимков Google Street View; самые интересные находки Рафман включил в свой проект «Девять глаз Google Street View», ставший впоследствии мультимедийной выставкой.</p>
<p>С точки зрения нетсталкинга, Интернет можно разделить на условные сегменты:</p>
<ul>
<li>индексируемый поисковыми системами, видимый <a href="https://en.wikipedia.org/wiki/Surface_web">Surface web</a> — обычный, знакомый всем, открытый веб</li>
<li>неиндексируемый поисковыми системами <a href="https://ru.wikipedia.org/wiki/%D0%93%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%B0%D1%8F_%D0%BF%D0%B0%D1%83%D1%82%D0%B8%D0%BD%D0%B0">Deep web</a> — веб-ресурсы, не связанные с другими ресурсами гиперссылками; ресурсы с ограниченным доступом (закрытые, платные); “контекстный веб” (ресурсы с динамическим содержимым, зависящем от контекста доступа: IP, профиль пользователя) и т.п.</li>
<li>скрытый, требующий наличия программного обеспечения для доступа внутрь <a href="https://ru.wikipedia.org/wiki/%D0%94%D0%B0%D1%80%D0%BA%D0%BD%D0%B5%D1%82">Dark net</a> — сюда можно отнести различные оверлейные сети (Tor, I2P, ZeroNet и т.п.), скрытые сети правительственного или военного назначения, интернет-ресурсы с доступом по нестандартным протоколам)</li>
</ul>
<p>Оверлейные сети даркнета создавались <a href="https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B0%D0%BD%D0%B0%D1%80%D1%85%D0%B8%D0%B7%D0%BC">криптоанархистами</a>, но сейчас он стал, по большей части, прибежищем криминальных элементов (торговля оружием, наркотиками, порнографией, документами, перепиской политиков и т.п.) и шизофреников (тут и “карты интернета”; <a href="https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D1%82%D1%81%D1%82%D0%B0%D0%BB%D0%BA%D0%B8%D0%BD%D0%B3">“тихий дом”</a>; эзотерические, нумерологические секты).</p>
<p>Путешествуя по даркнету, можно окунуться в атмосферу анонимности, свободы, анархии, минимализма. Хотя, конечно, несколько печально в очередной раз увидеть, что свобода у многих участников сети ассоциируется со вседозволенностью и распущенностью.</p>
<p>Bon voyage!</p>
<h2 id="tor">Tor</h2>
<p><a href="https://ru.wikipedia.org/wiki/Tor">Tor</a> — ПО для анонимного (<a href="https://ru.wikipedia.org/wiki/Tor#.D0.A3.D0.B3.D1.80.D0.BE.D0.B7.D1.8B_.D0.B1.D0.B5.D0.B7.D0.BE.D0.BF.D0.B0.D1.81.D0.BD.D0.BE.D1.81.D1.82.D0.B8">теоретически</a>)
обмена информацией, реализующее так называемую “луковую маршрутизацию” (выбирается случайный маршрут через <a href="https://ru.wikipedia.org/wiki/Tor#.D0.9F.D0.BE.D1.81.D1.80.D0.B5.D0.B4.D0.BD.D0.B8.D1.87.D0.B5.D1.81.D0.BA.D0.B8.D0.B5_.D1.83.D0.B7.D0.BB.D1.8B_.28middleman_node.29">другие узлы сети</a>, передаваемые данные многократно шифруются, каждый пункт передачи удаляет слой шифрования, чтобы открыть адрес следующего пункта, где все повторяется; таким образом, промежуточные узлы не знают источник, пункт назначения и содержание сообщения). Всё, что нужно для начала работы с Tor, — установить <a href="https://www.torproject.org/download/download-easy.html.en">Tor Browser</a>, представляющий собой комплект из сборки Mozilla Firefox с блокировщиками активного содержимого на страницах (в целях защиты от нарушения анонимности) и локального прокси-сервера.</p>
<p>Откуда начать (адреса в сети Tor):</p>
<ul>
<li><a href="http://wiki5kauuihowqi5.onion/">Hidden Wiki</a></li>
<li><a href="http://jh32yv5zgayyyts3.onion/">Hidden Wiki .Onion Urls</a></li>
<li><a href="http://dirnxxdraygbifgc.onion/">OnionDir</a></li>
<li><a href="http://torlinkbgs6aabns.onion/">TorLinks</a></li>
<li><a href="http://hdwikicorldcisiy.onion/">HD Wiki</a></li>
<li><a href="http://xmh57jrzrnw6insl.onion/">Tor Search Engine</a></li>
</ul>
<h2 id="zeronet">ZeroNet</h2>
<p><a href="https://ru.wikipedia.org/wiki/ZeroNet">ZeroNet</a> — основанная на протоколе BitTorrent распределённая одноранговая неанонимная сеть. Сеть популярна среди пользователей из Китая, так как позволяет обойти системы фильтрации интернет-контента в КНР. <a href="https://github.com/HelloZeroNet/ZeroNet#user-content-how-to-join">Установить</a> тоже можно под множество систем. Преставляет собой сервер на python с веб-мордой, через которую можно взаимодействовать с ресурсами сети. Конечно, по сравнению с Tor, контента и участников сети в разы меньше.</p>
<p>Откуда начать (адреса в сети ZeroNet):</p>
<ul>
<li><a href="http://127.0.0.1:43110/">ZeroNet initial page</a></li>
<li><a href="http://127.0.0.1:43110/138R53t3ZW7KDfSfxVpWUsMXgwUnsDNXLP/">ZeroNet Wiki</a></li>
<li><a href="http://127.0.0.1:43110/kaffiene.bit/">Kaffiene search</a></li>
</ul>
<h2 id="i2p">I2P</h2>
<p><a href="https://en.wikipedia.org/wiki/I2P">I2P</a> — анонимная (<a href="https://ru.wikipedia.org/wiki/I2P#.D0.A1.D1.83.D1.89.D0.B5.D1.81.D1.82.D0.B2.D1.83.D1.8E.D1.89.D0.B8.D0.B5_.D1.83.D1.8F.D0.B7.D0.B2.D0.B8.D0.BC.D0.BE.D1.81.D1.82.D0.B8">теоретически</a>) одноранговая распределённая (модифицированный DHT Kademlia) P2P-сеть. При передаче данных между узлами сети применяется шифрование, а также смена посредников на маршруте передачи для усложнения деанонимизации, MITM-атак. Сеть использует “чесночную маршрутизацию”; по аналогии с “луковой маршрутизацией” сообщения представляют собой зашифрованные несколько слоёв сформированных сообщений с инструкциями для их доставки, но дополнительно в передаваемые “чесноки” входят не только зашифрованные сообщения нашего узла, но и чужие — транзитными. Представляет собой сервер на Java. Для начала работы с сетью, нужно скачать <a href="https://geti2p.net/en/download">программу-“роутер”</a>, <a href="http://127.0.0.1:7657/home">внести необходимые настройки</a>, а также прописать <code class="language-plaintext highlighter-rouge">127.0.0.1:4444</code> и <code class="language-plaintext highlighter-rouge">127.0.0.1:4445</code> в качестве HTTP/HTTPS-прокси соответственно. Рекомендуется также <a href="http://127.0.0.1:7657/susidns/config.jsp">добавить подписки</a> адресной книги для того, чтобы упростить поиск и сёрфинг I2P-сайтов, после чего подождать некоторое время:</p>
<blockquote>
<p>http://identiguy.i2p/hosts.txt<br />
http://no.i2p/export/alive-hosts.txt<br />
http://stats.i2p/cgi-bin/newhosts.txt<br /></p>
</blockquote>
<p>Сеть не очень быстрая, и вначале, особенно если вы за NAT, нужно подождать некоторое время (~10-30 минут), пока хосты (или jump-сервисы — что-то вроде местной DNS) начнут резольвиться.</p>
<blockquote>
<p><a href="http://wiki.ilita.i2p/3,5_%D0%B0%D0%BD%D0%BE%D0%BD%D0%B0">3,5 анона</a> — (читается три с половиной анона) — стандартное число посетителей любого сайта в I2P.</p>
</blockquote>
<p>Откуда начать (адреса в сети i2p):</p>
<ul>
<li><a href="http://rus.i2p">Русскоязычная I2P Wiki</a></li>
<li><a href="http://inr.i2p">I2P name registry</a></li>
</ul>
<h2 id="freenet">FreeNet</h2>
<p><a href="https://en.wikipedia.org/wiki/Freenet">FreeNet</a> — анонимная одноранговая распределённая P2P-сеть. Freenet работает на основе объединения в общий фонд (пулинга) предоставленной пользователями (членами сети) полосы пропускания и дискового пространства своих компьютеров для публикации или получения из Freenet разного рода информации. Сохранённая информация шифруется и распространяется по всем компьютерам, участвующим в сети во всём мире; они анонимны, существуют в большом количестве и постоянно обмениваются информацией. Теоретически весьма сложно определить, какой участник хранит данный файл, так как содержимое каждого файла зашифровано и может быть разбито на части, которые распределяются между множеством различных компьютеров. Freenet использует разновидность маршрутизации по ключам, похожую на распределённую хеш-таблицу, для определения местонахождения пользовательских данных.</p>
<blockquote>
<p>Freenet является попыткой устранить возможность для любой группы лиц навязывать свои убеждения и ценности другим. Многие государства осуществляют цензуру коммуникаций в тех или иных пределах. При этом можно выделить одно общее свойство: некоторое лицо решает, какую информацию запретить, а какую допустить. В то же время то, что может быть приемлемо для одной группы людей, может рассматриваться как оскорбительное или даже опасное для другой. По существу, основным замыслом Freenet является то, что никому не позволено решать, что приемлемо. В сети поощряется терпимость к ценностям других, а, в случае отсутствия последней, пользователей просят закрыть глаза на содержание, которое противоречит их взглядам.</p>
</blockquote>
<p>Клиентское ПО <a href="https://freenetproject.org/pages/download.html">поддерживается</a> также для множества платформ.</p>
<p>Откуда начать (адреса в сети FreeNet):</p>
<ul>
<li><a href="http://127.0.0.1:8888/USK@XJZAi25dd5y7lrxE3cHMmM-xZ-c-hlPpKLYeLC0YG5I,8XTbR1bd9RBXlX6j-OZNednsJ8Cl6EAeBBebC3jtMFU,AQACAAE/index/711/">Enzo’s Index</a></li>
<li><a href="http://127.0.0.1:8888/USK@2L-k2U32b3yIl2~YjBU7--QJPTtixSwHZxYOuGjS3A0,QJBd6zpJgEsijJGQNNcwUhsrW5vJ8VtlmNX5ka2~dlU,AQACAAE/AFKindex/170/index.html">AFK Index</a></li>
<li><a href="http://127.0.0.1:8888/USK@0I8gctpUE32CM0iQhXaYpCMvtPPGfT4pjXm01oid5Zc,3dAcn4fX2LyxO6uCnWFTx-2HKZ89uruurcKwLSCxbZ4,AQACAAE/Ultimate-Freenet-Index/64/">Ultimate FreeNet Index</a></li>
<li><a href="http://127.0.0.1:8888/USK@Isel-izgllc8sr~1reXQJz1LNGLIY-voOnLWWOyagYQ,xWfr4py0YZqAQSI-BX7bolDe-kI3DW~i9xHCHd-Bu9k,AQACAAE/linkageddon/-372/">Linkageddon</a></li>
</ul>
<h2 id="osiris">Osiris</h2>
<p><a href="https://ru.wikipedia.org/wiki/Osiris_(%D0%B1%D0%B5%D1%81%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D1%80%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0)">Osiris</a> — распределённая (на базе Kademlia) сеть, предназначенная для создания и распространения веб-порталов, с <a href="http://www.osiris-sps.org/download/">клиентами под Windows/Linux/MacOS</a>. Среди фич, приводимых самими разработчиками: децентрализованность (не требует наличие централизованных серверов), анонимность (между создателями контента и его распространителями-посредниками сеть не делает различий), экономичность (чтобы портал работал, достаточно, чтобы у него были пользователи, — они и будут его распространять по сети). Порталы можно найти по “подпискам” (“subscriptions”), а также получив invite link или .osiris-файл.</p>
<p>Откуда начать:</p>
<ul>
<li><a href="http://www.osiris-sps.org/isis/home.php">Osiris portal list</a></li>
</ul>
<h2 id="retroshare">RetroShare</h2>
<p><a href="https://en.wikipedia.org/wiki/RetroShare">RetroShare</a> — свободное <a href="http://retroshare.net/downloads.html">кроссплатформенное программное обеспечение</a> для бессерверного обмена письмами, мгновенными сообщениями и файлами с помощью шифрованной <a href="https://ru.wikipedia.org/wiki/Friend-to-friend">F2F</a>-/P2P-сети. IP-адреса участников криптосети недоступны друг другу, за исключением ограниченного круга участников. Для передачи данных используется собственный протокол передачи, где элементом адресации пакета является не IP-адрес, а 128-битное случайное число — анонимный идентификатор. Узлы-посредники не могут определить как источник отправления и пункт назначения, так и осуществить мониторинг содержимого проходящих через них пакетов в силу того, что все пакеты подвергаются сильному шифрованию.</p>
<blockquote>
<p>The web site ‘PRISM Break’ has recommended RetroShare for anonymous file sharing since 2013.</p>
</blockquote>
<p>Откуда начать:</p>
<ul>
<li><a href="https://vk.com/retroshare">Обмен сертификатами ВКонтакте</a></li>
</ul>
<h2 id="стоит-упомянуть">Стоит упомянуть</h2>
<ul>
<li>японские P2P-сети <a href="https://en.wikipedia.org/wiki/Winny">Winny</a>, <a href="https://en.wikipedia.org/wiki/Share_(P2P)">Share</a> — на данный момент уже не работают (из-за проблем с правообладателями распространяемого по сети медиаконтента авторы арестованы, сайты заблокированы)</li>
<li><a href="https://en.wikipedia.org/wiki/GNUnet">GNUnet</a> — фреймворк для построения децентрализованных анонимных P2P-сетей с шифрованием</li>
<li><a href="https://ru.wikipedia.org/wiki/%D0%A4%D0%B0%D0%B9%D0%BB%D0%BE%D0%BE%D0%B1%D0%BC%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C">файлообменные сети</a></li>
<li><a href="https://en.wikipedia.org/wiki/Decentralized_network_42">dn42</a></li>
<li><a href="https://en.wikipedia.org/wiki/OneSwarm">OneSwarm</a></li>
</ul>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<h1 id="интернет-цензура"><a name="head-censored"></a>Интернет-цензура</h1>
<blockquote>
<p><em>v Вот когда станут обращать внимание на айти, тогда и поговорим</em><br />
<em>v Вот когда будут сажать за пиратство, тогда и поговорим</em><br />
<em>v Вот когда начнут блокировать сайты, тогда и поговорим</em><br />
<em>v Вот когда начнут прикрывать это защитой детей, тогда и поговорим</em><br />
<em>v Вот когда начнут делать это массово, тогда и поговорим</em><br />
<em>v Вот когда обяжут хранить все данные о гражданах РФ на территории России, тогда и поговорим</em><br />
<em>v Вот когда обяжут мессенджеры выдавать переписку, тогда и поговорим</em><br />
<em>v Вот когда запретят анонимность в интернете, тогда и поговорим</em><br />
<em>v Вот когда <a href="https://meduza.io/news/2017/07/30/putin-podpisal-zakon-o-zaprete-anonimayzerov">запретят шифрование в интернете</a>, тогда и поговорим</em><br />
<em>v Вот когда <a href="https://www.vedomosti.ru/technology/articles/2016/05/13/640856-runet-obosoblen">введут белые списки</a>, тогда и поговорим</em><br />
<strong>[Вы находитесь здесь]</strong><br />
Вот когда заблокируют заграничный интернет, тогда и поговорим<br />
Вот когда национализируют все айти-компании, тогда и поговорим<br />
Вот когда введут интернет по талонам, тогда и поговорим<br /></p>
</blockquote>
<p>Итак, что могу предложить, господа…</p>
<h2 id="blockcheck">Blockcheck</h2>
<p>Blockcheck — утилита для определения типа блокировок сайтов из единого реестра запрещенной информации на стороне провайдеров Российской Федерации.</p>
<p>Как это заюзать:</p>
<p>1) собрать openssl:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>wget https://www.openssl.org/source/openssl-1.1.0e.tar.gz
tar zxvf openssl-1.1.0e.tar.gz
cd openssl-1.1.0e/
./config && make && make test && make install
ldconfig
</code></pre></div></div>
<p>2) поставить zlib1g-dev:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>apt-get install zlib1g-dev
</code></pre></div></div>
<p>3) поставить python, работающий c openssl из исходников:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz
tar zxvf Python-3.6.0.tgz
cd Python-3.6.0/
mcedit Modules/Setup.dist
// uncomment socket module
// uncomment SSL path (set to /usr/local)
// _ssl ssl.c ..........
./configure && make && sudo make install
</code></pre></div></div>
<blockquote>
<p>If you are building Python from source, beware that the OpenSSL 1.1.0c release, the most recent as of this update, is known to cause Python 3.6 test suite failures and its use should be avoided without additional patches. It is expected that the next release of the OpenSSL 1.1.0 series will fix these problems. See http://bugs.python.org/issue28689 for more information. <a href="https://www.python.org/downloads/release/python-360/">https://www.python.org/downloads/release/python-360/</a></p>
</blockquote>
<p>4) поставить git и запустить утилиту:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get install git
git clone https://github.com/ValdikSS/blockcheck.git
cd blockcheck
sudo python3 -m pip install -r requirements.txt
python3 blockcheck.py
</code></pre></div></div>
<p>А можно ничего этого не делать, а заюзать <a href="https://github.com/bedefaced/python-openssl-docker">готовый докерфайл</a>. (Если у вас нет докера (Docker), <a href="https://www.docker.com/community-edition">установите</a>)</p>
<h2 id="dnscrypt">DNSCrypt</h2>
<p><a href="https://dnscrypt.org/">DNSCrypt</a> — это утилита для шифрования DNS-трафика между вашей машиной и сервером. Таким образом, никто не сможет прослушать (и тем более фильтровать) DNS-трафик.</p>
<p>Чтобы не бугуртить на периодически отваливающиеся публичные DNSCrypt-сервера, рекомендую поднять свой. Самый простой вариант — использовать готовый <a href="https://github.com/jedisct1/dnscrypt-server-docker">docker-образ</a>.</p>
<p>Установка клиента:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get install dnscrypt-proxy
</code></pre></div></div>
<p>Учтите, что если вы используете DigitalOcean, то столкнётесь с небольшой проблемкой, связанной с <a href="https://twitter.com/dnscrypteu/status/490216406441816064">блокировкой исходящего 443 порта</a>.
Для обхода этого нужно использовать DNSCrypt-сервер, работающий на другом порту (например, 5353).</p>
<p>Пример (/etc/default/dnscrypt-proxy):</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>DNSCRYPT_PROXY_RESOLVER_NAME=dnscrypt.eu-nl
DNSCRYPT_PROXY_OPTIONS="--tcp-only --ephemeral-keys"
</code></pre></div></div>
<p>Демонизация на линуксе:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl enable dnscrypt-proxy
systemctl start dnscrypt-proxy
</code></pre></div></div>
<p>Демонизация на винде:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dnscrypt-proxy.exe --install-with-config-file=dnscrypt-proxy.conf
</code></pre></div></div>
<p>Подробнее: <a href="https://github.com/jedisct1/dnscrypt-proxy/wiki/Configuration">в мануалах</a>.</p>
<p>P.S. столкнулся с проблемой DNS-резольвинга Tor Browser.
Помогло <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=492511">отключение IPv6</a>:</p>
<blockquote>
<p>could you try setting network.dns.disableIPv6 to true and see if it helps. That may be <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=414197">bug 414197</a>.</p>
</blockquote>
<h2 id="3apa3a-proxy">3APA3A proxy</h2>
<p>Старый добрый <a href="https://github.com/z3APA3A/3proxy">3APA3A прокси</a>.</p>
<p>Маленький, быстрый, простой для установки веб- и socks4/5-прокси-сервер:</p>
<ul>
<li><a href="https://github.com/z3APA3A/3proxy/tree/master/doc">документация</a>;</li>
<li><a href="https://community.vscale.io/hc/ru/community/posts/115001609005-%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D0%B8-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0-3proxy-%D0%BD%D0%B0-Debian-Ubuntu">туториал</a>;</li>
<li>готовый к использованию минимальный <a href="https://github.com/bedefaced/3proxy-docker">docker-контейнер</a>.</li>
</ul>
<h2 id="vpn">VPN</h2>
<p>Сейчас повсеместно использовать VPN для шифрования трафика (обходы блокировок, защита конфиденциальности передачи данных) просто необходимо.</p>
<p>Для быстрого поднятия собственных VPN-серверов рекомендую использовать набор скриптов <a href="https://github.com/bedefaced/vpn-install">vpn-install</a>, позволяющих быстро и удобно поднять и минимально сконфигурировать различные типы VPN-серверов на Linux-машинах.</p>
<p>Для того, чтобы поднять и использовать собственную VPN, нужно сделать следующее:</p>
<ul>
<li>заказать где-нибудь (виртуальный) сервер — например, облачный дроплет в <a href="https://www.digitalocean.com/">DigitalOcean</a> (<a href="https://m.do.co/c/96516d74948d">рефка</a>)</li>
<li><code class="language-plaintext highlighter-rouge">git clone --depth=1 https://github.com/bedefaced/vpn-install.git</code></li>
<li><code class="language-plaintext highlighter-rouge">vpn-install/pptp/install.sh</code> или <code class="language-plaintext highlighter-rouge">vpn-install/openvpn/install.sh</code> или <code class="language-plaintext highlighter-rouge">vpn-install/ipsec/install.sh</code> в зависимости от ресурсов сервера, уровня паранойи, удобства: PPTP — легко настроить на любой системе, в т.ч. мобильной; OpenVPN — более секьюрный и кастомизируемый вариант, но требует дополнительное клиентское ПО; IPsec — оптимальный по безопасности и удобству (поддерживается последними версиями винды, андроида) вариант.</li>
<li>скачать сгенерированные установщиком конфиг-файлы (если требуются) и настроить клиент: для убунтоводов генерируется клиентский скрипт для автоматической установки VPN-клиентов, а для виндузных есть <a href="http://lmgtfy.com/?q=Windows+%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C+VPN">миллион инструкций по настройке</a>.</li>
</ul>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<h1 id="wi-fi-эксперименты"><a name="head-wifi"></a>Wi-Fi эксперименты</h1>
<h2 id="взлом-wi-fi">Взлом Wi-Fi</h2>
<p>В зависимости от настроек защиты домашних wi-fi-точек доступа существуют 3 основных вектора атак на проникновение:</p>
<ul>
<li>взлом WEP-сетей</li>
<li>взлом WPA/WPA2-сетей</li>
<li>взлом WPS (по пинкоду)</li>
</ul>
<p>Если не сосредотачиваться на <a href="https://habrahabr.ru/post/224955/">архитектурных различиях</a>, суть атак на первые 2 технологии защиты в перехвате пакетов и в подборе ключа шифрования: в случае с WEP-шифрованием это выполняется на порядки быстрее (3/6/15 байт на ключ), в случае WPA/WPA2-шифрования это требует и большего количества пакетов, и потребуется больше времени на брутфорс хеша ключа (8-63 байта). В случае включённого режима WPS-авторизации по пинкоду на точке доступа достаточно произвести не более 11000 запросов (правда, тут могут помешать дополнительные ограничения по таймауту, если такие включены на точке доступа). Такое небольшое количество запросов связано <a href="https://habrahabr.ru/company/xakep/blog/143834/">с уязвимостью в самом протоколе</a>.</p>
<p>Prerequisites:</p>
<ul>
<li>wi-fi адаптер с поддержкой режима мониторинга (promiscuous mode) — в таком состоянии сетевой адаптер будет обнаруживать все пакеты, независимо от того, кому они предназначались</li>
<li><a href="https://www.kali.org/downloads/">Kali Linux</a> — Debian-based LiveCD образ с набором утилит “для проведения тестов на безопасность”</li>
</ul>
<p>Как узнать, поддерживает ли wi-fi адаптер режим мониторинга? Можно прочитать <a href="https://www.aircrack-ng.org/doku.php?id=compatible_cards">инструкцию airmon</a>, попробовать поискать чипсет среди <a href="http://madwifi-project.org/wiki/Compatibility">madwifi-compatible адаптеров</a>, <a href="https://askubuntu.com/questions/829977/how-to-check-if-you-cards-supports-monitor-mode">использовать утилиту iw</a>.</p>
<p>Подробные инструкции по перехвату пакетов и взлому <a href="https://lifehacker.ru/2012/10/27/kak-vzlomat-wi-fi-set-s-wep-shifrovaniem/">WEP-сетей</a>, <a href="https://defcon.ru/wireless-security/2541/">WPA/WPA2-сетей</a> (в т.ч. <a href="https://codeby.net/bezopasnost/vzlom-wi-fi-parolja-wpawpa2-ispolzuja-pyrit-i-cowpatty-v-kali-linux/">используя предрассчитанные хеши</a>), <a href="https://codeby.net/bezopasnost/vzlom-wifi-wpawpa2-parolej-s-ispolzovaniem-reaver/">WPS-авторизации</a> можно прочитать в интернете, я лишь приведу небольшую шпаргалку:</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">iwlist wlan1 scanning</code> — вывод информации по обнаруженным wi-fi сетям</li>
<li><code class="language-plaintext highlighter-rouge">airmon-ng start wlan1</code> / <code class="language-plaintext highlighter-rouge">airmon-ng stop wlan1mon</code> — включение/выключение мониторинга</li>
<li><code class="language-plaintext highlighter-rouge">airodump-ng wlan1mon –-bssid BSSID –-channel CHANNEL -–write handshake</code> — запуск перехватов хендшейков к точке доступа с MAC-адресом BSSID по каналу CHANNEL и запись в файл с именем handshake*</li>
<li><code class="language-plaintext highlighter-rouge">aireplay-ng -0 10 –a BSSID –c CLIENT wlan1mon</code> — отправка 10 деаутентификаций от имени клиента с MAC-адресом CLIENT (с целью выполнения им аутентификации — чтобы перехватить его хендшейки)</li>
<li><code class="language-plaintext highlighter-rouge">reaver -i wlan1mon -b BSSID</code> — инициализация перебора PIN при включённом WPS на точке доступа MAC-адресом BSSID</li>
<li><code class="language-plaintext highlighter-rouge">reaver -i wlan1mon -b BSSID -K 1</code> — выполнение атаки <a href="https://github.com/wiire-a/pixiewps">Pixie Dust</a> на <a href="https://docs.google.com/spreadsheets/d/1tSlbqVQ59kGn8hgmwcPTHUECQ3o9YhXR91A_p7Nnj5Y/edit#gid=2048815923">уязвимую точку доступа</a> с MAC-адресом BSSID</li>
<li><code class="language-plaintext highlighter-rouge">aireplay-ng -1 0 -a BSSID -e CLIENT wlan1mon</code> — ARP Request Replay от имени клиента с MAC-адресом CLIENT</li>
</ul>
<p>Вишенка на тортике: в Kali Linux входит скрипт <em>wifite</em>, автоматизирующий вышеуказанные атаки. Всё, что нужно для взлома с помощью wifite — <code class="language-plaintext highlighter-rouge">wifite</code> и запастись терпением, остальное сделает скрипт.</p>
<p>Ну, и конечно же, основную роль при перехвате и отправке фейковых пакетов играет величина и соотношение мощностей сигналов между взломщиком, авторизованным пользователем и точкой доступа.</p>
<h2 id="простой-captive-portal">Простой captive portal</h2>
<p>В рамках этого эксперимента хотелось поднять на обычной Linux машине (в моём случае — Ubuntu) wi-fi точку доступа с простым captive portal без авторизации.</p>
<p>Поднять точку доступа можно <a href="https://askubuntu.com/a/439530">стандартными средствами Network-Manager</a> или <a href="https://habrahabr.ru/post/122876/">с помощью dnsmasq и hostapd</a> (note: не забудьте отключить network-manager перед запуском hostapd).</p>
<p><a href="https://ru.wikipedia.org/wiki/Captive_portal">Captive portal</a> — это сервис, куда при подключении к открытой точке доступа маршрутизатор переадресует неавторизованных пользователей. Сейчас это работает повсеместно: при подключениях к wi-fi в кафе, общественном транспорте и т.п. Обычно используется для взимания платы, аутентификации абонента либо показа рекламы.</p>
<p>Естественно, реализаций captive portal, в т.ч. открытых, <a href="https://mohammadthalif.wordpress.com/2010/12/14/list-of-open-source-captive-portal-software-and-network-access-control-nac/">достаточно много</a>, которые при этом настраиваются <a href="https://turbofuture.com/computers/How-to-Set-Up-a-Captive-Portal-Using-pfSense">через web-gui</a>, часто выполнены в виде <a href="http://rus-linux.net/nlib.php?name=/MyLDP/sys-conf/zeroshell/zeroshell3.html">образов систем</a> для разворачивания интернет-шлюза на компьютере или <a href="https://github.com/wifidog">на embedded-системах</a>, вроде OpenWRT.</p>
<p>Впрочем, не так сложно реализовать captive portal <a href="https://xakep.ru/2013/10/29/captive-portal/">своими руками</a>.
Принцип работы довольно простой:</p>
<ul>
<li>файрволл конфигурируется для блокировки FORWARD-трафика (возможно, кроме определённых служебных протоколов)</li>
<li>перехват файрволлом запроса на 80 порт (т.е. когда подключившийся пользователь заходит на сайт через браузер, или же система обращается к веб-ресурсу с целью проверить состояние онлайн/оффлай)</li>
<li>переадресация запроса на ip:port адрес captive portal средствами файрволла (подмена destination ip:port)</li>
<li>после авторизации, ожидания или выполнения каких-то других действий пользователем на веб-сайте captive portal, в список правил файрволла добавляются правила, разрешающие обслуживание (форвардинг) трафика пользователя по его IP/MAC-адресу</li>
<li>с определённой периодичностью эти правила очищаются, статус авторизации сбрасывается</li>
</ul>
<p>Мне хотелось поднять captive portal на своём компьютере с Ubuntu, причём открытый, без авторизации, т.е. отобразить пользователю captive portal, показать на какое-то время или дождаться нажатия на кнопочку Continue и открыть доступ в интернет. Удивительно, но captive portal такого типа разыскать было не так легко. Параллельно с самым, наверное, известным captive portal Wifidog (он с авторизацией на отдельном сервере) долгое время был проект <a href="http://dev.wifidog.org/wiki/NoCatSplash">NoCatSplash</a> как раз для таких целей, однако, видимо, его перестали поддерживать, и ссылки на “официальные” сайты уже приводят в никуда. Но-таки нашёлся нужный captive portal с “неожиданным” названием: <a href="https://github.com/nodogsplash/nodogsplash">nodogsplash</a>, который и написан, и работает, на мой взгляд, хорошо, причём и на OpenWRT, и на Debian-based системах.</p>
<p>Ниже привожу шаги для сборки и запуска nodogspash на Ubuntu 16.04:</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">git clone https://github.com/nodogsplash/nodogsplash</code></li>
<li>установить <a href="https://nodogsplash.readthedocs.io/en/latest/install.html">prerequisites</a> для сборки libmicrohttpd нужной версии (в Ubuntu-репозитории версия ниже, не подходит): <code class="language-plaintext highlighter-rouge">apt-get install debhelper dpkg-dev dh-systemd libmicrohttpd-dev build-essential debhelper devscripts hardening-includes</code></li>
<li><a href="https://packages.debian.org/stretch/libmicrohttpd-dev">libmicrohttpd</a> будем собирать из Debian 9 (stretch) репозитория <a href="https://serverfault.com/questions/126920/is-adding-the-debian-repository-to-my-apt-source-list-dangerous-on-ubuntu">из исходников</a>, поэтому:</li>
</ul>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>echo "deb-src http://deb.debian.org/debian stretch main">> /etc/apt/sources.list
apt-get install apt-src debian-archive-keyring
apt-get update
</code></pre></div></div>
<ul>
<li>собираем из исходников и создаём deb-пакет:</li>
</ul>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>apt-src -bi install zzuf
apt-src -bi install libmicrohttpd12
dpkg-buildpackage -b -rfakeroot -us -uc
</code></pre></div></div>
<ul>
<li>устанавливаем: <code class="language-plaintext highlighter-rouge">dpkg -i ../nodogsplash_2.0.0-1_amd64.deb</code></li>
<li>в конфиге <code class="language-plaintext highlighter-rouge">/etc/nodogsplash/nodogsplash.conf</code> вносим необходимые изменения: wi-fi интерфейс, который будет обслуживать nodogsplash, различные настройки (можно просто закомментить всё лишнее)</li>
<li><a href="http://www.ducea.com/2006/08/01/how-to-enable-ip-forwarding-in-linux/">убедиться</a>, что sysctl может форвардить: <code class="language-plaintext highlighter-rouge">sysctl net.ipv4.ip_forward</code></li>
<li>возможно, может понадобиться рестартануть сеть (<code class="language-plaintext highlighter-rouge">service network-manager restart</code>)</li>
<li>???</li>
<li><code class="language-plaintext highlighter-rouge">service nodogsplash start</code></li>
</ul>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<h1 id="telegram-и-whatsapp"><a name="head-messengers"></a>Telegram и WhatsApp</h1>
<p>Зародилась как-то идея получения инфы по номеру телефона из сервисов, привязанных к телефону, вроде Telegram или WhatsApp (например, в качестве дополнительной функциональности <a href="https://play.google.com/store/apps/details?id=com.truecaller">Truecaller</a>).</p>
<p>Также интересовала тема вычисления (деанона) номера телефона по логину (или наоборот) в Telegram. (<a href="https://habrahabr.ru/post/329982/">Не только меня</a> эта идея преследовала.) Впрочем, с этим у меня не срослось. Для получения информации о номере телефона, нужно добавить его в контакт-лист. Но Telegram достаточно сильно ограничивает размер контакт-листа: по моему опыту там ограничения порядка 300-500 контактов, когда-либо добавленных (т.е. добавление контактов, а потом очищение контакт-листа не помогает). Потом включаются временные ограничения на добавление новых контактов (т.е. добавить ещё можно, но, например, спустя пару недель, и не больше сотни). Для обычного “легального” использования этого вполне достаточно, но для сбора базы это создаёт препятствия.</p>
<p>Тем не менее, у кого-то, судя по всему, хватило терпения собрать базу. Не так давно в Telegram всплывал бот (сейчас уже удалён, заблокирован; последнее, что было в информации о нём — контактная информация для предложений о сотрудничестве — @iamgustav), который выдавал инфу (телефон) по логину. Причём в качестве средства оплаты можно было использовать собственный контакт-лист: отправляешь боту контакты из своего контакт-листа (номера телефонов), получаешь за это возможность “пробить” столько же номеров/логинов. Контакты, разумеется, нужны для пополнения базы телефонов. Впрочем, лично мне не удалось пробить кого-то, видимо, база далеко не полная.</p>
<p>В общем, решил поэкспериментировать с документированным Telegram API и недокументированным WhatsApp API.</p>
<h2 id="telegram">Telegram</h2>
<p>В настоящее время запросы в гугле вроде “telegram api” приводят на примеры/библиотеки для написания Telegram-ботов. Мне же нужно было копнуть немного глубже — поковыряться в самом Telegram API (но не погружаясь в коммуникационный протокол MTProto). Нашлась Java-либа (https://github.com/rubenlagus/TelegramApi), которая, как я понимаю, используется в некоторых Android-клиентах (раньше была эта: https://github.com/ex3ndr/telegram-api). Правда, ничего не документировано, и примеров почти нет — приходится действовать интуитивно. Совсем недавно только ожил репозиторий <a href="https://github.com/DrKLO/Telegram">исходников официального Android-клиента</a>.</p>
<p>Что нужно для работы с Telegram API:</p>
<ol>
<li>Авторизоваться на <a href="https://my.telegram.org/auth">https://my.telegram.org/auth</a> и получить api_id, api_hash и IP для обращений к серверу в “API development tools”.</li>
<li>Выбрать подходящий язык и либу в поиске на GitHub по запросам <a href="https://github.com/search?utf8=%E2%9C%93&q=telegram+client&type=">“telegram client”</a> или <a href="https://github.com/search?utf8=%E2%9C%93&q=telegram+library&type=">“telegram library”</a>.</li>
<li>Открыть <a href="https://core.telegram.org/api#telegram-api">официальную документацию</a>.</li>
<li>???</li>
<li>PROFIT!</li>
</ol>
<p>Несколько ссылок:</p>
<ul>
<li><a href="https://github.com/zhukov/webogram">https://github.com/zhukov/webogram</a> — исходники web.telegram.org</li>
<li><a href="https://github.com/rubenlagus/TelegramApi">https://github.com/rubenlagus/TelegramApi</a> — упомянутая Java-либа</li>
<li><a href="https://github.com/sochix/TLSharp">https://github.com/sochix/TLSharp</a> — C#-либа (с ней нужно быть аккуратной — захардкоженные IP серверов точно не совпадут с выдаванными в панели разработчика на сайте Telegram, что приведёт к безвозвратному бану телефонного номера)</li>
<li><a href="https://github.com/fazo96/telecommander">https://github.com/fazo96/telecommander</a> — консольный клиент</li>
<li><a href="https://github.com/vik-borisov/TelegramClient">https://github.com/vik-borisov/TelegramClient</a> — C#-либа, в разработке</li>
</ul>
<p>Интересный факт: в Telegram API уже несколько лет предусмотрены геочаты (geochat) — публичные чаты, куда пользователи, вероятно, попадали бы в соответствии со своим геоположением (<a href="https://core.telegram.org/api/geochats">https://core.telegram.org/api/geochats</a>). Но, видимо, в телеграме пока на это забили.</p>
<p>Некий PoC идеи по получении инфы по номеру телефона нашёлся <a href="https://github.com/bedefaced/telegraminfowebapp">тут</a> — в виде спрингового веб-сервиса.</p>
<p>Алгоритм получения инфы (разумеется, после регистрации и авторизации по номеру телефона) примерно следующий:</p>
<ol>
<li>добавить (TLRequestContactsImportContacts) номер телефона в контакт-лист;</li>
<li>получить access_hash контакта (TLRequestUsersGetFullUser);</li>
<li>удалить контакт (TLRequestContactsDeleteContact);</li>
<li>используя access_hash, получить (TLRequestUsersGetFullUser) всю инфу удалённого контакта, включая аватарку (TLRequestUploadGetFile).</li>
</ol>
<p>В принципе, получение информации (логин, авку) о контакте возможно и после первого шага, однако, в этом случае нет возможности узнать указанные самим пользователем имя и фамилию, поскольку эти поля заполняются параметрами запроса при добавлении контакта в контакт-лист (на этом, первом шаге). А вот уже после удаления контакт из контакт-листа, можно, пользуясь access_hash, узнать всё о нём.</p>
<h2 id="whatsapp">WhatsApp</h2>
<p>WhatsApp <a href="https://www.quora.com/WhatsApp-Why-doesnt-WhatsApp-have-an-API">не предоставляет</a> публичного API. То есть он есть (даже не один: помимо API, к которому обращаются телефончики, есть ещё <a href="https://web.whatsapp.com">Web API</a>), но он не документирован, а обнаруженные попытки его использования пресекаются банами. В связи с этим такого большого разнообразия библиотек и клиентов, как в случае Telegram, тут нет. Всё, что есть в интернете, — кое-как работающее, ломающееся после большинства обновлений официальных клиентов, приводящее к вечным блокировкам номеров (в процессе экспериментов забанил номеров 5), созданное в результате реверс-инжиниринга официальных мобильных клиентов.</p>
<p>Отсутствие официального API (ну, и исходников клиента) разработчики объясняют борьбой со спамом. Не знаю, удаётся ли им это (несмотря на то, что на гитхабе <a href="https://github.com/omegaes/Whatsapp-API">есть PoC</a> отправки сообщений через WhatsApp приложение на рутованном девайсе), но палки в колёса разработчикам вставили.</p>
<p>Немного ссылок:</p>
<ul>
<li><a href="https://github.com/tgalal/yowsup">https://github.com/tgalal/yowsup</a> — python-клиент, единственная рабочая сейчас либа для работы с WhatsApp;</li>
<li><a href="https://github.com/mgp25/Chat-API">https://github.com/mgp25/Chat-API</a> и <a href="https://github.com/mgp25/Chat-API-NET">https://github.com/mgp25/Chat-API-NET</a> — PHP- и C#-библиотеки, ныне уже не поддерживаемые разработчиком (по его утверждению, из-за нежелания потакать разработке приложений для спама);</li>
<li><a href="https://github.com/venomous0x/WhatsAPI/">https://github.com/venomous0x/WhatsAPI/</a> — основа, источник вдохновения вышеуказанных либ, ныне репозиторий удалён из-за жалоб и преследований WhatsApp, но можно поискать что-нибудь рабочее среди <a href="https://github.com/venomous0x/WhatsAPI/network/members">форков</a> (лично мне не удалось).</li>
<li>довольно интересный <a href="https://www.lorankloeze.nl/2017/05/07/collecting-huge-amounts-of-data-with-whatsapp/">граббер инфы</a> о номерах в виде <a href="https://github.com/LoranKloeze/WhatsAllApp">Chrome-расширения</a>, который работает через упомянутый выше Web API (однако, сначала требуется выполнить стандартную процедуру авторизации в WhatsApp через сканирование QR-кода).</li>
</ul>
<p>Некий PoC идеи по получении инфы (время последнего подключения пользователя, авка, статус) по номеру телефона нашёлся <a href="https://github.com/bedefaced/Chat-API-NET">тут</a> — в виде ASP.NET веб-сервиса. Судя по всему, разработчик взял за основу проект <em>mgp25/Chat-API-NET</em> и внёс исправления для работы с современной версией WhatsApp протокола.</p>
<p>Немного о работе с WhatsApp. Протокол бинарный, <a href="https://github.com/mgp25/Chat-API/wiki/FunXMPP-Protocol">некая переделка XMPP-протокола</a>. При регистрации/авторизации нужно передавать токен, основанный на хардкоженных хешах классов, которые <a href="https://github.com/mgp25/classesMD5-64">выдирают</a> из официальных клиентов, что постоянно приводит к возникновению <a href="https://github.com/tgalal/yowsup/search?q=old_version&type=Issues&utf8=%E2%9C%93">десятков соответствующих тредов</a> на гитхабе. Для выполнения процесса авторизации также требуется токен, который выдаёт сервер в процессе предыдущей авторизации.</p>
<p>Что примечательно, в случае самой первой авторизации (т.е. прямо после регистрации) этому токену взяться неоткуда, поэтому его и передавать не нужно. Да, всё действительно обстоит так: после выполнения регистрации (т.е. отправки кода, полученного на телефон — смской ли, звонком ли) авторизоваться без какого-либо пароля может вообще <strong>любой</strong>, кто знает телефон (точнее: у кого такой же идентификатор клиента, но, например, у пользователей вышеуказанных либ идентификатор клиента будет один и тот же). Аккаунт полностью контролирует тот, кто контролирует телефонный номер.</p>
<p>Кстати, информацию о последнем заходе в WhatsApp (last seen timestamp) пользователя, WhatsApp отдаёт независимо от настроек приватности (и через обычный API, и через Web API).</p>
<p>P.S. от чистого сердца (в смысле что за рекламу никто мне не платит) рекомендую для экспериментов (для регистрации, приёма смсок — в общем, где требуется активация по номеру телефона) использовать сервис <a href="https://sms-reg.com">SMS-REG.com</a>, годнота.</p>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<h1 id="android-geoservice-2"><a name="head-android"></a>Android geoservice 2</h1>
<p>Убив целый день на дрочево с эмуляторами, наконец, <a href="http://www.tothenew.com/blog/googles-fused-location-api-for-android/">узнал</a>, что Google Play Services Location API на эмуляторах не отладить. И вообще, с фейковым изменением координат там проблемы. Теоретически, фиксить координаты можно, подключившись к <a href="http://developer.android.com/tools/devices/emulator.html#console">Android Emulator Console</a> (прям telnet’ом к порту 5554) и отправляя команды вида <code class="language-plaintext highlighter-rouge">geo fix <longitude> <latitude></code>. Для этого есть даже <a href="https://github.com/dpdearing/android-gps-emulator">графическая утилита</a> (веб-приложение), в которой на карте выбираешь мышкой местоположение, и в консоль эмулятора автоматически отправляется geo fix команда. Впрочем, и она у меня не заработала: отправляемые на эмулятор команды не приводили ни к какому эффекту.</p>
<p>Ещё один путь для фейкового изменения координат есть в самом эмуляторе. Среди менюшек, с которыми запускается эмулятор, есть вкладка Location, где можно задать координаты вручную, и, кроме того, имитировать перемещения. Для этого нужно подать на вход специальный GPX/KML-файл. Нагуглил вот <a href="https://mapstogpx.com/">такой вот сервис</a>: ему на вход подаётся ссылка с Google Maps с начальной и конечной точкой маршрута, а он на выходе отдаёт как раз GPX-файл с промежуточными точками маршрута. Неплохо.</p>
<p>В общем, было решено научиться эмулировать координаты и перемещения на реальном девайсе, тем более что такая функциональность, вроде как, есть из коробки (в меню разработчика есть пункт “Разрешить фиктивные координаты”). Очень хорошее <a href="https://mobiarch.wordpress.com/2012/07/17/testing-with-mock-location-data-in-android/">руководство</a> было быстро найдено.
(Разве что при создании объекта Location не хватает установки точности методом <code class="language-plaintext highlighter-rouge">setAccuracy</code> и времени — <code class="language-plaintext highlighter-rouge">setElapsedRealtimeNanos( SystemClock.elapsedRealtimeNanos() )</code>.)</p>
<p>Однако, это подходит только для старых API. Я у себя использую современный FusedLocationApi из Google Play Services. В нём работа с фиктивными координатами осуществляется примерно следующим образом:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>LocationServices.FusedLocationApi.setMockMode(googleApiClient, true);
/* ... создание нужного Location ... */
LocationServices.FusedLocationApi.setMockLocation(googleApiClient, mockLocation);
</code></pre></div></div>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<h1 id="дайджест-интересностей"><a name="head-digest"></a>Дайджест интересностей</h1>
<ul>
<li>
<p><a href="http://www.tiensmed.ru/news/palcvoda1.html">Почему наши пальцы сморщиваются от воды?</a></p>
</li>
<li>
<p>Дизайнер из Хайфы <a href="https://tjournal.ru/44900-dizainer-iz-haifi-sozdala-alfavit-kotorii-mogut-odnovremenno-chitat-evrei-i-arabi">создала алфавит</a>, который могут одновременно читать евреи и арабы</p>
</li>
<li>
<p><a href="https://habrahabr.ru/post/330140/">Блокчейн + распределённое хранилище = Sia</a></p>
</li>
<li>
<p><a href="http://varlamov.ru/2404791.html">О чем говорят американские бомжи</a></p>
</li>
<li>
<p>В Великобритании возобновляемые источники (солнце, вода, ветер, биомасса, древесине) электроэнергии <a href="https://tjournal.ru/45153-vozobnovlyaemie-istochniki-vpervie-virabotali-bolshe-polovini-elektrichestva-v-velikobritanii">впервые в истории</a> выработали больше электроэнергии, чем традиционные (уголь, газ)</p>
</li>
<li>
<p>«Русские хакеры» из Turla <a href="https://tjournal.ru/45138-vzlom-ili-instagram">используют комментарии</a> под фотографиями Бритни Спирс в Инстаграме для управления вредоносной программой</p>
</li>
<li>
<p><a href="https://en.wikipedia.org/wiki/Gyöngyhajú_lány">Gyöngyhajú_lány</a>: Scorpions позаимствовали музыку для песни <a href="https://www.youtube.com/watch?v=qjE5Rg5JlpI">White Doves</a> у <a href="https://www.youtube.com/watch?v=CGt-rTDkMcM">венгерской рок-группы Omega</a></p>
</li>
<li>
<p>Китай <a href="https://hitech.newsru.com/article/15jun2017/chinaspace">запустил</a> первый рентгеновский космический телескоп</p>
</li>
<li>
<p><a href="https://en.wikipedia.org/wiki/Rockabye_Baby!">Rockabye_Baby!</a>
— знаменитый роцк, стилизованный под колыбельные для детишек, можно послушать на <a href="https://music.yandex.ru/artist/1134553">Яндекс.Музыке</a></p>
</li>
<li>
<p><a href="http://www.primecrime.ru/video/oper/">Коллекция видосиков</a> с «ворами в законе».</p>
</li>
<li>
<p><a href="https://daily.afisha.ru/brain/5982-otkaz-ot-very-eto-chast-vzrosleniya/">Интервью с Ричардом Докинзом</a></p>
</li>
<li>
<p><a href="https://habrahabr.ru/company/croc/blog/331894/">Как магазин в торговом центре узнаёт вас по Wi-Fi</a></p>
</li>
<li>
<p><a href="https://ru.wikipedia.org/wiki/Глицин">Глицин</a> — дар богов!</p>
</li>
</ul>
<blockquote>
<p>После семи лет путешествия космический корабль вернулся назад и сбросил на Землю капсулу с образцами звёздной пыли. В этих образцах были найдены следы глицина. Вещество явно имеет неземное происхождение, потому что в нём гораздо больше изотопа C¹³, чем в земном глицине.</p>
</blockquote>
<ul>
<li>
<p><a href="https://habrahabr.ru/company/vkontakte/blog/332430/">WI-FI в метро: архитектура сети и подземные камни</a></p>
</li>
<li>
<p><a href="https://ru.wikipedia.org/wiki/Токамак">Управляемый термоядерный синтез придумали в СССР</a>.</p>
</li>
<li>
<p><a href="https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D1%80%D0%B8%D0%B0%D0%BD%D0%B4%D1%80">Кинза</a> — то же самое, что и кориандр.</p>
</li>
<li>
<p><a href="https://tproger.ru/news/first-51-qubit-computer/">Создан и успешно проверен</a> первый в мире 51-кубитный квантовый компьютер</p>
</li>
<li>
<p>IBM и ВВС США <a href="https://habrahabr.ru/company/ibm/blog/333378/">разрабатывают</a> нейроморфный суперкомпьютер нового поколения</p>
</li>
<li>
<p><a href="https://habrahabr.ru/company/neobit/blog/332942/">Постквантовая криптография и закат RSA</a></p>
</li>
<li>
<p>Как тысячи игроков Eve Online <a href="https://habrahabr.ru/post/333528/">помогают в расшифровке человеческого тела</a></p>
</li>
<li>
<p>Опыт Туту.ру: <a href="https://habrahabr.ru/company/tuturu/blog/333038/">Как устроено расписание электричек</a></p>
</li>
<li>
<p><a href="http://ya-schizotypic.livejournal.com/46145.html">Мифы</a> о психически больных и psy-индустрии в целом</p>
</li>
<li>
<p>Занимательные истории о чайных грибах: о том, как Виктору Буту из-за выращивания чайного гриба на 40 дней <a href="https://lenta.ru/news/2017/07/19/but/">увеличили 25-летний тюремный срок</a> и о том, как напиток из чайного гриба (“комбуча”) <a href="http://www.kp.ru/daily/26669.3/3689724/">стал популярным на Западе</a></p>
</li>
<li>
<p><a href="https://ru.wikipedia.org/wiki/Псевдоскоп">Псевдоскоп</a></p>
</li>
<li>
<p><a href="https://ru.wikipedia.org/wiki/История_изучения_динозавров">До 19 века о динозаврах не знали</a>:</p>
</li>
</ul>
<blockquote>
<p>«Гигантские кости, находимые иногда в земле, в античности считали останками героев эпохи Троянской войны, в Средние века и вплоть до XIX в. — останками исполинов, о которых упоминается в Библии и которые погибли во время всемирного потопа; на Дальнем Востоке их считали костями драконов и приписывали им целебные свойства.»</p>
</blockquote>
<ul>
<li>
<p><a href="https://meduza.io/feature/2017/07/22/bukva-kotoraya-500-let-byla-podrostkom">Буква, которая 500 лет была подростком</a>: в немецком алфавите появилась заглавная ß</p>
</li>
<li>
<p>В MIT <a href="https://tproger.ru/news/mit-eq-radio/">разработали прибор EQ-Radio</a>, использующий Wi-Fi для чтения эмоций</p>
</li>
<li>
<p>Как ВКонтакте <a href="https://tjournal.ru/57563-rassledovanie-kak-vkontakte-sobiraet-informaciyu-o-polzovatelyah">собирает информацию о пользователях</a></p>
</li>
<li>
<p>О том, кто такие <a href="https://meduza.io/feature/2017/08/01/poteryat-nogu-nayti-sebya">“добровольные ампутанты”</a>, и как они живут</p>
</li>
<li>
<p>Любопытная технология <a href="https://habrahabr.ru/company/virgilsecurity/blog/334506/">NoiseSocket</a> — конструктор протоколов безопасной передачи данных</p>
</li>
<li>
<p>Оказывается, все существующие на сегодняшний день переводы “Властелина колец” — бывший “подпольный” <a href="http://kniga2001.narod.ru/faq/faq04.html">фанатский самиздат</a>. Причём, каждая новая команда переводчиков привносила своё, меняла смысл, сокращала, а порой даже <a href="https://otvet.mail.ru/question/26868799">откровенно подсирала</a>. Самый топ на настоящее время по отзывам фанатов — перевод Григорьевой и Грушецкого. А “Хоббита” рекомендуют читать в переводе Рахмановой.</p>
</li>
<li>
<p>Ученые <a href="https://meduza.io/news/2017/08/02/uchenye-vpervye-udalili-iz-dnk-chelovecheskogo-embriona-gen-otvechayuschiy-za-zabolevanie">впервые удалили из ДНК человеческого эмбриона ген</a>, отвечающий за заболевание</p>
</li>
<li>
<p>Краткий экскурс в <a href="http://psixologiya.org/socialnaya/menedzhmenta/2155-teoriya-pokolenij.html?showall=1">теорию поколений</a></p>
</li>
<li>
<p>Зачем исследовать космос? <a href="http://lionet.livejournal.com/114407.html">Письмо директора NASA монахине</a></p>
</li>
<li>
<p><a href="https://ru.wikipedia.org/wiki/%D0%94%D0%BE%D0%B3%D0%BE%D0%B2%D0%BE%D1%80_%D0%BF%D0%BE_%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D1%82%D0%BE%D0%BC%D1%83_%D0%BD%D0%B5%D0%B1%D1%83">Договор по открытому небу</a> — международный договор о наблюдательных полётах над территориями других государств для того, чтобы ознакомиться с военной инфраструктурой других стран и отслеживать изменения в целях поддержания мира</p>
</li>
<li>
<p><a href="https://itunion.info/2017/02/moksi-marlinspajk-anarhist-izmenivshij-internet.html">Мокси Марлинспайк</a> — анархист, изменивший интернет</p>
</li>
<li>
<p>Planet Labs <a href="https://meduza.io/feature/2017/02/16/planet-labs-zapustila-v-kosmos-sotnyu-kroshechnyh-sputnikov-chtoby-kruglosutochno-snimat-vsyu-poverhnost-zemli-eto-proryv">запустила</a> в космос сотню крошечных спутников, чтобы круглосуточно снимать всю поверхность Земли</p>
</li>
<li>
<p><a href="http://www.computerra.ru/13242/startap-sickweather-pomozhet-ne-zabolet-grippo/">Sickweather</a> — сервис, который помогает отслеживать распространение инфекций по городу</p>
</li>
<li>
<p><a href="https://ru.wikipedia.org/wiki/%D0%AD%D1%84%D1%84%D0%B5%D0%BA%D1%82_%D0%A4%D0%BB%D0%B8%D0%BD%D0%BD%D0%B0">Эффект Флинна</a> — статистический феномен, выражающийся в постепенном повышении показателей коэффициента интеллекта (IQ) с течением лет как в отдельных странах, так и в целом по миру</p>
</li>
<li>
<p><a href="https://tjournal.ru/43659-kak-ugnat-avtomobil-pri-pomoshchi-dvuh-priemoperedatchikov">Как угнать автомобиль</a> при помощи двух приёмопередатчиков</p>
</li>
<li>
<p><a href="https://tproger.ru/news/android-apps-spy-on-users-uxdt/">uXDT (ultrasound cross-device tracking)</a> — технология ультразвукового межустройственного слежения</p>
</li>
<li>
<p><a href="https://habrahabr.ru/post/136764/">Интернет на магнитах</a> (точнее на magnet’ах) и Межпланетная файловая система <a href="https://habrahabr.ru/post/314768/">IPFS</a></p>
</li>
<li>
<p><a href="http://vekkv.ru/individualnyj-psiholog/soznanie-i-podsoznanie/">Тройственная модель сознания</a></p>
</li>
<li>
<p><a href="http://ya-schizotypic.livejournal.com/40565.html">Принципы работы психофармы</a></p>
</li>
<li>
<p><a href="https://habrahabr.ru/users/alexeyr/posts/">Серия публикаций</a> “Логика мышления” и “Логика сознания”</p>
</li>
</ul>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<h1 id="хаос"><a name="head-chaos"></a>Хаос</h1>
<p>Человеческий мозг стремится всё упрощать. Так нужно для облегчения познания мира, сохранения энергии. За любым, самым простым, с бытовой точки зрения, явлением скрываются сверхсложные системы и процессы. Но на уровень сознания эту информацию мозг “не поднимает” — сознание очень ограничено. Можно сравнить это с ограниченностью оперативной памяти компьютера, но и это опять же, крайне сильное упрощение. Как не сойти с ума, постоянно сознательно удерживая мысли, например, о том, что всё, что каждый из нас видит, слышит, осязает и т.п. — лишь небольшая, частичная проекция мира, создаваемая в мозге, обусловленная эволюцией.</p>
<p>Мы видим не просто предметы, других людей, землю, небо — мы видим отражённое <a href="https://ru.wikipedia.org/wiki/%D0%97%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%87%D0%B5%D0%BB%D0%BE%D0%B2%D0%B5%D0%BA%D0%B0">электромагнитное излучение</a>, в диапазоне длин волн 400—750 нм, которое, проходя через сложную оптическую систему, приводит в возбуждение отростки на сетчатке глаза (которые и реагируют на определённые длины волн), которые преобразуют это возбуждение в нервные импульсы, которые сами по себе тоже — сотни и тысячи химических реакций в мельчайших нейронах, а дальше мозг, состоящий из такого количества нейронов, сколько звёзд лишь в одной нашей галактике (а галактик во Вселенной порядка 2 триллионов!), собирает всю эту информацию, синхронизируя свою работу с частотой 30-100 Гц, корректирует, удаляя искажения (сферическая и хроматическая аберрации, эффекты слепого пятна, цветокоррекция), формируя стереоскопическое изображение (а глаз-то у нас — две штуки!), пропуская полученные изображения через весь свой накопленный опыт и “прошивку” из инстинктов, рефлексов (подсознательная обработка информации), формирует образ — просто образ! — который отображается в сознании, в сознании, которое тоже кажется чем-то постоянным и незыблемым, но являющимся по себе лишь “эхом” всех хаотических внутренних процессов мозга, этаким дампом оперативной памяти (если опять проводить упрощённую аналогию с компьютерными системами), снимаемым <a href="https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_(%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%B1%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F)">с определённой частотой</a>. И именно такое зрение только у человека! Любое другое живое существо “видит” мир совершенно по-другому. У одних мозг попроще, и формируемые в нём образы лишь цепочка слайдов, без какой-то “психической” обработки, которая, в силу сложности нашего мозга, есть у нас. У других — попроще оптика, они видят ещё меньший диапазон света. Или он смещён, как, например, у наших любимых собак и кошек, что тоже обусловлено эволюцией (чтобы видеть, <em>что</em> нужно и <em>когда</em> нужно — во время охоты, в частности). А иногда “оптического” зрения вообще нет. Вон, летучие мыши, “видят” мир, посылая высокочастотные звуковые сигналы (которые мы, к слову, и не услышим никогда — “железо” не позволяет) и обрабатывая информацию о том, через сколько эти сигналы вернулись.</p>
<p>А ведь это только зрение! Через зрение человек получает более 80% информации об окружающем мире — это фундамент восприятия! <del>“Нет, реальность у всех одна, вы всё врёти!!1”</del> Рассмотрим на микроуровне какой-нибудь один процесс из описанных.</p>
<p>Возьмём передачу нервных импульсов. Тут не бьёт током и нет искрящих молний, как это изображают полуфантастические научно-популярные фильмы. У млекопитающих нервные импульсы между клетками передаются через химические синапсы. Один нейрон выдаёт нейромедиатор (сложная молекула вроде <a href="https://ru.wikipedia.org/wiki/%D0%94%D0%BE%D1%84%D0%B0%D0%BC%D0%B8%D0%BD">дофамина</a>), который передаётся соседнему нейрону (который, кстати говоря, может его принять, а может не принять), этот соседний нейрон, получив достаточное количество нейромедиаторов (а ведь там нейронные сети — каждый нейрон соединён с не менее, чем 15 000 других), начинает сам “возбуждаться” (или наоборот — “тормозиться”), высвобождая уже свой нейромедиатор, передавая сигнал дальше. После передачи сигналов таким образом, обычно (опять же, упрощаю) нейромедиатор возвращается обратно в нейрон-источник сигнала (пресинаптический нейрон) — с целью экономии.</p>
<p>Весь мир — иллюзия в наших коробках с нервными клетками. <a href="https://ru.wikipedia.org/wiki/%D0%9A%D0%B2%D0%B0%D0%BB%D0%B8%D0%B0">Совсем не факт</a>, что эта иллюзия одна и та же.</p>
<p>И опять же, это только вершина айсберга происходящих процессов, поверхностное описание происходящего с высоким уровнем абстракции. Может, спуститься на уровень взаимодействия веществ внутри клеток? Которые сами по себе уже являются отдельными, независимыми организмами (которых, на минуточку, порядка 30 триллионов), внутри которых плавает суп из миллионов веществ, элементов из больше чем половины таблицы Менделеева. А ещё там вирусы путешествуют и живут <del>своей</del> чужой жизнью…</p>
<p>Что, вообще, такое — взаимодействие веществ? Спустимся на атомный уровень, и будем нести чушь про электроны, которые вращаются вокруг ядер и переходят с одного облака на другое, да? Нет, нет никаких облаков и вращающихся электронов вокруг ядра. Это тоже — <a href="https://ru.wikipedia.org/wiki/%D0%AD%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D0%BB%D0%B0%D0%BA%D0%BE">модель</a>. Электронам, как и другим частицам, свойственен корпускулярно-волновой дуализм. Состояние электронов описывается <a href="https://ru.wikipedia.org/wiki/%D0%90%D1%82%D0%BE%D0%BC%D0%BD%D0%B0%D1%8F_%D0%BE%D1%80%D0%B1%D0%B8%D1%82%D0%B0%D0%BB%D1%8C">волновой функцией</a>, квадрат модуля которой характеризует плотность вероятности нахождения частиц в данной точке пространства в данный момент времени. И вот тут начинаются суперсложности, потому что единого мнения о том, что происходит на уровне микрочастиц, не существует. Квантовая механика, описывающая эти взаимодействия, породила большое количество вопросов и неразрешимых парадоксов. Всё, что случается на микроуровне, — случается с некоторой вероятностью. Можно это понимать <a href="https://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BF%D1%80%D0%B5%D1%82%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B2%D0%B0%D0%BD%D1%82%D0%BE%D0%B2%D0%BE%D0%B9_%D0%BC%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%BA%D0%B8">по-разному</a>.</p>
<p>Мы привыкли, что всё “просто” и “стабильно”. Сидя у сколоченных, склеенных и покрашенных кусков деревьев, расслабившись в скрученных, скрепленных и обшитых тканью деревянных или металлических палках. Сидя, обмотав тело несколькими слоями нарезанными и сшитыми тканями, вытянутых из различных волокон. На одном из бетонных пластов, стоящих друг на друге и покрытых дополнительными слоями камней и досок. Как хорошо, что рядом есть так называемые удобства, где фильтрованной питьевой водой из ближайших рек, доставленной через системы насосов и труб, мы проталкиваем по другим трубам результаты химических реакций в кишечнике и мочевом пузыре. Результаты химических реакций, которые от нашей воли никак не зависят, химических реакций, которые производят сторонние живые существа в нашем кишечники, бактерии, которые просто живут в нас. Это всё называют простым словом — микрофлора. Это слово пишут на бутылочках с йогуртами в супермаркетах, оно стало обыденным, утратило свой истинный смысл. А ведь это живые организмы, целые колонии, которые <a href="https://ru.wikipedia.org/wiki/%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D1%84%D0%BB%D0%BE%D1%80%D0%B0_%D0%BA%D0%B8%D1%88%D0%B5%D1%87%D0%BD%D0%B8%D0%BA%D0%B0">живут с нами в симбиозе</a>. Кишечник человека содержит в среднем около 50 триллионов микроорганизмов, что примерно в 1.3 раза больше, чем суммарное количество клеток организма вообще! Эти триллионы представителей 30-40 видов живут в клетке, их удерживают от побега соляная кислота и мышцы кишок.</p>
<p>Мы не замечаем, как дышим воздухом (по сути накачиваемся химическим реагентом для реакций окисления), не замечаем гравитацию (а ведь она такая классная!) — мы к этому привыкли. Как глубоководные рыбы, которые не замечают, что живут в воде. Кстати, у рыбок больше свободы: мы, можно сказать, вообще живём в плоском мире — возможности свободно двигаться по выдуманной оси Z у нас нет (ну, только в лифте, в самолёте и т.п.). Не замечаем (и никогда даже не увидим), что мы никогда не касаемся никакой поверхности, потому что это физически невозможно — у нас лишь возникает импульс в нервных окончаниях, который мы воспринимаем как касание.</p>
<p>Мы на автомате кушаем — заполняем бензобак питательными веществами, для того, чтобы все клетки наелись и функционировали, не умирали (а какие-то странные люди решили сделать из накладывания разных видов мёртвых организмов в какие-то круглые штуки целое искусство). На автомате чистим зубы — очищаем торчащую изо рта нашей медузы часть твёрдого скелета — чтобы прослужила подольше в деле размельчения пищи (а какие-то странные люди решили, что прямые и белые зубы — это красиво). И идём на работу, главное — не опоздать к определённому времени. Времени? Да, кто-то взял и придумал часы — ничего такого в природе нет. Связали с некоторой цикличностью вроде вращения вокруг Солнца и вращения вокруг оси. Но никаких циклов нет: Земля не оказывается спустя год в той же точке — мы несёмся в космические дали со всей тусой, орбиты меняются под действием приближающихся или удаляющихся объектов.</p>
<p>Всё движущееся, происходящее измеряют в секундах. Откуда взялись эти секунды? Сначала это была 1/60 часть минуты, 1/3 600 часа — в общем, по размерам тех приближенных интервалов, которыми пользовались раньше. Сейчас официальное, научное определение у секунды такое: “Секунда есть время, равное 9 192 631 770 периодам излучения, соответствующего переходу между двумя сверхтонкими уровнями основного состояния атома цезия-133.” Но секунды самой по себе нет. Время непрерывно.</p>
<p>Всё — приближение, всё — упрощение. Чем точность измерений меньше, тем всё более упрощается (как говорится, “счастье — в неведении”). Чем точность измерений выше, тем более хаотичным, бессмысленным всё это выглядит. Причём всё это — было всегда, измерили только лучше.</p>
<p>Мы первые из известных нам живых существ продвинулись настолько в развитии, что можем это всё наблюдать, анализировать, осознавать. Но есть ли в этом всём какой-то высокий смысл? Мы находимся на окраине (не в столице даже!) одной из 2 триллионов <a href="https://ru.wikipedia.org/wiki/%D0%93%D0%B0%D0%BB%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B0">галактик</a>? “<a href="https://ru.wikipedia.org/wiki/Hubble_Deep_Field">Взгляни</a> в эти глазки, эти красивые глаза…”</p>
<blockquote>
<p>В 1995 году «Хаббл» провёл исследования участка неба (Hubble Deep Field) размером в одну тридцатимиллионную площади неба, содержащего несколько тысяч тусклых галактик.</p>
</blockquote>
<p>“Кто вы в этой необъятной <a href="https://ru.wikipedia.org/wiki/%D0%9C%D1%83%D0%BB%D1%8C%D1%82%D0%B8%D0%B2%D1%81%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F">мультивселенной</a>, мистер Стрэндж?..”</p>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<p><em>Ну вот и всё… До новых встреч!</em></p>Привет, мир!Хиккинги #22017-01-08T21:00:00+00:002017-01-08T21:00:00+00:00https://hikkings.github.io/2017/01/08/second<p>Привет, мир!</p>
<p>Это второй выпуск журнала «Хиккинги».</p>
<p><a name="head-menu"></a>Сегодня в номере:</p>
<ul>
<li><a href="#head-pharma">«Фармбизнес»</a>. Интервью с представителем фармацевтической компании.</li>
<li><a href="#head-android">«Android geoservice»</a>. Небольшие заметочки в процессе программирования под Android.</li>
<li><a href="#head-buddhism">«Буддизм»</a>. Экскурс в буддизм.</li>
<li><a href="#head-ts">«ТМС и ТЭС»</a>. Транскраниальная магнитная и электрическая стимуляция: технологии будущего.</li>
<li><a href="#head-digest">«Дайджест интересностей»</a>. Prepare your кругозор.</li>
<li><a href="#head-varicella">«Ветрянка»</a>. Небольшая справка и рецепт от переболевшей редакции журнала.</li>
</ul>
<p><br /><br /></p>
<h1 id="фармбизнес"><a name="head-pharma"></a>Фармбизнес</h1>
<p>Сегодня у нас в гостях Артём. Артём работает <em>представителем фармацевтической компании</em> и поделился с нами некоторыми подробностями устройства фармацевтического бизнеса.</p>
<p><strong>— Итак, Артём, чем же конкретно Вы занимаетесь? Как проходит Ваш рабочий день?</strong> <br />
— Я работаю представителем фармацевтической компании в аптеках нашего города. Каждый день я объезжаю аптеки, в которых продаются лекарства нашей компании, проверяю выкладку — т.е. наличие наших препаратов на торговых витринах в аптеках. Помимо этого с определённой периодичностью я провожу презентации для фармацевтов аптек: рассказываю о наших препаратах, об их плюсах, о том, чем наши лекарства лучше лекарств конкурентов и т.п. Иногда в некоторых аптеках по нашим лекарствам бывают промо-акции, когда мы общаемся непосредственно с покупателями, дарим подарки при определённых покупках.</p>
<p><strong>— А аптеки, в которых Вы работаете, как-то напрямую связаны с вашей фармацевтической компанией? Вы же не сотрудник аптеки, чтобы там тусоваться…</strong> <br />
— Расскажу немного поподробнее. Например, какая-нибудь лаборатория придумывает формулу от болезни Пиздецома и делится ею с миром. В принципе, любая фармацевтическая компания может заняться производством лекарства с целью продажи. Отсюда, например, большое разнообразие лекарств на рынке с одним и тем же основным, действующим веществом…</p>
<p><strong>— Да, кстати, зачем их столько? Почему более дешёвые не вытесняют более дорогие, если там всё равно одно и то же вещество?</strong> <br />
— Дело в том, чтобы лекарство допустили к продаже, достаточно, чтобы там было именно то заявленное действующее вещество, т.е. чтобы оно соответствовало своему химическому составу. При этом таблетка на поверку может оказаться просто фуфлом, которая в силу особенностей фармокинетики, просто не будет никак воздействовать на организм. Ведь химическое вещество нужно доставить, куда нужно, избегая негативных побочных эффектов. Поэтому дешёвые лекарства с нужным составом — далеко не гарантия того, что они лучше дорогих. Скорее наоборот. В конкретном случае нужно консультироваться с врачами и фармацевтами. Но и они могут быть, так сказать, “не чисты на руку”.</p>
<p><strong>— Почему?</strong> <br />
— Дело в том, что, помимо фармацевтов в аптеках, фармкомпании работают и с врачами. Имеется в виду, что лекарства продвигаются через врачей. Разумеется, тут речь не идёт о том, что они получают какие-то денежные взятки. Но контакт с ними налаживается. Приходит представитель компании, в рубашечке и с папочкой, сидит в очереди вместе с бабками, а потом приходит к врачу и используя различные психологические приёмы, налаживает контакт и уговаривает выписывать рецепты именно на наши лекарства. Со своей стороны, обеспечивает хорошей беседой, сладостями и, например, канцелярскими товарами, которые всегда в поликлиниках нужны. Про представителя фармкомпаний, работающих с врачами, например, есть даже фильм <a href="https://ru.wikipedia.org/wiki/%D0%9B%D1%8E%D0%B1%D0%BE%D0%B2%D1%8C_%D0%B8_%D0%B4%D1%80%D1%83%D0%B3%D0%B8%D0%B5_%D0%BB%D0%B5%D0%BA%D0%B0%D1%80%D1%81%D1%82%D0%B2%D0%B0">“Любовь и другие лекарства”</a>. Вообще, налаживание контакта — это самая главная задача в нашей представительской работе.</p>
<p><strong>— Продолжим про работу с аптеками…</strong> <br />
— Да. Так вот, компании-дистрибьюторы покупают у нашей фармкомпании лекарства и продают их аптекам. Нам, в общем-то не очень важно, через какого именно дистрибьютора куплено лекарство. Но, в конечном итоге, — в наших интересах, чтобы препараты были проданы. Поэтому мы убеждаем аптеки продавать именно нашу продукцию, даём им различные бонусы. Вообще, многие небольшие аптечные сети и живут за счёт этих бонусов. Так даже не только в фармацевтической области — скорее даже в любой, где существует длинная цепочка от производителя до покупателя. Далее. Договоры — это, конечно, хорошо, но какая мотивация рядовым работникам или даже заведующим аптеки продавать определённый препарат? Бонусов они сами никаких не имеют, у них оклады. Именно для мотивации и нужен я. Я налаживаю контакт, ищу подход к заведующим, договариваюсь о выкладках и т.п.</p>
<p><strong>— Чувствуется, у Вас много знакомых врачих и вообще, женщин в халатиках.</strong> <br />
— А то! Более того, по каждой из них веду досье: это нужно и для того, чтобы не запамятовать, о чём договорились, это нужно и для систематичности, это нужно и для отчётности перед моим начальством. Когда я только устроился на работу, все эти люди для меня были абсолютно новыми и неизведанными мирами. Наверное, это был самый интересный, но и самый сложный период в моей работе. Это сейчас я со многими из фармацевтов и заведующих общаюсь и вне работы. А когда объезжаю аптеки, здороваюсь, как со старыми знакомыми, привет-привет.</p>
<p><strong>— Наверное, с Вами и фармацевты, бывает, заигрывают…</strong> <br />
— Бывает, бывает. Не зря в нашу профессию любят брать именно мальчиков. Потому что большинство занятых в медицине — всё-таки девочки. А девочки любят мальчиков.</p>
<p><strong>— В Вашей деятельности, чувствуется, человеческий фактор играет очень большую роль. А курьёзные случаи бывали?</strong> <br />
— Ну, бывает, попадались аптеки, где работали прям мерзкие личности, с которыми никак контакт наладить не удавалось. Тут уж ничего поделать не мог, на них воздействовать пришлось административно, через начальство в нашей компании. А начальство уже воздействует на директора аптеки. Но был и забавный случай. Помню, как-то тоже долго искал подход к непробивной заведующей. Вечно у неё какое-то настроение было не то, какие-то отмазки, преграды. Ну, как-то кое-как через месяц-другой пошла на сближение. Ещё через месяцок даже сдружились, стали, так сказать, чаи вместе гонять, за жизнь болтать. А через полгода я на её дочери женился :)</p>
<p><strong>— Артём, большое спасибо за Ваш рассказ, было очень интересно!</strong> <br />
— Ноу проблем. Не болейте! Пойду заваривать травы ;)</p>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<h1 id="android-geoservice"><a name="head-android"></a>Android geoservice</h1>
<p>Снова на какое-то время перекатился в программирование под Android.</p>
<p>Для начала работы в Android Studio (ибо android-плагин для Eclipse больше не поддерживается) необходимо оттюнинговать Градл, иначе сборка пустого APK и запуск будет выполняться порядка 3-10 минут. Следует внести все исправления в настройки и следовать всем советам из <a href="https://stackoverflow.com/questions/29391421/android-studio-gradle-takes-too-long-to-build/35186788">треда на StackOverflow</a>.</p>
<p><em>Задача следующая.</em> Мне нужно было написать фоновый сервис, который после запуска (до остановки пользователем) будет собирать данные его геолокации и сохранять в базу. Задача на вид тривиальная, но есть важное ограничение: сервис сбора координат не должен “умирать” при убивании приложения системой (а это довольно обычная ситуация).</p>
<p>Для реализации, как всегда в мире Android, есть куча различных способов и хаков, но я хотел использовать всё самое современное, модное и трендовое.
После часов гугления, наконец, по иронии судьбы, пришёл к официальной документации.
Итак, для того, чтобы получать обновления об изменениях геолокации сейчас используются <strong>Google Play Services Location API</strong>. Примеры:</p>
<ul>
<li><a href="https://developer.android.com/training/location/retrieve-current.html">https://developer.android.com/training/location/retrieve-current.html</a></li>
<li><a href="https://developer.android.com/training/location/change-location-settings.html">https://developer.android.com/training/location/change-location-settings.html</a></li>
<li><a href="https://developer.android.com/training/location/receive-location-updates.html">https://developer.android.com/training/location/receive-location-updates.html</a></li>
</ul>
<p>Особенно следует обратить внимание на то, что с использованием современных Google Play Services нужно и следовать современным требованиям. Например, в <strong>Android M</strong> (API 23) приложение, которое хочет узнать местоположение устройства, обязано просить разрешение не только, как раньше, в manifest-файле, но и во время выполнения:</p>
<blockquote>
<p>If the device is running Android 6.0 or higher, and your app’s target SDK is 23 or higher, the app has to list the permissions in the manifest and request those permissions at run time. For more information, see <a href="https://developer.android.com/training/permissions/requesting.html">Requesting Permissions at Run Time</a>.</p>
</blockquote>
<p>Необходимо также учесть, что при использовании сторонних библиотек и фреймворков может потребоваться <a href="https://developer.android.com/studio/build/multidex.html">включение поддержки multidex</a>, поскольку до Android 5.0 используется <em>Dalvik runtime</em>, который имеет ограничение в ~65 тыс. на общее количество методов в коде.</p>
<p>О том, как это делать, подробно описано <a href="https://blog.xamarin.com/requesting-runtime-permissions-in-android-marshmallow/">тут</a>. Google также рекомендует следовать их <a href="https://developer.android.com/training/permissions/best-practices.html">best practices</a> по запросу разрешений. В качестве информационного сообщения для инициации процесса получения разрешений решил попробовать <a href="https://developer.android.com/reference/android/support/design/widget/Snackbar.html">модный Snackbar</a>.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
Snackbar.make(view, "Location access is required.", Snackbar.LENGTH_INDEFINITE)
.setAction("OK", new View.OnClickListener() {
@Override
public void onClick(View view) {
ActivityCompat.requestPermissions(MapsActivity.this,
new String[]{
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
},
PERMISSIONS_CODE);
}
})
.show();
}
</code></pre></div></div>
<p>Контролировать сервис будем <a href="https://android-coding.blogspot.ru/2011/11/pass-data-from-service-to-activity.html">посылкой Intent’ов</a>.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Intent stopServiceIntent = new Intent(MapsActivity.this, NavigationService.CommandReceiver.class);
stopServiceIntent.putExtra(NavigationService.EXTRA_NAME, false);
stopServiceIntent.setAction(NavigationService.COMMAND_ACTION);
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(MapsActivity.this);
localBroadcastManager.sendBroadcast(stopServiceIntent);
</code></pre></div></div>
<p>Теперь о тонкости с живучестью сервиса.
Если система в целях экономии прибила приложение (основной поток), то background-сервис тоже умрёт. Однако, если при запуске сервиса (по документации) был передан флаг <code class="language-plaintext highlighter-rouge">START_STICKY</code>, то система должна перезапустить этот сервис.
Но, если сам пользователь “выкинул” приложение из выполняемых (зашёл и вручную “удалил” приложение из меню “Последние приложения”, что, в общем-то, довольно обычная ситуация), система прибивает также и background-сервис, и перезапускать не будет.</p>
<p>Тут можно применять различные методики:</p>
<ul>
<li>на onDestroy сервиса кидать <a href="https://stackoverflow.com/questions/21550204/how-to-automatically-restart-a-service-even-if-user-force-close-it">Intent, который перезапустит сервис</a>;</li>
<li><a href="https://habrahabr.ru/post/265159/">запускать foreground-сервис</a>, который система не будет убивать (и потом, если надо, хаками — прятать следы его существования).</li>
</ul>
<p>Мне скрытый геотрекинг был не нужен, поэтому я остановился на варианте с <a href="https://developer.android.com/guide/topics/ui/notifiers/notifications.html">foreground</a>-сервисом.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> Notification.Builder builder = new Notification.Builder(this).setSmallIcon(R.drawable.icon);
Notification notification = builder.build();
startForeground(NOTIFICATION_ID, notification);
</code></pre></div></div>
<p>Работа с базой минимально описана в <a href="https://developer.android.com/training/basics/data-storage/databases.html">официальной документации</a>, для асинхронности использую AsyncTask примерно вот так:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>new AsyncTask<String,Integer,Boolean>() {
@Override
protected Boolean doInBackground(String... strings) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(NavigationDataContract.COLUMN_NAME_LONGITUDE, location.getLongitude());
values.put(NavigationDataContract.COLUMN_NAME_LATITUDE, location.getLatitude());
long id = db.insert(NavigationDataContract.TABLE_NAME, null, values);
return (id != -1);
}
}.execute("");
</code></pre></div></div>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<h1 id="буддизм"><a name="head-buddhism"></a>Буддизм</h1>
<p><strong>Буддизм</strong> — религиозно-философское учение о духовном пробуждении, возникшее около VI века до н. э. в Древней Индии.</p>
<p>В отличие от монотеистических религий (иудаизм, христианство, ислам), в буддизме <em>нет</em>: всемогущего Бога-творца или Бога-личности; сотворения мира, мир считается «никем не созданным и никем не управляемым»; вечной души; искупления грехов; религиозной организации, аналогичной церкви; общих и непререкаемых для всех школ догматов и пр.</p>
<p>Традиция связывает возникновение буддизма с именем принца <em>Сиддхартхи Гаутамы</em>. Отец скрывал от Гаутамы плохое, тот жил в роскоши, женился на любимой девушке, которая родила ему сына. Толчком к душевному перевороту для царевича, как гласит предание, послужили четыре встречи. Вначале он увидел дряхлого старика, затем страдающего проказой и похоронную процессию. Так Гаутама узнал старость, болезнь и смерть — удел всех людей. Потом он увидел умиротворенного нищего странника, которому ничего не было нужно от жизни. Всё это потрясло царевича, заставило его задуматься о судьбах людей. Он тайно покинул дворец и семью, в 29 лет он стал отшельником и пытался найти смысл жизни. В результате глубоких размышлений в 35 лет он стал Буддой — просветлённым, пробуждённым. 45 лет Будда проповедовал своё учение.</p>
<p><em>Цель учения</em> — достижение <em>бодхи</em> (“просветление”, “пробуждение”, “осознание”). Слово Будда и означает «пробуждённый».</p>
<p><em>Просветление</em> — состояние полной осознанности (выход за пределы дуального ума), при котором происходит растворение эго и исчезает ощущение себя исполнителем, то есть исчезает иллюзия волеизъявления, благодаря чему возникает спонтанность умственной деятельности (точнее, она теперь принимается), в результате этого происходит разотождествление сознания со своим телом и умом. Таким образом сознание освобождается от иллюзий и отождествлений и становится чистым свидетельствованием.</p>
<p>В раннем буддизме <em>бодхи</em> было понятием, близким к понятию нирвана, они отличались только словесными описаниями: <em>нирвана</em> — свобода от желаний, страданий и привязанностей, отсутствие их влияния на события жизни; освобождение от круга рождений; состояние сознания, в котором элементы потока сознания (<em>дхармы</em>) пребывают в покое.</p>
<p>За две с половиной тысячи лет в процессе распространения буддизм впитал множество различных верований и обрядовых практик. Одни последователи буддизма делают упор на самопознание через медитацию, другие — на благие деяния, третьи — на поклонение Будде.</p>
<p>Но все они базируются на следующих доктринах:</p>
<ul>
<li><strong>четыре Благородные Истины</strong>;</li>
<li><strong>учение о причинно-зависимом происхождении и карме</strong>;</li>
<li><strong>доктрина анатмавады (принцип бессущностности, «не-души»)</strong>;</li>
<li><strong>доктрина кшаникавады (учение о мгновенности)</strong>;</li>
<li><strong>буддийская космология</strong>.</li>
</ul>
<h2 id="четыре-благородные-истины">Четыре Благородные Истины</h2>
<p>1) <strong>Первая благородная истина о страдании</strong> <br />
Существует <em>дуккха</em> («всё есть дуккха») — страдание: неудовлетворённость, непостоянство, нестерпимость. <em>Дуккха</em> — это все болезненные пристрастия человека: беспокойство, волнение, тревожность, озабоченность, страх, «неполнота», фрустрация.</p>
<blockquote>
<p>Вот, о братья, благородная истина о страдании. В муках рождается человек, он страдает увядая, страдает в болезнях, умирает в страданиях и печали. Стенания, боль, уныние, отчаяние — тяжки. Союз с немилым страдание, страдание — разлука с милым, и всякая неудовлетворенная жажда сугубо мучительна. И все пять совокупностей, возникших из привязанностей — мучительны. Такова, о братья, благородная истина о страдании.</p>
</blockquote>
<p>2) <strong>Вторая благородная истина о причине</strong> <br />
У дуккхи есть причина — <em>тришна</em>, или жажда: жизни, чувственных удовольствий, существования или несуществования, изменения. Тришна — это ненасытное стремление. Постоянное стремление удовлетворить все возникающие потребности приводит к разочарованию, потому что многие желания невозможно осуществить в полной мере. Это приводит к возникновению <em>кармы</em> (совокупность действий человека, включая его мысли и поступки). Карма вовлекает человека в процесс стремления к хорошему и плохому. Этот процесс приводит к возникновению новой кармы. Так возникает «<em>круговорот сансары</em>».</p>
<p>Удовлетворение желаний очень скоротечно и через короткое время приводит к появлению новых желаний. Таким образом получается замкнутый цикл по удовлетворению желаний. Чем больше желаний не могут быть удовлетворены, тем больше растут страдания.</p>
<blockquote>
<p>И вот, о братья, благородная истина о начале страдания. Истинно! — тот зачаток страдания лежит в жажде, обрекающей на возрождение, в этой ненасытной жажде, что влечет человека то к тому, то к другому, связана с людскими усладами, в вожделении страстей, в вожделении будущей жизни, в вожделении продления настоящей. Такова, о братья, благородная истина о начале страданий.</p>
</blockquote>
<p>3) <strong>Третья благородная истина о прекращении</strong> <br />
Существует возможность освободиться от дуккхи (прекратить действие её причины). Состояние, в котором нет дуккха, достижимо. Устранение загрязнений ума (ненужных привязанностей, ненависти, зависти и нетерпимости) — это и есть истина о состоянии за пределами «страдания». Но мало просто так прочитать об этом. Чтобы понять эту истину, нужно использовать медитацию на практике, чтобы очистить ум.</p>
<blockquote>
<p>И вот, о братья, благородная истина о пресечении страданий. Истинно! — то пресечение страданий есть уничтожение жажды, победа до конца над страстями, исцеление, освобождение, бесстрастность. Такова, о монахи, благородная истина о пресечении страданий.</p>
</blockquote>
<p>4) <strong>Четвёртая благородная истина о пути</strong> <br />
Некоторые монахи, странствовавшие с Буддой, понимали третью истину неверно, как полный отказ от всех желаний вообще, самоистязание и полное ограничение всех потребностей. Ведь даже сам Будда имел желания есть, пить, одеваться, постигать истину, и т.д. То есть тут важно отделить правильные желания от неправильных, и следовать “<em>срединному пути</em>”, т.е. держать золотую середину между физическим и духовным миром, между аскетизмом и наслаждениями.</p>
<blockquote>
<p>Две есть крайности, о братья, которым не должен следовать тот, кто отрекся от мира. С одной стороны, — влечение к вещам, вся прелесть которых зависит от страстей и от всего более, от чувственности: это низкий путь похоти, недостойный, недолжный для того, кто отдалился от мирских обольщений. С другой стороны, путь самоистязаний, недостойный, мучительный, бесплодный.
Есть средний путь: о братья, далёкий от тех двух крайностей, возвещённый Совершенным — путь, отверзающий очи, просветляющий разум и ведет тот путь к душевному миру, к возвышенной Мудрости, к совершенству пробуждения, к Нирване!
Каков же тот средний путь, о монахи, — путь далекий от обоих крайностей, возвещенный Совершенным, что ведет к Совершенству, к возвышенной Мудрости, к душевному миру, к совершенному пробуждению, к Нирване?
Истинно! То восьмеричный Благородный путь: истинное воззрение, истинное намерение, истинная речь, истинные поступки, истинный образ жизни, истинное усердие, истинное размышление, истинное сосредоточение</p>
</blockquote>
<h2 id="восьмеричный-срединный-путь">Восьмеричный (срединный) путь</h2>
<p>Благородный Восьмеричный Путь — путь, указанный Буддой, ведущий к прекращению страдания и освобождению от сансары.
Благородный Восьмеричный Путь состоит из следующих ступеней, разделяемых на три группы:</p>
<ul>
<li><strong>Мудрость</strong>
<ul>
<li>
<p><strong>истинное воззрение</strong>: правильное воззрение в первую очередь включает в себя постижение <em>четырёх благородных истин</em>. После этого буддисту необходимо постигнуть и прочие основные положения учения, которые необходимо «внутренне пережить» и реализовать в виде главной мотивации своего поведения.</p>
</li>
<li>
<p><strong>истинное намерение</strong>: буддисту необходимо принять твёрдое решение <em>следовать буддийскому пути</em>, ведущему к освобождению и нирване. Также ему необходимо выращивать в себе <em>метту</em> — любящую доброту по отношению ко всем живым существам, дружелюбие, благожелательность, согласие, добрая воля, любовь, симпатия, добросердечность, сорадование и активный интерес к другим.</p>
</li>
</ul>
</li>
<li><strong>Нравственность</strong>
<ul>
<li>
<p><strong>истинная речь</strong>: <em>воздержание от лжи</em>: говорить правду, придерживаться правды, быть надёжным, не обманывать; <em>воздержание от речей, сеющих распри</em>: не рассказывать то, что может поссорить людей; <em>воздержание от грубых слов</em>: говорить мягкие слова, проникающие в сердце, вежливые; <em>воздержание от пустословия</em>: говорить достойные слова, в нужный момент, здравые и объясняющие.</p>
</li>
<li>
<p><strong>истинные поступки (поведение)</strong>: необходимо придерживаться пяти заповедей: <em>воздержание от убийства</em>, <em>воровства</em>, <em>распутства</em>, <em>лжи</em> и <em>опьянения</em>. Соблюдение этих заповедей ведёт к гармонии на разных уровнях — социальном, психологическом, кармическом и созерцательном. Упражнения в моральной дисциплине являются основой для упражнений следующих ступеней, в сосредоточении и мудрости. При дальнейшем углублении сознания этические запреты, служащие для сдерживания аморальных действий в начале пути, переходят в потребность учитывать чувства других живых существ.</p>
</li>
<li>
<p><strong>истинный образ жизни</strong>: в первую очередь в это понятие входит <em>отказ от профессий, причиняющих страдания живым существам</em> (связанными с торговлей живыми существами, с изготовлением и продажей оружия, связанными с производством мяса, связанными с одурманивающими веществами, любая деятельность, связанная с обманом, накоплением богатства неправедными и преступными путями). Поскольку труд занимает большую часть времени, то для обретения внутреннего мира следует стремиться зарабатывать на жизнь в соответствии с буддийскими ценностями. Правильный образ жизни включает также <em>отказ от излишеств, богатства и роскоши</em>. Только при этом условии можно избавиться от зависти и других страстей и связанных с ними страданий.</p>
</li>
</ul>
</li>
<li><strong>Духовная дисциплина</strong>
<ul>
<li>
<p><strong>истинное усердие (усилие)</strong>: правильное усилие включает в себя стремление сосредоточить свои силы и реализовать следующие состояния, способствующие пробуждению: <em>самоосознавание</em>, <em>усилие</em>, <em>концентрация</em>, <em>различение дхарм</em>, <em>радость</em>, <em>спокойствие</em>, <em>умиротворение</em>.</p>
</li>
<li>
<p><strong>истинное размышление (памятование)</strong>: правильное памятование (<em>смрити</em>) включает в себя «осознавание собственного тела, ощущений, ума и ментальных объектов» с целью достижения «непрерывной осознанности». Практика смрити или сати состояла в том, что Будда не пытался подавить различные образы, мысли и ощущения, а «просто сидел, наблюдая за своими чувствами и мыслями, за тем, как они возникают и складываются в случайные узоры». В результате чего он последовательно увидел себя как «скопление физических и психических состояний», непостоянных и взаимозависимых друг от друга; увидел, что причиной физического состояния является действие желания, а желание является поверхностным слоем «эго», являющимся «представлением о собственном „Я“». Более внимательно рассмотрев «эго», Будда увидел его как следствие кармы, представляющей собой действие «результирующей энергии» прошлого. Наблюдая за потоком кармы, идущим из прошлого, Будда осознал, что «<em>один поток жизни даёт начало другому, и так без конца</em>». Увидев всю цепочку причин с помощью практики смрити, Будда окончательно осознал, что страдание и волнение является следствием желания и связанного с ним «эго» и может быть прекращено разрушением иллюзии «эго».</p>
</li>
<li>
<p><strong>истинное сосредоточение</strong>: правильное сосредоточение включает в себя <em>глубокую медитацию</em> (созерцание, особая сосредоточенность сознания на объекте созерцания), а также развитие <em>концентрации</em>, и ведёт к достижению <em>предельной созерцательности</em> (при которой исчезает сама идея собственной индивидуальности и возникает единство воспринимающего и воспринимаемого), а затем и к <em>освобождению</em>.</p>
</li>
</ul>
</li>
</ul>
<h2 id="учение-о-причинно-зависимом-происхождении-и-карме">Учение о причинно-зависимом происхождении и карме</h2>
<p><em>Пратитья-самутпада</em> — учение о причинно-зависимом происхождении, теория взаимозависимого возникновения. Это концепция причинности, разработанная в попытке уяснить причины страдания и способы избавления от него. Пратитья-самутпада постулирует, что в мире перерождений всё обусловлено; нет ни причин, ни следствий; определена не сущность явления, но лишь условия его возникновения и невозникновения.</p>
<p>А вот карма создается только <em>намеренным</em>, то есть <em>осознанным действием</em>, а не всяким действием вообще. Будда отрицал как кармический детерминизм, согласно которому текущий момент полностью предопределён прошлой кармой, а будущее изменить невозможно, так и индетерминизм, согласно которому настоящее не имеет причин. У кармы существуют две части: <em>дайва</em> (судьба) и <em>пуруша-кара</em> («человеческое действие»). Первая часть кармы связана с прошлыми поступками и является частью, которую человек не может изменить. Вторая часть является «свободной инициативой», с помощью которой человек может действовать таким образом, чтобы создать условия для изменения будущего.</p>
<p>Будда призывал последователей сместить внимание с прошлого на настоящее, говоря, что выражение «Что посеешь в прошлом, то и пожнёшь» обнуляет ценность правильного поведения и убирает возможность достичь освобождения. Поэтому более правильным выражением Будда считал выражение «<em>Пожинаешь то, что сеешь в настоящем</em>». Результаты действий в настоящем, согласно Будде, могут проявляться как в этой жизни, так и в последующих жизнях.</p>
<h2 id="доктрина-анатмавады-теория-несуществования-души">Доктрина анатмавады (теория несуществования души)</h2>
<p>Это одно из основных положений буддийской философии, состоящее в <em>отрицании абсолютного непреходящего “Я”</em>, высшего “Я”.</p>
<p>По буддийским представлениям, закон изменяемости универсален: ни человек, ни какое-либо другое существо — одушевлённое или неодушевлённое — не исключаются из сферы его действия. Большинство людей верит в то, что в человеке живёт некая субстанция, называемая душой (<em>атман</em>), которая продолжает существовать, несмотря на все изменения, претерпеваемые телом, которая существовала до рождения и будет существовать после смерти, переселяясь из одного тела в другое.</p>
<p>В соответствии со своей теорией обусловленного существования и всеобщей изменяемости Будда отрицает существование такой души (<em>анатман</em>). Но в таком случае могут спросить, как же он объясняет целостность личности во всех её перерождениях или даже просто в различных стадиях развития — детстве, юности и старости. Отрицая целостность идентичной субстанции в человеке, Будда не отрицает целостности потока последовательных состояний, из которых образуется его жизнь. Жизнь — это непрерывный ряд состояний; каждое из них зависит от предшествующих условий и, в свою очередь, порождает следующее состояние.
Таким образом, концепция души заменяется здесь <em>концепцией непрерывного потока сознания</em>. Поскольку данное состояние сознания получает в наследство свои характерные черты от предыдущего состояния, прошлое существует в настоящем. Память, таким образом, можно объяснить без допущения наличия души.</p>
<p>Эта теория несуществования души играет весьма важную роль в понимании учения Будды. Он неустанно убеждает своих учеников отбросить заблуждения о самих себе. Будда указывает, что те, кто страдает иллюзией о своём я, не знают своей собственной природы; однако они решительно протестуют против утверждения, что любят душу; они хотят сделать душу счастливой, достигнув спасения. Будда сравнивает это с любовью к самой красивой девушке страны, которую, однако, никто никогда не видел и не знал, а также с сооружением лестницы для подъема во дворец, которого человек никогда не видел.</p>
<h2 id="доктрина-кшаникавады-теория-мгновенности">Доктрина кшаникавады (теория мгновенности)</h2>
<p><em>Кшаникавада</em> — учение о мгновенности бытия и непостоянстве любого состояния. «<em>Кшана</em>» означает мгновение — время, за которое можно щелкнуть пальцами.
Согласно буддийскому учению, <em>кшана</em> составляет продолжительность вспышки одной <em>дхармы</em> (элемента бытия). Ежемгновенно дхармы вспыхивают и исчезают, образуя новый «узор», новую комбинацию, обусловленную законом взаимозависимого возникновения (<em>пратитьясамутпада</em>) и кармой. Не существует ни материи, ни иной субстанции, есть лишь поток последовательных психических элементов — дхарм. Восприятие мира живыми существами подобно восприятию кадров на движущейся кинопленке, которые так быстро сменяют друг друга, что <em>у наблюдающих создаётся полная иллюзия стабильной и длящейся реальности</em>.</p>
<h2 id="буддийская-космология">Буддийская космология</h2>
<p><em>Буддийская космология</em> — представление о мироздании, перерождениях и местопребываниях, развитии вселенной. Следует отметить, что буддийская космология рассматривает в первую очередь духовные миры,
которые не всегда имеют материальный эквивалент.</p>
<p>В первую очередь выделяются три сферы, <em>тридхату</em>:</p>
<ul>
<li>сфера чувственного, <em>камадхату</em>, в которой пребывают существа, испытывающие чувства, желания, стремления, страсти;</li>
<li>сфера форм (материальная сфера), <em>рупадхату</em>, соответствующая <em>дхьянам</em> (йогическим сосредоточениям) полной объективности, когда чувственное отсутствует, но присутствуют только элементы материи (формы), сознание в сфере форм находится в состоянии объективности и беспристрастности;</li>
<li>сфера отсутствия форм (нематериальная сфера), <em>арупьядхату</em>, в которой отсутствуют элементы материального мира.</li>
</ul>
<p>Каждый уровень или местопребывание соответствует определённому состоянию сознания. Местопребывание зависит от предыдущих деяний (карма) и от состояния сознания существа в данный момент. Миры существуют, пока в наличии есть существа, их заполняющие. Миры исчезают, если не остаётся никого, кто этому миру принадлежит. И снова возникают, если возникнет хотя бы одно существо с сознанием этого мира.</p>
<p>Описание мироздания содержит много элементов мифологии. Буддизм никогда не воспринимал эти описания буквально, уровни и местопребывания имели скорее метафорический смысл.</p>
<p>На этой ноте конспект о буддизме обрывается, поскольку буддийская космология полна индийскими ведийскими представлениями и шаманскими культами, и суть учения быстро теряется среди заскоков про ады, перерождения вселенных и различных богов, которые излучают свет вспышками молний и восклицают aho sukham! («О радость!»).</p>
<p>Если кому-то интересно, может продолжить искания по этому вопросу, начиная со <a href="https://ru.wikipedia.org/wiki/%D0%91%D1%83%D0%B4%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%B0%D1%8F_%D0%BA%D0%BE%D1%81%D0%BC%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F">страницы Википедии</a>.</p>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<h1 id="транскраниальная-магнитная-и-электрическая-стимуляция"><a name="head-ts"></a>Транскраниальная магнитная и электрическая стимуляция</h1>
<p><strong>Транскраниальная магнитная стимуляция</strong> — метод, позволяющий неинвазивно (транскраниально — сквозь кости черепа) стимулировать кору головного мозга при помощи коротких магнитных импульсов.</p>
<p>Использование переменного магнитного поля для стимуляции нейронных структур основывается на концепции Майкла Фарадея об <em>электромагнитной индукции</em> (1831). Жак Арсен д’Арсонваль в 1896 году впервые применил магнитное поле на людях и смог индуцировать <em>фосфены</em> — зрительные ощущения, возникающие у человека без воздействия света на глаза.</p>
<p>ТМС использовалась в экспериментах по передачи информации на расстояние, где устройством ввода/вывода являлись мозги экспериментаторов. Из мозга человека, находящегося в Индии, в мозг человека во Франции, на расстояние 5 тысяч километров были переданы слова с помощью некоего аналога азбуки Морзе. Получившийся двоичный код по электронной почте был послан во Францию. Там его передавали трем принимающим сигнал французам с помощью транскраниальной магнитной стимуляции зрительной коры мозга. Участники <a href="http://rusrep.ru/article/2014/12/11/do-chego-doshel-progress/">эксперимента</a> сидели с завязанными глазами, а «точки» и «тире» доходили до них как зрительные сигналы — в виде ярких вспышек в области периферического зрения.</p>
<p>В <a href="http://www.popmech.ru/science/14632-telepatiya-po-seti-internet/">другом эксперименте</a> в Вашингтонском университете один участник мысленно управлял действиями другого. Запись электрической активности Раджеша Рао (Rajesh Rao) была передана на другой край студенческого городка, где рука его коллеги, Андреа Стокко (Andrea Stocco), нажала на кнопку, повинуясь магнитной стимуляции соответствующей области мозга. Рао, глядя на монитор компьютера, к которому был подсоединен его электроэнцефалограф, представил, что двигает рукой, чтобы нажать на кнопку и выстрелить из пушки в виртуальной игре. Почти мгновенно Стокко пошевелил указательным пальцем правой руки и нажал на пробел. Он сравнил ощущение, возникшее при этом, с нервным тиком. «Это было одновременно интересно и жутковато — наблюдать, как Стокко воспроизводит мои воображаемые действия, — сказал Рао. — Сейчас это был односторонний поток информации от моего мозга к его. Следующий шаг — наладить диалог».</p>
<p>Эти же ребята провели <a href="https://nplus1.ru/news/2016/12/06/direct-brain-stimulation">эксперименты</a>, которые показали, что человеческий мозг может интерпретировать информацию о виртуальном мире без использования органов чувств — в проведенных экспериментах добровольцы проходили невидимый лабиринт, ориентируясь по фосфенам.</p>
<p>Эксперименты с ТМС <a href="http://informing.ru/2015/10/25/uchenye-vyyasnili-kak-mozhno-oslabit-veru-v-boga.html">показали</a> , что воздействуя на определённые отделы мозга, можно снижать веру человека в иррациональное. Нейрофизиолог больницы Цюрихского университета Бруггер <a href="http://www.yoki.ru/anomalous/unreal/14-12-2015/450978-ezoteric-0/">обнаружил</a>, что у тех, кто якобы пережил личный опыт столкновения со сверхъестественным, доминирует правое мозговое полушарие, которое ответственно за распознавание лиц, отдельные виды творческого мышления, восприятие музыки и визуальных изображений.</p>
<p>Сейчас транскраниальная магнитная стимуляция применяется во многих областях медицины для:</p>
<ul>
<li>неинвазивной диагностики: болезней нервной системы, сосудистых заболеваний головного мозга, травматических повреждений спинного мозга, психических заболеваний, эпилепсии, мигрени и др.;</li>
<li>лечения: моторных нарушений, депрессии, спастичности, болевых синдромов, болезни Паркинсона, слуховых галлюцинаций, обсессивно-компульсивных расстройств, обострений шизофрении, наследственных дегенеративных болезней.</li>
</ul>
<p>Существует также <strong>транскраниальная электростимуляция</strong>. Аппараты для стимуляции мозга оснащены электродами, который посылают слабый ток к определенным участкам коры головного мозга. Постоянный ток, протекающий через ткани мозга, создает электрическое поле, которое изменяет разность потенциалов на мембранах нейронов. Согласно фармакологическим исследованиям, в районе синаптических контактов под воздействием электрического тока увеличивается производство NMDA-рецептора. Это усиливает пластичность нервной ткани, временно придавая ей состояние, при котором нейроны склонны перестраивать свои соединения в ответ на внешний стимул, такой как обучение новому поведению.</p>
<p>ТМС и ТЭС помогают лечить различные заболевания:</p>
<ul>
<li><a href="http://www.km.ru/zdorove/2013/04/04/otkrytiya-v-oblasti-meditsiny-i-zdorovya/707677-kokainovuyu-zavisimost-vylechat-m">наркозависимость</a></li>
<li><a href="http://hitech.newsru.com/article/02dec2016/memories">восстановление утерянных воспоминаний</a></li>
<li><a href="http://www.mk.ru/science/2016/12/07/obnaruzhen-sposob-iskusctvenno-vklyuchat-i-vyklyuchat-polovoe-vlechenie.html">искусcтвенное включение и выключение полового влечения</a></li>
<li><a href="https://nplus1.ru/news/2019/03/12/tacs-v-mdd">облегчение</a> <a href="http://medportal.ru/mednovosti/news/2008/10/13/depression/">депрессии</a></li>
<li><a href="http://hi-news.ru/technology/ekzoskelet-i-elektricheskaya-stimulyaciya-vozvrashhayut-vozmozhnost-xodit.html">паралич конечностей</a></li>
</ul>
<p>Но самое главное, почему стоит назвать ТМС и ТЭС технологиями будущего, — это то, что их воздействие на участки мозг здорового человека <a href="http://elementy.ru/nauchno-populyarnaya_biblioteka/431366/Kak_usilit_rabotu_mozga">приводит к улучшению работы этих участков</a>. Стимуляция мозга уже на вооружении у военных США. В 2011 году Винсент Кларк, невролог из Университета Нью-Мексико, продемонстрировал простое устройство, состоящее из девятивольтовой батарейки, резистора и набора электродов для крепления на скальпе. Ток в 2 мА позволил испытуемым набрать в тренировочной видеоигре DARWARS Ambush!, которую военное ведомство США использовало в качестве тренажера для солдат, отправляющихся в Ирак, вдвое больше очков, чем у их коллег из контрольной группы: <em>игроки обучались быстрее, хотя и не понимали причин этого</em>.</p>
<p>Профессор Снайдер из Центра по изучению сознания в Сиднее утверждает, что каждый из нас обладает возможностями, которые демонстрируют так называемые саванты, люди с экстраординарными способностями. В нормальном мозгу эти возможности присутствуют, но подавлены высокоуровневой обработкой информации, организующей целостное смысловое восприятие. У савантов же доступ к сырым, необработанным данным не блокирован, и они пользуются непосредственно тем, что содержит мозг. К сожалению, чаще всего такой открытый доступ сопровождается аутизмом.</p>
<p>У обычного человека высокоуровневую блокировку можно временно снять методом низкочастотной транскраниальной магнитной стимуляции. В экспериментах Снайдера магнитные импульсы направлялись в левую переднюю височную долю испытуемых, после чего у них <em>наблюдались заметные улучшения способностей в рисовании, чтении и счете</em>. Левая передняя височная доля участвует в семантической обработке и формировании категорий, а магнитное воздействие в чем-то аналогично временному подавлению этой области. В результате, как предполагает Снайдер, высвобождается активность правого полушария, и человек начинает воспринимать поток низкоуровневых данных, идущих оттуда. Если Снайдер прав, нас ожидают времена, когда в распоряжении людей появится когнитивный усилитель, и они будут использовать его в своей деятельности.</p>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<h1 id="дайджест-интересностей"><a name="head-digest"></a>Дайджест интересностей</h1>
<ul>
<li>
<p>В штате Мичиган полностью <a href="http://www.furfur.me/furfur/changes/changes/219607-michigan">легализованы беспилотные автомобили</a>.
А вот в Калифорнии на беспилотном такси по промокодам (шутка) покататься не дали, видимо, из-за <a href="https://vc.ru/n/uber-california-self-stop">местной бюрократии</a>. А <a href="https://vk.com/video43796590_456239403">тут</a> можно посмотреть, как автопилот Tesla проехался по Москве.</p>
</li>
<li>
<p>Во Франции уже <a href="http://www.furfur.me/furfur/changes/changes/219705-drones">дронами доставляют почту</a>, а в Китае <a href="https://tjournal.ru/39424-kitaici-pokazali-ispitaniya-bespilotnogo-taksi">на дронах уже летают люди</a>.</p>
</li>
<li>
<p>Национальному совету по гомеопатии <a href="https://lenta.ru/news/2016/12/22/around_the_homeopathy/">провели</a> гомеопатической таблеткой по губам.</p>
</li>
<li>
<p>Родриго Дутерте — президент Филиппин, <a href="http://www.furfur.me/furfur/freedom/freedom/219639-duterte-strikes-again">собственноручно убивавший дилеров</a>.</p>
</li>
<li>
<p><a href="https://meduza.io/feature/2016/12/16/tri-goda-v-plenu-u-islamistov">История путешественника Константина Журавлева</a>, который провёл 3 года в плену в Сирии.</p>
</li>
<li>
<p><a href="http://www.zhurnal.ru/staff/gorny/translat/deklare.html">Декларация независимости Киберпространства</a>, написанная основателем и вице-председателем Electronic Frontier Foundation. Актуально как никогда.</p>
</li>
<li>
<p><a href="http://www.fontanka.ru/2010/11/13/058/">Воспоминания</a> экс-руководителя аналитического управления КГБ, бывшего замначальника советской разведки генерал-лейтенанта Николая Леонова.</p>
</li>
<li>
<p>Первый МакАвто (в США они называются McDonald’s drive-thru) <a href="http://militaryhumor.net/the-first-mcdonalds-drive-thru/">появился</a> в 1975-м году в штате Аризона, экспериментально, для обслуживания солдат с расположенной неподалёку военной базы, которым было запрещено покидать свои транспортные средства.</p>
</li>
<li>
<p>Хотя обманывать и злоупотреблять доверием — плохо, но раз уж эти истории уже случились, почему бы ими не восхититься: <a href="https://www.moya-planeta.ru/travel/view/zhulik_jeto_prizvanie_26523/">аферы</a> самых наглых, самых обаятельных и самых виртуозных авантюристов недавнего прошлого.</p>
</li>
<li>
<p><a href="http://www.furfur.me/furfur/changes/changes/219749-kinky_party">Отличная статья</a> (я бы даже назвал это отличным примером <a href="https://ru.wikipedia.org/wiki/%D0%93%D0%BE%D0%BD%D0%B7%D0%BE-%D0%B6%D1%83%D1%80%D0%BD%D0%B0%D0%BB%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0">гонзо-журналистики</a>) о секс-вечеринке в закрытом московском клубе.</p>
</li>
<li>
<p>О том, что произойдёт с человеком <a href="http://hi-news.ru/eto-interesno/chto-proizojdyot-s-chelovekom-bez-skafandra-v-otkrytom-kosmose.html">без скафандра в открытом космосе</a>. Нет, его не разорвёт от отсутствия атмосферы.</p>
</li>
<li>
<p>Оказывается, на Западе группа Nickelback - это целый мем. <a href="https://meduza.io/shapito/2016/12/09/pochemu-vse-nenavidyat-nickelback">Про них шутят</a>, а сами участники группы воспринимают это всё всерьёз. И ещё один забавный <a href="https://meduza.io/shapito/2016/03/13/prosti-mett-v-sleduyuschiy-raz">мемес</a> американского ТВ-шоу: “издевательства” над Мэттом Дэймоном в ток-шоу Джимми Киммела.</p>
</li>
</ul>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<h1 id="ветрянка"><a name="head-varicella"></a>Ветрянка</h1>
<p><strong>Ветрянка</strong> — она же “ветряная оспа” (Varicella) — острое вирусное заболевание с воздушно-капельным путём передачи.</p>
<p><em>Восприимчивость</em>: 100%. <br />
<em>Инкубационный период</em>: 7-21 день. <br />
<em>Время выздоровления</em>: от 2-5 дней до 9-20 дней. <br />
<em>Симптомы</em>: в первый день — ничего особенного, температурка, слабость, иногда — ломота в теле; в остальные дни — по телу поползут прыщики, наполненные жидкостью, которые будут зудеть; высокая температура и осознание, что ближайшие следующие 2 недели — просраны.</p>
<p>Что нужно для наилучшего лечения:</p>
<ul>
<li><em>лосьон “Каламин”</em> — чтобы приколы на теле подсохли быстрее и меньше зудели;</li>
<li><em>ибупрофены / парацетамолы</em> — чтобы сбивать температуру, жар и ломоту;</li>
<li><em>бриллиантовый зелёный</em> (это звучит намного прекраснее, нежели зелёнка) и <em>растворы йода</em> — чтобы мазать всю эту парашу, которая появляется на теле (профилактика заражений микробами);</li>
<li>противовирусный <em>ацикловир</em> — чтобы ускорить выздоровление и облегчить переносимость болезни, если заболел взрослый человек (для детей он неэффективен);</li>
<li><em>антигистаминный препарат</em> (“Супрастин”) — для уменьшения аллергических реакций — кожного зуда;</li>
<li><em>постельный режим, фрукты, витамины, белки</em>.</li>
</ul>
<p>Желаем здравия!</p>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<p><em>Ну вот и всё… До новых встреч!</em></p>Привет, мир!Хиккинги #12016-11-28T21:00:00+00:002016-11-28T21:00:00+00:00https://hikkings.github.io/2016/11/28/welcome<p>Привет, мир!</p>
<p>Это первый выпуск журнала «Хиккинги».</p>
<p><a name="head-menu"></a>Сегодня в номере:</p>
<ul>
<li><a href="#head-bitcoins">«Знакомство с криптовалютами»</a>. Любопытные открытия и мои жалкие попытки торговли на Bitcoin-биржах.</li>
<li><a href="#head-blog">«Блог на Jekyll»</a>. Рассказ о том, сколько нервов требуется, чтобы развернуть такой же блог.</li>
<li><a href="#head-luring">«Завлекатель»</a>. Тайны одной старинной профессии.</li>
<li><a href="#head-digest">«Дайджест интересностей»</a>. Набор ссылочек для расширения кругозора.</li>
<li><a href="#head-lev">«На словах ты Лев Толстой»</a>. Небольшая коллекция цитат из мемуаров Л.Н.Толстого. Всё за жизнь!</li>
<li><a href="#head-tinkoff">«Знакомство с “Тинькофф Инвестициями”»</a>. О новой платформе для инвестирования в банке Тинькофф.</li>
</ul>
<p><br /><br /></p>
<h1 id="знакомство-с-криптовалютами"><a name="head-bitcoins"></a>Знакомство с криптовалютами</h1>
<p>Хочется провести небольшую экскурсию в мир криптовалют. Наверняка, многие из уважаемых читателей слышали про криптовалюты в новостях, о том, как чёртовы наркоманы и террористы тайно расплачиваются с поставщиками наркотиков и оружия биткоинами на секретных форумах. Или о том, что государство нас спасло и <a href="https://geektimes.ru/post/244151/">заблокировало многие сайты</a> с информацией о биткоинах. И вообще - биткоины вне закона. Тем не менее, несмотря на ужасное будущее, которое ждёт простого обывателя, если он узнает о биткоинах, то же государство в лице банков сильно заинтересовались принципами и технологиями, лежащими в основе биткоинов, что даже <a href="http://www.comnews.ru/content/104083/2016-10-06/banki-shagnuli-k-blockchain">начали испытывать</a> эти платёжные принципы для межбанковских переводов.</p>
<p>Итак, постараюсь вкратце описать, что это за ужасный зверь такой, <em>откуда берутся биткоины, кто выпускает и как они устроены</em>.</p>
<p>Если технические подробности неинтересны, то биткоины — это единая финансовая сеть, в котором операции необратимы, а биткоины выпускаются теми участниками, которые обладают большими вычислительными мощностями и обслуживают и укрепляют сеть. Ценность их определяется тем, что они практически закончатся к <strong>2033</strong> году. Надёжность обеспечена тем, что они не зависят от каких-то государств и банков.</p>
<p>Если хочется немного “приоткрыть капот” и понять устройство, идём дальше.
Для начала упомяну, что сеть Bitcoin — распределённая и децентрализованная.</p>
<p>Чтобы понять, что это значит и как может быть реализовано, можно вспомнить о торрентах (Bittorrent) и других файлообменных сетях (например, старые добрые ed2k). Обычно, если нужно было что-то скачать, то вы заходили на т.н. <em>трекер</em> - веб-сайт, на котором, помимо всякого описания и комментариев, есть ссылка на скачивание <em>торрент-файла</em>. Торрент-файл содержит информацию о раздаваемом файле — <em>хеши</em> частей файла, а также адрес трекера. Хеш представляет собой контрольную сумму и, в то же время, уникальный идентификатор, который получается в результате применения серии математических операций к содержимому и файлов и метаинформации о них. С помощью трекера торрент-клиент узнаёт IP пользователей, у которых можно скачать определённые части файла. Но сеть Bittorrent может работать и <a href="https://ru.wikipedia.org/wiki/Kademlia">без трекера</a>. В этом случае, вместо торрент-файла вы используете <a href="https://ru.wikipedia.org/wiki/Magnet-%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0">magnet-ссылку</a>, которая содержит в себе только информацию с хешами разыскиваемого объекта для скачивания. Как же в этом случае узнать IP-адреса машин, откуда можно загрузить части файла?</p>
<p>Изначально, клиент для такой сети содержит некоторый минимальный список с информацией о других участниках сети, т.е. их идентификаторы и IP-адреса — причём участники сети именно такие, которые заведомо активны и через которых можно будет объявить другим участникам сети о том, что ты теперь тоже участник сети, и вот такой у тебя идентификатор. Обмен такими метаданными об участниках сети и имеющихся у них частях файлов происходит постоянно. На основе <a href="https://en.wikipedia.org/wiki/Kademlia">этих принципов</a> работает, например, и оверлейная (т.е. работающая поверх “обычного” интернета) <a href="https://ru.wikipedia.org/wiki/I2P">сеть I2P</a>.</p>
<p>С точки зрения того, кто изначально решил “поделиться” файлом БЕЗ трекера, процесс следующий. После вычисления хешей для файла, клиент сети рассылает информацию другим участникам сети, <em>идентификаторы</em> которых <em>математически близки</em> к хешам для файла. Таким образом, тот, кто будет искать части файла, найдёт информацию о том, откуда можно их скачать, — на машинах, идентификатор которых близок к хешам частей файла (т.е. где физически находится часть файла).</p>
<p>Это пример того, как может быть устроена децентрализованая (одноранговая, peer-to-peer) сеть. В случае Bitcoin алгоритмы поиска других участников сети <a href="https://en.bitcoin.it/wiki/Satoshi_Client_Node_Discovery">немного сложнее</a>.</p>
<p><br /></p>
<p>Теперь обратимся к биткоин-кошелькам. Представьте себе некую команду разработчиков, которая выпускает программу кошелька, со свободной лицензией и открытым исходным кодом. Любой может исправить ошибки в безопасности этого кошелька, предложив свои изменения — а <em>сообщество</em> — другие разработчики, тестировщики, безопасники, криптографы, на добровольных началах — принимают общее решение, принимать эти изменения или нет. Таким образом, сообщество использует программы, которые взаимодействую между собой единым образом, по единому протоколу.</p>
<p>Присоединяясь к “криптовалютной сети”, участник генерирует свой уникальный идентификатор кошелька и персональную <em>связку ключей</em> (открытого и закрытого), связанную с этим кошельком. Закрытый ключ — если не погружаться в криптографические тонкости — представляет собой длинное-длинное число — а по сути информацию, с помощью которой можно подтвердить, что именно ты владеешь этим кошельком, и подобрать этот ключ невозможно (сложность вычислений для подбора ключа превышает существующие вычислительные мощности всей планеты в настоящее время).</p>
<p>Каждый кошелёк биткоин-сети скачивает информацию обо всех переводах, существовавших с появления программ для сети Bitcoin. Это нужно для того, чтобы у всех участников, помимо единого протокола обмена, была единая информация о состоянии всех счетов в сети.</p>
<p><br /></p>
<p>При инициации перевода клиент кошелька создаёт блок данных, содержащий в себе информацию о том, откуда, сколько и куда передаётся единиц криптовалюты, подтверждая эту процедуру своей подписью, вычисляемой с помощью закрытого ключа. Эта подпись может быть проверена любым участником сети, поскольку известен открытый ключ отправителя, а на основе открытого ключа можно, с помощью вычисления значения криптографической функции, проверить валидность подписи.</p>
<p>Но не только финансовую информацию содержит этот блок данных. Он содержит также информацию (метаинформацию) о последних переводах в сети. Таким образом реализуется единообразие финансовых показателей на всех счетах — в результате обмена информацией между участниками сети, у всех будет одна и та же цепочка переводов. Распределенная база данных — <em>Blockchain</em> — <a href="https://ru.wikipedia.org/wiki/%D0%A6%D0%B5%D0%BF%D0%BE%D1%87%D0%BA%D0%B0_%D0%B1%D0%BB%D0%BE%D0%BA%D0%BE%D0%B2_%D1%82%D1%80%D0%B0%D0%BD%D0%B7%D0%B0%D0%BA%D1%86%D0%B8%D0%B9">формируется</a> как непрерывно растущая цепочка блоков с записями о всех транзакциях. Информация в блоках не шифрована и доступна в открытом виде.</p>
<p>Система устроена так, что каждый узел не будет проверять и распространять всякий блок (а точнее цепочки блоков, поскольку транзакций немало), тратя свои вычислительные мощности. Для этого есть специальные участники сети — <em>майнеры</em> — которые выполняют именно эту функцию — функцию проверки и подтверждения правильности цепочки переводов. Именно этим они и зарабатывают биткоины: выполняя полезную работу по укреплению связности (“если куда-то убыло, то куда-то прибыло, и это необратимо”) финансовых операций. Тут мы подходим как раз к теме <em>эмиссии</em>, т.е. выпуска биткоинов — собственно, откуда они могут появиться на счёту.</p>
<p><br /></p>
<p>Дело в том, что чтобы сформированный блок был принят участниками сети и записан в их локальные базы, требуется, чтобы числовое значение хеша блока было определённого вида (чтобы результат вычислений попадал в определённый диапазон — который, к слову, со временем меняется, таким образом меняется вычислительная <em>сложность</em> этого процесса). Когда подходящий вариант хеша найден, майнер рассылает полученный блок другим подключённым узлам для проверки. Если ошибок нет, то каждый узел сети получивший блок записывает его в свой экземпляр базы, а на счёт майнера записывается некоторое количество заработанных им биткоинов. Причём зарабатывает только тот майнер, который первым сгенерировал нужный блок данных. Дополнительно к основному переводу можно (и чаще — нужно) добавлять дополнительное вознаграждение майнеру, чтобы транзакцию обработали как можно быстрее (обычно требуется примерно 2-30 минут на генерацию минимального количества подтверждений, которым будет верить сеть).</p>
<p>В первых версиях программы-клиента была кнопка “сгенерировать новые биткойны”, потому что это был лёгкий процесс (малое количество участников, малая сложность вычислений, мало переводов). Сейчас майнеры — это целые дата-центры или объединения (<em>пулы</em>) частных майнеров (поскольку вычислительных мощностей отдельных компьютеров, даже и с кучей специализированных вычислительных плат, — не хватает, чтобы сгенерировать блок). О том, как раньше легко было получить биткоины и как сложно сейчас, хорошо иллюстрирует история про оплату пиццы за биткоины в то время, когда их ценность была маленькой (когда никто не понимал будущего этой технологии).</p>
<p><br /></p>
<blockquote>
<p>В мае 2010 года майнер lazslo на оф. форуме создал тему, в которой предложил заказать ему пиццу, за что он готов заплатить 10 000 BTC. Хотя у него была возможность продать эти биткоины чуть дороже, чем стоимость пары пицц, ему было прельстиво от самого факта пиццы за биткоины. Чуть позже пользователь jercos заказал ему пиццу, за что получил 10 000 BTC. Примерно через год стоимость одного BTC подскочила до 32 $, то есть стоимость пиццы составила 320 000 $, а по курсу на конец января 2014 — уже более семи с половиной миллионов долларов. Узнав об этом, майнер lazslo выдрал из своей задницы не один клок волос. В честь памятного события, комьюнити принято отмечать Bitcoin Pizza Day каждое 22е мая, нажираясь пиццей и угощая ей бездомных и детишек.</p>
</blockquote>
<p><br /></p>
<p>Разумеется, всё описанное — лишь “верхушка айсберга технологий”, лежащих в основе мира криптовалют, с технической точки зрения всё намного сложнее. Но если кто-то хочется добраться до всех деталей, то всю информацию легко можно найти в гугле, на “официальных сайтах” (или репозиториях с исходниками) криптовалют. Поэтому далее приведу лишь интересные факты о криптовалютах, которые должны поразить ваш ум тем, насколько меняется, насколько усложняется окружающий нас мир, насколько некоторые малозначительные, на первый взгляд, события играют решающую роль в будущем.</p>
<p><br /></p>
<blockquote>
<p>Удивительная история произошла с норвежским студентом Кристофером Кохом. В 2009 году он писал реферат на тему шифрования — и его внимание привлекла странная на тот момент криптовалюта Bitcoin. Для иллюстрации примера он купил 5000 биткоинов на 150 крон (примерно $26,60), чтобы реферат был подкреплен практическими действиями.
С тех пор Кристофер совершенно забыл о совершенной сделке. Он вспомнил о ней только в апреле 2013 года, когда ему на глаза случайно попалась заметка в СМИ о том, что курс биткоина достиг рекордного значения. И тут Кристофер вспомнил о старой покупке. Оказалось, что купленные тогда за бесценок монеты сейчас имеют рыночную ценность около 5 миллионов крон ($886 тыс.).
Кристофер в отчаянии провел целый день, вспоминая пароль от кошелька. Страшно подумать, что бы он с собой сделал, если бы так и не вспомнил его. К счастью, пароль все-таки подошел. Первым делом он потратил пятую часть денег на покупку роскошной квартиры в одном из самых богатых районов Осло — столицы Норвегии. По старом курсу 2009 года квартира обошлась ему примерно в пять долларов.</p>
</blockquote>
<p><br /></p>
<p>Лично меня в истории биткоинов поразило, что изобретатель — неизвестен до сих пор. Изначально спецификацию биткоина и первую версию кода создал некто, называющий себя <em>Сатоши Накамото</em>. В 2008 году он опубликовал Bitcoin Whitepaper, в 2009 году выложил первую реализацию клиента, ещё <a href="https://bitcointalk.org/index.php?topic=13.msg46#msg46">немного пооколачивался вокруг</a> и исчез. О нём достоверно неизвестно ничего, а его творение развивается уже без него; он исчез, правда, не с пустыми руками: как самый первый майнер, он намайнил себе около полутора миллионов биткоинов, что по текущему курсу составляет более 1 млрд долларов. От него остались лишь сообщения на форумах, исходники и <a href="https://en.bitcoin.it/wiki/Satoshi_Nakamoto">мета-информация и сообщения, прикреплённые к первым транзакциям</a>, довольно <a href="https://bitcointalk.org/index.php?topic=172009.0">загадочные и символичные</a>.</p>
<p><br /></p>
<p>Растущая популярность биткоинов среди гиков и тех, кто просто хотел заработать, привела к тому, что возник целый виртуальный мир вокруг криптовалют:</p>
<ul>
<li>в настоящее время <a href="https://lurkmore.to/%D0%91%D0%B8%D1%82%D0%BA%D0%BE%D0%B8%D0%BD#.D0.A7.D1.82.D0.BE_.D0.BA.D1.83.D0.BF.D0.B8.D1.82.D1.8C">очень-очень большое количество интернет-услуг</a> можно оплатить биткоинами, а на Западе — даже во многих реальных магазинах;</li>
<li>появилось множество бирж, где можно торговать криптовалютой и обычными — <a href="https://ru.wikipedia.org/wiki/%D0%A4%D0%B8%D0%B4%D1%83%D1%86%D0%B8%D0%B0%D1%80%D0%BD%D1%8B%D0%B5_%D0%B4%D0%B5%D0%BD%D1%8C%D0%B3%D0%B8">фиатными</a> — деньгами;</li>
<li>появилось множество других криптовалют со сходными принципами работы, но и с определёнными отличиями; сейчас их уже порядка 2.000, а капитализация наиболее популярных 5 криптовалют составляет 7,8 млрд долларов;</li>
<li>принципы работы криптовалют перенимают банки; под эти технологии меняют законы;</li>
<li>технологии, лежащие в основе некоторых криптовалют, <a href="https://ru.wikipedia.org/wiki/Namecoin">несут полезную нагрузку</a>.</li>
</ul>
<p><br /></p>
<p>Завершая свою небольшую экскурсию в мир криптовалют, расскажу, как я решил поэкспериментировать с биткоинами и биржами.</p>
<p>После того, как я скачал биткоин-клиент и продержал компьютер месяц включённым (пока скачается вся база транзакций), я зарегистрировался на нескольких русскоязычных биржах (в частности, <em>BTC-E</em> и <em>Localbitcoins</em>). BTC-E — это полноценная биржа (даже распространяется трейдерская программа Metatrader с настройками для этой биржи). Правда ввести фиатные деньги туда можно только через какие-то подозрительные платёжные системы, требующие сканы паспорта и которые у меня всегда ассоциировались с кардерскими форумами. А пополнение через Яндекс.Деньги с карточки съедало чёртову уйму комиссии. Если бы не этот факт, то можно было поднять кучу бабок, потому что по неизвестной мне причине (вероятно, это связано с курсом криптовалют и фиатных денег на более крупных иностранных биржах) курс биткоина по отношению к фиатным валютам был намного выше на бирже Localbitcoins (эта биржа выступает лишь организационным посредником между конкретными людьми: все переводы фиатных денег осуществляются напрямую между участниками — можно купить биткоины даже за наличку или перекинув деньги по внутрибанку). Из-за этой комиссии заработать мне, разумеется, не удалось (точнее — потратил 50 рублей), но, в целом, я удовлетворил своё желание прикоснуться к биткам.</p>
<p>История покупок была такая:</p>
<ul>
<li>заплатив 1000 RUB через Яндекс.Деньги я получил 930.34 RUR (6,5% комиссия BTC-E + 0.49752% комиссия Яндекса = 93.00248% от суммы) на биржевом BTC-E RUR счёте;</li>
<li>на 930.33 BTC-E RUR я приобрёл 0.0216xxxx BTC-E BTC (по курсу 42997.99999 RUB / BTC)</li>
<li>эти 0.0216xxxx BTC-E BTC я перевёл на BTC счёт в LocalBitcoins, получив 0.0205xxxx BTC (за вычетом стандартной комиссии 0.001 BTC)</li>
<li>0.0204 LocalBitcoins BTC я продал за 946.11 RUB (по курсу 46377.94 RUB / BTC — как можно заметить, курс отличается на 3к+ рублей); обратно рубли я получил всё так же — напрямую на свою карточку, по внутрибанку.</li>
</ul>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<h1 id="блог-на-jekyll"><a name="head-blog"></a>Блог на Jekyll</h1>
<p>Если вы не ищете лёгких путей для того, чтобы просто запилить бложек, — Jekyll, вероятно, вам подойдёт.</p>
<p><strong>Jekyll</strong> — это генератор статичных сайтов на Ruby On Rails. Чем мне он понравился:</p>
<ul>
<li>получение удовольствия от некоего “дауншифтинга” к <em>статичности</em> контента (никаких баз, регистраций, админок…);</li>
<li>бесплатный хостинг на <strong>Github Pages</strong> (потому что там и родился этот генератор);</li>
<li>практика в <strong>markdown</strong> (хороший опыт для того, чтобы на гитхабе потом лепить ридмишки по-быстрому);</li>
<li>чтобы создать пост, нужно просто создать файл в директории _posts_;</li>
<li>удовлетворение инстинкта гугления для тюнинга шаблонов да и вообще — установки и настройки.</li>
</ul>
<p>Итак, какой путь необходимо преодолеть.</p>
<p>Сначала я попробовал Jekyll на Ubuntu.
Как установить Ruby, можно прочесть тут: <a href="https://www.digitalocean.com/community/tutorials/how-to-install-ruby-on-rails-with-rbenv-on-ubuntu-16-04">https://www.digitalocean.com/community/tutorials/how-to-install-ruby-on-rails-with-rbenv-on-ubuntu-16-04</a>.
Потом нужно установить Jekyll и Bundler, об этом здесь: <a href="https://jekyllrb.com/docs/quickstart/">https://jekyllrb.com/docs/quickstart/</a>.</p>
<p>Потом я перекатился на винду, и тут меня ждали приколы.
После установки <a href="http://rubyinstaller.org/downloads/">Ruby на Windows</a> при попытке установить какой-нибудь гем, сыпались ошибки о невозможности подключиться по SSL к репозиторию гемов, поскольку сертификат сервера был, по мнению Ruby, невалидный (“certificate verify failed”). Для решения этой проблемы я воспользовался <a href="https://gist.github.com/fnichol/867550/5d15ab0362823fb2a2570b6ed81721a3cafd4bd7">костылём</a> со скачиванием связки корневых сертификатов и прописыванием пути к ней в переменных окружения. К слову, описанный там «The Ruby Way! (Fun)» не сработал, потому что руби скрипт умирал так же с ошибкой валидации сертификата при обращении к урлу с сертификатом. Можно идти до конца и внести изменения в код:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>require 'net/https'
# create a path to the file "C:\RailsInstaller\cacert.pem"
cacert_file = File.join(%w{c: RailsInstaller cacert.pem})
http = Net::HTTP.new("curl.haxx.se", 443)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
resp = http.get("/ca/cacert.pem")
if resp.code == "200"
open(cacert_file, "wb") { |file| file.write(resp.body) }
puts "\n\nA bundle of certificate authorities has been installed to"
puts "C:\\RailsInstaller\\cacert.pem\n"
puts "* Please set SSL_CERT_FILE in your current command prompt session with:"
puts " set SSL_CERT_FILE=C:\\RailsInstaller\\cacert.pem"
puts "* To make this a permanent setting, add it to Environment Variables"
puts " under Control Panel -> Advanced -> Environment Variables"
else
abort "\n\n>>>> A cacert.pem bundle could not be downloaded."
end
</code></pre></div></div>
<p>А можно, как психически здоровый человек, скачать этот сертификат через браузер, закинуть в нужную директорию и установить переменную окружения SSL_CERT_FILE.</p>
<p>Из коробки, в общем, не заработало всё:</p>
<ul>
<li>сыпались <a href="https://github.com/jekyll/jekyll/issues/4705">сообщения “No repo name found”</a>;</li>
<li>сыпались <a href="https://github.com/guard/guard-livereload/issues/87">предупреждения о необходимости установки wmd</a> для быстрой регенерации при изменениях в файлах. Но я решил от него отказаться, т.к. много чего (Ruby DevKit, command-line tools) пришлось бы устанавливать ради одного гема.</li>
</ul>
<p>Для деплоя на Github Pages есть такой гем: <a href="https://jekyllrb.com/docs/github-pages/">https://jekyllrb.com/docs/github-pages/</a>
О том, как тюнить шаблон сайта, можно прочитать здесь: <a href="https://jekyllrb.com/docs/themes/">https://jekyllrb.com/docs/themes/</a>. Вкратце, нужно закинуть в свой репозиторий файлы из используемой темы (с помощью <code class="language-plaintext highlighter-rouge">bundle show</code>), которые нужно “переопределить”.
Ну и пара важных мануалов: <a href="https://jekyllrb.com/docs/configuration/">конфигурирование</a> и <a href="https://jekyllrb.com/docs/structure/">структура директорий</a>.</p>
<p>В качестве редактора использую <a href="https://www.sublimetext.com/">Sublime Text</a> с плагином <a href="http://plaintext-productivity.net/2-04-how-to-set-up-sublime-text-for-markdown-editing.html">MarkdownEditing</a>.</p>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<h1 id="завлекатель"><a name="head-luring"></a>Завлекатель</h1>
<p>Представьте себе, что вы только что открыли ресторан.
Как вам привлечь посетителей в своё заведение? Без завлекателя — никак.</p>
<p>Завлекатель — это профессионал своего дела. Со стороны может показаться, что человек этой профессии не делает чего-то из ряда вон выходящего. Но нет, завлекателем может стать только тот, кому дано это от рождения, тот, кого Бог наградил талантом завлечения. Что делает завлекатель? Он садится за столик у окна. Ему приносят лучшие блюда ресторана, много блюд. Завлекатель раскладывает салфетку, берёт в руки столовые приборы — и ест.</p>
<p>Он умеет есть, есть так, чтобы проходящий мимо заведения человек посмотрел на него. Посмотрел и захотел есть, зверски, сколько бы сыт он ни был. Он видит, как завлекатель смачно откусывает, как закатывает глаза от удовольствия, как причмокивает во время жевания. Как облизывает жирок с мясца, который чуть-чуть вытек изо рта на палец, как прихлёбывает пенящееся пивко из холодного бокала. Как откидывается на спинку кресла и удовлетворённо похлопывает по животу.</p>
<p>Настоящий завлекатель — если он от Бога — счастлив: пока он сытно ел, он завлёк пару десятков посетителей — получил удовольствие и заработал владельцу ресторана кругленькую сумму. К слову, в японских пищевых конгломератах (<em>дзайбацу</em>) завлекатели — очень уважаемые люди, которые часто живут со своими семьями прямо в ресторанах. Тут речь уже идёт о наследственной преемственности этой должности в ресторане — по фамилии, по старшинству.</p>
<p>К сожалению, нашей команде историков так и не удалось найти документальных свидетельств существования этой профессии.</p>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<h1 id="дайджест-интересностей"><a name="head-digest"></a>Дайджест интересностей</h1>
<ul>
<li>Пора не только заклеивать вебки, но и <a href="http://hitech.newsru.com/article/24nov2016/speakear">отключать колонки и наушники</a></li>
<li>История бренда <a href="https://vc.ru/p/chupa-chups">Chupa Chups</a></li>
<li>Чертовски интересная <a href="https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D0%B3%D1%88%D0%BF%D0%B8%D0%BB%D1%8C_(%D1%88%D0%B0%D1%85%D0%BC%D0%B0%D1%82%D1%8B)">вариация шахмат — кригшпиль</a></li>
<li>Трогательное <a href="https://spark.ru/user/13650/blog/18283/pochemu-ya-rad-tomu-chto-mi-ne-poletim-na-mars">эссе о том, чему учили фантасты</a></li>
<li>Камень в лесу, который <a href="https://vk.com/kamen_v_lesu">ведёт свой микроблог</a></li>
<li>Биография японского предпринимателя <a href="https://vc.ru/p/soichiro-honda-story">Соичиро Хонды</a></li>
<li><a href="https://ru.wikipedia.org/wiki/Гамельнский_крысолов">Гамельнский крысолов</a> — персонаж средневековой немецкой легенды</li>
<li><a href="https://en.wikipedia.org/wiki/John_Nevison">John Nevison</a> — один из самых известных разбойников, проскакавший более 320 км ради алиби</li>
<li><a href="https://ru.wikipedia.org/wiki/%D0%9F%D0%B8%D0%BB%D1%82%D0%B4%D0%B0%D1%83%D0%BD%D1%81%D0%BA%D0%B8%D0%B9_%D1%87%D0%B5%D0%BB%D0%BE%D0%B2%D0%B5%D0%BA">Пилтдаунский человек</a> — одна из самых известных научных мистификаций</li>
<li><a href="https://ru.wikipedia.org/wiki/%D0%94%D0%B0%D1%82%D1%8B_%D1%81%D0%BE%D1%82%D0%B2%D0%BE%D1%80%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BC%D0%B8%D1%80%D0%B0">Даты сотворения мира</a> — чтобы поразмыслить на тему того, насколько обусловлено и формально принятое в мире летоисчисление</li>
</ul>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<h1 id="на-словах-ты-лев-толстой"><a name="head-lev"></a>На словах ты Лев Толстой</h1>
<p>Недавно прочитал мемуары Льва Толстого («Без любви жить легче»), написанные им в конце жизни, в которых он переосмысляет свою жизнь, вспоминает, размышляет. В них он предстал для меня настоящим человеком — порочным, сомневающимся. Восхитила 2 глава раздела «Исповедь», в которых Лев Николаевич признаётся в том, что многие года он, как и другие писатели его времени, так сказать, размазывал говно по бумаге: писал книги «из тщеславия, корыстолюбия и гордости», ради лёгких денег, «прекрасного кушанья, помешения, женщин, общества, славы».</p>
<p>В процессе прочтения его исповеди перед самим собой, размышлениях о праведной жизни некоторые места особенно трогали. Их я и привожу здесь. Просто чтобы было. Может, кому-то они тоже будут близки.</p>
<blockquote>
<p>Главное заблуждение жизни людей то, что каждому отдельно кажется, что руководитель его жизни есть стремление к наслаждениям и отвращение от страданий. И человек один, без руководства, отдается этому руководителю, – он ищет наслаждений и избегает страданий и в этом полагает цель и смысл жизни. Но человек никогда не может жить, наслаждаясь, и не может избежать страданий. Стало быть, не в этом цель жизни. А если бы была, то – что за нелепость: цель – наслаждения, и их нет и не может быть. А если бы они и были, – конец жизни, смерть, всегда сопряженная с страданием. Если бы моряк решил бы, что цель его – миновать подъемы волн, – куда бы он заехал? Цель жизни вне наслаждений и страданий. Она достигается, проходя через них.</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Любовь настоящая есть только любовь к ближнему, ровная, одинаковая для всех. Одинаково нужно заставить себя любить тех, которых мало любишь или ненавидишь, и перестать слишком любить тех, которых слишком любишь. Одно не дошло, другое перешло линию. От того и другого все страдания мира.</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Если человек не может простить брата, он не любит его. Истинная любовь бесконечна, и нет количества тех оскорблений, которые она не простила бы, если она истинная любовь.</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Любить того, кто нам приятен, не значит любить. Истинная любовь только та, когда в человеке любишь того же Бога, какой в тебе. Этой любовью любишь не только своих родных, не только тех, которые любят тебя, но любишь неприятных, злых людей, ненавидящих тебя. Чтобы любить таких людей, надо помнить, что тот, с кем имеешь дело, любит себя так же, как и ты себя, и что в нем тот же Бог, какой и в тебе. Если помнишь это, то и поймешь, как тебе надо отнестись к нему. И если поймешь, то полюбишь его, а если полюбишь так, то такая любовь даст тебе больше радости, чем любовь к любящим тебя.</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Постарайся полюбить того, кого ты не любил, осуждал, кто оскорбил тебя. И если тебе удастся это сделать, то ты испытаешь совершенно новое и удивительное чувство радости. Ты сразу увидишь в этом человеке того же Бога, который живет в тебе. И как свет ярче светит после темноты, так и в тебе, когда ты освободишься от нелюбви, сильнее и радостнее разгорится свет любви божеской.</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Любите врагов ваших – и не будет у вас врага. (Учение 12 апостолов)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Вы слышали, что сказано: люби ближнего твоего и ненавидь врага твоего (Лев. 19, 17–18). А Я говорю вам: любите врагов ваших, благословляйте проклинающих вас, благотворите ненавидящим вас и молитесь за обижающих вас и гонящих вас; да будете сынами Отца вашего небесного; ибо Он повелевает солнцу Своему восходить над злыми и добрыми и посылает дождь на праведных и неправедных. (Мф. гл. 5, ст. 43–45)`</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Кто из живых людей не знает того блаженного чувства, хоть раз испытанного, и чаще всего в самом раннем детстве, при котором хочется любить всех: и близких, и отца, и мать, и братьев, и злых людей, и врагов, и собаку, и лошадь, и травку; хочется одного, чтобы всем было хорошо, чтобы все были счастливы, и еще более хочется того, чтобы самому сделать так, чтобы всем было хорошо, самому отдать себя, всю свою жизнь на то, чтобы всегда всем было хорошо и радостно. Это-то и есть и это одно есть та любовь, в которой жизнь человека.</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Добродетель человеколюбия недалеко от нас: стоит только пожелать иметь человеколюбие, и оно само придет к тебе.</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Не думай, что твое доброе расположение к людям – это подарок, который ты делаешь своим ближним: ты делаешь этот подарок самому себе.</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Попробуйте: возьмите на себя на известный срок следовать во всем требованиям любви: жить так, чтобы во всех делах прежде всего помнить, чтобы со всяким человеком, с вором, пьяницей, с грубым начальником или подчиненным, не отступить от любви, т. е., имея с ним дело, помнить о том, что нужно ему, а не себе. И, прожив так положенный срок, спросите себя: тяжело ли вам было и испортили ли вы себе или улучшили жизнь, и, смотря по тому, что даст вам опыт, решайте уже, правда ли то, что исполнение любви дает в жизни благо, или это только одни слова. Испытайте это, постарайтесь вместо того, чтобы отплатить злом за зло обидчику, вместо того, чтобы осудить за глаза человека, живущего дурно, и т. п., – вместо этого постарайтесь отвечать добром на зло, ничего не сказать дурного о человеке, не обойтись грубо даже со скотиной, с собакой, а с добротой и лаской, проживите так день, два или больше (для опыта) и сравните ваше за это время душевное состояние с тем, какое бывало прежде. Испытайте это, и вы увидите, как вместо хмурого, сердитого и тяжелого состояния вы будете светлы, веселы, радостны. А живите так и другую и третью неделю, и вы увидите, как душевная радость ваша все будет расти и расти, и дела ваши не только не будут разлаживаться, а будут все только больше и больше спориться.</p>
</blockquote>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<h1 id="знакомство-с-тинькофф-инвестициями"><a name="head-tinkoff"></a>Знакомство с «Тинькофф Инвестициями»</h1>
<p>Не так давно у банка Тинькофф появилась возможность открыть брокерский счёт, чтобы не держать деньги «под матрасом» на вкладах, а вкладывать в акции компаний на Московской бирже и в акции некоторых американских компаний.</p>
<p>До вчерашнего дня эта услуга была доступна только в режиме «по приглашениям» (можно было попросить приглашение на ранний доступ и получить ещё 2 инвайта, которые можно отправить друзьям).</p>
<p>Сначала, не по наслышке зная, какой удобный у Тинькоффа интернет-банк и онлайн сервисы вообще, меня эта платформа заинтересовала. Брокерский счёт открыли за пару дней (после встречи с представителем банка и подписанием различных бумажек).</p>
<p>Но жопа и какашки всегда кроются в деталях — пришло понимание, что такое инвестирование лично мне, вероятно, не подходит.</p>
<p>Во-первых, комиссия. Она единая - 0,3% (минимум 99 руб.) от сделки; на мой профанский взгляд, тариф, на котором предлагает торговать Тинькофф (по факту - БКС Брокер) - достаточно «конский». Поэтому, проведя простой расчёт, получается, что вкатываться с суммой, меньшей 66.000 руб. даже нет смысла.</p>
<p>Во-вторых, сама торговля. Сервис явно ориентирован на «домохозяек» в мире финансов. Один неинформативный график, зато вылезает баннер, сообщающий сколько бы я мог заработать, если бы вложился тогда-то и тогда-то. Анализ какой-либо внутри самого сервиса не провести. Сервис не представляет собой доступ на биржу — нет банального биржевого стакана; всё, что известно о рынке, — это цена покупки и цена продажи акций.</p>
<p>В целом, в таком виде, какой сейчас, — это просто альтернатива вкладам, т.е. вся торговля тут должна проходить в режиме «купил и забыл на полгода».</p>
<p><a href="#head-menu">↑ к оглавлению</a></p>
<p><br /></p>
<p><em>Ну вот и всё… До новых встреч!</em></p>Привет, мир!