Rose debug info
---------------

Позднее Ctrl + ↑

Привычка месяца: ежедневная медитация

Медитация появилась в моей жизни около четырёх лет назад. Но я никогда не медитировал регулярно и, в среднем, не больше 5—8 минут.

В апреле этого года у меня появились запросы: сбился режим сна, начал страдать бессоницей, переживал рабочие стрессы и подпустил эмоциональное выгорание (2.0). И вот, одна из полезных привычек, которую я захотел развить для преодоления этих недругов, — регулярная медитация.

Изначально, я просто сидел в тишине и концентрировался на дыхании. Затем пытался разнообразить практику фоновым шумом, мантрами, философскими текстами для размышлений. Но не то всё это — не подходило.

Месяц назад я наткнулся на приложение «Медитопия». И понеслась.

Что за приложение

Медитопия — это приложение для медитации. В нём есть аудиопрограммы, медитативные фоновые шумы, музыка, музыка для сна, истории на ночь.

Аудиоупрограмм — много: есть программы для начинающих, для улучшения сна, снятия стресса, тревожности, для работы с самооценкой, мотивацией и пр.

Приложение собирает всю статистику: число сеансов (медитаций), время и продолжительность по дням.

В приложении можно вести что-то вроде дневника эмоций и ощущений.

Можно скачать и в Гугл Плее, и в Апсторе.

Что изменилось

  1. Избавился от бессоницы и стал хорошо спать.
  1. Научился засыпать под музыку. Отрубает практически мгновенно (по моим меркам).
  1. Стал медитировать по 10—20 минут за сессию.
  1. Стал наблюдательнее: начал обращать внимание на звуки, цвета, детали, на которые прежде не обращал внимания.
  1. Научился чувствовать любую часть тела или всё тело целиком. Начал осознавать и ощущать прикосновения к чему-либо.
  1. Научился работать с тревожностью: абстрагироваться от негативных мыслей, смотреть на них со стороны и отпускать.
  1. Научился осозновать свои эмоциональные вспышки.
  1. Медитация вошла в привычку.

Как я веду аудиодневник

Я два года вёл текстовый дневник, но проблема в том, что писал я всё меньше, а мыслей и запросов становилось всё больше. Да и писать стало утомительнее.

В тот момент, в дневнике, я уже активно практиковал рубрику «рссс» (разговор с самим собой), а затем решил полностью перейти на этот формат.

Попробую тезисно описать процесс и штыки, с которыми сталкиваюсь.

  1. Не стал усложнять и начал пользоваться обычным системным диктофоном. Главное, что он умеет сохранять файлы в хронологическом порядке и синхронизироваться с облаком. Большего и не нужно.
  1. Суть аудиодневника такая же, как и у текстового: вываливать всё, что накопилось. Но есть штыки, особенно по началу. Некий барьер, неловкость или даже стеснение произносить вслух то, что крутится на уме.
  1. Важно этот барьер преодолеть, иначе не искренне получается: сказал не то, что думал на самом деле. Мои первые записи были верхом политкорректности со сглаженными углами. Со временем я привык и слышать, и слушать себя. И говорить как есть.
  1. В аудиодневнике те же проблемы, что и в текстовом: желание перезаписывать сказанное, не сохранять или удалять уже существующие записи. Кроме этого, добавляется недовольство своим голосом, произношением, запутанностью речи, долгими паузами между мыслями. Я научился принимать всё, как есть. Да и с каждым разом получается всё лучше.
  1. Ведя аудиодневник, эмоции ощущаются намного ярче, чем в текстовом виде. Хотя большинство записей я стараюсь записывать в нейтральном, спокойном тоне.
  1. Стараюсь соблюдать формат «одна запись — одна тема». Если чувствую, что захожу на территорию другой темы, говорю, что продолжение в следующей записи — и начинаю новую.
  1. Практикую и рубрики. Например, запись-наблюдение или идея.
  1. Продолжительность не имеет значения. У меня есть записи, которые длятся и 15 минут, и 15 секунд. Ограничений — нет.
  1. Помимо обсуждений, глубоких размышлений и вот этого всего, я записываю и скороговорки, и стихи, и вообще всё, что придёт на ум.
  1. По началу, записи я называл в формате «дата, время, номер записи». Сейчас — «дата, время, тема».
  1. Для меня один из плюсов аудиодневника в том, что записи можно делать во время прогулки, например.
  1. А один из минусов — записи можно делать не всегда и не везде. Процесс требует уединения.

См. также заметки о том, как я веду текстовый дневник и видеодневник.

Про конспекты

