Хиккинги #4
Привет из ада!
Это четвёртый выпуск журнала «Хиккинги».
- «Что нами движет?». Философия антиволевика.
- «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.
См. также:
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) в любое время после доставки
-
Отличная и подробная статья про криптографию на эллиптических кривых
-
Хотите узнать, что будет через миллиарды лет?
-
Всё, что нужно знать о возникновении жизни на Земле
-
Серия статей на Хабрахабре про Интернет-разведку
-
Когнитивная психотерапия — форма психотерапии, основанная на предположении, что причины психологических проблем и нервно-психических расстройств человека кроются в ошибках мышления, и направленная на изменение нелогичных или нецелесообразных мыслей и убеждений человека
-
Из времён динозавров своими листочками (и другими частями) нам машут «живые ископаемые»
-
Чтобы всегда в нужный день праздновать (или не праздновать) Пасху, пользуйтесь алгоритмом Гаусса
-
Учёные успешно загрузили мозг круглого червя в робота на Arduino
-
Существует легенда, что у русских крестьян был свой метод умножения двух чисел
-
В сутках 5^5 * 4^4 * 3^3 * 2^2 * 1^1 миллисекунд
-
Сценарии деанонимизации по мобильному телефону
-
20 видео, которые можно включать в любом сочетании и получать удивительную музыку
-
В некоторых культурах до сих пор искусственно деформируют черепа
-
Птички видят магнитные поля Земли
-
YouTube вкрысу автоматически генерирует каналы для музыкальных треков (пример); вообще, музыкальная база YouTube видится самой полной на данный момент, жаль, качество автоматически загружаемого материала оставляет желать лучшего…
-
Утечка факта посещения стороннего сайта на основе скорости загрузки favicon из кэшей Chrome
-
Bitsquatting - перехват интернет-трафика в результате аппаратных ошибок (изменения битов, например, адресов хостов)
До следующего прихода! Живы будем - не помрём!