Обычно, чтобы законспектировать книгу, я её читаю, затем ещё раз перечитываю и затем в несколько подходов пишу сам конспект.

Прежде я думал, что если не дочитаю книгу до конца и напишу конспект — это будет слишком низко с моей стороны и недостойно публикации. Но вдруг меня осенило: я же пишу для себя. Конспект — это про то, что на меня больше всего повлияло.

Теперь барьеров нет. Я буду писать, даже если не прочитал и двадцати страниц, но в моей голове уже успело что-то щёлкнуть. Это же касается и всего остального.

 364   2020   конспект

Эгея: как добавить кнопку подписки на телеграм

  1. Переходим в блог/themes/тема/template/
  1. Создаём файл subscribe.tmpl.php
  1. Вставляем код:
<div class="telegramus--with-margin">
   <a class="telegramus" href="tg://resolve?domain=antonkim_channel">
      <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M6,11.960784l-1,-3l11,-8l-15.378,5.914c0,0 -0.672,0.23 -0.619,0.655c0.053,0.425 0.602,0.619 0.602,0.619l3.575,1.203l1.62,5.154l2.742,-2.411l-0.007,-0.005l3.607,2.766c0.973,0.425 1.327,-0.46 1.327,-0.46l2.531,-13.435l-10,11zz"></path></svg>
      Подписаться на новые статьи
   </a>
</div>

5. Заменяем antonkim_channel на свой вариант.

6. Затем, в той же папке, открываем layout.tmpl.php и находим вот это (55 строка):

<div class="content">

<?php _T ('heading') ?>
<?php _T ('theme-preview') ?>
<?php _T ('message') ?>
<?php _T ('welcome') ?>
<?php _T ('drafts') ?>
<?php _T ('notes') ?>
<?php _T ('notes-list') ?>
<?php _T ('tags') ?>
<?php _T ('nothing') ?>
<?php _T ('sessions') ?>
<?php _T ('pages') ?>
<?php _T ('comments') ?>
<?php _T ('popular') ?>
<?php _T ('tags-menu') ?>
<?php _T ('unsubscribe') ?>
<?php _T ('form') ?>

</div>
  1. Между sessions и pages вставляем:
<?php _T ('subscribe') ?>
  1. Открываем стили блог/themes/тема/styles/main.css
  1. В самом конце (или где душе угодно) вставляем:
.telegramus--with-margin {
    margin: 0 0 40px;
}

a:link.telegramus,
a:visited.telegramus {
    font-size: 100%;
    display: inline-block;
    padding: 8px 10px 10px;
    transition: .1s all ease-in-out;
    color: #000;
    border: 1px solid rgba(0, 0, 0, .3);
    border-radius: 6px;
}

a:hover.telegramus {
    color: #e20016;
    border-color: rgba(226, 0, 22, .5);
}

a:hover.telegramus img {
    opacity: .9;
}

.telegramus img {
    position: relative;
    top: 3px;
    height: 20px;
    margin-right: 8px;
}

.telegramus svg {
    width: 30px;
    height: 22px;
    vertical-align: middle;
    margin-top: -3px;
    stroke: none;
}
  1. Готово.
  1. Добавив кнопку, вы столкнётесь с тем, что будете видеть её, например, при добавлении заметки. Это может раздражать. Чтобы её не видеть, в файле subscibe.tmpl.php, в самом верху, вставьте код:
<?php if ($content['sign-in']['done?']) { } 
  else { ?>
  1. И в самом низу закройте:
<?php } ?>
  1. Теперь, когда вы будете залогинены, кнопку будут видеть все — кроме вас.
  2. Готово — 2.

OpenCart: как минифицировать HTML

Для более быстрой загрузки страниц.

Что делать

  1. Открываем сайт/system/library/response.php
  1. Находим код (~108 строка):
public function output() {
	if ($this->output) {
		$output = $this->level ? $this->compress($this->output, $this->level) : $this->output;
		
		if (!headers_sent()) {
			foreach ($this->headers as $header) {
				header($header, true);
			}
		}
		
		echo $output;
	}
}
  1. Заменяем на:
public function output() {
 
if ($this->output) {
    $this->output = preg_replace("/(\n)+/", "\n", $this->output);
    $this->output = preg_replace("/\r\n+/", "\n", $this->output);
    $this->output = preg_replace("/\n(\t)+/", "\n", $this->output);
    $this->output = preg_replace("/\n(\ )+/", "\n", $this->output);
    $this->output = preg_replace("/\>(\n)+</", '><', $this->output);
    $this->output = preg_replace("/\>\r\n</", '><', $this->output);
}

if ($this->output) {
	$output = $this->level ? $this->compress($this->output, $this->level) : $this->output;
	
	if (!headers_sent()) {
		foreach ($this->headers as $header) {
			header($header, true);
		}
	}
	
	echo $output;
}
}
  1. Сохраняем, обновляем кэш.
  1. Готово.
 1248   2020   OpenCart 3   работа

OpenCart: как сделать сортировку атрибутов по порядку сортировки

Потратил кучу времени на поиски решения, а оно оказалось до смешного простым.

В чём проблема

Вот мы создали группу атрибутов. Затем создали атрибуты, привязали к группе атрибутов, задали порядок сортировки. На сайте всё отображается нормально — согласно порядку сортировки. В админке же — всё сортируется по названиям, и это очень сбивает.

Что делать

  1. Открываем сайт/admin/model/catalog/attribute.php.
  1. Находим код (~53 строка):
if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
	$sql .= " ORDER BY " . $data['sort'];
} else {
	$sql .= " ORDER BY attribute_group, ad.name";
}
  1. Изменяем последнюю строку:
$sql .= " ORDER BY attribute_group, a.sort_order, ad.name";
  1. То есть, по умолчанию, в карточке товара в админке, стоит сортировка по названию. Мы же сделали по порядку сортировки, а затем по названию.
  1. Сохраняем, обновляем кэш.
  1. Готово.
 1585   2020   OpenCart 3   работа

Эгея: как добавить аналитику

Без учёта своего присутствия.

Первый способ

  1. Переходим в блог/themes/тема/templates/
  1. Создаём файл analytics.tmpl.php
  1. Вставляем код:
<?php if ($content['sign-in']['done?']) { } 
  else { ?>

<!-- Yandex.Metrika counter -->
<script type="text/javascript" >
   (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
   m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})
   (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");

   ym(123456789, "init", {
        clickmap:true,
        trackLinks:true,
        accurateTrackBounce:true,
        webvisor:true
   });
</script>
<noscript><div><img src="https://mc.yandex.ru/watch/123456789" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter -->

<?php } ?>
  1. Заменяем код Яндекса на свой.
  1. Затем, в той же папке, открываем layout.tmpl.php и в самом конце вставляем:
<?php _T ('analytics'); ?>
  1. Готово. Теперь, когда вы залогигены, будут учитываться все визиты — кроме вашего.

Второй способ

  1. Переходим в блог/user/extras/
  1. Создаём файл footer-post.tmpl.php
  1. Вставляем код аналитики.
  1. Готово.

В чём разница

В первом случае — всё будет храниться в папке темы, а не разрознено. Такой способ можно использовать и для других целей.

Во втором случае — используется встроенный блок Эгеи.

OpenCart: автогеренация тайтла

Чтобы получилось вот так:

При этом, чтобы иметь возможность отдельно редактировать сам тайтл.

Что делать

  1. Открываем сайт/admin/view/template/catalog/product_form.twig
  1. Находим код (~67 строка):
<input type="text" name="product_description[{{ language.language_id }}][meta_title]" value="{{ product_description[language.language_id] ? product_description[language.language_id].meta_title }}" placeholder="{{ entry_meta_title }}" id="input-meta-title{{ language.language_id }}" class="form-control" />
  1. После него вставляем:
<script type="text/javascript">
$(function() {
  var $name_input = $("input[name='product_description[{{ language.language_id }}][name]']");
  var $meta_title = $("input[name='product_description[{{ language.language_id }}][meta_title]']");

  $name_input.keyup(function() {
  $meta_title.val($name_input.val());
  });
});
</script>
  1. Сохраняем, обновляем кэш.
  1. Готово.
  1. Можно пойти дальше. Например, чтобы после названия автоматически генерировалось «купить в „магазине“».
  1. Изменяем одну строку:
$meta_title.val($name_input.val() + 'Тут какой-то текст');
  1. Готово — 2.

Ту же самую процедуру можно провернуть и с категориями.

Спасибо за помощь Ярославу Усенко.

 604   2020   OpenCart 3   работа

OpenCart: как сделать сортировку товаров по наличию

И в магазине, и в админке.

В чём проблема

По умолчанию, все товары в категориях, страницах производителей, поиске — сортируются по названиям в алфавитном порядке. И даже те товары, которых нет в наличии, могут отображаться в начале списка. А когда таких товаров много — это становится проблемой.

Что делать

  1. Открываем сайт/catalog/model/catalog/product.php
  1. Находим код (~168 строка):
if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
	if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
		$sql .= " ORDER BY LCASE(" . $data['sort'] . ")";
	} elseif ($data['sort'] == 'p.price') {
		$sql .= " ORDER BY (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";
	} else {
		$sql .= " ORDER BY " . $data['sort'];
	}
} else {
	$sql .= " ORDER BY p.sort_order";
}
  1. Заменяем его на:
if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
    if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
        $sql .= " ORDER BY p.stock_status_id DESC, LCASE(" . $data['sort'] . ")";
    } elseif ($data['sort'] == 'p.price') {
        $sql .= " ORDER BY p.stock_status_id DESC, (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";
    } else {
        $sql .= " ORDER BY p.stock_status_id DESC, " . $data['sort'];
    }
} else {
    $sql .= " ORDER BY p.stock_status_id DESC, p.sort_order";
}
  1. Сохраняем, обновляем кэш.
  1. Готово. Товары будут сортироваться по наличию. Товаров, которых нет в наличии, будут отображаться в конце списка.
  1. Можно сортировать и по количеству, а уже затем по наличию. Для этого заменяем на:
if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
    if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
        $sql .= " ORDER BY p.quantity DESC, p.stock_status_id DESC, LCASE(" . $data['sort'] . ")";
    } elseif ($data['sort'] == 'p.price') {
        $sql .= " ORDER BY p.quantity DESC, p.stock_status_id DESC, (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";
    } else {
        $sql .= " ORDER BY p.quantity DESC, p.stock_status_id DESC, " . $data['sort'];
    }
} else {
    $sql .= " ORDER BY p.quantity DESC, p.stock_status_id DESC, p.sort_order";
}
  1. Можно использовать разные комбинации: сортировать по стоимости, рейтингу, дате добавления. Нужно лишь подменить значения в коде выше. Вот они:
$sort_data = array(
    'pd.name',
    'p.model',
    'p.quantity',
    'p.price',
    'rating',
    'p.sort_order',
    'p.date_added'
);

Как сделать в админке

  1. Открываем сайт/admin/model/catalog/product.php.
  1. Делаем тоже самое, что и наверху.
  1. Готово.

По теме

Сортировка данных в SQL (ORDER BY).

 1591   2020   OpenCart 3   работа

Как я веду дневник

Резюмирую накопленный опыт:

  1. Я уже два года непрерывно веду дневник. Из них полтора — в телеграме.
  1. Дневник мне помогает оставаться собой. Мой психотерапевт. Мой личный островок гармонии и хаоса. Мой мир, который живёт по моим правилам.
  1. С дневником я делюсь всем: мыслями, идеями, вопросами, размышлениями, наблюдениями, теориями, историями, впечатлениями, секретами, мрачными тайнами, безумными фантазиями, сценариями другой жизни, мечтами.
  1. Ведя дневник, я испытываю всю гамму эмоций: радость, веселье, злость, гнев, огорчение, апатию.
  1. Когда я пишу — я не парюсь. Пишу то, что первым приходит на ум. Это вообще мой любимый способ понимания себя.
  1. Я ничего не редактирую. Максимум могу исправить орфографические и/или пунктуационные ошибки.
  1. Я всегда честен с самим собой. Если я понимаю, что пытаюсь съюлить, то пишу или говорю о том, что пытаюсь съюлить.
  1. Я веду дневник либо от первого лица, либо на «ты».
  1. Помимо текста, в дневнике я использую смайлики, стикеры, записываю аудио и видеосообщения, отправляю фото, делаю репосты.
  1. Записи всегда выглядят по-разному. Одни начинаются с заголовка и выглядят как посты у Тёмы Лебедева. Другие написаны флудом. Третьи — как-то ещё.
  1. В дневнике я веду разные рубрики. Например, у меня есть рубрики «идея», «наблюдение», «пиздец», «рссс» (разговор с самим собой), которые обозначаются соответствующим хэштегом.
  1. Рубрика «рссс» — особенная. Выглядит это так. Мне в голову приходит вопрос, который меня беспокоит. Затем я включаю запись аудио: «Рубрика — разговор с самим собой. Сегодня 24 апреля, пятница, 16:00. Давай поговорим о...». Для меня это неплохая самотерапия и хороший способ выговориться.
  1. Порой записи в дневнике настолько откровенные или причиняющие душевную боль, что хочется их удалить. Но я научился не удалять записи, какими бы они ни были. Я принимаю всё, что было.
  1. Бывает, что я пишу в дневник несколько раз в день. А бывает, что не пишу неделю. Это нормально.
  1. Делаю резервные копии дневника примерно один раз в два месяца.

См. также заметки о том, как я веду аудиодневник и видеодневник.

Ранее Ctrl + ↓