﻿[
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/date-literal-exceeds-3999-once-again\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Номер года в литерале типа дата превышает 3999\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>28 марта 2026</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">MS SQL</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">PostgreSQL</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Про ошибку в названии заметки я уже как-то <a href=\"https://kostyanetsky.ru/notes/date-literal-exceeds-3999\" target=\"_blank\">писал</a>. Напомню суть: платформа не переваривает даты позже 3999 года (на практике начинает стрелять с 3999-12-01). Теоретически такие даты вообще нельзя записать, но <s>если очень хочется</s> из-за ошибок в прикладном коде (и в коде самой платформы) это всё-таки возможно и время от времени случается. </p>\n<p>Обычные симптомы — перестают работать какие-то отчёты, не проводятся какие-то документы, падает пересчёт итогов. В общем, страдает любой код, который трогает записи с проблемными датами.</p>\n<p>Способ лечения, который я рамочно описал в заметке по ссылке выше — рабочий, но сравнительно медленный: нужно настроить ТЖ, собрать и распарсить результаты. Между тем, платформа падает на первом же обращении к битой дате, а их может быть много и валяться они могут в разных таблицах. То есть может потребоваться несколько подходов к снаряду: проверили, получили ошибку, исправили, проверили, получили следующую...</p>\n<p><img alt=\"Thank You, Mario!\" src=\"https://kostyanetsky.ru/notes/date-literal-exceeds-3999-once-again/thanks.jpg\"/></p>\n<p>Желая решать проблему как-нибудь побыстрее, несколько лет назад я написал <a href=\"https://gist.github.com/vkostyanetsky/a58ff201d2a87a35e70c4c8f4112ad4c\" target=\"_blank\">запрос для PostgreSQL</a>. Общая идея:</p>\n<ol>\n<li>Ищем в базе данных все поля с датами.</li>\n<li>Строим мегазапрос к таким полям (ищем даты, которые выходят за лимит 1С).</li>\n</ol>\n<p>То есть этот запрос генерирует другой запрос, да. Выполняем его и получаем полную картинку проблемы: список таблиц с некорректными датами. Дальше уже дело техники — смотрим, что за таблицы и решаем, как быть. В нашем случае проблемные даты иногда возникают в итогах и оборотах, так что их можно просто удалять и пересчитывать итоги через штатные инструменты.</p>\n<p>Почему действуем на уровне СУБД? Ну, средствами 1С такой номер не отколоть — напомню, платформа падает при попытке потрогать проблемные записи. Это касается любого взаимодействия, включая чтение. Кроме того, в данном случае работать напрямую быстрее и удобнее.</p>\n<p>На днях я переписал этот <a href=\"https://gist.github.com/vkostyanetsky/5990a16caacc4a9057b577c6a5694512\" target=\"_blank\">запрос для MS SQL</a>. Вышло длиннее (в силу особенностей этой СУБД), но идея та же.</p>\n<p>Если будете использовать, имейте в виду, что:</p>\n<ul>\n<li>Поле <code>_Fld626</code> в тексте запроса — разделитель для фреша. В вашей базе может называться по-другому или вообще отсутствовать.</li>\n<li>Запрос написан для базы со сдвигом в 2000 лет. Если в вашей базе сдвига нет, нужно скорректировать условие (см. функцию <code>DATEADD()</code>).</li>\n<li>Трюк с выводом в XML (см. <code>FOR XML</code>) я добавил, чтобы не дать SSMS обрезать текст мегазапроса (показалось быстрее, чем возиться с приведением типов). Побочный эффект: в получившемся мегазапросе нужно заменить <code>&amp;gt;</code> на <code>&gt;</code>, прежде чем выполнять его.</li>\n</ul>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "номер года в литерале типа дата превышает 3999 28 марта 2026 · 1с работа ms sql postgresql про ошибку в названии заметки я уже как-то писал . напомню суть: платформа не переваривает даты позже 3999 года (на практике начинает стрелять с 3999-12-01). теоретически такие даты вообще нельзя записать, но если очень хочется из-за ошибок в прикладном коде (и в коде самой платформы) это всё-таки возможно и время от времени случается. обычные симптомы — перестают работать какие-то отчёты, не проводятся какие-то документы, падает пересчёт итогов. в общем, страдает любой код, который трогает записи с проблемными датами. способ лечения, который я рамочно описал в заметке по ссылке выше — рабочий, но сравнительно медленный: нужно настроить тж, собрать и распарсить результаты. между тем, платформа падает на первом же обращении к битой дате, а их может быть много и валяться они могут в разных таблицах. то есть может потребоваться несколько подходов к снаряду: проверили, получили ошибку, исправили, проверили, получили следующую... желая решать проблему как-нибудь побыстрее, несколько лет назад я написал запрос для postgresql . общая идея: ищем в базе данных все поля с датами. строим мегазапрос к таким полям (ищем даты, которые выходят за лимит 1с). то есть этот запрос генерирует другой запрос, да. выполняем его и получаем полную картинку проблемы: список таблиц с некорректными датами. дальше уже дело техники — смотрим, что за таблицы и решаем, как быть. в нашем случае проблемные даты иногда возникают в итогах и оборотах, так что их можно просто удалять и пересчитывать итоги через штатные инструменты. почему действуем на уровне субд? ну, средствами 1с такой номер не отколоть — напомню, платформа падает при попытке потрогать проблемные записи. это касается любого взаимодействия, включая чтение. кроме того, в данном случае работать напрямую быстрее и удобнее. на днях я переписал этот запрос для ms sql . вышло длиннее (в силу особенностей этой субд), но идея та же. если будете использовать, имейте в виду, что: поле _fld626 в тексте запроса — разделитель для фреша. в вашей базе может называться по-другому или вообще отсутствовать. запрос написан для базы со сдвигом в 2000 лет. если в вашей базе сдвига нет, нужно скорректировать условие (см. функцию dateadd() ). трюк с выводом в xml (см. for xml ) я добавил, чтобы не дать ssms обрезать текст мегазапроса (показалось быстрее, чем возиться с приведением типов). побочный эффект: в получившемся мегазапросе нужно заменить &gt; на > , прежде чем выполнять его.",
    "tags": [
      "1c",
      "work",
      "mssql",
      "pgsql"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/with-side-effect\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                С побочным эффектом\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>15 марта 2026</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>В последнем релизе <a href=\"https://firstbit.ae\" target=\"_blank\">нашей ERP</a> мы оптимизировали несколько тяжелых динамических списков (заказы, инвойсы, проформа инвойсы и так далее). Там накопился приличный техдолг, в основном — горы вспомогательных таблиц, прикрученных к основным запросам (контактная информация, технические реквизиты, остатки, обороты и так далее). В итоге даже в сравнительно небольших приложениях оптимизатор СУБД начинал выдавать бредни вместо планов запроса и мало-помалу платить за это ресурсами стало совсем неприятно.</p>\n<p>В общем, запатчили через несколько разных подходов, один из них — подгрузка дополнительных данных в обработчике <code>ПриПолученииДанныхНаСервере()</code> (я про него недавно <a href=\"https://kostyanetsky.ru/notes/desire-paths\" target=\"_blank\">вспоминал</a>, кстати). Написали удобный фреймворк вокруг фичи, внедрили, потестировали и... В общем, сидим с кислыми минами. </p>\n<p>Нет, с производительностью и правда стало сильно лучше. Запрос к тяжелым виртуальным таблицам можно затюнить просто идеально. Проблема в другом: значения полей, которые заполняет этот обработчик, не пробрасываются в стандартные механики динамического списка. То есть для них не работает поиск, сортировка и группировка.</p>\n<p>Например, вводим значение, которое видим в колонке, а строка не находится. Или находятся не все строки. Или находятся строки, которые не должны были найтись. Для пользователя это выглядит отвратительно, ну баг и баг же: визуально-то такие поля никак не отличаются. Как ты ему объяснишь, что это особенность работы механизма платформы™? </p>\n<p>Исключишь такое поле из механизмов, которые с ними работать не могут — будет ещё чище. Например, попытаешься отсортировать — получишь здоровенную ошибку. Опять же, объяснить, почему на этой колонке с суммой вылетает ошибка, а на соседней сортировка прекрасно работает — задача со звездочкой.</p>\n<p>Блин, вот как можно было разработать такой замечательный концепт обработчика и настолько заруинить реализацию на уровне платформы?</p>\n<p>Неожиданно вспомнил Реддит. В некоторых сообществах популярны треды «придумай суперсилу, но с побочным эффектом». Типа, кто-то пишет в комментариях: я могу бегать со скоростью ветра! Ему отвечают: да, но не можешь тормозить. И так далее. Местами получается забавно.</p>\n<p><img alt=\"Superpower\" src=\"https://kostyanetsky.ru/notes/with-side-effect/reddit.png\"/></p>\n<p>Вот и мы с разработчиками платформы в таком же диалоге. Вы можете разогнать динамические списки (но UI будет вызывать у пользователей бешенство). Вы можете автоматом слать двоичные данные в бакет S3 (но потеряете их в один неосторожный клик). Вы можете телепортироваться куда угодно (но тратите столько времени, словно шли пешком). Вы можете превращаться (но только в пожилого мопса). У вас пышные, шелковистые волосы (но на заднице). </p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "с побочным эффектом 15 марта 2026 · работа 1с в последнем релизе нашей erp мы оптимизировали несколько тяжелых динамических списков (заказы, инвойсы, проформа инвойсы и так далее). там накопился приличный техдолг, в основном — горы вспомогательных таблиц, прикрученных к основным запросам (контактная информация, технические реквизиты, остатки, обороты и так далее). в итоге даже в сравнительно небольших приложениях оптимизатор субд начинал выдавать бредни вместо планов запроса и мало-помалу платить за это ресурсами стало совсем неприятно. в общем, запатчили через несколько разных подходов, один из них — подгрузка дополнительных данных в обработчике приполученииданныхнасервере() (я про него недавно вспоминал , кстати). написали удобный фреймворк вокруг фичи, внедрили, потестировали и... в общем, сидим с кислыми минами. нет, с производительностью и правда стало сильно лучше. запрос к тяжелым виртуальным таблицам можно затюнить просто идеально. проблема в другом: значения полей, которые заполняет этот обработчик, не пробрасываются в стандартные механики динамического списка. то есть для них не работает поиск, сортировка и группировка. например, вводим значение, которое видим в колонке, а строка не находится. или находятся не все строки. или находятся строки, которые не должны были найтись. для пользователя это выглядит отвратительно, ну баг и баг же: визуально-то такие поля никак не отличаются. как ты ему объяснишь, что это особенность работы механизма платформы™? исключишь такое поле из механизмов, которые с ними работать не могут — будет ещё чище. например, попытаешься отсортировать — получишь здоровенную ошибку. опять же, объяснить, почему на этой колонке с суммой вылетает ошибка, а на соседней сортировка прекрасно работает — задача со звездочкой. блин, вот как можно было разработать такой замечательный концепт обработчика и настолько заруинить реализацию на уровне платформы? неожиданно вспомнил реддит. в некоторых сообществах популярны треды «придумай суперсилу, но с побочным эффектом». типа, кто-то пишет в комментариях: я могу бегать со скоростью ветра! ему отвечают: да, но не можешь тормозить. и так далее. местами получается забавно. вот и мы с разработчиками платформы в таком же диалоге. вы можете разогнать динамические списки (но ui будет вызывать у пользователей бешенство). вы можете автоматом слать двоичные данные в бакет s3 (но потеряете их в один неосторожный клик). вы можете телепортироваться куда угодно (но тратите столько времени, словно шли пешком). вы можете превращаться (но только в пожилого мопса). у вас пышные, шелковистые волосы (но на заднице).",
    "tags": [
      "work",
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/ikigai\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Икигай\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>9 марта 2026</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>В японском языке есть замечательное слово «икигай». Это что-то вроде смысла жизни, но не в большом экзистенциальном понимании, а в более приземлённом и конкретном: источник внутренней энергии, источник радости. Ради чего хочется вставать по утрам, короче.</p>\n<p>Таких опор у человека может быть несколько, и у всех они свои. Кофе, кот, любимое ремесло, забота о близких, сад, прогулки, видеоигры...</p>\n<p>Я это к чему. Наткнулся на канал «<a href=\"https://t.me/aleshkino_svoe\" target=\"_blank\">Алёшкино своё</a>». Его автор, насколько я понял, питерский юрист, который разводит породистых курочек и регулярно записывает видео то про конкретные породы, то про нюансы инкубации, то про кормление.</p>\n<p>Я вообще не в теме и птицами не интересуюсь, но поймал себя на том, что минут двадцать просто сидел и заворожённо слушал, не отрываясь. Работает почти как терапия, ей-богу. И, кажется, это вполне такой солидный икигай: дело, которое будешь любить так, как этот мужик любит своих курочек.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "икигай 9 марта 2026 · тем временем в японском языке есть замечательное слово «икигай». это что-то вроде смысла жизни, но не в большом экзистенциальном понимании, а в более приземлённом и конкретном: источник внутренней энергии, источник радости. ради чего хочется вставать по утрам, короче. таких опор у человека может быть несколько, и у всех они свои. кофе, кот, любимое ремесло, забота о близких, сад, прогулки, видеоигры... я это к чему. наткнулся на канал « алёшкино своё ». его автор, насколько я понял, питерский юрист, который разводит породистых курочек и регулярно записывает видео то про конкретные породы, то про нюансы инкубации, то про кормление. я вообще не в теме и птицами не интересуюсь, но поймал себя на том, что минут двадцать просто сидел и заворожённо слушал, не отрываясь. работает почти как терапия, ей-богу. и, кажется, это вполне такой солидный икигай: дело, которое будешь любить так, как этот мужик любит своих курочек.",
    "tags": [
      "meanwhile"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/autosummary\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Автосаммари\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>8 февраля 2026</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">ИИ</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Записывать все встречи я, судя по моим же <a href=\"https://kostyanetsky.ru/notes/video-recording\" target=\"_blank\">заметкам</a>, начал ещё в 2020-м. Видео всегда точнее памяти, а ткнуть на «Start Recording» в <a href=\"https://obsproject.com\" target=\"_blank\">OBS</a> — самый дешёвый способ не потерять какую-нибудь ценную инфу.</p>\n<p>Минусы, впрочем, очевидны — с видео нельзя быстро ухватить суть встречи, по нему невозможен быстрый поиск, оно много весит, в нём легко засветить что-то личное и так далее. Чтобы частично компенсировать это, я в течение встреч тезисно помечал ключевые моменты, а потом либо перекидывал в задачник, либо делал себе что-то вроде саммари: с кем встречался, что обсуждали, какие решения подобрали. Если что-то забыл или упустил детали — сверялся с видео.</p>\n<p>Однако этот метод тоже не идеален. Создание конспекта (даже тезисного) отъедает фокус от самой встречи. Кроме того, про какие-нибудь забытые по ходу дела подробности можно узнать слишком поздно.</p>\n<p><img alt=\"Забыл\" src=\"https://kostyanetsky.ru/notes/autosummary/forgot.jpg\"/></p>\n<p>Короче, пришёл к тому, что хороший вариант — просто извлекать из видео аудио разговора, превращать его в текст (нейронкой), а текст разговора — в детальное саммари по встрече (опять нейронка).</p>\n<p>Аудио проще всего выдрать через <a href=\"https://www.ffmpeg.org\" target=\"_blank\">ffmpeg</a> (консольная утилита для работы с аудио и видео). Ниже пример вызова (один аудиоканал, дискретизация 16 кГц + нормализация громкости):</p>\n<pre>\nffmpeg.exe -y -i \"D:\\video.mkv\" -vn -ac 1 -ar 16000 -af loudnorm -c:a pcm_s16le \"D:\\audio.wav\"\n</pre>\n<p>Что до извлечения текста — я экспериментировал с <a href=\"https://alphacephei.com/vosk/\" target=\"_blank\">Vosk</a> в связке с <a href=\"https://github.com/benob/recasepunc\" target=\"_blank\">recasepunc</a>, но про это без слёз не вспомнить. Даже комментировать не хочу. А вот <s>Боромир</s> <a href=\"https://openai.com/index/whisper\" target=\"_blank\">Whisper</a> (нейросеть от OpenAI, умеющая распознавать голос) ставится в фоне за 10 минут:</p>\n<pre>\npy -3.10 -m venv .venv\n.\\.venv\\Scripts\\Activate.ps1\npip install setuptools wheel\npip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118\npip install openai-whisper\n</pre>\n<p>Пример вызова:</p>\n<pre>\nwhisper \"D:\\audio.wav\" --model medium --language Russian --output_format txt\n</pre>\n<p>На выходе получится текстовый файл с расшифровкой, который можно запихать в любой чатбот и получить вполне связное саммари. Его, конечно, всё ещё нужно вычитать — убрать ошибки и фантазии, что-то переформулировать — но это всё ещё сильно лучше создания конспекта на ходу.</p>\n<p>Вот, в общем-то, и весь метод. Остаётся написать простой скрипт, чтобы не дергать две команды вручную. Если вы тоже на Windows и вам лень вайбкодить, можете взять <a href=\"https://gist.github.com/vkostyanetsky/4f4760097f1b417cc85d71d11662a642\" target=\"_blank\">мой скрипт</a> и подогнать под себя.</p>\n<p>Скрипт ищет в своей папке первый попавшийся .mkv, прогоняет через ffmpeg + Whisper и сохраняет результат в ту же папку. Если будете использовать — обратите внимание, что он работает через <a href=\"https://developer.nvidia.com/cuda\" target=\"_blank\">CUDA</a> (на CPU тоже можно, но будет сильно медленнее) + скачанные модели Whisper он сохраняет не в дефолтный кэш, а в папку с текущим Python-окружением.</p>\n<p>(при желании можно прикрутить к нему вызов API или обращение к какой-нибудь модели в локальной <a href=\"https://lmstudio.ai\" target=\"_blank\">LM Studio</a>, но персонально для себя я решил — не, уже перебор)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "автосаммари 8 февраля 2026 · работа ии записывать все встречи я, судя по моим же заметкам , начал ещё в 2020-м. видео всегда точнее памяти, а ткнуть на «start recording» в obs — самый дешёвый способ не потерять какую-нибудь ценную инфу. минусы, впрочем, очевидны — с видео нельзя быстро ухватить суть встречи, по нему невозможен быстрый поиск, оно много весит, в нём легко засветить что-то личное и так далее. чтобы частично компенсировать это, я в течение встреч тезисно помечал ключевые моменты, а потом либо перекидывал в задачник, либо делал себе что-то вроде саммари: с кем встречался, что обсуждали, какие решения подобрали. если что-то забыл или упустил детали — сверялся с видео. однако этот метод тоже не идеален. создание конспекта (даже тезисного) отъедает фокус от самой встречи. кроме того, про какие-нибудь забытые по ходу дела подробности можно узнать слишком поздно. короче, пришёл к тому, что хороший вариант — просто извлекать из видео аудио разговора, превращать его в текст (нейронкой), а текст разговора — в детальное саммари по встрече (опять нейронка). аудио проще всего выдрать через ffmpeg (консольная утилита для работы с аудио и видео). ниже пример вызова (один аудиоканал, дискретизация 16 кгц + нормализация громкости): ffmpeg.exe -y -i \"d:\\video.mkv\" -vn -ac 1 -ar 16000 -af loudnorm -c:a pcm_s16le \"d:\\audio.wav\" что до извлечения текста — я экспериментировал с vosk в связке с recasepunc , но про это без слёз не вспомнить. даже комментировать не хочу. а вот боромир whisper (нейросеть от openai, умеющая распознавать голос) ставится в фоне за 10 минут: py -3.10 -m venv .venv .\\.venv\\scripts\\activate.ps1 pip install setuptools wheel pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 pip install openai-whisper пример вызова: whisper \"d:\\audio.wav\" --model medium --language russian --output_format txt на выходе получится текстовый файл с расшифровкой, который можно запихать в любой чатбот и получить вполне связное саммари. его, конечно, всё ещё нужно вычитать — убрать ошибки и фантазии, что-то переформулировать — но это всё ещё сильно лучше создания конспекта на ходу. вот, в общем-то, и весь метод. остаётся написать простой скрипт, чтобы не дергать две команды вручную. если вы тоже на windows и вам лень вайбкодить, можете взять мой скрипт и подогнать под себя. скрипт ищет в своей папке первый попавшийся .mkv, прогоняет через ffmpeg + whisper и сохраняет результат в ту же папку. если будете использовать — обратите внимание, что он работает через cuda (на cpu тоже можно, но будет сильно медленнее) + скачанные модели whisper он сохраняет не в дефолтный кэш, а в папку с текущим python-окружением. (при желании можно прикрутить к нему вызов api или обращение к какой-нибудь модели в локальной lm studio , но персонально для себя я решил — не, уже перебор)",
    "tags": [
      "work",
      "ai"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/new-ui\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Новый UI в блоге\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>17 января 2026</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Блог</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>На новогодних праздниках внезапно закусился и переписал UI блога. Хотел всего-то прикрутить поиск по заметкам: их уже довольно много и время от времени нужно что-то быстро выудить из кучи написанного (например, ссылку коллеге скинуть).</p>\n<p>Блог живёт на <a href=\"https://pages.github.com\" target=\"_blank\">Github Pages</a>, так что выбор решений небогат: либо слать запрос в гугл, либо делать свой статический индекс и отдавать в браузер пользователя (пусть сам в нём роется). Я пошёл по второму пути: быстрее, управляемее <s>и можно самому покодить</s>. При первом поиске <a href=\"https://kostyanetsky.ru/notes.json\" target=\"_blank\">файл индекса</a>, правда, нужно скачать, но что такое 200 Кб в современном интернете? Смешно.</p>\n<p>Ну а там как-то, знаете ли, пошло-поехало... Сначала не удавалось прикрутить к полю поиска <a href=\"https://tachyons.io\" target=\"_blank\">Tachyons</a> — разозлился и переделал всё на <a href=\"https://tailwindcss.com\" target=\"_blank\">Tailwind</a> (всё равно хотел попробовать, а случая всё никак не представлялось). Пока писал код для поиска — подумал, что логично сразу вкрутить в него теги, чтобы два раза не вставать. Очнулся с облаком тегов над заметками и сообразил, что тогда уж надо и с проектником то же самое сделать, только там не теги нужны, а стеки...</p>\n<p>В общем, получилось как в том меме из «Страха и отвращения в Лас-Вегасе». Сложно было остановиться. Осталось заставить себя писать в новый проектник: работы всегда дофига, и работа интересная, но если не писать о ней — кофе, всё тонет в кофе.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "новый ui в блоге 17 января 2026 · блог работа готово на новогодних праздниках внезапно закусился и переписал ui блога. хотел всего-то прикрутить поиск по заметкам: их уже довольно много и время от времени нужно что-то быстро выудить из кучи написанного (например, ссылку коллеге скинуть). блог живёт на github pages , так что выбор решений небогат: либо слать запрос в гугл, либо делать свой статический индекс и отдавать в браузер пользователя (пусть сам в нём роется). я пошёл по второму пути: быстрее, управляемее и можно самому покодить . при первом поиске файл индекса , правда, нужно скачать, но что такое 200 кб в современном интернете? смешно. ну а там как-то, знаете ли, пошло-поехало... сначала не удавалось прикрутить к полю поиска tachyons — разозлился и переделал всё на tailwind (всё равно хотел попробовать, а случая всё никак не представлялось). пока писал код для поиска — подумал, что логично сразу вкрутить в него теги, чтобы два раза не вставать. очнулся с облаком тегов над заметками и сообразил, что тогда уж надо и с проектником то же самое сделать, только там не теги нужны, а стеки... в общем, получилось как в том меме из «страха и отвращения в лас-вегасе». сложно было остановиться. осталось заставить себя писать в новый проектник: работы всегда дофига, и работа интересная, но если не писать о ней — кофе, всё тонет в кофе.",
    "tags": [
      "blog",
      "work",
      "done"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/backup-ui\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Управление бэкапами\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>6 декабря 2025</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>В конце года выкатили для нашего внутреннего инструмента (я уже вскользь <a href=\"https://kostyanetsky.ru/notes/easter-eggs\" target=\"_blank\">писал</a> о нём) большой апдейт, дающий коллегам адекватный доступ к бэкапам пользовательских приложений. Бэкапы в SaaS-компании нужны всем и всегда — для разработки, для тестирования, для расследования проблем, да много для чего. Без адекватного учёта процесс превращается в зоопарк, когда три человека в один момент времени создают три запроса на практически одинаковые копии одной и той же базы. Задача, конечно, решается, но ресурсов прожрано в три раза больше, чем хотелось бы.</p>\n<p>У нас уже было решение на базе UI Битрикса, но в силу, э-э, особенностей развития этого продукта оно приносило больше боли, чем пользы. Поэтому мы переосмыслили процесс и всё переписали. На фронте — 1C, на бэке — PostgREST, PostgreSQL, PowerShell и много чего ещё. Логика довольно сложная, но у пользователя — простой и дружелюбный UI, через который можно заказать бэкап буквально в два нажатия.</p>\n<p>Выбрать можно один из трёх видов бэкапов:</p>\n<ul>\n<li>облачный (копия реального приложения, развёрнутая в облаке и доступная, в том числе, через браузер);</li>\n<li>файловый бэкап (обычный .dt-файл, который можно скачать и развернуть на локальной машине);</li>\n<li>бэкап конфигурации и расширений (.cf + .cfe).</li>\n</ul>\n<p>Кроме того, новое решение отслеживает попытки заказать бэкап приложения, если он уже делается прямо сейчас. А ещё — не даёт пользователям бэкапить одно и то же приложение чаще, чем раз в час. </p>\n<p>Ну и продолжаем хохмить в интерфейсе, конечно.</p>\n<p><img alt=\"But Still!\" src=\"https://kostyanetsky.ru/notes/backup-ui/but-still.png\"/></p>\n<p><img alt=\"Coffee First!\" src=\"https://kostyanetsky.ru/notes/backup-ui/coffee-first.png\"/></p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "управление бэкапами 6 декабря 2025 · 1с работа готово в конце года выкатили для нашего внутреннего инструмента (я уже вскользь писал о нём) большой апдейт, дающий коллегам адекватный доступ к бэкапам пользовательских приложений. бэкапы в saas-компании нужны всем и всегда — для разработки, для тестирования, для расследования проблем, да много для чего. без адекватного учёта процесс превращается в зоопарк, когда три человека в один момент времени создают три запроса на практически одинаковые копии одной и той же базы. задача, конечно, решается, но ресурсов прожрано в три раза больше, чем хотелось бы. у нас уже было решение на базе ui битрикса, но в силу, э-э, особенностей развития этого продукта оно приносило больше боли, чем пользы. поэтому мы переосмыслили процесс и всё переписали. на фронте — 1c, на бэке — postgrest, postgresql, powershell и много чего ещё. логика довольно сложная, но у пользователя — простой и дружелюбный ui, через который можно заказать бэкап буквально в два нажатия. выбрать можно один из трёх видов бэкапов: облачный (копия реального приложения, развёрнутая в облаке и доступная, в том числе, через браузер); файловый бэкап (обычный .dt-файл, который можно скачать и развернуть на локальной машине); бэкап конфигурации и расширений (.cf + .cfe). кроме того, новое решение отслеживает попытки заказать бэкап приложения, если он уже делается прямо сейчас. а ещё — не даёт пользователям бэкапить одно и то же приложение чаще, чем раз в час. ну и продолжаем хохмить в интерфейсе, конечно.",
    "tags": [
      "1c",
      "work",
      "done"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/desire-paths\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Протоптанные дорожки\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>29 ноября 2025</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Оптимизация</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Ладно, загадка Жана Фреско. У вас есть таблица, скажем, на 50 тысяч строк. Как прочитать из неё полмиллиарда?</p>\n<p>Раз плюнуть, Nested Loops + Clustered Index Seek:</p>\n<p><img alt=\"Полмиллиарда\" src=\"https://kostyanetsky.ru/notes/desire-paths/500_million.png\"/></p>\n<p>От Clustered Index Seek тут одно название, конечно. Фактически оператор при каждом исполнении пробегает по всей таблице (всему кластерному индексу) и сверяет каждую запись с Predicates. И так — 10 730 раз для 51 391 записей. В итоге 551 425 430 строк прочитали, 13 343 вернули.</p>\n<p><img alt=\"Ох\" src=\"https://kostyanetsky.ru/notes/desire-paths/ouch.gif\"/></p>\n<p>Короче, идеальный пример плохого плана запроса в вакууме, хоть сейчас тащи в палату мер и весов. Nested Loops, если кто позабыл, работает примерно так:</p>\n<pre>\nFor Each Table1Row In Table1 Do\n    For Each Table2Row In Table2 Do\n        ...\n</pre>\n<p>Это ОК для мелких таблиц, но СУБД может его применить и для таблиц поболбше — например, если ей не хватает времени на построение плана.</p>\n<p>Это и произошло в нашем случае. Прыгнем повыше, на уровень платформы: тут у нас динамический список с запросом по таблице документа, к которой разработчики прицепили с десяток виртуальных таблиц регистров накопления.</p>\n<p>Некоторые регистры и сами по себе были здоровенными, а виртуальные таблицы дополнительно поддали жару (каждая превращается в 2+ вложенных запроса). СУБД честно пыталась придумать эффективный алгоритм, но в какой-то момент решала, что хреновый план запроса всё же лучше, чем вообще никакого.</p>\n<p>В итоге пользователь что? Пытался поискать документ по номеру и клиентское приложение просто-напросто зависало.</p>\n<p>Короче, по поводу виртуальных таблиц в динамических списках. В английском есть выражение «desire path», «протоптанная дорожка». Часто прицепить виртуальную таблицу к основной — и в самом деле самый простой, быстрый и привычный способ решить задачу. Но он <strong>не эффективен</strong>.</p>\n<p>Есть, например, обработчик <code>ПриПолученииДанныхНаСервере()</code>. Он дольше в реализации, но позволяет хорошо затюнить виртуальную таблицу и избежать сценария выше. На каждую прокрутку списка получится больше запросов, но они будут быстрее и эффективнее, чем один, но гигантский.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "протоптанные дорожки 29 ноября 2025 · 1с работа оптимизация ладно, загадка жана фреско. у вас есть таблица, скажем, на 50 тысяч строк. как прочитать из неё полмиллиарда? раз плюнуть, nested loops + clustered index seek: от clustered index seek тут одно название, конечно. фактически оператор при каждом исполнении пробегает по всей таблице (всему кластерному индексу) и сверяет каждую запись с predicates. и так — 10 730 раз для 51 391 записей. в итоге 551 425 430 строк прочитали, 13 343 вернули. короче, идеальный пример плохого плана запроса в вакууме, хоть сейчас тащи в палату мер и весов. nested loops, если кто позабыл, работает примерно так: for each table1row in table1 do for each table2row in table2 do ... это ок для мелких таблиц, но субд может его применить и для таблиц поболбше — например, если ей не хватает времени на построение плана. это и произошло в нашем случае. прыгнем повыше, на уровень платформы: тут у нас динамический список с запросом по таблице документа, к которой разработчики прицепили с десяток виртуальных таблиц регистров накопления. некоторые регистры и сами по себе были здоровенными, а виртуальные таблицы дополнительно поддали жару (каждая превращается в 2+ вложенных запроса). субд честно пыталась придумать эффективный алгоритм, но в какой-то момент решала, что хреновый план запроса всё же лучше, чем вообще никакого. в итоге пользователь что? пытался поискать документ по номеру и клиентское приложение просто-напросто зависало. короче, по поводу виртуальных таблиц в динамических списках. в английском есть выражение «desire path», «протоптанная дорожка». часто прицепить виртуальную таблицу к основной — и в самом деле самый простой, быстрый и привычный способ решить задачу. но он не эффективен . есть, например, обработчик приполученииданныхнасервере() . он дольше в реализации, но позволяет хорошо затюнить виртуальную таблицу и избежать сценария выше. на каждую прокрутку списка получится больше запросов, но они будут быстрее и эффективнее, чем один, но гигантский.",
    "tags": [
      "1c",
      "work",
      "optimization"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/obsidian-foodiary-bases\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Дневник питания в Obsidian Bases\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>23 ноября 2025</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Obsidian</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Переписал с помощью <a href=\"https://help.obsidian.md/bases\" target=\"_blank\">Obsidian Bases</a> свой прошлогодний <a href=\"https://kostyanetsky.ru/notes/obsidian-foodiary\" target=\"_blank\">плагин</a>, считающий калории, белки, жиры и углеводы в пище. Получилось сильно более гибкая и настраиваемая штука, чем в виде плагина — не нужно ничего переписывать, собирать и релизить, если вдруг решил посчитать клетчатку в еде или просто подвигать колонки в отчёте.</p>\n<p>Ну и симпатичная, да:</p>\n<p><img alt=\"UI\" src=\"https://kostyanetsky.ru/notes/obsidian-foodiary-bases/base.png\"/></p>\n<p>Все необходимые настройки и скрипты — в <a href=\"https://github.com/vkostyanetsky/ObsidianFoodiaryBases\" target=\"_blank\">репозитории</a> на Github'е; инструкция <a href=\"https://github.com/vkostyanetsky/ObsidianFoodiaryBases/blob/main/README.ru.md\" target=\"_blank\">переведена</a> на русский язык.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "дневник питания в obsidian bases 23 ноября 2025 · готово obsidian переписал с помощью obsidian bases свой прошлогодний плагин , считающий калории, белки, жиры и углеводы в пище. получилось сильно более гибкая и настраиваемая штука, чем в виде плагина — не нужно ничего переписывать, собирать и релизить, если вдруг решил посчитать клетчатку в еде или просто подвигать колонки в отчёте. ну и симпатичная, да: все необходимые настройки и скрипты — в репозитории на github'е; инструкция переведена на русский язык.",
    "tags": [
      "done",
      "obsidian"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/well-there-are-some\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Ну, есть кое-какие\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>17 ноября 2025</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Гуляю вечером, сзади идёт какая-то мама и её мелкий — лет пяти, наверное. Я их не вижу, просто слышу разговор. Мама объясняет ребенку про университет: мол, туда надо поступить, учиться, будут экзамены и всё такое.</p>\n<p>Мальчик молчит, потом расстроенно выдает:</p>\n<p>— Я думал, есть только школа, а оказывается есть ещё сложности...</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "ну, есть кое-какие 17 ноября 2025 · тем временем гуляю вечером, сзади идёт какая-то мама и её мелкий — лет пяти, наверное. я их не вижу, просто слышу разговор. мама объясняет ребенку про университет: мол, туда надо поступить, учиться, будут экзамены и всё такое. мальчик молчит, потом расстроенно выдает: — я думал, есть только школа, а оказывается есть ещё сложности...",
    "tags": [
      "meanwhile"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/harmless-harm\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Безвредный вред\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>16 ноября 2025</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">PostgreSQL</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">MS SQL</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Разбирали на днях с коллегой проблему. Ничего особенно серьёзного, очередное расследование вида «какого черта этот запрос ведет себя странно?».</p>\n<p>Упрощая, суть: читаем таблицу базы данных и кладем результат во временную таблицу. Если срабатывает определённое условие, нужно, чтобы временная таблица всё равно создавалась, но была пустой (независимо от того, есть строки в исходной таблице или нет).</p>\n<p>Запрос был примерно такой:</p>\n<pre>\nSELECT\n    Table.Field1 AS Field1\nFROM\n    Table AS Table\nWHERE \n    &amp;Parameter\n</pre>\n<p>Если нужно было отбирать записи из исходной таблицы во временную, в параметр передавался TRUE; если временную таблицу нужно было получить пустой — передавался FALSE.</p>\n<p>Несмотря на кажущуюся простоту, такой трюк — проблема для производительности, если таблица, которую читает запрос — большая.</p>\n<p>Причина в том, как СУБД работают с параметризованными запросами. И MS SQL, и PostgreSQL строят план выполнения запроса на основе его текста, и в примере выше значение параметра <strong>не</strong> повлияет на принятие решения, нужно читать таблицу или нет.</p>\n<p>Таким образом, при выполнении такого запроса обе СУБД педантично прочитают всю таблицу (ну, или её индекс), даже если параметр равен FALSE. В последнем случае каждая прочитанная запись будет отброшена и алгоритм будет работать корректно, однако мы будем тратить ресурсы на бессмысленное чтение данных и забивать буферный кэш, замедляя систему в целом и активно работая на глобальное потепление :)</p>\n<p>Решение тут простое — вставлять TRUE/FALSE в тело запроса как константу, не используя параметр. Либо использовать оператор TOP, так текст запроса будет даже проще:</p>\n<pre>\nSELECT TOP 0\n    Table.Field1 AS Field1\nFROM\n    Table AS Table\n</pre>\n<p>Тут на уровне SQL мы получим что-то вроде «SELECT TOP 0 ... FROM Table» (для MS SQL) и «SELECT ... FROM Table LIMIT 0» (для PostgreSQL). В итоговом плане будет оператор чтения, но исполнитель фактически не запросит ни одной строки, так что реального сканирования данных не случится (ура).</p>\n<p>P.S. Если не критично получать во временной таблице корректные типы колонок, можно вообще вот так:</p>\n<pre>\nSELECT TOP 0\n    UNDEFINED AS Field1\n</pre>\n<p>Выигрыш в производительности, впрочем, будет таким копеечным, что можно не упарываться. </p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "безвредный вред 16 ноября 2025 · 1с postgresql ms sql разбирали на днях с коллегой проблему. ничего особенно серьёзного, очередное расследование вида «какого черта этот запрос ведет себя странно?». упрощая, суть: читаем таблицу базы данных и кладем результат во временную таблицу. если срабатывает определённое условие, нужно, чтобы временная таблица всё равно создавалась, но была пустой (независимо от того, есть строки в исходной таблице или нет). запрос был примерно такой: select table.field1 as field1 from table as table where &parameter если нужно было отбирать записи из исходной таблицы во временную, в параметр передавался true; если временную таблицу нужно было получить пустой — передавался false. несмотря на кажущуюся простоту, такой трюк — проблема для производительности, если таблица, которую читает запрос — большая. причина в том, как субд работают с параметризованными запросами. и ms sql, и postgresql строят план выполнения запроса на основе его текста, и в примере выше значение параметра не повлияет на принятие решения, нужно читать таблицу или нет. таким образом, при выполнении такого запроса обе субд педантично прочитают всю таблицу (ну, или её индекс), даже если параметр равен false. в последнем случае каждая прочитанная запись будет отброшена и алгоритм будет работать корректно, однако мы будем тратить ресурсы на бессмысленное чтение данных и забивать буферный кэш, замедляя систему в целом и активно работая на глобальное потепление :) решение тут простое — вставлять true/false в тело запроса как константу, не используя параметр. либо использовать оператор top, так текст запроса будет даже проще: select top 0 table.field1 as field1 from table as table тут на уровне sql мы получим что-то вроде «select top 0 ... from table» (для ms sql) и «select ... from table limit 0» (для postgresql). в итоговом плане будет оператор чтения, но исполнитель фактически не запросит ни одной строки, так что реального сканирования данных не случится (ура). p.s. если не критично получать во временной таблице корректные типы колонок, можно вообще вот так: select top 0 undefined as field1 выигрыш в производительности, впрочем, будет таким копеечным, что можно не упарываться.",
    "tags": [
      "1c",
      "pgsql",
      "mssql"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/voodoo\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Шаманство\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>5 октября 2025</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Поймали, кажется, первый воспроизводимый в лабораторных условиях сценарий повреждения кэша платформы. Короткий синопсис:</p>\n<ul>\n<li>Создаем новое приложение из шаблона 35-го релиза <a href=\"https://firstbit.ae\" target=\"_blank\">нашей ERP</a>.</li>\n<li>Запускаем его и ждем, когда закончится инициализация.</li>\n<li>Заменяем конфигурацию приложения на 36-й релиз (конкретно, версию 28537 из хранилища разработки) и снова запускаем.</li>\n</ul>\n<p>После этих нехитрых действий примерно у половины нашей команды платформа перестаёт видеть одно из перечислений. Причем, зараза, избирательно: обращаешься к элементу перечисления на клиенте — полный порядок, обращаешься на сервере — ловишь исключение.</p>\n<p>Такая же петрушка с модулем менеджера одного из справочников: его методы недоступны, хотя существуют и объявлены как экспортные. Однако платформа после обновления делает вид, что их нет, и швыряется исключениями при попытке обратиться.</p>\n<p><a href=\"https://x.com/EffinBirds/status/1970264357427704080\" target=\"_blank\"><img alt=\"Welcome To Dipshit Central\" src=\"https://kostyanetsky.ru/notes/voodoo/welcome.jpg\"/></a></p>\n<p>Как и всегда, когда начинается магия — проблему нужно искать в кэше. Чистишь — все симптомы бесследно исчезают. Кроме того, есть и косвенные признаки:</p>\n<ul>\n<li>Перечисление было и в 35-м релизе, но было переименовано в 36-м;</li>\n<li>Методов в 35-м релизе вообще не было (в 36-м их как раз разработали). </li>\n</ul>\n<p>То есть не первого, не вторых в кэше 35-го релиза не существовало, а платформа, по какой-то причине, пытается рыться в именно в нём.</p>\n<p>Мы пока не доискались, что вызывает сбой. Вышли на конкретный коммит, после которого появилась проблема, но в нём из необычного — одно <a href=\"https://kostyanetsky.ru/notes/voodoo/the-commit.png\" target=\"_blank\">название</a> (и то поблизости есть куда более подозрительные с этой точки зрения <a href=\"https://kostyanetsky.ru/notes/voodoo/the-other-commit.png\" target=\"_blank\">кандидаты</a>). В остальном там минорные <a href=\"https://kostyanetsky.ru/notes/voodoo/5ba6ac0956e0cc7bc6b520e5110420e6950478fe.diff\" target=\"_blank\">изменения</a>, сопровождаемые заменой внутренних идентификаторов объекта метаданных. Они, конечно, связаны с ключами кэша, но их сброс делается при любом изменении любых метаданных и никогда раньше не приводил к проблемам.</p>\n<p>Если вы набрели на эту заметку из гугла, потому что столкнулись с той же бедой — закиньте в проблемный объект какую-нибудь правку, чтобы платформа опять сменила идентификаторы объекта метаданных в манифесте. Например, добавьте пустой метод или просто пробел в текст модуля. Это решит проблему с конфигурацией и инструкция в начале заметки перестанет приводить к повреждению кэша.</p>\n<p>Шаманство, конечно, но работает ¯\\_(ツ)_/¯</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "шаманство 5 октября 2025 · работа 1с поймали, кажется, первый воспроизводимый в лабораторных условиях сценарий повреждения кэша платформы. короткий синопсис: создаем новое приложение из шаблона 35-го релиза нашей erp . запускаем его и ждем, когда закончится инициализация. заменяем конфигурацию приложения на 36-й релиз (конкретно, версию 28537 из хранилища разработки) и снова запускаем. после этих нехитрых действий примерно у половины нашей команды платформа перестаёт видеть одно из перечислений. причем, зараза, избирательно: обращаешься к элементу перечисления на клиенте — полный порядок, обращаешься на сервере — ловишь исключение. такая же петрушка с модулем менеджера одного из справочников: его методы недоступны, хотя существуют и объявлены как экспортные. однако платформа после обновления делает вид, что их нет, и швыряется исключениями при попытке обратиться. как и всегда, когда начинается магия — проблему нужно искать в кэше. чистишь — все симптомы бесследно исчезают. кроме того, есть и косвенные признаки: перечисление было и в 35-м релизе, но было переименовано в 36-м; методов в 35-м релизе вообще не было (в 36-м их как раз разработали). то есть не первого, не вторых в кэше 35-го релиза не существовало, а платформа, по какой-то причине, пытается рыться в именно в нём. мы пока не доискались, что вызывает сбой. вышли на конкретный коммит, после которого появилась проблема, но в нём из необычного — одно название (и то поблизости есть куда более подозрительные с этой точки зрения кандидаты ). в остальном там минорные изменения , сопровождаемые заменой внутренних идентификаторов объекта метаданных. они, конечно, связаны с ключами кэша, но их сброс делается при любом изменении любых метаданных и никогда раньше не приводил к проблемам. если вы набрели на эту заметку из гугла, потому что столкнулись с той же бедой — закиньте в проблемный объект какую-нибудь правку, чтобы платформа опять сменила идентификаторы объекта метаданных в манифесте. например, добавьте пустой метод или просто пробел в текст модуля. это решит проблему с конфигурацией и инструкция в начале заметки перестанет приводить к повреждению кэша. шаманство, конечно, но работает ¯\\_(ツ)_/¯",
    "tags": [
      "work",
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/data-history-missing-indexes\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Медленное удаление областей Фреша\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>3 августа 2025</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Коллега заметил, что на одном из инстансов нашего фреша удаление областей стало идти прямо-таки трагически долго. Что в метриках? Вот это:</p>\n<pre>\nDELETE FROM T1\nFROM _DataHistoryMetadata T1\nWHERE \n    T1._MetadataId = ?\n    AND T1._IsActual = 0x00 \n    AND NOT (\n        T1._MetadataVersionNumber IN (\n            SELECT T2._MetadataVersionNumber AS MetadataVersionNumber_\n            FROM _DataHistoryVersions T2\n            WHERE T2._HistoryDataId IN (\n                SELECT DataHistoryLatestVersions1.DataHistoryLatestVersions._HistoryDataId AS HistoryDataId_\n                FROM DataHistoryLatestVersions1.DataHistoryLatestVersions T3\n                WHERE DataHistoryLatestVersions1.DataHistoryLatestVersions._MetadataId = ?\n            )\n        )\n    )\n</pre>\n<p>Каждый такой запрос читает порядка двадцати гигабайт. Что тут происходит — примерно понятно: платформа пытается удалить историю данных области и кривой запрос к БД приводит к сканированию всей таблицы по всем областям вместо быстрого поиска по индексу. Кто-то на Дмитровском опять поленился.</p>\n<p><a href=\"https://x.com/EffinBirds/status/1945545263407301033\" target=\"_blank\"><img alt=\"Чему ты удивлён?\" src=\"https://kostyanetsky.ru/notes/data-history-missing-indexes/why.png\"/></a></p>\n<p>В общем, теряем от тридцати секунд до получаса на действие. Хотелось бы побыстрее. Решение:</p>\n<pre>\nCREATE NONCLUSTERED INDEX IX_DataHistoryLatestVersions1_MetadataId\n  ON dbo._DataHistoryLatestVersions1 (_MetadataId)\n  INCLUDE (_HistoryDataId)\n  WITH (DROP_EXISTING = OFF, ONLINE = OFF);\n\nCREATE NONCLUSTERED INDEX IX_DataHistoryVersions_MetadataVersionNumber\n  ON dbo._DataHistoryVersions (_MetadataVersionNumber)\n  WITH (DROP_EXISTING = OFF, ONLINE = OFF);\n</pre>\n<p>Стоимость удаления области ожидаемо просела на ~99%.</p>\n<p>Если будете повторять у себя:</p>\n<ol>\n<li>Формально такой трюк нарушает лицензионное соглашение, you've been warned и всё такое.</li>\n<li>Есть риск, что платформа при будущих реструктуризациях будет спотыкаться о новые индексы (особенно при работе по «новой» схеме). Лучше иметь под рукой готовый скрипт, который сможет их грохнуть, а потом (после реструктуризации) — вернуть обратно.</li>\n</ol>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "медленное удаление областей фреша 3 августа 2025 · 1с работа коллега заметил, что на одном из инстансов нашего фреша удаление областей стало идти прямо-таки трагически долго. что в метриках? вот это: delete from t1 from _datahistorymetadata t1 where t1._metadataid = ? and t1._isactual = 0x00 and not ( t1._metadataversionnumber in ( select t2._metadataversionnumber as metadataversionnumber_ from _datahistoryversions t2 where t2._historydataid in ( select datahistorylatestversions1.datahistorylatestversions._historydataid as historydataid_ from datahistorylatestversions1.datahistorylatestversions t3 where datahistorylatestversions1.datahistorylatestversions._metadataid = ? ) ) ) каждый такой запрос читает порядка двадцати гигабайт. что тут происходит — примерно понятно: платформа пытается удалить историю данных области и кривой запрос к бд приводит к сканированию всей таблицы по всем областям вместо быстрого поиска по индексу. кто-то на дмитровском опять поленился. в общем, теряем от тридцати секунд до получаса на действие. хотелось бы побыстрее. решение: create nonclustered index ix_datahistorylatestversions1_metadataid on dbo._datahistorylatestversions1 (_metadataid) include (_historydataid) with (drop_existing = off, online = off); create nonclustered index ix_datahistoryversions_metadataversionnumber on dbo._datahistoryversions (_metadataversionnumber) with (drop_existing = off, online = off); стоимость удаления области ожидаемо просела на ~99%. если будете повторять у себя: формально такой трюк нарушает лицензионное соглашение, you've been warned и всё такое. есть риск, что платформа при будущих реструктуризациях будет спотыкаться о новые индексы (особенно при работе по «новой» схеме). лучше иметь под рукой готовый скрипт, который сможет их грохнуть, а потом (после реструктуризации) — вернуть обратно.",
    "tags": [
      "1c",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/myth-buster\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Развенчиватель мифов\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>27 июля 2025</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Попался под руку объёмный <a href=\"https://infostart.ru/1c/articles/2434171/\" target=\"_blank\">текст</a> на Инфостарте про мифы о платформе, полез читать.</p>\n<p>По сути. Половина там написана заголовка ради, кажется. Свежий номер! Криминал, интриги, расследования! Файловая база быстрее клиент-серверной! СКД медленнее запроса! Вызов метода сервера на сервере — новый вызов сервера! <s>НЛО над Красной площадью!</s></p>\n<p>Однако местами и правда любопытно. Например, о том, что код, слепленный в одну строку, механически работает в десять раз быстрее, я услышал впервые. Жалко, за такой отчаянный свэг коллеги побьют быстрее, чем успеешь порадоваться результату. Да и основные тормоза enterprise-приложений чаще растут из других мест.</p>\n<p>Или, скажем, сравнение скорости выгрузки в таблицу для представлений объектов и для их наименований. Первое — в десятки раз медленнее! На первый взгляд странно: в конце концов, в обоих случаях у нас строки, и на момент замера они уже извлечены из базы. Думаю, что дело в типизации: строки представлений имеют неограниченную длину, в отличие от наименований. Отсюда расходы на выделение памяти, какие-то вспомогательные структуры и вот мы имеем то, что имеем.</p>\n<p>P.S. Про некоторые аспекты из статьи я где-то у себя писал. Если навскидку — помню свою попытку <a href=\"https://kostyanetsky.ru/notes/is-ref-empty\" target=\"_blank\">измерить</a> скорость работы <code>ValueIsFilled()</code> и неприятный <a href=\"https://kostyanetsky.ru/notes/method-with-surprise\" target=\"_blank\">сюрприз</a> от встроенного <code>FindByNumber()</code>.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "развенчиватель мифов 27 июля 2025 · 1с попался под руку объёмный текст на инфостарте про мифы о платформе, полез читать. по сути. половина там написана заголовка ради, кажется. свежий номер! криминал, интриги, расследования! файловая база быстрее клиент-серверной! скд медленнее запроса! вызов метода сервера на сервере — новый вызов сервера! нло над красной площадью! однако местами и правда любопытно. например, о том, что код, слепленный в одну строку, механически работает в десять раз быстрее, я услышал впервые. жалко, за такой отчаянный свэг коллеги побьют быстрее, чем успеешь порадоваться результату. да и основные тормоза enterprise-приложений чаще растут из других мест. или, скажем, сравнение скорости выгрузки в таблицу для представлений объектов и для их наименований. первое — в десятки раз медленнее! на первый взгляд странно: в конце концов, в обоих случаях у нас строки, и на момент замера они уже извлечены из базы. думаю, что дело в типизации: строки представлений имеют неограниченную длину, в отличие от наименований. отсюда расходы на выделение памяти, какие-то вспомогательные структуры и вот мы имеем то, что имеем. p.s. про некоторые аспекты из статьи я где-то у себя писал. если навскидку — помню свою попытку измерить скорость работы valueisfilled() и неприятный сюрприз от встроенного findbynumber() .",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/delete-geometry\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Удаление геометрии\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>12 июня 2025</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">3D</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Освоил прикольный трюк с удалением части объекта в том случае, если он с чем-то пересекается. Например, на этой гифке в центре находится модель головы обезьянки; при движении плоскости видно, как её часть (как раз та, что начинает пересекаться с обезьянкой) исчезает.</p>\n<p><img alt=\"Демо\" src=\"https://kostyanetsky.ru/notes/delete-geometry/demo.gif\"/></p>\n<p><a href=\"https://github.com/vkostyanetsky/3DPlayground/blob/main/Geometry%20Nodes/DeleteGeometry.blend\" target=\"_blank\">Идея</a> довольно простая: сводим геометрию объекта-ограничителя к кубу, вычисляем его минимальные и максимальные координаты по всем осям, а потом для каждой точки «обрезаемого» объекта проверяем, входит ли она в полученный диапазон. Входит? Удаляем.</p>\n<p>Способов применения — масса; например, мне это пригодилось, когда я захотел автоматически отрезать часть линий декоративного нотного стана на стене так, чтобы они не пересекали дверной проем.</p>\n<p><img alt=\"Пример\" src=\"https://kostyanetsky.ru/notes/delete-geometry/case.jpg\"/></p>\n<p>Конечно, можно было бы сделать это вручную, без геонод, но такой вариант ударил бы по гибкости: изменятся какие-то размеры (ширина стены, размеры двери, угол наклона линий) \u000f— всё придётся переделывать.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "удаление геометрии 12 июня 2025 · 3d освоил прикольный трюк с удалением части объекта в том случае, если он с чем-то пересекается. например, на этой гифке в центре находится модель головы обезьянки; при движении плоскости видно, как её часть (как раз та, что начинает пересекаться с обезьянкой) исчезает. идея довольно простая: сводим геометрию объекта-ограничителя к кубу, вычисляем его минимальные и максимальные координаты по всем осям, а потом для каждой точки «обрезаемого» объекта проверяем, входит ли она в полученный диапазон. входит? удаляем. способов применения — масса; например, мне это пригодилось, когда я захотел автоматически отрезать часть линий декоративного нотного стана на стене так, чтобы они не пересекали дверной проем. конечно, можно было бы сделать это вручную, без геонод, но такой вариант ударил бы по гибкости: изменятся какие-то размеры (ширина стены, размеры двери, угол наклона линий) \u000f— всё придётся переделывать.",
    "tags": [
      "3d"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/no\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Нет\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>11 июня 2025</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p><img alt=\"Нет\" src=\"https://kostyanetsky.ru/notes/no/no.jpg\"/></p>\n<p>Сообщение, которое выдает актуальная платформа при попытке подключения к выключенному кластеру серверов. Я, конечно, люблю лаконичность в интерфейсах, но тут всё-таки перебор.</p>\n<p>Платформа, причем, установлена с единственным языковым пакетом (английским) и даже запущена с жестким указанием на «Ven VLen», но откуда-то всё равно прорастают родные березки. Возможно, сишная библиотека, откуда стреляет сообщение (DataExchangeTcpClientImpl.cpp) в моем случае смотрит на язык ОС (русский), сложно сказать.</p>\n<p>В любом случае, не могу избавиться от ассоциаций с Багзом Банни каждый раз, как вижу это окошко.</p>\n<p><img alt=\"No\" src=\"https://kostyanetsky.ru/notes/no/bugs-bunny.png\"/></p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "нет 11 июня 2025 · 1с работа сообщение, которое выдает актуальная платформа при попытке подключения к выключенному кластеру серверов. я, конечно, люблю лаконичность в интерфейсах, но тут всё-таки перебор. платформа, причем, установлена с единственным языковым пакетом (английским) и даже запущена с жестким указанием на «ven vlen», но откуда-то всё равно прорастают родные березки. возможно, сишная библиотека, откуда стреляет сообщение (dataexchangetcpclientimpl.cpp) в моем случае смотрит на язык ос (русский), сложно сказать. в любом случае, не могу избавиться от ассоциаций с багзом банни каждый раз, как вижу это окошко.",
    "tags": [
      "1c",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/hottabych\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Проблема джинна\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>12 апреля 2025</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">3D</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <blockquote>\n<p>Вернувшись в Волькину комнату, Хоттабыч хитро оглянулся, щелкнул пальцами левой руки, и на стене... Тотчас же появилось точное подобие телефона, висевшего в прихожей. </p>\n<p>— Теперь ты сможешь сколько угодно беседовать с друзьями, не покидая своей комнаты.</p>\n<p>— Вот за это спасибо! — с чувством промолвил Волька, снял трубку, прижал ее к уху и долго тщетно прислушивался. Никаких гудков не было слышно... </p>\n<p>— Аппарат испорчен, — объяснил он Хоттабычу, — сейчас я открою крышку. Посмотрим, в чем там дело. </p>\n<p>Но коробка аппарата, несмотря на все усилия Вольки, никак не открывалась. </p>\n<p>— Он сделан из цельного куска самого отборного черного мрамора! — похвастался Хоттабыч.</p>\n<p>— Значит, внутри там ничего нет? — разочарованно спросил Волька.</p>\n<p>— А разве внутри должно что-нибудь быть? — забеспокоился Хоттабыч.</p>\n<p>— В таком случае понятно, почему этот телефон не действует, — сказал Волька, — ты сделал только макет телефона, без всего, что полагается внутри.</p>\n<p><em>«Старик Хоттабыч», Лазарь Лагин</em></p>\n</blockquote>\n<p>Занимаясь 3D-моделированием, регулярно ощущаю себя этим джинном. Старик тоже пытался повторять форму предметов и даже делал их симпатичнее, как умел — однако фейлился, так как не понимал, что там внутри. </p>\n<p>Вот и я так же. Последний месяц довожу до ума модель школьного класса музыки и знаете что? Об устройстве рояля я уже узнал больше, чем за всю предыдущую жизнь. А ещё могу прочитать короткую лекцию о системах отопления в российских школах: секционных батареях, панельных, чугунных и алюминиевых, какие чаще встречаются, расстояниях между ними, почему не надо подключать три в ряд и так далее :)</p>\n<p>Я читал об этом эффекте: мол, рисуешь, например, самурайскую броню — по ходу дела волей-неволей много узнаешь о свойствах кожи, видах металла и технологическом стеке самурайской эпохи в целом. Не думал, правда, что столкнусь с этим буквально с самого начала — но, думаю, это хорошо. Стимуляция нейронных связей, расширение видения мира, развитие креативности и всё такое.</p>\n<p>Ну и в целом интереснее работать с моделью, когда понимаешь, что там, так сказать, внутри барабанчика.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "проблема джинна 12 апреля 2025 · 3d вернувшись в волькину комнату, хоттабыч хитро оглянулся, щелкнул пальцами левой руки, и на стене... тотчас же появилось точное подобие телефона, висевшего в прихожей. — теперь ты сможешь сколько угодно беседовать с друзьями, не покидая своей комнаты. — вот за это спасибо! — с чувством промолвил волька, снял трубку, прижал ее к уху и долго тщетно прислушивался. никаких гудков не было слышно... — аппарат испорчен, — объяснил он хоттабычу, — сейчас я открою крышку. посмотрим, в чем там дело. но коробка аппарата, несмотря на все усилия вольки, никак не открывалась. — он сделан из цельного куска самого отборного черного мрамора! — похвастался хоттабыч. — значит, внутри там ничего нет? — разочарованно спросил волька. — а разве внутри должно что-нибудь быть? — забеспокоился хоттабыч. — в таком случае понятно, почему этот телефон не действует, — сказал волька, — ты сделал только макет телефона, без всего, что полагается внутри. «старик хоттабыч», лазарь лагин занимаясь 3d-моделированием, регулярно ощущаю себя этим джинном. старик тоже пытался повторять форму предметов и даже делал их симпатичнее, как умел — однако фейлился, так как не понимал, что там внутри. вот и я так же. последний месяц довожу до ума модель школьного класса музыки и знаете что? об устройстве рояля я уже узнал больше, чем за всю предыдущую жизнь. а ещё могу прочитать короткую лекцию о системах отопления в российских школах: секционных батареях, панельных, чугунных и алюминиевых, какие чаще встречаются, расстояниях между ними, почему не надо подключать три в ряд и так далее :) я читал об этом эффекте: мол, рисуешь, например, самурайскую броню — по ходу дела волей-неволей много узнаешь о свойствах кожи, видах металла и технологическом стеке самурайской эпохи в целом. не думал, правда, что столкнусь с этим буквально с самого начала — но, думаю, это хорошо. стимуляция нейронных связей, расширение видения мира, развитие креативности и всё такое. ну и в целом интереснее работать с моделью, когда понимаешь, что там, так сказать, внутри барабанчика.",
    "tags": [
      "3d"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/easter-eggs\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Пасхалки\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>6 апреля 2025</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p><img alt=\"Thank you, Mario!\" src=\"https://kostyanetsky.ru/notes/easter-eggs/mario.jpg\"/></p>\n<p><img alt=\"Awaiting Signal\" src=\"https://kostyanetsky.ru/notes/easter-eggs/mothership.jpg\"/></p>\n<p>Пара пасхалок, которые можно найти внутри FirstBit ERP. Спрятаны для разработчиков: пользователи в первом случае видят на форме заголовок и текст оповещения, а во втором — стандартное waiting for connection.</p>\n<p>Люблю время от времени делать такие штуки: это весело, а ещё — помогает не скучать, даже если задача не слишком увлекает или просто устал. Если не читали заметку «<a href=\"https://collab.ldwg.ru/stressless-design\" target=\"_blank\">Дизайн без стресса</a>» Быстроновского — прочитайте, она клёвая (а я все равно не сформулирую лучше).</p>\n<p>Вот, кстати, ещё одна пасхалка. Эта уже не из нашей ERP, а из нового инструмента по автоматическому обновлению баз. Его мы пишем сами для себя, поэтому можно хохмить с пользователем :)</p>\n<p><img alt=\"Nice try, Marty!\" src=\"https://kostyanetsky.ru/notes/easter-eggs/marty.jpg\"/></p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "пасхалки 6 апреля 2025 · работа пара пасхалок, которые можно найти внутри firstbit erp. спрятаны для разработчиков: пользователи в первом случае видят на форме заголовок и текст оповещения, а во втором — стандартное waiting for connection. люблю время от времени делать такие штуки: это весело, а ещё — помогает не скучать, даже если задача не слишком увлекает или просто устал. если не читали заметку « дизайн без стресса » быстроновского — прочитайте, она клёвая (а я все равно не сформулирую лучше). вот, кстати, ещё одна пасхалка. эта уже не из нашей erp, а из нового инструмента по автоматическому обновлению баз. его мы пишем сами для себя, поэтому можно хохмить с пользователем :)",
    "tags": [
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/across-meeting\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Разработка ERP на английском\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>19 января 2025</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">English</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/mZwHTbu285A\" width=\"560\"></iframe>\n<p>Ведущий разработчик из нашей команды немного рассказал о нашей работе — конкретно, о разработке ERP на 1С для ОАЭ и, с недавних пор, Саудовской Аравии. Встречу захостила онлайн-школа английского языка Across, так что аудитория получилась соответствующая — русскоговорящие ребята, интересующиеся карьерой и рынками за рубежом.</p>\n<p>В целом получилось прикольно, особенно как языковая практика. Напоминаю, что изучение иностранных языков — все ещё один из лучших способов размять мозги и, до кучи, один из самых доступных. Материалов и клубов по интересам не найти невозможно, было бы желание :)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "разработка erp на английском 19 января 2025 · работа english ведущий разработчик из нашей команды немного рассказал о нашей работе — конкретно, о разработке erp на 1с для оаэ и, с недавних пор, саудовской аравии. встречу захостила онлайн-школа английского языка across, так что аудитория получилась соответствующая — русскоговорящие ребята, интересующиеся карьерой и рынками за рубежом. в целом получилось прикольно, особенно как языковая практика. напоминаю, что изучение иностранных языков — все ещё один из лучших способов размять мозги и, до кучи, один из самых доступных. материалов и клубов по интересам не найти невозможно, было бы желание :)",
    "tags": [
      "work",
      "english"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/safe-code\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Загадочный код\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>18 января 2025</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Грузия</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p><img alt=\"Код\" src=\"https://kostyanetsky.ru/notes/safe-code/code.jpg\"/></p>\n<p>Где-то на улицах Тбилиси. Как большой фанат серии Dishonored — не смог пройти мимо. Уверен, поблизости есть сейф, к которому этот код подходит!</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "загадочный код 18 января 2025 · грузия видеоигры где-то на улицах тбилиси. как большой фанат серии dishonored — не смог пройти мимо. уверен, поблизости есть сейф, к которому этот код подходит!",
    "tags": [
      "georgia",
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/negativity\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Уходи, негатив!\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>29 декабря 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Грузия</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p><img alt=\"Чичилаки\" src=\"https://kostyanetsky.ru/notes/negativity/chichilaki.jpg\"/></p>\n<p>Белые штуки на заднем плане называются чичилаки. Это что-то вроде грузинской новогодней ёлки (де-факто, тщательно наструганный орешник). Считается, что он собирает на себя весь накопившийся негатив, так что после праздников его положено сжечь (вместе с негативом).</p>\n<p>Последнее, как оказалось, задача со звездочкой. Местная полиция (и особенно пожарка) относится к этой старой доброй традиции с подозрением, и их можно понять (чичилаки бывает и в рост человека, факел выйдет — будь здоров).  Так что «заряженную» негативом чичилаки нам посоветовали просто выкинуть в мусорку, чтобы не нажить свежих проблем. Или сдать в зоопарк: животные ими играют и зубы чистят.</p>\n<p>Последнее позабавило. Избавиться от негатива помогают котики, какая неожиданность. Да, здоровенные и повышенной зубастости, но всё же!</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "уходи, негатив! 29 декабря 2024 · грузия тем временем белые штуки на заднем плане называются чичилаки. это что-то вроде грузинской новогодней ёлки (де-факто, тщательно наструганный орешник). считается, что он собирает на себя весь накопившийся негатив, так что после праздников его положено сжечь (вместе с негативом). последнее, как оказалось, задача со звездочкой. местная полиция (и особенно пожарка) относится к этой старой доброй традиции с подозрением, и их можно понять (чичилаки бывает и в рост человека, факел выйдет — будь здоров). так что «заряженную» негативом чичилаки нам посоветовали просто выкинуть в мусорку, чтобы не нажить свежих проблем. или сдать в зоопарк: животные ими играют и зубы чистят. последнее позабавило. избавиться от негатива помогают котики, какая неожиданность. да, здоровенные и повышенной зубастости, но всё же!",
    "tags": [
      "georgia",
      "meanwhile"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/bit-of-surgery\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Немного хирургии\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>17 декабря 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Несколько лет назад попадалась на глаза заметка программиста, которому пришлось отлаживать ПО, управляющее роботом-хирургом, прямо во время операции. Помню, тогда это меня поразило до глубины души.</p>\n<p>А сегодня с коллегой ремонтировали кластер 1С с базами на 1cFresh, которому после миграции на соседний сервер внезапно поплохело (если вкратце, при попытке распечатать документ клиентское приложение умирало в муках). Пока возились, мелькнула мысль: это, конечно, не так жутко выглядит, как ремонтировать софт, от которого вот прямо сейчас зависит чья-то жизнь, но... Если посчитать всех клиентов, которые вот прямо сейчас сидят на нервах из-за того, что у них бизнес стоит — ещё неизвестно, где уровень стресса будет выше.</p>\n<p>P.S. Технические заморочки для тех, кому интересно. Вышло так, что при миграции кластера права на папку с серверным кэшем переехали некорректно и это привело к любопытному эффекту: в ней оседали только логи, а данные сеансов — нет. В итоге при открытии печатной формы документа конфигурация пыталась положить её в хранилище; rphost, в свою очередь, пытался засунуть её в серверный кэш сеанса.</p>\n<p>Так что рабочий процесс (видимо) получал по рукам от ОС, из-за (видимо) кривой отработки событий файловой системы в платформе никак это исключение не обрабатывал и от безысходности убивал сеанс, что, в свою очередь, приводило к крашу клиентского процесса.</p>\n<p>Пересобрали права, перезапустили кластер, проблема ушла.</p>\n<p><img alt=\"End of Report\" src=\"https://kostyanetsky.ru/notes/bit-of-surgery/report.jpeg\"/></p>\n<p>Остальные гипотезы (буйство менеджера кластера, недостаток аппаратных ресурсов, программные ошибки конфигурации, ошибки клиентского процесса, кривая отработка security profile, проблемы c сетью между клиентом и сервером) отбросили по ходу диагностики.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "немного хирургии 17 декабря 2024 · 1с работа несколько лет назад попадалась на глаза заметка программиста, которому пришлось отлаживать по, управляющее роботом-хирургом, прямо во время операции. помню, тогда это меня поразило до глубины души. а сегодня с коллегой ремонтировали кластер 1с с базами на 1cfresh, которому после миграции на соседний сервер внезапно поплохело (если вкратце, при попытке распечатать документ клиентское приложение умирало в муках). пока возились, мелькнула мысль: это, конечно, не так жутко выглядит, как ремонтировать софт, от которого вот прямо сейчас зависит чья-то жизнь, но... если посчитать всех клиентов, которые вот прямо сейчас сидят на нервах из-за того, что у них бизнес стоит — ещё неизвестно, где уровень стресса будет выше. p.s. технические заморочки для тех, кому интересно. вышло так, что при миграции кластера права на папку с серверным кэшем переехали некорректно и это привело к любопытному эффекту: в ней оседали только логи, а данные сеансов — нет. в итоге при открытии печатной формы документа конфигурация пыталась положить её в хранилище; rphost, в свою очередь, пытался засунуть её в серверный кэш сеанса. так что рабочий процесс (видимо) получал по рукам от ос, из-за (видимо) кривой отработки событий файловой системы в платформе никак это исключение не обрабатывал и от безысходности убивал сеанс, что, в свою очередь, приводило к крашу клиентского процесса. пересобрали права, перезапустили кластер, проблема ушла. остальные гипотезы (буйство менеджера кластера, недостаток аппаратных ресурсов, программные ошибки конфигурации, ошибки клиентского процесса, кривая отработка security profile, проблемы c сетью между клиентом и сервером) отбросили по ходу диагностики.",
    "tags": [
      "1c",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/vaporia\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Смутно знакомый логотип\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>14 декабря 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">ИИ</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Грузия</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p><del>Тем временем OpenAI открыл в Тбилиси филиал</del> На самом деле тут вейпами торгуют, а дизайнер логотипа, скорее всего, вдохновлялся клубами пара. Но каждый раз, как мимо хожу, глаз цепляется :)</p>\n<p><img alt=\"Vaporia\" src=\"https://kostyanetsky.ru/notes/vaporia/vaporia.jpg\"/></p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "смутно знакомый логотип 14 декабря 2024 · ии грузия тем временем openai открыл в тбилиси филиал на самом деле тут вейпами торгуют, а дизайнер логотипа, скорее всего, вдохновлялся клубами пара. но каждый раз, как мимо хожу, глаз цепляется :)",
    "tags": [
      "ai",
      "georgia"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/creepy-graveyard\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Жуткое кладбище\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>26 ноября 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">3D</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Продолжаю осваивать 3D в свободное время. Вот, первая более-менее самостоятельная работа с <a href=\"https://www.udemy.com/course/blender-environments-megacourse-create-3d-environments/\" target=\"_blank\">курса</a>, который недавно закончил.</p>\n<p><a href=\"https://kostyanetsky.ru/notes/creepy-graveyard/creepy-graveyard.png\" target=\"_blank\"><img alt=\"Creepy Graveyard\" src=\"https://kostyanetsky.ru/notes/creepy-graveyard/creepy-graveyard.png\"/></a></p>\n<iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/mraGFR_Tr5k\" width=\"560\"></iframe>\n<p>Проблем, конечно, хватает: и в моделях, и в цветах, и в композиции... Да вообще везде. Хорошо хоть, что сцена по сюжету — ночь и туман. Самые косячные места можно просто спрятать. Не удивлюсь, если авторы курса специально выбрали такой сеттинг, чтобы новички не расстраивались :)</p>\n<p>Но результатом я всё равно доволен. Думаю, на этом этапе перфекционизм скорее мешает, чем помогает. К тому же получилось явно лучше, чем прошлая работа. Я тогда был совсем зелёным в Blender и боялся сделать шаг в сторону от преподавателя: десять минут смотрел урок, а потом десять минут пытался повторить.</p>\n<p>Такой подход работает только на старте, но не помогает понять, как искать решения проблем. Поэтому в этот раз я смотрел несколько уроков подряд по часу-полтора. Потом пробовал делать сам и к видео возвращался, только если совсем что-то не клеилось. В голове, кажется, осело заметно больше.</p>\n<p>Короче, прогресс есть, едем дальше!</p>\n<p>UPD: Один из фаундеров FlippedNormals записал <a href=\"https://www.youtube.com/watch?v=izkRFqBzya0\" target=\"_blank\">ролик</a> с теми же мыслями про обучение.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "жуткое кладбище 26 ноября 2024 · 3d готово продолжаю осваивать 3d в свободное время. вот, первая более-менее самостоятельная работа с курса , который недавно закончил. проблем, конечно, хватает: и в моделях, и в цветах, и в композиции... да вообще везде. хорошо хоть, что сцена по сюжету — ночь и туман. самые косячные места можно просто спрятать. не удивлюсь, если авторы курса специально выбрали такой сеттинг, чтобы новички не расстраивались :) но результатом я всё равно доволен. думаю, на этом этапе перфекционизм скорее мешает, чем помогает. к тому же получилось явно лучше, чем прошлая работа. я тогда был совсем зелёным в blender и боялся сделать шаг в сторону от преподавателя: десять минут смотрел урок, а потом десять минут пытался повторить. такой подход работает только на старте, но не помогает понять, как искать решения проблем. поэтому в этот раз я смотрел несколько уроков подряд по часу-полтора. потом пробовал делать сам и к видео возвращался, только если совсем что-то не клеилось. в голове, кажется, осело заметно больше. короче, прогресс есть, едем дальше! upd: один из фаундеров flippednormals записал ролик с теми же мыслями про обучение.",
    "tags": [
      "3d",
      "done"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/slack-summary\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Сводка в Slack\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>10 ноября 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Powershell</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Попался под руку <a href=\"https://gist.github.com/vkostyanetsky/b0807f2df2501bbeeb97c95a977f3e23\" target=\"_blank\">скрипт</a>, который я пару лет назад накатал для рабочего GitLab'а. Вкратце: мы ежедневно прогоняем репозиторий разработки через прорву тестов на Ванессе, в результате чего получаем симпатичный отчет — сколько тестов выполнено, какие провалились, причины провалов и так далее.</p>\n<p>Отчет нужно постоянно анализировать, хотя бы бегло. Конечно, полностью «зеленых» тестов мы уже давно не видели, и это нормально: например, в случае взаимозависимой разработки, когда коммиты ломают проверяемый функционал, и тесты еще предстоит поправить. Однако держать руку на пульсе все равно необходимо.</p>\n<p>Чтобы упростить эту рутину, я немного расширил код пайплайна: после формирования отчета GitLab первым делом создает короткую сводку (тип клиента, тип базы, статистика по тестам) и отправляет ее в слак.</p>\n<p><img alt=\"Отчет\" src=\"https://kostyanetsky.ru/notes/slack-summary/report.jpg\"/></p>\n<p>Как бонус, стало проще отвечать на философский вопрос «кто все сломал». Чаще всего — автор первого коммита, на котором метрика Scenarios Failed на скриншоте выше пробила потолок :)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "сводка в slack 10 ноября 2024 · работа готово powershell попался под руку скрипт , который я пару лет назад накатал для рабочего gitlab'а. вкратце: мы ежедневно прогоняем репозиторий разработки через прорву тестов на ванессе, в результате чего получаем симпатичный отчет — сколько тестов выполнено, какие провалились, причины провалов и так далее. отчет нужно постоянно анализировать, хотя бы бегло. конечно, полностью «зеленых» тестов мы уже давно не видели, и это нормально: например, в случае взаимозависимой разработки, когда коммиты ломают проверяемый функционал, и тесты еще предстоит поправить. однако держать руку на пульсе все равно необходимо. чтобы упростить эту рутину, я немного расширил код пайплайна: после формирования отчета gitlab первым делом создает короткую сводку (тип клиента, тип базы, статистика по тестам) и отправляет ее в слак. как бонус, стало проще отвечать на философский вопрос «кто все сломал». чаще всего — автор первого коммита, на котором метрика scenarios failed на скриншоте выше пробила потолок :)",
    "tags": [
      "work",
      "done",
      "powershell"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/butterfly\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Лог и баг\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>12 октября 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">English</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Люблю иногда покопаться в происхождении слов. Например, «лог» пришло из морского дела и означало буквально бревно: деревянный поплавок, к которому прикрепляли веревку и бросали за борт судна. Верёвка имела узлы на равных промежутках, и по числу узлов, которые успевали размотаться за определённое время, моряки определяли скорость судна.</p>\n<p>Эти измерения записывались в судовом журнале, который тоже назывался логом. Со временем так стали называть вообще любой журнал или запись о каком-то событии, а в айти слово вообще обрело вторую жизнь :)</p>\n<p>Или, скажем, «баг» — ну, про это, наверное, все слышали? Мотылек, который семьдесят с гаком лет назад помешал работе компьютера, был отмечен в журнале как «first actual case of bug being found», и пошло-поехало. Насекомое получило своего рода цифровое бессмертие: теперь так называют любую ошибку, особенно в программе. </p>\n<p>(Жаль только, что это было не какое-нибудь насекомое посимпатичнее — ну, не знаю, бабочка? Это прибавило бы нашей работе нотку романтики)</p>\n<p>(Впрочем, если подумать... Может, «bug» и не такой плохой вариант. «Butterfly» — как-то длинновато. Кто-нибудь быстро сократил бы это до «butt», и чинили бы мы сейчас не баги, а жопы)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "лог и баг 12 октября 2024 · english люблю иногда покопаться в происхождении слов. например, «лог» пришло из морского дела и означало буквально бревно: деревянный поплавок, к которому прикрепляли веревку и бросали за борт судна. верёвка имела узлы на равных промежутках, и по числу узлов, которые успевали размотаться за определённое время, моряки определяли скорость судна. эти измерения записывались в судовом журнале, который тоже назывался логом. со временем так стали называть вообще любой журнал или запись о каком-то событии, а в айти слово вообще обрело вторую жизнь :) или, скажем, «баг» — ну, про это, наверное, все слышали? мотылек, который семьдесят с гаком лет назад помешал работе компьютера, был отмечен в журнале как «first actual case of bug being found», и пошло-поехало. насекомое получило своего рода цифровое бессмертие: теперь так называют любую ошибку, особенно в программе. (жаль только, что это было не какое-нибудь насекомое посимпатичнее — ну, не знаю, бабочка? это прибавило бы нашей работе нотку романтики) (впрочем, если подумать... может, «bug» и не такой плохой вариант. «butterfly» — как-то длинновато. кто-нибудь быстро сократил бы это до «butt», и чинили бы мы сейчас не баги, а жопы)",
    "tags": [
      "english"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/love\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Мимикрия ChatGPT\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>29 сентября 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">ИИ</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Коллеги вовсю <a href=\"https://t.me/denissexy/8767\" target=\"_blank\">экспериментируют</a> с o1-preview от OpenAI: модель получилась по-настоящему интересной. Жаль, задачи для неё попадаются не так уж часто: с большинством повседневных прекрасно справляется и обычная 4o. Поиск ошибок в коде, анализ медицинских тестов на незнакомом языке, попытки вспомнить название книги, которую читал в детстве и едва помнишь завязку — я сходу и не вспомню, что ей не по зубам.</p>\n<p>Каждый раз любопытно смотреть, как ИИ рассуждает, шутит и вообще, старается выглядеть как человек. Я бы сказал, что тест Тьюринга эта штука пока не пройдёт, но время от времени стреляет пугающе близко.</p>\n<p><img alt=\"Морковка\" src=\"https://kostyanetsky.ru/notes/love/carrot.jpg\"/> <img alt=\"Кулаки\" src=\"https://kostyanetsky.ru/notes/love/fists.jpg\"/> <img alt=\"Угараешь?\" src=\"https://kostyanetsky.ru/notes/love/joke.jpg\"/></p>\n<p>А вот ответ ниже прямо порадовал. Даже если оставить за скобками философию — Скайнет, похоже, отменяется! :) Впрочем, будущее из финала <a href=\"https://store.steampowered.com/app/282140/SOMA/\" target=\"_blank\">SOMA</a> — пока, боюсь, нет.</p>\n<p><img alt=\"Любовь\" src=\"https://kostyanetsky.ru/notes/love/love.jpg\"/></p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "мимикрия chatgpt 29 сентября 2024 · ии видеоигры коллеги вовсю экспериментируют с o1-preview от openai: модель получилась по-настоящему интересной. жаль, задачи для неё попадаются не так уж часто: с большинством повседневных прекрасно справляется и обычная 4o. поиск ошибок в коде, анализ медицинских тестов на незнакомом языке, попытки вспомнить название книги, которую читал в детстве и едва помнишь завязку — я сходу и не вспомню, что ей не по зубам. каждый раз любопытно смотреть, как ии рассуждает, шутит и вообще, старается выглядеть как человек. я бы сказал, что тест тьюринга эта штука пока не пройдёт, но время от времени стреляет пугающе близко. а вот ответ ниже прямо порадовал. даже если оставить за скобками философию — скайнет, похоже, отменяется! :) впрочем, будущее из финала soma — пока, боюсь, нет.",
    "tags": [
      "ai",
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/thumbs-up\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Во!\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>21 сентября 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Грузия</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Звонок в дверь. Открываю и вижу двух сияющих девушек лет двадцати. Ослепительно улыбаются мне и начинают что-то наперебой тараторить. </p>\n<p>Грузинский язык красивый, но на слух я его совсем не понимаю. Вздохнул, предложил перейти на английский или русский.</p>\n<p>Девушки насупились. Потом одна выудила из сумки раздатку, показала на неё, потом показала мне большой палец — типа, во! — и сунула её мне в руки. </p>\n<p>Рассмеялись и убежали.</p>\n<p>Так тебе, языковой барьер, получай!</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "во! 21 сентября 2024 · тем временем грузия звонок в дверь. открываю и вижу двух сияющих девушек лет двадцати. ослепительно улыбаются мне и начинают что-то наперебой тараторить. грузинский язык красивый, но на слух я его совсем не понимаю. вздохнул, предложил перейти на английский или русский. девушки насупились. потом одна выудила из сумки раздатку, показала на неё, потом показала мне большой палец — типа, во! — и сунула её мне в руки. рассмеялись и убежали. так тебе, языковой барьер, получай!",
    "tags": [
      "meanwhile",
      "georgia"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/pdf\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Про PDF\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>6 сентября 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Получаю жалобу: клиент не может войти на наш портал. Смотрю в базе — учетная запись в порядке. Что не так-то? Проверяю логин и вижу чудную картину:</p>\n<p><img alt=\"PDF\" src=\"https://kostyanetsky.ru/notes/pdf/pdf.png\"/></p>\n<p>Выше то, что вводит пользователь, а ниже — то, что в базе. Первая мысль: откуда, черт подери, в строке взялся документ? :D </p>\n<p>Опущу дальнейший разбор. Главное тут — задавать правильные вопросы (иначе и гугл, и ИИ будут рассуждать о популярном формате, а не о символе). Короче, PDF в контексте Юникода означает Pop Directional Formatting! Это символ, который управляет направлением текста; он нужен, например, чтобы корректно рендерить арабский язык (где может встречаться как текст слева направо, так и справа налево). Пользователь, очевидно, вводит логин в режиме RTL (или копирует откуда-то), а портал этого нюанса не понимает.</p>\n<p>В общем, дело на одну трубку. Однако хочу заметить: формат PDF появился задолго до символа PDF. Я понимаю, что это разные технические сферы и разработчики могли счесть пересечение терминологии несущественной проблемой. Но в глубине души я уверен: кто-то из них точно ехидно улыбался, предвидя сегодняшнюю путаницу.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "про pdf 6 сентября 2024 · работа получаю жалобу: клиент не может войти на наш портал. смотрю в базе — учетная запись в порядке. что не так-то? проверяю логин и вижу чудную картину: выше то, что вводит пользователь, а ниже — то, что в базе. первая мысль: откуда, черт подери, в строке взялся документ? :d опущу дальнейший разбор. главное тут — задавать правильные вопросы (иначе и гугл, и ии будут рассуждать о популярном формате, а не о символе). короче, pdf в контексте юникода означает pop directional formatting! это символ, который управляет направлением текста; он нужен, например, чтобы корректно рендерить арабский язык (где может встречаться как текст слева направо, так и справа налево). пользователь, очевидно, вводит логин в режиме rtl (или копирует откуда-то), а портал этого нюанса не понимает. в общем, дело на одну трубку. однако хочу заметить: формат pdf появился задолго до символа pdf. я понимаю, что это разные технические сферы и разработчики могли счесть пересечение терминологии несущественной проблемой. но в глубине души я уверен: кто-то из них точно ехидно улыбался, предвидя сегодняшнюю путаницу.",
    "tags": [
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/rapture\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Восторг\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>31 августа 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">PostgreSQL</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">3D</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Помню, в каком восторге я был, когда впервые поработал с оконными функциями в PostgreSQL. Можно построчно регулировать окошко вычислений для каждой строки! И на сегменты предварительно нарезать! И всё\n это — нативно, внутри самого обычного запроса, никаких пристроек справа и слева. Стандартная агрегация с группировкой и подзапросами, к которой я привык в 1С, резко превратилась в тыкву, совсем как карета Золушки в полночь.</p>\n<p>Последнее время осваиваю Blender и внезапно ощутил то же чувство по той же самой причине. То, что объект можно произвольно таскать по 3D Viewport через команду Move, было понятно ещё на берегу, ладно. Но когда до меня дошло, что каждый объект — это набор полигонов, и каждый из таких полигонов тоже можно произвольно таскать, и это приводит к естественному изменению геометрии объекта — вот тут-то меня и накрыло.</p>\n<p>Технологии удивительны. Учиться — клёво. Ради таких озарений хочется делать это ещё и ещё :)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "восторг 31 августа 2024 · 1с postgresql 3d помню, в каком восторге я был, когда впервые поработал с оконными функциями в postgresql. можно построчно регулировать окошко вычислений для каждой строки! и на сегменты предварительно нарезать! и всё это — нативно, внутри самого обычного запроса, никаких пристроек справа и слева. стандартная агрегация с группировкой и подзапросами, к которой я привык в 1с, резко превратилась в тыкву, совсем как карета золушки в полночь. последнее время осваиваю blender и внезапно ощутил то же чувство по той же самой причине. то, что объект можно произвольно таскать по 3d viewport через команду move, было понятно ещё на берегу, ладно. но когда до меня дошло, что каждый объект — это набор полигонов, и каждый из таких полигонов тоже можно произвольно таскать, и это приводит к естественному изменению геометрии объекта — вот тут-то меня и накрыло. технологии удивительны. учиться — клёво. ради таких озарений хочется делать это ещё и ещё :)",
    "tags": [
      "1c",
      "pgsql",
      "3d"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/nowhere-to-run\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Некуда бежать\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>31 августа 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Спорт</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Вчера решил отвлечься от работы и как следует побегать. Выбрался в местный парк, сделал несколько кругов. Сижу, перевожу дух, беру смартфон, чтобы переключить трек, а там — поздравление от фитнес-трекера.</p>\n<p><img alt=\"Ой, привет!\" src=\"https://kostyanetsky.ru/notes/nowhere-to-run/hi.jpg\"/></p>\n<p>Отвлекся, блин. Платформа следит за тобой, %username%!</p>\n<p>P.S. Зато теперь у меня есть кастомный значок с символикой любимой компании!</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "некуда бежать 31 августа 2024 · 1с спорт вчера решил отвлечься от работы и как следует побегать. выбрался в местный парк, сделал несколько кругов. сижу, перевожу дух, беру смартфон, чтобы переключить трек, а там — поздравление от фитнес-трекера. отвлекся, блин. платформа следит за тобой, %username%! p.s. зато теперь у меня есть кастомный значок с символикой любимой компании!",
    "tags": [
      "1c",
      "sport"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/system-analysis-course\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Анализ систем\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>25 августа 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Среди всех этих пет-проектов и августовских переживаний забыл упомянуть, что завершил <a href=\"https://tough-dev.school/system-analysis\" target=\"_blank\">курс</a> по анализу систем, о котором недавно <a href=\"https://kostyanetsky.ru/notes/ibrahim\" target=\"_blank\">писал</a>.</p>\n<p><img alt=\"Сертификат\" src=\"https://kostyanetsky.ru/notes/system-analysis-course/certificate.png\"/></p>\n<p>Курс был устроен так, что на протяжении всех занятий мы работали над одной и той же системой, выявляли проблемы и постепенно их решали. Перед первым уроком нам предложили спроектировать первую версию системы, чтобы потом, в конце курса, сравнить её с финальной версией и оценить прогресс. Так вот, сравнением я доволен — в том смысле, что на первую версию теперь без слез смотреть сложно :)</p>\n<p>Времени для рефлексии было в целом мало, так что буду дальше работать над материалами и растаскивать уроки на личные заметки. Это не так-то просто, так как у нас в компании много специфики связано с решениями на базе 1С:Предприятия, и масса моей работы крутится вокруг разной обвязки 1С-инстансов на решениях вне стека 1С. </p>\n<p>Однако 1С-инстансы, кажется, можно воспринимать как монолиты с определенным набором характеристик (в зависимости от решаемых внутри задач), а в остальном коммуникации с ними мало чем отличаются от традиционных решений: те же события (например, кролик), те же входящие/исходящие HTTP-вызовы, тот же показатель instability и так далее.</p>\n<p>На этом этапе я точно потащу (или уже потащил) к себе:</p>\n<ol>\n<li>Распил ТЗ на нумерованные пункты (US-XXX) и хранение их в одном месте с пометками «updated at», «canceled at» и так далее. Кажется, удачный формат.</li>\n<li>Ведение ADR. Собственно, это уже внедрил. Несколько смущает, правда, что в них периодически оседает что-то, что архитектурой в прямом смысле не является (например, принципы логирования событий на каком-то участке). Однако такие штуки тоже кажутся важными для принятия решений.</li>\n<li>Event Storming как способ визуализации бизнес-процессов. Не могу сказать, что он сильно выигрывает по сравнению с той сборной солянкой, которая до этого обычно оседала у нас, но результат выглядит симпатично и вообще: какой-то стандарт лучше, чем никакого.</li>\n<li>Диаграммы сервисов приложения с наклеенными стикерами, указывающими характеристики. Достаточно функционально, если надо взглянуть на проект с высоты птичьего полета и опять же не так сухо, как гигантские таблицы. То есть, если сработает bus factor — выше шанс, что следующий (или следующая) я заметит эти детали.</li>\n<li>Хочу делать BPMN-ки и Activity Diagrams. Формат мне нравится, но пока мои попытки оставляют желать лучшего. Буду пробовать ещё.</li>\n<li>Неожиданно зашел концепт разделения функционала для снижения зависимостей. Раньше казалось, что всегда проще склеить похожий функционал для снижения объёма кода, но это увеличивает и сложность, и внутреннюю связность — а значит, может сильно больше вредить, чем помогать.</li>\n</ol>\n<p>В целом курсом очень доволен. Лучшее вложение сил за последний год. Если думаете идти туда, но сомневаетесь — идите :)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "анализ систем 25 августа 2024 · готово тем временем среди всех этих пет-проектов и августовских переживаний забыл упомянуть, что завершил курс по анализу систем, о котором недавно писал . курс был устроен так, что на протяжении всех занятий мы работали над одной и той же системой, выявляли проблемы и постепенно их решали. перед первым уроком нам предложили спроектировать первую версию системы, чтобы потом, в конце курса, сравнить её с финальной версией и оценить прогресс. так вот, сравнением я доволен — в том смысле, что на первую версию теперь без слез смотреть сложно :) времени для рефлексии было в целом мало, так что буду дальше работать над материалами и растаскивать уроки на личные заметки. это не так-то просто, так как у нас в компании много специфики связано с решениями на базе 1с:предприятия, и масса моей работы крутится вокруг разной обвязки 1с-инстансов на решениях вне стека 1с. однако 1с-инстансы, кажется, можно воспринимать как монолиты с определенным набором характеристик (в зависимости от решаемых внутри задач), а в остальном коммуникации с ними мало чем отличаются от традиционных решений: те же события (например, кролик), те же входящие/исходящие http-вызовы, тот же показатель instability и так далее. на этом этапе я точно потащу (или уже потащил) к себе: распил тз на нумерованные пункты (us-xxx) и хранение их в одном месте с пометками «updated at», «canceled at» и так далее. кажется, удачный формат. ведение adr. собственно, это уже внедрил. несколько смущает, правда, что в них периодически оседает что-то, что архитектурой в прямом смысле не является (например, принципы логирования событий на каком-то участке). однако такие штуки тоже кажутся важными для принятия решений. event storming как способ визуализации бизнес-процессов. не могу сказать, что он сильно выигрывает по сравнению с той сборной солянкой, которая до этого обычно оседала у нас, но результат выглядит симпатично и вообще: какой-то стандарт лучше, чем никакого. диаграммы сервисов приложения с наклеенными стикерами, указывающими характеристики. достаточно функционально, если надо взглянуть на проект с высоты птичьего полета и опять же не так сухо, как гигантские таблицы. то есть, если сработает bus factor — выше шанс, что следующий (или следующая) я заметит эти детали. хочу делать bpmn-ки и activity diagrams. формат мне нравится, но пока мои попытки оставляют желать лучшего. буду пробовать ещё. неожиданно зашел концепт разделения функционала для снижения зависимостей. раньше казалось, что всегда проще склеить похожий функционал для снижения объёма кода, но это увеличивает и сложность, и внутреннюю связность — а значит, может сильно больше вредить, чем помогать. в целом курсом очень доволен. лучшее вложение сил за последний год. если думаете идти туда, но сомневаетесь — идите :)",
    "tags": [
      "done",
      "meanwhile"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/first-pancake\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Мой первый подход к генеративкам\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>25 августа 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">ИИ</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Понадобилось по-быстрому наделать картинок для одного пет-проекта. Развернул первое, что под руку попалось — <a href=\"https://huggingface.co/hakurei/waifu-diffusion\" target=\"_blank\">WaifuDiffusion</a> (это такой клон <a href=\"https://huggingface.co/stabilityai/stable-diffusion-3-medium\" target=\"_blank\">StableDiffusion</a>, но обученный на аниме и манге).</p>\n<p>Запрос: </p>\n<blockquote>\n<p>A dimly lit, empty classroom with faintly visible music notes on the chalkboard. A young woman with long blue hair and blue eyes, is standing behind the teacher's desk, packing her things into a small handbag. She looks tired and worried.</p>\n</blockquote>\n<p>Результат:</p>\n<p><img alt=\"Молодая женщина\" src=\"https://kostyanetsky.ru/notes/first-pancake/young-woman.jpg\"/></p>\n<p>Кажется, это отличный повод поговорить о том, как далеко вперед шагнули нейросети! Модель с порога раскусила задумку и предложила ввести в сюжет... Хм... Мудрого бородача? Или, возможно, намекнула, что я должен больше ценить неожиданные сюрпризы?</p>\n<p>Думаю, WaifuDiffusion просто решила поднять мне настроение. Смех, говорят, продлевает жизнь. В любом случае, первую генерацию считаю успешной! Но над калибровкой явно придется поработать еще :)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "мой первый подход к генеративкам 25 августа 2024 · ии понадобилось по-быстрому наделать картинок для одного пет-проекта. развернул первое, что под руку попалось — waifudiffusion (это такой клон stablediffusion , но обученный на аниме и манге). запрос: a dimly lit, empty classroom with faintly visible music notes on the chalkboard. a young woman with long blue hair and blue eyes, is standing behind the teacher's desk, packing her things into a small handbag. she looks tired and worried. результат: кажется, это отличный повод поговорить о том, как далеко вперед шагнули нейросети! модель с порога раскусила задумку и предложила ввести в сюжет... хм... мудрого бородача? или, возможно, намекнула, что я должен больше ценить неожиданные сюрпризы? думаю, waifudiffusion просто решила поднять мне настроение. смех, говорят, продлевает жизнь. в любом случае, первую генерацию считаю успешной! но над калибровкой явно придется поработать еще :)",
    "tags": [
      "ai"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/obsidian-day-switcher\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Переключалка дней для Obsidian\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>17 августа 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Obsidian</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Javascript</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Когда активно работаешь в ежедневных заметках Obsidian'а, часто хочется сунуть нос в заметку за вчера или, наоборот, на завтра. Например, когда сортируешь сегодняшние задачи и хочешь отложить часть на завтра.</p>\n<p>Каждый раз набирать нужную дату мне лень, поэтому я написал под это <a href=\"https://gist.github.com/vkostyanetsky/6c70f00b817157f9b6e62ee89bade853\" target=\"_blank\">скрипт</a>. Берет дату заметки из её названия (ожидает, что она в формате <abbr title=\"2024-08-17, например.\">ISO 8601</abbr>) и рисует выноску со ссылками на вчера и завтра для неё. В заголовке выводит день недели для дополнительного удобства:</p>\n<p><img alt=\"Пример\" src=\"https://kostyanetsky.ru/notes/obsidian-day-switcher/callout.jpg\"/></p>\n<p>Скрипт написан для плагина <a href=\"https://github.com/blacksmithgu/obsidian-dataview\" target=\"_blank\">Dataview</a>, потому что я его и так использую для других задач. Можно легко переделать его для <a href=\"https://github.com/SilentVoid13/Templater\" target=\"_blank\">Templater</a>, <a href=\"https://github.com/saml-dev/obsidian-custom-js\" target=\"_blank\">CustomJS</a> или отдельный плагин накидать (мне, опять-таки, было лень возиться). </p>\n<p>Если будете использовать: </p>\n<ol>\n<li>В функции noteLink() пропишите путь к вашей папке с ежедневными заметками (сейчас в ней папка Days для примера; путь, если забыли, указан в настройке Daily notes/New file location);</li>\n<li>Закиньте скрипт в шаблон ежедневной заметки (настройка Daily notes/Template file location).</li>\n</ol>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "переключалка дней для obsidian 17 августа 2024 · obsidian javascript когда активно работаешь в ежедневных заметках obsidian'а, часто хочется сунуть нос в заметку за вчера или, наоборот, на завтра. например, когда сортируешь сегодняшние задачи и хочешь отложить часть на завтра. каждый раз набирать нужную дату мне лень, поэтому я написал под это скрипт . берет дату заметки из её названия (ожидает, что она в формате iso 8601 ) и рисует выноску со ссылками на вчера и завтра для неё. в заголовке выводит день недели для дополнительного удобства: скрипт написан для плагина dataview , потому что я его и так использую для других задач. можно легко переделать его для templater , customjs или отдельный плагин накидать (мне, опять-таки, было лень возиться). если будете использовать: в функции notelink() пропишите путь к вашей папке с ежедневными заметками (сейчас в ней папка days для примера; путь, если забыли, указан в настройке daily notes/new file location); закиньте скрипт в шаблон ежедневной заметки (настройка daily notes/template file location).",
    "tags": [
      "obsidian",
      "javascript"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/clementine\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Клементина запомнит это\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>9 августа 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">ИИ</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Когда ChatGPT запоминает какую-то деталь диалога на будущее, он рисует над своим ответом плашку \"Memory updated\". Типа, я понял:</p>\n<p><img alt=\"Memory updated\" src=\"https://kostyanetsky.ru/notes/clementine/memory-updated.jpg\"/></p>\n<p>Каждый раз смешно: сразу вспоминается <a href=\"https://store.steampowered.com/app/207610/The_Walking_Dead/\" target=\"_blank\">The Walking Dead</a> и мем «Клементина запомнит это» :) В этой игре персонажи, окружающие протагониста, запоминали его решения и это оказывало влияние на их поведение. В том числе и Клементина — девочка, которую главный герой спасает в начале игры.</p>\n<p><img alt=\"Клементина запомнит это\" src=\"https://kostyanetsky.ru/notes/clementine/remember.jpeg\"/></p>\n<p>В игре эта механика была сделана, если честно, так себе, а вот ChatGPT и правда все запоминает. Внимание к деталям такое, что иногда приходится напоминать себе, что разговариваешь с языковой моделью, а не с необыкновенно участливым и очень эрудированным человеком.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "клементина запомнит это 9 августа 2024 · ии видеоигры когда chatgpt запоминает какую-то деталь диалога на будущее, он рисует над своим ответом плашку \"memory updated\". типа, я понял: каждый раз смешно: сразу вспоминается the walking dead и мем «клементина запомнит это» :) в этой игре персонажи, окружающие протагониста, запоминали его решения и это оказывало влияние на их поведение. в том числе и клементина — девочка, которую главный герой спасает в начале игры. в игре эта механика была сделана, если честно, так себе, а вот chatgpt и правда все запоминает. внимание к деталям такое, что иногда приходится напоминать себе, что разговариваешь с языковой моделью, а не с необыкновенно участливым и очень эрудированным человеком.",
    "tags": [
      "ai",
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/make-my-window-a-door\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Сделать окно дверью\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>4 августа 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">English</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Вчера во время прогулки слушал <a href=\"https://music.yandex.ru/album/13443698/track/24134841\" target=\"_blank\">Be Somebody</a> от Thousand Foot Krutch и неожиданно зацепился за фразу «you made my window a door». Мне эта идиома всегда казалась забавной: блин, врезать дверь вместо окна — это как-то небезопасно звучит. Можно выпасть с десятого этажа, например. </p>\n<p>Но песня-то чудесная и совсем не про то! Стало любопытно; пошел копаться, какой смысл вкладывают носители языка. </p>\n<p>Оказалось, это про две разные позиции: пассивный наблюдатель и активный участник. То есть, если перед тобой окно — ты лишь смотришь сквозь него на что-то или кого-то. А вот дверь можно открыть и что-то сделать. Так что «when I could only see the floor you made my window a door» — это по смыслу что-то вроде «когда мои руки опустились, ты помогла мне встать».</p>\n<p>Кстати, есть ещё одна похожая идиома — «to be a better window than a door». Абстракция здесь та же: если какой-то человек похож на окно, а не на дверь — он никогда не подпускает окружающих близко к себе, делая пассивных наблюдателей даже из очень близких ему людей.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "сделать окно дверью 4 августа 2024 · english вчера во время прогулки слушал be somebody от thousand foot krutch и неожиданно зацепился за фразу «you made my window a door». мне эта идиома всегда казалась забавной: блин, врезать дверь вместо окна — это как-то небезопасно звучит. можно выпасть с десятого этажа, например. но песня-то чудесная и совсем не про то! стало любопытно; пошел копаться, какой смысл вкладывают носители языка. оказалось, это про две разные позиции: пассивный наблюдатель и активный участник. то есть, если перед тобой окно — ты лишь смотришь сквозь него на что-то или кого-то. а вот дверь можно открыть и что-то сделать. так что «when i could only see the floor you made my window a door» — это по смыслу что-то вроде «когда мои руки опустились, ты помогла мне встать». кстати, есть ещё одна похожая идиома — «to be a better window than a door». абстракция здесь та же: если какой-то человек похож на окно, а не на дверь — он никогда не подпускает окружающих близко к себе, делая пассивных наблюдателей даже из очень близких ему людей.",
    "tags": [
      "english"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/yaga\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Яга\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>29 июля 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Случайно вспомнил, что полгода назад кто-то из коллег закинул в рабочий чат ссылку на <a href=\"https://yaga.rt.ru\" target=\"_blank\">Ягу</a> — будущего (наверное) конкурента JIRA в России. Разработкой, судя по URL, занимаются ребята из Ростелекома. Проснулось любопытство  — как оно там, взлетело?</p>\n<p>Увы, но похоже, что нет. По крайней мере, на лендинге висит стандартное «оставьте заявку и ждите ответного гудка». Доступна урезанная версия для команд поменбше, но я сейчас не в России, и клик по кнопке «Начать пользоваться» приводит к бану. Ладно, как-нибудь в следующий раз.</p>\n<p>Нейминг, конечно, у ребят кликбейтный. Но не уверен, что прям удачный. Например, название «1С», может, и провоцирует натужные шутки (один эс! задница Одина! хахаха!), но если ты гуглишь его — то, скорее, находишь инфу про платформу или хотя бы вендора. А не кучу статей, фанфиков, фанарта и видеоигр, как в случае с Ягой.</p>\n<p>И вообще, ассоциации какие-то не те лезут. Избушка на курьих ножках? Выглядит как изначально <a href=\"https://kostyanetsky.ru/notes/evolution\" target=\"_blank\">плохо спроектированное</a> приложение, которое кое-как переделали прямо на проде. Ступа? Костыль? Блин, если смотреть с точки зрения программистов — тут не красные флаги, а алые знамена :)</p>\n<p>Ну и я еще, наверное, испорченный, но при слове «Яга» у меня в голове первым делом всплывает не могущественная ведьма из славянского фольклора, а <a href=\"https://ru.wikipedia.org/wiki/Jaguar_(напиток)\" target=\"_blank\">отвратительное пойло</a> из двухтысячных.</p>\n<blockquote>\n<p>И вот баба с ягой уже не быдло, а патриотичная программистка!</p>\n<p>― коллега</p>\n</blockquote>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "яга 29 июля 2024 · тем временем 1с случайно вспомнил, что полгода назад кто-то из коллег закинул в рабочий чат ссылку на ягу — будущего (наверное) конкурента jira в россии. разработкой, судя по url, занимаются ребята из ростелекома. проснулось любопытство — как оно там, взлетело? увы, но похоже, что нет. по крайней мере, на лендинге висит стандартное «оставьте заявку и ждите ответного гудка». доступна урезанная версия для команд поменбше, но я сейчас не в россии, и клик по кнопке «начать пользоваться» приводит к бану. ладно, как-нибудь в следующий раз. нейминг, конечно, у ребят кликбейтный. но не уверен, что прям удачный. например, название «1с», может, и провоцирует натужные шутки (один эс! задница одина! хахаха!), но если ты гуглишь его — то, скорее, находишь инфу про платформу или хотя бы вендора. а не кучу статей, фанфиков, фанарта и видеоигр, как в случае с ягой. и вообще, ассоциации какие-то не те лезут. избушка на курьих ножках? выглядит как изначально плохо спроектированное приложение, которое кое-как переделали прямо на проде. ступа? костыль? блин, если смотреть с точки зрения программистов — тут не красные флаги, а алые знамена :) ну и я еще, наверное, испорченный, но при слове «яга» у меня в голове первым делом всплывает не могущественная ведьма из славянского фольклора, а отвратительное пойло из двухтысячных. и вот баба с ягой уже не быдло, а патриотичная программистка! ― коллега",
    "tags": [
      "meanwhile",
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/ibrahim\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Ибрагим\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>7 июля 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Закатился в <a href=\"https://tough-dev.school/system-analysis\" target=\"_blank\">курс по анализу систем</a>, который проводят ребята из \"Школы сильных программистов\". Цели у меня две:</p>\n<ol>\n<li>Во-первых, надо откалиброваться. Много бодаюсь с полдюжиной технических стеков, у которых разный тулсет и понятия о прекрасном. Это, конечно, здорово развивает, но искажает перспективу: меня тянет решать очередную проблему со всяких второстепенных технических штук просто потому, что я это хорошо умею. Между тем, если посмотреть на задачу чуть сверху, подумать и порисовать диаграммы — получается более удачное или, хотя бы, более осмысленное решение. Хочу убедить себя делать так почаще.</li>\n<li>Во-вторых, надо научиться писать внятную документацию для разработчиков. На практике до нее редко доходят руки, а когда доходят — не успеваю поддерживать её в актуальном состоянии. Короче, времени мало, и хочется по крайней мере делать доку как-то так, чтобы читатель живее хватался за мысль.</li>\n</ol>\n<p>Сам курс сделан в виде итераций: каждую неделю тебе рассказывают про один и тот же проект, который пытается спроектировать главный герой истории, Ибрагим (это он на лендинге по ссылке выше). Каждую неделю проблем с этим проектом все больше и решения, которые выдумывает Ибрагим, становятся все заковыристее. </p>\n<p>Кроме этого, студентам регулярно выдают \"домашнюю работу\" — другой проект с похожими проблемами. Его нужно проанализировать и спроектировать по-человечески — снова и снова, учитывая новые знания и ограничения, полученные за неделю.</p>\n<p>Пока здорово заходит. Главная проблема — нехватка времени: читаю я сравнительно медленно и стараюсь конспектировать самые интересные или просто сложные места. Между тем, материалов в курсе очень много и все интересные, даже если считать только основную часть.</p>\n<p>А переходишь к дополнительным ссылкам — вообще хоть святых выноси. Нужно полгода, не меньше. Я старался читать их хотя бы по диагонали, но это оказалось чертовски плохой идеей: кончилось тем, что главный герой курса начал мне мерещиться в уличной рекламе :)</p>\n<p><img alt=\"Ибрагим\" src=\"https://kostyanetsky.ru/notes/ibrahim/ibrahim.jpg\"/></p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "ибрагим 7 июля 2024 · тем временем закатился в курс по анализу систем , который проводят ребята из \"школы сильных программистов\". цели у меня две: во-первых, надо откалиброваться. много бодаюсь с полдюжиной технических стеков, у которых разный тулсет и понятия о прекрасном. это, конечно, здорово развивает, но искажает перспективу: меня тянет решать очередную проблему со всяких второстепенных технических штук просто потому, что я это хорошо умею. между тем, если посмотреть на задачу чуть сверху, подумать и порисовать диаграммы — получается более удачное или, хотя бы, более осмысленное решение. хочу убедить себя делать так почаще. во-вторых, надо научиться писать внятную документацию для разработчиков. на практике до нее редко доходят руки, а когда доходят — не успеваю поддерживать её в актуальном состоянии. короче, времени мало, и хочется по крайней мере делать доку как-то так, чтобы читатель живее хватался за мысль. сам курс сделан в виде итераций: каждую неделю тебе рассказывают про один и тот же проект, который пытается спроектировать главный герой истории, ибрагим (это он на лендинге по ссылке выше). каждую неделю проблем с этим проектом все больше и решения, которые выдумывает ибрагим, становятся все заковыристее. кроме этого, студентам регулярно выдают \"домашнюю работу\" — другой проект с похожими проблемами. его нужно проанализировать и спроектировать по-человечески — снова и снова, учитывая новые знания и ограничения, полученные за неделю. пока здорово заходит. главная проблема — нехватка времени: читаю я сравнительно медленно и стараюсь конспектировать самые интересные или просто сложные места. между тем, материалов в курсе очень много и все интересные, даже если считать только основную часть. а переходишь к дополнительным ссылкам — вообще хоть святых выноси. нужно полгода, не меньше. я старался читать их хотя бы по диагонали, но это оказалось чертовски плохой идеей: кончилось тем, что главный герой курса начал мне мерещиться в уличной рекламе :)",
    "tags": [
      "meanwhile"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/singapore-doll\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Сингапурская кукла\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>22 июня 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Можно ли любить валюту своей страны сильнее, чем жители Саудовской Аравии? Вопрос риторический: уверен, что нет.</p>\n<p>Разглядываю <a href=\"https://www.sama.gov.sa/en-US/FinExc/Pages/Currency.aspx\" target=\"_blank\">сайт</a> их центрального банка. Валюта страны — саудовский риал, и курсы других валют ЦБ устанавливает по отношению к ней. То есть, нет смысла спрашивать с банка курс самого риала. Однако сайт невозмутимо предлагает выбрать его дважды:</p>\n<p><img alt=\"Форма выбора\" src=\"https://kostyanetsky.ru/notes/singapore-doll/cb.png\"/></p>\n<p>Для справки: первый вариант ломает интерфейс, а второй педантично выдает единицу на любую дату.</p>\n<p>Другая забавная деталь: коллеги, кажется, хранят названия валют как строки длиной в 14 символов. Иначе сложно объяснить, почему по их данным в Канаде используется не канадский доллар, а CANADIAN DOLLA, а в Румынии — загадочный NEW ROMANIAN L вместо леи. Впрочем, этим двоим ещё повезло: Сингапур, например, ведёт расчёты в SINGAPORE DOLL.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "сингапурская кукла 22 июня 2024 · работа можно ли любить валюту своей страны сильнее, чем жители саудовской аравии? вопрос риторический: уверен, что нет. разглядываю сайт их центрального банка. валюта страны — саудовский риал, и курсы других валют цб устанавливает по отношению к ней. то есть, нет смысла спрашивать с банка курс самого риала. однако сайт невозмутимо предлагает выбрать его дважды: для справки: первый вариант ломает интерфейс, а второй педантично выдает единицу на любую дату. другая забавная деталь: коллеги, кажется, хранят названия валют как строки длиной в 14 символов. иначе сложно объяснить, почему по их данным в канаде используется не канадский доллар, а canadian dolla, а в румынии — загадочный new romanian l вместо леи. впрочем, этим двоим ещё повезло: сингапур, например, ведёт расчёты в singapore doll.",
    "tags": [
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/data-history-duplication\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Не уникальные метаданные\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>8 июня 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">PostgreSQL</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">MS SQL</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>В очередной раз столкнулся с противным багом, при котором платформа ломает таблицу с метаданными истории данных. </p>\n<p>Внешне он выглядит так: вы обновляете конфигурацию базы, и при попытке реструктуризации выскакивает ошибка \"Таблица метаданных истории данных cодержит не уникальные записи, которые должны быть удалены\". </p>\n<p>При этом платформа не предлагает никакого понятного способа найти такие записи — иди туда, не знаю куда, сделай то, не знаю что.   </p>\n<p><img alt=\"Таблица метаданных истории данных cодержит не уникальные записи, которые должны быть удалены\" src=\"https://kostyanetsky.ru/notes/data-history-duplication/error.png\"/></p>\n<p>Проблему можно решить, порывшись в базе данных. Таблица, на которую ссылается ошибка — _DataHistoryMetadata. В ней лежат версии метаданных каждого объекта, для которого ведётся история. Это позволяет платформе понимать, какие реквизиты были у объекта на любой момент времени, в течении которого для объекта велась история.</p>\n<p>Как это работает? Ну, когда меняется состав реквизитов объекта (например, реквизит в справочнике добавили), платформа запоминает его метаданные: конкретно, добавляет в _DataHistoryMetadata новую запись и сохраняет в ней актуальный список реквизитов объекта, а также номер версии этого списка (например, в при включении истории для объекта сохраняется первая версия метаданных, при добавлении какого-нибудь реквизита — вторая и так далее).</p>\n<p>Ещё платформа ставит в созданной записи отметку, что именно эта версия объекта — самая актуальная, после чего снимает этот флаг с той версии, которая была помечена актуальной до этого.</p>\n<p>Так вот, проблема в том, что платформа иногда забывает сделать последний шаг и в таблице появляется сразу две версии, помеченные как актуальные. Конфигуратор понимает это, но сделать ничего не может.</p>\n<p><img alt=\"Как помочь больной скотине?\" src=\"https://kostyanetsky.ru/notes/data-history-duplication/howto.jpeg\"/></p>\n<p>Решение вытекает из алгоритма выше: нужно найти конфликтующие версии и отобрать признак актуальности у той, что старше. Лучше использовать запросы: историю данных включают, как правило, для кучи объектов и состав реквизитов у них постоянно меняется — в общем, версий в таблице будет столько, что черт ногу сломит.</p>\n<p>Если вы тоже столкнулись с этой проблемой и поэтому читаете этот текст — можете воспользоваться <a href=\"https://gist.github.com/vkostyanetsky/6496c67e2b2fd3d064c4cafd16da0b79\" target=\"_blank\">запросами</a>, что написал я:</p>\n<ol>\n<li>get-issues.sql проверяет, что проблема есть: ищет версии метаданных, которые одновременно помечены как актуальные.</li>\n<li>fix-issues.sql снимает признак актуальности с тех версий, которые на самом деле устарели.</li>\n</ol>\n<p>Оба запроса написаны для Microsoft SQL Server. Если вы используете PostgreSQL, то <a href=\"https://gist.github.com/vkostyanetsky/75665ce04247e900743604eb386d1889\" target=\"_blank\">вот они же</a> для этой СУБД.</p>\n<p>Запросы потребуют небольшой адаптации под конкретную базу: в них используется поле _fld626, в котором хранится разделитель данных. В вашей таблице _DataHistoryMetadata это поле может называться иначе, поэтому нужно обновить его имя на актуальное. Ошибиться будет трудно — у таблицы только одно поле с префиксом _fld.</p>\n<p>P.S. Напоминаю, что лицензионное соглашение запрещает ковыряться в базе данных в обход средств платформы, так что на такие эксперименты можно идти, только если других вариантов не осталось.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "не уникальные метаданные 8 июня 2024 · 1с postgresql ms sql в очередной раз столкнулся с противным багом, при котором платформа ломает таблицу с метаданными истории данных. внешне он выглядит так: вы обновляете конфигурацию базы, и при попытке реструктуризации выскакивает ошибка \"таблица метаданных истории данных cодержит не уникальные записи, которые должны быть удалены\". при этом платформа не предлагает никакого понятного способа найти такие записи — иди туда, не знаю куда, сделай то, не знаю что. проблему можно решить, порывшись в базе данных. таблица, на которую ссылается ошибка — _datahistorymetadata. в ней лежат версии метаданных каждого объекта, для которого ведётся история. это позволяет платформе понимать, какие реквизиты были у объекта на любой момент времени, в течении которого для объекта велась история. как это работает? ну, когда меняется состав реквизитов объекта (например, реквизит в справочнике добавили), платформа запоминает его метаданные: конкретно, добавляет в _datahistorymetadata новую запись и сохраняет в ней актуальный список реквизитов объекта, а также номер версии этого списка (например, в при включении истории для объекта сохраняется первая версия метаданных, при добавлении какого-нибудь реквизита — вторая и так далее). ещё платформа ставит в созданной записи отметку, что именно эта версия объекта — самая актуальная, после чего снимает этот флаг с той версии, которая была помечена актуальной до этого. так вот, проблема в том, что платформа иногда забывает сделать последний шаг и в таблице появляется сразу две версии, помеченные как актуальные. конфигуратор понимает это, но сделать ничего не может. решение вытекает из алгоритма выше: нужно найти конфликтующие версии и отобрать признак актуальности у той, что старше. лучше использовать запросы: историю данных включают, как правило, для кучи объектов и состав реквизитов у них постоянно меняется — в общем, версий в таблице будет столько, что черт ногу сломит. если вы тоже столкнулись с этой проблемой и поэтому читаете этот текст — можете воспользоваться запросами , что написал я: get-issues.sql проверяет, что проблема есть: ищет версии метаданных, которые одновременно помечены как актуальные. fix-issues.sql снимает признак актуальности с тех версий, которые на самом деле устарели. оба запроса написаны для microsoft sql server. если вы используете postgresql, то вот они же для этой субд. запросы потребуют небольшой адаптации под конкретную базу: в них используется поле _fld626, в котором хранится разделитель данных. в вашей таблице _datahistorymetadata это поле может называться иначе, поэтому нужно обновить его имя на актуальное. ошибиться будет трудно — у таблицы только одно поле с префиксом _fld. p.s. напоминаю, что лицензионное соглашение запрещает ковыряться в базе данных в обход средств платформы, так что на такие эксперименты можно идти, только если других вариантов не осталось.",
    "tags": [
      "1c",
      "pgsql",
      "mssql"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/uuid-main-issue\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Главная проблема UUID\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>2 июня 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">PostgreSQL</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Наткнулся на <a href=\"https://www.cybertec-postgresql.com/en/unexpected-downsides-of-uuid-keys-in-postgresql/\" target=\"_blank\">хороший текст</a> об основной проблеме, которую таскает с собой UUID. Для 1С она тоже актуальна: все ссылочные объекты платформы (элементы справочников, документы и так далее) имеют собственные UUID. Они хранятся в БД, активно используются при поиске и, понятно, обильно индексируются (со всеми вытекающими последствиями). </p>\n<p>1С старается компенсировать проблему, создавая последовательные UUID. Пусть не идеально, но в целом эта штука работает и индексы получаются более-менее ровными. Да и вообще в сообществе об этом говорят довольно давно: вот, например, бородатый <a href=\"https://forum.mista.ru/topic.php?id=801986\" target=\"_blank\">топик на Мисте</a> (правда, тут диалог быстро перерос в курятник и из шести десятков комментариев от силы полтора — по делу).</p>\n<p>P.S. Рассмешила ремарка про вероятность создать в одной базе два одинаковых UUID:</p>\n<blockquote>\n<p>As an aside, for those worried about collisions: you should take up the lottery, since winning the jackpot twice in a row is a much more likely outcome than your system ever generating two identical random 128 bit numbers.</p>\n</blockquote>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "главная проблема uuid 2 июня 2024 · 1с postgresql наткнулся на хороший текст об основной проблеме, которую таскает с собой uuid. для 1с она тоже актуальна: все ссылочные объекты платформы (элементы справочников, документы и так далее) имеют собственные uuid. они хранятся в бд, активно используются при поиске и, понятно, обильно индексируются (со всеми вытекающими последствиями). 1с старается компенсировать проблему, создавая последовательные uuid. пусть не идеально, но в целом эта штука работает и индексы получаются более-менее ровными. да и вообще в сообществе об этом говорят довольно давно: вот, например, бородатый топик на мисте (правда, тут диалог быстро перерос в курятник и из шести десятков комментариев от силы полтора — по делу). p.s. рассмешила ремарка про вероятность создать в одной базе два одинаковых uuid: as an aside, for those worried about collisions: you should take up the lottery, since winning the jackpot twice in a row is a much more likely outcome than your system ever generating two identical random 128 bit numbers.",
    "tags": [
      "1c",
      "pgsql"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/last-resort\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Скриншот со звуком\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>20 мая 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Недавно в компании родилась идея разделить внутреннюю ERP-шку на несколько независимых частей и организовать между ними обмен данными. Мы обсудили контуры задачи, модель обмена, транспорт, примерно подбились по срокам — в общем, привычная рутина.</p>\n<p>Создал под весь этот огород задачу. Названия им мы даем на английском языке, так что вписал первую формулировку, которая пришла в голову.</p>\n<p><img alt=\"Cut My Life Into Pieces\" src=\"https://kostyanetsky.ru/notes/last-resort/last-resort.png\"/></p>\n<p>Заголовок вышел со звуком. Ладно, думаю, смешно, но как тогда назвать? Во, пусть будет Distributed Internal ERP. Сокращенно... DIE?</p>\n<p>Оставил первый вариант. Long live Papa Roach :)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "скриншот со звуком 20 мая 2024 · работа тем временем недавно в компании родилась идея разделить внутреннюю erp-шку на несколько независимых частей и организовать между ними обмен данными. мы обсудили контуры задачи, модель обмена, транспорт, примерно подбились по срокам — в общем, привычная рутина. создал под весь этот огород задачу. названия им мы даем на английском языке, так что вписал первую формулировку, которая пришла в голову. заголовок вышел со звуком. ладно, думаю, смешно, но как тогда назвать? во, пусть будет distributed internal erp. сокращенно... die? оставил первый вариант. long live papa roach :)",
    "tags": [
      "work",
      "meanwhile"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/obsidian-timesheet\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Таймшит для Обсидиана\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>12 мая 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Typescript</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Obsidian</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Написал ещё один плагин к <a href=\"https://obsidian.md\" target=\"_blank\">Obsidian</a>, на этот раз — для <a href=\"https://help.obsidian.md/Plugins/Daily+notes\" target=\"_blank\">ежедневных заметок</a>. Рисует симпатичный отчет: над какими задачами работал, что сделал, сколько времени потратил. Я постарался описать в <a href=\"https://github.com/vkostyanetsky/ObsidianTimesheet\" target=\"_blank\">репозитории</a>, как это работает; буду рад, если кому-то ещё пригодится!</p>\n<p>Забавный момент: для примеров в README я использовал номера задач FBI-1, FBI-2 и так далее. Это не отсылка к X-Files или Twin Peaks — просто первое, что пришло мне в голову. Дело в том, что наш внутренний проект по разработке FirstBit ERP называется First Bit Internal, сокращенно — FBI. Основной пул задач, над которыми мы работаем, живёт именно в нём.</p>\n<p>Мы-то уже привыкли, но коллег вне компании наши скриншоты из JIRA или SonarQube неизменно веселят. Представили, что вы — агент Купер? А мне и представлять не надо :)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "таймшит для обсидиана 12 мая 2024 · готово typescript obsidian работа написал ещё один плагин к obsidian , на этот раз — для ежедневных заметок . рисует симпатичный отчет: над какими задачами работал, что сделал, сколько времени потратил. я постарался описать в репозитории , как это работает; буду рад, если кому-то ещё пригодится! забавный момент: для примеров в readme я использовал номера задач fbi-1, fbi-2 и так далее. это не отсылка к x-files или twin peaks — просто первое, что пришло мне в голову. дело в том, что наш внутренний проект по разработке firstbit erp называется first bit internal, сокращенно — fbi. основной пул задач, над которыми мы работаем, живёт именно в нём. мы-то уже привыкли, но коллег вне компании наши скриншоты из jira или sonarqube неизменно веселят. представили, что вы — агент купер? а мне и представлять не надо :)",
    "tags": [
      "done",
      "typescript",
      "obsidian",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/payment-terms\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Запросом больше, запросом меньше\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>5 мая 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Оптимизация</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Регулярно слышу тейк: запросом больше, запросом меньше — без разницы. Мол, главное, чтобы запрос был дешевым: не читал лишнего, попадал в индекс и так далее.</p>\n<p>Эта точка зрения имеет право на жизнь, однако бездумно пулеметить запросами — опасная затея. Даже если в моменте все выглядит хорошо, в будущем система может слегка поменяться. А потом внешне безобидный патч положит вам прод в пятницу.</p>\n<p>Пример из недавней практики. Есть ERP, в которой лежит таблица с этапами оплаты по заказам клиентов. Один из таких этапов — предоплата; пока она не внесена, создать заказ поставщику нельзя. </p>\n<p>Технически в заказе поставщику просто хранится ID заказа клиента; если последний заполнен (то есть, заказ поставщику создан под заказ клиента), ERP нужно прочитать этапы оплаты по заказу клиента и понять, можно ли делать закупку. </p>\n<p>Звучит элементарно, однако мониторинг показывает: операция тормозит и жрет память, будто в последний раз. Лезем разбираться. Видим примерно такую картинку:</p>\n<p><img alt=\"825701 записей\" src=\"https://kostyanetsky.ru/notes/payment-terms/payment-terms.png\"/></p>\n<p>То есть вместо того, чтобы выдернуть два-три этапа оплаты по заказу, ERP читает без малого миллион! Как так? </p>\n<p>Опуская детали: проблема рождалась в тех заказах поставщику, которые вообще не были связаны с заказом клиента. Разработчик посчитал, что для них можно не менять логику: ID заказа клиента пустой и запрос не найдет для него этапов оплаты. А значит, получится тот же результат, как если бы запроса вообще не было. А лишний запрос — ну... Запросом больше, запросом меньше... Тоже мне, большое дело.</p>\n<p>Оказалось, большое. В таблице этапов оплаты оказались данные не только для заказов клиентов, но и для других видов документов. Поле с ID заказа клиента у них было пустым. В итоге ERP при попытке найти этапы оплаты по пустому ID заказа клиента находила такие записи — и, как видите, немало.</p>\n<p>Запрос читал порядка гигабайта данных и помещал во временную таблицу. Гигабайт прочитали, гигабайт записали... История била и по диску, и по буферному кэшу СУБД, и по другим частям системы (вплоть до сети, которой этот гигабайт приходилось гонять туда-сюда без всякой пользы).</p>\n<p>В общем, знаете, что я думаю? Если результат запроса известен — наверное, его все-таки не нужно делать.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "запросом больше, запросом меньше 5 мая 2024 · 1с оптимизация регулярно слышу тейк: запросом больше, запросом меньше — без разницы. мол, главное, чтобы запрос был дешевым: не читал лишнего, попадал в индекс и так далее. эта точка зрения имеет право на жизнь, однако бездумно пулеметить запросами — опасная затея. даже если в моменте все выглядит хорошо, в будущем система может слегка поменяться. а потом внешне безобидный патч положит вам прод в пятницу. пример из недавней практики. есть erp, в которой лежит таблица с этапами оплаты по заказам клиентов. один из таких этапов — предоплата; пока она не внесена, создать заказ поставщику нельзя. технически в заказе поставщику просто хранится id заказа клиента; если последний заполнен (то есть, заказ поставщику создан под заказ клиента), erp нужно прочитать этапы оплаты по заказу клиента и понять, можно ли делать закупку. звучит элементарно, однако мониторинг показывает: операция тормозит и жрет память, будто в последний раз. лезем разбираться. видим примерно такую картинку: то есть вместо того, чтобы выдернуть два-три этапа оплаты по заказу, erp читает без малого миллион! как так? опуская детали: проблема рождалась в тех заказах поставщику, которые вообще не были связаны с заказом клиента. разработчик посчитал, что для них можно не менять логику: id заказа клиента пустой и запрос не найдет для него этапов оплаты. а значит, получится тот же результат, как если бы запроса вообще не было. а лишний запрос — ну... запросом больше, запросом меньше... тоже мне, большое дело. оказалось, большое. в таблице этапов оплаты оказались данные не только для заказов клиентов, но и для других видов документов. поле с id заказа клиента у них было пустым. в итоге erp при попытке найти этапы оплаты по пустому id заказа клиента находила такие записи — и, как видите, немало. запрос читал порядка гигабайта данных и помещал во временную таблицу. гигабайт прочитали, гигабайт записали... история била и по диску, и по буферному кэшу субд, и по другим частям системы (вплоть до сети, которой этот гигабайт приходилось гонять туда-сюда без всякой пользы). в общем, знаете, что я думаю? если результат запроса известен — наверное, его все-таки не нужно делать.",
    "tags": [
      "1c",
      "optimization"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/obsidian-foodiary\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Фудиари для Обсидиана\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>14 апреля 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Typescript</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Obsidian</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Вслед за <a href=\"https://kostyanetsky.ru/notes/obsidian-fastimer\" target=\"_blank\">первым</a> плагином для Obsidian пару недель назад выкатил <a href=\"https://github.com/vkostyanetsky/ObsidianFoodiary\" target=\"_blank\">второй</a>. Считает КБЖУ (калории, белки, жиры и углеводы) в пище. Помогает не переедать на пустом месте — всё-таки на глаз трудно оценить, сколько слопал за день, и можно ли позволить себе вон тот пончик.</p>\n<p>Короче, полезная штука, если вы:</p>\n<ol>\n<li>Толстяк (как я)</li>\n<li>Хотите перестать им быть (как я)</li>\n<li>Ведете заметки в Obsidian (как я) 🙂</li>\n</ol>\n<p>На самом деле, программ для этой задачи полным-полно (я перепробовал штук десять). Остался недоволен: либо страшная, либо глючит, либо постоянно пытается всучить ежемесячную подписку. Короче, больше раздражает, чем помогает. Хочется чего-то нативного, встроенного в обычную рутину — и если она оседает в Obsidian, то решение напрашивается само собой.</p>\n<p>Установить плагин можно прямо из программы — разработчики его уже одобрили. В остальном всё просто: пишем в ежедневной заметке, что съели и сколько это весило, и в ответ получаем компактную табличку с сортировкой по калориям и числам по белкам, жирам и углеводам. </p>\n<p>В репозитории по ссылке выше есть примеры.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "фудиари для обсидиана 14 апреля 2024 · готово typescript obsidian вслед за первым плагином для obsidian пару недель назад выкатил второй . считает кбжу (калории, белки, жиры и углеводы) в пище. помогает не переедать на пустом месте — всё-таки на глаз трудно оценить, сколько слопал за день, и можно ли позволить себе вон тот пончик. короче, полезная штука, если вы: толстяк (как я) хотите перестать им быть (как я) ведете заметки в obsidian (как я) 🙂 на самом деле, программ для этой задачи полным-полно (я перепробовал штук десять). остался недоволен: либо страшная, либо глючит, либо постоянно пытается всучить ежемесячную подписку. короче, больше раздражает, чем помогает. хочется чего-то нативного, встроенного в обычную рутину — и если она оседает в obsidian, то решение напрашивается само собой. установить плагин можно прямо из программы — разработчики его уже одобрили. в остальном всё просто: пишем в ежедневной заметке, что съели и сколько это весило, и в ответ получаем компактную табличку с сортировкой по калориям и числам по белкам, жирам и углеводам. в репозитории по ссылке выше есть примеры.",
    "tags": [
      "done",
      "typescript",
      "obsidian"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/callouts-for-fastimer\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Внешний вид Фастаймера\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>9 марта 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Obsidian</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Typescript</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Завернул отрисовку <a href=\"https://kostyanetsky.ru/notes/obsidian-fastimer\" target=\"_blank\">Фастаймера</a> через выноски: это механика Obsidian, позволяющая превращать обычную цитату в оформленный блок текста, привлекающий внимание читателя. Вы наверняка видели блоки в духе «совет» и «обрати внимание» — вот это и есть выноски. </p>\n<p>Подробнее можно прочитать в <a href=\"https://help.obsidian.md/Editing+and+formatting/Callouts\" target=\"_blank\">справке</a> Obsidian.</p>\n<p>В общем, теперь таймер принимает разный цвет в зависимости от состояния (активный интервал — голубой, успех — зеленый, провал — красный). Кроме того, я немного уплотнил текст и отточил формулировки:</p>\n<p><img alt=\"Пример\" src=\"https://kostyanetsky.ru/notes/callouts-for-fastimer/example.png\"/></p>\n<p>Получилось компактнее и симпатичнее простого блока текста, который я использовал до этого.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "внешний вид фастаймера 9 марта 2024 · obsidian typescript завернул отрисовку фастаймера через выноски: это механика obsidian, позволяющая превращать обычную цитату в оформленный блок текста, привлекающий внимание читателя. вы наверняка видели блоки в духе «совет» и «обрати внимание» — вот это и есть выноски. подробнее можно прочитать в справке obsidian. в общем, теперь таймер принимает разный цвет в зависимости от состояния (активный интервал — голубой, успех — зеленый, провал — красный). кроме того, я немного уплотнил текст и отточил формулировки: получилось компактнее и симпатичнее простого блока текста, который я использовал до этого.",
    "tags": [
      "obsidian",
      "typescript"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/small-pleasures\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Маленькие радости\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>6 марта 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Грузия</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Скучаю в очереди на кассу супермаркета: вечер, покупателей уже не очень много, но пожилая кассирша явно устала и не слишком торопится. Стоящий впереди высокий, седой мужчина с роскошной бородой коротает время, изучая стойку с шоколадками рядом с кассой. </p>\n<p>Наконец, берет «Сникерс», задумчиво крутит его в руках. Пододвигает себе ещё два и широко, с видимым удовольствием улыбается в усы :)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "маленькие радости 6 марта 2024 · тем временем грузия скучаю в очереди на кассу супермаркета: вечер, покупателей уже не очень много, но пожилая кассирша явно устала и не слишком торопится. стоящий впереди высокий, седой мужчина с роскошной бородой коротает время, изучая стойку с шоколадками рядом с кассой. наконец, берет «сникерс», задумчиво крутит его в руках. пододвигает себе ещё два и широко, с видимым удовольствием улыбается в усы :)",
    "tags": [
      "meanwhile",
      "georgia"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/not-only-everything\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Не только лишь все\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>25 февраля 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Завидной глубины комментарий из документации к методу WriteJSON() XDTOSerializer'а:</p>\n<p><img alt=\"Не только лиь все\" src=\"https://kostyanetsky.ru/notes/not-only-everything/write-json.jpg\"/></p>\n<p>Ну да, метод дампит данные в JSON, а не в XML. Так что поспорить сложно, не все типы данных можно упаковать в XML с его помощью (если быть точным — никакие). Если бы дальше не пошла очевидная копипаста из справки к WriteXML() — счёл бы пасхалкой от разработчиков :)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "не только лишь все 25 февраля 2024 · 1с завидной глубины комментарий из документации к методу writejson() xdtoserializer'а: ну да, метод дампит данные в json, а не в xml. так что поспорить сложно, не все типы данных можно упаковать в xml с его помощью (если быть точным — никакие). если бы дальше не пошла очевидная копипаста из справки к writexml() — счёл бы пасхалкой от разработчиков :)",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/obsidian-fastimer\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Фастаймер для Обсидиана\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>13 февраля 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Typescript</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Obsidian</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Разработчики <a href=\"https://obsidian.md\" target=\"_blank\">Obsidian</a> на днях заапрувили один из моих пет-плагинов на TypeScript — <a href=\"https://github.com/vkostyanetsky/ObsidianFastimer\" target=\"_blank\">Фастаймер</a>, трекер интервального голодания. Он добавляет в хранилище новый блок кода: вводишь в него дату начала окна голодания и получаешь дату завершения, время до этого момента и раскладку по зонам, которые предстоит пройти. </p>\n<p>Блок показывает актуальную картину каждый раз, когда Obsidian его отрисовывает — то есть, можно следить за своим прогрессом в реальном времени. Когда окно голодания закончится, можно ввести дату завершения и блок покажет результат: получилось ли выполнить цель, сколько времени сверх плана вы голодали и так далее.</p>\n<p>Думаю немного доработать визуальную часть (сейчас всё выводится текстом без какого-либо оформления). А ещё — прикрутить функции расчета статистики, чтобы можно было на ходу рисовать красивые графики в духе <a href=\"https://charts.phib.ro/Meta/Charts/Charts+Documentation\" target=\"_blank\">Charts</a> и показывать ачивки. У меня была эта механика в <a href=\"https://github.com/vkostyanetsky/Fastimer\" target=\"_blank\">реализации</a> этого же приложения на Python, но я вряд ли к ней вернусь — в хранилище Obsidian эту задачу решать проще, чем раскатывать на компьютер дополнительную утилиту.</p>\n<p>Короче, зацените плагин! :) В библиотеке Обсидиана его можно найти по имени (Fastimer). Или, при желании, установить вручную из репозитория.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "фастаймер для обсидиана 13 февраля 2024 · готово typescript obsidian разработчики obsidian на днях заапрувили один из моих пет-плагинов на typescript — фастаймер , трекер интервального голодания. он добавляет в хранилище новый блок кода: вводишь в него дату начала окна голодания и получаешь дату завершения, время до этого момента и раскладку по зонам, которые предстоит пройти. блок показывает актуальную картину каждый раз, когда obsidian его отрисовывает — то есть, можно следить за своим прогрессом в реальном времени. когда окно голодания закончится, можно ввести дату завершения и блок покажет результат: получилось ли выполнить цель, сколько времени сверх плана вы голодали и так далее. думаю немного доработать визуальную часть (сейчас всё выводится текстом без какого-либо оформления). а ещё — прикрутить функции расчета статистики, чтобы можно было на ходу рисовать красивые графики в духе charts и показывать ачивки. у меня была эта механика в реализации этого же приложения на python, но я вряд ли к ней вернусь — в хранилище obsidian эту задачу решать проще, чем раскатывать на компьютер дополнительную утилиту. короче, зацените плагин! :) в библиотеке обсидиана его можно найти по имени (fastimer). или, при желании, установить вручную из репозитория.",
    "tags": [
      "done",
      "typescript",
      "obsidian"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/do-not\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Do? Do Not?\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>14 января 2024</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">English</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>На одном из проектов у нас есть две общающиеся друг с другом системы: ERP и CRM. Обмен данными сделан по-взрослому: поднят push'n'pull сервер, прописаны подписки на события, подняты REST API и много другой интересной технической обвязки, но я сейчас не про неё.</p>\n<p>Среди прочей логики, там так: если в CRM появляется новый контрагент — его данные отправляются в ERP. На днях с этим возникла проблема: один из контрагентов не отправлялся из CRM ну вот вообще никак, сколько его не записывай. Полезли разбираться, подозревая худшее: CRM написана на PHP (ничего личного, просто это не наш технический стек) и там много разного легаси. Выстрелить себе в ногу проще, чем высморкаться. </p>\n<p>Однако особенно долго копаться не понадобилось. Открыли страницу контрагента в CRM и увидели, что у него стоит галка «Do Not Export To ERP», которая, собственно, блокирует отправку. Короче, очевидная ошибка какого-то менеджера. </p>\n<p>Убираем галку, закрываем тикет?</p>\n<p><img alt=\"Well yes, but actually no\" src=\"https://kostyanetsky.ru/notes/do-not/actually.jpg\"/></p>\n<p>Это решит проблему с этим конкретным контрагентом, но не причину, по которой она возникла. А она в интерфейсе, конкретно — в названии опции: используется «do not», которого желательно избегать из-за того, что пользователям сложнее правильно считать формулировку. К простому «do» это, кстати, тоже относится.</p>\n<p>Программистам часто непросто понять, почему так: мы привыкли мгновенно рассчитывать в уме булевые выражения и вариации в духе «не (не истина)» для нас — обычное дело. А вот люди с другим бэкграундом могут путаться. Совсем чуточку, но иногда и этого достаточно, чтобы в горячке дня воспринять «do not export» как «do export», ткнуть опцию и побежать дальше.</p>\n<p>Отсюда выводим правильное решение: переименовать галку. Подойдёт «Disable Export» или «Stop Export». В голову ещё приходит «Prohibit Export», но это скорее про межличностные отношения и вообще, запрет что-то делать не означает, что это что-то не будет сделано :)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "do? do not? 14 января 2024 · работа english на одном из проектов у нас есть две общающиеся друг с другом системы: erp и crm. обмен данными сделан по-взрослому: поднят push'n'pull сервер, прописаны подписки на события, подняты rest api и много другой интересной технической обвязки, но я сейчас не про неё. среди прочей логики, там так: если в crm появляется новый контрагент — его данные отправляются в erp. на днях с этим возникла проблема: один из контрагентов не отправлялся из crm ну вот вообще никак, сколько его не записывай. полезли разбираться, подозревая худшее: crm написана на php (ничего личного, просто это не наш технический стек) и там много разного легаси. выстрелить себе в ногу проще, чем высморкаться. однако особенно долго копаться не понадобилось. открыли страницу контрагента в crm и увидели, что у него стоит галка «do not export to erp», которая, собственно, блокирует отправку. короче, очевидная ошибка какого-то менеджера. убираем галку, закрываем тикет? это решит проблему с этим конкретным контрагентом, но не причину, по которой она возникла. а она в интерфейсе, конкретно — в названии опции: используется «do not», которого желательно избегать из-за того, что пользователям сложнее правильно считать формулировку. к простому «do» это, кстати, тоже относится. программистам часто непросто понять, почему так: мы привыкли мгновенно рассчитывать в уме булевые выражения и вариации в духе «не (не истина)» для нас — обычное дело. а вот люди с другим бэкграундом могут путаться. совсем чуточку, но иногда и этого достаточно, чтобы в горячке дня воспринять «do not export» как «do export», ткнуть опцию и побежать дальше. отсюда выводим правильное решение: переименовать галку. подойдёт «disable export» или «stop export». в голову ещё приходит «prohibit export», но это скорее про межличностные отношения и вообще, запрет что-то делать не означает, что это что-то не будет сделано :)",
    "tags": [
      "work",
      "english"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/last-meth\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Последний мет\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>17 декабря 2023</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Роюсь в коде внешней компоненты 1С, опубликованный разработчиками платформы как пример у себя на сайте. Из хорошего: ну, она компилируется и, если немного допилить — действительно работает. </p>\n<p>В остальном хватает bruh moments: например, проект не открывается в современной Visual Studio (нужно указывать CMake вручную). Код довольно небрежный, документации нет, комментариев и оформления по большому счёту тоже. Разработчику без опыта в С++ может быть непросто вкатиться.</p>\n<p>Позабавил нейминг:</p>\n<pre><code>long CAddInNative::FindMethod(const WCHAR_T* wsMethodName)\n{ \n    long plMethodNum = -1;\n    wchar_t* name = 0;\n\n    ::convFromShortWchar(&amp;name, wsMethodName);\n\n    plMethodNum = findName(g_MethodNames, name, eMethLast);\n\n    if (plMethodNum == -1)\n        plMethodNum = findName(g_MethodNamesRu, name, eMethLast);\n\n    delete[] name;\n\n    return plMethodNum;\n}\n</code></pre>\n<p>Со строк выше на нас смотрит необъяснимая любовь автора кода к сокращениям: вот что ему мешало назвать переменную \"eMethodLast\", а не \"eMethLast\"? В конце концов, у нас уже есть \"wsMethodName\" и \"plMethodNum\". </p>\n<p>Возможно, это такая пасхалка с отсылкой на Breaking Bad. Тогда, конечно, уверенный лайк :)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "последний мет 17 декабря 2023 · 1с роюсь в коде внешней компоненты 1с, опубликованный разработчиками платформы как пример у себя на сайте. из хорошего: ну, она компилируется и, если немного допилить — действительно работает. в остальном хватает bruh moments: например, проект не открывается в современной visual studio (нужно указывать cmake вручную). код довольно небрежный, документации нет, комментариев и оформления по большому счёту тоже. разработчику без опыта в с++ может быть непросто вкатиться. позабавил нейминг: long caddinnative::findmethod(const wchar_t* wsmethodname) { long plmethodnum = -1; wchar_t* name = 0; ::convfromshortwchar(&name, wsmethodname); plmethodnum = findname(g_methodnames, name, emethlast); if (plmethodnum == -1) plmethodnum = findname(g_methodnamesru, name, emethlast); delete[] name; return plmethodnum; } со строк выше на нас смотрит необъяснимая любовь автора кода к сокращениям: вот что ему мешало назвать переменную \"emethodlast\", а не \"emethlast\"? в конце концов, у нас уже есть \"wsmethodname\" и \"plmethodnum\". возможно, это такая пасхалка с отсылкой на breaking bad. тогда, конечно, уверенный лайк :)",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/wrong-freeway-entrance\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Пропущенный съезд\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>14 ноября 2023</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Код с запашком</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <blockquote>\n<p>Вы когда-нибудь пропускали свой съезд с шоссе? Нужно всего лишь доехать до следующего, чтобы развернуться, но каждый дюйм дороги вызывает отвращение, потому что ты удаляешься от цели.</p>\n<p><em>― Энди Вейер, «Марсианин»</em></p>\n</blockquote>\n<p>У программистов бывают ровно те же эмоции, когда они долго пилят какую-то систему и внезапно осознают, что один из её компонентов стоит задизайнить иначе. В этот момент рождается технический долг: понимаешь, что именно так и придется поступить, так как это разом закроет несколько проблем.</p>\n<p>Однако прямо сейчас, в моменте, не меняется ничего: ты продолжаешь пилить код вокруг того компонента, что есть. Ведь у тебя есть сроки на разработку, и ты профессионал! Нужно всего лишь выпустить релиз, чтобы вернуться к техдолгу, но каждый дюйм написанного кода вызывает отвращение, потому что ты удаляешься от цели.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "пропущенный съезд 14 ноября 2023 · код с запашком вы когда-нибудь пропускали свой съезд с шоссе? нужно всего лишь доехать до следующего, чтобы развернуться, но каждый дюйм дороги вызывает отвращение, потому что ты удаляешься от цели. ― энди вейер, «марсианин» у программистов бывают ровно те же эмоции, когда они долго пилят какую-то систему и внезапно осознают, что один из её компонентов стоит задизайнить иначе. в этот момент рождается технический долг: понимаешь, что именно так и придется поступить, так как это разом закроет несколько проблем. однако прямо сейчас, в моменте, не меняется ничего: ты продолжаешь пилить код вокруг того компонента, что есть. ведь у тебя есть сроки на разработку, и ты профессионал! нужно всего лишь выпустить релиз, чтобы вернуться к техдолгу, но каждый дюйм написанного кода вызывает отвращение, потому что ты удаляешься от цели.",
    "tags": [
      "code-smell"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/how-to-be-a-hero\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Бытовой героизм\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>24 сентября 2023</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Поднимал какое-то время назад <a href=\"https://swagger.io\" target=\"_blank\">Swagger</a> для внутренней API-шки. Пока возился — стало понятно, что часть функционала в документацию включать не нужно. Поискал способ, как это сделать без костылей — наткнулся на забавный <a href=\"https://github.com/tiangolo/full-stack-fastapi-couchbase/issues/10\" target=\"_blank\">вопрос</a> на GitHub'е.</p>\n<p>Чем забавный? Ну, невольно вспомнил про <a href=\"https://forum.mista.ru\" target=\"_blank\">Мисту</a>. В среде 1С-разработчиков это синоним слова \"токсичность\": мол, спросишь там что-нибудь — получишь ушат помоев за шиворот вместо ответа. Здесь, конечно, не так всё запущено, но ребята, с завидным упорством ссылающиеся на 14-и страничный мануал, здорово рассмешили.</p>\n<p>Одно радует: к концу треда всё же нашёлся отважный повстанец, который просто взял и запостил нужный параметр для декоратора.</p>\n<p>Не все герои носят плащи, ей-богу.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "бытовой героизм 24 сентября 2023 · 1с работа поднимал какое-то время назад swagger для внутренней api-шки. пока возился — стало понятно, что часть функционала в документацию включать не нужно. поискал способ, как это сделать без костылей — наткнулся на забавный вопрос на github'е. чем забавный? ну, невольно вспомнил про мисту . в среде 1с-разработчиков это синоним слова \"токсичность\": мол, спросишь там что-нибудь — получишь ушат помоев за шиворот вместо ответа. здесь, конечно, не так всё запущено, но ребята, с завидным упорством ссылающиеся на 14-и страничный мануал, здорово рассмешили. одно радует: к концу треда всё же нашёлся отважный повстанец, который просто взял и запостил нужный параметр для декоратора. не все герои носят плащи, ей-богу.",
    "tags": [
      "1c",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/crossed\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Румынская фича\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>30 августа 2023</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Делаю для нашего клиентского портала функцию восстановления пароля через SMS. Добрался до <a href=\"https://support.twilio.com/hc/en-us/articles/223133767-International-support-for-Alphanumeric-Sender-ID\" target=\"_blank\">документации</a> Twilio о поддержке <a href=\"https://www.twilio.com/docs/glossary/what-alphanumeric-sender-id\" target=\"_blank\">буквенно-цифрового ID отправителя</a> в разных странах; эта фича позволяет отправлять сообщения так, чтобы получатель видел не номер отправителя, а что-то осмысленное (название компании, например). </p>\n<p>При этом фича везде зарегулирована по-своему: где-то просто работает, где-то нужна регистрация.</p>\n<p>Читаю:</p>\n<p><img alt=\"Скрин\" src=\"https://kostyanetsky.ru/notes/crossed/twilio.png\"/></p>\n<p>🤔</p>\n<ul>\n<li>Португалия: да</li>\n<li>Пуэрто-Рико: нет</li>\n<li>Катар: да (с регистрацией)</li>\n<li>Реюньон: да</li>\n<li>Румыния: да (с регистрацией) (но бойтесь Дракулы)</li>\n</ul>\n<p>Не знаю, как ещё объяснить это кладбище.</p>\n<p>UPD: Нашёл разгадку. Могильные кресты означают, что за регистрацию нужно заплатить 700 баксов. </p>\n<p>Объяснение про Дракулу мне нравилось больше.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "румынская фича 30 августа 2023 · тем временем работа делаю для нашего клиентского портала функцию восстановления пароля через sms. добрался до документации twilio о поддержке буквенно-цифрового id отправителя в разных странах; эта фича позволяет отправлять сообщения так, чтобы получатель видел не номер отправителя, а что-то осмысленное (название компании, например). при этом фича везде зарегулирована по-своему: где-то просто работает, где-то нужна регистрация. читаю: 🤔 португалия: да пуэрто-рико: нет катар: да (с регистрацией) реюньон: да румыния: да (с регистрацией) (но бойтесь дракулы) не знаю, как ещё объяснить это кладбище. upd: нашёл разгадку. могильные кресты означают, что за регистрацию нужно заплатить 700 баксов. объяснение про дракулу мне нравилось больше.",
    "tags": [
      "meanwhile",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/fastimer-1-3-1\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Новый Фастаймер\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>23 августа 2023</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Python</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Выпустил новую <a href=\"https://github.com/vkostyanetsky/Fastimer/releases/tag/v1.3.1\" target=\"_blank\">версию</a> своего консольного таймера для <a href=\"https://ru.wikipedia.org/wiki/Периодическое_голодание\" target=\"_blank\">интервального голодания</a>. Сам таймер я написал где-то год назад, когда меня в очередной раз расстроило приложение <a href=\"https://www.zerolongevity.com/\" target=\"_blank\">Zero</a> для Android: в нём не работала какая-то совсем примитивная функция вроде просмотра конкретного интервала.</p>\n<p>Основное отличие 1.3.1 от 1.2.3 — выпилил к черту консольное меню в пользу старых-добрых аргументов и опций. Концепция меню выглядит удобной, пока фич у приложения мало, но как только их число растёт — необходимость протыкивать каждое действие начинает напрягать.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "новый фастаймер 23 августа 2023 · готово python выпустил новую версию своего консольного таймера для интервального голодания . сам таймер я написал где-то год назад, когда меня в очередной раз расстроило приложение zero для android: в нём не работала какая-то совсем примитивная функция вроде просмотра конкретного интервала. основное отличие 1.3.1 от 1.2.3 — выпилил к черту консольное меню в пользу старых-добрых аргументов и опций. концепция меню выглядит удобной, пока фич у приложения мало, но как только их число растёт — необходимость протыкивать каждое действие начинает напрягать.",
    "tags": [
      "done",
      "python"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/this-is-the-way\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Таков путь\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>17 июля 2023</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Немного экзистенциальной безысходности от СП (на случай, если вам её почему-то не хватало):</p>\n<p><img alt=\"Исключение генерируется\" src=\"https://kostyanetsky.ru/notes/this-is-the-way/delete-messages.png\"/></p>\n<p>Это справка для метода УдалитьСообщения() менеджера канала сервиса интеграции. Если серьёзно, я понимаю, что тут имеется в виду: дело в том, что все методы сервисов интеграции швыряются исключениями, если их вызвать в сеансе со включенными разделителями. Авторы документации педантично сообщают об этом в справке по любому из них, так что здесь, видимо, просто почему-то кусок отвалился. В английской документации к этому методу, например, всё нормально.</p>\n<p>Но все равно, забавно смотрится. Напомнило старый мем:</p>\n<p><img alt=\"Исключение генерируется\" src=\"https://kostyanetsky.ru/notes/this-is-the-way/bees.jpeg\"/></p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "таков путь 17 июля 2023 · 1с немного экзистенциальной безысходности от сп (на случай, если вам её почему-то не хватало): это справка для метода удалитьсообщения() менеджера канала сервиса интеграции. если серьёзно, я понимаю, что тут имеется в виду: дело в том, что все методы сервисов интеграции швыряются исключениями, если их вызвать в сеансе со включенными разделителями. авторы документации педантично сообщают об этом в справке по любому из них, так что здесь, видимо, просто почему-то кусок отвалился. в английской документации к этому методу, например, всё нормально. но все равно, забавно смотрится. напомнило старый мем:",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/do-you-speak-english\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Ду ю спик инглиш?\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>14 мая 2023</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Диалог входа в хранилище конфигурации актуальной версии платформы (8.3.22.1923, если быть точным), запущенной с английским интерфейсом:</p>\n<p><img alt=\"Диалог входа\" src=\"https://kostyanetsky.ru/notes/do-you-speak-english/login-form.png\"/></p>\n<p>Слышал, что развитие Конфигуратора остановилось во многом из-за чудовищного количества технического долга, тормозящего любые новые фичи. Но тут интерфейс поехал прямо на одном из первых окон приложения! Любопытно, как это пролезло через тесты. </p>\n<p>Может, их и вовсе нет.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "ду ю спик инглиш? 14 мая 2023 · 1с диалог входа в хранилище конфигурации актуальной версии платформы (8.3.22.1923, если быть точным), запущенной с английским интерфейсом: слышал, что развитие конфигуратора остановилось во многом из-за чудовищного количества технического долга, тормозящего любые новые фичи. но тут интерфейс поехал прямо на одном из первых окон приложения! любопытно, как это пролезло через тесты. может, их и вовсе нет.",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/going-postal\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Опочтовиться\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>8 мая 2023</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">English</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Пополнял словарь в попытках описать англоговорящему приятелю свои последние приключения и вычитал про красочную идиому «to go postal». Означает что-то вроде «рехнуться от злости»; появилась где-то между 80-и и 90-и годами в Штатах после серии довольно <a href=\"https://ru.wikipedia.org/wiki/Going_postal\" target=\"_blank\">безумных инцидентов</a>, в которых работники почты ехали крышей и нападали на всех подряд, включая коллег и посетителей.</p>\n<p>В общем, выражение на первый взгляд звучит забавно, но уж больно мрачная история за кулисами. Думаю, продолжу применять старое-доброе «to go ballistic». Буквально «разозлиться так, что стать похожим на ракету, потерявшей управление», «взорваться от гнева». </p>\n<p>В русском языке, кстати, есть похожие «ракетные» коннотации, но они почему-то про более управляемую или полезную, что ли, историю. Типа, пожар в заднице был настолько силён, что бедняга покинул Землю и успешно приземлился на Марсе (а не просто взорвался) :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "опочтовиться 8 мая 2023 · english пополнял словарь в попытках описать англоговорящему приятелю свои последние приключения и вычитал про красочную идиому «to go postal». означает что-то вроде «рехнуться от злости»; появилась где-то между 80-и и 90-и годами в штатах после серии довольно безумных инцидентов , в которых работники почты ехали крышей и нападали на всех подряд, включая коллег и посетителей. в общем, выражение на первый взгляд звучит забавно, но уж больно мрачная история за кулисами. думаю, продолжу применять старое-доброе «to go ballistic». буквально «разозлиться так, что стать похожим на ракету, потерявшей управление», «взорваться от гнева». в русском языке, кстати, есть похожие «ракетные» коннотации, но они почему-то про более управляемую или полезную, что ли, историю. типа, пожар в заднице был настолько силён, что бедняга покинул землю и успешно приземлился на марсе (а не просто взорвался) :-)",
    "tags": [
      "english"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/pause\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Пауза()\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>30 апреля 2023</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <blockquote>\n<p>Важная особенность: метод ВызватьПаузу недоступен в клиент-серверном вызове; при вызове с клиента серверного метода, в котором вызывается ВызватьПаузу, будет сгенерировано исключение «Нельзя вызвать метод ВызватьПаузу в клиент-серверном вызове».</p>\n<p><a href=\"https://wonderland.v8.1c.ru/blog/metod-vyzvatpauzu/\" target=\"_blank\">Метод ВызватьПаузу</a></p>\n</blockquote>\n<p>Странное ограничение, если честно. С одной стороны, адекватный разработчик и так не будет в клиент-серверном вызове делать искусственную паузу, с другой — кому чешется, всё равно её там сделает (через проверку времени в цикле, например). Стоило ради security by obscurity огород городить?</p>\n<p>В лучшем случае какой-нибудь джун схватит это исключение, подумает \"похоже, я что-то не так делаю\" и двинется в правильном направлении. Однако закладывать в платформу ограничение ради этого кейса — как из пушки по воробьям палить. Давайте ещё лимит по количеству прикрутим — мол, не больше 1000 пауз на сеанс, а то вдруг пользователи подумают, что программа работает слишком медленно :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "пауза() 30 апреля 2023 · 1с важная особенность: метод вызватьпаузу недоступен в клиент-серверном вызове; при вызове с клиента серверного метода, в котором вызывается вызватьпаузу, будет сгенерировано исключение «нельзя вызвать метод вызватьпаузу в клиент-серверном вызове». метод вызватьпаузу странное ограничение, если честно. с одной стороны, адекватный разработчик и так не будет в клиент-серверном вызове делать искусственную паузу, с другой — кому чешется, всё равно её там сделает (через проверку времени в цикле, например). стоило ради security by obscurity огород городить? в лучшем случае какой-нибудь джун схватит это исключение, подумает \"похоже, я что-то не так делаю\" и двинется в правильном направлении. однако закладывать в платформу ограничение ради этого кейса — как из пушки по воробьям палить. давайте ещё лимит по количеству прикрутим — мол, не больше 1000 пауз на сеанс, а то вдруг пользователи подумают, что программа работает слишком медленно :-)",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/in-a-pedantic-way\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Сделай это педантично\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>21 марта 2023</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Код с запашком</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Ежедневная пальма первенства в номинации «самый философский код» уходит автору этого элегантного способа проверить, что две булевые переменные не равны друг другу:</p>\n<pre><code>If DataStructure.Property(\"AmountVATIn\")\n    And ((DataStructure.AmountVATIn And NOT SearchPriceIncludesVAT)\n    OR (NOT DataStructure.AmountVATIn And SearchPriceIncludesVAT)) Then    \n    Price = RecalculateAmountOnVATFlagsChange(Price, DataStructure.AmountVATIn, TabSectionLine.VATRate);\nEndIf;\n</code></pre>\n<p>Думаю дописать сюда что-нибудь вроде «And Not (DataStructure.AmountVATIn = SearchPriceIncludesVAT)», чтобы придать происходящему тонкую нотку безумия.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "сделай это педантично 21 марта 2023 · 1с работа код с запашком ежедневная пальма первенства в номинации «самый философский код» уходит автору этого элегантного способа проверить, что две булевые переменные не равны друг другу: if datastructure.property(\"amountvatin\") and ((datastructure.amountvatin and not searchpriceincludesvat) or (not datastructure.amountvatin and searchpriceincludesvat)) then price = recalculateamountonvatflagschange(price, datastructure.amountvatin, tabsectionline.vatrate); endif; думаю дописать сюда что-нибудь вроде «and not (datastructure.amountvatin = searchpriceincludesvat)», чтобы придать происходящему тонкую нотку безумия.",
    "tags": [
      "1c",
      "work",
      "code-smell"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/environmental-storytelling\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Повествование через окружение\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>19 марта 2023</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Люблю замечать в окружающем мире штуки, за которыми явно стоит какая-то история. В видеоиграх это называют \"повествованием через окружение\": напрямую тебе историю не рассказывают, но если посмотреть по сторонам — можно догадаться, какое ружье висело на стенке и кто из него пальнул.</p>\n<p>Например, недавно отмечал с коллегами десятилетие компании в местном гольф-клубе. Шары нужно было отправлять в полет со второго этажа; перил там по понятным причинам нет, но натянута сетка на случай, если кто-то потеряет равновесие.</p>\n<p><img alt=\"Фотка с сайта клуба, чтобы было понятнее.\" src=\"https://kostyanetsky.ru/notes/environmental-storytelling/topgolf.jpeg\"/></p>\n<p>Рядом висят предупреждения: прыгнете в сетку своим хотением — заплатите <abbr title=\"Порядка двухста тысяч рублей на этот момент.\">десять тысяч дирхам</abbr>. Запишете этот прыжок веры на камеру — готовьте ещё пять тысяч.</p>\n<p>Чувствуется история за кулисами, да?</p>\n<p>Или, скажем, летал как-то в Турцию отдыхать и решил на всякий случай полистать правила авиакомпании (что можно брать на борт, чего нельзя). Среди списка запрещенных к проносу на борт предметов нашёл пункты «стальное копье» и «стальной кистень» 😬</p>\n<p>UPD: Ещё один отличный <a href=\"https://kostyanetsky.ru/notes/environmental-storytelling/soundproof.jpeg\" target=\"_blank\">пример</a> откуда-то из сети.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "повествование через окружение 19 марта 2023 · тем временем работа люблю замечать в окружающем мире штуки, за которыми явно стоит какая-то история. в видеоиграх это называют \"повествованием через окружение\": напрямую тебе историю не рассказывают, но если посмотреть по сторонам — можно догадаться, какое ружье висело на стенке и кто из него пальнул. например, недавно отмечал с коллегами десятилетие компании в местном гольф-клубе. шары нужно было отправлять в полет со второго этажа; перил там по понятным причинам нет, но натянута сетка на случай, если кто-то потеряет равновесие. рядом висят предупреждения: прыгнете в сетку своим хотением — заплатите десять тысяч дирхам . запишете этот прыжок веры на камеру — готовьте ещё пять тысяч. чувствуется история за кулисами, да? или, скажем, летал как-то в турцию отдыхать и решил на всякий случай полистать правила авиакомпании (что можно брать на борт, чего нельзя). среди списка запрещенных к проносу на борт предметов нашёл пункты «стальное копье» и «стальной кистень» 😬 upd: ещё один отличный пример откуда-то из сети.",
    "tags": [
      "meanwhile",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/outgoing-requests-limiter\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Помедленнее, я записываю\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>5 марта 2023</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Битрикс</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Обычно при разработке исходишь из простой формулы: чем быстрее работает — тем лучше. Например, чем больше запросов приложение успеет выполнить за единицу времени — тем быстрее решится задача, ради которой эти запросы нужны.</p>\n<p>Однако бывает наоборот: нужно снизить количество операций, которые программа способна выполнить. Допустим, мы дергаем внешний сервис и он банит, если делать это слишком часто. Пример — облако <a href=\"https://bitrix24.net\" target=\"_blank\">Битрикс24</a>, которое требует отправлять не больше двух запросов в секунду.</p>\n<p>Вот <a href=\"https://github.com/vkostyanetsky/OutgoingRequestsLimiter\" target=\"_blank\">реализация</a> такой замедлялки, которую я написал на прошлой неделе. Поддержки очередности в ней нет; основная решенная задача — выполнить как можно больше запросов, не выходя за лимит (с учётом того, что запросы могут делаться из разных сеансов).</p>\n<p>Задача решена грубо — через константу, которая хранит дату текущей секунды и количество уже были отправленных запросов. Клиенты, которые утыкаются в ограничение — ждут. Для нагруженных систем такой подход не годится, а так — вполне может пригодиться.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "помедленнее, я записываю 5 марта 2023 · 1с битрикс готово обычно при разработке исходишь из простой формулы: чем быстрее работает — тем лучше. например, чем больше запросов приложение успеет выполнить за единицу времени — тем быстрее решится задача, ради которой эти запросы нужны. однако бывает наоборот: нужно снизить количество операций, которые программа способна выполнить. допустим, мы дергаем внешний сервис и он банит, если делать это слишком часто. пример — облако битрикс24 , которое требует отправлять не больше двух запросов в секунду. вот реализация такой замедлялки, которую я написал на прошлой неделе. поддержки очередности в ней нет; основная решенная задача — выполнить как можно больше запросов, не выходя за лимит (с учётом того, что запросы могут делаться из разных сеансов). задача решена грубо — через константу, которая хранит дату текущей секунды и количество уже были отправленных запросов. клиенты, которые утыкаются в ограничение — ждут. для нагруженных систем такой подход не годится, а так — вполне может пригодиться.",
    "tags": [
      "1c",
      "bitrix",
      "done"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/rest-service-4-sm\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                REST-сервис для Service Manager\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>25 февраля 2023</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>На этой неделе написал REST-сервис для настройки к нашему сервис-менеджеру (это такая конфигурация для управления инстансом 1cFresh). Развернуть контур разработки у нас — задача регулярная, и базу менеджера каждый раз приходилось тюнить руками: подкручивать витрину, менять адреса приложений, перезаписывать регламентные задания и так далее.</p>\n<p>Реализация была проста. Придумай структуру JSON, напиши парсер, найди подходящий код в конфигурации, обеспечь его вызов извне и убедись, что ничего не сломал. Рутинная работа, в общем-то, но я люблю время от времени делать такие штуки: смотреть вокруг и пытаться сообразить, какая из ежедневных задач раздражает достаточно сильно. </p>\n<p>Эта — хороший пример. Настройка сервис-менеджера не была проблемой (запустить приложение и покрутить настройки), но о ней нужно было думать и её нужно было делать. А теперь — нет:</p>\n<ol>\n<li>Есть JSON-файл со всеми настройками;</li>\n<li>Есть REST-сервис для его обработки;</li>\n<li>Есть скрипт, который засунет первый во второй; </li>\n<li>Есть пайплайн, который сделает всё это сам. </li>\n</ol>\n<p>Короче, ботинок тёр ногу, а теперь перестал. Йаху!</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "rest-сервис для service manager 25 февраля 2023 · 1с работа на этой неделе написал rest-сервис для настройки к нашему сервис-менеджеру (это такая конфигурация для управления инстансом 1cfresh). развернуть контур разработки у нас — задача регулярная, и базу менеджера каждый раз приходилось тюнить руками: подкручивать витрину, менять адреса приложений, перезаписывать регламентные задания и так далее. реализация была проста. придумай структуру json, напиши парсер, найди подходящий код в конфигурации, обеспечь его вызов извне и убедись, что ничего не сломал. рутинная работа, в общем-то, но я люблю время от времени делать такие штуки: смотреть вокруг и пытаться сообразить, какая из ежедневных задач раздражает достаточно сильно. эта — хороший пример. настройка сервис-менеджера не была проблемой (запустить приложение и покрутить настройки), но о ней нужно было думать и её нужно было делать. а теперь — нет: есть json-файл со всеми настройками; есть rest-сервис для его обработки; есть скрипт, который засунет первый во второй; есть пайплайн, который сделает всё это сам. короче, ботинок тёр ногу, а теперь перестал. йаху!",
    "tags": [
      "1c",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/haul-trucks\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Карьерные самосвалы\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>20 февраля 2023</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p><img alt=\"Автомобили\" src=\"https://kostyanetsky.ru/notes/haul-trucks/cars.jpg\"/></p>\n<p>Коллега проворчал, что если продолжать эту логическую цепочку, то конфигуратор будет «Жигулями», а EDT — «Кама1» (это такой электрокар, который много лет пилят где-то в недрах КАМАЗа и всё никак не могут собраться с силами и, наконец, допилить).</p>\n<p>Ну а я стараюсь смотреть на вещи с оптимизмом. Думаю, платформа и её IDE — это такие карьерные самосвалы. Никто в здравом уме на них по домашним делам не катает, но на разрезе эти звери незаменимы!</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "карьерные самосвалы 20 февраля 2023 · 1с коллега проворчал, что если продолжать эту логическую цепочку, то конфигуратор будет «жигулями», а edt — «кама1» (это такой электрокар, который много лет пилят где-то в недрах камаза и всё никак не могут собраться с силами и, наконец, допилить). ну а я стараюсь смотреть на вещи с оптимизмом. думаю, платформа и её ide — это такие карьерные самосвалы. никто в здравом уме на них по домашним делам не катает, но на разрезе эти звери незаменимы!",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/strange-bitrix\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Про странный Битрикс\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>15 октября 2022</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Битрикс</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Чем дальше лезу в REST-интерфейс Битрикс24, тем сильнее поражаюсь тому, насколько необычно устроено мышление у его разработчиков. Проявляется это по-разному.</p>\n<p>Взять, например, интерфейс сделок и товаров по ним. В таблице последних нет поля суммы: мол, нужна тебе сумма по строке — сам и считай. Зато сумма есть на уровне документа. Угадаете, как называется поле?</p>\n<p>AMOUNT? DEAL_AMOUNT? DOCUMENT_AMOUNT? AMOUNT_TOTAL?</p>\n<p>Не угадали, правильный ответ — OPPORTUNITY.</p>\n<p><img alt=\"Чего, блядь?\" src=\"https://kostyanetsky.ru/notes/strange-bitrix/what-the-fuck.jpg\"/></p>\n<p>Но вернемся в строке товара. В ней есть товар, ставка НДС и единица измерения. Все три сущности вполне самостоятельны: у каждой есть отдельная таблица со вспомогательной информацией и свой собственный идентификатор. Логично предположить, что в строке товара они и хранятся: ID товара, ID ставки НДС и ID единицы измерения.</p>\n<p>Логично-то логично, но нет, хрен там плавал. Для номенклатуры и правда хранится ID, а вот для ставки НДС — значение ставки, и для единицы измерения — код измерения по ОКЕИ ¯\\_(ツ)_/¯</p>\n<p>Нормализация базы данных? Чего? Какая еще нормализация? Отстань, мужик, работать мешаешь.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "про странный битрикс 15 октября 2022 · работа битрикс чем дальше лезу в rest-интерфейс битрикс24, тем сильнее поражаюсь тому, насколько необычно устроено мышление у его разработчиков. проявляется это по-разному. взять, например, интерфейс сделок и товаров по ним. в таблице последних нет поля суммы: мол, нужна тебе сумма по строке — сам и считай. зато сумма есть на уровне документа. угадаете, как называется поле? amount? deal_amount? document_amount? amount_total? не угадали, правильный ответ — opportunity. но вернемся в строке товара. в ней есть товар, ставка ндс и единица измерения. все три сущности вполне самостоятельны: у каждой есть отдельная таблица со вспомогательной информацией и свой собственный идентификатор. логично предположить, что в строке товара они и хранятся: id товара, id ставки ндс и id единицы измерения. логично-то логично, но нет, хрен там плавал. для номенклатуры и правда хранится id, а вот для ставки ндс — значение ставки, и для единицы измерения — код измерения по океи ¯\\_(ツ)_/¯ нормализация базы данных? чего? какая еще нормализация? отстань, мужик, работать мешаешь.",
    "tags": [
      "work",
      "bitrix"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/anonymous-quokka\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Групповая работа в Google Docs\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>18 сентября 2022</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Битрикс</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Последний месяц переписываю типовой обмен данными между FirstBit ERP и Битриксом под клиентскую задачу. Коллеги, занимающиеся тем же на стороне Битрикса, подготовили под это дело массивный маппинг: какое поле на стороне 1С в какое поле Битрикса нужно передавать (и наоборот).</p>\n<p>Этот маппинг они выложили в виде таблиц Google Docs, в интерфейсе которого можно видеть пользователей, пользующихся документом в этот момент — как залогиненных, так и анонимных. Последних он традиционно отображает в виде <a href=\"https://support.google.com/docs/answer/2494888?hl=ru\" target=\"_blank\">животных</a>.</p>\n<p>Коллеги в основном предпочитают работать анонимно. В итоге я последнее время крепко ощущаю себя диснеевской принцессой: приступаешь такой утром к работе, и отовсюду выкатываются неопознанные квокки, пингвины и шиншиллы :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "групповая работа в google docs 18 сентября 2022 · работа битрикс тем временем последний месяц переписываю типовой обмен данными между firstbit erp и битриксом под клиентскую задачу. коллеги, занимающиеся тем же на стороне битрикса, подготовили под это дело массивный маппинг: какое поле на стороне 1с в какое поле битрикса нужно передавать (и наоборот). этот маппинг они выложили в виде таблиц google docs, в интерфейсе которого можно видеть пользователей, пользующихся документом в этот момент — как залогиненных, так и анонимных. последних он традиционно отображает в виде животных . коллеги в основном предпочитают работать анонимно. в итоге я последнее время крепко ощущаю себя диснеевской принцессой: приступаешь такой утром к работе, и отовсюду выкатываются неопознанные квокки, пингвины и шиншиллы :-)",
    "tags": [
      "work",
      "bitrix",
      "meanwhile"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/slack\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Слак советует\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>25 августа 2022</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Слак, конечно, есть за что ругать. За тормоза, за баги, за <a href=\"https://t.me/nikitonsky_pub/262\" target=\"_blank\">оповещения</a>. Но я просто обожаю его заглушки на случай, если новых сообщений нет.</p>\n<p>Посмотрите, какая милота:</p>\n<p><img alt=\"All done. The future is yours.\" src=\"https://kostyanetsky.ru/notes/slack/all-done.png\"/></p>\n<p>Зачем вообще нужны психотерапевты?</p>\n<p><img alt=\"You're up to date. Go forth and do great things.\" src=\"https://kostyanetsky.ru/notes/slack/up-to-date.png\"/></p>\n<p>Или вот:</p>\n<p><img alt=\"You're all read. Here is a tractor.\" src=\"https://kostyanetsky.ru/notes/slack/here-is-tractor.png\"/></p>\n<p>Боже, слак, хоть ты не начинай.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "слак советует 25 августа 2022 · тем временем слак, конечно, есть за что ругать. за тормоза, за баги, за оповещения . но я просто обожаю его заглушки на случай, если новых сообщений нет. посмотрите, какая милота: зачем вообще нужны психотерапевты? или вот: боже, слак, хоть ты не начинай.",
    "tags": [
      "meanwhile"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/shaken-not-stirred\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Взболтать, но не смешивать\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>7 августа 2022</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Затрем немного про организацию кода. Если вам нужно где-то описать множество объектов с общими свойствами — подумайте, не стоит ли подробить описание на отдельные методы, каждый из которых будет описывать один конкретный объект?</p>\n<p>Посмотрим на пример — метод, который описывает табличные части документов, пригодные для какой-то задачи. Что-то вроде:</p>\n<pre><code>SupportedTypes[\"Document.SupplierPricesEntering\"]   = \"Prices\";\nSupportedTypes[\"Document.OpeningBalancesEntering\"]  = \"CustomerAccounts,VendorAccounts\";\nSupportedTypes[\"Document.Requisition\"]              = \"InventoryAndServices\";\n</code></pre>\n<p>Вроде всё в порядке, так? Описания есть, табличные части перечислены, посплитить их по запятой — считай, бесплатно.</p>\n<p>Однако документов в методе описано много. Рано или поздно какому-нибудь коллеге (или вам самим) понадобится добавить ещё одну табличную часть для документа, который уже описан в методе. Его что-то отвлечет, он забудет поискать существующую строку и получится что-то вроде:</p>\n<pre><code>SupportedTypes[\"Document.SupplierPricesEntering\"]   = \"Prices\";\nSupportedTypes[\"Document.OpeningBalancesEntering\"]  = \"CustomerAccounts,VendorAccounts\";\nSupportedTypes[\"Document.Requisition\"]              = \"InventoryAndServices\";\n\n&lt;...&gt;\n\nSupportedTypes[\"Document.OpeningBalancesEntering\"]  = \"PayrollDeductions\";\n</code></pre>\n<p>В результате пара табличных частей выпадет из описания, и хорошо, если связанный функционал покрыт тестами.</p>\n<p>Вывод? Ну, можно написать метод-хелпер, который будет принимать на вход тип документа и имя <strong>одной</strong> табличной части. Хелпер будет заполнять соответствие SupportedTypes и следить за тем, чтобы уже добавленные в него данные не были потеряны.</p>\n<p>А если совсем по фен-шую, лучше поступить так, как я написал в начале заметки: разделить метод на отдельные вспомогательные методы, каждый из которых будет описывать только табличные части по одному документу. Что-то вроде:</p>\n<pre><code>Procedure AddOpeningBalancesEnteringDocument(SupportedTypes)\n\n    TabularSections = New Array;\n\n    TabularSections.Add(\"CustomerAccounts\");\n    TabularSections.Add(\"VendorAccounts\");\n    TabularSections.Add(\"PayrollDeductions\");\n\n    SupportedTypes[\"Document.Requisition\"] = StrConcat(TabularSections, \",\");\n\nEndProcedure\n</code></pre>\n<p>Так и описание документа никто случайно не сотрет, и Сонар будет доволен. А вот случае реализации хелпера он, скорее всего, примется ругаться на повторяющиеся литералы с именами табличных частей.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "взболтать, но не смешивать 7 августа 2022 · 1с затрем немного про организацию кода. если вам нужно где-то описать множество объектов с общими свойствами — подумайте, не стоит ли подробить описание на отдельные методы, каждый из которых будет описывать один конкретный объект? посмотрим на пример — метод, который описывает табличные части документов, пригодные для какой-то задачи. что-то вроде: supportedtypes[\"document.supplierpricesentering\"] = \"prices\"; supportedtypes[\"document.openingbalancesentering\"] = \"customeraccounts,vendoraccounts\"; supportedtypes[\"document.requisition\"] = \"inventoryandservices\"; вроде всё в порядке, так? описания есть, табличные части перечислены, посплитить их по запятой — считай, бесплатно. однако документов в методе описано много. рано или поздно какому-нибудь коллеге (или вам самим) понадобится добавить ещё одну табличную часть для документа, который уже описан в методе. его что-то отвлечет, он забудет поискать существующую строку и получится что-то вроде: supportedtypes[\"document.supplierpricesentering\"] = \"prices\"; supportedtypes[\"document.openingbalancesentering\"] = \"customeraccounts,vendoraccounts\"; supportedtypes[\"document.requisition\"] = \"inventoryandservices\"; <...> supportedtypes[\"document.openingbalancesentering\"] = \"payrolldeductions\"; в результате пара табличных частей выпадет из описания, и хорошо, если связанный функционал покрыт тестами. вывод? ну, можно написать метод-хелпер, который будет принимать на вход тип документа и имя одной табличной части. хелпер будет заполнять соответствие supportedtypes и следить за тем, чтобы уже добавленные в него данные не были потеряны. а если совсем по фен-шую, лучше поступить так, как я написал в начале заметки: разделить метод на отдельные вспомогательные методы, каждый из которых будет описывать только табличные части по одному документу. что-то вроде: procedure addopeningbalancesenteringdocument(supportedtypes) tabularsections = new array; tabularsections.add(\"customeraccounts\"); tabularsections.add(\"vendoraccounts\"); tabularsections.add(\"payrolldeductions\"); supportedtypes[\"document.requisition\"] = strconcat(tabularsections, \",\"); endprocedure так и описание документа никто случайно не сотрет, и сонар будет доволен. а вот случае реализации хелпера он, скорее всего, примется ругаться на повторяющиеся литералы с именами табличных частей.",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/not-but\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Не так, а этак!\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>23 июля 2022</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Про хорватский комикс <a href=\"http://www.to-zo.com/notbut\" target=\"_blank\">NOT/BUT</a> мне кто-то рассказал в начале прошлого года, когда я всерьёз учился рисовать. Каждый стрип там — про какую-то травмирующую или просто мрачную мысль, которая приходит в голову художника во время работы. Идея в том, чтобы подтолкнуть читателя в правильном направлении и дать ему посмотреть на ситуацию, в которую он попал, с более практичной стороны.</p>\n<p>Рисовать я бросил через год, в конце февраля: стало понятно, что времени на хобби у меня больше нет. Но комикс — совершенно универсальный; полистайте, даже если понятия не имеете, что такое клячка :-)</p>\n<p><a href=\"http://www.to-zo.com/notbut\" target=\"_blank\"><img alt=\"Да что за херня?\" src=\"https://kostyanetsky.ru/notes/not-but/mistakes.png\"/></a></p>\n<p>Все эти бесконечные самокопания хорошо знакомы любому профессионалу, а выход из них — не всегда очевиден. Особенно если ты зол, устал, а дедлайн по проекту истёк где-то на прошлой неделе.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "не так, а этак! 23 июля 2022 · работа тем временем про хорватский комикс not/but мне кто-то рассказал в начале прошлого года, когда я всерьёз учился рисовать. каждый стрип там — про какую-то травмирующую или просто мрачную мысль, которая приходит в голову художника во время работы. идея в том, чтобы подтолкнуть читателя в правильном направлении и дать ему посмотреть на ситуацию, в которую он попал, с более практичной стороны. рисовать я бросил через год, в конце февраля: стало понятно, что времени на хобби у меня больше нет. но комикс — совершенно универсальный; полистайте, даже если понятия не имеете, что такое клячка :-) все эти бесконечные самокопания хорошо знакомы любому профессионалу, а выход из них — не всегда очевиден. особенно если ты зол, устал, а дедлайн по проекту истёк где-то на прошлой неделе.",
    "tags": [
      "work",
      "meanwhile"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/ok\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Окей!\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>22 июля 2022</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">English</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/GuIPxcXwF30\" width=\"560\"></iframe>\n<p>Блин. Посмотрел видео и понял, что я как раз давным-давно просто пишу OK в утренних дейликах в ответ на вопрос «how do you feel today». Мол, со мной всё в норме, жив-здоров, на работу ничто не влияет.</p>\n<p>Что обо мне думали коллеги — боюсь предположить. Надеюсь, они тоже не знали про то, что okay в ответе на такой вопрос нифига не значит okay. :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "окей! 22 июля 2022 · english работа блин. посмотрел видео и понял, что я как раз давным-давно просто пишу ok в утренних дейликах в ответ на вопрос «how do you feel today». мол, со мной всё в норме, жив-здоров, на работу ничто не влияет. что обо мне думали коллеги — боюсь предположить. надеюсь, они тоже не знали про то, что okay в ответе на такой вопрос нифига не значит okay. :-)",
    "tags": [
      "english",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/cookie-jar\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Баночка с печеньем\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>28 мая 2022</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Python</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>На днях прикручивал работу с куками к одному из своих скриптов. Пока искал оптимальное решение, наткнулся на совершенно очаровательный (при этом, кстати, 100% рабочий) <a href=\"https://stackoverflow.com/questions/13030095/how-to-save-requests-python-cookies-to-a-file\" target=\"_blank\">совет</a> со StackOverflow:</p>\n<blockquote>\n<p>You can get a CookieJar object from the session with session.cookies, and use pickle to store it to a file.</p>\n</blockquote>\n<p>Ну то есть, буквально: держите ваше печенье в банке, а чтобы хранить его — маринуйте. Банку с маринованным печеньем, кстати, потом можно поставить на <a href=\"https://docs.python.org/3/library/shelve.html\" target=\"_blank\">полку</a>.</p>\n<p>Вот как после этого не любить пайтон, а?</p>\n<p>P.S. Пока писал заметку, разобрало любопытство — почему всё-таки pickle, а нe serialization? Так вот, если вкратце: <a href=\"https://stackoverflow.com/questions/27324986/pickles-why-are-they-called-that/27325007#27325007\" target=\"_blank\">таков путь</a>.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "баночка с печеньем 28 мая 2022 · python на днях прикручивал работу с куками к одному из своих скриптов. пока искал оптимальное решение, наткнулся на совершенно очаровательный (при этом, кстати, 100% рабочий) совет со stackoverflow: you can get a cookiejar object from the session with session.cookies, and use pickle to store it to a file. ну то есть, буквально: держите ваше печенье в банке, а чтобы хранить его — маринуйте. банку с маринованным печеньем, кстати, потом можно поставить на полку . вот как после этого не любить пайтон, а? p.s. пока писал заметку, разобрало любопытство — почему всё-таки pickle, а нe serialization? так вот, если вкратце: таков путь .",
    "tags": [
      "python"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/no-more-embedded-tweets\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Минус встроенные твиты\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>21 марта 2022</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Блог</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Вебдев</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Node.js</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Не успел я <a href=\"https://kostyanetsky.ru/notes/no-more-google-fonts\" target=\"_blank\">выпилить</a> из блога Google Fonts, как пришлось отправить вдогонку встроенные твиты.</p>\n<p>Как это работало раньше? Хотел сослаться на твит — просто вставлял на него ссылку. Скрипт сборки заменял её на HTML-блок, который находил скрипт Твиттера и заменял на текст твита (и всякими полезными ссылками). Вот в этом <a href=\"https://github.com/vkostyanetsky/BlogBuilder/commit/c21ef8a7bec10672406e6be57b8e734ba3ac01c5\" target=\"_blank\">коммите</a> в целом видно, как это работало.</p>\n<p>Как это работает теперь? Ну да, никак. Твиттер в России заблокирован.</p>\n<p><img alt=\"Штош\" src=\"https://kostyanetsky.ru/notes/no-more-embedded-tweets/well.jpg\"/></p>\n<p>Пришлось поскринить все твиты, на которые я когда-то ссылался, и добавить их в заметки в виде картинок со ссылками. Кому нужен оригинал, тот найдёт способ перейти в Твиттер, а остальные, по крайней мере, могут прочитать текст.</p>\n<p>Пара слов про техническую сторону. Скринить каждый твит вручную мне было лень, поэтому я полез в сеть, обдумывая, как автоматизировать процесс. Сначала попадались только сервисы, готовые решить проблему за какие-то жалкие десять долларов (спасибо, как-нибудь в следующий раз), но потом я набрёл на идеальный <a href=\"https://github.com/privatenumber/snap-tweet\" target=\"_blank\">инструмент</a>: консольный скрипт для Node.js.</p>\n<p>Ничего лишнего. Чистый функционал. Ты ему — твит. Он тебе — картинку:</p>\n<blockquote>\n<p>npx snap-tweet https://twitter.com/PossumEveryHour/status/1506148678461014016</p>\n</blockquote>\n<p>И всё. Захотелось занести автору денег.</p>\n<p>Подумал, не прикрутить ли snap-tweet к скрипту сборки (чтобы было, как раньше: вставляешь ссылку на твит, а дальше оно само генерит картинку и кладёт куда надо). Решил, нафиг. Грубое попирание KISS, да и вообще... В мире и так хватает энтропии. Особенно, блин, сейчас.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "минус встроенные твиты 21 марта 2022 · блог вебдев node.js не успел я выпилить из блога google fonts, как пришлось отправить вдогонку встроенные твиты. как это работало раньше? хотел сослаться на твит — просто вставлял на него ссылку. скрипт сборки заменял её на html-блок, который находил скрипт твиттера и заменял на текст твита (и всякими полезными ссылками). вот в этом коммите в целом видно, как это работало. как это работает теперь? ну да, никак. твиттер в россии заблокирован. пришлось поскринить все твиты, на которые я когда-то ссылался, и добавить их в заметки в виде картинок со ссылками. кому нужен оригинал, тот найдёт способ перейти в твиттер, а остальные, по крайней мере, могут прочитать текст. пара слов про техническую сторону. скринить каждый твит вручную мне было лень, поэтому я полез в сеть, обдумывая, как автоматизировать процесс. сначала попадались только сервисы, готовые решить проблему за какие-то жалкие десять долларов (спасибо, как-нибудь в следующий раз), но потом я набрёл на идеальный инструмент : консольный скрипт для node.js. ничего лишнего. чистый функционал. ты ему — твит. он тебе — картинку: npx snap-tweet https://twitter.com/possumeveryhour/status/1506148678461014016 и всё. захотелось занести автору денег. подумал, не прикрутить ли snap-tweet к скрипту сборки (чтобы было, как раньше: вставляешь ссылку на твит, а дальше оно само генерит картинку и кладёт куда надо). решил, нафиг. грубое попирание kiss, да и вообще... в мире и так хватает энтропии. особенно, блин, сейчас.",
    "tags": [
      "blog",
      "webdev",
      "nodejs"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/do-not-confuse\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Смотри не перепутай\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>16 марта 2022</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Код с запашком</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p><img alt=\"Код\" src=\"https://kostyanetsky.ru/notes/do-not-confuse/do-not-confuse.png\"/></p>\n<p>Если вид операции — продажа товара или недвижимости, то открой общую форму AdvancesPickFormWithVAT с параметрами, описанными в структуре PickParameters. Колбеком будет метод EditPrepaymentOffsetEnd, описанный в этом же модуле; передай ему структуру AdditionalParameters. Форму нужно открыть так, чтобы она заблокировала весь интерфейс.</p>\n<p>А вот если вид операции — возврат поставщику, то открой общую форму AdvancesPickFormWithVAT с параметрами, описанными в структуре PickParameters. Колбеком будет метод EditPrepaymentOffsetEnd, описанный в этом же модуле; передай ему структуру AdditionalParameters. Форму нужно открыть так, чтобы она заблокировала весь интерфейс.</p>\n<p>Смотри не перепутай.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "смотри не перепутай 16 марта 2022 · 1с код с запашком если вид операции — продажа товара или недвижимости, то открой общую форму advancespickformwithvat с параметрами, описанными в структуре pickparameters. колбеком будет метод editprepaymentoffsetend, описанный в этом же модуле; передай ему структуру additionalparameters. форму нужно открыть так, чтобы она заблокировала весь интерфейс. а вот если вид операции — возврат поставщику, то открой общую форму advancespickformwithvat с параметрами, описанными в структуре pickparameters. колбеком будет метод editprepaymentoffsetend, описанный в этом же модуле; передай ему структуру additionalparameters. форму нужно открыть так, чтобы она заблокировала весь интерфейс. смотри не перепутай.",
    "tags": [
      "1c",
      "code-smell"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/no-more-google-fonts\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Минус Google Fonts\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>19 февраля 2022</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Блог</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Вебдев</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p><a href=\"https://twitter.com/PixelAmbacht/status/1494272370076536840\" target=\"_blank\"><img alt=\"Твит\" src=\"https://kostyanetsky.ru/notes/no-more-google-fonts/snap-tweet-PixelAmbacht-1494272370076536840.png\"/></a></p>\n<p>Год назад, блин. Ладно, всем привет! С вами Джонни Слоупок! Сегодня мы будем выпиливать из моего блога работу с Google Fonts. Я подгружал с него основной шрифт (PT Sans), но без кросс-доменного кэширования единственный смысл делать это дальше — если сервер, на котором работает сайт, слабоват и с гугла шрифты грузятся шустрее. </p>\n<p>В моем случае блог отдают сервера гитхаба, которые на производительность не жалуются, так что теперь PT Sans загружается прямо с них. И знаете что? Разница прямо драматическая. Если раньше при обновлении страницы была явно заметна задержка между загрузкой страницы и загрузкой шрифта, то теперь её невооруженным глазом не разобрать. Если у вас свой блог и хотите попробовать — вот тут есть классный <a href=\"https://google-webfonts-helper.herokuapp.com/fonts\" target=\"_blank\">сервис</a>, который решает задачу в несколько кликов.</p>\n<p>Не забудьте повесить звезду на <a href=\"https://github.com/majodev/google-webfonts-helper\" target=\"_blank\">репозиторий</a>!</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "минус google fonts 19 февраля 2022 · блог вебдев год назад, блин. ладно, всем привет! с вами джонни слоупок! сегодня мы будем выпиливать из моего блога работу с google fonts. я подгружал с него основной шрифт (pt sans), но без кросс-доменного кэширования единственный смысл делать это дальше — если сервер, на котором работает сайт, слабоват и с гугла шрифты грузятся шустрее. в моем случае блог отдают сервера гитхаба, которые на производительность не жалуются, так что теперь pt sans загружается прямо с них. и знаете что? разница прямо драматическая. если раньше при обновлении страницы была явно заметна задержка между загрузкой страницы и загрузкой шрифта, то теперь её невооруженным глазом не разобрать. если у вас свой блог и хотите попробовать — вот тут есть классный сервис , который решает задачу в несколько кликов. не забудьте повесить звезду на репозиторий !",
    "tags": [
      "blog",
      "webdev"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/totals-of-2021\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Итоги 2021-го\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>8 февраля 2022</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Поздновато я сел итоги подводить, да? Ну, предыдущие пара месяцев вышли, гм, плотными и у меня банально руки не доходили сесть и подумать. А сейчас я как раз в отпуске за 2021-й год — так что самое время. Пишу, типа, из прошлого.</p>\n<p>Выписывать каждую ачивку меня совершенно не тянет. Год точно вышел неплохим: я проделал уйму сложной работы над FirstBit ERP (писал новые модули, перепиливал существующие, давил баги, писал функциональные и нагрузочные тесты — да много чего было). Это хорошо сказалось и на самой конфе, и на делах компании. Кроме того, между делом я защитился на эксперта по 1С и на профессионала по PostgreSQL, гип-гип-ура.</p>\n<p>Были и фейлы, ну. Перечислять, опять же, лень, но главный провал — я чудовищно разжирел и вместо того, чтобы сбросить килограм десять (таков был изначальный план) — набрал ещё пяток.</p>\n<p>Оглядываясь назад, корень большинства проблем за прошлый год вижу так: я слишком сильно фокусировался на потоке задач. Они все были по-своему интересные, от тщательно проработанного ТЗ до челленджей в духе «найди в коде проблему, используя ведьмачье чутьё». Делаешь одну задачу, другую, третью, сотую и сам не замечаешь, что забил почти на всё, кроме работы. В итоге получаешь кучу опыта, но мир усыхает до окна с конфигуратором и сил как-то применять этот опыт нет. Нездоровая фигня.</p>\n<p>Короче, если представить меня как персонажа какой-нибудь видеоигры, выглядит так: атака и интеллект за год заметно выросли, но здоровье, подвижность, харизма и вообще почти всё остальное — поползло вниз. Теперь надо с этим всем что-то делать.</p>\n<p>Пойду для начала пробегусь километров десять, вот что!</p>\n<p><a href=\"https://twitter.com/EffinBirds/status/1329575199667347459\" target=\"_blank\"><img alt=\"Твит\" src=\"https://kostyanetsky.ru/notes/totals-of-2021/snap-tweet-EffinBirds-1329575199667347459.png\"/></a></p>\n<p>Возможно, птичка, возможно.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "итоги 2021-го 8 февраля 2022 · работа поздновато я сел итоги подводить, да? ну, предыдущие пара месяцев вышли, гм, плотными и у меня банально руки не доходили сесть и подумать. а сейчас я как раз в отпуске за 2021-й год — так что самое время. пишу, типа, из прошлого. выписывать каждую ачивку меня совершенно не тянет. год точно вышел неплохим: я проделал уйму сложной работы над firstbit erp (писал новые модули, перепиливал существующие, давил баги, писал функциональные и нагрузочные тесты — да много чего было). это хорошо сказалось и на самой конфе, и на делах компании. кроме того, между делом я защитился на эксперта по 1с и на профессионала по postgresql, гип-гип-ура. были и фейлы, ну. перечислять, опять же, лень, но главный провал — я чудовищно разжирел и вместо того, чтобы сбросить килограм десять (таков был изначальный план) — набрал ещё пяток. оглядываясь назад, корень большинства проблем за прошлый год вижу так: я слишком сильно фокусировался на потоке задач. они все были по-своему интересные, от тщательно проработанного тз до челленджей в духе «найди в коде проблему, используя ведьмачье чутьё». делаешь одну задачу, другую, третью, сотую и сам не замечаешь, что забил почти на всё, кроме работы. в итоге получаешь кучу опыта, но мир усыхает до окна с конфигуратором и сил как-то применять этот опыт нет. нездоровая фигня. короче, если представить меня как персонажа какой-нибудь видеоигры, выглядит так: атака и интеллект за год заметно выросли, но здоровье, подвижность, харизма и вообще почти всё остальное — поползло вниз. теперь надо с этим всем что-то делать. пойду для начала пробегусь километров десять, вот что! возможно, птичка, возможно.",
    "tags": [
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/reuse-carefully\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Переиспользуйте с осторожностью\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>8 февраля 2022</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Расскажу про смешной и немного стыдный кейс, который разбирал в январе. Суть в двух словах: где-то ближе к концу падает огромный автотест на Ванессе, проверяющий расчёт НДС.</p>\n<p>Начинаю расследовать. Первым делом смотрю на скрины в Аллюре: о'кей, причина очевидна — в одном из документов сдохло условное оформление для поля с суммой НДС. Тест ожидал, что оно будет недоступно, если ставка НДС равна нулю, а оно оказалось доступным.</p>\n<p>Непорядок, надо чинить. Смотрю на условие оформления в коде: ну, поле блокируется, если ссылка на ставку НДС есть в списке «нулевых» ставок (т.е. ставка в которых равна нулю). Всё просто и логично. Что тут, блин, могло сломаться?</p>\n<p><a href=\"https://twitter.com/EffinBirds/status/1489980393675702281\" target=\"_blank\"><img alt=\"Твит\" src=\"https://kostyanetsky.ru/notes/reuse-carefully/snap-tweet-EffinBirds-1489980393675702281.png\"/></a></p>\n<p>Ладно, лезу в документ ручками. А там внезапно всё тип-топ: оформление работает как надо. Плавающий баг, что ли? Запускаю автотест снова, в нужный момент вклиниваюсь с отладчиком и обнаруживаю какую-то откровенную фигню: в списке «нулевых» ставок, кроме них самих — пачка пустых ссылок! </p>\n<p>Откровенно чешу в затылке. Этот список документ получает из общего модуля, где лежит <a href=\"https://gist.github.com/vkostyanetsky/5ec036ee148606aad9caefbc9305bfb0\" target=\"_blank\">примерно такой код</a>. Пустую ссылку отсюда даже теоретически получить нельзя. Причем у модуля включено переиспользование возвращаемых значений и функция по факту выполняется один раз где-то в начале теста, до всех сложных манипуляций с данными. То есть тест, по идее, повлиять на неё никак не может.</p>\n<p>Тупик? Ну, опытные коллеги уже, наверное, обо всём догадались, но мне пришлось порядком потанцевать вокруг бага и даже залезть в <a href=\"https://its.1c.ru/db/v8std/content/724/hdoc\" target=\"_blank\">стандарт</a>, пока не дошло: <strong>кэш возвращаемых значений в 1С можно изменить</strong>. В смысле, не просто вызвать <code>ОбновитьПовторноИспользуемыеЗначения()</code>, а прямо вот ручками взять и поменять конкретные данные.</p>\n<p>Как? Ну, если вы тянете из общего модуля со включенным кэшированием какие-то значения и они не примитивного типа (строка, число и т.п.) — вы получите не само значение, а указатель на него где-то в памяти. Запишете этот указатель в переменную и попробуете поменять — поменяете кэш.</p>\n<p>Вот так просто, да. Это и произошло в моем случае: метод, формирующий список «нулевых» ставок, вызывала форма другого документа. Получив список значений, она непринужденно дописывала к нему пустую ссылку и использовала в своей логике. Таким образом, при каждом открытии этой формы кэш списка прирастал всё новыми и новыми пустыми ссылками, что в конце концов сломало документ на другом конце конфы.</p>\n<p><a href=\"https://twitter.com/EffinBirds/status/1488165946342662144\" target=\"_blank\"><img alt=\"Твит\" src=\"https://kostyanetsky.ru/notes/reuse-carefully/snap-tweet-EffinBirds-1488165946342662144.png\"/></a></p>\n<p>По-хорошему, платформе стоило бы швыряться исключениями при попытке поменять кэш, но пока этого не происходит — надо бить себя по рукам самостоятельно. Например, при разработке кэшируемых модулей возвращать из них неизменяемые типы данных (ФиксированнаяСтруктура вместо Структура, ФиксированныйМассив вместо Массив и так далее). Это, правда, не стопроцентная защита: во-первых, фиксированные типы не везде применимы, а во-вторых — даже в последних версиях БСП это делается далеко не везде. Много конфигураций сейчас пишется не на БСП?</p>\n<p>Сонар тоже пока не умеет ловить проблему, а про менее популярные средства я вообще молчу. Никакой серебрянной пули, короче — следим за своим кодом, поглядываем в код коллег и стараемся не забывать об ещё одном изящном способе бахнуть себе в ногу.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "переиспользуйте с осторожностью 8 февраля 2022 · 1с работа расскажу про смешной и немного стыдный кейс, который разбирал в январе. суть в двух словах: где-то ближе к концу падает огромный автотест на ванессе, проверяющий расчёт ндс. начинаю расследовать. первым делом смотрю на скрины в аллюре: о'кей, причина очевидна — в одном из документов сдохло условное оформление для поля с суммой ндс. тест ожидал, что оно будет недоступно, если ставка ндс равна нулю, а оно оказалось доступным. непорядок, надо чинить. смотрю на условие оформления в коде: ну, поле блокируется, если ссылка на ставку ндс есть в списке «нулевых» ставок (т.е. ставка в которых равна нулю). всё просто и логично. что тут, блин, могло сломаться? ладно, лезу в документ ручками. а там внезапно всё тип-топ: оформление работает как надо. плавающий баг, что ли? запускаю автотест снова, в нужный момент вклиниваюсь с отладчиком и обнаруживаю какую-то откровенную фигню: в списке «нулевых» ставок, кроме них самих — пачка пустых ссылок! откровенно чешу в затылке. этот список документ получает из общего модуля, где лежит примерно такой код . пустую ссылку отсюда даже теоретически получить нельзя. причем у модуля включено переиспользование возвращаемых значений и функция по факту выполняется один раз где-то в начале теста, до всех сложных манипуляций с данными. то есть тест, по идее, повлиять на неё никак не может. тупик? ну, опытные коллеги уже, наверное, обо всём догадались, но мне пришлось порядком потанцевать вокруг бага и даже залезть в стандарт , пока не дошло: кэш возвращаемых значений в 1с можно изменить . в смысле, не просто вызвать обновитьповторноиспользуемыезначения() , а прямо вот ручками взять и поменять конкретные данные. как? ну, если вы тянете из общего модуля со включенным кэшированием какие-то значения и они не примитивного типа (строка, число и т.п.) — вы получите не само значение, а указатель на него где-то в памяти. запишете этот указатель в переменную и попробуете поменять — поменяете кэш. вот так просто, да. это и произошло в моем случае: метод, формирующий список «нулевых» ставок, вызывала форма другого документа. получив список значений, она непринужденно дописывала к нему пустую ссылку и использовала в своей логике. таким образом, при каждом открытии этой формы кэш списка прирастал всё новыми и новыми пустыми ссылками, что в конце концов сломало документ на другом конце конфы. по-хорошему, платформе стоило бы швыряться исключениями при попытке поменять кэш, но пока этого не происходит — надо бить себя по рукам самостоятельно. например, при разработке кэшируемых модулей возвращать из них неизменяемые типы данных (фиксированнаяструктура вместо структура, фиксированныймассив вместо массив и так далее). это, правда, не стопроцентная защита: во-первых, фиксированные типы не везде применимы, а во-вторых — даже в последних версиях бсп это делается далеко не везде. много конфигураций сейчас пишется не на бсп? сонар тоже пока не умеет ловить проблему, а про менее популярные средства я вообще молчу. никакой серебрянной пули, короче — следим за своим кодом, поглядываем в код коллег и стараемся не забывать об ещё одном изящном способе бахнуть себе в ногу.",
    "tags": [
      "1c",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/infostart-event-2021\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Infostart Event 2021\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>16 ноября 2021</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">PostgreSQL</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>На прошлой неделе сгонял в Москву на <a href=\"https://event.infostart.ru/2021_msk/\" target=\"_blank\">Infostart Event 2021</a>:</p>\n<ul>\n<li>Послушать дюжину докладов о разработке и близких темах — check;</li>\n<li>Развиртуализоваться с несколькими классными людьми — check;</li>\n<li>Поболтать с друзьями — check!</li>\n</ul>\n<p>По итогу неожиданно почуствовал себя отдохнувшим — и это несмотря на перелёты, нервы и суету. Думаю, дело в том, что я удалёнщик; было по-настоящему здорово посмотреть на такое количество коллег вживую, а не в виде потока электронов.</p>\n<p>Чтобы два раза не <s>вставать</s> летать, сдал в офисе PostgresPro <a href=\"https://postgrespro.ru/education/exam/DBA1-10\" target=\"_blank\">входной тест</a> по администрированию PostgreSQL. Впереди ещё три, а финального пока вообще не существует — но дорогу осилит идущий, так вижу.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "infostart event 2021 16 ноября 2021 · 1с готово postgresql на прошлой неделе сгонял в москву на infostart event 2021 : послушать дюжину докладов о разработке и близких темах — check; развиртуализоваться с несколькими классными людьми — check; поболтать с друзьями — check! по итогу неожиданно почуствовал себя отдохнувшим — и это несмотря на перелёты, нервы и суету. думаю, дело в том, что я удалёнщик; было по-настоящему здорово посмотреть на такое количество коллег вживую, а не в виде потока электронов. чтобы два раза не вставать летать, сдал в офисе postgrespro входной тест по администрированию postgresql. впереди ещё три, а финального пока вообще не существует — но дорогу осилит идущий, так вижу.",
    "tags": [
      "1c",
      "done",
      "pgsql"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/matryoshka\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Матрёшка\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>30 октября 2021</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>На днях в чат команды кинули ссылку на сертификат 1Ci (коллега проходил их <a href=\"https://academy.1ci.com/courses/1c-junior-developer\" target=\"_blank\">курс</a> на джуна). Перехожу по ней — авторизации не требует, ошибки не выдает, браузер сразу загружает PDF. Всё идёт как надо, верно? Ладно, открываю файл:</p>\n<p><img alt=\"Error.pdf\" src=\"https://kostyanetsky.ru/notes/matryoshka/not-your-certificate.png\"/></p>\n<p>Честно? Я даже восхищён. Надо этот UX в наших продуктах внедрить: прожимаешь ты, например, печать документа, а он тебе — PDF! А в нём — ссылка на другой PDF! А в нём — entity is not filled, иди заполняй.</p>\n<p>Можно продать это как русский путь вывода ошибок: мол, у нас так исторически сложилось. Всё матрёшки виноваты, проклятые, и Кощей со своей иглой. Она, как вы помните, в яйце, а оно — в утке, которая в зайце, засунутом в сундук, и далее по цепочке вложенности.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "матрёшка 30 октября 2021 · 1с работа на днях в чат команды кинули ссылку на сертификат 1ci (коллега проходил их курс на джуна). перехожу по ней — авторизации не требует, ошибки не выдает, браузер сразу загружает pdf. всё идёт как надо, верно? ладно, открываю файл: честно? я даже восхищён. надо этот ux в наших продуктах внедрить: прожимаешь ты, например, печать документа, а он тебе — pdf! а в нём — ссылка на другой pdf! а в нём — entity is not filled, иди заполняй. можно продать это как русский путь вывода ошибок: мол, у нас так исторически сложилось. всё матрёшки виноваты, проклятые, и кощей со своей иглой. она, как вы помните, в яйце, а оно — в утке, которая в зайце, засунутом в сундук, и далее по цепочке вложенности.",
    "tags": [
      "1c",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/2nd-monitor-and-console\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Управление вторым монитором из консоли\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>16 октября 2021</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Рабочее место</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>У меня стоят два монитора. Второй нужен во время встреч в Zoom или при совместной игре с друзьями (в обеих случаях туда удобно вывести камеры собеседников). Есть ещё несколько примеров, когда он полезен, но часто устройство просто простаивает. Чтобы не отвлекало, решил его выключать.</p>\n<p>В чем тут засада: средствами ОС управлять вторым монитором неудобно (несколько кликов, скроллить надо, да ещё всё время путаю, куда лезть — в «Параметры экрана» или «Персонализацию»). Хотелось бы одной командой, а команду — на хоткей. И в идеале из скрипта всем этим рулить.</p>\n<p>Скрипта я не нашел, но накопал готовую утилиту — <a href=\"https://www.nirsoft.net/utils/multi_monitor_tool.html\" target=\"_blank\">MultiMonitorTool</a>. Бесплатная. Под десятой виндой работает без проблем. Команды ниже включают-выключают 2-й монитор:</p>\n<pre><code>MultiMonitorTool.exe /disable 2\nMultiMonitorTool.exe /enable 2  \nMultiMonitorTool.exe /switch 2\n</code></pre>\n<p>Почему-то при включении монитора через enable или switch он иногда неверно позиционируется (например, до выключения он был справа, а после включения встал слева). Это поправимо. Сначала запишем конфигурацию в тот момент, когда включены оба монитора:</p>\n<pre><code>MultiMonitorTool.exe /SaveConfig Monitors.cfg\n</code></pre>\n<p>А потом, когда нужно включить монитор — загрузим сохранённый конфиг:</p>\n<pre><code>MultiMonitorTool.exe /LoadConfig Monitors.cfg\n</code></pre>\n<p>Утилита ещё много чего умеет (например, одна из команд перекидывает окна приложений между мониторами). Описание — по ссылке выше.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "управление вторым монитором из консоли 16 октября 2021 · рабочее место у меня стоят два монитора. второй нужен во время встреч в zoom или при совместной игре с друзьями (в обеих случаях туда удобно вывести камеры собеседников). есть ещё несколько примеров, когда он полезен, но часто устройство просто простаивает. чтобы не отвлекало, решил его выключать. в чем тут засада: средствами ос управлять вторым монитором неудобно (несколько кликов, скроллить надо, да ещё всё время путаю, куда лезть — в «параметры экрана» или «персонализацию»). хотелось бы одной командой, а команду — на хоткей. и в идеале из скрипта всем этим рулить. скрипта я не нашел, но накопал готовую утилиту — multimonitortool . бесплатная. под десятой виндой работает без проблем. команды ниже включают-выключают 2-й монитор: multimonitortool.exe /disable 2 multimonitortool.exe /enable 2 multimonitortool.exe /switch 2 почему-то при включении монитора через enable или switch он иногда неверно позиционируется (например, до выключения он был справа, а после включения встал слева). это поправимо. сначала запишем конфигурацию в тот момент, когда включены оба монитора: multimonitortool.exe /saveconfig monitors.cfg а потом, когда нужно включить монитор — загрузим сохранённый конфиг: multimonitortool.exe /loadconfig monitors.cfg утилита ещё много чего умеет (например, одна из команд перекидывает окна приложений между мониторами). описание — по ссылке выше.",
    "tags": [
      "workplace"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/top-salaries\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Самые большие зарплаты\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>2 октября 2021</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <blockquote>\n<p>Есть путь до CSV-файла, надо его открыть, прочитать заголовок (первая строка), найти колонку Salary и вывести топ 10 зарплат.</p>\n<p><em><a href=\"https://t.me/nikitonsky_chat/26402\" target=\"_blank\">Ссылка</a></em></p>\n</blockquote>\n<p>Вбросил свои <a href=\"https://gist.github.com/tonsky/881d5d8c4fbed818fe2905a7591a91e0#file-vkostyanetsky-1c\" target=\"_blank\">пять копеек</a> просто для полноты картины. Если забить на стабильность, читаемость и производительность — можно усечь где-то вдвое. Тут с самого начала было очевидно, что на баше выйдет короче, а на питоне проще — так что просто написал как привык.</p>\n<p>Из полезного: в комментариях к сообщению куча примеров на других языках. С некоторыми вообще до сих пор не сталкивался; было реально любопытно посмотреть на синтаксис и попробовать понять подход.</p>\n<p>В целом история напомнила <a href=\"https://bolknote.ru/tags/beer99/\" target=\"_blank\">хобби</a> Евгения Степанищева — писать вывод американской «песни о пиве» на всех языках подряд. Задача с чтением CSV, кстати, мне тоже кажется скорее фаном — слишком узкий кейс, чтобы на его базе что-то всерьёз сравнивать.</p>\n<p>Из смешного: у пары <a href=\"https://t.me/nikitonsky_pub/201?comment=26703\" target=\"_blank\">коллег</a> язык 1С вызвал настолько острые проблемы со зрением, что они сочли нужным об этом сообщить :-) Отчасти понимаю желание самоутвердиться на стереотипе «1С — это плохо, понятненько?», но тут момент явно выбран неудачно. Предпочтения в синтаксисе — дело вкуса, а кроме них решение на 1С никак не отличается от решений на любом другом языке, где нет встроенной библиотеки для парсинга CSV.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "самые большие зарплаты 2 октября 2021 · 1с есть путь до csv-файла, надо его открыть, прочитать заголовок (первая строка), найти колонку salary и вывести топ 10 зарплат. ссылка вбросил свои пять копеек просто для полноты картины. если забить на стабильность, читаемость и производительность — можно усечь где-то вдвое. тут с самого начала было очевидно, что на баше выйдет короче, а на питоне проще — так что просто написал как привык. из полезного: в комментариях к сообщению куча примеров на других языках. с некоторыми вообще до сих пор не сталкивался; было реально любопытно посмотреть на синтаксис и попробовать понять подход. в целом история напомнила хобби евгения степанищева — писать вывод американской «песни о пиве» на всех языках подряд. задача с чтением csv, кстати, мне тоже кажется скорее фаном — слишком узкий кейс, чтобы на его базе что-то всерьёз сравнивать. из смешного: у пары коллег язык 1с вызвал настолько острые проблемы со зрением, что они сочли нужным об этом сообщить :-) отчасти понимаю желание самоутвердиться на стереотипе «1с — это плохо, понятненько?», но тут момент явно выбран неудачно. предпочтения в синтаксисе — дело вкуса, а кроме них решение на 1с никак не отличается от решений на любом другом языке, где нет встроенной библиотеки для парсинга csv.",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/build-on-github\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Сборка блога на GitHub\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>29 сентября 2021</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Блог</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Последний год этот сайт работал на простой связке: статика, гитхаб и свой домен. То есть все страницы были заранее сгенерированы и лежали в <a href=\"https://github.com/vkostyanetsky/kostyanetsky.ru-static\" target=\"_blank\">репе</a> гитхаба, к которой был подключен <a href=\"https://pages.github.com/\" target=\"_blank\">GitHub Pages</a>.</p>\n<p>Статику я собирал с помощью скрипта, на вход которому подавались педантично разложенные по папкам текстовые файлы с содержимым страниц. Скрипт рылся в них и генерил html-ки, которые я потом вручную перекладывал в репу.</p>\n<p>Эта схема, в общем, неплохо работала, но меня раздражало количество кликов. Здесь скрипт дерни, там скрипт дерни, потом ещё с гитом повозиться надо. Хотелось бы попроще.</p>\n<p>В какой-то момент до меня дошло, что на плечи гитхаба можно переложить не только деплой статики, но и саму сборку. Я поворочал мозгами и добавил к репозиторию со статикой ещё два:</p>\n<ol>\n<li><a href=\"https://github.com/vkostyanetsky/kostyanetsky.ru\" target=\"_blank\">Репозиторий</a> исходных данных. Сюда я положил контент сайта: те самые текстовые файлы и чуть-чуть метаданных (заголовки страниц, даты их создания, теги для заметок и так далее).</li>\n<li><a href=\"https://github.com/vkostyanetsky/BlogBuilder\" target=\"_blank\">Репозиторий</a> скрипта для генерации статики. Кроме самого скрипта, сюда я засунул разные ассеты (иконки, стили, манифесты — в общем, всё, что не нужно каждый раз генерировать, а можно просто «положить» рядом с получившимися html-ками).</li>\n</ol>\n<p>Потом я накатал <a href=\"https://github.com/vkostyanetsky/kostyanetsky.ru/blob/main/.github/workflows/main.yml\" target=\"_blank\">экшен</a>, который просыпается при каждом пуше в репу с исходными данными. Вкратце, его логика:</p>\n<ol>\n<li>Клонировать репу со статикой и репу с генератором;</li>\n<li>Обновить репу со статикой с помощью генератора;</li>\n<li>Запушить изменения репы со статикой в мейн;</li>\n<li>Написать хозяину (мне) в телегу.</li>\n</ol>\n<p>Вуаля! Теперь при любом изменении репозитория с исходными данными гитхаб немедленно (ну, как немедленно — в пределах минуты) обновляет репозиторий с готовым сайтом и деплоит его оттуда через GitHub Pages. Бонусом — веб-интерфейс для правки страниц сайта (собственно, сайт гитхаба). Почти чистый No Code :-)</p>\n<p>Чтобы два раза не вставать, я добавил ссылки для правки страниц прямо на сайт (карандаш в верхнем правом углу). Это задумано как удобство для меня, но вообще отправить PR может любой, кто, например, найдёт опечатку. Заранее спасибо!</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "сборка блога на github 29 сентября 2021 · блог готово последний год этот сайт работал на простой связке: статика, гитхаб и свой домен. то есть все страницы были заранее сгенерированы и лежали в репе гитхаба, к которой был подключен github pages . статику я собирал с помощью скрипта, на вход которому подавались педантично разложенные по папкам текстовые файлы с содержимым страниц. скрипт рылся в них и генерил html-ки, которые я потом вручную перекладывал в репу. эта схема, в общем, неплохо работала, но меня раздражало количество кликов. здесь скрипт дерни, там скрипт дерни, потом ещё с гитом повозиться надо. хотелось бы попроще. в какой-то момент до меня дошло, что на плечи гитхаба можно переложить не только деплой статики, но и саму сборку. я поворочал мозгами и добавил к репозиторию со статикой ещё два: репозиторий исходных данных. сюда я положил контент сайта: те самые текстовые файлы и чуть-чуть метаданных (заголовки страниц, даты их создания, теги для заметок и так далее). репозиторий скрипта для генерации статики. кроме самого скрипта, сюда я засунул разные ассеты (иконки, стили, манифесты — в общем, всё, что не нужно каждый раз генерировать, а можно просто «положить» рядом с получившимися html-ками). потом я накатал экшен , который просыпается при каждом пуше в репу с исходными данными. вкратце, его логика: клонировать репу со статикой и репу с генератором; обновить репу со статикой с помощью генератора; запушить изменения репы со статикой в мейн; написать хозяину (мне) в телегу. вуаля! теперь при любом изменении репозитория с исходными данными гитхаб немедленно (ну, как немедленно — в пределах минуты) обновляет репозиторий с готовым сайтом и деплоит его оттуда через github pages. бонусом — веб-интерфейс для правки страниц сайта (собственно, сайт гитхаба). почти чистый no code :-) чтобы два раза не вставать, я добавил ссылки для правки страниц прямо на сайт (карандаш в верхнем правом углу). это задумано как удобство для меня, но вообще отправить pr может любой, кто, например, найдёт опечатку. заранее спасибо!",
    "tags": [
      "blog",
      "done"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/diablo\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Diablo\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>22 сентября 2021</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/kVd6qeWoAxg\" width=\"560\"></iframe>\n<p>Хороший выпуск айтишного подкаста «Мы обречены» про выгорание разработчиков. Особых откровений нет, но что-то полезное для себя подчерпнуть можно. Очень понравилась аналогия с видеоиграми где-то ближе к середине:</p>\n<blockquote>\n<p>Была такая игра — Diablo. Бегаешь ты там, RPG, всякие спеллы. У персонажа есть мана и здоровье, и когда у тебя маны на каст… Ха, звучу как задрот! Ну ладно. В общем, когда у тебя маны на каст не хватает, она у тебя начинает из здоровья браться.</p>\n<p><em>— Доктор Кот</em></p>\n</blockquote>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "diablo 22 сентября 2021 · работа видеоигры хороший выпуск айтишного подкаста «мы обречены» про выгорание разработчиков. особых откровений нет, но что-то полезное для себя подчерпнуть можно. очень понравилась аналогия с видеоиграми где-то ближе к середине: была такая игра — diablo. бегаешь ты там, rpg, всякие спеллы. у персонажа есть мана и здоровье, и когда у тебя маны на каст… ха, звучу как задрот! ну ладно. в общем, когда у тебя маны на каст не хватает, она у тебя начинает из здоровья браться. — доктор кот",
    "tags": [
      "work",
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/hammer-and-nails\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Про молоток и гвозди\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>15 сентября 2021</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Код с запашком</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>На днях допиливал платежные документы в нашей конфигурации и наткнулся на невероятно избыточное решение примитивной задачи. Простите, не  могу держать в себе.</p>\n<p>Вот есть у вас документ, да? В нём — несколько табличных частей. В каждой — поле для комментария. Делаете вы для этого документа печатную форму; если хотя бы в одной строке любой ТЧ есть комментарий — нужно использовать один шаблон, если комментариев нет — другой.</p>\n<p>Задача примитивная, все мы миллион раз такое делали — ну, смотрим в выборку строк, натравливаем ПустаяСтрока() на нужное поле и грузим подходящий шаблон. Готово, можно пить кофе!</p>\n<p>Однако, вместо короткого цикла я увидел это:</p>\n<script src=\"https://gist.github.com/vkostyanetsky/e870d5bb3d2f23d93f3d17001eaef59b.js\">Gist</script>\n<p>Ну то есть да, делаем матрешку из подзапросов, в самом нижнем из которых роемся в ТЧ (которые мы, напомню, только что выгребали для вывода на печатную форму). Ищем в них комментарии, если есть — ставим единичку. Нет? Нолик. Итог несколько раз группируем и возвращаем в скрипт.</p>\n<p>Я сейчас даже не про нагрузку на СУБД (рискну предположить, что заметного эффекта этот трюк не дает — в конце концов, после отбора по ссылке выборка будет копеечной). Просто… Ну… Чекнуть выборку строк — пять строк кода. Понятных, простых, коротких, Сонару ругнуться негде. Как можно было родить вот это? Из большой любви к запросам? </p>\n<p>А ведь что-то в этом духе и было, скорее всего. Я почти вижу его, этого кодера, который только что более-менее сносно освоил запросы и пребывает в перманентном восторге от новых возможностей. А когда в руках есть клёвый блестящий молоток, всё вокруг кажется гвоздями.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "про молоток и гвозди 15 сентября 2021 · 1с работа код с запашком на днях допиливал платежные документы в нашей конфигурации и наткнулся на невероятно избыточное решение примитивной задачи. простите, не могу держать в себе. вот есть у вас документ, да? в нём — несколько табличных частей. в каждой — поле для комментария. делаете вы для этого документа печатную форму; если хотя бы в одной строке любой тч есть комментарий — нужно использовать один шаблон, если комментариев нет — другой. задача примитивная, все мы миллион раз такое делали — ну, смотрим в выборку строк, натравливаем пустаястрока() на нужное поле и грузим подходящий шаблон. готово, можно пить кофе! однако, вместо короткого цикла я увидел это: ну то есть да, делаем матрешку из подзапросов, в самом нижнем из которых роемся в тч (которые мы, напомню, только что выгребали для вывода на печатную форму). ищем в них комментарии, если есть — ставим единичку. нет? нолик. итог несколько раз группируем и возвращаем в скрипт. я сейчас даже не про нагрузку на субд (рискну предположить, что заметного эффекта этот трюк не дает — в конце концов, после отбора по ссылке выборка будет копеечной). просто… ну… чекнуть выборку строк — пять строк кода. понятных, простых, коротких, сонару ругнуться негде. как можно было родить вот это? из большой любви к запросам? а ведь что-то в этом духе и было, скорее всего. я почти вижу его, этого кодера, который только что более-менее сносно освоил запросы и пребывает в перманентном восторге от новых возможностей. а когда в руках есть клёвый блестящий молоток, всё вокруг кажется гвоздями.",
    "tags": [
      "1c",
      "work",
      "code-smell"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/no-comment\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Без комментариев\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>8 сентября 2021</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Код с запашком</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Сам не заметил, как бросил привычку педантично комментировать каждый метод, с которым приходится работать. Наверняка у этой практики есть какое-нибудь умное название, но мне нет дела, если честно. Я имею в виду стиль, когда описание добавляют к каждому осмысленному блоку кода:</p>\n<script src=\"https://gist.github.com/vkostyanetsky/afae4dee09d639f34156d6c02b29c2a5.js\">Gist</script>\n<p>Смысл тут простой: когда копаешься в каком-нибудь дремучем легаси и бегаешь туда-сюда между хаотично раскиданными процедурами на три экрана каждая — логику каждой из них держать в голове довольно трудно. Первая же чашка кофе всё смоет. Поэтому такие заметки на полях здорово ускоряют ориентацию на местности, и чем больше времени проходит между подходами к коду — тем заметнее эффект.</p>\n<p>Однако в какой-то момент стало понятно, что это ноу-хау — просто костыль, подпирающий откровенно хреновый дизайн кода. Попалась тебе длинная процедура или функция — вздохни, сядь и нарежь толстяка на методы поменьше. Сэкономишь и время, и нервы, и в коде разберешься быстрее, и Сонар порадуешь.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "без комментариев 8 сентября 2021 · 1с код с запашком сам не заметил, как бросил привычку педантично комментировать каждый метод, с которым приходится работать. наверняка у этой практики есть какое-нибудь умное название, но мне нет дела, если честно. я имею в виду стиль, когда описание добавляют к каждому осмысленному блоку кода: смысл тут простой: когда копаешься в каком-нибудь дремучем легаси и бегаешь туда-сюда между хаотично раскиданными процедурами на три экрана каждая — логику каждой из них держать в голове довольно трудно. первая же чашка кофе всё смоет. поэтому такие заметки на полях здорово ускоряют ориентацию на местности, и чем больше времени проходит между подходами к коду — тем заметнее эффект. однако в какой-то момент стало понятно, что это ноу-хау — просто костыль, подпирающий откровенно хреновый дизайн кода. попалась тебе длинная процедура или функция — вздохни, сядь и нарежь толстяка на методы поменьше. сэкономишь и время, и нервы, и в коде разберешься быстрее, и сонар порадуешь.",
    "tags": [
      "1c",
      "code-smell"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/slow-notification\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Медленное оповещение\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>18 августа 2021</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Оптимизация</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p><a href=\"https://twitter.com/iamhellcat/status/1427626118635470866\" target=\"_blank\"><img alt=\"Твит\" src=\"https://kostyanetsky.ru/notes/slow-notification/snap-tweet-iamhellcat-1427626118635470866.png\"/></a></p>\n<p>Прочитал этот твит и внезапно вспомнил случай из практики. Прилетает запрос от клиента — мол, 1С тормозит, сделайте что-нибудь. Уточняем: тормозит всё-таки не вся 1С, а конкретная операция.</p>\n<p>База клиента — переписанная УТ, проблемная операция — из блока доработок. Внутри — множество многоэтажных запросов, возня с таблицами значений, какие-то невнятные вычисления и пачка серверных процедур по семьсот строк каждая. Копию базы снять нельзя, ТЖ недоступен, доступ к СУБД закрыт, доступ к счётчикам — тоже. Отладка на сервере 1С выключена, включить — не вариант.</p>\n<p>Бардак, в общем. Как понять, где тут всё вязнет? Ладно, конфигурацию можно менять — уже неплохо. Вешаю на операцию замер: ну да, думает над чем-то пару минут. Отлично! Потираю ручки и сужаю область поиска: докидываю целый ворох замеров на самые подозрительные участки.</p>\n<p>Результат любопытный: тормозов нет! Код не то чтобы летает, но о минутах и речи нет — с учетом сложности, расходы в пределах допустимого. Может, какая-то сериализация данных между клиентом и сервером? Тщательно выверяю код серверной процедуры — нет, никакой трансляции. Всё, что было на сервере, осталось на сервере.</p>\n<p>Перехожу к клиентской части. Что тут может тормозить-то?.. Выглядел код, упрощая, как-то так:</p>\n<script src=\"https://gist.github.com/vkostyanetsky/df0b17526991bbac3b3df1c75dfa154f.js\">Gist</script>\n<p>Смотрел я на этот код, как баран, минут десять. В конце концов спросил коллегу и он рассказал удивительную вещь: оказывается, Оповестить() не просто рассылает оповещения во все открытые формы, а <strong>ждёт</strong>, когда в них завершится обработчик оповещения.</p>\n<p>Я знатно офигел, полез проверять и в конце концов наткнулся на форму, которая ловила событие выполнение операции и подрывалась обновлять свои динамические списки. Запрос в одном из них и давал тормоза (там подзапрос к подзапросу к подзапросу и ворох соединений «через точку» — в общем, дальше не интересно).</p>\n<p>Такая вот яломиште :-) Оповещайте с осторожностью!</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "медленное оповещение 18 августа 2021 · 1с работа оптимизация прочитал этот твит и внезапно вспомнил случай из практики. прилетает запрос от клиента — мол, 1с тормозит, сделайте что-нибудь. уточняем: тормозит всё-таки не вся 1с, а конкретная операция. база клиента — переписанная ут, проблемная операция — из блока доработок. внутри — множество многоэтажных запросов, возня с таблицами значений, какие-то невнятные вычисления и пачка серверных процедур по семьсот строк каждая. копию базы снять нельзя, тж недоступен, доступ к субд закрыт, доступ к счётчикам — тоже. отладка на сервере 1с выключена, включить — не вариант. бардак, в общем. как понять, где тут всё вязнет? ладно, конфигурацию можно менять — уже неплохо. вешаю на операцию замер: ну да, думает над чем-то пару минут. отлично! потираю ручки и сужаю область поиска: докидываю целый ворох замеров на самые подозрительные участки. результат любопытный: тормозов нет! код не то чтобы летает, но о минутах и речи нет — с учетом сложности, расходы в пределах допустимого. может, какая-то сериализация данных между клиентом и сервером? тщательно выверяю код серверной процедуры — нет, никакой трансляции. всё, что было на сервере, осталось на сервере. перехожу к клиентской части. что тут может тормозить-то?.. выглядел код, упрощая, как-то так: смотрел я на этот код, как баран, минут десять. в конце концов спросил коллегу и он рассказал удивительную вещь: оказывается, оповестить() не просто рассылает оповещения во все открытые формы, а ждёт , когда в них завершится обработчик оповещения. я знатно офигел, полез проверять и в конце концов наткнулся на форму, которая ловила событие выполнение операции и подрывалась обновлять свои динамические списки. запрос в одном из них и давал тормоза (там подзапрос к подзапросу к подзапросу и ворох соединений «через точку» — в общем, дальше не интересно). такая вот яломиште :-) оповещайте с осторожностью!",
    "tags": [
      "1c",
      "work",
      "optimization"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/pavel-chistov-passed-away\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Умер Павел Чистов\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>1 августа 2021</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Павел Чистов в пятницу вечером умер из-за сердечной недостаточности. Если вы не знаете, кто это — вот <a href=\"https://infostart.ru/journal/news/news/ushel-iz-zhizni-pavel-chistov_1490373/\" target=\"_blank\">некролог</a>. Впрочем, раз вы читаете этот блог — скорее всего, знаете.</p>\n<p><a href=\"https://t.me/nixel2007_thoughts/205\" target=\"_blank\">Никита Грызлов</a>, <a href=\"https://t.me/ilyaleontyevpro1c/38946\" target=\"_blank\">Илья Леонтьев</a> и <a href=\"https://t.me/cio2cdto/514\" target=\"_blank\">Сергей Горшенин</a> собирают деньги для помощи семье Павла. Кроме того, номер карты его вдовы есть в конце некролога по ссылке выше.</p>\n<p>Берегите себя, пожалуйста.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "умер павел чистов 1 августа 2021 · 1с павел чистов в пятницу вечером умер из-за сердечной недостаточности. если вы не знаете, кто это — вот некролог . впрочем, раз вы читаете этот блог — скорее всего, знаете. никита грызлов , илья леонтьев и сергей горшенин собирают деньги для помощи семье павла. кроме того, номер карты его вдовы есть в конце некролога по ссылке выше. берегите себя, пожалуйста.",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/longest-queries-using-python\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Поиск долгих запросов с помощью Python\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>18 июля 2021</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Bash</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Python</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Выложил <a href=\"https://github.com/vkostyanetsky/ScriptsFor1C/blob/master/Технологический журнал/LongestQueries.py\" target=\"_blank\">скрипт на Python</a> для поиска длительных запросов в ТЖ 1С. Накатал его в приступе отчаяния: никак не мог понять, почему мой <a href=\"https://github.com/vkostyanetsky/ScriptsFor1C/blob/master/Технологический журнал/LongestQueries.sh\" target=\"_blank\">верный баш</a> для одного из запросов выдаёт среднее время выполнения больше максимального.</p>\n<p>Как выяснилось, проблема была в gawk. Для некоторых событий ТЖ эта утилита не могла определить длительность: пыталась преобразовать строку в число, фейлилась и… Нет, что вы! Конечно, не кидалась исключением! Просто невозмутимо считала эти строки за ноль и ехала дальше.</p>\n<p>Патч, кстати, вышел ещё глупее проблемы: я просто <a href=\"https://github.com/vkostyanetsky/ScriptsFor1C/commit/946f271d6ea0c1e618b180cee11ae91ce4632c18\" target=\"_blank\">сделал</a> явное преобразование строки в число, и всё заработало как надо. Чем, блин, явное преобразование в мире gawk'а отличается от неявного? И, главное, почему?</p>\n<p>Короче, цирк уехал, новый скрипт остался. Впрочем, он бережнее расходует память и процессор: в скрипте на баше для расчёта количества выполнений запроса, суммарного времени выполнения и максимального времени одного выполнения я использовал три коллекции, у каждой из которых ключом был текст запроса и его контекст. Соответственно, все три нужно было обновлять и держать в памяти.</p>\n<p>Это вполне рабочая тактика, пока входящий поток не переваливает за сотни тысяч элементов: где-то тут мы начинаем терять гигабайты ОЗУ на хранении коллекций и прорву времени процессора на поиске в них. Новый скрипт попрямее: коллекция одна, но хранит всe данные по каждому запросу.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "поиск долгих запросов с помощью python 18 июля 2021 · 1с bash python выложил скрипт на python для поиска длительных запросов в тж 1с. накатал его в приступе отчаяния: никак не мог понять, почему мой верный баш для одного из запросов выдаёт среднее время выполнения больше максимального. как выяснилось, проблема была в gawk. для некоторых событий тж эта утилита не могла определить длительность: пыталась преобразовать строку в число, фейлилась и… нет, что вы! конечно, не кидалась исключением! просто невозмутимо считала эти строки за ноль и ехала дальше. патч, кстати, вышел ещё глупее проблемы: я просто сделал явное преобразование строки в число, и всё заработало как надо. чем, блин, явное преобразование в мире gawk'а отличается от неявного? и, главное, почему? короче, цирк уехал, новый скрипт остался. впрочем, он бережнее расходует память и процессор: в скрипте на баше для расчёта количества выполнений запроса, суммарного времени выполнения и максимального времени одного выполнения я использовал три коллекции, у каждой из которых ключом был текст запроса и его контекст. соответственно, все три нужно было обновлять и держать в памяти. это вполне рабочая тактика, пока входящий поток не переваливает за сотни тысяч элементов: где-то тут мы начинаем терять гигабайты озу на хранении коллекций и прорву времени процессора на поиске в них. новый скрипт попрямее: коллекция одна, но хранит всe данные по каждому запросу.",
    "tags": [
      "1c",
      "bash",
      "python"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/why-not-bash\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Почему не баш?\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>3 июля 2021</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Bash</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Python</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>В прошлой заметке я говорил о задачах, для решения которых баш — идеальный инструмент: минимум ограничений, простые условия — и оговорился, что иногда он вообще не справляется.</p>\n<p>Чтобы не быть голословным, давайте пример из практики. Есть, скажем, порядка семидесяти гигабайт логов ТЖ 1С, по которым нужно построить топ пояснений к исключениям — от самых частотных к менее частотным.</p>\n<p>Плёвое дело, верно? Выгребаем EXCP, извлекаем Descr, считаем повторения. Даже нужный <a href=\"https://github.com/vkostyanetsky/ScriptsFor1C/blob/master/Технологический журнал/FrequentExceptions.sh\" target=\"_blank\">скрипт</a> я как-то уже писал. Запускаю, терпеливо жду…</p>\n<p>Знаете, сколько понадобилось времени? Я тоже нет: после того, как скрипт проработал сутки, я его вырубил и полез разбираться, в чём проблема. Затык возник где-то в скрипте gawk'а: именно она активно нагружала процессор (если не считать cat'а, которая время от времени читала очередную порцию данных).</p>\n<p><img alt=\"Процессы\" src=\"https://kostyanetsky.ru/notes/why-not-bash/procexp64.png\"/></p>\n<p>Беда, беда, огорчение! В общем, я подумал и <a href=\"https://github.com/vkostyanetsky/ScriptsFor1C/blob/master/Технологический журнал/FrequentExceptions.py\" target=\"_blank\">переписал</a> этот скрипт на Питоне. Новая версия отработала за 15 минут и дала мне:</p>\n<ol>\n<li>Топ пояснений по событиям исключений;</li>\n<li>Скрипт, который можно прочитать через полгода без помощи гугла;</li>\n<li>Уверенность, что я могу добавить в скрипт два-три условия и не вызвать Сатану случайным сочетанием операторов и ключей.</li>\n</ol>\n<p>Конечно, я мог оптимизировать версию на баше. Вероятно, тормозит поиск в массиве — время, необходимое для поиска пояснения в массиве уже зафиксированных пояснений, линейно растет с увеличением размера массива. Можно, например, попробовать изменить подход к сбору данных — gawk'ом только извлекать сами пояснения, а результат сбора передать в тандем sort &amp; uniq.</p>\n<p>Однако это уже отчётливо отдаёт <a href=\"https://kostyanetsky.ru/notes/why-not-bash/but-why.jpg\" target=\"_blank\">мемасом</a> про буханку хлеба: из неё, конечно, можно сделать троллейбус, просто не очень понятно — зачем? Камон, мне бы проблему решить. А Питон с ней уже справился на твердую пятёрку, чем сэкономил мне кучу времени и нервов.</p>\n<p>Собственно, к этому я вел. Родовые травмы баша понятны и нередко приемлемы, плюсы — приятны и очевидны, но при работе с ним вопрос иногда встает так: cтоит ли только ради того, чтобы получить решение именно на баше, потратить часа два на возню с утилитами, параметрами, мануалами и постами на Stack Overflow? </p>\n<p><a href=\"https://twitter.com/EffinBirds/status/1408560771877965825\" target=\"_blank\"><img alt=\"Твит\" src=\"https://kostyanetsky.ru/notes/why-not-bash/snap-tweet-EffinBirds-1408560771877965825.png\"/></a></p>\n<p>Вот поэтому не баш, да.</p>\n<p>UPD: Хорошая <a href=\"https://grishaev.me/no-bash/\" target=\"_blank\">заметка</a> Ивана Гришаева на ту же тему.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "почему не баш? 3 июля 2021 · 1с bash python в прошлой заметке я говорил о задачах, для решения которых баш — идеальный инструмент: минимум ограничений, простые условия — и оговорился, что иногда он вообще не справляется. чтобы не быть голословным, давайте пример из практики. есть, скажем, порядка семидесяти гигабайт логов тж 1с, по которым нужно построить топ пояснений к исключениям — от самых частотных к менее частотным. плёвое дело, верно? выгребаем excp, извлекаем descr, считаем повторения. даже нужный скрипт я как-то уже писал. запускаю, терпеливо жду… знаете, сколько понадобилось времени? я тоже нет: после того, как скрипт проработал сутки, я его вырубил и полез разбираться, в чём проблема. затык возник где-то в скрипте gawk'а: именно она активно нагружала процессор (если не считать cat'а, которая время от времени читала очередную порцию данных). беда, беда, огорчение! в общем, я подумал и переписал этот скрипт на питоне. новая версия отработала за 15 минут и дала мне: топ пояснений по событиям исключений; скрипт, который можно прочитать через полгода без помощи гугла; уверенность, что я могу добавить в скрипт два-три условия и не вызвать сатану случайным сочетанием операторов и ключей. конечно, я мог оптимизировать версию на баше. вероятно, тормозит поиск в массиве — время, необходимое для поиска пояснения в массиве уже зафиксированных пояснений, линейно растет с увеличением размера массива. можно, например, попробовать изменить подход к сбору данных — gawk'ом только извлекать сами пояснения, а результат сбора передать в тандем sort & uniq. однако это уже отчётливо отдаёт мемасом про буханку хлеба: из неё, конечно, можно сделать троллейбус, просто не очень понятно — зачем? камон, мне бы проблему решить. а питон с ней уже справился на твердую пятёрку, чем сэкономил мне кучу времени и нервов. собственно, к этому я вел. родовые травмы баша понятны и нередко приемлемы, плюсы — приятны и очевидны, но при работе с ним вопрос иногда встает так: cтоит ли только ради того, чтобы получить решение именно на баше, потратить часа два на возню с утилитами, параметрами, мануалами и постами на stack overflow? вот поэтому не баш, да. upd: хорошая заметка ивана гришаева на ту же тему.",
    "tags": [
      "1c",
      "bash",
      "python"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/why-bash\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Почему баш?\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>23 июня 2021</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Bash</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Python</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Периодически вижу вопросы коллег: а что, 1С всё ещё носится с башем, да? А чё не пайтон-то? Или павершелл, на худой конец? Вот чудаки!</p>\n<p>Да, баш не родной для Windows (которая, напротив, родная для 1С) и притащить его туда — отдельная история; да, при усложнении задачи читаемость скрипта падает по экспоненте; да, с некоторыми задачами баш просто не справляется.</p>\n<p>Однако главный плюс баша в том, что для многих задач по анализу ТЖ 1С он — самое простое и быстрое решение. Как старая отвертка, которой ещё дед пользовался. Она всегда под рукой — пусть поцарапанная, с зазубринами и слегка корявая, но всё еще прекрасно работает.</p>\n<p>Пример? Допустим, нужно выгрести из ТЖ исключения; простоты ради договоримся, что достаточно первой строки каждого события. Получим <a href=\"https://gist.github.com/vkostyanetsky/f95b30e2f09edd64d9e7a39575bb289a\" target=\"_blank\">примерно такой</a> скрипт на пайтоне. </p>\n<p>Скажете, его можно легко сократить вдвое? А то и втрое. В конце концов, мы решаем локальную задачу. Возня с читаемостью и предсказуемостью тут ни к чему.</p>\n<p>Согласен! Но давайте сначала решим ту же задачу на баше:</p>\n<pre><code>grep -r --include \"*.log\" ',EXCP,' &gt; result.txt\n</code></pre>\n<p>Вот почему баш.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "почему баш? 23 июня 2021 · 1с bash python периодически вижу вопросы коллег: а что, 1с всё ещё носится с башем, да? а чё не пайтон-то? или павершелл, на худой конец? вот чудаки! да, баш не родной для windows (которая, напротив, родная для 1с) и притащить его туда — отдельная история; да, при усложнении задачи читаемость скрипта падает по экспоненте; да, с некоторыми задачами баш просто не справляется. однако главный плюс баша в том, что для многих задач по анализу тж 1с он — самое простое и быстрое решение. как старая отвертка, которой ещё дед пользовался. она всегда под рукой — пусть поцарапанная, с зазубринами и слегка корявая, но всё еще прекрасно работает. пример? допустим, нужно выгрести из тж исключения; простоты ради договоримся, что достаточно первой строки каждого события. получим примерно такой скрипт на пайтоне. скажете, его можно легко сократить вдвое? а то и втрое. в конце концов, мы решаем локальную задачу. возня с читаемостью и предсказуемостью тут ни к чему. согласен! но давайте сначала решим ту же задачу на баше: grep -r --include \"*.log\" ',excp,' > result.txt вот почему баш.",
    "tags": [
      "1c",
      "bash",
      "python"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/metadata-not-found\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Метаданные не найдены\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>8 июня 2021</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p><img alt=\"Метаданные не найдены\" src=\"https://kostyanetsky.ru/notes/metadata-not-found/error-ru.png\"/></p>\n<p>Думаю, с этой ошибкой мало кто сталкивался. Для этого, во-первых, нужно работать со встроенной в платформу историей данных, а она не больно-то популярна: кто-то привязан к БСП (она пока использует привычное всем версионирование на регистрах сведений), кому-то не нравится реализация — там и правда не всё гладко с точки зрения производительности.</p>\n<p>Во-вторых, нужно сделать так: выключить историю данных для объекта метаданных, а потом грохнуть накопленные версии объектов <strong>до того</strong>, как новые изменения объекта перекочуют из буфера в основную таблицу.</p>\n<p>В двух словах о том, как вообще работает история данных. По дефолту она выключена, и достаточно привилегированный пользователь может включить её для нужных ему объектов — констант, справочников, документов и так далее. После этого при изменении данных в этих объектах платформа будет фиксировать, что именно меняется. Делает она это в два этапа: сначала — относительно быстрая запись в промежуточный буфер (таблицу _DataHistoryQueue0); потом, при вызове метода ОбновитьИсторию(), информация мигрирует в основное хранилище версий (таблицу _DataHistoryVersions) и становится доступна в интерфейсе приложения.</p>\n<p>Обновление истории можно делать сразу при записи, но для сокращения транзакции его обычно выносят в регламентное задание. В итоге миграция данных из буфера в основную таблицу происходит с некоторой периодичностью: например, раз в пять минут. Так вот, если между изменением данных объекта и обновлением истории данных выключить историю объекта и удалить его версии — метод ОбновитьИсторию() выкинет исключение: он попытается переместить изменения из буфера в основную таблицу, но не сможет привязать их к уже накопленным данным.</p>\n<p>Для наглядности — <a href=\"https://gist.github.com/vkostyanetsky/ca766fe281425953e0e2bbfe12fc70e2\" target=\"_blank\">рабочий код</a>, воспроизводящий проблему для справочника Items на платформе 8.3.17.1989. Можете подставить любой другой объект, с которым работает история данных — разницы нет. </p>\n<p><strong>Как избежать этой ошибки?</strong> Ну, очевидно: метод ОбновитьИсторию() нужно вызывать непосредственно перед тем, как отключать историю для объекта. Лучше всего делать это в период, когда пользователи с системой не работают: есть риск, что между обновлением истории и её выключением вклинятся чьи-то транзакции, которые спровоцируют ту же проблему. Для гарантии можно использовать монопольный режим.</p>\n<p>Ещё в голову приходит исключительная блокировка на таблицу объекта, но документация не советует вызывать метод ОбновитьИсторию() внутри транзакций — так что тут я не уверен.</p>\n<p><strong>Как исправить эту ошибку?</strong> Включите историю данных для проблемного объекта, обновите историю и выключите её обратно. Выйдите, так сказать, из класса и зайдите нормально.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "метаданные не найдены 8 июня 2021 · 1с думаю, с этой ошибкой мало кто сталкивался. для этого, во-первых, нужно работать со встроенной в платформу историей данных, а она не больно-то популярна: кто-то привязан к бсп (она пока использует привычное всем версионирование на регистрах сведений), кому-то не нравится реализация — там и правда не всё гладко с точки зрения производительности. во-вторых, нужно сделать так: выключить историю данных для объекта метаданных, а потом грохнуть накопленные версии объектов до того , как новые изменения объекта перекочуют из буфера в основную таблицу. в двух словах о том, как вообще работает история данных. по дефолту она выключена, и достаточно привилегированный пользователь может включить её для нужных ему объектов — констант, справочников, документов и так далее. после этого при изменении данных в этих объектах платформа будет фиксировать, что именно меняется. делает она это в два этапа: сначала — относительно быстрая запись в промежуточный буфер (таблицу _datahistoryqueue0); потом, при вызове метода обновитьисторию(), информация мигрирует в основное хранилище версий (таблицу _datahistoryversions) и становится доступна в интерфейсе приложения. обновление истории можно делать сразу при записи, но для сокращения транзакции его обычно выносят в регламентное задание. в итоге миграция данных из буфера в основную таблицу происходит с некоторой периодичностью: например, раз в пять минут. так вот, если между изменением данных объекта и обновлением истории данных выключить историю объекта и удалить его версии — метод обновитьисторию() выкинет исключение: он попытается переместить изменения из буфера в основную таблицу, но не сможет привязать их к уже накопленным данным. для наглядности — рабочий код , воспроизводящий проблему для справочника items на платформе 8.3.17.1989. можете подставить любой другой объект, с которым работает история данных — разницы нет. как избежать этой ошибки? ну, очевидно: метод обновитьисторию() нужно вызывать непосредственно перед тем, как отключать историю для объекта. лучше всего делать это в период, когда пользователи с системой не работают: есть риск, что между обновлением истории и её выключением вклинятся чьи-то транзакции, которые спровоцируют ту же проблему. для гарантии можно использовать монопольный режим. ещё в голову приходит исключительная блокировка на таблицу объекта, но документация не советует вызывать метод обновитьисторию() внутри транзакций — так что тут я не уверен. как исправить эту ошибку? включите историю данных для проблемного объекта, обновите историю и выключите её обратно. выйдите, так сказать, из класса и зайдите нормально.",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/rclone-abuser\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Скрипт для синхронизации c NAS\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>7 июня 2021</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Python</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Рабочее место</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Выложил на GitHub <a href=\"https://github.com/vkostyanetsky/RCloneAbuser\" target=\"_blank\">скрипт</a> на Python, который я использую для синхронизации файлов между своим компьютером и домашним NAS'ом. У меня стоит Synology DS220j; с ним так-то идет целый вагон софта и в том числе утилита, которая умеет гонять файлы туда-сюда по расписанию. Однако сделана она, похоже, чисто для галочки: программа принялась глючить ещё на этапе настройки, после чего доверие к ней я потерял.</p>\n<p>В общем, какое-то время я помучался с решениями конкурентов и в итоге вернулся к привычному <a href=\"https://rclone.org\" target=\"_blank\">rclone</a>, с которым было всего две проблемы. Во-первых, нельзя нормально соединиться с SMB-шарой: да, логин и пароль можно сохранить в Windows и rclone будет их использовать, но они будут слетать при каждом удобном случае. Я вышел из положения, подключив шару как внешний диск.</p>\n<p>Во-вторых, файлов и папок для синхронизации у меня оказалось много: директория здесь, директория там, конфиг оттуда, профиль отсюда… Чтобы не плодить лапшу, я накатал простой скрипт, который берет из конфига источники и приемники, а потом для каждого вызывает rclone по одному и тому же шаблону.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "скрипт для синхронизации c nas 7 июня 2021 · готово python рабочее место выложил на github скрипт на python, который я использую для синхронизации файлов между своим компьютером и домашним nas'ом. у меня стоит synology ds220j; с ним так-то идет целый вагон софта и в том числе утилита, которая умеет гонять файлы туда-сюда по расписанию. однако сделана она, похоже, чисто для галочки: программа принялась глючить ещё на этапе настройки, после чего доверие к ней я потерял. в общем, какое-то время я помучался с решениями конкурентов и в итоге вернулся к привычному rclone , с которым было всего две проблемы. во-первых, нельзя нормально соединиться с smb-шарой: да, логин и пароль можно сохранить в windows и rclone будет их использовать, но они будут слетать при каждом удобном случае. я вышел из положения, подключив шару как внешний диск. во-вторых, файлов и папок для синхронизации у меня оказалось много: директория здесь, директория там, конфиг оттуда, профиль отсюда… чтобы не плодить лапшу, я накатал простой скрипт, который берет из конфига источники и приемники, а потом для каждого вызывает rclone по одному и тому же шаблону.",
    "tags": [
      "done",
      "python",
      "workplace"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/1c-expert\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Как готовиться к 1С:Эксперту\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>25 мая 2021</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>В середине мая я сдал экзамен на статус эксперта в 1С по технологическим вопросам крупных внедрений. Подготовка вышла долгая, почти два года — так что я чертовски рад, что наконец-то справился.</p>\n<p>В сети есть море материала про этот экзамен и связанные с ним темы — начиная с <a href=\"https://uc1.1c.ru/course/podgotovka-k-1s-ekspertu-po-tehnologicheskim-voprosam-osnovnoj-kurs/\" target=\"_blank\">курса</a> Виктора Богачева и заканчивая, не знаю, релевантным <a href=\"https://t.me/OneC_Expert\" target=\"_blank\">чатом</a> в Телеграме. То есть вопрос из заголовка заметки обычно не стоит. Но я хочу написать о паре психологических заморочек, к которым лучше быть готовым заранее и о которых обычно не вспоминают.</p>\n<h2>Нехватка дофамина</h2>\n<p>Этот экзамен — сложный. Подготовка может затянуться, как и сдача: очень вероятно, что потребуется несколько попыток. Я справился со второго раза, но у людей выходит по-всякому — среди моих знакомых есть те, кто сдал с третьего, пятого или даже восьмого захода.</p>\n<p>То есть может получиться так, что вы раз за разом будете сильно вкладываться, а результата не получать. Через какое-то время ваш мозг решит, что этой задачи надо избегать: какая-то она провальная, бесполезная и вызывает неприятные ощущения. Как это повлияет на конечную цель, догадаться легко.</p>\n<p>Поэтому к подготовке лучше подходить как к долгому и рискованному проекту: разбавлять её короткими и, главное, успешными задачами. Для мозга нет существенной разницы между большим и маленьким успехом, и вернуться к основному проекту будет проще.</p>\n<p>Например, я для отвлечения катал скрипты для домашней автоматизации — <a href=\"https://github.com/vkostyanetsky/BlogBuilder\" target=\"_blank\">генератор статики</a> для этого сайта, органайзер на текстовых файлах, обвязку для домашнего NAS'а и тому подобные штуки, до которых раньше никак руки не доходили. Подойдут любые задачи — включая те, что с айтишечкой вообще не связаны. Почистить слив в ванной? Отличная идея!</p>\n<h2>Нехватка памяти</h2>\n<p>Если вы не работаете с проблемами производительности 1С каждый день, этот экзамен — очень ресурсоемкий контекст. Вы будете держать в голове массу вспомогательных данных, которые обычно берете из документации: флаги трассировки и имена динамических представлений Microsoft SQL Server, настройки PostgreSQL и рекомендации по их заполнению, перечень стандартных индексов платформы и так далее, и тому подобное. Во-о-от такенная куча информации! <em>(показывает руками, какая)</em></p>\n<p>Между тем, наш мозг при работе с большими объёмами данных порой крепко напоминает СУБД, работающую с переполненным буферным кэшем. Другими словами: всё, что не нужно в данный момент, будет выгружено из памяти. Готовьтесь забывать самые неожиданные вещи: номер своей квартиры, кличку соседской собаки, день рождения жены — и это ещё не самые диковатые последствия. Я, пока готовился, чуствовал сильное духовное родство с Джонни Мнемоником — персонажем старого-престарого киберпанка, который загрузил себе в мозги столько данных, что чуть не отбросил коньки :-)</p>\n<p><img alt=\"Не надо так\" src=\"https://kostyanetsky.ru/notes/1c-expert/dont-do-it.jpg\"/></p>\n<p>Выхода тут мне видится два, оба довольно очевидные.</p>\n<p>Во-первых, старайтесь набивать руку. Сложные технические детали запоминаются в сто раз легче, когда у тебя перед глазами тут же встает интерфейс программы, на которой ты их проверял.</p>\n<p>Во-вторых — старайтесь строить ассоциативные цепочки для наиболее заковыристых штук. Взять, например, баш! Название утилиты sed проще запомнить, если знать, что это сокращение от Stream EDitor. Утилита cat называется так, потому что concatenate, а не потому что кошка, но если вам проще запомнить второй вариант — так и делайте. Почему нет?</p>\n<p>Или, скажем, маркер последовательности байтов. \\xef\\xbb\\xbf, ага. Его я намертво запомнил — только не смейтесь — через абсолютно иррелевантную фразу «Elf Friend BB Best Fight». Понятия не имею, почему моя голова работает через <s>такую жо</s> такие заковыристые интерфейсы, но жаловаться я не собираюсь. Главное — отыскать их!</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "как готовиться к 1с:эксперту 25 мая 2021 · 1с готово в середине мая я сдал экзамен на статус эксперта в 1с по технологическим вопросам крупных внедрений. подготовка вышла долгая, почти два года — так что я чертовски рад, что наконец-то справился. в сети есть море материала про этот экзамен и связанные с ним темы — начиная с курса виктора богачева и заканчивая, не знаю, релевантным чатом в телеграме. то есть вопрос из заголовка заметки обычно не стоит. но я хочу написать о паре психологических заморочек, к которым лучше быть готовым заранее и о которых обычно не вспоминают. нехватка дофамина этот экзамен — сложный. подготовка может затянуться, как и сдача: очень вероятно, что потребуется несколько попыток. я справился со второго раза, но у людей выходит по-всякому — среди моих знакомых есть те, кто сдал с третьего, пятого или даже восьмого захода. то есть может получиться так, что вы раз за разом будете сильно вкладываться, а результата не получать. через какое-то время ваш мозг решит, что этой задачи надо избегать: какая-то она провальная, бесполезная и вызывает неприятные ощущения. как это повлияет на конечную цель, догадаться легко. поэтому к подготовке лучше подходить как к долгому и рискованному проекту: разбавлять её короткими и, главное, успешными задачами. для мозга нет существенной разницы между большим и маленьким успехом, и вернуться к основному проекту будет проще. например, я для отвлечения катал скрипты для домашней автоматизации — генератор статики для этого сайта, органайзер на текстовых файлах, обвязку для домашнего nas'а и тому подобные штуки, до которых раньше никак руки не доходили. подойдут любые задачи — включая те, что с айтишечкой вообще не связаны. почистить слив в ванной? отличная идея! нехватка памяти если вы не работаете с проблемами производительности 1с каждый день, этот экзамен — очень ресурсоемкий контекст. вы будете держать в голове массу вспомогательных данных, которые обычно берете из документации: флаги трассировки и имена динамических представлений microsoft sql server, настройки postgresql и рекомендации по их заполнению, перечень стандартных индексов платформы и так далее, и тому подобное. во-о-от такенная куча информации! (показывает руками, какая) между тем, наш мозг при работе с большими объёмами данных порой крепко напоминает субд, работающую с переполненным буферным кэшем. другими словами: всё, что не нужно в данный момент, будет выгружено из памяти. готовьтесь забывать самые неожиданные вещи: номер своей квартиры, кличку соседской собаки, день рождения жены — и это ещё не самые диковатые последствия. я, пока готовился, чуствовал сильное духовное родство с джонни мнемоником — персонажем старого-престарого киберпанка, который загрузил себе в мозги столько данных, что чуть не отбросил коньки :-) выхода тут мне видится два, оба довольно очевидные. во-первых, старайтесь набивать руку. сложные технические детали запоминаются в сто раз легче, когда у тебя перед глазами тут же встает интерфейс программы, на которой ты их проверял. во-вторых — старайтесь строить ассоциативные цепочки для наиболее заковыристых штук. взять, например, баш! название утилиты sed проще запомнить, если знать, что это сокращение от stream editor. утилита cat называется так, потому что concatenate, а не потому что кошка, но если вам проще запомнить второй вариант — так и делайте. почему нет? или, скажем, маркер последовательности байтов. \\xef\\xbb\\xbf, ага. его я намертво запомнил — только не смейтесь — через абсолютно иррелевантную фразу «elf friend bb best fight». понятия не имею, почему моя голова работает через такую жо такие заковыристые интерфейсы, но жаловаться я не собираюсь. главное — отыскать их!",
    "tags": [
      "1c",
      "done"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/longest-queries-v2\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Новый скрипт поиска долгих запросов\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>26 апреля 2021</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Bash</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Обновил <a href=\"https://github.com/vkostyanetsky/ScriptsFor1C/blob/master/Технологический журнал/LongestQueries.sh\" target=\"_blank\">скрипт</a> поиска долгих запросов в технологическом журнале платформы. Ранняя версия содержала серьёзный косяк: она старательно группировала DBMSSQL по Sql и Content, но игнорировала случаи, в которых поле Sql отсутствовало (для DBMSSQL это не то чтобы норма, но встречается).</p>\n<p>Ну и код слегка причесал, чтобы два раза не вставать: добавил разметку и комментарии, а часть логики gawk'а вынес из основного тела в функции. Да, скрипт стал смотреться длиннее, чем он есть на самом деле, зато читать его стало куда проще.</p>\n<p>Мне вообще, по-чеснаку, непонятна причина, по которой ветераны баша трамбуют всю логику в две-три строки: язык и так-то не блещет читаемостью (в телеграм-канале Никиты Прокопова есть <a href=\"https://t.me/nikitonsky_pub/55\" target=\"_blank\">отличный текст</a> на эту тему), а при виде страницы конвейеров без единого перевода строки вообще хочется молча выйти в окно.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "новый скрипт поиска долгих запросов 26 апреля 2021 · 1с bash готово обновил скрипт поиска долгих запросов в технологическом журнале платформы. ранняя версия содержала серьёзный косяк: она старательно группировала dbmssql по sql и content, но игнорировала случаи, в которых поле sql отсутствовало (для dbmssql это не то чтобы норма, но встречается). ну и код слегка причесал, чтобы два раза не вставать: добавил разметку и комментарии, а часть логики gawk'а вынес из основного тела в функции. да, скрипт стал смотреться длиннее, чем он есть на самом деле, зато читать его стало куда проще. мне вообще, по-чеснаку, непонятна причина, по которой ветераны баша трамбуют всю логику в две-три строки: язык и так-то не блещет читаемостью (в телеграм-канале никиты прокопова есть отличный текст на эту тему), а при виде страницы конвейеров без единого перевода строки вообще хочется молча выйти в окно.",
    "tags": [
      "1c",
      "bash",
      "done"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/bunch-of-scrips\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Пучок скриптов\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>24 апреля 2021</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Bash</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Выложил на GitHub ещё несколько скриптов для разбора технологического журнала платформы, которые написал за последнее время:</p>\n<ul>\n<li><a href=\"https://github.com/vkostyanetsky/ScriptsFor1C/blob/master/Технологический журнал/FrequentEvents.sh\" target=\"_blank\">Частотные события</a>. Группирует события по наименованию, считает количество воспроизведений для каждого и выводит в порядке убывания — от наиболее частотного к наименее частотному. Практического применения у этого скрипта, скорее, нет; просто фиксировал для себя, какой процесс кластера какие события пишет.</li>\n<li><a href=\"https://github.com/vkostyanetsky/ScriptsFor1C/blob/master/Технологический журнал/ExceptionDescriptions.sh\" target=\"_blank\">Описания исключений</a>. Группирует EXCP по полю Name; для каждого наименования выводит варианты значений поля Description, которые были у исключений с таким наименованием. С помощью этого скрипта можно составить примерную картину: какие исключения действительно проблема, а какие — просто белый шум, который можно игнорировать и, например, закинуть в фильтры Кибаны.</li>\n<li><a href=\"https://github.com/vkostyanetsky/ScriptsFor1C/blob/master/Технологический журнал/LocksByConnectIDAndRegions.sh\" target=\"_blank\">Блокировки по ID соединения и области</a>. Удобен для поиска виновника таймаута на управляемых блокировках: скрипт выгребает из ТЖ все TLOCK'и по конкретной области от конкретного соединения, а потом выстраивает их в хронологическом порядке.</li>\n</ul>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "пучок скриптов 24 апреля 2021 · 1с bash готово выложил на github ещё несколько скриптов для разбора технологического журнала платформы, которые написал за последнее время: частотные события . группирует события по наименованию, считает количество воспроизведений для каждого и выводит в порядке убывания — от наиболее частотного к наименее частотному. практического применения у этого скрипта, скорее, нет; просто фиксировал для себя, какой процесс кластера какие события пишет. описания исключений . группирует excp по полю name; для каждого наименования выводит варианты значений поля description, которые были у исключений с таким наименованием. с помощью этого скрипта можно составить примерную картину: какие исключения действительно проблема, а какие — просто белый шум, который можно игнорировать и, например, закинуть в фильтры кибаны. блокировки по id соединения и области . удобен для поиска виновника таймаута на управляемых блокировках: скрипт выгребает из тж все tlock'и по конкретной области от конкретного соединения, а потом выстраивает их в хронологическом порядке.",
    "tags": [
      "1c",
      "bash",
      "done"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/skuuuid\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                SKUUUID в своем глазу\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>22 февраля 2021</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Код с запашком</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Пару недель назад Александр Кунташов у себя на канале <a href=\"https://t.me/kuntashov_devnotes/479\" target=\"_blank\">запостил</a> забавный скрин перечисления из Библиотеки Электронных Документов, создателей которого откровенно манили длинные аббревиатуры. Я бодро острил на тему родства ИППДОИПУПДУКД'а и московского ГНУВНИВИПФИТ'а, а потом увидел в собственном коде вот эту красотку:</p>\n<p><img alt=\"SKUUUID\" src=\"https://kostyanetsky.ru/notes/skuuuid/skuuuid.png\"/></p>\n<p>Ещё не вполне рука маэстро, конечно, но движение определенно в том же направлении. Вспомнилась притча про сучок в чужом глазу и суковатое бревно — в своём :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "skuuuid в своем глазу 22 февраля 2021 · 1с код с запашком пару недель назад александр кунташов у себя на канале запостил забавный скрин перечисления из библиотеки электронных документов, создателей которого откровенно манили длинные аббревиатуры. я бодро острил на тему родства иппдоипупдукд'а и московского гнувнивипфит'а, а потом увидел в собственном коде вот эту красотку: ещё не вполне рука маэстро, конечно, но движение определенно в том же направлении. вспомнилась притча про сучок в чужом глазу и суковатое бревно — в своём :-)",
    "tags": [
      "1c",
      "code-smell"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/date-literal-exceeds-3999\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Проблема с литералом даты при пересчете итогов\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>6 февраля 2021</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Итак, в ходе рутинного пересчета итогов из Конфигуратора мы неожиданно получили ошибку «номер года в литерале типа дата превышает 3999». Это значит, где-то в базе есть (или пытается появиться) дата больше, чем предельно допустимая с точки зрения 1С (31.12.3999 23:59:59).</p>\n<p><img alt=\"Исключение\" src=\"https://kostyanetsky.ru/notes/date-literal-exceeds-3999/excp.png\"/></p>\n<p>Ладно, что с этим делать?</p>\n<p>Главное — выйти на конкретную таблицу с проблемными датами. Ошибка возникла при пересчете итогов, так что очевидно: искать нужно в регистрах. Открываем стандартную обработку управления итогами, делаем пересчет и <a href=\"https://kostyanetsky.ru/notes/date-literal-exceeds-3999/totals.png\" target=\"_blank\">получаем</a> имя регистра, на котором спотыкается платформа.</p>\n<p>Другой, более методологически правильный подход — настроить сбор ТЖ (SDBL, EXCP и EXCPCNTX) и получить примерно <a href=\"https://kostyanetsky.ru/notes/date-literal-exceeds-3999/excp.log\" target=\"_blank\">такой</a> лог. Ищем в нём событие EXCP (исключение), а непосредственно перед ним — событие SDBL (SQL-запрос в терминах платформы). Этот запрос — причина сбоя; в его тексте видим имя нужной нам таблицы (AccumRgTn11530). Имя объекта конфигурации для неё можно вытащить любой обработкой, построенной на методе ПолучитьСтруктуруХраненияБазыДанных().</p>\n<p>В общем, так или иначе мы получим имя регистра. Открываем его форму и простой сортировкой по периоду выходим на <a href=\"https://kostyanetsky.ru/notes/date-literal-exceeds-3999/entries.png\" target=\"_blank\">проблемные движения</a>. Нужно проанализировать документы, которые их сделали, устранить причину ошибки и перепровести документы. Если после этого проблема с пересчетом останется — это либо не единственная таблица с проблемными датами (ищем дальше), либо эти даты успели засесть где-то ещё, кроме таблицы движений.</p>\n<p>Например, у меня был случай, когда после исправления движений записи с некорректными датами сохранялись в таблице оборотов. Средствами платформы их удалить было нельзя, но размер базы позволял играться с реструктуризацией. Я выкинул следующий финт: отключил признак «Использование в итогах» для всех измерений регистра и применил изменения; потом вернул признак на место и пересчитал итоги. В итоге таблица оборотов регистра была физически удалена, а потом создана и наполнена заново — уже без дат на много веков вперёд.</p>\n<p>В крайнем случае можно было удалить проблемные записи с помощью прямых SQL-запросов (DELETE или даже TRUNCATE). Но это, во-первых, нарушает лицензионное соглашение с разработчиками платформы, а во вторых — опасно (по неосторожности можно удалить что-то важное и не заметить). Так что не советую, э-э, повторять в домашних условиях :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "проблема с литералом даты при пересчете итогов 6 февраля 2021 · 1с итак, в ходе рутинного пересчета итогов из конфигуратора мы неожиданно получили ошибку «номер года в литерале типа дата превышает 3999». это значит, где-то в базе есть (или пытается появиться) дата больше, чем предельно допустимая с точки зрения 1с (31.12.3999 23:59:59). ладно, что с этим делать? главное — выйти на конкретную таблицу с проблемными датами. ошибка возникла при пересчете итогов, так что очевидно: искать нужно в регистрах. открываем стандартную обработку управления итогами, делаем пересчет и получаем имя регистра, на котором спотыкается платформа. другой, более методологически правильный подход — настроить сбор тж (sdbl, excp и excpcntx) и получить примерно такой лог. ищем в нём событие excp (исключение), а непосредственно перед ним — событие sdbl (sql-запрос в терминах платформы). этот запрос — причина сбоя; в его тексте видим имя нужной нам таблицы (accumrgtn11530). имя объекта конфигурации для неё можно вытащить любой обработкой, построенной на методе получитьструктурухранениябазыданных(). в общем, так или иначе мы получим имя регистра. открываем его форму и простой сортировкой по периоду выходим на проблемные движения . нужно проанализировать документы, которые их сделали, устранить причину ошибки и перепровести документы. если после этого проблема с пересчетом останется — это либо не единственная таблица с проблемными датами (ищем дальше), либо эти даты успели засесть где-то ещё, кроме таблицы движений. например, у меня был случай, когда после исправления движений записи с некорректными датами сохранялись в таблице оборотов. средствами платформы их удалить было нельзя, но размер базы позволял играться с реструктуризацией. я выкинул следующий финт: отключил признак «использование в итогах» для всех измерений регистра и применил изменения; потом вернул признак на место и пересчитал итоги. в итоге таблица оборотов регистра была физически удалена, а потом создана и наполнена заново — уже без дат на много веков вперёд. в крайнем случае можно было удалить проблемные записи с помощью прямых sql-запросов (delete или даже truncate). но это, во-первых, нарушает лицензионное соглашение с разработчиками платформы, а во вторых — опасно (по неосторожности можно удалить что-то важное и не заметить). так что не советую, э-э, повторять в домашних условиях :-)",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/do-you-see-it\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Определение видимости объекта\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>17 января 2021</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>В платформе сразу несколько механик решает, видит пользователь некий объект метаданных или нет. Одна из них — функциональные опции. Если вы раньше не имели с ними дела, в двух словах дела обстоят так: объект можно добавить в состав опции, которая внутри конкретной базы может как быть активной (и видимой пользователям), так и неактивной (и, соответственно, скрытой). Объект можно засунуть в несколько опций сразу (и тогда он отображается, если активна хотя бы одна из них) или не включать вообще никуда (и тогда пользователи его видят в любом случае).</p>\n<p>Так вот, помню, лет пять назад я искал способ понять из кода — видит пользователь объект или нет? Чисто с точки зрения функциональных опций. Тогда я почему-то не нашел решения, а ведь оно до смешного простое; вот, например, <a href=\"https://gist.github.com/vkostyanetsky/a6c0525c38a8231f37a676ec240d657a\" target=\"_blank\">функция</a> ровно для этого. Логика:</p>\n<ol>\n<li>Перебираем опции и ищем объект в составе каждой из них.</li>\n<li>Если объект есть в составе опции, проверяем: опция активна? Если да — значит, пользователь видит объект.</li>\n<li>Если объект не включен ни в одну опцию — тоже видит.</li>\n</ol>\n<p>Конечно, результаты такого анализа как минимум нужно кэшировать (хотя бы из-за запроса в цикле), но в остальном он вполне адекватен. Никак не возьму в толк, почему я тогда не написал что-то похожее? Ох, надеюсь, спустя следующие пять лет мои нынешние занозы в заднице тоже будут отлетать на раз-два-три.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "определение видимости объекта 17 января 2021 · 1с в платформе сразу несколько механик решает, видит пользователь некий объект метаданных или нет. одна из них — функциональные опции. если вы раньше не имели с ними дела, в двух словах дела обстоят так: объект можно добавить в состав опции, которая внутри конкретной базы может как быть активной (и видимой пользователям), так и неактивной (и, соответственно, скрытой). объект можно засунуть в несколько опций сразу (и тогда он отображается, если активна хотя бы одна из них) или не включать вообще никуда (и тогда пользователи его видят в любом случае). так вот, помню, лет пять назад я искал способ понять из кода — видит пользователь объект или нет? чисто с точки зрения функциональных опций. тогда я почему-то не нашел решения, а ведь оно до смешного простое; вот, например, функция ровно для этого. логика: перебираем опции и ищем объект в составе каждой из них. если объект есть в составе опции, проверяем: опция активна? если да — значит, пользователь видит объект. если объект не включен ни в одну опцию — тоже видит. конечно, результаты такого анализа как минимум нужно кэшировать (хотя бы из-за запроса в цикле), но в остальном он вполне адекватен. никак не возьму в толк, почему я тогда не написал что-то похожее? ох, надеюсь, спустя следующие пять лет мои нынешние занозы в заднице тоже будут отлетать на раз-два-три.",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/recursive-search\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Рекурсивный поиск по файлам\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>14 января 2021</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Bash</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Время назад я <a href=\"https://kostyanetsky.ru/notes/vulnerabilities\" target=\"_blank\">примеривался</a> к поискам уязвимостей в коде скриптами на bash (звучит грозно, но это просто рекурсивный поиск текста с помощью регулярных выражений). Скрипты-то я тогда написал, но, как сегодня понял — несколько… Ректально, кхм. Для решения хватает одного egrep! То есть из связки find, xargs и egrep можно выкинуть два компонента из трех.</p>\n<p>Например, сегодня у нас возникла проблема: конфигурация перестала собираться в последнем релизе EDT. Подозрение пало на битые GUID — ссылки на объекты метаданных, удаленные из конфигурации. Платформа не всегда справляется с их вычисткой после того, как удалит сами объекты; я уже пару раз писал про это (например, <a href=\"https://kostyanetsky.ru/notes/designer-error-investigation\" target=\"_blank\">здесь</a> или <a href=\"https://kostyanetsky.ru/notes/unresolved-gopher\" target=\"_blank\">вот тут</a>).</p>\n<p>В общем, мы решили порыться в выгрузке конфигурации — найти GUID'ы и оценить, все ли они находятся там, где положено. Общее решение — одна-единственная команда:</p>\n<pre><code>egrep -rn '.{8}-.{4}-.{4}-.{4}-.{12}' dump\n</code></pre>\n<p>Ключ r включает рекурсивный поиск, ключ n — заставляет утилиту пристегнуть к найденной строке не только имя файла, в котором найдена строка, но и номер самой строки. Последний параметр, dump — имя директории, где нужно искать.</p>\n<p>Регулярку можно сделать точнее, но и такой за глаза хватает. Что до ложных срабатываний (то есть GUID, которые не являются битыми ссылками) — их легко отсеять через пайп. Например, скрипт ниже не будет выводить строки с GUID, в которых есть подстрока «uuid»:</p>\n<pre><code>egrep -rn '.{8}-.{4}-.{4}-.{4}-.{12}' dump | grep -v 'uuid'\n</code></pre>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "рекурсивный поиск по файлам 14 января 2021 · 1с bash время назад я примеривался к поискам уязвимостей в коде скриптами на bash (звучит грозно, но это просто рекурсивный поиск текста с помощью регулярных выражений). скрипты-то я тогда написал, но, как сегодня понял — несколько… ректально, кхм. для решения хватает одного egrep! то есть из связки find, xargs и egrep можно выкинуть два компонента из трех. например, сегодня у нас возникла проблема: конфигурация перестала собираться в последнем релизе edt. подозрение пало на битые guid — ссылки на объекты метаданных, удаленные из конфигурации. платформа не всегда справляется с их вычисткой после того, как удалит сами объекты; я уже пару раз писал про это (например, здесь или вот тут ). в общем, мы решили порыться в выгрузке конфигурации — найти guid'ы и оценить, все ли они находятся там, где положено. общее решение — одна-единственная команда: egrep -rn '.{8}-.{4}-.{4}-.{4}-.{12}' dump ключ r включает рекурсивный поиск, ключ n — заставляет утилиту пристегнуть к найденной строке не только имя файла, в котором найдена строка, но и номер самой строки. последний параметр, dump — имя директории, где нужно искать. регулярку можно сделать точнее, но и такой за глаза хватает. что до ложных срабатываний (то есть guid, которые не являются битыми ссылками) — их легко отсеять через пайп. например, скрипт ниже не будет выводить строки с guid, в которых есть подстрока «uuid»: egrep -rn '.{8}-.{4}-.{4}-.{4}-.{12}' dump | grep -v 'uuid'",
    "tags": [
      "1c",
      "bash"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/old-but-gold\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Старый добрый DATETIME\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>11 ноября 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">MS SQL</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Порылся в сети по поводу типов дат в MS SQL Server и в целом вопроса «почему 1С до сих пор носится со своим смещением» больше не имею. Люди пишут о целой пачке проблем с DATETIME2:</p>\n<ol>\n<li>Недоступна базовая математика. Без дополнительных финтов ушами не выйдет посчитать разницу между двумя датами, прибавить к дате день и так далее.</li>\n<li>Стандартные функции по-прежнему возвращают старый добрый DATETIME (например, DATEADD). Если данные хранятся в DATETIME2 — потребуется конвертация.</li>\n<li>Поля с этим типом <a href=\"https://sqlperformance.com/2016/04/sql-performance/surprises-dateadd\" target=\"_blank\">неважно</a> индексируются, так как каждое значение DATETIME2 хранится задом наперед (сначала время, потом дата). В итоге СУБД промахивается с оценкой количества строк, которое может вернуть запрос, и строит для него неэффективный план выполнения.</li>\n</ol>\n<p>Подробнее о всем этом можно прочитать на <a href=\"https://towardsdatascience.com/datetime2-why-you-should-not-use-it-70e50ae2bab9\" target=\"_blank\">Towards Data Science</a> или, например, на <a href=\"https://www.sqlservercentral.com/forums/topic/why-do-some-dbas-avoid-datetime2\" target=\"_blank\">SQL Server Central</a>.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "старый добрый datetime 11 ноября 2020 · 1с ms sql порылся в сети по поводу типов дат в ms sql server и в целом вопроса «почему 1с до сих пор носится со своим смещением» больше не имею. люди пишут о целой пачке проблем с datetime2: недоступна базовая математика. без дополнительных финтов ушами не выйдет посчитать разницу между двумя датами, прибавить к дате день и так далее. стандартные функции по-прежнему возвращают старый добрый datetime (например, dateadd). если данные хранятся в datetime2 — потребуется конвертация. поля с этим типом неважно индексируются, так как каждое значение datetime2 хранится задом наперед (сначала время, потом дата). в итоге субд промахивается с оценкой количества строк, которое может вернуть запрос, и строит для него неэффективный план выполнения. подробнее о всем этом можно прочитать на towards data science или, например, на sql server central .",
    "tags": [
      "1c",
      "mssql"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/lost-time\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Смещение дат в 1С\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>10 ноября 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">MS SQL</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>В MS SQL Server поля DATETIME <a href=\"https://docs.microsoft.com/ru-ru/dotnet/api/system.data.sqltypes.sqldatetime.minvalue?view=dotnet-plat-ext-3.1\" target=\"_blank\">не могут</a> хранить даты раньше 1753-го года. Например, если попытаться записать в базу 01.01.0001 — получим ругань на out-of-range value. Я считал это забавным для такой почтенной СУБД рудиментом, пока случайно не наткнулся на <a href=\"https://stackoverflow.com/questions/3310569/what-is-the-significance-of-1-1-1753-in-sql-server\" target=\"_blank\">причину</a>.</p>\n<p>Если вкратце, в 1752-м году Великобритания внедрила у себя Григорианский календарь, и в процессе у них из летосчисления пропало одиннадцать дней. Это породило проблему: вот хочет юзер посчитать разницу в днях между 1653-м и 1753-м годом — что делать будем? Учтем потеряшек? Проигнорируем? Сделаем какие-то хинты или настройки?</p>\n<p>Видимо, чтобы не городить неоднозначные механизмы, разработчики СУБД решили вопрос радикально — усечением доступного диапазона дат. А для тех, для кого это проблема, есть DATETIME2, который никаких ограничений не имеет.</p>\n<p>Что касается 1С, то изначально платформа использовала DATETIME, а чтобы не иметь головной боли с хранением дат раньше 1753-го года — придумала специальный <a href=\"https://its.1c.ru/db/metod8dev/content/4055/hdoc\" target=\"_blank\">костыль</a>. В двух словах: когда платформа пишет даты в БД, то тихой сапой прибавляет к каждой две тысячи лет, а когда читает — вычитает обратно. То есть в 1С пользователь видит 01.01.2000, а в БД на самом деле хранится 01.01.4000.</p>\n<p>Любопытно, почему 1C до сих пор не выкинула эту штуку? Сейчас платформа использует DATETIME2 и фокус по смещением в общем-то не нужен. Конечно, тут могут быть какие-то подводные камни или просто разумная осторожность, но среди разработчиков самой СУБД сомнений <a href=\"https://stackoverflow.com/questions/3310569/what-is-the-significance-of-1-1-1753-in-sql-server/3310627#3310627\" target=\"_blank\">не заметно</a>:</p>\n<blockquote>\n<p>Your great great great great great great great grandfather should upgrade to SQL Server 2008 and use the DateTime2 data type, which supports dates in the range: 0001-01-01 through 9999-12-31.</p>\n<p><em>Joe Stefanelli (SQL Server developer)</em></p>\n</blockquote>\n<p>Возможно, это просто на дне приоритетов. Добавление и удаление двух тысяч лет для каждой даты, конечно, увеличивает нагрузку на оборудование, но на фоне остального она теряется.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "смещение дат в 1с 10 ноября 2020 · 1с ms sql в ms sql server поля datetime не могут хранить даты раньше 1753-го года. например, если попытаться записать в базу 01.01.0001 — получим ругань на out-of-range value. я считал это забавным для такой почтенной субд рудиментом, пока случайно не наткнулся на причину . если вкратце, в 1752-м году великобритания внедрила у себя григорианский календарь, и в процессе у них из летосчисления пропало одиннадцать дней. это породило проблему: вот хочет юзер посчитать разницу в днях между 1653-м и 1753-м годом — что делать будем? учтем потеряшек? проигнорируем? сделаем какие-то хинты или настройки? видимо, чтобы не городить неоднозначные механизмы, разработчики субд решили вопрос радикально — усечением доступного диапазона дат. а для тех, для кого это проблема, есть datetime2, который никаких ограничений не имеет. что касается 1с, то изначально платформа использовала datetime, а чтобы не иметь головной боли с хранением дат раньше 1753-го года — придумала специальный костыль . в двух словах: когда платформа пишет даты в бд, то тихой сапой прибавляет к каждой две тысячи лет, а когда читает — вычитает обратно. то есть в 1с пользователь видит 01.01.2000, а в бд на самом деле хранится 01.01.4000. любопытно, почему 1c до сих пор не выкинула эту штуку? сейчас платформа использует datetime2 и фокус по смещением в общем-то не нужен. конечно, тут могут быть какие-то подводные камни или просто разумная осторожность, но среди разработчиков самой субд сомнений не заметно : your great great great great great great great grandfather should upgrade to sql server 2008 and use the datetime2 data type, which supports dates in the range: 0001-01-01 through 9999-12-31. joe stefanelli (sql server developer) возможно, это просто на дне приоритетов. добавление и удаление двух тысяч лет для каждой даты, конечно, увеличивает нагрузку на оборудование, но на фоне остального она теряется.",
    "tags": [
      "1c",
      "mssql"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/hulk-removes\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Халк удалять!\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>9 ноября 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">PostgreSQL</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>На <a href=\"https://postgrespro.ru/education/courses/DBA1\" target=\"_blank\">курсе</a> по PostgreSQL узнал смешную деталь: в 10-й версии СУБД разработчики переименовали папку pg_xlog (журналы предзаписи) в pg_wal, а папку pg_clog (статусы транзакций) — в pg_xact.</p>\n<p>Знаете, почему? Из-за не слишком опытных, но уже достаточно смелых администраторов, которые триггерились на слово «log» в названии папки. Мол, мне нужно место на диске освободить, а тут СУБД забила всё своими дурацкими логами. Некогда разбираться, rm -rf их и порядок!</p>\n<p>В общем, в трубу одновременно вылетала и защита работы с данными в буферном кэше, и многоверсионность. После чего кластер умирал в муках. Свободного места на диске получалось много, но радоваться этому, боюсь, приходилось недолго :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "халк удалять! 9 ноября 2020 · postgresql на курсе по postgresql узнал смешную деталь: в 10-й версии субд разработчики переименовали папку pg_xlog (журналы предзаписи) в pg_wal, а папку pg_clog (статусы транзакций) — в pg_xact. знаете, почему? из-за не слишком опытных, но уже достаточно смелых администраторов, которые триггерились на слово «log» в названии папки. мол, мне нужно место на диске освободить, а тут субд забила всё своими дурацкими логами. некогда разбираться, rm -rf их и порядок! в общем, в трубу одновременно вылетала и защита работы с данными в буферном кэше, и многоверсионность. после чего кластер умирал в муках. свободного места на диске получалось много, но радоваться этому, боюсь, приходилось недолго :-)",
    "tags": [
      "pgsql"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/time-to-wink\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Время для прогулки\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>2 ноября 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Bash</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Как понять, что надо сделать перерыв в работе? Скажем так: если ваш скрипт внезапно начал вам подмигивать — точно пора проветриться.</p>\n<p><img alt=\"Привет!\" src=\"https://kostyanetsky.ru/notes/time-to-wink/wink.png\"/></p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "время для прогулки 2 ноября 2020 · bash как понять, что надо сделать перерыв в работе? скажем так: если ваш скрипт внезапно начал вам подмигивать — точно пора проветриться.",
    "tags": [
      "bash"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/designer-error-investigation\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Расследование ошибки в Конфигураторе\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>31 октября 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Итак, Конфигуратор выдает ошибку; нужно её исправить или обойти. Это потенциально неприятный расклад: у нас нет никакого доступа к коду приложения. Тем не менее, чтобы решить проблему — важно понять, что именно делал Конфигуратор до сбоя и почему он не справился.</p>\n<p>Что может с этим помочь?</p>\n<p>Первое — сам текст ошибки. Нередко его вполне достаточно, чтобы мысли двинулись в правильном направлении. Если причиной сбоя стал запрос, то в ошибке будет ещё и сообщение от СУБД.</p>\n<p>Второе — технологический журнал по событиям EXCP, SDBL и DBMSSQL (DBPOSTGRS?) для t:applicationName=Designer. Из него мы получим информацию об исключениях внутри Конфигуратора и данные запросов, которые он выполняет (нередко они и есть причина ошибки).</p>\n<p>Кроме того, может пригодиться трассировка запросов к базе данных. Если используется MS SQL, то трассировку можно получить через Extended Events — конкретно, нас интересуют события error_reported, rpc_completed и sql_batch_completed. Общий принцип тот же — ловим ошибки выполнения запросов и сами запросы. </p>\n<p>Разберем пример — может, не самый показательный, зато свежий.</p>\n<p>Контекст — конфигурация, использующая <a href=\"https://v8.1c.ru/platforma/razdelenie-dannyh/\" target=\"_blank\">разделение данных</a>. Её база данных «нарезана» на кусочки (области данных), каждый из которых ничего не знает о своих соседях — сколько их, какого они размера и так далее. При этом в БД есть и общие данные — например, справочники, к которым можно обратиться из любой области. Как правило, это разная техническая информация — например, перечень объектов метаданных.</p>\n<p>Задача — исключить справочник FileStorageVolumes из основного разделителя. Сейчас этот справочник — разделенный: то есть, его данные от области к области будут различаться. Нам нужно сделать так, чтобы содержимое справочника стало одинаковым для всех областей.</p>\n<p>Задача несложная, так как таблица справочника пуста — ни одна из областей ничего в нем не хранит. Что же, применяем <a href=\"https://kostyanetsky.ru/notes/designer-error-investigation/setup.png\" target=\"_blank\">настройку</a> и:</p>\n<p><img alt=\"Исключение\" src=\"https://kostyanetsky.ru/notes/designer-error-investigation/error.png\"/></p>\n<p>В <a href=\"https://kostyanetsky.ru/notes/designer-error-investigation/error.txt\" target=\"_blank\">тексте</a> исключения есть сообщения: одно от платформы, второе от СУБД. Первое озадачивает: то есть как это данные не уникальны? Справочник же пуст, никаких данных нет. Возможно, проблема в каких-то вспомогательных структурах, не связанных с содержимым справочника напрямую.</p>\n<p>Сообщение СУБД более внятное: MS SQL Server хотела создать уникальный индекс для таблицы _DataHistorySettingsNG, но не смогла, так как сочетания индексируемых полей оказались неуникальны. Приводится даже конкретное значение, из-за которого не получилось создать индекс: это NULL.</p>\n<p>Выводы?</p>\n<ol>\n<li>Очевидно, что проблема возникла в ходе реструктуризации. Во-первых, именно её мы и делали. Во-вторых, на это указывает и операция CREATE UNIQUE INDEX (создание индексов в таблицах — часть реструктуризации), и название проблемной таблицы: в нём есть постфикс NG (его получают копии таблиц, которые создаются при реструктуризации; если она проходит успешно, то платформа удаляет исходную таблицу и переименовывает копию).</li>\n<li>Проблема возникла с настройками механизма истории данных (_DataHistorySettings). Там хранится статус каждого объекта метаданных: нужно или нет вести историю данных для объекта, его полей и полей его табличных частей (если они есть).</li>\n</ol>\n<p>Последнее объясняет, почему проблема уникальности возникла на пустом справочнике: настройки истории данных для объекта хранятся независимо от того, есть в объекте какие-то данные или нет. Если посмотреть на таблицу с настройками, там всего три поля: _MetadataId (ID объекта метаданных), _Content (значения настроек) и _Fld626 (разделитель области).</p>\n<p>До реструктуризации данные имеют примерно такой вид:</p>\n<p><img alt=\"Таблица _DataHistorySettings\" src=\"https://kostyanetsky.ru/notes/designer-error-investigation/table.png\"/></p>\n<p>Однако потом эта картина изменилась. Когда мы исключили справочник из состава общего реквизита, конфигуратор запустил реструктуризацию: создал таблицу _DataHistorySettingsNG, перенес в неё данные из _DataHistorySettings и установил значение поля _Fld626 в NULL всем записям, которые относятся к справочнику FileStorageVolumes.</p>\n<p>К чему это привело? А вот к чему: для справочника FileStorageVolumes появился целый ворох настроек, которые не относятся к какой-либо области. Это само по себе звучит нездорово, но настоящие проблемы начались, когда Конфигуратор попытался создать для таблицы кластерный индекс: он <a href=\"https://kostyanetsky.ru/notes/designer-error-investigation/index.png\" target=\"_blank\">строится</a> по полям _MetadataId и _Fld626, является уникальным и, соответственно, не может быть создан — в таблице множество записей, у которых различается только поле _Content, а _MetadataId и _Fld626 — гарантированно идентичны.</p>\n<p>Для очистки совести посмотрим <a href=\"https://kostyanetsky.ru/notes/designer-error-investigation/20103116.log\" target=\"_blank\">техжурнал</a> (я вычистил оттуда нерелевантные события и другую постороннюю информацию). Наши догадки подтверждается: видим, как Конфигуратор создает и заполняет таблицу _DataHistorySettingsNG, пытается проиндексировать её, но получает ошибку и удаляет. В <a href=\"https://kostyanetsky.ru/notes/designer-error-investigation/20103116.png\" target=\"_blank\">трассировке</a> СУБД примерно та же картина.</p>\n<p>На этом интересное заканчивается, так как решение достаточно очевидно: удаляем настройки истории данных для справочника во всей областях данных и повторяем реструктуризацию. Ошибку это не исправит, конечно; по хорошему, Конфигуратор должен предсказывать такую ситуацию и выдавать адекватное сообщение — как, например, при удалении измерения регистра сведений, которое приводит к нарушению уникальности измерений для записей регистра. Однако задача будет решена.</p>\n<p>В общем, готово — мы великолепны!</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "расследование ошибки в конфигураторе 31 октября 2020 · 1с итак, конфигуратор выдает ошибку; нужно её исправить или обойти. это потенциально неприятный расклад: у нас нет никакого доступа к коду приложения. тем не менее, чтобы решить проблему — важно понять, что именно делал конфигуратор до сбоя и почему он не справился. что может с этим помочь? первое — сам текст ошибки. нередко его вполне достаточно, чтобы мысли двинулись в правильном направлении. если причиной сбоя стал запрос, то в ошибке будет ещё и сообщение от субд. второе — технологический журнал по событиям excp, sdbl и dbmssql (dbpostgrs?) для t:applicationname=designer. из него мы получим информацию об исключениях внутри конфигуратора и данные запросов, которые он выполняет (нередко они и есть причина ошибки). кроме того, может пригодиться трассировка запросов к базе данных. если используется ms sql, то трассировку можно получить через extended events — конкретно, нас интересуют события error_reported, rpc_completed и sql_batch_completed. общий принцип тот же — ловим ошибки выполнения запросов и сами запросы. разберем пример — может, не самый показательный, зато свежий. контекст — конфигурация, использующая разделение данных . её база данных «нарезана» на кусочки (области данных), каждый из которых ничего не знает о своих соседях — сколько их, какого они размера и так далее. при этом в бд есть и общие данные — например, справочники, к которым можно обратиться из любой области. как правило, это разная техническая информация — например, перечень объектов метаданных. задача — исключить справочник filestoragevolumes из основного разделителя. сейчас этот справочник — разделенный: то есть, его данные от области к области будут различаться. нам нужно сделать так, чтобы содержимое справочника стало одинаковым для всех областей. задача несложная, так как таблица справочника пуста — ни одна из областей ничего в нем не хранит. что же, применяем настройку и: в тексте исключения есть сообщения: одно от платформы, второе от субд. первое озадачивает: то есть как это данные не уникальны? справочник же пуст, никаких данных нет. возможно, проблема в каких-то вспомогательных структурах, не связанных с содержимым справочника напрямую. сообщение субд более внятное: ms sql server хотела создать уникальный индекс для таблицы _datahistorysettingsng, но не смогла, так как сочетания индексируемых полей оказались неуникальны. приводится даже конкретное значение, из-за которого не получилось создать индекс: это null. выводы? очевидно, что проблема возникла в ходе реструктуризации. во-первых, именно её мы и делали. во-вторых, на это указывает и операция create unique index (создание индексов в таблицах — часть реструктуризации), и название проблемной таблицы: в нём есть постфикс ng (его получают копии таблиц, которые создаются при реструктуризации; если она проходит успешно, то платформа удаляет исходную таблицу и переименовывает копию). проблема возникла с настройками механизма истории данных (_datahistorysettings). там хранится статус каждого объекта метаданных: нужно или нет вести историю данных для объекта, его полей и полей его табличных частей (если они есть). последнее объясняет, почему проблема уникальности возникла на пустом справочнике: настройки истории данных для объекта хранятся независимо от того, есть в объекте какие-то данные или нет. если посмотреть на таблицу с настройками, там всего три поля: _metadataid (id объекта метаданных), _content (значения настроек) и _fld626 (разделитель области). до реструктуризации данные имеют примерно такой вид: однако потом эта картина изменилась. когда мы исключили справочник из состава общего реквизита, конфигуратор запустил реструктуризацию: создал таблицу _datahistorysettingsng, перенес в неё данные из _datahistorysettings и установил значение поля _fld626 в null всем записям, которые относятся к справочнику filestoragevolumes. к чему это привело? а вот к чему: для справочника filestoragevolumes появился целый ворох настроек, которые не относятся к какой-либо области. это само по себе звучит нездорово, но настоящие проблемы начались, когда конфигуратор попытался создать для таблицы кластерный индекс: он строится по полям _metadataid и _fld626, является уникальным и, соответственно, не может быть создан — в таблице множество записей, у которых различается только поле _content, а _metadataid и _fld626 — гарантированно идентичны. для очистки совести посмотрим техжурнал (я вычистил оттуда нерелевантные события и другую постороннюю информацию). наши догадки подтверждается: видим, как конфигуратор создает и заполняет таблицу _datahistorysettingsng, пытается проиндексировать её, но получает ошибку и удаляет. в трассировке субд примерно та же картина. на этом интересное заканчивается, так как решение достаточно очевидно: удаляем настройки истории данных для справочника во всей областях данных и повторяем реструктуризацию. ошибку это не исправит, конечно; по хорошему, конфигуратор должен предсказывать такую ситуацию и выдавать адекватное сообщение — как, например, при удалении измерения регистра сведений, которое приводит к нарушению уникальности измерений для записей регистра. однако задача будет решена. в общем, готово — мы великолепны!",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/excp-number-by-minutes\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Расчет количества исключений по ТЖ\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>24 октября 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Bash</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Ещё <a href=\"https://github.com/vkostyanetsky/ScriptsFor1C/blob/master/Технологический%20журнал/ExceptionsNumberByMinutes.sh\" target=\"_blank\">скрипт</a>. Считает количество исключений в минуту и строит топ, по которому видно распределение. Можно быстро оценить периоды, когда программы сбоили особенно яростно.</p>\n<p>По ходу дела столкнулся в двумя любопытными проблемами, которые меня порядком сбили с толку. Во-первых, я почему-то был уверен, что uniq -c группирует строки вне зависимости от того, где в потоке данных они встречаются. Рассмотрим пример:</p>\n<pre><code>банан\nбанан\nгруша\nбанан\n</code></pre>\n<p>Я думал, что если отдать эти данные uniq -c, то она сгруппирует одинаковые строки, посчитает количество повторений и выдаст примерно такое:</p>\n<pre><code>3 банан\n1 груша\n</code></pre>\n<p>Но на деле получилось так:</p>\n<pre><code>2 банан\n1 груша\n1 банан\n</code></pre>\n<p>Вывод: утилита uniq ожидает, что повторяющиеся строки идут одна за другой. Если строка отличается от предыдущей — она начинает считать счетчик совпадений для неё с нуля. То есть, чтобы получить тот результат, на который я рассчитывал — нужно сначала отсортировать данные, и только потом передавать их в uniq.</p>\n<p>Второй проблемой стала утилита sed. С помощью неё я пытался удалить из потока данных всё, кроме часов и минут (текст попытки на 12-й строке скрипта). Однако часть событий упорно не попадали под регулярку несмотря на то, что визуально никак не отличались. Я промаялся кучу времени и здорово разозлился, но потом вспомнил про существование <a href=\"https://ru.wikipedia.org/wiki/Маркер_последовательности_байтов\" target=\"_blank\">BOM</a>. Вычистил их и дальше все пошло как по маслу.</p>\n<p>BOM используется во всех файлах ТЖ (в этом можно убедиться, например, с помощью <a href=\"https://github.com/vkostyanetsky/ScriptsFor1C/blob/master/Технологический%20журнал/LogFilesWithoutBOM.sh\" target=\"_blank\">скрипта</a>). То есть каждый лог начинается с особых символов, которых невооруженным глазом не увидеть и которые могут помешать обработать первую строку файла (так как эти самые символы не будут попадать под условие регулярного выражения).</p>\n<p>Вывод: проще всего удалять BOM по умолчанию, не оценивая рисков для каждой конкретной задачи. Да, иногда это будет лишним (например, решению задачи по тексту выше через grep BOM никак не мешает). Но я не люблю сюрпризы. Кроме того, несколько тактов процессора на простую замену — явно выгоднее, чем эквивалент в сгоревших нервных клетках и потерянном времени.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "расчет количества исключений по тж 24 октября 2020 · 1с bash готово ещё скрипт . считает количество исключений в минуту и строит топ, по которому видно распределение. можно быстро оценить периоды, когда программы сбоили особенно яростно. по ходу дела столкнулся в двумя любопытными проблемами, которые меня порядком сбили с толку. во-первых, я почему-то был уверен, что uniq -c группирует строки вне зависимости от того, где в потоке данных они встречаются. рассмотрим пример: банан банан груша банан я думал, что если отдать эти данные uniq -c, то она сгруппирует одинаковые строки, посчитает количество повторений и выдаст примерно такое: 3 банан 1 груша но на деле получилось так: 2 банан 1 груша 1 банан вывод: утилита uniq ожидает, что повторяющиеся строки идут одна за другой. если строка отличается от предыдущей — она начинает считать счетчик совпадений для неё с нуля. то есть, чтобы получить тот результат, на который я рассчитывал — нужно сначала отсортировать данные, и только потом передавать их в uniq. второй проблемой стала утилита sed. с помощью неё я пытался удалить из потока данных всё, кроме часов и минут (текст попытки на 12-й строке скрипта). однако часть событий упорно не попадали под регулярку несмотря на то, что визуально никак не отличались. я промаялся кучу времени и здорово разозлился, но потом вспомнил про существование bom . вычистил их и дальше все пошло как по маслу. bom используется во всех файлах тж (в этом можно убедиться, например, с помощью скрипта ). то есть каждый лог начинается с особых символов, которых невооруженным глазом не увидеть и которые могут помешать обработать первую строку файла (так как эти самые символы не будут попадать под условие регулярного выражения). вывод: проще всего удалять bom по умолчанию, не оценивая рисков для каждой конкретной задачи. да, иногда это будет лишним (например, решению задачи по тексту выше через grep bom никак не мешает). но я не люблю сюрпризы. кроме того, несколько тактов процессора на простую замену — явно выгоднее, чем эквивалент в сгоревших нервных клетках и потерянном времени.",
    "tags": [
      "1c",
      "bash",
      "done"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/nerdview\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Профессиональная деформация\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>19 октября 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Семья</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p><img alt=\"Чат с дочкой\" src=\"https://kostyanetsky.ru/notes/nerdview/telegram.png\"/></p>\n<p>Дочка пишет о своих планах — мол, не теряй меня. А у меня профессиональная деформация: этот вполне нормальный чат мой мозг упорно воспринимает как код на Gherkin. Просто какой-то неправильный, что ли, хочется быстренько пофиксить :-)</p>\n<pre><code>И я выхожу\nТогда я в школе\nИ я выхожу\nТогда я покачаюсь\n</code></pre>\n<p>Мы на этом языке пишем автотесты нашей конфигурации для <a href=\"https://github.com/Pr-Mex/vanessa-automation\" target=\"_blank\">Vanessa Automation</a>. Вроде не так уж много я их накатал (сравнивая с некоторыми коллегами — баловался, считай). Но, видимо, достаточно.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "профессиональная деформация 19 октября 2020 · 1с семья работа дочка пишет о своих планах — мол, не теряй меня. а у меня профессиональная деформация: этот вполне нормальный чат мой мозг упорно воспринимает как код на gherkin. просто какой-то неправильный, что ли, хочется быстренько пофиксить :-) и я выхожу тогда я в школе и я выхожу тогда я покачаюсь мы на этом языке пишем автотесты нашей конфигурации для vanessa automation . вроде не так уж много я их накатал (сравнивая с некоторыми коллегами — баловался, считай). но, видимо, достаточно.",
    "tags": [
      "1c",
      "family",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/queries-and-lock-waits\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Запросы и ожидания на блокировках\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>19 октября 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Bash</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Набросал ещё два скрипта для анализа ТЖ: <a href=\"https://github.com/vkostyanetsky/ScriptsFor1C/blob/master/Технологический%20журнал/LongestQueries.sh\" target=\"_blank\">первый</a> строит топ тяжелых запросов к MS SQL, <a href=\"https://github.com/vkostyanetsky/ScriptsFor1C/blob/master/Технологический%20журнал/LongestLockWaitsByRegions.sh\" target=\"_blank\">второй</a> — топ длительных ожиданий на блокировках.</p>\n<p>Тяжелые запросы определяются по продолжительности событий DBMSSQL. То есть, чем дольше выполнялся запрос — тем вероятнее, что в процессе он слопал кучу ресурсов. Обычно это так и есть, хотя для нормальной диагностики нужно смотреть трассировку.</p>\n<p>Ожидания на блокировках тоже считаются по продолжительности. При этом скрипт проверяет, что у события TLOCK заполнено свойство WaitConnections — то есть платформа действительно ждала возможности установить блокировку, а не просто потратила какое-то время на её установку.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "запросы и ожидания на блокировках 19 октября 2020 · 1с bash готово набросал ещё два скрипта для анализа тж: первый строит топ тяжелых запросов к ms sql, второй — топ длительных ожиданий на блокировках. тяжелые запросы определяются по продолжительности событий dbmssql. то есть, чем дольше выполнялся запрос — тем вероятнее, что в процессе он слопал кучу ресурсов. обычно это так и есть, хотя для нормальной диагностики нужно смотреть трассировку. ожидания на блокировках тоже считаются по продолжительности. при этом скрипт проверяет, что у события tlock заполнено свойство waitconnections — то есть платформа действительно ждала возможности установить блокировку, а не просто потратила какое-то время на её установку.",
    "tags": [
      "1c",
      "bash",
      "done"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/top-exceptions-v2\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Новый скрипт топа исключений\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>17 октября 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Bash</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Переписал <a href=\"https://github.com/vkostyanetsky/ScriptsFor1C/blob/master/Технологический%20журнал/FrequentExceptions.sh\" target=\"_blank\">скрипт</a> на баше, строящий топ исключений по собранному ТЖ: хотел решить эту задачу как-то попроще.</p>\n<p>В итоге выкинул из кода возню с заменой начала события на маркер gawk для разделения записей (его можно сразу задать регулярным выражением) и перенес больше логики в скрипт для gawk (так нагляднее, особенно если потом захочется её расширить). </p>\n<p>Получилось явно лучше, чем <a href=\"https://gist.github.com/vkostyanetsky/47e02e199bb32082c4d5019ca88233c0\" target=\"_blank\">было</a> — во всяком случае, логика выглядит понятнее. Изначально, правда, я хотел скорее сократить скрипт в размере и получить что-то вроде:</p>\n<pre><code>grep -hoP \",EXCP,.*\\KDescr=.*\" */*.log | uniq -c | sort -rn\n</code></pre>\n<p>То есть фильтруем только строки с событием EXCP, отрезаем всё до описания ошибки и группируем с помощью uniq. По-моему, очень изящно.</p>\n<p>Однако описание у EXCP может быть многострочным. То есть мы будем время от времени терять часть данных, нужных для расследования (всё описание после первого же перевода строки). Как решить эту проблему так, чтобы скрипт не разбарабанило втрое — я пока не придумал :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "новый скрипт топа исключений 17 октября 2020 · 1с bash готово переписал скрипт на баше, строящий топ исключений по собранному тж: хотел решить эту задачу как-то попроще. в итоге выкинул из кода возню с заменой начала события на маркер gawk для разделения записей (его можно сразу задать регулярным выражением) и перенес больше логики в скрипт для gawk (так нагляднее, особенно если потом захочется её расширить). получилось явно лучше, чем было — во всяком случае, логика выглядит понятнее. изначально, правда, я хотел скорее сократить скрипт в размере и получить что-то вроде: grep -hop \",excp,.*\\kdescr=.*\" */*.log | uniq -c | sort -rn то есть фильтруем только строки с событием excp, отрезаем всё до описания ошибки и группируем с помощью uniq. по-моему, очень изящно. однако описание у excp может быть многострочным. то есть мы будем время от времени терять часть данных, нужных для расследования (всё описание после первого же перевода строки). как решить эту проблему так, чтобы скрипт не разбарабанило втрое — я пока не придумал :-)",
    "tags": [
      "1c",
      "bash",
      "done"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/vulnerabilities\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Уязвимости в конфигурациях 1С\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>13 октября 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Bash</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>В прошлом месяце был на <a href=\"https://infostart.ru/events/1269292/\" target=\"_blank\">митапе</a> «Инфостарта» по безопасности решений на платформе 1С. Узнал кучу интересного! Среди прочего, Олег Тымко обзорно рассказывал про подходы в разработке, которые можно считать потенциальными уязвимостями продуктов. Например, зашитых прямо в код IP-адресов, ссылок, e-mail'ов, паролей и так далее.</p>\n<p>Накидал вчера простой <a href=\"https://github.com/vkostyanetsky/ScriptsForLogAnalysis/blob/master/Файлы%20конфигурации/Vulnerabilities.sh\" target=\"_blank\">скрипт</a> на баше, который роется в выгрузке конфигурации в поисках таких косяков. По сути, эта штука просто пропускает конфигурацию через регулярки — я особо не заморачивался и чисто из спортивного интереса реализовал два-три варианта.</p>\n<p>Вывод: для серьёзной итеративной разработки лучше сразу думать в сторону чего-то вроде SonarQube, а не колхозить вот это всё — подходы «в лоб» дают слишком много ложных срабатываний, нужно думать над фильтрами, исключениями, историей и другой обвязкой.</p>\n<p>А вот для быстрой оценки такого подхода вполне достаточно — никакой инфраструктуры, никакой возни с настройкой и железом. Выгрузил конфигурацию, пнул баш и, собственно, всё — готовый результат за несколько секунд.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "уязвимости в конфигурациях 1с 13 октября 2020 · 1с bash готово в прошлом месяце был на митапе «инфостарта» по безопасности решений на платформе 1с. узнал кучу интересного! среди прочего, олег тымко обзорно рассказывал про подходы в разработке, которые можно считать потенциальными уязвимостями продуктов. например, зашитых прямо в код ip-адресов, ссылок, e-mail'ов, паролей и так далее. накидал вчера простой скрипт на баше, который роется в выгрузке конфигурации в поисках таких косяков. по сути, эта штука просто пропускает конфигурацию через регулярки — я особо не заморачивался и чисто из спортивного интереса реализовал два-три варианта. вывод: для серьёзной итеративной разработки лучше сразу думать в сторону чего-то вроде sonarqube, а не колхозить вот это всё — подходы «в лоб» дают слишком много ложных срабатываний, нужно думать над фильтрами, исключениями, историей и другой обвязкой. а вот для быстрой оценки такого подхода вполне достаточно — никакой инфраструктуры, никакой возни с настройкой и железом. выгрузил конфигурацию, пнул баш и, собственно, всё — готовый результат за несколько секунд.",
    "tags": [
      "1c",
      "bash",
      "done"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/single-sign-on\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Про Single Sign-On\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>12 сентября 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p><a href=\"https://twitter.com/EpicGames/status/1303716447831707649\" target=\"_blank\"><img alt=\"Твит\" src=\"https://kostyanetsky.ru/notes/single-sign-on/snap-tweet-EpicGames-1303716447831707649.png\"/></a></p>\n<p>Этот эпизод <s>схватки двух йокодзун</s> конфликта между Apple и Epic Games, безотносительно всего прочего — отличное напоминание, что Single Sign-On в интернете использовать нельзя: нигде, никогда, ни на каких сервисах. Неизвестно, какие ещё гиганты внезапно сойдутся на кулачках или какой сайт забанит тебя без всякой внятной причины. Because screw you, dude, that's why.</p>\n<p>В кейсе из твита выше пользователи, возможно, отделаются малой кровью, а вот если вашу учетку заблокирует что-то вроде Google — ситуация вполне может оказаться критической: куча сервисов, на которые вы ходили через гугл, резко превратятся в тыкву.</p>\n<p>Решений, по удобству ничем не уступающих Single Sign-On, полным-полно. Менеджеры паролей, разнообразные расширения для браузеров, «железные» ключи — да что угодно будет лучше, чем проприетарные сервисы с закрытым кодом, на которые вы не имеете никакого влияния.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "про single sign-on 12 сентября 2020 · тем временем этот эпизод схватки двух йокодзун конфликта между apple и epic games, безотносительно всего прочего — отличное напоминание, что single sign-on в интернете использовать нельзя: нигде, никогда, ни на каких сервисах. неизвестно, какие ещё гиганты внезапно сойдутся на кулачках или какой сайт забанит тебя без всякой внятной причины. because screw you, dude, that's why. в кейсе из твита выше пользователи, возможно, отделаются малой кровью, а вот если вашу учетку заблокирует что-то вроде google — ситуация вполне может оказаться критической: куча сервисов, на которые вы ходили через гугл, резко превратятся в тыкву. решений, по удобству ничем не уступающих single sign-on, полным-полно. менеджеры паролей, разнообразные расширения для браузеров, «железные» ключи — да что угодно будет лучше, чем проприетарные сервисы с закрытым кодом, на которые вы не имеете никакого влияния.",
    "tags": [
      "meanwhile"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/techprof\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Профессионал по техвопросам\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>5 сентября 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>В конце августа сдал тест на профессионала 1С по техническим вопросам крупных внедрений. Это по сути такой входной билет на <a href=\"https://1c.ru/rus/partners/training/uc1/course.jsp?id=199\" target=\"_blank\">основной экзамен</a>, призванный проредить поток претендентов и заставить их подучить теорию.</p>\n<p>В тесте четырнадцать вопросов, случайно набранных из порядка пятиста возможных; нужно правильно ответить хотя бы на двенадцать. На это дается полчаса, однако по факту достаточно пяти-десяти минут: большинство ответов логически выводится или запоминается. Попадаются и неточности, и расплывчатые формулировки, но их мало. Норм вопросы, короче.</p>\n<p>Подбор тем показался мне порядочным винегретом — по чуть-чуть из всего подряд. Впрочем, по факту такой охват скорее полезен: смотришь на очередной непривычный вопрос, отвечаешь, ошибаешься. Тушишь задницу, лезешь разбираться как так. Становишься немного умнее (но это не точно).</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "профессионал по техвопросам 5 сентября 2020 · 1с готово в конце августа сдал тест на профессионала 1с по техническим вопросам крупных внедрений. это по сути такой входной билет на основной экзамен , призванный проредить поток претендентов и заставить их подучить теорию. в тесте четырнадцать вопросов, случайно набранных из порядка пятиста возможных; нужно правильно ответить хотя бы на двенадцать. на это дается полчаса, однако по факту достаточно пяти-десяти минут: большинство ответов логически выводится или запоминается. попадаются и неточности, и расплывчатые формулировки, но их мало. норм вопросы, короче. подбор тем показался мне порядочным винегретом — по чуть-чуть из всего подряд. впрочем, по факту такой охват скорее полезен: смотришь на очередной непривычный вопрос, отвечаешь, ошибаешься. тушишь задницу, лезешь разбираться как так. становишься немного умнее (но это не точно).",
    "tags": [
      "1c",
      "done"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/unresolved-gopher\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Неразрешимые ссылки на функциональные опции\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>19 августа 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Приведу вариант решения проблемы <a href=\"https://kostyanetsky.ru/notes/unresolved-references\" target=\"_blank\">неразрешимых ссылок</a>, возникший после удаления функциональной опции. Вводная — при проверке конфигурации получаю десятка два сообщений вида:</p>\n<pre><code>CommonForm.PersonalSettings.Form Unresolved metadata object references (2)\nCatalog.BankAccounts.Form.GLAccountsEditForm.Form Unresolved metadata object references (1)\nCatalog.CashRegisters.Form.GLAccountsEditForm.Form Unresolved metadata object references (1)\n</code></pre>\n<p>Выгружаю конфигурацию в файлы, открываю Form.xml для одной из проблемных форм. Начинаю с той, где элементов немного — так проблему заметить будет проще.</p>\n<p>Бегло просматриваю файл в поисках чего-то необычного. Искать долго не приходится:</p>\n<p><img alt=\"Подозреваемый\" src=\"https://kostyanetsky.ru/notes/unresolved-gopher/suspect.png\"/></p>\n<p>Нормальная ссылка на функциональную опцию — её имя (как в случае DepreciationOfAssets). А вот если вместо имени указан GUID — этой функциональной опции в конфигурации нет. Ссылка неразрешима.</p>\n<p>Делаю поиск этого GUID'а по остальной выгрузке и нахожу почти все проблемы, на которые ссылалась платформа при проверке. Решить их легко: удалить битую ссылку из XML, а потом загрузить файл обратно в конфигурацию. Можно ещё проще: открыть список функциональных опций для элемента формы и тут же сохранить его. В этом случая битая ссылка также будет удалена.</p>\n<p>Почему искать таких потеряшек через сам Конфигуратор — занятие для клинических оптимистов? Да просто проблему почти невозможно заметить. В лучшем случае вы увидите что-то в духе:</p>\n<p><img alt=\"Настоящая улика\" src=\"https://kostyanetsky.ru/notes/unresolved-gopher/evidence.png\"/></p>\n<p>Конфигуратор понимает, что в поле две опции, но получить название для второй не может (её нет). А ведь чаще всего функциональная опция только одна! И картина выглядит так:</p>\n<p><img alt=\"Ваша честь, я невиновен!\" src=\"https://kostyanetsky.ru/notes/unresolved-gopher/innocent.png\"/></p>\n<iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/EHX7NZS8zAI\" width=\"560\"></iframe>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "неразрешимые ссылки на функциональные опции 19 августа 2020 · 1с приведу вариант решения проблемы неразрешимых ссылок , возникший после удаления функциональной опции. вводная — при проверке конфигурации получаю десятка два сообщений вида: commonform.personalsettings.form unresolved metadata object references (2) catalog.bankaccounts.form.glaccountseditform.form unresolved metadata object references (1) catalog.cashregisters.form.glaccountseditform.form unresolved metadata object references (1) выгружаю конфигурацию в файлы, открываю form.xml для одной из проблемных форм. начинаю с той, где элементов немного — так проблему заметить будет проще. бегло просматриваю файл в поисках чего-то необычного. искать долго не приходится: нормальная ссылка на функциональную опцию — её имя (как в случае depreciationofassets). а вот если вместо имени указан guid — этой функциональной опции в конфигурации нет. ссылка неразрешима. делаю поиск этого guid'а по остальной выгрузке и нахожу почти все проблемы, на которые ссылалась платформа при проверке. решить их легко: удалить битую ссылку из xml, а потом загрузить файл обратно в конфигурацию. можно ещё проще: открыть список функциональных опций для элемента формы и тут же сохранить его. в этом случая битая ссылка также будет удалена. почему искать таких потеряшек через сам конфигуратор — занятие для клинических оптимистов? да просто проблему почти невозможно заметить. в лучшем случае вы увидите что-то в духе: конфигуратор понимает, что в поле две опции, но получить название для второй не может (её нет). а ведь чаще всего функциональная опция только одна! и картина выглядит так:",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/method-with-surprise\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Метод с сюрпризом\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>27 июля 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Пару недель назад столкнулся с досадным багом. Контекст — примитивнее не придумаешь: нужно найти документ по номеру. Если сделать так — документ будет найден:</p>\n<pre><code>SELECT Ref FROM Document.Invoice WHERE Number = &amp;Number\n</code></pre>\n<p>А вот так — фигушки:</p>\n<pre><code>Documents.Invoice.FindByNumber(Number)\n</code></pre>\n<p>Сначала я даже слегка завис, но потом полез в документацию и, конечно, нашел ответ. У метода FindByNumber() есть второй параметр, IntervalDate, нужный для поиска периодического документа. С помощью него можно сузить поиск до конкретного периода; например, если периодичность нумерации — год и мы присвоим параметру значение 01-05-2020, то поиск пойдет в периоде от 01-01-2020 до 31-12-2020. А нумерация у документа Invoice и правда периодическая — в пределах года.</p>\n<p>Так в чем проблема? Дело в том, что за уклончивым «the parameter is used for documents with periodic numbering» на самом деле скрывается железное правило: параметр <strong>нельзя</strong> опускать для периодических документов.</p>\n<p>Чтобы убедиться в этом, посмотрим, какой SQL выполняется на стороне СУБД. Делаем обычный запрос — никаких сюрпризов. P1 здесь — разделитель, P2 — номер документа:</p>\n<pre><code>SELECT\n    T1._IDRRef \nFROM\n    dbo._Document283 T1\nWHERE\n    ((T1._Fld704 = @P1))\n    AND ((T1._Number = @P2))\n</code></pre>\n<p>А вот если выполнить FindByNumber(), то в запросе появится третий параметр со значением 2001-12-31 23:59:59 — ну да, «конец первого года с начала времён»:</p>\n<pre><code>SELECT\n    T1._IDRRef\nFROM\n    dbo._Document283 T1\nWHERE\n    ((T1._Fld704 = @P1))\n    AND\n    (\n        T1._Number = @P2\n        AND T1._Date_Time &lt;= @P3\n    )\n</code></pre>\n<p>Конечно, такой запрос не находит нужный документ. Он вообще ничего не найдет  в любой реальной базе — никогда, ни при каких обстоятельствах.</p>\n<p>Подведем итог. Как решить проблему — понятно: указываем IntervalDate или, если даты нет, подключаем ЗначениеРеквизитаОбъекта() БСП или его аналог. Но, честное слово, со стороны платформы, было бы куда адекватнее выбрасывать исключение, если FindByNumber() вызван без IntervalDate, а у документа включена периодичность — чем вот так, тихой сапой, делать гарантированно бессмысленные запросы.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "метод с сюрпризом 27 июля 2020 · 1с пару недель назад столкнулся с досадным багом. контекст — примитивнее не придумаешь: нужно найти документ по номеру. если сделать так — документ будет найден: select ref from document.invoice where number = &number а вот так — фигушки: documents.invoice.findbynumber(number) сначала я даже слегка завис, но потом полез в документацию и, конечно, нашел ответ. у метода findbynumber() есть второй параметр, intervaldate, нужный для поиска периодического документа. с помощью него можно сузить поиск до конкретного периода; например, если периодичность нумерации — год и мы присвоим параметру значение 01-05-2020, то поиск пойдет в периоде от 01-01-2020 до 31-12-2020. а нумерация у документа invoice и правда периодическая — в пределах года. так в чем проблема? дело в том, что за уклончивым «the parameter is used for documents with periodic numbering» на самом деле скрывается железное правило: параметр нельзя опускать для периодических документов. чтобы убедиться в этом, посмотрим, какой sql выполняется на стороне субд. делаем обычный запрос — никаких сюрпризов. p1 здесь — разделитель, p2 — номер документа: select t1._idrref from dbo._document283 t1 where ((t1._fld704 = @p1)) and ((t1._number = @p2)) а вот если выполнить findbynumber(), то в запросе появится третий параметр со значением 2001-12-31 23:59:59 — ну да, «конец первого года с начала времён»: select t1._idrref from dbo._document283 t1 where ((t1._fld704 = @p1)) and ( t1._number = @p2 and t1._date_time <= @p3 ) конечно, такой запрос не находит нужный документ. он вообще ничего не найдет в любой реальной базе — никогда, ни при каких обстоятельствах. подведем итог. как решить проблему — понятно: указываем intervaldate или, если даты нет, подключаем значениереквизитаобъекта() бсп или его аналог. но, честное слово, со стороны платформы, было бы куда адекватнее выбрасывать исключение, если findbynumber() вызван без intervaldate, а у документа включена периодичность — чем вот так, тихой сапой, делать гарантированно бессмысленные запросы.",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/one-query-to-rule-them-all\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Один запрос, что правит всеми\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>25 июля 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Оптимизация</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Истории ради <a href=\"https://gist.github.com/vkostyanetsky/ddb286da9674b05d014389bed3b022c4\" target=\"_blank\">закинул</a> на Github Gist один из неоптимальных запросов, с которыми возился несколько месяцев назад. Он использовался для динамического списка в форме элемента справочника и, когда пользователь открывал вкладку с этим списком, платформа погружалась в медитацию даже в относительно небольшой базе.</p>\n<p>На первый взгляд структура запроса простая и четкая: пачка запросов к таблицам документов, соединяемых через ОБЪЕДИНИТЬ ВСЁ. Каждая из таблиц фильтруется по примерно одинаковым условиям — тип ссылки, дата и вхождение ссылки в результат подзапроса.</p>\n<p>Однако потенциальных проблем тут сразу несколько. Во-первых, работа идет как минимум с 14-ю таблицами — по числу соединяемых запросов. Это само по себе повышает риск того, что оптимизатор не успеет подобрать хотя бы относительно приличный план выполнения. Скорее всего, он просто ткнет пальцем в небо, а дальше — как повезет.</p>\n<p>Во-вторых, большая часть этой работы, вероятно, будет выполняться впустую. Каждый из запросов содержит примерно такую конструкцию:</p>\n<pre><code>WHERE VALUETYPE(AdditionalExpenses.Ref) IN (&amp;DocumentsListSelectedTypes)\n</code></pre>\n<p>То есть в динамический список передается список типов документов, которые требуется вывести. Однако это условие будет наложено <strong>после</strong> выборки данных, и если пользователю нужны только инвойсы — СУБД все равно сначала выгребет все 14 таблиц, а потом отбросит 13 из них.</p>\n<p>Но это всё не так критично. Если бы список проблем этим и ограничивался, мы, возможно, и не полезли бы разбираться. Главная проблема — во втором условии секций WHERE: каждый запрос проверяет вхождение ссылки на документ в результат подзапроса.</p>\n<p>Использование вложенного запроса в условиях — само по себе почти табу, если речь идет не о временных таблицах: СУБД часто не в состоянии понять, сколько данных вернет подзапрос и, соответственно, какой способ работы с ними подойдет лучше. Однако тут это ещё и усугубляется тем, к какому источнику данных мы делаем запрос. Критерий отбора — это не таблица в базе данных, которую можно прочитать, пусть даже со сканом — это набор таблиц. В критерии отбора DocumentsByProject их тридцать!</p>\n<p>В этом месте можно было бы сказать «занавес», но нужно добавить, что выборку из тридцати таблиц по определенному типу документа делает каждый из четырнадцати соединяемых запросов.</p>\n<p><img alt=\"OMG\" src=\"https://media.giphy.com/media/oYtVHSxngR3lC/giphy.gif\"/></p>\n<p>Вот теперь занавес :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "один запрос, что правит всеми 25 июля 2020 · 1с готово оптимизация работа истории ради закинул на github gist один из неоптимальных запросов, с которыми возился несколько месяцев назад. он использовался для динамического списка в форме элемента справочника и, когда пользователь открывал вкладку с этим списком, платформа погружалась в медитацию даже в относительно небольшой базе. на первый взгляд структура запроса простая и четкая: пачка запросов к таблицам документов, соединяемых через объединить всё. каждая из таблиц фильтруется по примерно одинаковым условиям — тип ссылки, дата и вхождение ссылки в результат подзапроса. однако потенциальных проблем тут сразу несколько. во-первых, работа идет как минимум с 14-ю таблицами — по числу соединяемых запросов. это само по себе повышает риск того, что оптимизатор не успеет подобрать хотя бы относительно приличный план выполнения. скорее всего, он просто ткнет пальцем в небо, а дальше — как повезет. во-вторых, большая часть этой работы, вероятно, будет выполняться впустую. каждый из запросов содержит примерно такую конструкцию: where valuetype(additionalexpenses.ref) in (&documentslistselectedtypes) то есть в динамический список передается список типов документов, которые требуется вывести. однако это условие будет наложено после выборки данных, и если пользователю нужны только инвойсы — субд все равно сначала выгребет все 14 таблиц, а потом отбросит 13 из них. но это всё не так критично. если бы список проблем этим и ограничивался, мы, возможно, и не полезли бы разбираться. главная проблема — во втором условии секций where: каждый запрос проверяет вхождение ссылки на документ в результат подзапроса. использование вложенного запроса в условиях — само по себе почти табу, если речь идет не о временных таблицах: субд часто не в состоянии понять, сколько данных вернет подзапрос и, соответственно, какой способ работы с ними подойдет лучше. однако тут это ещё и усугубляется тем, к какому источнику данных мы делаем запрос. критерий отбора — это не таблица в базе данных, которую можно прочитать, пусть даже со сканом — это набор таблиц. в критерии отбора documentsbyproject их тридцать! в этом месте можно было бы сказать «занавес», но нужно добавить, что выборку из тридцати таблиц по определенному типу документа делает каждый из четырнадцати соединяемых запросов. вот теперь занавес :-)",
    "tags": [
      "1c",
      "done",
      "optimization",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/thisobject-thisobject\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                ЭтотОбъект.ЭтотОбъект\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>24 июля 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Вебдев</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Javascript</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p><a href=\"https://twitter.com/webholt/status/923830370822389760\" target=\"_blank\"><img alt=\"Твит\" src=\"https://kostyanetsky.ru/notes/thisobject-thisobject/snap-tweet-webholt-923830370822389760.png\"/></a></p>\n<p>Обожаю JavaScript! Каждый раз, когда у меня сгорает задница от какой-нибудь странной дичи в любимой платформе, я просто открываю любой тред про будни веб-девелоперов и быстро, очень быстро успокаиваюсь.</p>\n<p>Впрочем, похожие трюки можно повторить в 1С. Например, JavaScript понимает window.window.window.location, а платформа — <a href=\"https://kostyanetsky.ru/notes/thisobject-thisobject/thisobject-thisobject.png\" target=\"_blank\">вот это</a> :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "этотобъект.этотобъект 24 июля 2020 · 1с вебдев javascript обожаю javascript! каждый раз, когда у меня сгорает задница от какой-нибудь странной дичи в любимой платформе, я просто открываю любой тред про будни веб-девелоперов и быстро, очень быстро успокаиваюсь. впрочем, похожие трюки можно повторить в 1с. например, javascript понимает window.window.window.location, а платформа — вот это :-)",
    "tags": [
      "1c",
      "webdev",
      "javascript"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/service-launcher-update\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Обновление запускатора служб\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>22 июля 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Powershell</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Рабочее место</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Доработал логику <a href=\"https://kostyanetsky.ru/notes/service-launcher\" target=\"_blank\">запускатора служб</a>. Теперь, если вызвать скрипт без параметров (т.е. не указав ни -start, ни -stop) — он сам решит, запускать службы или останавливать их.</p>\n<p>Для этого скрипт определит статус первой службы в списке. Если она работает — все службы из списка будут остановлены, если выключена — скрипт попытается их запустить.</p>\n<p>Зачем это нужно? Ну, если вы вызываете скрипт прямо с программируемой клавиатуры, как я — теперь вам нужна только одна кнопка. Раньше было нужно две: одна для запуска служб, вторая для остановки.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "обновление запускатора служб 22 июля 2020 · готово powershell рабочее место доработал логику запускатора служб . теперь, если вызвать скрипт без параметров (т.е. не указав ни -start, ни -stop) — он сам решит, запускать службы или останавливать их. для этого скрипт определит статус первой службы в списке. если она работает — все службы из списка будут остановлены, если выключена — скрипт попытается их запустить. зачем это нужно? ну, если вы вызываете скрипт прямо с программируемой клавиатуры, как я — теперь вам нужна только одна кнопка. раньше было нужно две: одна для запуска служб, вторая для остановки.",
    "tags": [
      "done",
      "powershell",
      "workplace"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/vuejs-blog\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Блог на Vue.js\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>21 июля 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Блог</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Вебдев</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Node.js</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Javascript</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>В середине прошлого года я <a href=\"https://kostyanetsky.ru/notes/so-much\" target=\"_blank\">загорелся</a> идеей переписать этот сайт на чем-то посовременнее PHP, выбрал Vue.js в качестве фреймворка и принялся за дело. JavaScript я на тот момент почти не знал, поэтому набил прорву шишек на кейсах в духе «метод вывода даты падает в Safari» — однако в итоге получил вполне жизнеспособное приложение.</p>\n<p>Ну, как жизнеспособное? С одной стороны, главное у меня получилось — я разработал клиентское веб-приложение, которое ходит на сервер только за данными, а весь интерфейс собирает само. С другой — пришлось накрутить на фреймворк целую армию <s>костылей</s> хуков даже для самых простых штук (вроде подсветки элементов меню или, скажем, выдачи правильных кодов HTTP). Кое-что я вообще с наскока реализовать не смог — например, выдачу HTML-версий страниц для Яндекса (их пауки в 2020-м году не умеют индексировать сайты на JavaScript).</p>\n<p>В общем, опыт вышел полезным, но результат — настолько спорным, что в конце концов я бросил эту затею, а получившегося Франкенштейна <a href=\"https://github.com/vkostyanetsky/VuejsBlog\" target=\"_blank\">выложил</a> на GitHub. Возможно, он кому-то сэкономит время на решение задач в духе «как вывести через Vue.js произвольный HTML» или «как научить VueI18n работать с русским языком».</p>\n<p>Документации там нет, правда. Я сначала хотел подробно расписать, как что работает, но быстро понял, что потрачу уйму времени без видимой пользы. Вероятно, буду возвращаться к этой теме под настроение — а пока, так сказать, ограничимся парадигмой MVP :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "блог на vue.js 21 июля 2020 · блог вебдев node.js готово javascript в середине прошлого года я загорелся идеей переписать этот сайт на чем-то посовременнее php, выбрал vue.js в качестве фреймворка и принялся за дело. javascript я на тот момент почти не знал, поэтому набил прорву шишек на кейсах в духе «метод вывода даты падает в safari» — однако в итоге получил вполне жизнеспособное приложение. ну, как жизнеспособное? с одной стороны, главное у меня получилось — я разработал клиентское веб-приложение, которое ходит на сервер только за данными, а весь интерфейс собирает само. с другой — пришлось накрутить на фреймворк целую армию костылей хуков даже для самых простых штук (вроде подсветки элементов меню или, скажем, выдачи правильных кодов http). кое-что я вообще с наскока реализовать не смог — например, выдачу html-версий страниц для яндекса (их пауки в 2020-м году не умеют индексировать сайты на javascript). в общем, опыт вышел полезным, но результат — настолько спорным, что в конце концов я бросил эту затею, а получившегося франкенштейна выложил на github. возможно, он кому-то сэкономит время на решение задач в духе «как вывести через vue.js произвольный html» или «как научить vuei18n работать с русским языком». документации там нет, правда. я сначала хотел подробно расписать, как что работает, но быстро понял, что потрачу уйму времени без видимой пользы. вероятно, буду возвращаться к этой теме под настроение — а пока, так сказать, ограничимся парадигмой mvp :-)",
    "tags": [
      "blog",
      "webdev",
      "nodejs",
      "done",
      "javascript"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/broken-bicycle\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Сломанный велосипед\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>20 июля 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p><a href=\"https://www.1ci.com/applications/1c-drive/\" target=\"_blank\"><img alt=\"1C:Drive\" src=\"https://kostyanetsky.ru/notes/broken-bicycle/broken-bicycle.png\"/></a></p>\n<p>Думаю, эту картинку для 1Ci нарисовал человек, прямо вот максимально далекий от разработки самой конфигурации и программирования вообще. Потому как программист видит на ней ровно два месседжа о продукте: </p>\n<ol>\n<li>Это велосипед.</li>\n<li>Он сломан.</li>\n</ol>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "сломанный велосипед 20 июля 2020 · 1с думаю, эту картинку для 1ci нарисовал человек, прямо вот максимально далекий от разработки самой конфигурации и программирования вообще. потому как программист видит на ней ровно два месседжа о продукте: это велосипед. он сломан.",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/service-launcher\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Запускатор служб\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>13 июля 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Powershell</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Рабочее место</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Какое-то время назад я <a href=\"https://kostyanetsky.ru/notes/manage-services-with-powershell\" target=\"_blank\">писал</a> про командлеты PowerShell, с помощью которых можно запускать и останавливать службы. В итоге я собрал из этих набросков нормальный скрипт: он читает список к запуску или остановке служб из отдельного файла, а ещё проверяет и (если нужно) запрашивает права администратора.</p>\n<p>Результат можно <a href=\"https://github.com/vkostyanetsky/ServiceLauncher\" target=\"_blank\">посмотреть</a> на GitHub'е. No big deal — хотел поупражняться в языке и упростить ежедневную рутину: в моей системе наберется десятка полтора прожорливых сервисов, которые нужны для работы, но бесполезны в другое время. Вручную останавливать, а потом запускать этот зоопарк неудобно, а вот одной командой — совсем другое дело!</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "запускатор служб 13 июля 2020 · готово powershell рабочее место какое-то время назад я писал про командлеты powershell, с помощью которых можно запускать и останавливать службы. в итоге я собрал из этих набросков нормальный скрипт: он читает список к запуску или остановке служб из отдельного файла, а ещё проверяет и (если нужно) запрашивает права администратора. результат можно посмотреть на github'е. no big deal — хотел поупражняться в языке и упростить ежедневную рутину: в моей системе наберется десятка полтора прожорливых сервисов, которые нужны для работы, но бесполезны в другое время. вручную останавливать, а потом запускать этот зоопарк неудобно, а вот одной командой — совсем другое дело!",
    "tags": [
      "done",
      "powershell",
      "workplace"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/data-size-console\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Размер данных базы 1С\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>11 июля 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>На прошлой неделе листал комментарии к 8.3.15 и наткнулся на метод ПолучитьРазмерДанныхБазыДанных(). Стало любопытно, как эта штука работает и насколько её данные расходятся с теми, которые можно получить из, например, Management Studio.</p>\n<p>В итоге накатал что-то вроде <a href=\"https://github.com/vkostyanetsky/DataSizeConsole\" target=\"_blank\">консоли</a>, через которую методу можно передавать разные метаданные, и принялся следить за запросами платформы к БД.</p>\n<p>В общем, размер данных платформа считает примерно таким выражением:</p>\n<pre><code>CAST(\n    SUM(\n        CAST(\n            DATALENGTH(T1._Fld40) AS NUMERIC(12, 0)\n        )\n    ) AS NUMERIC(18, 0)\n)\n</code></pre>\n<p>И так для каждого поля, которое есть у объекта, включая стандартные. Если есть табличные части — они тоже считаются. Результат суммируется.</p>\n<p>Выводы?</p>\n<p>Ну, во-первых, понятно, почему у метода такое дурацкое название. Он считает не размер таблиц, как я изначально подумал, а именно <strong>размер данных</strong> — то есть на оценку не влияют ни расходы на схему данных, ни расходы на индексы, ни механика экстентов. Учитывается только размер самих данных, которые хранятся непосредственно в объекте.</p>\n<p>Таким образом, реальный объём места, которое слопал условный справочник номенклатуры, будет больше того, которое покажет метод. Возможно, значительно. Для точной аналитики такой подход не годится, но чтобы быстро оценить распределение данных в БД – вполне подходит. </p>\n<p>Во-вторых, метод никак не считает расходы на историю данных для анализируемых объектов, что честно указано в документации. Теоретически их можно посчитать вручную, оттолкнувшись от _DataHistoryMetadata, но подождем релиз-другой — возможно, разработчики это добавят.</p>\n<p>В-третьих, СУБД в ходе расчетов выгребает все содержимое нужных таблиц, а потом считает размер того, что выгребла. То есть вызов, скорее всего, приведет к куче сканирований и может быстро вымыть буферный кэш. На 1cFresh запросы будут делаться с учетом разделителей, но это слабое утешение, как по мне.</p>\n<p>В общем, на работающем проде применять с осторожностью.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "размер данных базы 1с 11 июля 2020 · 1с готово на прошлой неделе листал комментарии к 8.3.15 и наткнулся на метод получитьразмерданныхбазыданных(). стало любопытно, как эта штука работает и насколько её данные расходятся с теми, которые можно получить из, например, management studio. в итоге накатал что-то вроде консоли , через которую методу можно передавать разные метаданные, и принялся следить за запросами платформы к бд. в общем, размер данных платформа считает примерно таким выражением: cast( sum( cast( datalength(t1._fld40) as numeric(12, 0) ) ) as numeric(18, 0) ) и так для каждого поля, которое есть у объекта, включая стандартные. если есть табличные части — они тоже считаются. результат суммируется. выводы? ну, во-первых, понятно, почему у метода такое дурацкое название. он считает не размер таблиц, как я изначально подумал, а именно размер данных — то есть на оценку не влияют ни расходы на схему данных, ни расходы на индексы, ни механика экстентов. учитывается только размер самих данных, которые хранятся непосредственно в объекте. таким образом, реальный объём места, которое слопал условный справочник номенклатуры, будет больше того, которое покажет метод. возможно, значительно. для точной аналитики такой подход не годится, но чтобы быстро оценить распределение данных в бд – вполне подходит. во-вторых, метод никак не считает расходы на историю данных для анализируемых объектов, что честно указано в документации. теоретически их можно посчитать вручную, оттолкнувшись от _datahistorymetadata, но подождем релиз-другой — возможно, разработчики это добавят. в-третьих, субд в ходе расчетов выгребает все содержимое нужных таблиц, а потом считает размер того, что выгребла. то есть вызов, скорее всего, приведет к куче сканирований и может быстро вымыть буферный кэш. на 1cfresh запросы будут делаться с учетом разделителей, но это слабое утешение, как по мне. в общем, на работающем проде применять с осторожностью.",
    "tags": [
      "1c",
      "done"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/what-is-inside-the-drum\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Выгрузка стандартных обработок\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>5 июля 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Недавно внедрили в нашу конфигурацию встроенный в платформу механизм истории данных вместо морально и функционально устаревшего велосипеда из SSLi. Сейчас как раз дописываю выгрузку историю данных в бэкап и загрузку его обратно: удивительно, но этого пока не умеет ни БСП, ни БТС, ни SSLi (впрочем, от последней я и не ждал).</p>\n<p>Как закончу, расскажу подробнее. Пока хочу отметить любопытную опцию, которая пригодилась по ходу дела: встроенные в платформу обработки, которые доступны из меню «Все функции», можно выгрузить в виде обычных epf-файлов! Трюк очень подробно разобрали коллеги на Инфостарте (<a href=\"https://infostart.ru/public/369487/\" target=\"_blank\">вот тут</a> и <a href=\"https://infostart.ru/public/538300/\" target=\"_blank\">вот тут</a>). Вкратце магия выглядит вот так:</p>\n<pre><code>КопироватьФайл(\n    \"v8res://mngbase/StandardDataChangeHistory.epf\",\n    \"Q:/StandardDataChangeHistory.epf\"\n);\n</code></pre>\n<p>Полный список стандартных форм и обработок, которые можно вытащить, способ получения этого списка, а также куча споров вокруг и около — по ссылкам выше.</p>\n<p>Зачем это пригодится вам — честно, не знаю. Что касается нас, то мы делали интерфейсы для работы с историей данных и было любопытно, как они написаны у самой 1С (спойлер: довольно неряшливо).</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "выгрузка стандартных обработок 5 июля 2020 · 1с работа недавно внедрили в нашу конфигурацию встроенный в платформу механизм истории данных вместо морально и функционально устаревшего велосипеда из ssli. сейчас как раз дописываю выгрузку историю данных в бэкап и загрузку его обратно: удивительно, но этого пока не умеет ни бсп, ни бтс, ни ssli (впрочем, от последней я и не ждал). как закончу, расскажу подробнее. пока хочу отметить любопытную опцию, которая пригодилась по ходу дела: встроенные в платформу обработки, которые доступны из меню «все функции», можно выгрузить в виде обычных epf-файлов! трюк очень подробно разобрали коллеги на инфостарте ( вот тут и вот тут ). вкратце магия выглядит вот так: копироватьфайл( \"v8res://mngbase/standarddatachangehistory.epf\", \"q:/standarddatachangehistory.epf\" ); полный список стандартных форм и обработок, которые можно вытащить, способ получения этого списка, а также куча споров вокруг и около — по ссылкам выше. зачем это пригодится вам — честно, не знаю. что касается нас, то мы делали интерфейсы для работы с историей данных и было любопытно, как они написаны у самой 1с (спойлер: довольно неряшливо).",
    "tags": [
      "1c",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/how-not-to-land\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Тонкое искусство приземления\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>31 мая 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/bvim4rsNHkQ\" width=\"560\"></iframe>\n<p>На волне актуальных новостей наткнулся на трёхлетней давности ролик от SpaceX с подборкой неудачных приземлений на плавучую платформу. Как по мне — отличный пример того, как нужно относиться к своим ошибкам. С юмором!</p>\n<blockquote>\n<p>Well, technically, it did land… Just not in one piece.</p>\n</blockquote>\n<p>:D</p>\n<p>В комментариях не отстают:</p>\n<blockquote>\n<p>Space X : Launches astronauts for the first time.</p>\n<p>Youtube: Let's recommend this video!</p>\n</blockquote>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "тонкое искусство приземления 31 мая 2020 · тем временем на волне актуальных новостей наткнулся на трёхлетней давности ролик от spacex с подборкой неудачных приземлений на плавучую платформу. как по мне — отличный пример того, как нужно относиться к своим ошибкам. с юмором! well, technically, it did land… just not in one piece. :d в комментариях не отстают: space x : launches astronauts for the first time. youtube: let's recommend this video!",
    "tags": [
      "meanwhile"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/fred\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Фред\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>24 мая 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">English</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Игорь Сахаров перепел «Фреда» Короля и Шута на английском языке:</p>\n<iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/MsFQmXdC29g\" width=\"560\"></iframe>\n<p>Роцк! Ро-о-оцк! :-)</p>\n<p>Если серьёзно, я уже как-то <a href=\"https://kostyanetsky.ru/notes/i-wish-i-could\" target=\"_blank\">писал</a> про это, но мне ни разу не лень повторить: такие штуки — один из самых простых и приятных способов запомнить кучу слов и оборотов.</p>\n<p>Да, вокруг хватает крутанов с цепкими мозгами, которым этот трюк не нужен; он, скорее, для обычных ребят вроде меня самого. У нас все эти what a good match you and I и spellbound by your beauty pure and true в других обстоятельствах порой улетучиваются из головы, ну… Секунд через десять?</p>\n<p>А так — смотришь ролик, невольно подпеваешь и не замечаешь, как текст намертво оседает в памяти.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "фред 24 мая 2020 · english игорь сахаров перепел «фреда» короля и шута на английском языке: роцк! ро-о-оцк! :-) если серьёзно, я уже как-то писал про это, но мне ни разу не лень повторить: такие штуки — один из самых простых и приятных способов запомнить кучу слов и оборотов. да, вокруг хватает крутанов с цепкими мозгами, которым этот трюк не нужен; он, скорее, для обычных ребят вроде меня самого. у нас все эти what a good match you and i и spellbound by your beauty pure and true в других обстоятельствах порой улетучиваются из головы, ну… секунд через десять? а так — смотришь ролик, невольно подпеваешь и не замечаешь, как текст намертво оседает в памяти.",
    "tags": [
      "english"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/perfectly-balanced\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Об идеальном балансе\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>20 мая 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Хочу поделиться парой классных текстов о современном софте. Они не особенно свежие (первый-то уж точно), но наверняка ведь кто-то пропустил:</p>\n<ul>\n<li><a href=\"https://tonsky.me/blog/disenchantment/ru/\" target=\"_blank\">Моё разочарование в софте</a> Никиты Тонского</li>\n<li><a href=\"https://habr.com/ru/company/jugru/blog/493178/\" target=\"_blank\">В софте всё восхитительно, но все недовольны</a> Евгения Трифонова</li>\n</ul>\n<p>К чему я это вспомнил? На прошлой неделе участвовал в хакатоне среди программистов нашей компании. Узнал кучу клевых штук, а по итогам даже занял первое место (вместе с ещё двумя участниками, у которых получились очень похожие решения).</p>\n<p>(если вы — тоже сотрудник «Первого БИТа», то <a href=\"https://newportal.1cbit.ru/news/3066979/\" target=\"_blank\">итоги</a> хакатона лежат на портале; там же — <a href=\"https://newportal.1cbit.ru/news/3066980/\" target=\"_blank\">отзыв</a> другого победителя, Димы Лещенко)</p>\n<p>В процессе нужно было развернуть и настроить целую гору софта: EDT, RabbitMQ, Docker, GitLab, JIRA, SonarQube и ещё вагон инструментов поменьше и попроще. Ладно, к RabbitMQ у меня претензий нет: легкий и быстрый, но вот остальное… Про хороший аппетит EDT я знал и раньше, а вот прожорливость GitLab и JIRA по-настоящему удивила.</p>\n<p>Да, в моём случае всё запускалось в докере; да, конфигурация не была оптимальной (например, было развернуто несколько серверов PostgreSQL вместо одного); да, докер был для Windows, а его реализация под эту платформу — тема для едких шуток у всех сисадминов, с которыми я знаком. Но потратить 12 гигабайт ОЗУ прямо со старта?! Про процессор вообще молчу — нагрузка была такая, будто компьютер просчитывал ядерный взрыв в реальном времени.</p>\n<p>Короче, лучшей иллюстрации к тезисам Никиты подобрать трудно: софт выше слопал море ресурсов и невозмутимо попросил ещё, даже не приступив к какой-то понятной задаче. Впрочем, в то же время это отличная иллюстрация к тексту Евгения: я, на секундочку, одной-единственной командой развернул несколько операционных систем со сложными серверами внутри. И потратил на это несоизмеримо меньше времени чем, скажем, пришлось бы потратить несколько лет назад.</p>\n<p>У меня нет ответа. Думаю, ни у кого нет. Это такой вечный холивар внутри профессии: какую сторону не займи, на деле все равно балансируешь между двумя крайностями — с одной стороны, надо писать хороший, быстрый код, с другой — надо не свалиться в преждевременную оптимизацию. Первое в итоге дает чистое удовольствие от хорошо сделанной работы: вспоминаешь, что ты, черт побери, неплох! Второе — просто позволяет не нажить бед с башкой в поисках идеального алгоритма сортировки пузырьком :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "об идеальном балансе 20 мая 2020 · 1с работа хочу поделиться парой классных текстов о современном софте. они не особенно свежие (первый-то уж точно), но наверняка ведь кто-то пропустил: моё разочарование в софте никиты тонского в софте всё восхитительно, но все недовольны евгения трифонова к чему я это вспомнил? на прошлой неделе участвовал в хакатоне среди программистов нашей компании. узнал кучу клевых штук, а по итогам даже занял первое место (вместе с ещё двумя участниками, у которых получились очень похожие решения). (если вы — тоже сотрудник «первого бита», то итоги хакатона лежат на портале; там же — отзыв другого победителя, димы лещенко) в процессе нужно было развернуть и настроить целую гору софта: edt, rabbitmq, docker, gitlab, jira, sonarqube и ещё вагон инструментов поменьше и попроще. ладно, к rabbitmq у меня претензий нет: легкий и быстрый, но вот остальное… про хороший аппетит edt я знал и раньше, а вот прожорливость gitlab и jira по-настоящему удивила. да, в моём случае всё запускалось в докере; да, конфигурация не была оптимальной (например, было развернуто несколько серверов postgresql вместо одного); да, докер был для windows, а его реализация под эту платформу — тема для едких шуток у всех сисадминов, с которыми я знаком. но потратить 12 гигабайт озу прямо со старта?! про процессор вообще молчу — нагрузка была такая, будто компьютер просчитывал ядерный взрыв в реальном времени. короче, лучшей иллюстрации к тезисам никиты подобрать трудно: софт выше слопал море ресурсов и невозмутимо попросил ещё, даже не приступив к какой-то понятной задаче. впрочем, в то же время это отличная иллюстрация к тексту евгения: я, на секундочку, одной-единственной командой развернул несколько операционных систем со сложными серверами внутри. и потратил на это несоизмеримо меньше времени чем, скажем, пришлось бы потратить несколько лет назад. у меня нет ответа. думаю, ни у кого нет. это такой вечный холивар внутри профессии: какую сторону не займи, на деле все равно балансируешь между двумя крайностями — с одной стороны, надо писать хороший, быстрый код, с другой — надо не свалиться в преждевременную оптимизацию. первое в итоге дает чистое удовольствие от хорошо сделанной работы: вспоминаешь, что ты, черт побери, неплох! второе — просто позволяет не нажить бед с башкой в поисках идеального алгоритма сортировки пузырьком :-)",
    "tags": [
      "1c",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/value-table-view\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Просмотр таблицы значений\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>16 мая 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Закинул на GitHub <a href=\"https://gist.github.com/vkostyanetsky/ef44bbb18f36a1c51826a5d0b4f3960e\" target=\"_blank\">короткую функцию</a>, с помощью которой произвольную таблицу значений можно превратить в табличный документ.</p>\n<p>Для чего? Чтобы посмотреть её содержимое. Саму таблицу на клиент передать нельзя, а вот табличный документ на её основе — можно. Кроме того, у табличного документа есть клиентский метод Show(), который отображает его в отдельном окне.</p>\n<p>То есть можно прямо из режима предприятия просматривать разные служебные таблицы, не тратя время на создание интерфейса для них. Просто передаем их в функцию по ссылке выше, получаем табличные документы, возвращаем их на клиент и выводим.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "просмотр таблицы значений 16 мая 2020 · 1с готово закинул на github короткую функцию , с помощью которой произвольную таблицу значений можно превратить в табличный документ. для чего? чтобы посмотреть её содержимое. саму таблицу на клиент передать нельзя, а вот табличный документ на её основе — можно. кроме того, у табличного документа есть клиентский метод show(), который отображает его в отдельном окне. то есть можно прямо из режима предприятия просматривать разные служебные таблицы, не тратя время на создание интерфейса для них. просто передаем их в функцию по ссылке выше, получаем табличные документы, возвращаем их на клиент и выводим.",
    "tags": [
      "1c",
      "done"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/self-documenting-code\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Самодокументируемый код\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>3 мая 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Код с запашком</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Всем привет! С вами снова Джонни Кэтсвилл и передача «Самодокументируемый код»!</p>\n<p>Сегодня мы переберем строки таблицы значений с Н по Й:</p>\n<p><img alt=\":|\" src=\"https://kostyanetsky.ru/notes/self-documenting-code/self-documenting-code.png\"/></p>\n<p>Вроде и мелочь совсем, но когда в пределах одного модуля в пятый раз натыкаешься на такой подход к именованию переменных — глаз невольно начинает дергаться :-)</p>\n<p>Дело даже не в том, что этот участок <a href=\"https://kostyanetsky.ru/notes/why-so-serious\" target=\"_blank\">труднее разобрать</a> — просто он неплохо говорит о качестве модуля в целом. Скорее всего, писавший его программист был вымотан, и поблизости можно встретить что-нибудь вроде отважной выгрузки справочника номенклатуры в таблицу значений, чтения кучи объектов «через точку» и прочего тяп-ляп.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "самодокументируемый код 3 мая 2020 · 1с код с запашком всем привет! с вами снова джонни кэтсвилл и передача «самодокументируемый код»! сегодня мы переберем строки таблицы значений с н по й: вроде и мелочь совсем, но когда в пределах одного модуля в пятый раз натыкаешься на такой подход к именованию переменных — глаз невольно начинает дергаться :-) дело даже не в том, что этот участок труднее разобрать — просто он неплохо говорит о качестве модуля в целом. скорее всего, писавший его программист был вымотан, и поблизости можно встретить что-нибудь вроде отважной выгрузки справочника номенклатуры в таблицу значений, чтения кучи объектов «через точку» и прочего тяп-ляп.",
    "tags": [
      "1c",
      "code-smell"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/manage-services-with-powershell\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Управление службами через PowerShell\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>28 апреля 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Powershell</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Рабочее место</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>На днях набросал себе несколько скриптов на PowerShell'е для запуска и остановки служб на рабочем ПК. Наработки в итоге не пригодились, так что зафиксирую себе пару примеров на будущее, чтобы не потерять:</p>\n<pre><code>get-service -Name 1C:Enterprise* | Where-Object {$_.status -eq 'running'} | stop-service -pass\nget-service -Name *SQL* | Where-Object {$_.status -eq 'running'} | stop-service -pass\n</code></pre>\n<p>Обе строки выше делают одно и то же: ищут службы с определенным именем, проверяют их состояния и, если службы запущены — останавливают их. Имена служб удобно задавать через шаблоны — например, у Microsoft SQL Server целый выводок служб с разным назначением и их удобно пристрелить одной строкой. Или, скажем, служба сервера 1С:Предприятия — она одна, зато её длиннющее название просто лень писать полностью :-)</p>\n<p>Примерно тот же подход, кстати, работает и с обычными процессами. Так, строка ниже ищет процесс obs64; если находит — останавливает. </p>\n<pre><code>get-process -Name obs64 | stop-process -pass\n</code></pre>\n<p>Если нужны детали, то на сайте разработчика есть подробная <a href=\"https://docs.microsoft.com/ru-ru/powershell/scripting/samples/managing-services?view=powershell-7\" target=\"_blank\">документация</a> с кучей примеров и рассуждений в духе «как запустить службу, если вы медитируете на одной ноге в условиях искусственной невесомости».</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "управление службами через powershell 28 апреля 2020 · powershell рабочее место на днях набросал себе несколько скриптов на powershell'е для запуска и остановки служб на рабочем пк. наработки в итоге не пригодились, так что зафиксирую себе пару примеров на будущее, чтобы не потерять: get-service -name 1c:enterprise* | where-object {$_.status -eq 'running'} | stop-service -pass get-service -name *sql* | where-object {$_.status -eq 'running'} | stop-service -pass обе строки выше делают одно и то же: ищут службы с определенным именем, проверяют их состояния и, если службы запущены — останавливают их. имена служб удобно задавать через шаблоны — например, у microsoft sql server целый выводок служб с разным назначением и их удобно пристрелить одной строкой. или, скажем, служба сервера 1с:предприятия — она одна, зато её длиннющее название просто лень писать полностью :-) примерно тот же подход, кстати, работает и с обычными процессами. так, строка ниже ищет процесс obs64; если находит — останавливает. get-process -name obs64 | stop-process -pass если нужны детали, то на сайте разработчика есть подробная документация с кучей примеров и рассуждений в духе «как запустить службу, если вы медитируете на одной ноге в условиях искусственной невесомости».",
    "tags": [
      "powershell",
      "workplace"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/black-mesa\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Black Mesa\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>13 апреля 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/YkBrNGeFwoU\" width=\"560\"></iframe>\n<p>Легендарный, но уже откровенно постаревший Half-Life тщательно отретушировали и дополнили кучей новых задумок. Вышло здорово; прям видно, что фанаты старались :-) Особенно Зену пошло на пользу — разве что завод, по-моему, стоило сделать покороче. Впрочем, бой с Нихилантом переделали так, что он с лихвой окупает все страдания.</p>\n<p>Есть мелкие косяки с музыкой, оптимизацией и переводом, но ничего особо критичного. Учитывая, сколько шла разработка — удивительно, что вообще дошло до релиза сквозь типичные для долгих проектов проблемы вроде усталости и выгорания команды. И это не считая титанической работы по переделке проекта двадцатилетней давности на современные рельсы! Quite a nasty piece of work you managed over there, guys. I am impressed.</p>\n<p><a href=\"https://kostyanetsky.ru/notes/black-mesa/swamp.jpg\" target=\"_blank\"><img alt=\"Болото\" src=\"https://kostyanetsky.ru/notes/black-mesa/swamp-thumbnail.jpg\"/></a> <a href=\"https://kostyanetsky.ru/notes/black-mesa/crystaline-cave.jpg\" target=\"_blank\"><img alt=\"Кристаллическая пещера\" src=\"https://kostyanetsky.ru/notes/black-mesa/crystaline-cave-thumbnail.jpg\"/></a> <a href=\"https://kostyanetsky.ru/notes/black-mesa/burning-sky.jpg\" target=\"_blank\"><img alt=\"Пылающее небо\" src=\"https://kostyanetsky.ru/notes/black-mesa/burning-sky-thumbnail.jpg\"/></a> <a href=\"https://kostyanetsky.ru/notes/black-mesa/flycatcher.jpg\" target=\"_blank\"><img alt=\"Мухоловка\" src=\"https://kostyanetsky.ru/notes/black-mesa/flycatcher-thumbnail.jpg\"/></a></p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "black mesa 13 апреля 2020 · видеоигры легендарный, но уже откровенно постаревший half-life тщательно отретушировали и дополнили кучей новых задумок. вышло здорово; прям видно, что фанаты старались :-) особенно зену пошло на пользу — разве что завод, по-моему, стоило сделать покороче. впрочем, бой с нихилантом переделали так, что он с лихвой окупает все страдания. есть мелкие косяки с музыкой, оптимизацией и переводом, но ничего особо критичного. учитывая, сколько шла разработка — удивительно, что вообще дошло до релиза сквозь типичные для долгих проектов проблемы вроде усталости и выгорания команды. и это не считая титанической работы по переделке проекта двадцатилетней давности на современные рельсы! quite a nasty piece of work you managed over there, guys. i am impressed.",
    "tags": [
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/is-ref-empty\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Пустая() или ЗначениеЗаполнено()?\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>11 апреля 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Несколько дней назад обсуждал с коллегой, какой способ проверки заполнения ссылки лучше. С одной стороны, время назад на каком-то курсе я слышал авторитетное мнение, что функцию ЗначениеЗаполнено() нужно использовать с осторожностью, так как её логика — сопоставлять переменную всем возможным пустым значениям, которые есть в конфигурации. И это, мол, огромная тормозная лапша. Как альтернативу автор курса советовал использовать метод ссылки Пустая(), а композитные реквизиты проверять примерно так:</p>\n<pre><code>СсылкаЗаполнена = Ссылка &lt;&gt; Неопределено И Не Ссылка.Пустая();\n</code></pre>\n<p>Коллега в свою очередь утверждал, что ЗначениеЗаполнено() быстрее, так как это встроенная функция, которая не тратит время на поиск метода у объекта (в скриптовых языках это сравнительно медленная операция).</p>\n<p>На моей памяти ни тот, ни другой метод узким местом никогда не были, но меня разобрало любопытство; написал <a href=\"https://github.com/vkostyanetsky/IsEmptyOrValueIsFilled\" target=\"_blank\">тест</a>, который проверяет ссылочную переменную на пустое значение обеими способами и замеряет время, которое было потрачено. </p>\n<p>В среднем результат выглядит <a href=\"https://kostyanetsky.ru/notes/is-ref-empty/is-ref-empty.png\" target=\"_blank\">примерно так</a>. Там четыре шага — на первых двух предполагается, что ссылка определена, а на третьем и четвертом добавляется соответствующая проверка. В последней колонке таблицы виден контекст выполнения теста (клиент или сервер).</p>\n<p>Вывод довольно очевиден: ЗначениеЗаполнено() никакой деградации не показывает, более того — работает быстрее, чем метод Пустая() (особенно если мы начинаем проверять переменную на Неопределено). Конечно, отклонение не слишком значительное, но на каких-то длительных регламентных операциях вполне можно сэкономить пару секунд.</p>\n<p>Да и чисто практически проще делать проверку одним универсальным вызовом, а не пытаться угадать все возможные значения переменной.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "пустая() или значениезаполнено()? 11 апреля 2020 · 1с готово несколько дней назад обсуждал с коллегой, какой способ проверки заполнения ссылки лучше. с одной стороны, время назад на каком-то курсе я слышал авторитетное мнение, что функцию значениезаполнено() нужно использовать с осторожностью, так как её логика — сопоставлять переменную всем возможным пустым значениям, которые есть в конфигурации. и это, мол, огромная тормозная лапша. как альтернативу автор курса советовал использовать метод ссылки пустая(), а композитные реквизиты проверять примерно так: ссылказаполнена = ссылка <> неопределено и не ссылка.пустая(); коллега в свою очередь утверждал, что значениезаполнено() быстрее, так как это встроенная функция, которая не тратит время на поиск метода у объекта (в скриптовых языках это сравнительно медленная операция). на моей памяти ни тот, ни другой метод узким местом никогда не были, но меня разобрало любопытство; написал тест , который проверяет ссылочную переменную на пустое значение обеими способами и замеряет время, которое было потрачено. в среднем результат выглядит примерно так . там четыре шага — на первых двух предполагается, что ссылка определена, а на третьем и четвертом добавляется соответствующая проверка. в последней колонке таблицы виден контекст выполнения теста (клиент или сервер). вывод довольно очевиден: значениезаполнено() никакой деградации не показывает, более того — работает быстрее, чем метод пустая() (особенно если мы начинаем проверять переменную на неопределено). конечно, отклонение не слишком значительное, но на каких-то длительных регламентных операциях вполне можно сэкономить пару секунд. да и чисто практически проще делать проверку одним универсальным вызовом, а не пытаться угадать все возможные значения переменной.",
    "tags": [
      "1c",
      "done"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/sharex-video-recording\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Запись видео в ShareX\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>8 апреля 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Рабочее место</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Прежде чем приспособить OBS Studio для записи видео (писал о ней в <a href=\"https://kostyanetsky.ru/notes/video-recording\" target=\"_blank\">предыдущей</a> заметке), я пробовал использовать <a href=\"https://getsharex.com/\" target=\"_blank\">ShareX</a>. Программа поначалу неплохо справлялась, однако от неё пришлось отказаться из-за неприятного бага: иногда при попытке завершить запись софт портил полученное видео.</p>\n<p>Я гуглил, но причину понять так и не смог. Впрочем, неудивительно — ShareX использует <a href=\"https://www.ffmpeg.org/\" target=\"_blank\">ffmpeg</a> для записи видео, а это дитя опенсорца вместо адекватной диагностики невозмутимо вываливает целый рулон логов. Разбирать его без соответствующего опыта — занятие для клинического оптимиста.</p>\n<p>Впрочем, как инструмент для создания скриншотов ShareX почти безупречна. Обилие опций слегка напоминает замотанного человека в приступе гиперактивности :-)</p>\n<p><a href=\"https://kostyanetsky.ru/notes/sharex-video-recording/interface.png\" target=\"_blank\"><img alt=\"Настраиваем скриншоты\" src=\"https://kostyanetsky.ru/notes/sharex-video-recording/interface-thumb.png\"/></a></p>\n<blockquote>\n<p>— Протестирую сам! Сам все протестирую! И полы вымою!</p>\n<p><em><a href=\"https://www.youtube.com/watch?v=K6oZuB8_dU8&amp;feature=youtu.be&amp;t=640\" target=\"_blank\">Эффективность не работает. Илья Якямсев</a></em></p>\n</blockquote>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "запись видео в sharex 8 апреля 2020 · рабочее место прежде чем приспособить obs studio для записи видео (писал о ней в предыдущей заметке), я пробовал использовать sharex . программа поначалу неплохо справлялась, однако от неё пришлось отказаться из-за неприятного бага: иногда при попытке завершить запись софт портил полученное видео. я гуглил, но причину понять так и не смог. впрочем, неудивительно — sharex использует ffmpeg для записи видео, а это дитя опенсорца вместо адекватной диагностики невозмутимо вываливает целый рулон логов. разбирать его без соответствующего опыта — занятие для клинического оптимиста. впрочем, как инструмент для создания скриншотов sharex почти безупречна. обилие опций слегка напоминает замотанного человека в приступе гиперактивности :-) — протестирую сам! сам все протестирую! и полы вымою! эффективность не работает. илья якямсев",
    "tags": [
      "workplace"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/video-recording\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Запись видео\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>3 апреля 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Рабочее место</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Я работаю удалённо и с коллегами общаюсь через Zoom и Slack. В основном в чатах, но многие темы по-прежнему проще обсудить голосом. И вот тут-то возникают проблемы: приходится забыть про индексацию и поиск по сообщениям, а главное — нет никакого архива разговоров. Иногда очень нужно вспомнить: кто говорил? Что конкретно? Когда?</p>\n<p>Zoom и Slack сами по себе эту проблему не решают. Первый умеет записывать только те конференции, которые организуешь ты или которые тебе разрешили писать (короче, далеко не все), а второй писать видео не умеет вообще.</p>\n<h2>Решение проблемы</h2>\n<p>Я закрыл вопрос какое-то время назад, поставив себе <a href=\"https://obsproject.com\" target=\"_blank\">OBS Studio</a> — популярный среди стримеров софт для записи экрана. С записью конференций он прекрасно справляется. Настройка минимальная: пишем весь экран, звук с микрофона и все звуки, которые воспроизводятся. В микшере по результатам тестовых записей можно натыкать фильтры — усиление, шумоподавление и так далее.</p>\n<p><img alt=\"Настройка OBS Studio\" src=\"https://kostyanetsky.ru/notes/video-recording/video-recording.png\"/></p>\n<p>В настройках нужно указать папку, куда будут складываться записанные видео (Вывод → Запись → Путь записи). Поскольку мы пишем звонки и файлов будет много, лучше сразу разложить их в папки по дням — для этого идем в расширенные настройки и в поле «Формат имени файла» указываем нечто вроде %CCYY-%MM-%DD/%hh-%mm-%ss.</p>\n<h2>Быстрое управление записью</h2>\n<p>Конечно, лезть в OBS при каждом звонке неудобно, но у неё есть куча хоткеев — можно прожимать какие-нибудь заковыристые комбинации в начале и в конце разговора. Однако со мной это не сработало — придуманные хоткеи почему-то постоянно вылетали из головы. Даже стикеры не помогали. </p>\n<p>Поначалу я здорово разозлился, но потом понял: раз не получается запомнить хоткей — надо его выкинуть. Начинать запись нажатием одной кнопки, заканчивать нажатием на другую.</p>\n<p>С оборудованием всё было просто: у меня эргономичная <a href=\"https://www.microsoft.com/accessories/ru-ru/products/keyboards/natural-ergonomic-keyboard-4000/b2m-00020\" target=\"_blank\">клавиатура</a> от Microsoft, программируемых кнопок на ней — вагон. Хуже с софтом: OBS Studio понимает некоторые <a href=\"https://github.com/obsproject/obs-studio/wiki/Launch-Parameters\" target=\"_blank\">параметры</a> запуска, но список откровенно бедноват — даже остановки записи нет. Хотелось бы побольше.</p>\n<p>В итоге решил задачу через плагин к OBS Studio, который дает порулить запущенным экземпляром программы. Он придуман для удаленного управления записью (например, со смартфона), но никто не мешает использовать его локально.</p>\n<p>Схема получилась такая:</p>\n<ol>\n<li>Ставим OBS Studio и плагин <a href=\"https://obsproject.com/forum/resources/obs-websocket-remote-control-of-obs-studio-made-easy.466/\" target=\"_blank\">obs-websocket</a> к ней. Снимаем галку «Enable System Tray Alerts» в настройках (Tools → WebSockets Server Settings), не то программа примется сообщать о каждом чихе.</li>\n<li>Кладем куда-нибудь <a href=\"https://obsproject.com/forum/resources/command-line-tool-for-obs-websocket-plugin-windows.615/\" target=\"_blank\">утилиту</a>, с помощью которой этим плагином можно рулить из командной строки. </li>\n<li>Вешаем на одну кнопку OBSCommand.exe /startrecording, а на другую — OBSCommand.exe /stoprecording.</li>\n<li>Готово, вы великолепны!</li>\n</ol>\n<p>При вызове на долю секунду видно консоль (OBSCommand запускается, связывается с obs-websocket и ждет ответа). Сначала хотел как-нибудь скрыть это окно, но, поразмыслив, передумал — если OBS Studio не будет запущен или возникнет какая-то проблема, консоль не закроется и я хотя бы узнаю, что запись не началась.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "запись видео 3 апреля 2020 · рабочее место я работаю удалённо и с коллегами общаюсь через zoom и slack. в основном в чатах, но многие темы по-прежнему проще обсудить голосом. и вот тут-то возникают проблемы: приходится забыть про индексацию и поиск по сообщениям, а главное — нет никакого архива разговоров. иногда очень нужно вспомнить: кто говорил? что конкретно? когда? zoom и slack сами по себе эту проблему не решают. первый умеет записывать только те конференции, которые организуешь ты или которые тебе разрешили писать (короче, далеко не все), а второй писать видео не умеет вообще. решение проблемы я закрыл вопрос какое-то время назад, поставив себе obs studio — популярный среди стримеров софт для записи экрана. с записью конференций он прекрасно справляется. настройка минимальная: пишем весь экран, звук с микрофона и все звуки, которые воспроизводятся. в микшере по результатам тестовых записей можно натыкать фильтры — усиление, шумоподавление и так далее. в настройках нужно указать папку, куда будут складываться записанные видео (вывод → запись → путь записи). поскольку мы пишем звонки и файлов будет много, лучше сразу разложить их в папки по дням — для этого идем в расширенные настройки и в поле «формат имени файла» указываем нечто вроде %ccyy-%mm-%dd/%hh-%mm-%ss. быстрое управление записью конечно, лезть в obs при каждом звонке неудобно, но у неё есть куча хоткеев — можно прожимать какие-нибудь заковыристые комбинации в начале и в конце разговора. однако со мной это не сработало — придуманные хоткеи почему-то постоянно вылетали из головы. даже стикеры не помогали. поначалу я здорово разозлился, но потом понял: раз не получается запомнить хоткей — надо его выкинуть. начинать запись нажатием одной кнопки, заканчивать нажатием на другую. с оборудованием всё было просто: у меня эргономичная клавиатура от microsoft, программируемых кнопок на ней — вагон. хуже с софтом: obs studio понимает некоторые параметры запуска, но список откровенно бедноват — даже остановки записи нет. хотелось бы побольше. в итоге решил задачу через плагин к obs studio, который дает порулить запущенным экземпляром программы. он придуман для удаленного управления записью (например, со смартфона), но никто не мешает использовать его локально. схема получилась такая: ставим obs studio и плагин obs-websocket к ней. снимаем галку «enable system tray alerts» в настройках (tools → websockets server settings), не то программа примется сообщать о каждом чихе. кладем куда-нибудь утилиту , с помощью которой этим плагином можно рулить из командной строки. вешаем на одну кнопку obscommand.exe /startrecording, а на другую — obscommand.exe /stoprecording. готово, вы великолепны! при вызове на долю секунду видно консоль (obscommand запускается, связывается с obs-websocket и ждет ответа). сначала хотел как-нибудь скрыть это окно, но, поразмыслив, передумал — если obs studio не будет запущен или возникнет какая-то проблема, консоль не закроется и я хотя бы узнаю, что запись не началась.",
    "tags": [
      "workplace"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/unresolved-references\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Неразрешимые ссылки\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>10 марта 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Чаще всего неразрешимые ссылки на объекты метаданных образуются в ходе удаления объектов (и, иногда, при объединении конфигураций). На ИТС есть <a href=\"https://its.1c.ru/db/metod8dev#content:2290:hdoc\" target=\"_blank\">статья</a> по этой теме, там хорошо описаны детали.</p>\n<p>На работе программы битые ссылки сказываются далеко не всегда. Конечно, поле без привязки к данным заметить несложно, но вот удалили вы, допустим, функциональную опцию — что с того, что ссылка на неё осталась где-нибудь в команде на форме? Она будет просто лежать, как обрезанный провод, инертный и безвредный. Ничего по нему не идет. </p>\n<p>Однако такие штуки постепенно захламляют конфигурацию, и от них правильно избавляться, и на ИТС предложена не больно-то эффективная методика (последовательный перебор всех возможных мест, где может быть битая ссылка). Представьте себе сложную форму документа с множеством элементов; сколько времени придется потратить на поиск? Еще не факт, что успешный.</p>\n<p>Есть более грубый, но действенный метод: последовательно удалять с формы группы элементов. Можно начинать с больших групп (например, со страниц). После каждого удаления выполнять проверку конфигурации и смотреть — исчезла битая ссылка или нет. Перед началом работы лучше удалить из формы весь код, чтобы платформа не ругалась на обращения к несуществующим элементам.</p>\n<p>Проблема, кстати, может быть не в элементах, а в самой форме — но там её куда проще найти (хранилище настроек, условное оформление, команды; в общем, кандидатов немного).</p>\n<p>Ещё можно сделать выгрузку конфигурации в файлы и порыться в полученных XML-ках. Это неплохая идея ещё и потому, что сам по себе внешний вид элементов может вас обмануть: если, например, речь идет о ссылке на функциональную опцию в команды формы, то при проверке свойств команды вы даже не заметите, что есть какая-то проблема. А вот в XML-ке будет болтаться какой-то подозрительный GUID вместо наименования опции — считай, явка с повинной :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "неразрешимые ссылки 10 марта 2020 · 1с чаще всего неразрешимые ссылки на объекты метаданных образуются в ходе удаления объектов (и, иногда, при объединении конфигураций). на итс есть статья по этой теме, там хорошо описаны детали. на работе программы битые ссылки сказываются далеко не всегда. конечно, поле без привязки к данным заметить несложно, но вот удалили вы, допустим, функциональную опцию — что с того, что ссылка на неё осталась где-нибудь в команде на форме? она будет просто лежать, как обрезанный провод, инертный и безвредный. ничего по нему не идет. однако такие штуки постепенно захламляют конфигурацию, и от них правильно избавляться, и на итс предложена не больно-то эффективная методика (последовательный перебор всех возможных мест, где может быть битая ссылка). представьте себе сложную форму документа с множеством элементов; сколько времени придется потратить на поиск? еще не факт, что успешный. есть более грубый, но действенный метод: последовательно удалять с формы группы элементов. можно начинать с больших групп (например, со страниц). после каждого удаления выполнять проверку конфигурации и смотреть — исчезла битая ссылка или нет. перед началом работы лучше удалить из формы весь код, чтобы платформа не ругалась на обращения к несуществующим элементам. проблема, кстати, может быть не в элементах, а в самой форме — но там её куда проще найти (хранилище настроек, условное оформление, команды; в общем, кандидатов немного). ещё можно сделать выгрузку конфигурации в файлы и порыться в полученных xml-ках. это неплохая идея ещё и потому, что сам по себе внешний вид элементов может вас обмануть: если, например, речь идет о ссылке на функциональную опцию в команды формы, то при проверке свойств команды вы даже не заметите, что есть какая-то проблема. а вот в xml-ке будет болтаться какой-то подозрительный guid вместо наименования опции — считай, явка с повинной :-)",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/standard-attributes-filtering\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Фильтрация стандартных реквизитов\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>9 марта 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Короткий <a href=\"https://gist.github.com/vkostyanetsky/ee1f913868673c2218877dfbecc9b08a\" target=\"_blank\">фрагмент</a> кода из обработки для настройки механизма истории данных, о которой я только что <a href=\"https://kostyanetsky.ru/notes/data-history-settings\" target=\"_blank\">писал</a>. Эта функция определяет, является ли Attribute стандартным реквизитом с именем StandardAttributeName, принадлежащим объекту метаданных MetadataObject. Где она нужна? Допустим, вы перебираете стандартные реквизиты объекта и по какой-то причине хотите пропустить один из них.</p>\n<p>На первый взгляд решение выглядит максимально индусским. Почему бы, например, просто не сравнить два реквизита — проверяемый и тот, что хотим отсеять?</p>\n<pre><code>If Attribute = MetadataObject.StandardAttributes.Order Then\n</code></pre>\n<p>Дело в том, что такой код не сработает: результат операции сравнения двух стандартных реквизитов объекта метаданных в платформе 1С — всегда Ложь.</p>\n<p>О'кей, скажете вы — может, тогда не будем усложнять и напишем вот так?</p>\n<pre><code>If Attribute.Name = \"Order\" Then\n</code></pre>\n<p>Однако так тоже не сработает, если ваш код будет запущен в русскоязычной конфигурации: стандартный реквизит, который мы пытаемся найти, в этом случае будет называться «Порядок». </p>\n<p>Тем не менее, к самому стандартному реквизиту внутри коллекции можно обращаться и по-русски, и по-английски. Потом получаем текущее имя атрибута и сравниваем с именем того атрибута, который проверяем.</p>\n<p>Конечно, можно было просто сделать сравнение имени реквизита и с «Order», и с «Порядок» — но это, во-первых, некрасиво, а во-вторых — стандарты программирования у нас в компании запрещают писать код на русском. В общем, мне хотелось найти более общее решение.</p>\n<p>Что до конструкции Try/Catch — она тут на тот случай, если стандартного реквизита с таким именем в конфигурации нет вообще (и попытка обратиться к нему  по имени приведет к ошибке).</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "фильтрация стандартных реквизитов 9 марта 2020 · 1с готово короткий фрагмент кода из обработки для настройки механизма истории данных, о которой я только что писал . эта функция определяет, является ли attribute стандартным реквизитом с именем standardattributename, принадлежащим объекту метаданных metadataobject. где она нужна? допустим, вы перебираете стандартные реквизиты объекта и по какой-то причине хотите пропустить один из них. на первый взгляд решение выглядит максимально индусским. почему бы, например, просто не сравнить два реквизита — проверяемый и тот, что хотим отсеять? if attribute = metadataobject.standardattributes.order then дело в том, что такой код не сработает: результат операции сравнения двух стандартных реквизитов объекта метаданных в платформе 1с — всегда ложь. о'кей, скажете вы — может, тогда не будем усложнять и напишем вот так? if attribute.name = \"order\" then однако так тоже не сработает, если ваш код будет запущен в русскоязычной конфигурации: стандартный реквизит, который мы пытаемся найти, в этом случае будет называться «порядок». тем не менее, к самому стандартному реквизиту внутри коллекции можно обращаться и по-русски, и по-английски. потом получаем текущее имя атрибута и сравниваем с именем того атрибута, который проверяем. конечно, можно было просто сделать сравнение имени реквизита и с «order», и с «порядок» — но это, во-первых, некрасиво, а во-вторых — стандарты программирования у нас в компании запрещают писать код на русском. в общем, мне хотелось найти более общее решение. что до конструкции try/catch — она тут на тот случай, если стандартного реквизита с таким именем в конфигурации нет вообще (и попытка обратиться к нему по имени приведет к ошибке).",
    "tags": [
      "1c",
      "done"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/data-history-settings\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Настройки истории данных\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>9 марта 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Выложил на GitHub <a href=\"https://github.com/vkostyanetsky/AuditLogSettings\" target=\"_blank\">обработку</a> для настройки механизма истории данных, который сравнительно недавно <a href=\"https://its.1c.ru/db/v8312doc#bookmark:dev:TI000001938\" target=\"_blank\">появился</a> в платформе. Эта обработка:</p>\n<ol>\n<li>Строит дерево объектов, для которых может вестись история данных;</li>\n<li>Подсказывает, для каких объектов история данных ведется сейчас;</li>\n<li>Дает возможность включить или выключить историю данных для объектов и их реквизитов. </li>\n</ol>\n<p>Обработка поддерживает пакетные операции — например, можно включить историю разом для нескольких документов и всех справочников. Или вообще удалить все внесенные настройки, откатив состояние механизма к тому, которое заложил разработчик конфигурации.</p>\n<p>По-моему, неплохо получилось. Я писал эту штуку больше для себя, разминая мозг по вечерам — но мы, возможно, даже включим её в <a href=\"https://firstbit.ae\" target=\"_blank\">нашу конфигурацию</a>! Сейчас версионированием данных в ней занимается SSLi, и её механизмы трудно назвать эффективными — медленные и сильно раздувают базу. Надеюсь, платформа на тестах покажет себя лучше.</p>\n<p>На Инфостарте и ИТС можно найти похожие разработки, но они либо глючат, либо работают только на русскоязычных конфигурациях (не имеют английского интерфейса + опираются на БСП), либо просто-напросто устарели (например, не поддерживают работу с константами).</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "настройки истории данных 9 марта 2020 · 1с готово работа выложил на github обработку для настройки механизма истории данных, который сравнительно недавно появился в платформе. эта обработка: строит дерево объектов, для которых может вестись история данных; подсказывает, для каких объектов история данных ведется сейчас; дает возможность включить или выключить историю данных для объектов и их реквизитов. обработка поддерживает пакетные операции — например, можно включить историю разом для нескольких документов и всех справочников. или вообще удалить все внесенные настройки, откатив состояние механизма к тому, которое заложил разработчик конфигурации. по-моему, неплохо получилось. я писал эту штуку больше для себя, разминая мозг по вечерам — но мы, возможно, даже включим её в нашу конфигурацию ! сейчас версионированием данных в ней занимается ssli, и её механизмы трудно назвать эффективными — медленные и сильно раздувают базу. надеюсь, платформа на тестах покажет себя лучше. на инфостарте и итс можно найти похожие разработки, но они либо глючат, либо работают только на русскоязычных конфигурациях (не имеют английского интерфейса + опираются на бсп), либо просто-напросто устарели (например, не поддерживают работу с константами).",
    "tags": [
      "1c",
      "done",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/ninth-wave\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Девятый вал\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>9 марта 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Покупал вчера утром подарки своим женщинам. Пока флорист собирала букеты, болтал с ней ни о чем и случайно перехватил взгляд в сторону нарастающей толпы покупателей — спокойный такой, с отчетливо читающейся обреченностью. Так моряки, наверное, смотрят на вздымающуюся волну, которая вот-вот похоронит их шлюпку :-)</p>\n<p>Люди вне цветочной индустрии иногда хмыкают — мол, восьмое марта это такой волшебный праздник для цветочников, которые делают целое состояние за десять часов. Касса в эти дни и правда собирается приличная — только вот у любого, кто когда-либо работал в этой сфере, восьмое (и пара дней до него, кстати) чаще ассоциируется с чудовищной нагрузкой на силы, нервы и здоровье.</p>\n<p>Я, можно сказать, ещё дешево отделался: всего-то разворачивал и обслуживал айти в местной сети цветочных магазинов (кстати, <a href=\"http://rosetta.florist/\" target=\"_blank\">рекомендую</a> бывших коллег!). И всё равно запах цветов ещё долго вызывал у меня вьетнамский синдром.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "девятый вал 9 марта 2020 · тем временем работа покупал вчера утром подарки своим женщинам. пока флорист собирала букеты, болтал с ней ни о чем и случайно перехватил взгляд в сторону нарастающей толпы покупателей — спокойный такой, с отчетливо читающейся обреченностью. так моряки, наверное, смотрят на вздымающуюся волну, которая вот-вот похоронит их шлюпку :-) люди вне цветочной индустрии иногда хмыкают — мол, восьмое марта это такой волшебный праздник для цветочников, которые делают целое состояние за десять часов. касса в эти дни и правда собирается приличная — только вот у любого, кто когда-либо работал в этой сфере, восьмое (и пара дней до него, кстати) чаще ассоциируется с чудовищной нагрузкой на силы, нервы и здоровье. я, можно сказать, ещё дешево отделался: всего-то разворачивал и обслуживал айти в местной сети цветочных магазинов (кстати, рекомендую бывших коллег!). и всё равно запах цветов ещё долго вызывал у меня вьетнамский синдром.",
    "tags": [
      "meanwhile",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/top-exceptions\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Топ исключений по ТЖ\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>16 февраля 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Bash</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Выложил на GitHub <a href=\"https://github.com/vkostyanetsky/ScriptsFor1C/blob/master/Технологический%20журнал/FrequentExceptions.sh\" target=\"_blank\">скрипт</a> на баше, который по собранному технологическому журналу 1С определяет наиболее частотные исключения.</p>\n<p>Скрипт анализирует события EXCP. Это основной источник информации об ошибках, хотя, конечно, не единственный: например, есть EXCPCNTX (событие, которое началось, но не закончилось в тот момент, когда произошла ошибка). Кроме того, если исключение происходит во время серверного вызова, то в поле RetExcp у события CALL будет текст ошибки, которая вернется на клиент.</p>\n<p>Впрочем, в большинстве случаев EXCP и, иногда, EXCPCNTX вполне достаточно. Часто их собирают просто по умолчанию — нагрузки это не создает, зато позволяет прогонять собранные логи через какой-нибудь инструмент аналитики (скрипт выше, например) и держать, так сказать, руку на пульсе.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "топ исключений по тж 16 февраля 2020 · 1с bash готово выложил на github скрипт на баше, который по собранному технологическому журналу 1с определяет наиболее частотные исключения. скрипт анализирует события excp. это основной источник информации об ошибках, хотя, конечно, не единственный: например, есть excpcntx (событие, которое началось, но не закончилось в тот момент, когда произошла ошибка). кроме того, если исключение происходит во время серверного вызова, то в поле retexcp у события call будет текст ошибки, которая вернется на клиент. впрочем, в большинстве случаев excp и, иногда, excpcntx вполне достаточно. часто их собирают просто по умолчанию — нагрузки это не создает, зато позволяет прогонять собранные логи через какой-нибудь инструмент аналитики (скрипт выше, например) и держать, так сказать, руку на пульсе.",
    "tags": [
      "1c",
      "bash",
      "done"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/debug-via-http\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Отладка через HTTP\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>26 января 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>В конце недели столкнулся с довольно глупой ситуацией: отладка через TCP/IP на сервере 1С перестала работать. То есть сам по себе режим отладки включен, однако конфигуратор «не видит» контекстов отладки на сервере.</p>\n<p>Ситуация глупая в том смысле, что понять причину довольно сложно: явных ошибок платформа не выдает. После проверки очевидных вариантов (фаервол, порты и так далее) остается только руками разводить. </p>\n<p>Решил проблему, переключившись на отладку через HTTP. Инфрастуктурно это более сложная <a href=\"https://its.1c.ru/db/v8310doc#bookmark:dev:TI000001599\" target=\"_blank\">схема</a>, но настраивается она довольно просто; если вкратце, то нужно:</p>\n<ul>\n<li>Запустить службу агента сервера с ключами «-debug -http».</li>\n<li>В параметрах отладки конфигуратором (Сервис → Параметры → Отладка) указать HTTP как протокол отладки и сервер отладки кластера как сервер отладки.</li>\n</ul>\n<p>Подробнее процесс настройки <a href=\"https://its.1c.ru/db/v8310doc#bookmark:dev:TI000001604\" target=\"_blank\">описан</a> на ИТС.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "отладка через http 26 января 2020 · 1с в конце недели столкнулся с довольно глупой ситуацией: отладка через tcp/ip на сервере 1с перестала работать. то есть сам по себе режим отладки включен, однако конфигуратор «не видит» контекстов отладки на сервере. ситуация глупая в том смысле, что понять причину довольно сложно: явных ошибок платформа не выдает. после проверки очевидных вариантов (фаервол, порты и так далее) остается только руками разводить. решил проблему, переключившись на отладку через http. инфрастуктурно это более сложная схема , но настраивается она довольно просто; если вкратце, то нужно: запустить службу агента сервера с ключами «-debug -http». в параметрах отладки конфигуратором (сервис → параметры → отладка) указать http как протокол отладки и сервер отладки кластера как сервер отладки. подробнее процесс настройки описан на итс.",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/unsupported-code\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Неподдерживаемый код\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>18 января 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Случайно наткнулся на <a href=\"https://helpf.pro/faq/view/1907.html\" target=\"_blank\">пример</a> запроса в 1С, который считает разницу между двумя датами (в годах, месяцах и днях).</p>\n<p>Код, возможно, действительно работает (я не проверял), но как по мне — это хороший пример того, как делать не надо. Проблема в том, что автор забудет смысл большинства если-тогда-иначе через пару месяцев, не говоря уже о посторонних разработчиках, которые решат использовать этот код на своих проектах. В итоге при первой же доработке, которую потребуется провернуть на этом участке, куда дешевле будет заменить решение на что-то более наглядное, а не доработать.</p>\n<p>И это еще далеко не самый наглядный пример. Взять хотя бы <a href=\"http://www.google.ru/search?q=email+regex\" target=\"_blank\">регулярки для проверки e-mail</a>. Хочется выйти подышать, да? :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "неподдерживаемый код 18 января 2020 · 1с случайно наткнулся на пример запроса в 1с, который считает разницу между двумя датами (в годах, месяцах и днях). код, возможно, действительно работает (я не проверял), но как по мне — это хороший пример того, как делать не надо. проблема в том, что автор забудет смысл большинства если-тогда-иначе через пару месяцев, не говоря уже о посторонних разработчиках, которые решат использовать этот код на своих проектах. в итоге при первой же доработке, которую потребуется провернуть на этом участке, куда дешевле будет заменить решение на что-то более наглядное, а не доработать. и это еще далеко не самый наглядный пример. взять хотя бы регулярки для проверки e-mail . хочется выйти подышать, да? :-)",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/1001-nights-with-1c\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Тысяча и одна ночь с 1С\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>16 января 2020</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/WvdfWMoI1oI\" width=\"560\"></iframe>\n<p>Архитектор нашего основного продукта (и, по совместительству, мой тимлид) рассказывает о том, как мы внедряли 1С в Дубае. Погружений в технические детали нет, так что можно смотреть всем, кто хотя бы чуть-чуть в теме.</p>\n<p>Видео записано на краснодарской конференции разработчиков в июне прошлого года, так что кое-что уже поменялось. Например, у нас появились вполне рабочие прототипы программы на арабском языке, а объём автотестирования вырос настолько, что мисс <a href=\"https://github.com/Pr-Mex/vanessa-automation-single\" target=\"_blank\">Ванессу</a> стоит считать отдельным членом команды :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "тысяча и одна ночь с 1с 16 января 2020 · 1с работа архитектор нашего основного продукта (и, по совместительству, мой тимлид) рассказывает о том, как мы внедряли 1с в дубае. погружений в технические детали нет, так что можно смотреть всем, кто хотя бы чуть-чуть в теме. видео записано на краснодарской конференции разработчиков в июне прошлого года, так что кое-что уже поменялось. например, у нас появились вполне рабочие прототипы программы на арабском языке, а объём автотестирования вырос настолько, что мисс ванессу стоит считать отдельным членом команды :-)",
    "tags": [
      "1c",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/fifty-times-faster\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                В пятьдесят раз быстрее\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>5 декабря 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Оптимизация</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Получил вводную: документ закрытия месяца у заказчика проводится без малого час. База не особенно большая, но такая продолжительность в любом случае не вариант. Даже если учесть, что закрытие месяца — это ни разу не частотная операция и её можно делать, например, ночью.</p>\n<p>Лезу в код, делаю замер производительности и вижу, что и почти всё это время платформа тратит на одну-единственную процедуру, выполняя пакет запросов. Смотрю <a href=\"https://gist.github.com/vkostyanetsky/cf34c6cb088515e2bab6485b2f35eab8\" target=\"_blank\">первый</a> из них; ну, думаю, классика — запрос данных через точку от составного типа. Наверняка СУБД пристегивает целый вагон соединений с тяжеленными таблицами документов, вот оптимизатор и не успевает набросать адекватный план.</p>\n<p>Проверяю теорию — так, а тип SalesDocument включает всего восемь документов. Это, условно, в пределах допустимого (считается, что оптимизатор в состоянии подобрать адекватный план выполнения запроса, если количество соединений — в пределах восьми).</p>\n<p>Смотрю размеры таблиц документов — не особенно-то и большие. Выполняю запрос отдельно от пакета — да, работает не мгновенно (читает около 350 000 записей и отбирает примерно 200 000), но никак не час.</p>\n<p>Ладно, первый запрос пакета тяжелый, но проблема не в нём. Лезу во <a href=\"https://gist.github.com/vkostyanetsky/f4423dcfb28d4a27039c7310c13c3a73\" target=\"_blank\">второй</a> и понимаю, что до этого прочитали весь регистр Inventory и отобрали большую часть записей, а теперь — читаем его ещё раз и склеиваем обе выборки по куче условий. Подходящего индекса в таблице движений нет — только стандартный по регистратору и он, конечно, не подходит.</p>\n<p>Проверил — именно тут платформа и проводит большую часть времени, ожидая ответа от СУБД.</p>\n<p>Отказаться от двойного чтения всей таблицы регистра не вышло: я перебрал несколько вариантов, но все они требовали изменения структуры хранения данных, что было неприемлемо. В итоге остановился на промежуточном варианте: во втором запросе соединение с реальной таблицей движений регистра заменилось на соединение с заранее созданной временной таблицей, проиндексированной по полям соединения.</p>\n<p>Это тот случай, когда общая рекомендация 1С сработала идеально — вместо 50 минут документ стал проводиться за три, а после дополнительной оптимизации кода — за минуту. То есть, в пятьдесят раз быстрее того, что я имел вначале.</p>\n<p>Такой результат я счел достаточным (минута для закрытия месяца — это в общем случае нормально) и остановился.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "в пятьдесят раз быстрее 5 декабря 2019 · 1с готово оптимизация работа получил вводную: документ закрытия месяца у заказчика проводится без малого час. база не особенно большая, но такая продолжительность в любом случае не вариант. даже если учесть, что закрытие месяца — это ни разу не частотная операция и её можно делать, например, ночью. лезу в код, делаю замер производительности и вижу, что и почти всё это время платформа тратит на одну-единственную процедуру, выполняя пакет запросов. смотрю первый из них; ну, думаю, классика — запрос данных через точку от составного типа. наверняка субд пристегивает целый вагон соединений с тяжеленными таблицами документов, вот оптимизатор и не успевает набросать адекватный план. проверяю теорию — так, а тип salesdocument включает всего восемь документов. это, условно, в пределах допустимого (считается, что оптимизатор в состоянии подобрать адекватный план выполнения запроса, если количество соединений — в пределах восьми). смотрю размеры таблиц документов — не особенно-то и большие. выполняю запрос отдельно от пакета — да, работает не мгновенно (читает около 350 000 записей и отбирает примерно 200 000), но никак не час. ладно, первый запрос пакета тяжелый, но проблема не в нём. лезу во второй и понимаю, что до этого прочитали весь регистр inventory и отобрали большую часть записей, а теперь — читаем его ещё раз и склеиваем обе выборки по куче условий. подходящего индекса в таблице движений нет — только стандартный по регистратору и он, конечно, не подходит. проверил — именно тут платформа и проводит большую часть времени, ожидая ответа от субд. отказаться от двойного чтения всей таблицы регистра не вышло: я перебрал несколько вариантов, но все они требовали изменения структуры хранения данных, что было неприемлемо. в итоге остановился на промежуточном варианте: во втором запросе соединение с реальной таблицей движений регистра заменилось на соединение с заранее созданной временной таблицей, проиндексированной по полям соединения. это тот случай, когда общая рекомендация 1с сработала идеально — вместо 50 минут документ стал проводиться за три, а после дополнительной оптимизации кода — за минуту. то есть, в пятьдесят раз быстрее того, что я имел вначале. такой результат я счел достаточным (минута для закрытия месяца — это в общем случае нормально) и остановился.",
    "tags": [
      "1c",
      "done",
      "optimization",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/what-is-pmc-for\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Зачем нужен ЦУП?\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>24 ноября 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>ЦУП нужен, чтобы:</p>\n<ol>\n<li>Найти в системе узкое место (медленный код, тяжелый запрос);</li>\n<li>Расследовать конкретные блокировки или взаимоблокировки.</li>\n</ol>\n<p>В первом случае можно включить анализ запросов и, допустим, серверных вызовов. По результатам можно понять, что в системе грузит сервер приложений, а что — сервер СУБД. Часто так делают даже не решая конкретную проблему, а просто чтобы устранить узкие места и увеличить запас прочности системы на будущее.</p>\n<p>Во втором сценарии включают анализ блокировок или взаимоблокировок — когда знают, что они есть в системе, и хотят получить отчет: кто заблокировал, кого, когда, на какой строчке кода и так далее.</p>\n<p>В обеих случаях мониторинг запускают только в периоды основной нагрузки и минут на десять-пятнадцать. Массив исходных данных получается сравнительно небольшим (ЦУП'у нужно его обработать перед выдачей результата, чем больше данных — тем больше времени потребуется). Кроме того, не будет собрано лишних данных — например, не будет анализа нагрузки от регламентных работ, которые вы проводите ночью.</p>\n<p>Кроме того, это снижает влияние сбора данных на работу системы. Дело в том, что ЦУП может собирать очень тяжелый ТЖ, способный заметно нагрузить железо (на 30% медленнее? подержи мое пиво). С этим лучше быть осторожным.</p>\n<p>Для всего, что перечислено выше, достаточно аналитических показателей ЦУП'а: анализа запросов, ожиданий на блокировках, анализа взаимоблокировок 1С и MS SQL. Что до оперативных показателей — количества выполняемых запросов, суммарного времени их выполнения и так далее — то популярностью они не пользуются. Польза от них обычно не стоит времени на настройку, и ЦУП по большому счету никогда не проектировался для того, чтобы постоянно собирать их.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "зачем нужен цуп? 24 ноября 2019 · 1с цуп нужен, чтобы: найти в системе узкое место (медленный код, тяжелый запрос); расследовать конкретные блокировки или взаимоблокировки. в первом случае можно включить анализ запросов и, допустим, серверных вызовов. по результатам можно понять, что в системе грузит сервер приложений, а что — сервер субд. часто так делают даже не решая конкретную проблему, а просто чтобы устранить узкие места и увеличить запас прочности системы на будущее. во втором сценарии включают анализ блокировок или взаимоблокировок — когда знают, что они есть в системе, и хотят получить отчет: кто заблокировал, кого, когда, на какой строчке кода и так далее. в обеих случаях мониторинг запускают только в периоды основной нагрузки и минут на десять-пятнадцать. массив исходных данных получается сравнительно небольшим (цуп'у нужно его обработать перед выдачей результата, чем больше данных — тем больше времени потребуется). кроме того, не будет собрано лишних данных — например, не будет анализа нагрузки от регламентных работ, которые вы проводите ночью. кроме того, это снижает влияние сбора данных на работу системы. дело в том, что цуп может собирать очень тяжелый тж, способный заметно нагрузить железо (на 30% медленнее? подержи мое пиво). с этим лучше быть осторожным. для всего, что перечислено выше, достаточно аналитических показателей цуп'а: анализа запросов, ожиданий на блокировках, анализа взаимоблокировок 1с и ms sql. что до оперативных показателей — количества выполняемых запросов, суммарного времени их выполнения и так далее — то популярностью они не пользуются. польза от них обычно не стоит времени на настройку, и цуп по большому счету никогда не проектировался для того, чтобы постоянно собирать их.",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/find-methods-with-parameter\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Поиск методов с параметром\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>18 ноября 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Bash</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Задача: нужно найти в общих модулях конфигурации методы с определенным параметром (в этом примере — с параметром DecimalPlacesFor).</p>\n<p>Обычный поиск по коду конфигурации даст массу ложных срабатываний (например, все обращения к параметру с таким именем в теле методов). Поиск по регулярным выражениям платформа пока не поддерживает, поэтому выгодно выгрузить конфигурацию в файлы и натравить на папку общих модулей <a href=\"https://github.com/vkostyanetsky/ScriptsForLogAnalysis/blob/master/Файлы%20конфигурации/MethodsWithParameter.sh\" target=\"_blank\">скрипт</a> на баше.</p>\n<p>Первая часть скрипта (до пайпа) выполняет сам поиск, вторая — отрезает лишнее, чтобы на вывод уходили только названия модулей и найденных в них методов. Получится, например, так:</p>\n<p><img alt=\"Скриншот консоли\" src=\"https://kostyanetsky.ru/notes/find-methods-with-parameter/bash.png\"/></p>\n<p>Профит? Профит!</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "поиск методов с параметром 18 ноября 2019 · 1с bash готово задача: нужно найти в общих модулях конфигурации методы с определенным параметром (в этом примере — с параметром decimalplacesfor). обычный поиск по коду конфигурации даст массу ложных срабатываний (например, все обращения к параметру с таким именем в теле методов). поиск по регулярным выражениям платформа пока не поддерживает, поэтому выгодно выгрузить конфигурацию в файлы и натравить на папку общих модулей скрипт на баше. первая часть скрипта (до пайпа) выполняет сам поиск, вторая — отрезает лишнее, чтобы на вывод уходили только названия модулей и найденных в них методов. получится, например, так: профит? профит!",
    "tags": [
      "1c",
      "bash",
      "done"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/bablox\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Что такое Баблокс?\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>20 октября 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Посмотрел <a href=\"https://www.youtube.com/watch?v=p6D7SdhO4LI\" target=\"_blank\">вебинар</a> Евгения Филиппова про Баблокс. В общем, это такая дополнительная методика оценки производительности. Как и Апдекс, опирается на замеры времени — но предлагает иную механику расчета.</p>\n<p>Чтобы посчитать Баблокс, нужно умножить продолжительность операции на зарплату пользователя, который эту операцию делает. Зарплатой может быть:</p>\n<ul>\n<li>Некое среднее значение, если нужно поверхностно сравнить производительность одинаковой программы в нескольких компаниях.</li>\n<li>Реальная зарплата пользователя, если нужно доказать руководству, что пришло время выделить бюджет на оптимизацию.</li>\n</ul>\n<p>В итоге получим сумму, которую бизнес потерял, условно, из-за тормозов программы. В этом главный плюс методики: это число проще донести до среднего финансового директора. Что означает Апдекс, равный нулю целых пяти десятых — еще поди объясни, а вот что такое потерянные триста тысяч рублей — понятно сразу.</p>\n<p>Кроме того, снимаются субъективные вопросы, которые возникают при каждом внедрении. Например, определение ключевых операций; вот скажите, что важнее — быстрее продать товар или оприходовать на склад? Когда известно, сколько компания теряет в деньгах на каждой из этих операций — ответ дать куда проще.</p>\n<p>Конечно, это не идеальная модель. Например, возьмем такую ситуацию: программа тормозит у кладовщиков, но нормально работает у бухгалтеров. Зарплата кладовщиков ниже, чем зарплата бухгалтеров, и Баблокс для них будет невелик. Однако бухгалтера работают с тем, что ввели кладовщики, и пока последние не закончили — бухгалтерам нечем заняться. То есть компания теряет деньги из-за тормозов программы у кладовщиков, но Баблокс это не покажет.</p>\n<p>В общем, Баблокс вряд ли подвинет позиции Апдекса внутри айти-сообщества, но это и правда любопытный подход, который может здорово помочь в диалоге с клиентом.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "что такое баблокс? 20 октября 2019 · 1с посмотрел вебинар евгения филиппова про баблокс. в общем, это такая дополнительная методика оценки производительности. как и апдекс, опирается на замеры времени — но предлагает иную механику расчета. чтобы посчитать баблокс, нужно умножить продолжительность операции на зарплату пользователя, который эту операцию делает. зарплатой может быть: некое среднее значение, если нужно поверхностно сравнить производительность одинаковой программы в нескольких компаниях. реальная зарплата пользователя, если нужно доказать руководству, что пришло время выделить бюджет на оптимизацию. в итоге получим сумму, которую бизнес потерял, условно, из-за тормозов программы. в этом главный плюс методики: это число проще донести до среднего финансового директора. что означает апдекс, равный нулю целых пяти десятых — еще поди объясни, а вот что такое потерянные триста тысяч рублей — понятно сразу. кроме того, снимаются субъективные вопросы, которые возникают при каждом внедрении. например, определение ключевых операций; вот скажите, что важнее — быстрее продать товар или оприходовать на склад? когда известно, сколько компания теряет в деньгах на каждой из этих операций — ответ дать куда проще. конечно, это не идеальная модель. например, возьмем такую ситуацию: программа тормозит у кладовщиков, но нормально работает у бухгалтеров. зарплата кладовщиков ниже, чем зарплата бухгалтеров, и баблокс для них будет невелик. однако бухгалтера работают с тем, что ввели кладовщики, и пока последние не закончили — бухгалтерам нечем заняться. то есть компания теряет деньги из-за тормозов программы у кладовщиков, но баблокс это не покажет. в общем, баблокс вряд ли подвинет позиции апдекса внутри айти-сообщества, но это и правда любопытный подход, который может здорово помочь в диалоге с клиентом.",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/big-implementation\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Большое внедрение 1С\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>15 октября 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Что можно считать большим внедрением 1С? Фактически, эта платформа в России используется почти везде — даже в тех компаниях, где широко применяются решения конкурентов (например, тот же SAP). Конечно, где-то объемы внедрения невелики и 1С решает чисто утилитарные задачи вроде формирования отчетности, но среди работ ЦКТП можно найти по-настоящему колоссальные проекты — например, оптимизацию системы «<a href=\"http://v8.1c.ru/expert/cts/cts-218-001.htm\" target=\"_blank\">Деловых линий</a>», которая рассчитана на пять тысяч одновременно работающих пользователей.</p>\n<p>В общем, всё это приводит к тому, что средним внедрением в России сейчас считаются базы, в которых одновременно работают сотни пользователей, а большим внедрением — базы, где работают от тысячи пользователей (и больше).</p>\n<p>Размер базы при этом — не критерий: есть множество конфигураций, не предполагающих одновременной работы пользователей. Классический пример — 1C:Документооборот, менее классический — «Управление Автовокзалами» Авибуса. Последняя в состоянии накопить в своей центральной базе огромный объем данных от удаленных узлов своей распределенной сети (автовокзалов и автостанцией), однако большое количество одновременно работающих пользователей для нее не характерно.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "большое внедрение 1с 15 октября 2019 · 1с что можно считать большим внедрением 1с? фактически, эта платформа в россии используется почти везде — даже в тех компаниях, где широко применяются решения конкурентов (например, тот же sap). конечно, где-то объемы внедрения невелики и 1с решает чисто утилитарные задачи вроде формирования отчетности, но среди работ цктп можно найти по-настоящему колоссальные проекты — например, оптимизацию системы « деловых линий », которая рассчитана на пять тысяч одновременно работающих пользователей. в общем, всё это приводит к тому, что средним внедрением в россии сейчас считаются базы, в которых одновременно работают сотни пользователей, а большим внедрением — базы, где работают от тысячи пользователей (и больше). размер базы при этом — не критерий: есть множество конфигураций, не предполагающих одновременной работы пользователей. классический пример — 1c:документооборот, менее классический — «управление автовокзалами» авибуса. последняя в состоянии накопить в своей центральной базе огромный объем данных от удаленных узлов своей распределенной сети (автовокзалов и автостанцией), однако большое количество одновременно работающих пользователей для нее не характерно.",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/no-turnovers\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Оборотный регистр без оборотов\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>15 октября 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Если отключить для всех измерений оборотного регистра опцию «Использование в итогах», то обороты для регистра рассчитываться не будут. Более того, таблица оборотов регистра будет удалена из базы данных, и попытка обратиться к ней на языке запросов 1С приведет к ошибке.</p>\n<p>Такой трюк может быть уместен, когда мы накапливаем какие-то данные, а потом просто фильтруем их по регистратору или по другим полям. То есть от регистра нам нужна только его таблица движений. В этом случае нет никакого смысла тратить ресурсы сервера на расчет таблицы оборотов и её хранение.</p>\n<p>Конечно, при виде такой задачи в голову сразу приходит регистр сведений. Однако эффективность этого варианта зависит от количества измерений, которые вы собираетесь завести в регистре; дело в том, что каждый индекс по регистру сведений включает все его измерения (а периодические регистры — ещё и период). Между тем, платформа создает базовый индекс по измерениям, индекс для каждого измерения с признаком «Ведущее», а ещё — индекс для каждого измерения, ресурса или реквизита, которые вы решите проиндексировать отдельно. И это мы еще не дошли до таблиц срезов, где применяется тот же подход!</p>\n<p>В общем, накладные расходы на содержание индексов могут быть довольно заметны, если регистр сведений спланирован не особенно удачно и содержит сравнительно много измерений (скажем, больше двух-трех). В этом случае «плоский» оборотный регистр без оборотов смотрится вполне прилично.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "оборотный регистр без оборотов 15 октября 2019 · 1с если отключить для всех измерений оборотного регистра опцию «использование в итогах», то обороты для регистра рассчитываться не будут. более того, таблица оборотов регистра будет удалена из базы данных, и попытка обратиться к ней на языке запросов 1с приведет к ошибке. такой трюк может быть уместен, когда мы накапливаем какие-то данные, а потом просто фильтруем их по регистратору или по другим полям. то есть от регистра нам нужна только его таблица движений. в этом случае нет никакого смысла тратить ресурсы сервера на расчет таблицы оборотов и её хранение. конечно, при виде такой задачи в голову сразу приходит регистр сведений. однако эффективность этого варианта зависит от количества измерений, которые вы собираетесь завести в регистре; дело в том, что каждый индекс по регистру сведений включает все его измерения (а периодические регистры — ещё и период). между тем, платформа создает базовый индекс по измерениям, индекс для каждого измерения с признаком «ведущее», а ещё — индекс для каждого измерения, ресурса или реквизита, которые вы решите проиндексировать отдельно. и это мы еще не дошли до таблиц срезов, где применяется тот же подход! в общем, накладные расходы на содержание индексов могут быть довольно заметны, если регистр сведений спланирован не особенно удачно и содержит сравнительно много измерений (скажем, больше двух-трех). в этом случае «плоский» оборотный регистр без оборотов смотрится вполне прилично.",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/river-city-girls\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                River City Girls\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>30 сентября 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Семья</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Прошли на пару с мелкой River City Girls (недавно вышедший beat 'em up; это такой жанр игр, где нужно навалять всем, кто тебе не нравится).</p>\n<p>На <a href=\"https://kostyanetsky.ru/notes/river-city-girls/ru.jpg\" target=\"_blank\">фоточке</a> я наблюдаю за десятилетней Лисой, которая в этот момент уверенно разбрасывает толпу японских мордоворотов.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "river city girls 30 сентября 2019 · семья видеоигры прошли на пару с мелкой river city girls (недавно вышедший beat 'em up; это такой жанр игр, где нужно навалять всем, кто тебе не нравится). на фоточке я наблюдаю за десятилетней лисой, которая в этот момент уверенно разбрасывает толпу японских мордоворотов.",
    "tags": [
      "family",
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/control\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Control\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>14 сентября 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/r6RUXzb3NxY\" width=\"560\"></iframe>\n<p>К игре у меня две претензии. Во-первых, местные «измененные предметы»: их описания в сравнении с плодами буйной фантазии авторов из <a href=\"https://ru.wikipedia.org/wiki/SCP_Foundation\" target=\"_blank\">фонда SCP</a> выглядят не слишком ярко. Да, есть приятные исключения, но эта часть все равно кажется слабее остальной паранормальщины, которая есть в игре.</p>\n<p>Вторая претензия — то, при каких обстоятельствах игрок слышит <a href=\"https://www.youtube.com/watch?v=CkojH7htq-k\" target=\"_blank\">My Dark Disquet</a> от Poets of The Fall. Черт побери, это слишком крутой трек для такого проходного участка! Ожидал встретить его во время титров или какой-нибудь сумасшедшей схватки.</p>\n<p>Я понимаю, что оба пункта звучат мальца несерьёзно, но это правда всё. Control исключительно хороша и внешне, и геймплейно, и сюжетно. Единственная причина, по которой я никому не подарю эту игру на Новый Год — в Epic Games Store пока нет возможности это сделать :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "control 14 сентября 2019 · видеоигры к игре у меня две претензии. во-первых, местные «измененные предметы»: их описания в сравнении с плодами буйной фантазии авторов из фонда scp выглядят не слишком ярко. да, есть приятные исключения, но эта часть все равно кажется слабее остальной паранормальщины, которая есть в игре. вторая претензия — то, при каких обстоятельствах игрок слышит my dark disquet от poets of the fall. черт побери, это слишком крутой трек для такого проходного участка! ожидал встретить его во время титров или какой-нибудь сумасшедшей схватки. я понимаю, что оба пункта звучат мальца несерьёзно, но это правда всё. control исключительно хороша и внешне, и геймплейно, и сюжетно. единственная причина, по которой я никому не подарю эту игру на новый год — в epic games store пока нет возможности это сделать :-)",
    "tags": [
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/control-and-poets-of-the-fall\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Control и Poets of the Fall\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>23 августа 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Я и так уже не устоял перед рыжей чертовкой из <a href=\"https://youtu.be/oFjb_vlCsRA\" target=\"_blank\">трейлера</a> Control, а этим роликом ребята из Remedy и вовсе зашли с непробиваемых козырей.</p>\n<iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/EpiahpKp-VA\" width=\"560\"></iframe>\n<p>Послушайте, это просто неприлично круто! Можно как-нибудь перемотать время на конец августа? :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "control и poets of the fall 23 августа 2019 · видеоигры я и так уже не устоял перед рыжей чертовкой из трейлера control, а этим роликом ребята из remedy и вовсе зашли с непробиваемых козырей. послушайте, это просто неприлично круто! можно как-нибудь перемотать время на конец августа? :-)",
    "tags": [
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/fermi-paradox\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Парадокс Ферми\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>19 августа 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p><a href=\"https://twitter.com/tramdrey/status/1162911267419492353\" target=\"_blank\"><img alt=\"Твит\" src=\"https://kostyanetsky.ru/notes/fermi-paradox/snap-tweet-tramdrey-1162911267419492353.png\"/></a></p>\n<p>Причем, если игра хорошая, это обычно происходит как-то незаметно. Сидишь такой гоняешь в нишевый азиатский хоррор, а потом щелк! И приходишь в себя через пару часов где-нибудь в википедии, на странице про второй кризис в Тайваньском проливе.</p>\n<p>Статья про парадокс Ферми, кстати, и правда годная — пусть обзор, но написан живо и человеком, который любит то, о чем пишет.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "парадокс ферми 19 августа 2019 · тем временем видеоигры причем, если игра хорошая, это обычно происходит как-то незаметно. сидишь такой гоняешь в нишевый азиатский хоррор, а потом щелк! и приходишь в себя через пару часов где-нибудь в википедии, на странице про второй кризис в тайваньском проливе. статья про парадокс ферми, кстати, и правда годная — пусть обзор, но написан живо и человеком, который любит то, о чем пишет.",
    "tags": [
      "meanwhile",
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/duct-tape\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                На, мужик, изоленту\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>2 августа 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Книги</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Начитанные друзья иногда спрашивают — мол, какая у тебя любимая книга? Мне, блин, всегда чутка стыдно отвечать на этот вопрос, потому что при всём том огромном выборе, который есть, это «Марсианин» Энди Вейера.</p>\n<p>Если опустить то, что это классный приключенческий роман, то причина проста: как программист, я чувствую необыкновенное духовное родство с человеком, который решил кучу сложных инженерных проблем с помощью изоленты.</p>\n<blockquote>\n<p>Да, разумеется, изолента работает почти в вакууме. Изолента работает почти везде и повсюду. Изолента — это дар богов, ей нужно поклоняться.</p>\n<p><em>― Энди Вейер, «Марсианин»</em></p>\n</blockquote>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "на, мужик, изоленту 2 августа 2019 · книги работа начитанные друзья иногда спрашивают — мол, какая у тебя любимая книга? мне, блин, всегда чутка стыдно отвечать на этот вопрос, потому что при всём том огромном выборе, который есть, это «марсианин» энди вейера. если опустить то, что это классный приключенческий роман, то причина проста: как программист, я чувствую необыкновенное духовное родство с человеком, который решил кучу сложных инженерных проблем с помощью изоленты. да, разумеется, изолента работает почти в вакууме. изолента работает почти везде и повсюду. изолента — это дар богов, ей нужно поклоняться. ― энди вейер, «марсианин»",
    "tags": [
      "books",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/observation\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Observation\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>28 июля 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/58ibIuaHer8\" width=\"560\"></iframe>\n<p>За бортом — недалекое будущее, а вы — искусственный интеллект космической станции, на которой произошла катастрофа. Работа ваших систем нарушена, большая часть данных потеряна, а экипаж — чёрт знает где. Во всём этом нужно разобраться и навести порядок.</p>\n<p>Это завязка недавней <a href=\"https://www.epicgames.com/store/ru/product/observation/home\" target=\"_blank\">Observation</a> от No Code. Коротко: игра — пушка. Зайдет любителям научной фантастики, особенно классики (Артур Кларк, вот это всё). Из последнего, во что я играл в этом жанре, круче — только <a href=\"https://store.steampowered.com/app/282140/SOMA/\" target=\"_blank\">SOMA</a>.</p>\n<p>Искренне советую не читать никаких обзоров (журналисты без спойлеров двух слов связать не могут) и не смотреть официальный трейлер — в игре крутое интро и его стоит посмотреть внутри истории, а не на ютубе.</p>\n<p>Музыку к интро, кстати, написал Робин Финк (Nine Inch Nails). Вижуал в момент просмотра непонятен, но когда догоняешь, что именно там показывают — невольно проникаешься.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "observation 28 июля 2019 · видеоигры за бортом — недалекое будущее, а вы — искусственный интеллект космической станции, на которой произошла катастрофа. работа ваших систем нарушена, большая часть данных потеряна, а экипаж — чёрт знает где. во всём этом нужно разобраться и навести порядок. это завязка недавней observation от no code. коротко: игра — пушка. зайдет любителям научной фантастики, особенно классики (артур кларк, вот это всё). из последнего, во что я играл в этом жанре, круче — только soma . искренне советую не читать никаких обзоров (журналисты без спойлеров двух слов связать не могут) и не смотреть официальный трейлер — в игре крутое интро и его стоит посмотреть внутри истории, а не на ютубе. музыку к интро, кстати, написал робин финк (nine inch nails). вижуал в момент просмотра непонятен, но когда догоняешь, что именно там показывают — невольно проникаешься.",
    "tags": [
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/rapunzel\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Хороший день\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>9 июля 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Семья</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p><a href=\"https://twitter.com/IZRART/status/1146234848362713088\" target=\"_blank\"><img alt=\"Твит\" src=\"https://kostyanetsky.ru/notes/rapunzel/snap-tweet-IZRART-1146234848362713088.png\"/></a></p>\n<blockquote>\n<p>Дорогой дневник! Сегодня мне заплатили, чтобы я нарисовал думгая, который учит Рапунцель из диснеевской «Запутанной истории» стрельбе из тяжелой штурмовой винтовки. Сегодня был хороший день!</p>\n<p><em>― izra</em></p>\n</blockquote>\n<p>Обожаю художников. Особенные люди :-)</p>\n<p>(а также на рисунке я, обучающий дочку, как рашить зилотами в Starcraft 2)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "хороший день 9 июля 2019 · семья видеоигры дорогой дневник! сегодня мне заплатили, чтобы я нарисовал думгая, который учит рапунцель из диснеевской «запутанной истории» стрельбе из тяжелой штурмовой винтовки. сегодня был хороший день! ― izra обожаю художников. особенные люди :-) (а также на рисунке я, обучающий дочку, как рашить зилотами в starcraft 2)",
    "tags": [
      "family",
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/vue-i18n\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Мультиязычность в Vue.js\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>25 июня 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Блог</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Вебдев</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Я веду этот сайт на русском языке, но есть и <a href=\"https://kostyanetsky.me\" target=\"_blank\">зеркало</a> на английском — туда я постепенно перевожу то, что написал здесь. Поддерживать два набора скриптов я не хочу, поэтому оба домена ссылаются на один и тот же сервер, который определяет, с какого домена пришел запрос — и выводит ответ на соответствующем языке.</p>\n<p>Звучит просто, но на самом деле эта задача рождает довольно много дополнительных проблем, и одна из них — вывод интерфейса. Сначала я <s>по привычке</s> завел на клиенте два массива с фразами на разных языках, но быстро выкинул этот велосипед и прикрутил <a href=\"https://www.npmjs.com/package/vue-i18n\" target=\"_blank\">Vue I18n</a>.</p>\n<p>На нижнем уровне это, правда, всё те же <a href=\"https://kazupon.github.io/vue-i18n/guide/formatting.html#named-formatting\" target=\"_blank\">два массива</a> с фразами (их нужно задать при инициализации), однако выгода здесь в другом. Этот плагин сам по себе закрывает еще две проблемы с генерацией интерфейса:</p>\n<ol>\n<li><a href=\"https://kazupon.github.io/vue-i18n/guide/pluralization.html\" target=\"_blank\">Склонение существительных</a>. Нужно, чтобы правильно выводить слово «страница» в <a href=\"https://kostyanetsky.ru/notes/tags\" target=\"_blank\">статистике по тегам</a> — одна заметка, две заметки, пять заметок и так далее.</li>\n<li><a href=\"https://kazupon.github.io/vue-i18n/guide/datetime.html\" target=\"_blank\">Вывод дат</a>. Например, дата под этой заметкой.</li>\n</ol>\n<p>Обе задачи, конечно, можно было закрыть на стороне сервера, силами PHP, но я счел это некрасивым решением. Сервер должен возвращать данные, клиент — строить интерфейс. Нечего их смешивать.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "мультиязычность в vue.js 25 июня 2019 · блог вебдев готово я веду этот сайт на русском языке, но есть и зеркало на английском — туда я постепенно перевожу то, что написал здесь. поддерживать два набора скриптов я не хочу, поэтому оба домена ссылаются на один и тот же сервер, который определяет, с какого домена пришел запрос — и выводит ответ на соответствующем языке. звучит просто, но на самом деле эта задача рождает довольно много дополнительных проблем, и одна из них — вывод интерфейса. сначала я по привычке завел на клиенте два массива с фразами на разных языках, но быстро выкинул этот велосипед и прикрутил vue i18n . на нижнем уровне это, правда, всё те же два массива с фразами (их нужно задать при инициализации), однако выгода здесь в другом. этот плагин сам по себе закрывает еще две проблемы с генерацией интерфейса: склонение существительных . нужно, чтобы правильно выводить слово «страница» в статистике по тегам — одна заметка, две заметки, пять заметок и так далее. вывод дат . например, дата под этой заметкой. обе задачи, конечно, можно было закрыть на стороне сервера, силами php, но я счел это некрасивым решением. сервер должен возвращать данные, клиент — строить интерфейс. нечего их смешивать.",
    "tags": [
      "blog",
      "webdev",
      "done"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/draugen\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Draugen\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>10 июня 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/ziNZqEw0Adg\" width=\"560\"></iframe>\n<p>Сравнительно короткая, но по-своему яркая история. Проиграть тут нельзя, особого выбора (кроме вариантов реплик) нет. Но то, как тут всё звучит и выглядит, то, как здорово прописаны персонажи — удивляет и трогает. Даже если угадываешь повороты сюжета до того, как с ними столкнешься.</p>\n<p>В целом игра напомнила то ли Firewatch, то ли The Vanishing of Ethan Carter. Сюжет, на мой вкус, мог быть немного длиннее и заметно драматичнее, но мне всё равно чертовски понравилось, как всё закончилось. Эмоции от финала можно выразить — <strong>осторожно, спойлер</strong> — <a href=\"https://kostyanetsky.ru/notes/draugen/the-main-thing-is.jpg\" target=\"_blank\">вот этой картинкой</a> :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "draugen 10 июня 2019 · видеоигры сравнительно короткая, но по-своему яркая история. проиграть тут нельзя, особого выбора (кроме вариантов реплик) нет. но то, как тут всё звучит и выглядит, то, как здорово прописаны персонажи — удивляет и трогает. даже если угадываешь повороты сюжета до того, как с ними столкнешься. в целом игра напомнила то ли firewatch, то ли the vanishing of ethan carter. сюжет, на мой вкус, мог быть немного длиннее и заметно драматичнее, но мне всё равно чертовски понравилось, как всё закончилось. эмоции от финала можно выразить — осторожно, спойлер — вот этой картинкой :-)",
    "tags": [
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/burned-people\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                И приятнее пахнуть\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>10 июня 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Битрикс</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>На днях выпустили очередный релиз FirstBIT ERP (наш программный продукт для автоматизации бизнеса в ОАЭ). Вложен вагон труда, всё работает как надо, есть чем гордиться и всё такое. Я, например, кучу сил потратил на то, чтобы сделать полноценный обмен данными с Битрикс24 и порядком рад, что успел этот механизм зафиналить.</p>\n<p>Но в душе всё равно немного завидно <a href=\"https://steamcommunity.com/games/505230/announcements/detail/1597002662743679418\" target=\"_blank\">коллегам</a> из геймдева: наши патчноуты, конечно, тоже интересные, но <a href=\"https://kostyanetsky.ru/notes/burned-people/better.png\" target=\"_blank\">такого</a> там всё-таки не встретить.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "и приятнее пахнуть 10 июня 2019 · видеоигры работа битрикс на днях выпустили очередный релиз firstbit erp (наш программный продукт для автоматизации бизнеса в оаэ). вложен вагон труда, всё работает как надо, есть чем гордиться и всё такое. я, например, кучу сил потратил на то, чтобы сделать полноценный обмен данными с битрикс24 и порядком рад, что успел этот механизм зафиналить. но в душе всё равно немного завидно коллегам из геймдева: наши патчноуты, конечно, тоже интересные, но такого там всё-таки не встретить.",
    "tags": [
      "videogames",
      "work",
      "bitrix"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/so-much\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Сикока сикока?\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>5 июня 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Блог</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Вебдев</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Node.js</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Javascript</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Этот сайт почти полностью написан на PHP. JavaScript на клиенте используется ситуативно — редирект сделать, картинку показать и так далее.</p>\n<p>Для личного ресурса ничего сложнее и не нужно, но некоторое время назад мне приспичило слегка освежить свои навыки веб-разработки. В качестве платформы для эксперимента я выбрал Vue.js — популярный, быстрый и не слишком сложный фреймворк.</p>\n<p>Я, собственно, к чему это всё пишу. Развернул тут Node.js, Vue CLI, создал первый проект — и чуть не поседел. Триста мегабайт джаваскрипта прямо со старта?! Серьёзно?!</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "сикока сикока? 5 июня 2019 · блог вебдев node.js javascript этот сайт почти полностью написан на php. javascript на клиенте используется ситуативно — редирект сделать, картинку показать и так далее. для личного ресурса ничего сложнее и не нужно, но некоторое время назад мне приспичило слегка освежить свои навыки веб-разработки. в качестве платформы для эксперимента я выбрал vue.js — популярный, быстрый и не слишком сложный фреймворк. я, собственно, к чему это всё пишу. развернул тут node.js, vue cli, создал первый проект — и чуть не поседел. триста мегабайт джаваскрипта прямо со старта?! серьёзно?!",
    "tags": [
      "blog",
      "webdev",
      "nodejs",
      "javascript"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/yomawari-night-alone\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Yomawari: Night Alone\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>30 мая 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/Li5YQxI_WQg\" width=\"560\"></iframe>\n<p>Клевая изометрическая бродилка про город, набитый классическими японскими призраками и девочку, которая в этом городе ищет пропавшую сестру. Не слишком страшная — она, скорее, держит в напряжении. Не слишком сложная, хотя требует внимательности и концентрации (привидений много, ведут они себя по-разному, нужно смотреть по сторонам и не считать ворон). Не слишком быстрая, хотя местами всё-таки нужна хорошая реакция (особенно ближе к концу сюжетной линии).</p>\n<p>В целом оставила очень приятное ощущение проекта, в который, может, и не были вложены миллионы, но который старались сделать настолько хорошо, насколько это было возможно.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "yomawari: night alone 30 мая 2019 · видеоигры клевая изометрическая бродилка про город, набитый классическими японскими призраками и девочку, которая в этом городе ищет пропавшую сестру. не слишком страшная — она, скорее, держит в напряжении. не слишком сложная, хотя требует внимательности и концентрации (привидений много, ведут они себя по-разному, нужно смотреть по сторонам и не считать ворон). не слишком быстрая, хотя местами всё-таки нужна хорошая реакция (особенно ближе к концу сюжетной линии). в целом оставила очень приятное ощущение проекта, в который, может, и не были вложены миллионы, но который старались сделать настолько хорошо, насколько это было возможно.",
    "tags": [
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/big-table-at-client\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Большая таблица на клиенте\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>19 мая 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Про нюансы работы со здоровенными таблицами на клиенте я уже пару раз писал (<a href=\"https://kostyanetsky.ru/notes/find-rows-at-client\" target=\"_blank\">раз</a>, <a href=\"https://kostyanetsky.ru/notes/big-value-tables\" target=\"_blank\">два</a>), но в конце прошлой недели коллеги подсказали ещё один любопытный способ оптимизации работы с относительно большими коллекциями данных на клиенте. Вкратце: стандарт <a href=\"https://its.1c.ru/db/v8std#content:628:hdoc\" target=\"_blank\">советует</a> работать с большими коллекциями только на сервере, однако если сразу обойти всю коллекцию на клиенте (например, в обработчике открытия формы) — она закешируется. В итоге последующие обходы, поиск строк и другая работа с данными не будут требовать дополнительных серверных вызовов. Суммарные расходы при таком подходе получаются ниже.</p>\n<p>Погонял сейчас простые тесты — да, похоже, что так и есть. Метод выглядит отчасти костыльно и на серьезных нагрузках я его ещё не проверял — но, вероятно, его вполне можно иметь ввиду.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "большая таблица на клиенте 19 мая 2019 · 1с про нюансы работы со здоровенными таблицами на клиенте я уже пару раз писал ( раз , два ), но в конце прошлой недели коллеги подсказали ещё один любопытный способ оптимизации работы с относительно большими коллекциями данных на клиенте. вкратце: стандарт советует работать с большими коллекциями только на сервере, однако если сразу обойти всю коллекцию на клиенте (например, в обработчике открытия формы) — она закешируется. в итоге последующие обходы, поиск строк и другая работа с данными не будут требовать дополнительных серверных вызовов. суммарные расходы при таком подходе получаются ниже. погонял сейчас простые тесты — да, похоже, что так и есть. метод выглядит отчасти костыльно и на серьезных нагрузках я его ещё не проверял — но, вероятно, его вполне можно иметь ввиду.",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/close-to-the-sun\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Close to the Sun\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>14 мая 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/UMsQ2oB006w\" width=\"560\"></iframe>\n<p>Игрожуры и ютуберы соревнуются, кто задорнее обложит «Close to the Sun» в рецензиях, а мне игра неожиданно понравилась. Конечно, это не шедевр, но атмосфера огромного «летучего голландца» передана просто отлично. Происходящее местами напоминает Биошок, но я очень далек от того, чтобы валять в перьях любую историю, которая чем-то похожа на то, что я уже где-то видел.</p>\n<p>А ещё во время финальных титров тут играет очень крутой <a href=\"https://www.youtube.com/watch?v=TiRZVAO2XbQ\" target=\"_blank\">сингл</a>, который буквально продал мне игру пару дней назад и который можно слушать, к самой игре не прикасаясь.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "close to the sun 14 мая 2019 · видеоигры игрожуры и ютуберы соревнуются, кто задорнее обложит «close to the sun» в рецензиях, а мне игра неожиданно понравилась. конечно, это не шедевр, но атмосфера огромного «летучего голландца» передана просто отлично. происходящее местами напоминает биошок, но я очень далек от того, чтобы валять в перьях любую историю, которая чем-то похожа на то, что я уже где-то видел. а ещё во время финальных титров тут играет очень крутой сингл , который буквально продал мне игру пару дней назад и который можно слушать, к самой игре не прикасаясь.",
    "tags": [
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/pagelatch\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Задержки PageLatch\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>22 апреля 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">MS SQL</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Задержки вида PageIOLatch (я про них сегодня <a href=\"https://kostyanetsky.ru/notes/pageiolatch\" target=\"_blank\">писал</a>) легко встретить в любых системах, в том числе небольших. С задержками PageLatch дела обстоят наоборот — их трудно заметить, пока пользователей меньше нескольких тысяч.</p>\n<p>Дело в том, что они возникают, когда страница находится в оперативной памяти и её пытаются изменить несколько пользователей. Пока один пользователь не завершит модификацию — прочие должны ждать. Время ожидания обычно ничтожно, однако если конкурирующих за страницу пользователей много — оно становится заметным.</p>\n<p>Возможных причин две.</p>\n<h2>Горячее место в индексе</h2>\n<p>Такой расклад иногда называют хотспотом. Он возникает, когда мы массово пытаемся писать что-то на последнюю страницу индекса; в первую очередь речь идёт об индексе с монотонно возрастающим ключом — например, любые индексы по полям ссылочного типа (начиная с последних версий 8.2, платформа выдает последовательные GUID — это снижает фрагментацию диска и делает ключ индекса монотонно возрастающим).</p>\n<p>Что такое «индекс с монотонно возрастающим ключом»? Для платформы 1С это, например, индексы регистров по периоду. Конечно, они растут не вполне монотонно — однако тут скорее важно, что данные мы всегда будем писать в конец. Сюда же относятся индексы по номеру документа и индексы по коду справочника — в обеих случаях мы выдаем некий новый номер, который пишется в конец индекса.</p>\n<p>Решается проблема хотспота только архитектурно — нужно добиться того, чтобы данные записывались в разные места индекса, а не только в конец.</p>\n<h2>Системные страницы tempdb</h2>\n<p>Когда мы создаём или удаляем таблицу в базе данных, в ней обновляется ряд служебных страниц — IAM (Index Allocation Map), PFS (Page Free Space), GAM (Global Allocation Map), SGAM (Shared Global Allocation Map) и другие.</p>\n<p>Почему это важно для tempdb? Для платформы 1С это база, в которой регулярно создается <strong>огромное</strong> количество таблиц. Служебные страницы при этом обновляются настолько часто, что при этом возникают задержки семейства PageLatch.</p>\n<p>Вообще-то MS SQL Server умеет оптимизировать обновления системных страниц для tempdb, благодаря чему это делается реже, но иногда даже этого не достаточно. Особенно если в tempdb создаются таблицы с индексами — а это очень частый кейс для приложений на 1С.</p>\n<p>У проблемы есть несколько возможных решений. Первый — если СУБД старше 2016-й, можно отключить смешанные экстенты через флаг трассировки 1118. При этом исчезнет необходимость сразу в двух служебных страницах — GAM и SGAM. Соответственно, ожиданий на их обновлении не будет. Экстент — это восемь страниц данных, т.е. 64 килобайта; если он содержит страницы одной таблицы — это нормированный экстент, если нескольких — смешанный.</p>\n<p>Второй подход — разбивать tempdb (с 2016-й версии СУБД она, кстати, по умолчанию разбивается на восемь файлов). Дело в том, что служебные страницы ведутся в разрезе файлов; если их будет несколько — ожидания на обновлениях служебных страниц будут ниже.</p>\n<p>Третий вариант — уменьшать количество временных таблиц с целью снизить нагрузку на tempdb. То есть переписывать наиболее частотные запросы так, чтобы они работали приемлемо быстро без временных таблиц.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "задержки pagelatch 22 апреля 2019 · 1с ms sql задержки вида pageiolatch (я про них сегодня писал ) легко встретить в любых системах, в том числе небольших. с задержками pagelatch дела обстоят наоборот — их трудно заметить, пока пользователей меньше нескольких тысяч. дело в том, что они возникают, когда страница находится в оперативной памяти и её пытаются изменить несколько пользователей. пока один пользователь не завершит модификацию — прочие должны ждать. время ожидания обычно ничтожно, однако если конкурирующих за страницу пользователей много — оно становится заметным. возможных причин две. горячее место в индексе такой расклад иногда называют хотспотом. он возникает, когда мы массово пытаемся писать что-то на последнюю страницу индекса; в первую очередь речь идёт об индексе с монотонно возрастающим ключом — например, любые индексы по полям ссылочного типа (начиная с последних версий 8.2, платформа выдает последовательные guid — это снижает фрагментацию диска и делает ключ индекса монотонно возрастающим). что такое «индекс с монотонно возрастающим ключом»? для платформы 1с это, например, индексы регистров по периоду. конечно, они растут не вполне монотонно — однако тут скорее важно, что данные мы всегда будем писать в конец. сюда же относятся индексы по номеру документа и индексы по коду справочника — в обеих случаях мы выдаем некий новый номер, который пишется в конец индекса. решается проблема хотспота только архитектурно — нужно добиться того, чтобы данные записывались в разные места индекса, а не только в конец. системные страницы tempdb когда мы создаём или удаляем таблицу в базе данных, в ней обновляется ряд служебных страниц — iam (index allocation map), pfs (page free space), gam (global allocation map), sgam (shared global allocation map) и другие. почему это важно для tempdb? для платформы 1с это база, в которой регулярно создается огромное количество таблиц. служебные страницы при этом обновляются настолько часто, что при этом возникают задержки семейства pagelatch. вообще-то ms sql server умеет оптимизировать обновления системных страниц для tempdb, благодаря чему это делается реже, но иногда даже этого не достаточно. особенно если в tempdb создаются таблицы с индексами — а это очень частый кейс для приложений на 1с. у проблемы есть несколько возможных решений. первый — если субд старше 2016-й, можно отключить смешанные экстенты через флаг трассировки 1118. при этом исчезнет необходимость сразу в двух служебных страницах — gam и sgam. соответственно, ожиданий на их обновлении не будет. экстент — это восемь страниц данных, т.е. 64 килобайта; если он содержит страницы одной таблицы — это нормированный экстент, если нескольких — смешанный. второй подход — разбивать tempdb (с 2016-й версии субд она, кстати, по умолчанию разбивается на восемь файлов). дело в том, что служебные страницы ведутся в разрезе файлов; если их будет несколько — ожидания на обновлениях служебных страниц будут ниже. третий вариант — уменьшать количество временных таблиц с целью снизить нагрузку на tempdb. то есть переписывать наиболее частотные запросы так, чтобы они работали приемлемо быстро без временных таблиц.",
    "tags": [
      "1c",
      "mssql"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/pageiolatch\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Задержки PageIOLatch\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>22 апреля 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">MS SQL</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Когда мы читаем страницу данных с диска в буферный кэш, она на очень короткое время блокируется (её нельзя писать, а в некоторых случаях — ещё и читать). Ожидание на завершении этого действия — и есть задержка PageIOLatch.</p>\n<p>Причиной может быть вымывание буферного кэша — из-за небольшого объёма доступной ОЗУ или не оптимальных запросов, которые читают миллионы строк, а возвращают три. В итоге СУБД регулярно не находит нужных страниц в кэше и вынуждена снова и снова читать их с диска.</p>\n<p>В общем, если в системе есть существенные задержки PageIOLatch — их скорее всего можно снизить, используя более быстрые диски, наращивая объём ОЗУ и оптимизируя запросы.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "задержки pageiolatch 22 апреля 2019 · ms sql когда мы читаем страницу данных с диска в буферный кэш, она на очень короткое время блокируется (её нельзя писать, а в некоторых случаях — ещё и читать). ожидание на завершении этого действия — и есть задержка pageiolatch. причиной может быть вымывание буферного кэша — из-за небольшого объёма доступной озу или не оптимальных запросов, которые читают миллионы строк, а возвращают три. в итоге субд регулярно не находит нужных страниц в кэше и вынуждена снова и снова читать их с диска. в общем, если в системе есть существенные задержки pageiolatch — их скорее всего можно снизить, используя более быстрые диски, наращивая объём озу и оптимизируя запросы.",
    "tags": [
      "mssql"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/object-locks\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Объектные блокировки\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>22 апреля 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Во-первых, сразу, чтобы не путаться: объектные блокировки платформы никак не связаны с управляемыми блокировками и, тем более, блокировками СУБД. Во-вторых, различают два вида: пессимистические объектные блокировки и оптимистические.</p>\n<p>Оба вида неплохо <a href=\"https://its.1c.ru/db/metod8dev#content:5839:hdoc\" target=\"_blank\">описаны</a> на ИТС; ниже — просто краткая выжимка.</p>\n<h2>Пессимистические блокировки</h2>\n<p>Накладываются расширением формы, когда пользователь начинает редактировать объект — например, меняет значение поля. Если тот же объект попробует отредактировать в форме другой пользователь — форма, которую он открыл, тоже попробует наложить пессимистическую блокировку, не сможет этого сделать и пользователь получит ошибку «Не удалось заблокировать запись».</p>\n<p>То есть платформа в данном случае делает своего рода пессимистичную оценку ситуации: мол, раз первый пользователь начал редактировать объект — скорее всего, он его запишет. Раз так, второму пользователю разрешать редактировать нельзя.</p>\n<p>Пессимистическую блокировку также можно наложить методом объекта Заблокировать() и снять через метод Разблокировать(). Кроме того, можно воспользоваться методом глобального контекста ЗаблокироватьДанныеДляРедактирования() и методом управляемой формы ЗаблокироватьДанныеФормыДляРедактирования().</p>\n<h2>Оптимистические блокировки</h2>\n<p>Сперва немного теории: платформа хранит версии объектов ссылочного типа (справочников, документов и так далее). По сути это просто момент времени, в который объект был изменён последний раз. Когда объект считывается расширением формы или кодом — его версия считывается вместе с ним.</p>\n<p>Так вот, в момент записи объекта платформа сверяет ту версию, что была получена при чтении объекта из базы данных и ту, что указана в базе данных в момент записи. Если версии различаются — возникает ошибка «Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных».</p>\n<p>Это и есть так называемая «оптимистическая блокировка». Называют её так потому, что платформа тянет с проверкой до последнего — пока не произойдет реальной попытки записи.</p>\n<p>Наложить оптимистическую блокировку объекта через код нельзя: версия объекта хранится в поле _Version таблицы данных объекта, заполнением которого занимается СУБД. Напрямую изменить это значение средствами платформы нельзя (можно, впрочем, записать объект — тогда его версия изменится).</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "объектные блокировки 22 апреля 2019 · 1с во-первых, сразу, чтобы не путаться: объектные блокировки платформы никак не связаны с управляемыми блокировками и, тем более, блокировками субд. во-вторых, различают два вида: пессимистические объектные блокировки и оптимистические. оба вида неплохо описаны на итс; ниже — просто краткая выжимка. пессимистические блокировки накладываются расширением формы, когда пользователь начинает редактировать объект — например, меняет значение поля. если тот же объект попробует отредактировать в форме другой пользователь — форма, которую он открыл, тоже попробует наложить пессимистическую блокировку, не сможет этого сделать и пользователь получит ошибку «не удалось заблокировать запись». то есть платформа в данном случае делает своего рода пессимистичную оценку ситуации: мол, раз первый пользователь начал редактировать объект — скорее всего, он его запишет. раз так, второму пользователю разрешать редактировать нельзя. пессимистическую блокировку также можно наложить методом объекта заблокировать() и снять через метод разблокировать(). кроме того, можно воспользоваться методом глобального контекста заблокироватьданныедляредактирования() и методом управляемой формы заблокироватьданныеформыдляредактирования(). оптимистические блокировки сперва немного теории: платформа хранит версии объектов ссылочного типа (справочников, документов и так далее). по сути это просто момент времени, в который объект был изменён последний раз. когда объект считывается расширением формы или кодом — его версия считывается вместе с ним. так вот, в момент записи объекта платформа сверяет ту версию, что была получена при чтении объекта из базы данных и ту, что указана в базе данных в момент записи. если версии различаются — возникает ошибка «операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных». это и есть так называемая «оптимистическая блокировка». называют её так потому, что платформа тянет с проверкой до последнего — пока не произойдет реальной попытки записи. наложить оптимистическую блокировку объекта через код нельзя: версия объекта хранится в поле _version таблицы данных объекта, заполнением которого занимается субд. напрямую изменить это значение средствами платформы нельзя (можно, впрочем, записать объект — тогда его версия изменится).",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/fat-roles\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Растолстевшие роли\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>18 апреля 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Очень любопытная <a href=\"https://start1c.blogspot.com/2019/01/blog-post.html\" target=\"_blank\">заметка</a> про неприятности, которые можно нажить командой роли «Снять все права». Нет, никакого криминала, права-то она честно снимает — только вот её вызов может привести к тому, что объект роли на пустом месте сожрёт в несколько раз больше памяти, чем ему реально нужно.</p>\n<p>Прочитал, задумался и пошел проверять, как обстоят дела с этим у нас в конфигурации. И что бы вы думали? Накопал десятка два ролей, доверху набитых «снятыми галочками». Выгрузка прав весила около трёхста мегабайт, а после оптимизации — усохла почти втрое.</p>\n<p>Любопытно, как это до сих пор оставалось незамеченным. Скорее всего, из-за количества объектов — у нас сравнительно небольшая конфигурация. То есть проблемные роли потребляли не так много ресурсов, чтобы мы что-то заподозрили.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "растолстевшие роли 18 апреля 2019 · 1с работа очень любопытная заметка про неприятности, которые можно нажить командой роли «снять все права». нет, никакого криминала, права-то она честно снимает — только вот её вызов может привести к тому, что объект роли на пустом месте сожрёт в несколько раз больше памяти, чем ему реально нужно. прочитал, задумался и пошел проверять, как обстоят дела с этим у нас в конфигурации. и что бы вы думали? накопал десятка два ролей, доверху набитых «снятыми галочками». выгрузка прав весила около трёхста мегабайт, а после оптимизации — усохла почти втрое. любопытно, как это до сих пор оставалось незамеченным. скорее всего, из-за количества объектов — у нас сравнительно небольшая конфигурация. то есть проблемные роли потребляли не так много ресурсов, чтобы мы что-то заподозрили.",
    "tags": [
      "1c",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/gris\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                GRIS\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>14 апреля 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/gvECQlxrhbw\" width=\"560\"></iframe>\n<p>Эту игру сравнительно сложно рекомендовать, но она и правда искусство в прямом смысле слова. Сходу даже не вспомню, когда в последний раз был заворожен настолько, что не мог оторваться.</p>\n<p>То ли графикой, то ли музыкой, то ли тем, что авторы очень искренне передали то состояние, о котором хотели рассказать.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "gris 14 апреля 2019 · видеоигры эту игру сравнительно сложно рекомендовать, но она и правда искусство в прямом смысле слова. сходу даже не вспомню, когда в последний раз был заворожен настолько, что не мог оторваться. то ли графикой, то ли музыкой, то ли тем, что авторы очень искренне передали то состояние, о котором хотели рассказать.",
    "tags": [
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/simple-checkbox\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Простая галочка\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>30 марта 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Пару недель назад мы добавили в справочник номенклатуры FirstBIT ERP параметр «Inactive». Задача была простой: если товар больше не нужен пользователю — он ставит галочку и тот исчезает отовсюду (из форм выбора, форм подбора остатков на складах и так далее).</p>\n<p>Звучит несложно, правда? Техническая реализация тоже была простой — мы прошлись по всем объектам, в которых предполагается выбор номенклатуры, и добавили дополнительный параметр этого выбора.</p>\n<p><img alt=\"Параметры выбора\" src=\"https://kostyanetsky.ru/notes/simple-checkbox/choice-parameters.png\"/></p>\n<p>Но пользователи начали жаловаться, что настройка не работает. Мы полезли разбираться и поняли, что забыли про историю ввода — этот механизм, как оказалось, параметры выбора просто игнорирует. То есть пользователи выбирали в инвойсе какой-то товар, потом делали его неактивным, возвращались и инвойс и… Снова видели в истории товар, который вроде только что отключили.</p>\n<p>Мы принялись искать выход. Проблема в том, что история ввода хранится в системном хранилище и повлиять на неё программно нельзя. Можно разве что полностью удалить — но фактическая очистка истории происходит только при перезапуске клиента (и то через раз). Отключить историю вообще? Напоминает лечение простуды отсечением головы.</p>\n<p>В какой-то момент мы наткнулись на информацию о том, что история ввода хранится не просто для конкретного поля, а ещё и в разрезе параметров выбора. То есть для каждого сочетания параметров выбора и их значений история выбора своя. Получается, если добавить некий дополнительный параметр выбора ко всем полям, где выбирается номенклатура — изменение значения этого параметра будет «чистить» историю (на самом деле, конечно, создавать новую — но пользователю-то какая разница).</p>\n<p>В общем, мы создали такой параметр. Хранится в общем хранилище и транслируется в формы при их открытии через общий модуль, который программно добавляет параметр выбора. Если пользователь снимает или устанавливает флаг Inactive для любой номенклатуры — значение параметра меняется, а уже открытые формы получают его через механизм оповещений.</p>\n<p><img alt=\"Минуточку!\" src=\"https://media.giphy.com/media/3o7btPCcdNniyf0ArS/giphy.gif\"/></p>\n<p>А ведь как все невинно начиналось, а?</p>\n<p>Однако механизм неплохо работает, хотя его недостатки налицо: во-первых, системное хранилище будет постепенно пухнуть по мере появления всё новых и новых сочетаний реальных параметров выбора и нашего, фиктивного. Во-вторых, запись номенклатуры теперь потенциально узкое место: два пользователя не смогут одновременно записать номенклатуры, у которых изменены флаги Inactive (будет блокировка при записи нового значения нашего скрытого параметра выбора в общее хранилище).</p>\n<p>Первую проблему можно решить очисткой хранилища по какому-то триггеру, вторую — записью нашего параметра выбора в разрезе пользователей (например, через регистр сведений). Впрочем, мы искренне надеемся, что 1С даст какой-то доступ к истории ввода до того, как нам придется городить дополнительные костыли к тем, что мы уже наворотили :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "простая галочка 30 марта 2019 · 1с работа пару недель назад мы добавили в справочник номенклатуры firstbit erp параметр «inactive». задача была простой: если товар больше не нужен пользователю — он ставит галочку и тот исчезает отовсюду (из форм выбора, форм подбора остатков на складах и так далее). звучит несложно, правда? техническая реализация тоже была простой — мы прошлись по всем объектам, в которых предполагается выбор номенклатуры, и добавили дополнительный параметр этого выбора. но пользователи начали жаловаться, что настройка не работает. мы полезли разбираться и поняли, что забыли про историю ввода — этот механизм, как оказалось, параметры выбора просто игнорирует. то есть пользователи выбирали в инвойсе какой-то товар, потом делали его неактивным, возвращались и инвойс и… снова видели в истории товар, который вроде только что отключили. мы принялись искать выход. проблема в том, что история ввода хранится в системном хранилище и повлиять на неё программно нельзя. можно разве что полностью удалить — но фактическая очистка истории происходит только при перезапуске клиента (и то через раз). отключить историю вообще? напоминает лечение простуды отсечением головы. в какой-то момент мы наткнулись на информацию о том, что история ввода хранится не просто для конкретного поля, а ещё и в разрезе параметров выбора. то есть для каждого сочетания параметров выбора и их значений история выбора своя. получается, если добавить некий дополнительный параметр выбора ко всем полям, где выбирается номенклатура — изменение значения этого параметра будет «чистить» историю (на самом деле, конечно, создавать новую — но пользователю-то какая разница). в общем, мы создали такой параметр. хранится в общем хранилище и транслируется в формы при их открытии через общий модуль, который программно добавляет параметр выбора. если пользователь снимает или устанавливает флаг inactive для любой номенклатуры — значение параметра меняется, а уже открытые формы получают его через механизм оповещений. а ведь как все невинно начиналось, а? однако механизм неплохо работает, хотя его недостатки налицо: во-первых, системное хранилище будет постепенно пухнуть по мере появления всё новых и новых сочетаний реальных параметров выбора и нашего, фиктивного. во-вторых, запись номенклатуры теперь потенциально узкое место: два пользователя не смогут одновременно записать номенклатуры, у которых изменены флаги inactive (будет блокировка при записи нового значения нашего скрытого параметра выбора в общее хранилище). первую проблему можно решить очисткой хранилища по какому-то триггеру, вторую — записью нашего параметра выбора в разрезе пользователей (например, через регистр сведений). впрочем, мы искренне надеемся, что 1с даст какой-то доступ к истории ввода до того, как нам придется городить дополнительные костыли к тем, что мы уже наворотили :-)",
    "tags": [
      "1c",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/mssql-server-start-date\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Дата запуска сервера MS SQL\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>8 марта 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">MS SQL</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Для чего может пригодиться дата запуска MS SQL Server? Например, мы разбираем задержки в работе СУБД и хотим определить, в течении какого периода времени наполнялась DMV-шка <a href=\"https://docs.microsoft.com/ru-ru/sql/relational-databases/system-dynamic-management-views/sys-dm-os-wait-stats-transact-sql\" target=\"_blank\">sys.dm_os_wait_stats</a>. Её данные (как и любой другой DMV, впрочем) хранятся в оперативной памяти как раз с момента запуска СУБД.</p>\n<p>Дату запуска сервера можно получить из  DMV-шки <a href=\"https://docs.microsoft.com/ru-ru/sql/relational-databases/system-dynamic-management-views/sys-dm-os-sys-info-transact-sql\" target=\"_blank\">sys.dm_os_sys_info</a>:</p>\n<pre><code>SELECT sqlserver_start_time FROM sys.dm_os_sys_info\n</code></pre>\n<p>Есть и другой способ, связанный с tempdb. Эта база данных создаётся при запуске сервера, и дата её создания вполне может считаться датой запуска сервера. Значение можно вытащить из <a href=\"https://docs.microsoft.com/ru-ru/sql/relational-databases/system-catalog-views/sys-databases-transact-sql\" target=\"_blank\">sys.databases</a>:</p>\n<pre><code>SELECT create_date FROM sys.databases WHERE name = 'tempdb'\n</code></pre>\n<p>Нюанс: дату запуска сервера как точку начала сбора данных DMV-шек нужно рассматривать с осторожностью. Накопленная статистика могла быть очищена вручную — например, вот так:</p>\n<pre><code>DBCC SQLPERF('sys.dm_os_wait_stats', CLEAR)\n</code></pre>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "дата запуска сервера ms sql 8 марта 2019 · ms sql для чего может пригодиться дата запуска ms sql server? например, мы разбираем задержки в работе субд и хотим определить, в течении какого периода времени наполнялась dmv-шка sys.dm_os_wait_stats . её данные (как и любой другой dmv, впрочем) хранятся в оперативной памяти как раз с момента запуска субд. дату запуска сервера можно получить из dmv-шки sys.dm_os_sys_info : select sqlserver_start_time from sys.dm_os_sys_info есть и другой способ, связанный с tempdb. эта база данных создаётся при запуске сервера, и дата её создания вполне может считаться датой запуска сервера. значение можно вытащить из sys.databases : select create_date from sys.databases where name = 'tempdb' нюанс: дату запуска сервера как точку начала сбора данных dmv-шек нужно рассматривать с осторожностью. накопленная статистика могла быть очищена вручную — например, вот так: dbcc sqlperf('sys.dm_os_wait_stats', clear)",
    "tags": [
      "mssql"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/mssql-server-waits\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Задержки сервера MS SQL\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>8 марта 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">MS SQL</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Каждый раз, когда SQL-запрос может запуститься, но ожидает другого ресурса — он записывает сведения о причине задержки. Доступ к ним можно получить через представление <a href=\"https://docs.microsoft.com/ru-ru/sql/relational-databases/system-dynamic-management-views/sys-dm-os-wait-stats-transact-sql\" target=\"_blank\">sys.dm_os_wait_stats</a>.</p>\n<p>Для анализа представления можно использовать готовые скрипты:</p>\n<ul>\n<li><a href=\"https://kostyanetsky.ru/notes/mssql-server-waits/causes_of_wait_times.txt\" target=\"_blank\">Скрипт</a> из статьи Яна Стерка «Открытие скрытых данных для оптимизации производительности приложений», опубликованной в MSDN Magazine ещё в <a href=\"https://msdn.microsoft.com/ru-ru/magazine/ee310108.aspx\" target=\"_blank\">2008-м</a> году. Выводит список типов задержки, упорядоченный по времени — от самых частотных до наиболее редких.</li>\n<li><a href=\"https://kostyanetsky.ru/notes/mssql-server-waits/sql_server_wait_statistics.txt\" target=\"_blank\">Cкрипт</a> из <a href=\"https://www.sqlskills.com/blogs/paul/wait-statistics-or-please-tell-me-where-it-hurts/\" target=\"_blank\">статьи</a> Пола Рэндала про анализ причин задержек в работе сервера MS SQL (на Хабре, кстати, есть <a href=\"https://habr.com/ru/post/216309/\" target=\"_blank\">перевод</a>). Фильтрует задержки, которые возникают на сервере всегда и которые обычно можно игнорировать. Кроме того, к каждой задержке добавляется ссылка на страницу, где эта задержка детально описана (например, вот <a href=\"https://www.sqlskills.com/help/waits/cxpacket\" target=\"_blank\">описание</a> CXPACKET).</li>\n</ul>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "задержки сервера ms sql 8 марта 2019 · ms sql каждый раз, когда sql-запрос может запуститься, но ожидает другого ресурса — он записывает сведения о причине задержки. доступ к ним можно получить через представление sys.dm_os_wait_stats . для анализа представления можно использовать готовые скрипты: скрипт из статьи яна стерка «открытие скрытых данных для оптимизации производительности приложений», опубликованной в msdn magazine ещё в 2008-м году. выводит список типов задержки, упорядоченный по времени — от самых частотных до наиболее редких. cкрипт из статьи пола рэндала про анализ причин задержек в работе сервера ms sql (на хабре, кстати, есть перевод ). фильтрует задержки, которые возникают на сервере всегда и которые обычно можно игнорировать. кроме того, к каждой задержке добавляется ссылка на страницу, где эта задержка детально описана (например, вот описание cxpacket).",
    "tags": [
      "mssql"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/cursed-forest\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                The Cursed Forest\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>6 марта 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/uoCdg6SQRoA\" width=\"560\"></iframe>\n<p>Ничего не ждал от игры, но она, внезапно, удалась. Выглядит бодро; чувствуется внимание к деталям, да и в сумме — совсем неплохо. А ближе к концу — ещё и трогательно.</p>\n<p>Садитесь играть по всем правилам — гасите свет, надевайте наушники и, конечно, выключайте душнилу.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "the cursed forest 6 марта 2019 · видеоигры ничего не ждал от игры, но она, внезапно, удалась. выглядит бодро; чувствуется внимание к деталям, да и в сумме — совсем неплохо. а ближе к концу — ещё и трогательно. садитесь играть по всем правилам — гасите свет, надевайте наушники и, конечно, выключайте душнилу.",
    "tags": [
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/duplicate-key\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Повторяющийся ключ\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>1 марта 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>На Инфостарте вышла любопытная <a href=\"https://infostart.ru/public/1010017/\" target=\"_blank\">статья</a> про ошибку СУБД «cannot insert duplicate key». Одна из возможных причин сбоя — использование уникального идентификатора объекта для сопоставления при обмене с другими информационными базами (то есть, без служебного регистра, сопоставляющего объекты базы данных с идентификаторами объектов внешней базы).</p>\n<p>Такой жести, чтобы уникальные идентификаторы совпали в разных базах для одной и той же таблицы, у меня в практике пока не было. Однако от подхода «единого идентификатора» я отрекся окончательно после того, как делал обмен между <a href=\"https://firstbit.ae/products/erp-dubai/financial_management/\" target=\"_blank\">FirstBIT ERP</a> и <a href=\"http://superagent.ru/products/grotem_agent\" target=\"_blank\">GROTEM / Agent</a>.</p>\n<p>Архитектура пилотного решения была такая: данные из FirstBIT ERP выгружались сперва в служебную ИБ 1С, написанную разработчиками GROTEM'а, а уже оттуда — в основную базу данных сервера мобильных приложений.</p>\n<p>Сопоставление было сделано очень просто — через идентификаторы объектов. Например, один и тот же документ в обеих базах имел один и тот же идентфикатор. Но были и более сложные схемы: например, контрагент FirstBIT ERP на стороне GROTEM'а превращался в три объекта: собственно контрагента, торговую точку и документ взаиморасчетов.</p>\n<p><img alt=\"WAIT WHAT\" src=\"https://media.giphy.com/media/zkSFsZpQMZuG4/giphy.gif\"/></p>\n<p>Да, в документ взаиморасчетов. И все три объекта имели один и тот же идентфикатор — идентификатор контрагента FirstBIT ERP. В общем, не то чтобы это было очень изящным решением, но для платформы такой расклад вполне адекватен и мы решили, что проблем быть не должно.</p>\n<p>Однако обмен работать отказался.</p>\n<p>Беглый анализ показал, что данные успешно выгружаются в промежуточную базу данных и проходят все возможные проверки на целостность и полноту, а не работает только финальный шаг — выгрузка в базу данных сервера мобильных приложений.</p>\n<p>В итоге выяснилось, что:</p>\n<ol>\n<li>В этой самой базе есть таблица, где хранятся все интересующие нас объекты. Документы, элементы справочников, вот это всё.</li>\n<li>Эта таблица имеет уникальный индекс по GUID объекта.</li>\n</ol>\n<p>В этом месте интрига закончилась. Ну да, первый же выгруженный контрагент создавал целых три сущности с одним и тем же GUID, которые прекрасно лежали в своих таблицах на стороне 1С, но не могли быть записаны в одну общую таблицу базы данных приложения.</p>\n<p><img alt=\"I will not use GUIDs to map objects!\" src=\"https://kostyanetsky.ru/notes/duplicate-key/i-will-not-use-guids.gif\"/></p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "повторяющийся ключ 1 марта 2019 · 1с готово работа на инфостарте вышла любопытная статья про ошибку субд «cannot insert duplicate key». одна из возможных причин сбоя — использование уникального идентификатора объекта для сопоставления при обмене с другими информационными базами (то есть, без служебного регистра, сопоставляющего объекты базы данных с идентификаторами объектов внешней базы). такой жести, чтобы уникальные идентификаторы совпали в разных базах для одной и той же таблицы, у меня в практике пока не было. однако от подхода «единого идентификатора» я отрекся окончательно после того, как делал обмен между firstbit erp и grotem / agent . архитектура пилотного решения была такая: данные из firstbit erp выгружались сперва в служебную иб 1с, написанную разработчиками grotem'а, а уже оттуда — в основную базу данных сервера мобильных приложений. сопоставление было сделано очень просто — через идентификаторы объектов. например, один и тот же документ в обеих базах имел один и тот же идентфикатор. но были и более сложные схемы: например, контрагент firstbit erp на стороне grotem'а превращался в три объекта: собственно контрагента, торговую точку и документ взаиморасчетов. да, в документ взаиморасчетов. и все три объекта имели один и тот же идентфикатор — идентификатор контрагента firstbit erp. в общем, не то чтобы это было очень изящным решением, но для платформы такой расклад вполне адекватен и мы решили, что проблем быть не должно. однако обмен работать отказался. беглый анализ показал, что данные успешно выгружаются в промежуточную базу данных и проходят все возможные проверки на целостность и полноту, а не работает только финальный шаг — выгрузка в базу данных сервера мобильных приложений. в итоге выяснилось, что: в этой самой базе есть таблица, где хранятся все интересующие нас объекты. документы, элементы справочников, вот это всё. эта таблица имеет уникальный индекс по guid объекта. в этом месте интрига закончилась. ну да, первый же выгруженный контрагент создавал целых три сущности с одним и тем же guid, которые прекрасно лежали в своих таблицах на стороне 1с, но не могли быть записаны в одну общую таблицу базы данных приложения.",
    "tags": [
      "1c",
      "done",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/loneliness\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Одиночество\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>1 марта 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Хороший ролик про одиночество, его причины и последствия (спойлер: все серьёзно, вплоть до биологического уровня). Рассказывают на английском, но если нужно — там есть русские субтитры.</p>\n<iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/n3Xv_g3g-mA\" width=\"560\"></iframe>\n<p>(емкий <a href=\"https://twitter.com/StatusyOk/status/1098845710668185602\" target=\"_blank\">твит</a> о том же)</p>\n<p>(а также я, походу, достаточно много наиграл в Starcraft II, чтобы название ролика у меня в голове произносилось исключительно голосом Зератула и под музыку из <a href=\"https://www.youtube.com/watch?v=xu94hnQDnRY\" target=\"_blank\">Alone</a>)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "одиночество 1 марта 2019 · тем временем видеоигры хороший ролик про одиночество, его причины и последствия (спойлер: все серьёзно, вплоть до биологического уровня). рассказывают на английском, но если нужно — там есть русские субтитры. (емкий твит о том же) (а также я, походу, достаточно много наиграл в starcraft ii, чтобы название ролика у меня в голове произносилось исключительно голосом зератула и под музыку из alone )",
    "tags": [
      "meanwhile",
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/failed-hunt\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Неудачная охота\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>21 февраля 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>При обновлении платформы до 8.13.12.1790 наткнулись на плавающий баг при переключении текущей страницы элемента на сервере. Конкретно на сервере оно срабатывает, но как только управление возвращается на клиент — текущей страницей становится та, что была до изменения. При этом ещё и происходит событие изменения текущей страницы (как будто пользователь сменил её вручную).</p>\n<p>Неприятно, но, в общем, ничего страшного — запатчили баг, описали и зарепортили в 1С. Там пока <a href=\"https://bugboard.v8.1c.ru/error/000050675.html\" target=\"_blank\">думают</a>. Но я, внезапно, даже как-то расстроен — когда расследуешь такие штуки, они всегда выглядят немного загадочно и кажется, что ты вот-вот найдешь что-то интересное! Например, новый аспект работы платформы или что-то вроде этого.</p>\n<p>И вот, наконец, ты смотришь на проблему под правильным углом, а она — обычный жук. Возможно, полосатый или в крапинку, но жук как жук — сидит себе, шевелит усами. И ты такой: блин, это что — и есть моя добыча? :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "неудачная охота 21 февраля 2019 · 1с готово работа при обновлении платформы до 8.13.12.1790 наткнулись на плавающий баг при переключении текущей страницы элемента на сервере. конкретно на сервере оно срабатывает, но как только управление возвращается на клиент — текущей страницей становится та, что была до изменения. при этом ещё и происходит событие изменения текущей страницы (как будто пользователь сменил её вручную). неприятно, но, в общем, ничего страшного — запатчили баг, описали и зарепортили в 1с. там пока думают . но я, внезапно, даже как-то расстроен — когда расследуешь такие штуки, они всегда выглядят немного загадочно и кажется, что ты вот-вот найдешь что-то интересное! например, новый аспект работы платформы или что-то вроде этого. и вот, наконец, ты смотришь на проблему под правильным углом, а она — обычный жук. возможно, полосатый или в крапинку, но жук как жук — сидит себе, шевелит усами. и ты такой: блин, это что — и есть моя добыча? :-)",
    "tags": [
      "1c",
      "done",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/big-value-tables\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Большие таблицы значений\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>17 февраля 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Пока писал про <a href=\"https://kostyanetsky.ru/notes/find-rows-at-client\" target=\"_blank\">поиск строк</a> на клиенте, вспомнил ещё один нюанс, связанный с данными на управляемых формах — тоже про передачу между клиентом и сервером.</p>\n<p>Допустим, нам по условиям задачи нужно оперировать сравнительно большими (тысячи строк) таблицами значений. Это могут быть данные, которые в общем случае не нужно показывать пользователю: например, параметры расчета цен, информация о продажах и закупках, что-то ещё. Логично создать такие таблицы в виде атрибутов формы — хотя бы потому, что можно использовать удобный конструктор.</p>\n<p>Но когда платформа решит передать такую таблицу на сервер, начнутся проблемы. Дело в том, что передавать она будет не простой и компактный объект ТаблицаЗначений, а весьма насыщенный ДанныеФормыКоллекция. Разница колоссальна — на одном из наших проектов траты на такой обмен данными составляли порядка 40% от всего времени работы ключевой операции.</p>\n<p>Решение достаточно очевидно — не использовать атрибуты формы вообще. Вместо этого создавать таблицы значений с помощью кода (например, в обработчике ПриСозданииНаСервере), закидывать их во временное хранилище, а в атрибутах формы хранить только адреса хранилища. Таким образом при необходимости поработать с таблицей на сервер отправляется только строка с адресом, и расходы на сериализацию и обмен данными начинают стремиться к нулю. На сервере извлекаем таблицу, читаем данные, изменяем их, если нужно, и сохраняем обратно во временное хранилище — по тому же адресу.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "большие таблицы значений 17 февраля 2019 · 1с пока писал про поиск строк на клиенте, вспомнил ещё один нюанс, связанный с данными на управляемых формах — тоже про передачу между клиентом и сервером. допустим, нам по условиям задачи нужно оперировать сравнительно большими (тысячи строк) таблицами значений. это могут быть данные, которые в общем случае не нужно показывать пользователю: например, параметры расчета цен, информация о продажах и закупках, что-то ещё. логично создать такие таблицы в виде атрибутов формы — хотя бы потому, что можно использовать удобный конструктор. но когда платформа решит передать такую таблицу на сервер, начнутся проблемы. дело в том, что передавать она будет не простой и компактный объект таблицазначений, а весьма насыщенный данныеформыколлекция. разница колоссальна — на одном из наших проектов траты на такой обмен данными составляли порядка 40% от всего времени работы ключевой операции. решение достаточно очевидно — не использовать атрибуты формы вообще. вместо этого создавать таблицы значений с помощью кода (например, в обработчике присозданиинасервере), закидывать их во временное хранилище, а в атрибутах формы хранить только адреса хранилища. таким образом при необходимости поработать с таблицей на сервер отправляется только строка с адресом, и расходы на сериализацию и обмен данными начинают стремиться к нулю. на сервере извлекаем таблицу, читаем данные, изменяем их, если нужно, и сохраняем обратно во временное хранилище — по тому же адресу.",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/evolution\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Эволюция\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>16 февраля 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">English</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Javascript</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Говоря о развитии чего-либо (продукта, языка общения, языка программирования и так далее), люди иногда называют это «эволюцией». Мол, процессы похожи — неудачные решения точно так же постепенно вымываются, а удачные — остаются и усиляют сущность, к которой принадлежат. Так-то оно так, но я сейчас вспомнил не про позитивную сторону — фигня в том, что в ходе эволюции потомки, кроме полезных ништяков, получают все хреново выстроенные и зачастую бессмысленные механизмы, которые не смогли прикончить предка.</p>\n<p>В итоге мы задерживаем дыхание, когда глотаем, путаемся между dissatisfied и unsatisfactory, а ещё программируем на чудесном языке JavaScript — который, при всём своем удобстве и распостраненности, вобрал в себя все мыслимые и немыслимые недостатки скриптовых языков.</p>\n<p>Но это нам ещё везёт — есть, например, жирафы! У этих ребят гортанный нерв сначала спускается по шее на два метра вниз, а потом — поднимается обратно к мышцам гортани (ага, вместо того, чтобы пройти несколько сантиметров от мозга напрямую).</p>\n<p>Зная всё это, мне чуть-чуть проще смотреть на то, во что иногда превращается мой код на очередном цикле разработки. Ну и что, что у этого хомячка отрос драконий хвост? Эволюционно, например, такой хвост очень полезен. Кто я такой, чтобы спорить с Дарвином?</p>\n<p><a href=\"https://twitter.com/bluecoders/status/966624401172123649\" target=\"_blank\"><img alt=\"Твит\" src=\"https://kostyanetsky.ru/notes/evolution/snap-tweet-bluecoders-966624401172123649.png\"/></a></p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "эволюция 16 февраля 2019 · english работа javascript говоря о развитии чего-либо (продукта, языка общения, языка программирования и так далее), люди иногда называют это «эволюцией». мол, процессы похожи — неудачные решения точно так же постепенно вымываются, а удачные — остаются и усиляют сущность, к которой принадлежат. так-то оно так, но я сейчас вспомнил не про позитивную сторону — фигня в том, что в ходе эволюции потомки, кроме полезных ништяков, получают все хреново выстроенные и зачастую бессмысленные механизмы, которые не смогли прикончить предка. в итоге мы задерживаем дыхание, когда глотаем, путаемся между dissatisfied и unsatisfactory, а ещё программируем на чудесном языке javascript — который, при всём своем удобстве и распостраненности, вобрал в себя все мыслимые и немыслимые недостатки скриптовых языков. но это нам ещё везёт — есть, например, жирафы! у этих ребят гортанный нерв сначала спускается по шее на два метра вниз, а потом — поднимается обратно к мышцам гортани (ага, вместо того, чтобы пройти несколько сантиметров от мозга напрямую). зная всё это, мне чуть-чуть проще смотреть на то, во что иногда превращается мой код на очередном цикле разработки. ну и что, что у этого хомячка отрос драконий хвост? эволюционно, например, такой хвост очень полезен. кто я такой, чтобы спорить с дарвином?",
    "tags": [
      "english",
      "work",
      "javascript"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/find-rows-at-client\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Найти строки на клиенте\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>12 февраля 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Про то, что метод НайтиСтроки() для коллекций данных формы горазд под шумок наделать серверных вызовов, я узнал довольно давно, столкнувшись с неадекватно долгой прогрузкой формы (там он вызывался прямо в обработчике открытия, да ещё и в цикле). Так делать, конечно, не нужно, на что мягко намекает справка: calling the method executes a server call.</p>\n<p>Однако сегодня писал код для задачи с похожей механикой и заметил, что серверных вызовов по факту нет. Удивился, полез на ИТС и, в общем, дело в следующем: при вызове НайтиСтроки() на клиенте поиск на нём и происходит, однако платформа не держит все данные больших коллекций на клиенте. Они передаются с сервера, и запрос этих данных с клиента — тот самый серверный вызов, на который ссылается справка.</p>\n<p>Разработчики платформы расплывчато описывают объем коллекции, до которого клиенту не нужно обращаться к серверу (на ИТС <a href=\"https://its.1c.ru/db/v8std/content/628/hdoc/_top/\" target=\"_blank\">пишут</a>, что это порядка двадцати строк). Так что подход не меняется: делаем явный серверный вызов и не переживаем, что платформа налепит своих. Впрочем, всегда приятно лучше понимать, что внутри барабанчика :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "найти строки на клиенте 12 февраля 2019 · 1с про то, что метод найтистроки() для коллекций данных формы горазд под шумок наделать серверных вызовов, я узнал довольно давно, столкнувшись с неадекватно долгой прогрузкой формы (там он вызывался прямо в обработчике открытия, да ещё и в цикле). так делать, конечно, не нужно, на что мягко намекает справка: calling the method executes a server call. однако сегодня писал код для задачи с похожей механикой и заметил, что серверных вызовов по факту нет. удивился, полез на итс и, в общем, дело в следующем: при вызове найтистроки() на клиенте поиск на нём и происходит, однако платформа не держит все данные больших коллекций на клиенте. они передаются с сервера, и запрос этих данных с клиента — тот самый серверный вызов, на который ссылается справка. разработчики платформы расплывчато описывают объем коллекции, до которого клиенту не нужно обращаться к серверу (на итс пишут , что это порядка двадцати строк). так что подход не меняется: делаем явный серверный вызов и не переживаем, что платформа налепит своих. впрочем, всегда приятно лучше понимать, что внутри барабанчика :-)",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/i-wish-i-could\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Ай ду май бэст\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>12 февраля 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">English</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Что здорово облегчает работу над английским языком — так это практика, которая буквально сама лезет в руки. Причем порой она полезнее каких-нибудь примеров с условного Cambridge Dictionary — просто потому, что лучше запоминается.</p>\n<p>Например, вчера проходили на занятиях гипотетические формулировки и запоминали, как правильно понимать wish и if only; сегодня первое, что попалось в ленте — вот этот твит. Куда уж доходчивее :-)</p>\n<p><a href=\"https://twitter.com/roxiqt/status/1046952683477729282\" target=\"_blank\"><img alt=\"Твит\" src=\"https://kostyanetsky.ru/notes/i-wish-i-could/snap-tweet-roxiqt-1046952683477729282.png\"/></a></p>\n<p>Или, скажем, недавно освежали в памяти разницу между try и trying — а я её запомнил давным-давно по вымученному «I do my best» Фелисити из Borderlands: The Pre-Sequel. Ситуация там была довольно яркая, и этот оттенок невозможности выполнить задачу здорово въелся в память.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "ай ду май бэст 12 февраля 2019 · english видеоигры что здорово облегчает работу над английским языком — так это практика, которая буквально сама лезет в руки. причем порой она полезнее каких-нибудь примеров с условного cambridge dictionary — просто потому, что лучше запоминается. например, вчера проходили на занятиях гипотетические формулировки и запоминали, как правильно понимать wish и if only; сегодня первое, что попалось в ленте — вот этот твит. куда уж доходчивее :-) или, скажем, недавно освежали в памяти разницу между try и trying — а я её запомнил давным-давно по вымученному «i do my best» фелисити из borderlands: the pre-sequel. ситуация там была довольно яркая, и этот оттенок невозможности выполнить задачу здорово въелся в память.",
    "tags": [
      "english",
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/what-are-our-girls-made-of\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Из чего сделаны наши девчонки?\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>9 февраля 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Семья</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>На фоне скандальной рекламы «Reebok» (я в этой теме полный мимокрокодил, но взрывная волна даже до меня докатилась) на ютубе попался классный ролик их конкурентов. Ему уже пара лет, но он ровно про то же и, блин! Реклама здорового человека — не знаю, как лучше выразиться.</p>\n<iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/xifSHMbGSKI\" width=\"560\"></iframe>\n<p>Показал мелкой — смотрела глазами по пять копеек. Покажу ещё раз, когда опять будет батониться вместо тренировки :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "из чего сделаны наши девчонки? 9 февраля 2019 · семья тем временем на фоне скандальной рекламы «reebok» (я в этой теме полный мимокрокодил, но взрывная волна даже до меня докатилась) на ютубе попался классный ролик их конкурентов. ему уже пара лет, но он ровно про то же и, блин! реклама здорового человека — не знаю, как лучше выразиться. показал мелкой — смотрела глазами по пять копеек. покажу ещё раз, когда опять будет батониться вместо тренировки :-)",
    "tags": [
      "family",
      "meanwhile"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/drummer\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Внезапный барабанщик\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>9 февраля 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Я пишу на платформе 1С довольно давно и повидал некоторое дерьмо, но такое, честно говоря, вижу первый раз.</p>\n<p><a href=\"https://kostyanetsky.ru/notes/drummer/bug.png\" target=\"_blank\"><img alt=\"Оттакота!\" src=\"https://kostyanetsky.ru/notes/drummer/bug-thumbnail.png\"/></a></p>\n<p>Поначалу я даже не понял, с какого конца это жевать. Поискал перевод иероглифа — Википедия лишь сухо сообщила, что это такой <a href=\"https://en.wiktionary.org/wiki/%E4%80%80\" target=\"_blank\">тип чашки</a>, а Google Translate вообще <a href=\"https://translate.google.com/#view=home&amp;op=translate&amp;sl=auto&amp;tl=ru&amp;text=%E4%80%80\" target=\"_blank\">развёл руками</a>.</p>\n<p>Коллега заметил, что символ отдаленно похож на складского сортировщика — мол, перекладывает что-то там себе между коробками. Не знаю, не знаю. По-моему, больше напоминает барабанщика за работой. Но что, черт побери, это значит? Может быть, 1С пытается что-то мне сказать? Что-то про музыку?</p>\n<p>Может, мне нужно было стать басистом, а не вот это всё.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "внезапный барабанщик 9 февраля 2019 · 1с я пишу на платформе 1с довольно давно и повидал некоторое дерьмо, но такое, честно говоря, вижу первый раз. поначалу я даже не понял, с какого конца это жевать. поискал перевод иероглифа — википедия лишь сухо сообщила, что это такой тип чашки , а google translate вообще развёл руками . коллега заметил, что символ отдаленно похож на складского сортировщика — мол, перекладывает что-то там себе между коробками. не знаю, не знаю. по-моему, больше напоминает барабанщика за работой. но что, черт побери, это значит? может быть, 1с пытается что-то мне сказать? что-то про музыку? может, мне нужно было стать басистом, а не вот это всё.",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/temporary-tables-deletion\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Удаление временных таблиц\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>7 февраля 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Любопытная деталь: при закрытии менеджера временных таблиц не происходит удаления этих таблиц из tempdb. Актуально и для прямого вызова метода Закрыть() объекта менеджера, и для неявного варианта (когда объект менеджера уничтожается при завершении метода, в котором он был создан). На деле в обеих случаях выполняется только TRUNCATE, который удаляет данные таблицы; сама же таблица остаётся на случай, если пользователь снова выполнит запрос с таким же составом полей (это выгоднее, чем заново её создавать).</p>\n<p>То же самое (удаление данных, но не самой таблицы) происходит при прямом вызове УНИЧТОЖИТЬ из текста запроса. К слову, эта команда вообще редко бывает осмыслена — разве что если объект менеджера живет сравнительно долго, а во временную таблицу помещён большой объем данных, от которого хочется побыстрее избавиться.</p>\n<p>Что до удаления таблицы, то оно выполняется только при закрытии соединения с сервером приложений.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "удаление временных таблиц 7 февраля 2019 · 1с любопытная деталь: при закрытии менеджера временных таблиц не происходит удаления этих таблиц из tempdb. актуально и для прямого вызова метода закрыть() объекта менеджера, и для неявного варианта (когда объект менеджера уничтожается при завершении метода, в котором он был создан). на деле в обеих случаях выполняется только truncate, который удаляет данные таблицы; сама же таблица остаётся на случай, если пользователь снова выполнит запрос с таким же составом полей (это выгоднее, чем заново её создавать). то же самое (удаление данных, но не самой таблицы) происходит при прямом вызове уничтожить из текста запроса. к слову, эта команда вообще редко бывает осмыслена — разве что если объект менеджера живет сравнительно долго, а во временную таблицу помещён большой объем данных, от которого хочется побыстрее избавиться. что до удаления таблицы, то оно выполняется только при закрытии соединения с сервером приложений.",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/string-concatenation\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Конкатенация строк\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>27 января 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Как и многие другие компании, мы даем соискателям тестовое задание. Оно намеренно несложное и нужно больше для того, чтобы посмотреть — насколько кандидат понимает платформу? Как аккуратно работает с объектами конфигурации и её кодом?</p>\n<p>Одна из множества мелких штук, которые там проверяются — это формирование длинного сообщения для пользователя, включающее множество параметров. Разработчик может делать это через СтрШаблон() или СтрСоединить(), а может — через простую конкатенацию (соединение) строк. Если кандидат использует последний вариант — это считается небольшим минусом: для пользователя результат будет тот же, но вот понять из кода, как он будет примерно выглядеть — заметно сложнее.</p>\n<p>Однако тут есть другой аспект. В первой половине прошлого года «Рарус» опубликовал <a href=\"http://techlab.rarus.ru/upload/iblock/2/185/Beeline-obespechenie-bespereboynoy-raboti.pdf\" target=\"_blank\">отчет</a> о работах, проделанных для «Билайна». Там много любопытного, но среди прочего есть совершенно оглушительный пункт: за счет отказа от соединения строк разработчики добились 40% снижения нагрузки на процессоры! От двух дополнительных серверов после этих изменений вообще отказались, так как они стали не нужны.</p>\n<p>Проблема возникала из-за того, чтобы рабочие процессы тратили слишком много времени на распределение памяти для склейки строк. В случае однократного соединения заметной нагрузки не возникает, однако когда мы, например, собираем большой запрос в цикле и делаем это многократно — нагрузка растет лавинообразно. Конкатенацию в таких случаях использовать нельзя, правильный вариант — все те же СтрШаблон() или СтрСоединить(). На старых версиях платформы, где этих методов нет, можно применять объект текстового документа — добавлять в него строки, а потом получать текст.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "конкатенация строк 27 января 2019 · 1с работа как и многие другие компании, мы даем соискателям тестовое задание. оно намеренно несложное и нужно больше для того, чтобы посмотреть — насколько кандидат понимает платформу? как аккуратно работает с объектами конфигурации и её кодом? одна из множества мелких штук, которые там проверяются — это формирование длинного сообщения для пользователя, включающее множество параметров. разработчик может делать это через стршаблон() или стрсоединить(), а может — через простую конкатенацию (соединение) строк. если кандидат использует последний вариант — это считается небольшим минусом: для пользователя результат будет тот же, но вот понять из кода, как он будет примерно выглядеть — заметно сложнее. однако тут есть другой аспект. в первой половине прошлого года «рарус» опубликовал отчет о работах, проделанных для «билайна». там много любопытного, но среди прочего есть совершенно оглушительный пункт: за счет отказа от соединения строк разработчики добились 40% снижения нагрузки на процессоры! от двух дополнительных серверов после этих изменений вообще отказались, так как они стали не нужны. проблема возникала из-за того, чтобы рабочие процессы тратили слишком много времени на распределение памяти для склейки строк. в случае однократного соединения заметной нагрузки не возникает, однако когда мы, например, собираем большой запрос в цикле и делаем это многократно — нагрузка растет лавинообразно. конкатенацию в таких случаях использовать нельзя, правильный вариант — все те же стршаблон() или стрсоединить(). на старых версиях платформы, где этих методов нет, можно применять объект текстового документа — добавлять в него строки, а потом получать текст.",
    "tags": [
      "1c",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/incompiled-code\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Не скомпилированный код\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>27 января 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Не очевидная штука: абстрактная внешняя обработка работает заметно медленнее точно такой же, но встроенной в конфигурацию или её расширение. Причина — её код нужно заново компилировать для каждого пользователя при каждом запуске (тогда как код встроенных обработок компилируется один раз и для всех). Судя по <a href=\"https://kb.1c.ru/articleView.jsp?id=111\" target=\"_blank\">статье</a> в базе знаний 1С, для платформы 8.3.10 это было прямо катастрофа, но и пятидесятипроцентный рост нагрузки на процессор в 8.3.13 — тоже, в общем, ничего хорошего.</p>\n<p>Другой подход с тем же эффектом — это хранение кода внутри базы (в реквизитах служебных справочников, например). Каждый раз, когда такой код нужно запустить, он извлекается из БД и компилируется. Например, у нас в <a href=\"https://firstbit.ae/products/erp-dubai/financial_management/\" target=\"_blank\">конфигурации</a> можно создавать регламентные задания без изменения метаданных — просто добавляем элемент специального справочника, загружаем в него код и настраиваем расписание работы.</p>\n<p>Это относительно нормально — регламентные задания обычно выполняются не слишком часто и компиляция, скорее всего, не создаст сколько-либо заметной нагрузки на процессор. Однако этот же справочник может использоваться и для автоматического вызова какого-либо кода после произвольного события: например, после сохранения документа определенного типа. В таких случаях, если есть понимание, что код будет выполняться постоянно и множеством пользователей — стоит перенести логику в метод общего модуля из расширения, а в самом хранимом коде оставить только вызов этой логики.</p>\n<p>А ещё можно вообще отказаться от хранения кода и сделать весь механизм в виде расширения. Возможно, решение будет менее гибким, но все же это лучше, чем потом медитировать над низким APDEX'ом.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "не скомпилированный код 27 января 2019 · 1с не очевидная штука: абстрактная внешняя обработка работает заметно медленнее точно такой же, но встроенной в конфигурацию или её расширение. причина — её код нужно заново компилировать для каждого пользователя при каждом запуске (тогда как код встроенных обработок компилируется один раз и для всех). судя по статье в базе знаний 1с, для платформы 8.3.10 это было прямо катастрофа, но и пятидесятипроцентный рост нагрузки на процессор в 8.3.13 — тоже, в общем, ничего хорошего. другой подход с тем же эффектом — это хранение кода внутри базы (в реквизитах служебных справочников, например). каждый раз, когда такой код нужно запустить, он извлекается из бд и компилируется. например, у нас в конфигурации можно создавать регламентные задания без изменения метаданных — просто добавляем элемент специального справочника, загружаем в него код и настраиваем расписание работы. это относительно нормально — регламентные задания обычно выполняются не слишком часто и компиляция, скорее всего, не создаст сколько-либо заметной нагрузки на процессор. однако этот же справочник может использоваться и для автоматического вызова какого-либо кода после произвольного события: например, после сохранения документа определенного типа. в таких случаях, если есть понимание, что код будет выполняться постоянно и множеством пользователей — стоит перенести логику в метод общего модуля из расширения, а в самом хранимом коде оставить только вызов этой логики. а ещё можно вообще отказаться от хранения кода и сделать весь механизм в виде расширения. возможно, решение будет менее гибким, но все же это лучше, чем потом медитировать над низким apdex'ом.",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/trip-to-kok-kol\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Поездка на Кок-Коль\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>6 января 2019</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Спорт</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Летом катался с друзьями на границу с Монголией (на машинах доехали до Ташанты, а оттуда — на велосипедах до <a href=\"http://rasulka.ru/ооо-расул---кок-коль.html\" target=\"_blank\">Кок-Коля</a>). Вымотались как проклятые, однако это того определенно стоило — виды с гор невероятно крутые! Одно жаль, животные попадались нечасто — даже чумных сусликов не встретили, хотя их нам каждый встречный анонсировал, включая погранцев :-)</p>\n<iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/4HbJAdYQ-xM\" width=\"560\"></iframe>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "поездка на кок-коль 6 января 2019 · спорт летом катался с друзьями на границу с монголией (на машинах доехали до ташанты, а оттуда — на велосипедах до кок-коля ). вымотались как проклятые, однако это того определенно стоило — виды с гор невероятно крутые! одно жаль, животные попадались нечасто — даже чумных сусликов не встретили, хотя их нам каждый встречный анонсировал, включая погранцев :-)",
    "tags": [
      "sport"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/ampersand-sign-in-1c\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Знак амперсанда в 1С\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>27 декабря 2018</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>При обработке символа амперсанда в тексте надписей платформа применяет стандартный подход Windows: то есть, сам амперсанд не отобразится, а следующий после него символ станет горячей клавишей для действия, закрепленного за надписью (например, обработчика команды или события элемента).</p>\n<p>Пример ниже выведется как «Project Costing». Символ «P» в ней будет подчеркнут и станет горячей клавишей; если это, например, заголовок команды, то её можно будет вызвать, нажав Alt + P.</p>\n<pre><code>ТекстНадписи = \"&amp;Project Costing\";\n</code></pre>\n<p>Единственное неудобство — если нужно вывести амперсанд прямо в надпись. В этом случае символ следует удвоить: так, пример ниже будет выглядеть как «Project P&amp;L». Никаких горячих клавиш в таком случае создано не будет.</p>\n<pre><code>ТекстНадписи = \"Project P&amp;&amp;L\";\n</code></pre>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "знак амперсанда в 1с 27 декабря 2018 · 1с при обработке символа амперсанда в тексте надписей платформа применяет стандартный подход windows: то есть, сам амперсанд не отобразится, а следующий после него символ станет горячей клавишей для действия, закрепленного за надписью (например, обработчика команды или события элемента). пример ниже выведется как «project costing». символ «p» в ней будет подчеркнут и станет горячей клавишей; если это, например, заголовок команды, то её можно будет вызвать, нажав alt + p. текстнадписи = \"&project costing\"; единственное неудобство — если нужно вывести амперсанд прямо в надпись. в этом случае символ следует удвоить: так, пример ниже будет выглядеть как «project p&l». никаких горячих клавиш в таком случае создано не будет. текстнадписи = \"project p&&l\";",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/valve-in-a-china-shop\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Как Valve в посудной лавке\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>10 декабря 2018</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Ребята из Valve продолжают заигрывать с поклонниками своих игр — то ли по привычке, то ли там и правда кто-то считает, что это отличный способ напоминать о себе.</p>\n<p>Конечно, с этой компанией как разработчиком игр всё в целом понятно. Мало кто всерьёз ждет третий Half-Life или, скажем, продолжение Portal. Но меня каждый раз умиляет это непринужденное изящество слона в посудной лавке, с которым Valve работает со своей аудиторией.</p>\n<p><a href=\"https://twitter.com/retropcan/status/1072013105515913216\" target=\"_blank\"><img alt=\"Твит\" src=\"https://kostyanetsky.ru/notes/valve-in-a-china-shop/snap-tweet-retropcan-1072013105515913216.png\"/></a></p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "как valve в посудной лавке 10 декабря 2018 · видеоигры ребята из valve продолжают заигрывать с поклонниками своих игр — то ли по привычке, то ли там и правда кто-то считает, что это отличный способ напоминать о себе. конечно, с этой компанией как разработчиком игр всё в целом понятно. мало кто всерьёз ждет третий half-life или, скажем, продолжение portal. но меня каждый раз умиляет это непринужденное изящество слона в посудной лавке, с которым valve работает со своей аудиторией.",
    "tags": [
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/snowboard-effect\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Эффект сноуборда\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>1 декабря 2018</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Спорт</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p><a href=\"https://kostyanetsky.ru/notes/snowboard-effect/standing.jpg\" target=\"_blank\"><img alt=\"Стою!\" src=\"https://kostyanetsky.ru/notes/snowboard-effect/standing-thumbnail.jpg\"/></a> <a href=\"https://kostyanetsky.ru/notes/snowboard-effect/sitting.jpg\" target=\"_blank\"><img alt=\"Сижу!\" src=\"https://kostyanetsky.ru/notes/snowboard-effect/sitting-thumbnail.jpg\"/></a></p>\n<p>Летишь такой вниз по склону, в который раз пытаясь почувствовать точку равновесия и не полететь кубарем, но чувствуешь только отбитую задницу, а из головы не идет знаменитый спич Васа из третьего Far Cry.</p>\n<blockquote>\n<p>Я уже говорил тебе, что такое безумие, а? Безумие — это точное повторение одного и того же действия. Раз за разом, в надежде на изменение. Это есть безумие.</p>\n<p><em>― Ваас Монтенегро, Far Cry 3</em></p>\n</blockquote>\n<p>Но вниз все равно приезжаешь невероятно довольный.</p>\n<p>Магия какая-то.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "эффект сноуборда 1 декабря 2018 · спорт летишь такой вниз по склону, в который раз пытаясь почувствовать точку равновесия и не полететь кубарем, но чувствуешь только отбитую задницу, а из головы не идет знаменитый спич васа из третьего far cry. я уже говорил тебе, что такое безумие, а? безумие — это точное повторение одного и того же действия. раз за разом, в надежде на изменение. это есть безумие. ― ваас монтенегро, far cry 3 но вниз все равно приезжаешь невероятно довольный. магия какая-то.",
    "tags": [
      "sport"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/set-new-object-ref\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Ссылка нового объекта\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>29 ноября 2018</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Уникальный идентификатор — удобный критерий при сопоставлении объектов в разных конфигурациях. Например, когда нужно передавать инвойсы из одной базы в другую. Как второй базе понять, загружался полученный инвойс или нет? Первое, что приходит в голову — просто выполнить поиск объекта по его UUID:</p>\n<pre><code>ИнвойсЗагружен = Документы.Инвойс.ПолучитьСсылку(UUID).Пустая();\n</code></pre>\n<p>Однако иногда уникальный идентификатор используют для связи объектов в одной конфигурации. Например, если условия задачи мешают добавить обычный ссылочный реквизит и мы не можем в документе А прямо сослаться на документ Б. Или, скажем, если мы создаем элемент справочника на основании документа и хотим иметь между ними прямую связь — присваивая элементу справочника ссылку, полученную по уникальному идентификатору документа. Платформа гарантирует уникальность идентификатора в пределах таблицы, так что такие трюки вполне безопасны.</p>\n<p>Я это к чему. Метод УстановитьСсылкуНового() в коде нужно использовать с осторожностью! Проверяйте, что ссылка ещё не установлена до выполнения вашего кода:</p>\n<pre><code>СсылкаЗадана = ПолучитьСсылкуНового().Пустая();\n</code></pre>\n<p>Если ссылка задана, то это надо как-то обработать — либо не заменять её вашей (если логика задачи позволяет), либо создать исключение. Иначе может возникнуть нарушение связности данных, которое будет непросто расследовать — да и вообще заметить.</p>\n<p>Ну и, конечно, эта штука работает в обе стороны — я имею в виду, что установленную вами ссылку тоже может потереть какой-нибудь посторонний код (например, обработчик события объекта или подписка на него). Это надежно решается только тестированием.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "ссылка нового объекта 29 ноября 2018 · 1с уникальный идентификатор — удобный критерий при сопоставлении объектов в разных конфигурациях. например, когда нужно передавать инвойсы из одной базы в другую. как второй базе понять, загружался полученный инвойс или нет? первое, что приходит в голову — просто выполнить поиск объекта по его uuid: инвойсзагружен = документы.инвойс.получитьссылку(uuid).пустая(); однако иногда уникальный идентификатор используют для связи объектов в одной конфигурации. например, если условия задачи мешают добавить обычный ссылочный реквизит и мы не можем в документе а прямо сослаться на документ б. или, скажем, если мы создаем элемент справочника на основании документа и хотим иметь между ними прямую связь — присваивая элементу справочника ссылку, полученную по уникальному идентификатору документа. платформа гарантирует уникальность идентификатора в пределах таблицы, так что такие трюки вполне безопасны. я это к чему. метод установитьссылкунового() в коде нужно использовать с осторожностью! проверяйте, что ссылка ещё не установлена до выполнения вашего кода: ссылказадана = получитьссылкунового().пустая(); если ссылка задана, то это надо как-то обработать — либо не заменять её вашей (если логика задачи позволяет), либо создать исключение. иначе может возникнуть нарушение связности данных, которое будет непросто расследовать — да и вообще заметить. ну и, конечно, эта штука работает в обе стороны — я имею в виду, что установленную вами ссылку тоже может потереть какой-нибудь посторонний код (например, обработчик события объекта или подписка на него). это надежно решается только тестированием.",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/distributed-design\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Распределенный дизайн\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>20 октября 2018</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Дизайнер из «Stack Overflow» <a href=\"http://www.tedgoas.com/blog/distributed-design\" target=\"_blank\">написал</a> о том, как они организуют удаленную работу. Понравилась структура текста — не просто «как мы это делаем», а прямо парами: проблема + решение. </p>\n<p>У нас в компании почти вся разработка — удаленная и сам я — тоже удаленщик. Мне очень нравится так работать; главное тут — помнить, как легко нахватать самых неожиданных проблем, когда твое рабочее место и твой дом — одно и то же место. Советы из статьи пить воду и вылезать под солнце вполне себе актуальны, например — в ходе какого-нибудь кранча про это и правда легко забыть.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "распределенный дизайн 20 октября 2018 · работа дизайнер из «stack overflow» написал о том, как они организуют удаленную работу. понравилась структура текста — не просто «как мы это делаем», а прямо парами: проблема + решение. у нас в компании почти вся разработка — удаленная и сам я — тоже удаленщик. мне очень нравится так работать; главное тут — помнить, как легко нахватать самых неожиданных проблем, когда твое рабочее место и твой дом — одно и то же место. советы из статьи пить воду и вылезать под солнце вполне себе актуальны, например — в ходе какого-нибудь кранча про это и правда легко забыть.",
    "tags": [
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/ideal-pronunciation\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Идеальное произношение\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>15 октября 2018</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">English</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p><a href=\"https://twitter.com/vanswan/status/1051001827104178177\" target=\"_blank\"><img alt=\"Твит\" src=\"https://kostyanetsky.ru/notes/ideal-pronunciation/snap-tweet-vanswan-1051001827104178177.png\"/></a></p>\n<p>Примерно то же самое я услышал несколько лет назад от инженера Bloomberg'а — мы тогда писали для заказчика программу, автоматически следящую за курсами акций, и столкнулись с кучей проблем (для работы с финансовыми инструментами Bloomberg дает мощный, но довольно сложный API).</p>\n<p>В конце концов дело дошло до диалога с техподдержкой, и после обмена несколькими сообщениями коллега предложил пообщаться голосом. Я здорово смутился и заметил, что, мол, так-то можно, но my English isn't fluent enough. На это собеседник лишь пожал плечами: мол, мы привыкли — английский используется повсеместно, и обратная сторона медали в том, что его везде крутят на свой лад. Так что правильное ударение — последнее, что его будет волновать, лишь бы была понятна мысль.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "идеальное произношение 15 октября 2018 · english примерно то же самое я услышал несколько лет назад от инженера bloomberg'а — мы тогда писали для заказчика программу, автоматически следящую за курсами акций, и столкнулись с кучей проблем (для работы с финансовыми инструментами bloomberg дает мощный, но довольно сложный api). в конце концов дело дошло до диалога с техподдержкой, и после обмена несколькими сообщениями коллега предложил пообщаться голосом. я здорово смутился и заметил, что, мол, так-то можно, но my english isn't fluent enough. на это собеседник лишь пожал плечами: мол, мы привыкли — английский используется повсеместно, и обратная сторона медали в том, что его везде крутят на свой лад. так что правильное ударение — последнее, что его будет волновать, лишь бы была понятна мысль.",
    "tags": [
      "english"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/non-judgmental-attitude\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Принцип не-осуждения\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>2 сентября 2018</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Хорошая <a href=\"http://maximilyahov.ru/blog/all/mne-ok\" target=\"_blank\">заметка</a> Максима Ильяхова про анализ чего-то такого, что вроде бы вас не касается, но почему-то невероятно раздражает. Напомнило американский принцип не-осуждения, про который я читал пару лет назад; тут немного другие формулировки, но суть — точно та же.</p>\n<p>У нас этот подход, в общем, тоже есть — даже в фольклоре осел со знаменитым «не суди и не судим будешь». Жаль, что пока не так широко применяется.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "принцип не-осуждения 2 сентября 2018 · тем временем хорошая заметка максима ильяхова про анализ чего-то такого, что вроде бы вас не касается, но почему-то невероятно раздражает. напомнило американский принцип не-осуждения, про который я читал пару лет назад; тут немного другие формулировки, но суть — точно та же. у нас этот подход, в общем, тоже есть — даже в фольклоре осел со знаменитым «не суди и не судим будешь». жаль, что пока не так широко применяется.",
    "tags": [
      "meanwhile"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/rights-for-dcs\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                СКД и право просмотра\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>28 августа 2018</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Универсальный подход системы компоновки данных «если у пользователя нет права на просмотр чего-то, то этого как бы нет» иногда заставляет платформу выкидывать знатные фортели. Нет, сферический отчет в вакууме и правда работает хорошо — например, если нет права на просмотр какого-то справочника, то в отчете он фигурировать не будет. Однако реальные примеры бывают посложнее.</p>\n<p>Например, пару недель назад я отлаживал отчет, который при попытке генерации выдавал понятную на первый взгляд ошибку:</p>\n<p><img alt=\"У вас настройка кривая, товарищ!\" src=\"https://kostyanetsky.ru/notes/rights-for-dcs/ru.png\"/></p>\n<p>Отчет гигантский — запрос на добрую тысячу строк, сложная настройка, здоровенный макет, запутанный код компоновки. Первое подозрение пало на ошибку в настройке, но расследование быстро дошло от ссылки на валюту в выборке данных до чтения константы с этой валютой на самом нижнем уровне отчета, на которую не было права просмотра.</p>\n<p>Не скажу сходу, что именно тут сбило платформу с толку и привело к не очевидной диагностике — то ли манипуляции с временной таблицей, куда эта константа была прочитана, то ли то, что читалась она в конструкции ВЫБОР, то ли то, что на сам справочник валют все необходимые права были. Искать конкретное условие или их сочетания я не стал — думаю, это просто специфика реализации движка СКД, которая может меняться от версии к версии. Достаточно не забывать о праве просмотра, и проблемы не будет.</p>\n<p>Что касается ошибки, при столкновении с ней стоит вывести проблемный отчет под полными правами. Если тут всё о'кей, нужно набросать список таблиц, откуда отчет читает данные, и проверить — все ли они с правами на чтение и просмотр.</p>\n<p>Нудно, но может сэкономить прилично времени.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "скд и право просмотра 28 августа 2018 · 1с готово универсальный подход системы компоновки данных «если у пользователя нет права на просмотр чего-то, то этого как бы нет» иногда заставляет платформу выкидывать знатные фортели. нет, сферический отчет в вакууме и правда работает хорошо — например, если нет права на просмотр какого-то справочника, то в отчете он фигурировать не будет. однако реальные примеры бывают посложнее. например, пару недель назад я отлаживал отчет, который при попытке генерации выдавал понятную на первый взгляд ошибку: отчет гигантский — запрос на добрую тысячу строк, сложная настройка, здоровенный макет, запутанный код компоновки. первое подозрение пало на ошибку в настройке, но расследование быстро дошло от ссылки на валюту в выборке данных до чтения константы с этой валютой на самом нижнем уровне отчета, на которую не было права просмотра. не скажу сходу, что именно тут сбило платформу с толку и привело к не очевидной диагностике — то ли манипуляции с временной таблицей, куда эта константа была прочитана, то ли то, что читалась она в конструкции выбор, то ли то, что на сам справочник валют все необходимые права были. искать конкретное условие или их сочетания я не стал — думаю, это просто специфика реализации движка скд, которая может меняться от версии к версии. достаточно не забывать о праве просмотра, и проблемы не будет. что касается ошибки, при столкновении с ней стоит вывести проблемный отчет под полными правами. если тут всё о'кей, нужно набросать список таблиц, откуда отчет читает данные, и проверить — все ли они с правами на чтение и просмотр. нудно, но может сэкономить прилично времени.",
    "tags": [
      "1c",
      "done"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/jaina\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Беги от дочери морей\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>29 июля 2018</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Наталья О'Шей озвучила русский ролик для грядущего обновления World of Warcraft. У неё круто получаются такие образы — умеет и настроение создать, и стали в голос припустить.</p>\n<iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/5j-S448XC8k\" width=\"560\"></iframe>\n<p>Вообще, если говорить о ней и «Мельнице» в целом — самые сильные песни у них именно те, где речь о чем-то конкретном. Были весной на концерте в честь выхода «Люциферазы» — прямо небо и земля; то ли мне не хватало знания контекста, то ли многие тексты и правда были здорово абстрактными, не знаю. Но в итоге местами было трудно понять, о чем песня, и настроение порядком сбивалось.</p>\n<p>А тут даже знать особо ничего не нужно. Я в WoW не играл и не буду, но от финальных интонаций морозом по коже все равно отдает :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "беги от дочери морей 29 июля 2018 · видеоигры наталья о'шей озвучила русский ролик для грядущего обновления world of warcraft. у неё круто получаются такие образы — умеет и настроение создать, и стали в голос припустить. вообще, если говорить о ней и «мельнице» в целом — самые сильные песни у них именно те, где речь о чем-то конкретном. были весной на концерте в честь выхода «люциферазы» — прямо небо и земля; то ли мне не хватало знания контекста, то ли многие тексты и правда были здорово абстрактными, не знаю. но в итоге местами было трудно понять, о чем песня, и настроение порядком сбивалось. а тут даже знать особо ничего не нужно. я в wow не играл и не буду, но от финальных интонаций морозом по коже все равно отдает :-)",
    "tags": [
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/hpmor-printing\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Печать ГПиМРМ\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>22 июля 2018</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Книги</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Возможно, вы уже слышали про то, что русский перевод «Методов рационального мышления» Элиезера Юдковского пошел в некоммерческую печать (спасибо «Эволюции» и другим инфопартнерам), но на всякий случай напомню ещё раз.</p>\n<p>Книжка и правда хороша, я про неё уже <a href=\"https://kostyanetsky.ru/notes/hpmor\" target=\"_blank\">писал</a> пару лет назад. Учит правильным штукам и в такой форме, что не оторваться. Текст есть в свободном доступе, но если вы вдруг хотите бумажную копию — <a href=\"https://planeta.ru/campaigns/hpmor\" target=\"_blank\">прием заявок</a> еще идет.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "печать гпимрм 22 июля 2018 · книги возможно, вы уже слышали про то, что русский перевод «методов рационального мышления» элиезера юдковского пошел в некоммерческую печать (спасибо «эволюции» и другим инфопартнерам), но на всякий случай напомню ещё раз. книжка и правда хороша, я про неё уже писал пару лет назад. учит правильным штукам и в такой форме, что не оторваться. текст есть в свободном доступе, но если вы вдруг хотите бумажную копию — прием заявок еще идет.",
    "tags": [
      "books"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/fce-results\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Результаты FCE\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>15 июля 2018</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Книги</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">English</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Кембридж прислал результаты июньских экзаменов. И — вступают трубы — FCE я сдал! Судя по баллам, ухитрился в чём-то налажать во время письменной части, зато неплохо отыгрался во время разговорной. Жаль, что экзаменаторы не дают более подробных комментариев; впрочем, и так понятно, куда дальше воевать :) Преподаватель заметила, что раньше вообще сообщали только итоговый балл — мол, понимайте как хотите, уважаемые претенденты.</p>\n<p>В общем, в следующем году перевешу планку повыше — видимо, нужно готовиться к CAE.</p>\n<p>По этому поводу вспомнился Фейнман со своей знаменитой «Вы, конечно, шутите». Среди прочего он рассказывал, как во время жизни в Бразилии учился играть на фригидейре и доучился до того, что его стали ставить в пример местным музыкантам:</p>\n<blockquote>\n<p>Я думаю, это напоминает ситуацию, когда человек, который говорит по-французски, приезжает в Америку. Сначала он делает все ошибки, которые можно сделать, и понимать его очень сложно. Но он непрерывно занимается, до тех пор пока не начинает говорить довольно хорошо, и манера речи этого человека начинает доставлять вам истинное удовольствие: у него очень милый акцент, и его приятно слушать.</p>\n<p><em>― Ричард Фейнман</em></p>\n</blockquote>\n<p>Между «все ошибки» и «приятно слушать» непринужденно опущено целое море труда, но в целом этот синопсис мне нравится. Работаем куда-то туда!</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "результаты fce 15 июля 2018 · книги готово english кембридж прислал результаты июньских экзаменов. и — вступают трубы — fce я сдал! судя по баллам, ухитрился в чём-то налажать во время письменной части, зато неплохо отыгрался во время разговорной. жаль, что экзаменаторы не дают более подробных комментариев; впрочем, и так понятно, куда дальше воевать :) преподаватель заметила, что раньше вообще сообщали только итоговый балл — мол, понимайте как хотите, уважаемые претенденты. в общем, в следующем году перевешу планку повыше — видимо, нужно готовиться к cae. по этому поводу вспомнился фейнман со своей знаменитой «вы, конечно, шутите». среди прочего он рассказывал, как во время жизни в бразилии учился играть на фригидейре и доучился до того, что его стали ставить в пример местным музыкантам: я думаю, это напоминает ситуацию, когда человек, который говорит по-французски, приезжает в америку. сначала он делает все ошибки, которые можно сделать, и понимать его очень сложно. но он непрерывно занимается, до тех пор пока не начинает говорить довольно хорошо, и манера речи этого человека начинает доставлять вам истинное удовольствие: у него очень милый акцент, и его приятно слушать. ― ричард фейнман между «все ошибки» и «приятно слушать» непринужденно опущено целое море труда, но в целом этот синопсис мне нравится. работаем куда-то туда!",
    "tags": [
      "books",
      "done",
      "english"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/kona\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Kona\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>29 мая 2018</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/M6KizfrASRY\" width=\"560\"></iframe>\n<p>У игры есть сильные стороны, которые честно старались удержать мое внимание: тут есть где погулять, что почитать, о чем подумать и на что посмотреть. Если вы цените это в играх — возможно, вам понравится. От прогулок и размышлений почти ничего не отвлекает — умереть от чего бы то ни было тут довольно сложно. Ровно как и заблудиться — у главного героя есть карта и автомобиль, а позже можно раздобыть ещё и снегоход.</p>\n<p>Но сюжет меня здорово расстроил. Интригующая детективная завязка, не успев обрасти деталями, тает в воздухе и уступает место откровенной мистике. Всё бы ничего, но вместе с этим исчезает всякая интрига — зачем искать улики, строить догадки, вообще о чём-то волноваться? Необъяснимые видения из ниоткуда расскажут и покажут всё, что и как тут было, и вот ты уже невольно заражаешься меланхоличным отношением героя к паранормальщине вокруг.</p>\n<p>При этом мистическая сторона сюжета сама по себе зияет здоровенными дырами. Да, картина трагедии ближе к концу становится более или менее понятна — но даже последнее, самое полное видение само по себе рождает целую кучу вопросов, на которые никто не трудится отвечать. Сюжет в этой игре вообще здорово напоминает её же карту — выглядит цельным, но по факту доступна от силы половина, а остальное скомкано под отчетливо читаемое «ну, потому что магия, магия такая, понимаете?».</p>\n<p>Нет, блин, не понимаю.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "kona 29 мая 2018 · видеоигры у игры есть сильные стороны, которые честно старались удержать мое внимание: тут есть где погулять, что почитать, о чем подумать и на что посмотреть. если вы цените это в играх — возможно, вам понравится. от прогулок и размышлений почти ничего не отвлекает — умереть от чего бы то ни было тут довольно сложно. ровно как и заблудиться — у главного героя есть карта и автомобиль, а позже можно раздобыть ещё и снегоход. но сюжет меня здорово расстроил. интригующая детективная завязка, не успев обрасти деталями, тает в воздухе и уступает место откровенной мистике. всё бы ничего, но вместе с этим исчезает всякая интрига — зачем искать улики, строить догадки, вообще о чём-то волноваться? необъяснимые видения из ниоткуда расскажут и покажут всё, что и как тут было, и вот ты уже невольно заражаешься меланхоличным отношением героя к паранормальщине вокруг. при этом мистическая сторона сюжета сама по себе зияет здоровенными дырами. да, картина трагедии ближе к концу становится более или менее понятна — но даже последнее, самое полное видение само по себе рождает целую кучу вопросов, на которые никто не трудится отвечать. сюжет в этой игре вообще здорово напоминает её же карту — выглядит цельным, но по факту доступна от силы половина, а остальное скомкано под отчетливо читаемое «ну, потому что магия, магия такая, понимаете?». нет, блин, не понимаю.",
    "tags": [
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/message-to-user\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Сообщение пользователю\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>30 апреля 2018</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>В 1С:Предприятии есть удобный метод вывода сообщений — объект СообщениеПользователю. Он выводит их в нижней части формы и это, внезапно, потенциальная проблема: дело в том, что большинство пользователей туда не смотрит. Мол, если никаких явных ошибок на экране нет — беспокоиться не о чем.</p>\n<p>Поэтому в случае, когда происходит сбой или просто нужно донести какую-то критично важную информацию, сообщение нужно выводить в диалоговом окне — например, через методы ПоказатьВопрос() или ПоказатьПредупреждение(). В противном случае пользователь может не обратить внимания на проблему и продолжить работу — несмотря на то, что какое-то действие не было выполнено или было выполнено не так. Впоследствии это станет явным и в проблеме (справедливо) обвинят вас.</p>\n<p>До кучи можно вспомнить небольшие служебные формы: в них СообщениеПользователю вообще противопоказано. Да, на маленьком полотне сложнее не заметить всплывший внизу текст, однако тут дело в другом — одно-два сообщения буквально <a href=\"https://kostyanetsky.ru/notes/message-to-user/ru.png\" target=\"_blank\">пожирают</a> рабочее пространство формы и работать с ней становится неудобно.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "сообщение пользователю 30 апреля 2018 · 1с в 1с:предприятии есть удобный метод вывода сообщений — объект сообщениепользователю. он выводит их в нижней части формы и это, внезапно, потенциальная проблема: дело в том, что большинство пользователей туда не смотрит. мол, если никаких явных ошибок на экране нет — беспокоиться не о чем. поэтому в случае, когда происходит сбой или просто нужно донести какую-то критично важную информацию, сообщение нужно выводить в диалоговом окне — например, через методы показатьвопрос() или показатьпредупреждение(). в противном случае пользователь может не обратить внимания на проблему и продолжить работу — несмотря на то, что какое-то действие не было выполнено или было выполнено не так. впоследствии это станет явным и в проблеме (справедливо) обвинят вас. до кучи можно вспомнить небольшие служебные формы: в них сообщениепользователю вообще противопоказано. да, на маленьком полотне сложнее не заметить всплывший внизу текст, однако тут дело в другом — одно-два сообщения буквально пожирают рабочее пространство формы и работать с ней становится неудобно.",
    "tags": [
      "1c"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/these-nasty-smartphones\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Эти мерзкие смартфоны\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>31 марта 2018</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p><img alt=\"Социум\" src=\"https://kostyanetsky.ru/notes/these-nasty-smartphones/drawing.png\"/></p>\n<p>Художник — <a href=\"https://www.patreon.com/adamtots\" target=\"_blank\">Адам Эллис</a>.</p>\n<p>По-моему, это отличная иллюстрация к вечному стону «чего они все таращатся в телефоны, бла-бла-бла». Причина проста, как три копейки — у людей в телефоне их друзья и подружки, книжки и подкасты, игры и ютуб. Всё это куда интереснее, чем, скажем, хмурый дядька или мрачная тётка с синдромом гуру.</p>\n<p>То же касается и детей. Соцсети набиты спорами по этому поводу, как бочка селедкой, однако причина проблемы остаётся точно такой же: если подросток при виде вас утыкается в телефон, ему с вами попросту не интересно и проблема, очевидно, в вас самих.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "эти мерзкие смартфоны 31 марта 2018 · тем временем художник — адам эллис . по-моему, это отличная иллюстрация к вечному стону «чего они все таращатся в телефоны, бла-бла-бла». причина проста, как три копейки — у людей в телефоне их друзья и подружки, книжки и подкасты, игры и ютуб. всё это куда интереснее, чем, скажем, хмурый дядька или мрачная тётка с синдромом гуру. то же касается и детей. соцсети набиты спорами по этому поводу, как бочка селедкой, однако причина проблемы остаётся точно такой же: если подросток при виде вас утыкается в телефон, ему с вами попросту не интересно и проблема, очевидно, в вас самих.",
    "tags": [
      "meanwhile"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/double-i\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Двойная «i»\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>9 марта 2018</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">English</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Разбирался недавно с транслитерацией собственной фамилии. Согласно правилам МИД'а, на английском она пишется как «Kostianetskii» — с двойной «i» в конце. Такое сочетание букв встречается довольно редко — «skiing» единственное частотное слово, которое приходит в голову.</p>\n<p>Мне стало любопытно, почему так, и я загуглил. Точного ответа не нашёл, но одна из возможных причин забавная: пропись! Две «i» рядом только на экране смотрятся хорошо, а когда пытаешься написать их от руки — внезапно получается «u».</p>\n<p>Подробнее и нагляднее про это — <a href=\"https://spellingisnotcrazy.weebly.com/blog/category/the-letter-i\" target=\"_blank\">здесь</a>.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "двойная «i» 9 марта 2018 · english разбирался недавно с транслитерацией собственной фамилии. согласно правилам мид'а, на английском она пишется как «kostianetskii» — с двойной «i» в конце. такое сочетание букв встречается довольно редко — «skiing» единственное частотное слово, которое приходит в голову. мне стало любопытно, почему так, и я загуглил. точного ответа не нашёл, но одна из возможных причин забавная: пропись! две «i» рядом только на экране смотрятся хорошо, а когда пытаешься написать их от руки — внезапно получается «u». подробнее и нагляднее про это — здесь .",
    "tags": [
      "english"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/different-sides-of-one-coin\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Разные стороны медали\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>5 марта 2018</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p><img alt=\"Привет!\" src=\"https://kostyanetsky.ru/notes/different-sides-of-one-coin/ru.png\"/></p>\n<p>Фидбек — одна из самых клевых штук в моей профессии. Да, не первый год программирую, да, кучу всего написал, переписал и переделал, и всё равно каждый сложный механизм, наконец заработавший так, как надо — это… Ну, не знаю. Как снова и снова слышать «да» на выпускном бале :-)</p>\n<p>Это несколько компенсирует обратную сторону медали — когда ты, например, в стопятый раз пытаешься разобраться в стопяти уровнях абстракции чьего-то приложения, ошибаешься снова и снова, за окном два часа ночи и вместо крови по венам давно бежит кофе.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "разные стороны медали 5 марта 2018 · работа фидбек — одна из самых клевых штук в моей профессии. да, не первый год программирую, да, кучу всего написал, переписал и переделал, и всё равно каждый сложный механизм, наконец заработавший так, как надо — это… ну, не знаю. как снова и снова слышать «да» на выпускном бале :-) это несколько компенсирует обратную сторону медали — когда ты, например, в стопятый раз пытаешься разобраться в стопяти уровнях абстракции чьего-то приложения, ошибаешься снова и снова, за окном два часа ночи и вместо крови по венам давно бежит кофе.",
    "tags": [
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/papers-please-short-film\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Ваши документы\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>1 марта 2018</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/YFHHGETsxkE\" width=\"560\"></iframe>\n<p>Крутая экранизация «<a href=\"https://store.steampowered.com/app/239030/Papers_Please/\" target=\"_blank\">Papers, Please</a>», даром что на десять минут. Савочкин здорово сыграл, да и остальные не подкачали, включая сценариста. Запихнуть в такой хронометраж драму и сюжетный твист — это надо уметь.</p>\n<p>Если вспомнить, что экранизации видеоигр обычно звёзд с небес не хватают — эту можно считать блестящим экземпляром.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "ваши документы 1 марта 2018 · видеоигры крутая экранизация « papers, please », даром что на десять минут. савочкин здорово сыграл, да и остальные не подкачали, включая сценариста. запихнуть в такой хронометраж драму и сюжетный твист — это надо уметь. если вспомнить, что экранизации видеоигр обычно звёзд с небес не хватают — эту можно считать блестящим экземпляром.",
    "tags": [
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/why-so-serious\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Чего так серьезно?\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>17 февраля 2018</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Код с запашком</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Иногда при отладке какого-нибудь сложного механизма не хватает времени на адекватные имена переменных и методов. Как итог — в коде появляются загадочные КакогоФига, ПрименитьМагию и прочие ЖивыеНеудачи.</p>\n<p>Этого нужно избегать, правда. На первый взгляд, конечно, смотрится забавно, но через месяц-другой написанный код нужно будет доработать — и тут-то проблема встанет в полный рост! Материться сквозь зубы на автора не выйдет лишь потому, что автор — ты сам.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "чего так серьезно? 17 февраля 2018 · 1с код с запашком иногда при отладке какого-нибудь сложного механизма не хватает времени на адекватные имена переменных и методов. как итог — в коде появляются загадочные какогофига, применитьмагию и прочие живыенеудачи. этого нужно избегать, правда. на первый взгляд, конечно, смотрится забавно, но через месяц-другой написанный код нужно будет доработать — и тут-то проблема встанет в полный рост! материться сквозь зубы на автора не выйдет лишь потому, что автор — ты сам.",
    "tags": [
      "1c",
      "code-smell"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/white-day\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                White Day\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>17 января 2018</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/VRiYZbAmun4\" width=\"560\"></iframe>\n<p>Может, этот хоррор и нишевый, но и правда неплохой. Атмосфера ночной школы, набитой мрачными секретами, удалась на славу — напряжение отпускает редко, а игра то и дело подкидывает сюрпризы там, откуда не ждешь. Я в этом жанре стреляный воробей, а все равно вздрогнуть не раз пришлось.</p>\n<p>Местный сюжет меняется в зависимости от действий игрока, и если хочется добраться до конца истории — одним прохождением никак не обойтись. Но, на мой взгляд, оно того стоит. Например, из-за антагониста — это сравнительно редкий случай, когда он вышел в разы интереснее, привлекательнее и трагичнее, чем протагонисты и все остальные герои вместе взятые.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "white day 17 января 2018 · видеоигры может, этот хоррор и нишевый, но и правда неплохой. атмосфера ночной школы, набитой мрачными секретами, удалась на славу — напряжение отпускает редко, а игра то и дело подкидывает сюрпризы там, откуда не ждешь. я в этом жанре стреляный воробей, а все равно вздрогнуть не раз пришлось. местный сюжет меняется в зависимости от действий игрока, и если хочется добраться до конца истории — одним прохождением никак не обойтись. но, на мой взгляд, оно того стоит. например, из-за антагониста — это сравнительно редкий случай, когда он вышел в разы интереснее, привлекательнее и трагичнее, чем протагонисты и все остальные герои вместе взятые.",
    "tags": [
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/bus-trips-uploading\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Выгрузка автобусных рейсов\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>17 ноября 2017</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Готово</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>С тех пор, как мы с коллегами заново автоматизировали <a href=\"http://kpat.ru/\" target=\"_blank\">КПАТ</a>, она работает на «<a href=\"http://avibus.pro/standalone/\" target=\"_blank\">Управлении автовокзалами</a>». Это конфигурация для 1С:Предприятия, то есть её можно сравнительно быстро интегрировать почти с чем угодно.</p>\n<p>Первым делом мы решили наладить выгрузку маршрутного расписания автобусов на E-Traffic и Яндекс.Расписания.</p>\n<h2>Что это за ресурсы?</h2>\n<p>Первый ресурс, <a href=\"http://e-traffic.ru\" target=\"_blank\">E-Traffic</a> — это крупнейший в России агрегатор данных автовокзалов. Собирает информацию о запланированных рейсах и выступает как агент по продаже электронных билетов. То есть пассажирам не нужно продираться через сайты автовокзалов — на E-Traffic можно купить билет откуда угодно куда угодно.</p>\n<p>Что касается <a href=\"http://rasp.yandex.ru\" target=\"_blank\">Яндекс.Расписаний</a> — это один из дочерних проектов российского поисковика. Как и E-Traffic, предназначен в первую очередь для пассажиров и умеет быстро строить относительно сложные маршруты с пересадками. Билетами они, правда, не торгуют.</p>\n<h2>Как была сделана выгрузка?</h2>\n<p>Поначалу мы нагородили довольно сложную архитектуру, позволяющую транслировать расписание в обе системы. Потели как черти — пока в ходе переговоров не выяснилось, что у E-Traffic уже есть рабочий транспорт для передачи расписания в Яндекс, и задача естественным образом не усохла вдвое.</p>\n<p>Технически всё было сделано в виде веб-сервиса для «Управления автовокзалами». Получив SOAP-запрос от E-Traffic, он собирал внутри информационной базы 1С:Предприятия все необходимые данные о запланированных автобусных рейсах и возвращал их в виде XML-ки.</p>\n<p>Нам даже не пришлось писать код получения расписания с каждого вокзала, входящего в сеть КПАТ'а: все они создаются и хранятся в одном месте — главном узле РИБ, а веб-сервис мы развернули именно там. В итоге больше времени ушло на разные согласования, чем на программирование.</p>\n<h2>А где посмотреть?</h2>\n<p>Внутренняя кухня снаружи не видна, да и там ничего необычного — роботы общаются с роботами, эка невидаль :-) Результат их болтовни — куда интереснее! Например, вот <a href=\"https://rasp.yandex.ru/search/bus/?fromName=Кемерово&amp;toName=Новокузнецк&amp;fromId=c64&amp;toId=c237&amp;when=сегодня\" target=\"_blank\">расписание</a> рейсов из Кемерово в Новокузнецк на сегодня.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "выгрузка автобусных рейсов 17 ноября 2017 · 1с готово работа с тех пор, как мы с коллегами заново автоматизировали кпат , она работает на « управлении автовокзалами ». это конфигурация для 1с:предприятия, то есть её можно сравнительно быстро интегрировать почти с чем угодно. первым делом мы решили наладить выгрузку маршрутного расписания автобусов на e-traffic и яндекс.расписания. что это за ресурсы? первый ресурс, e-traffic — это крупнейший в россии агрегатор данных автовокзалов. собирает информацию о запланированных рейсах и выступает как агент по продаже электронных билетов. то есть пассажирам не нужно продираться через сайты автовокзалов — на e-traffic можно купить билет откуда угодно куда угодно. что касается яндекс.расписаний — это один из дочерних проектов российского поисковика. как и e-traffic, предназначен в первую очередь для пассажиров и умеет быстро строить относительно сложные маршруты с пересадками. билетами они, правда, не торгуют. как была сделана выгрузка? поначалу мы нагородили довольно сложную архитектуру, позволяющую транслировать расписание в обе системы. потели как черти — пока в ходе переговоров не выяснилось, что у e-traffic уже есть рабочий транспорт для передачи расписания в яндекс, и задача естественным образом не усохла вдвое. технически всё было сделано в виде веб-сервиса для «управления автовокзалами». получив soap-запрос от e-traffic, он собирал внутри информационной базы 1с:предприятия все необходимые данные о запланированных автобусных рейсах и возвращал их в виде xml-ки. нам даже не пришлось писать код получения расписания с каждого вокзала, входящего в сеть кпат'а: все они создаются и хранятся в одном месте — главном узле риб, а веб-сервис мы развернули именно там. в итоге больше времени ушло на разные согласования, чем на программирование. а где посмотреть? внутренняя кухня снаружи не видна, да и там ничего необычного — роботы общаются с роботами, эка невидаль :-) результат их болтовни — куда интереснее! например, вот расписание рейсов из кемерово в новокузнецк на сегодня.",
    "tags": [
      "1c",
      "done",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/sebby-x-player\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Себби x Игрок\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>14 августа 2017</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">English</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>В конце июля я на волне энтузиазма <a href=\"https://acomics.ru/~sebby-x-player\" target=\"_blank\">перевёл</a> фанатскую мангу по «Stardew Valley», про которую я уже <a href=\"https://kostyanetsky.ru/notes/stardew-valley\" target=\"_blank\">писал</a> две недели назад.</p>\n<p>Забавный опыт. Во-первых, автор — китаец (точнее, китаянка) и английский язык для неё не родной — как и для меня. В итоге ряд фреймов, скажем так, вызывал вопросы. Во-вторых, я обнаружил, что подыскать русский аналог английской фразы, который бы не выглядел цитатой из документации к порталу госуслуг — само по себе неплохой челлендж.</p>\n<p>Короче, часть смысла по ходу дела, подозреваю, потерялась, хотя я постарался передать что мог и даже списался с автором, разбирая совсем уж непонятные участки. Было весело: я не знаю китайского, она — русского; общались на английском, а он у обоих далёк от идеала.</p>\n<p>Думаю, некоторые фразы можно было сделать поживее, где-то ровнее поправить исходную картинку, но — нафиг. Лучшее — враг хорошего, а результат мне уже нравится. Конечно, в сухом остатке здесь нет чего-то особенно крутого — рисовка как рисовка, сюжет по большей части повторяет игру, но… Не знаю. Наверное, визуальные новеллы сделали из меня чересчур сентиментального сукиного сына :-)</p>\n<p>Спасибо <a href=\"https://vk.com/id54890849\" target=\"_blank\">Кэт</a> за помощь с отрисовкой, <a href=\"https://twitter.com/amish77kin\" target=\"_blank\">Лему</a> — за подсказки по переводу и <a href=\"https://vk.com/mahrunteka\" target=\"_blank\">Марике</a> — за мысль. Ну и, конечно, <a href=\"https://curayukie.deviantart.com\" target=\"_blank\">Квантусу</a> — за мангу.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "себби x игрок 14 августа 2017 · english видеоигры в конце июля я на волне энтузиазма перевёл фанатскую мангу по «stardew valley», про которую я уже писал две недели назад. забавный опыт. во-первых, автор — китаец (точнее, китаянка) и английский язык для неё не родной — как и для меня. в итоге ряд фреймов, скажем так, вызывал вопросы. во-вторых, я обнаружил, что подыскать русский аналог английской фразы, который бы не выглядел цитатой из документации к порталу госуслуг — само по себе неплохой челлендж. короче, часть смысла по ходу дела, подозреваю, потерялась, хотя я постарался передать что мог и даже списался с автором, разбирая совсем уж непонятные участки. было весело: я не знаю китайского, она — русского; общались на английском, а он у обоих далёк от идеала. думаю, некоторые фразы можно было сделать поживее, где-то ровнее поправить исходную картинку, но — нафиг. лучшее — враг хорошего, а результат мне уже нравится. конечно, в сухом остатке здесь нет чего-то особенно крутого — рисовка как рисовка, сюжет по большей части повторяет игру, но… не знаю. наверное, визуальные новеллы сделали из меня чересчур сентиментального сукиного сына :-) спасибо кэт за помощь с отрисовкой, лему — за подсказки по переводу и марике — за мысль. ну и, конечно, квантусу — за мангу.",
    "tags": [
      "english",
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/stardew-valley\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Stardew Valley\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>1 августа 2017</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/ot7uXNQskhs\" width=\"560\"></iframe>\n<p>Невероятно аддиктивный симулятор фермера, сделанный с огромным вниманием к деталям. Серьёзные ребята расскажут про саундтрек, про качественный пиксель-арт и прочие такие штуки, а я так не умею — мне просто офигенно понравилось, вот и всё :-)</p>\n<p>Хотя нет, про саундтрек всё-таки скажу. Зимой в игре иногда играет «<a href=\"https://www.youtube.com/watch?v=Zr-PHm_qLgg\" target=\"_blank\">Ancient</a>», и это одна из самых простых и одновременно атмосферных мелодий, которые я вообще слышал в видеоиграх.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "stardew valley 1 августа 2017 · видеоигры невероятно аддиктивный симулятор фермера, сделанный с огромным вниманием к деталям. серьёзные ребята расскажут про саундтрек, про качественный пиксель-арт и прочие такие штуки, а я так не умею — мне просто офигенно понравилось, вот и всё :-) хотя нет, про саундтрек всё-таки скажу. зимой в игре иногда играет « ancient », и это одна из самых простых и одновременно атмосферных мелодий, которые я вообще слышал в видеоиграх.",
    "tags": [
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/layers-of-fear\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Layers of Fear\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>6 июля 2017</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/CyDs5UJfvks\" width=\"560\"></iframe>\n<p>Спорная штука. С одной стороны — довольно яркая и сочная картина сумасшествия, показанная «изнутри». Неплохой в целом сюжет, хотя с какого-то момента финал начинает угадываться.</p>\n<p>С другой — фантастическая коридорность, почти полное отсутствие челленджа и логики происходящего. Дело в том, что повествование идет от лица сумасшедшего и внутри его сознания, и это накладывает определённый отпечаток на геймплей — невозможно угадать, что нужно сделать в очередной комнате.</p>\n<p>В итоге просто ходишь, ищешь триггеры и пытаешься понять, что означает очередная фантасмагория вроде плавящегося телефона или взрывающихся часов. Моменты, когда сквозь это прорываются по-настоящему сильные штуки — например, письма главного героя и его жены — редки и ощущаются как глотки свежего воздуха.</p>\n<p>Я в целом не жалею, что прошёл — это тяжелая и грустная история, тщательно нарисованная и хорошо озвученная. Но, сдается мне, в море местного символизма утонуло немало смысла.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "layers of fear 6 июля 2017 · видеоигры спорная штука. с одной стороны — довольно яркая и сочная картина сумасшествия, показанная «изнутри». неплохой в целом сюжет, хотя с какого-то момента финал начинает угадываться. с другой — фантастическая коридорность, почти полное отсутствие челленджа и логики происходящего. дело в том, что повествование идет от лица сумасшедшего и внутри его сознания, и это накладывает определённый отпечаток на геймплей — невозможно угадать, что нужно сделать в очередной комнате. в итоге просто ходишь, ищешь триггеры и пытаешься понять, что означает очередная фантасмагория вроде плавящегося телефона или взрывающихся часов. моменты, когда сквозь это прорываются по-настоящему сильные штуки — например, письма главного героя и его жены — редки и ощущаются как глотки свежего воздуха. я в целом не жалею, что прошёл — это тяжелая и грустная история, тщательно нарисованная и хорошо озвученная. но, сдается мне, в море местного символизма утонуло немало смысла.",
    "tags": [
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/outlast-2\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Outlast 2\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>29 апреля 2017</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/EOrTuPljfPU\" width=\"560\"></iframe>\n<p>Не сказать, чтобы прямо провал, но — очень-очень слабо, особенно в сравнении с первой частью или её DLC. Ярких, пугающих, вообще вызывающих эмоции моментов — невероятно мало. Те же, что есть, быстро смываются волной раздражения от очередной смерти.</p>\n<p>Из плюсов — крутая озвучка, неплохая графика, хорошая работа над мелкими деталями. Есть с десяток удачных сцен и полдюжины очень крутых ракурсов, ради которых, возможно, стоит играть. Мир игры вообще более или менее проработан — хотя здесь испытываешь чаще брезгливость да отвращение, а не страх, как в Маунт-Массиве.</p>\n<p>Всё остальное — просто плохо. Корявый стелс в непроглядной темноте; бесконечные заскриптованные погони; блеклые, вяло раскрытые персонажи; частые баги вроде подвисания в воздухе или врагов, проходящих сквозь предметы.</p>\n<p>Как венец — откровенно никакая концовка. Да, она додумывается, конечно, всё выглядит вполне логично, но… Как бы сформулировать. В общем, после восьми часов беготни от психопатов хочется видеть хоть какой-то результат своих усилий. А вместо него получаешь лишь огромное, жаркое, ослепительное нихрена — во всех смыслах.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "outlast 2 29 апреля 2017 · видеоигры не сказать, чтобы прямо провал, но — очень-очень слабо, особенно в сравнении с первой частью или её dlc. ярких, пугающих, вообще вызывающих эмоции моментов — невероятно мало. те же, что есть, быстро смываются волной раздражения от очередной смерти. из плюсов — крутая озвучка, неплохая графика, хорошая работа над мелкими деталями. есть с десяток удачных сцен и полдюжины очень крутых ракурсов, ради которых, возможно, стоит играть. мир игры вообще более или менее проработан — хотя здесь испытываешь чаще брезгливость да отвращение, а не страх, как в маунт-массиве. всё остальное — просто плохо. корявый стелс в непроглядной темноте; бесконечные заскриптованные погони; блеклые, вяло раскрытые персонажи; частые баги вроде подвисания в воздухе или врагов, проходящих сквозь предметы. как венец — откровенно никакая концовка. да, она додумывается, конечно, всё выглядит вполне логично, но… как бы сформулировать. в общем, после восьми часов беготни от психопатов хочется видеть хоть какой-то результат своих усилий. а вместо него получаешь лишь огромное, жаркое, ослепительное нихрена — во всех смыслах.",
    "tags": [
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/firewatch\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Firewatch\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>22 апреля 2017</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/WexJcqgismA\" width=\"560\"></iframe>\n<p>Обычная, человеческая такая история, и ей совершенно по-человечески чего-то не хватает. Какой-то искры, что ли? Идеи? Смысла? Чем ближе к развязке, тем сильнее становится ощущение, что в кастрюлю забыли налить супа.</p>\n<p>Не, я не хочу сказать, что играть не стоит. Тут <strong>очень</strong> живые и здорово прописанные диалоги, которые делают три четверти атмосферы. Кроме того, игра неплохо выглядит (хотя я не очень понял, откуда в отзывах столько восторгов — в каком-нибудь «The Vanishing of Ethan Carter» виды встречались покруче) и в целом проходится на ура.</p>\n<p>Но концовка сюжета откровенно скомкана, а кульминация просто отсутствует. Да, я в курсе насчёт заложенной философии — мол, это жизнь, бла-бла-бла, многоточий больше чем точек, бла-бла-бла. Но, камон! Если история ставит кучу вопросов и не отвечает ни на один из них — это не очень-то и круто, как ни ссылайся на age-check.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "firewatch 22 апреля 2017 · видеоигры обычная, человеческая такая история, и ей совершенно по-человечески чего-то не хватает. какой-то искры, что ли? идеи? смысла? чем ближе к развязке, тем сильнее становится ощущение, что в кастрюлю забыли налить супа. не, я не хочу сказать, что играть не стоит. тут очень живые и здорово прописанные диалоги, которые делают три четверти атмосферы. кроме того, игра неплохо выглядит (хотя я не очень понял, откуда в отзывах столько восторгов — в каком-нибудь «the vanishing of ethan carter» виды встречались покруче) и в целом проходится на ура. но концовка сюжета откровенно скомкана, а кульминация просто отсутствует. да, я в курсе насчёт заложенной философии — мол, это жизнь, бла-бла-бла, многоточий больше чем точек, бла-бла-бла. но, камон! если история ставит кучу вопросов и не отвечает ни на один из них — это не очень-то и круто, как ни ссылайся на age-check.",
    "tags": [
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/unhappy\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Совершенно несчастный\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>24 марта 2017</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Наткнулся на «<a href=\"https://theoatmeal.com/comics/unhappy\" target=\"_blank\">How to be Perfectly Unhappy</a>» — комикс Мэтью Инмана о счастье, несчастье и том, что вообще стоит за этими словами.</p>\n<p>У мужика отличное чувство юмора — собственно, он и известен как автор юмористических комиксов «The Oatmeal». Когда такие люди говорят о серьёзном, часто получается вот так: забавно, мудро и как-то откровенно, что ли.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "совершенно несчастный 24 марта 2017 · тем временем наткнулся на « how to be perfectly unhappy » — комикс мэтью инмана о счастье, несчастье и том, что вообще стоит за этими словами. у мужика отличное чувство юмора — собственно, он и известен как автор юмористических комиксов «the oatmeal». когда такие люди говорят о серьёзном, часто получается вот так: забавно, мудро и как-то откровенно, что ли.",
    "tags": [
      "meanwhile"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/semiconductors\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Стоп-слова для интерфейсов\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>14 января 2017</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Любопытная <a href=\"https://bureau.ru/bb/soviet/20161220/\" target=\"_blank\">заметка</a> про термины и формулировки, которые лучше не применять при разработке интерфейсов. Позабавила ремарка про аутентификацию и авторизацию.</p>\n<p>И, конечно, список выглядит неполным без знаменитых контактов (и полупроводников) :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "стоп-слова для интерфейсов 14 января 2017 · работа любопытная заметка про термины и формулировки, которые лучше не применять при разработке интерфейсов. позабавила ремарка про аутентификацию и авторизацию. и, конечно, список выглядит неполным без знаменитых контактов (и полупроводников) :-)",
    "tags": [
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/hpmor\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                ГПиМРМ\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>6 ноября 2016</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Книги</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Дочитал «Гарри Поттер и методы рационального мышления» — эпический фанфик по сами-знаете-какой вселенной. Автор — крутой спец по искусственному интеллекту и интересен сам по себе, но вот эту его книгу я прямо настойчиво <a href=\"http://hpmor.ru\" target=\"_blank\">рекомендую</a>.</p>\n<p>В первую очередь — как очень любопытное переосмысление оригинальной саги Джоан Роулинг. Многие аспекты поданы как минимум не менее интересно и выпукло, и вообще интрига закручена отменная — две трети истории я прочитал, не выключая <a href=\"https://kostyanetsky.ru/notes/hpmor/gene-wilder-meme.jpg\" target=\"_blank\">Джина Уайлдера</a> :-) При этом автор ухитрился свести концы с концами и закрыть сюжетную линию так, что претензий у меня почти не осталось.</p>\n<p>Ну и в любом случае, безотносительно всего — это неплохой способ знакомства с кучей научных, около-научных и просто интересных штук, так или иначе затронутых по ходу дела. Автор умен, и книжка тоже вышла неглупая.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "гпимрм 6 ноября 2016 · книги дочитал «гарри поттер и методы рационального мышления» — эпический фанфик по сами-знаете-какой вселенной. автор — крутой спец по искусственному интеллекту и интересен сам по себе, но вот эту его книгу я прямо настойчиво рекомендую . в первую очередь — как очень любопытное переосмысление оригинальной саги джоан роулинг. многие аспекты поданы как минимум не менее интересно и выпукло, и вообще интрига закручена отменная — две трети истории я прочитал, не выключая джина уайлдера :-) при этом автор ухитрился свести концы с концами и закрыть сюжетную линию так, что претензий у меня почти не осталось. ну и в любом случае, безотносительно всего — это неплохой способ знакомства с кучей научных, около-научных и просто интересных штук, так или иначе затронутых по ходу дела. автор умен, и книжка тоже вышла неглупая.",
    "tags": [
      "books"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/kholat\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Kholat\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>23 октября 2016</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/622TC6IPwT4\" width=\"560\"></iframe>\n<p>Чудовищно утомительный геймплей, сводящийся к поискам листочков бумаги. Вялая бессвязная сюжетка, построенная на кое-как склеенных друг с другом мистических версиях гибели группы Дятлова. Как хоррор — полный ноль. Пугаться тут особо нечему — так, слепые монстры да редкие скримеры.</p>\n<p>Радуют только картинка и звук. Те, кто трудился над ними, проделали великолепную работу. Но на выходе, увы, получилась лишь огромная локация, где нет почти никого, где нет почти ничего, где почти нечего и — самое плохое — почти незачем что-то делать.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "kholat 23 октября 2016 · видеоигры чудовищно утомительный геймплей, сводящийся к поискам листочков бумаги. вялая бессвязная сюжетка, построенная на кое-как склеенных друг с другом мистических версиях гибели группы дятлова. как хоррор — полный ноль. пугаться тут особо нечему — так, слепые монстры да редкие скримеры. радуют только картинка и звук. те, кто трудился над ними, проделали великолепную работу. но на выходе, увы, получилась лишь огромная локация, где нет почти никого, где нет почти ничего, где почти нечего и — самое плохое — почти незачем что-то делать.",
    "tags": [
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/doom\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                DOOM\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>29 июня 2016</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/RO90omga8D4\" width=\"560\"></iframe>\n<p>Тот случай, когда игра настолько крута, что говорить об этом — максимально душная затея.</p>\n<p>Поступим иначе; не знаю, какой из двух треков лучше передает драйв нового DOOM'а — <a href=\"https://www.youtube.com/watch?v=kjIVkl34Vig\" target=\"_blank\">Hell to Pay</a> Гэвина Данна или <a href=\"https://www.youtube.com/watch?v=hauVRrgEXl8\" target=\"_blank\">Fight Like Hell</a> от JT Music — так что сошлюсь и на первый, и на второй.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "doom 29 июня 2016 · видеоигры тот случай, когда игра настолько крута, что говорить об этом — максимально душная затея. поступим иначе; не знаю, какой из двух треков лучше передает драйв нового doom'а — hell to pay гэвина данна или fight like hell от jt music — так что сошлюсь и на первый, и на второй.",
    "tags": [
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/feist\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Feist\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>16 июня 2016</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/Bj9vK75qB_w\" width=\"560\"></iframe>\n<p>Короткий, но атмосферный и довольно суровый платформер.</p>\n<p>Чем-то напомнил LIMBO, только здесь не загробный мир, а тёмный и таинственный лес, в котором водятся разумные ежи-забияки :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "feist 16 июня 2016 · видеоигры короткий, но атмосферный и довольно суровый платформер. чем-то напомнил limbo, только здесь не загробный мир, а тёмный и таинственный лес, в котором водятся разумные ежи-забияки :-)",
    "tags": [
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/bioshock-infinite\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Bioshock Infinite\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>10 января 2016</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/EsJ55BzIvkE\" width=\"560\"></iframe>\n<p>Эта игра — точно не лучшая из «Биошоков» с точки зрения геймплея, но она настолько красива и детализована, что её как-то не тянет ругать. Кроме того, тут есть сурово закрученный сюжет! И Элизабет :-) Тут Дэвид Браун в своей «<a href=\"https://www.youtube.com/watch?v=IvvO-ndDLVE\" target=\"_blank\">Limelight</a>» уже всё спел, добавить мне нечего.</p>\n<p>Точно буду проходить еще раз — просто чтобы снова на всё посмотреть. Не знаю, правда, как играть в DLC – история Колумбии и её детей закончена, по-моему, настолько, насколько вообще можно закончить какую-то историю.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "bioshock infinite 10 января 2016 · видеоигры эта игра — точно не лучшая из «биошоков» с точки зрения геймплея, но она настолько красива и детализована, что её как-то не тянет ругать. кроме того, тут есть сурово закрученный сюжет! и элизабет :-) тут дэвид браун в своей « limelight » уже всё спел, добавить мне нечего. точно буду проходить еще раз — просто чтобы снова на всё посмотреть. не знаю, правда, как играть в dlc – история колумбии и её детей закончена, по-моему, настолько, насколько вообще можно закончить какую-то историю.",
    "tags": [
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/gone-home\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Gone Home\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>11 марта 2015</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/x5KJzLsyfBI\" width=\"560\"></iframe>\n<p>Короткий и яркий квест. Никакого челленджа, просто история одной семьи, в которой родители за своими проблемами потеряли кое-что очень важное.</p>\n<p>Дневники сестры, мне кажется, можно было вообще убрать из игры — сюжет отлично восстанавливается по вещам, письмам, запискам и фотографиям. Было бы больше загадок и места для расследования.</p>\n<p>Хотя, надо признать, в таком виде всё это чертовски трогательно.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "gone home 11 марта 2015 · видеоигры короткий и яркий квест. никакого челленджа, просто история одной семьи, в которой родители за своими проблемами потеряли кое-что очень важное. дневники сестры, мне кажется, можно было вообще убрать из игры — сюжет отлично восстанавливается по вещам, письмам, запискам и фотографиям. было бы больше загадок и места для расследования. хотя, надо признать, в таком виде всё это чертовски трогательно.",
    "tags": [
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/places-of-imprisonment\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Места лишения свободы\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>23 февраля 2015</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Нашел здорово оформленный <a href=\"https://kefiijrw.com/army/#intro\" target=\"_blank\">дневник</a> российского срочника, ныне — одного из дизайнеров <a href=\"https://artlebedev.ru\" target=\"_blank\">студии</a> Артемия Лебедева. Написано интересно и с юмором, читается — запоем.</p>\n<p>С праздником всех причастных!</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "места лишения свободы 23 февраля 2015 · тем временем нашел здорово оформленный дневник российского срочника, ныне — одного из дизайнеров студии артемия лебедева. написано интересно и с юмором, читается — запоем. с праздником всех причастных!",
    "tags": [
      "meanwhile"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/avibus-pro\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Авибус\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>16 февраля 2015</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">1С</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Javascript</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Конфигурация для 1С:Предприятия, которую мы пару лет назад внедряли на кузбасских автовокзалах, обзавелась симпатичной <a href=\"http://avibus.pro/\" target=\"_blank\">обложкой</a>.</p>\n<p>По-моему, очень круто! В том числе и тем, что это один из проектов, постепенно разрушающих заплесневелый, но невероятно устойчивый даже среди айтишников миф про 1С — типа, это скучный тормозной софт для бухгалтеров, а настоящие пацаны пишут только на C++ (Java, Javascript, подчеркните, впишите) и тому подобные бредни.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "авибус 16 февраля 2015 · 1с работа javascript конфигурация для 1с:предприятия, которую мы пару лет назад внедряли на кузбасских автовокзалах, обзавелась симпатичной обложкой . по-моему, очень круто! в том числе и тем, что это один из проектов, постепенно разрушающих заплесневелый, но невероятно устойчивый даже среди айтишников миф про 1с — типа, это скучный тормозной софт для бухгалтеров, а настоящие пацаны пишут только на c++ (java, javascript, подчеркните, впишите) и тому подобные бредни.",
    "tags": [
      "1c",
      "work",
      "javascript"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/blogging-benefits\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Польза от блога\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>1 февраля 2015</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Всеволод Устинов написал любопытную <a href=\"http://vsevolodustinov.ru/blog/all/o-polze-vedeniya-professionalnogo-bloga/\" target=\"_blank\">заметку</a> по поводу ведения рабочего блога.</p>\n<p>Я не уверен насчет формы (блог, статья, презентация «для своих» — не так важно, по-моему), но с одной из основных мыслей согласен на все сто: освоенное, но не записанное и не обдуманное ещё на три раза очень быстро утонет в чашках утреннего кофе.</p>\n<p>Ещё полезные ссылки на ту же тему:</p>\n<ul>\n<li><a href=\"http://sergeykorol.ru/blog/about-blog/\" target=\"_blank\">Зачем вести блог (несмотря ни на что)</a></li>\n<li><a href=\"https://ru.hexlet.io/blog/posts/sitnik-inflyuenser\" target=\"_blank\">Программист не обязан становиться инфлюенсером</a></li>\n</ul>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "польза от блога 1 февраля 2015 · работа всеволод устинов написал любопытную заметку по поводу ведения рабочего блога. я не уверен насчет формы (блог, статья, презентация «для своих» — не так важно, по-моему), но с одной из основных мыслей согласен на все сто: освоенное, но не записанное и не обдуманное ещё на три раза очень быстро утонет в чашках утреннего кофе. ещё полезные ссылки на ту же тему: зачем вести блог (несмотря ни на что) программист не обязан становиться инфлюенсером",
    "tags": [
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/move-on\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Движение вперёд\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>20 января 2015</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Спорт</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Подумалось тут: длинные, тяжелые и сложные задачи — обучение, тренировки, диеты и прочий мрак — становится заметно легче штурмовать, как только понимаешь, что результат тебе действительно нужен.</p>\n<p>Вот сидишь ты с комфортом на условном нуле и наконец подрываешься худеть, или там к MBA готовиться, не знаю. Мозоли неприятно ноют и вообще отстой, может не так уж этот MBA и нужен, да и вместо утренней прогулки лучше поспать; однако после первого же подхода (покорпел над курсом, побегал трусцой, кефира навернул вместо булочки) ловишь себя на скрытых, но офигенно сильных эндорфинах: ба, а я-то молодец, я все делаю правильно, я двигаюсь вперед!</p>\n<p>И наоборот — фейлишь вот (тупишь в какой-нибудь шутер вместо книги, трескаешь печенье вместо творога, а в спортзал что-то совсем некогда) и отсутствие эндорфинов качает мотивацию. В итоге сегодня пожевал печенья, потом неделю на него смотреть не можешь — не потому, что не хочется, а потому что опять на месте топчешься и тюфяк.</p>\n<p>То есть движение вперед вполне себе наркотик — при условии, что ты точно знаешь, где находится это самое вперед и точно знаешь, что тебе туда надо.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "движение вперёд 20 января 2015 · спорт работа подумалось тут: длинные, тяжелые и сложные задачи — обучение, тренировки, диеты и прочий мрак — становится заметно легче штурмовать, как только понимаешь, что результат тебе действительно нужен. вот сидишь ты с комфортом на условном нуле и наконец подрываешься худеть, или там к mba готовиться, не знаю. мозоли неприятно ноют и вообще отстой, может не так уж этот mba и нужен, да и вместо утренней прогулки лучше поспать; однако после первого же подхода (покорпел над курсом, побегал трусцой, кефира навернул вместо булочки) ловишь себя на скрытых, но офигенно сильных эндорфинах: ба, а я-то молодец, я все делаю правильно, я двигаюсь вперед! и наоборот — фейлишь вот (тупишь в какой-нибудь шутер вместо книги, трескаешь печенье вместо творога, а в спортзал что-то совсем некогда) и отсутствие эндорфинов качает мотивацию. в итоге сегодня пожевал печенья, потом неделю на него смотреть не можешь — не потому, что не хочется, а потому что опять на месте топчешься и тюфяк. то есть движение вперед вполне себе наркотик — при условии, что ты точно знаешь, где находится это самое вперед и точно знаешь, что тебе туда надо.",
    "tags": [
      "sport",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/alien-isolation\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Alien: Isolation\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>16 января 2015</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <iframe allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/7h0cgmvIrZw\" width=\"560\"></iframe>\n<p>Отменный, по-честному — без скримеров — пугающий хоррор. Анимация Чужого и его охотничьи повадки выше всяких похвал: игра в кошки-мышки с монстром, попытки угадать или услышать, где он находится, истеричный писк детектора движения, слюна, капающая из вентиляции, чьи-то предсмертные вопли поблизости, панический поиск укрытий — всё это держит в диком напряжении всю игру.</p>\n<p>Даже когда у Рипли появляется возможность прогонять монстра, это мало что меняет. Он, может, и сбежит (если успеешь выстрелить и попадешь), но вернётся очень быстро, будет в два раза злее и сунет нос в каждый угол.</p>\n<p>В минусы проекту можно записать <s>деревянную анимацию лиц персонажей и мелкие огрехи стелса</s> кнопки Tab и Escape, которые ставят игру на паузу и позволяют успокоить расшатанные нервы :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "alien: isolation 16 января 2015 · видеоигры отменный, по-честному — без скримеров — пугающий хоррор. анимация чужого и его охотничьи повадки выше всяких похвал: игра в кошки-мышки с монстром, попытки угадать или услышать, где он находится, истеричный писк детектора движения, слюна, капающая из вентиляции, чьи-то предсмертные вопли поблизости, панический поиск укрытий — всё это держит в диком напряжении всю игру. даже когда у рипли появляется возможность прогонять монстра, это мало что меняет. он, может, и сбежит (если успеешь выстрелить и попадешь), но вернётся очень быстро, будет в два раза злее и сунет нос в каждый угол. в минусы проекту можно записать деревянную анимацию лиц персонажей и мелкие огрехи стелса кнопки tab и escape, которые ставят игру на паузу и позволяют успокоить расшатанные нервы :-)",
    "tags": [
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/completely-lazy\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Совсем ленивые\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>12 сентября 2014</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Семья</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Дочка спрашивает: пап, а что значит «молиться»?</p>\n<p>Я объясняю — смотри, мол, некоторые люди верят в могущественное существо, которое живет на небе и управляет всем-всем-всем. Люди время от времени это существо о чем-то просят, вот это и называется молитвой.</p>\n<p>Мелкая, подумав:</p>\n<p>— Пап, эти люди, они совсем ленивые, да?</p>\n<p><a href=\"https://kostyanetsky.ru/notes/completely-lazy/little-one.jpg\" target=\"_blank\"><img alt=\"Совсем-совсем?\" src=\"https://kostyanetsky.ru/notes/completely-lazy/little-one-thumbnail.jpg\"/></a></p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "совсем ленивые 12 сентября 2014 · семья дочка спрашивает: пап, а что значит «молиться»? я объясняю — смотри, мол, некоторые люди верят в могущественное существо, которое живет на небе и управляет всем-всем-всем. люди время от времени это существо о чем-то просят, вот это и называется молитвой. мелкая, подумав: — пап, эти люди, они совсем ленивые, да?",
    "tags": [
      "family"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/zombies-run\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Зомби! Бежим!\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>26 августа 2014</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Спорт</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Я, как и все толстяки, не очень-то люблю бегать и трай-хард со мной не проходит абсолютно — два-три дня волевых усилий и всё, матушка лень да батюшка стрём.</p>\n<p>Пришлось как следует заморочиться с мотивацией; в итоге нашлась смартфонная игрушка «<a href=\"https://zombiesrungame.com/\" target=\"_blank\">Zombies, Run!</a>». По факту — тупо плеер, втыкаешь плейлист и идешь гулять. Однако привычные треки перемежаются незатейливым сюжетом про выживание в типичном зомбиленде: твой вертолёт потерпел крушение и ты пытаешься добраться до выживших. Ищешь припасы, медикаменты… И вокруг тебя зомби, так что если хочешь жить — шевели задницей.</p>\n<p>Джи-и-изус Христ! Это офигительно. Не знаю, заслуга это игры или моего воображения, но сотни тысяч фрагов в Left 4 Dead мне не помогли никак — под рычание за спиной бежится невероятно хорошо! Игра, причем, беспристрастно сообщает, на каком расстоянии очередной мертвец; когда один такой прыгнул ко мне разом на сорок метров — я выдал, наверное, лучший спринт в своей жизни.</p>\n<p><img alt=\"Йее!\" src=\"https://kostyanetsky.ru/notes/zombies-run/escapologist.jpg\"/></p>\n<p>(под конец второй прогулки runner five, вдобавок, повредил ногу и начал очень аутентично хромать, что добавило драматизма и погружения в атмосферу)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "зомби! бежим! 26 августа 2014 · спорт видеоигры я, как и все толстяки, не очень-то люблю бегать и трай-хард со мной не проходит абсолютно — два-три дня волевых усилий и всё, матушка лень да батюшка стрём. пришлось как следует заморочиться с мотивацией; в итоге нашлась смартфонная игрушка « zombies, run! ». по факту — тупо плеер, втыкаешь плейлист и идешь гулять. однако привычные треки перемежаются незатейливым сюжетом про выживание в типичном зомбиленде: твой вертолёт потерпел крушение и ты пытаешься добраться до выживших. ищешь припасы, медикаменты… и вокруг тебя зомби, так что если хочешь жить — шевели задницей. джи-и-изус христ! это офигительно. не знаю, заслуга это игры или моего воображения, но сотни тысяч фрагов в left 4 dead мне не помогли никак — под рычание за спиной бежится невероятно хорошо! игра, причем, беспристрастно сообщает, на каком расстоянии очередной мертвец; когда один такой прыгнул ко мне разом на сорок метров — я выдал, наверное, лучший спринт в своей жизни. (под конец второй прогулки runner five, вдобавок, повредил ногу и начал очень аутентично хромать, что добавило драматизма и погружения в атмосферу)",
    "tags": [
      "sport",
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/gear-suitability\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Шмот под левел\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>13 июля 2014</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Слегка обновил летний гардероб. Без привычных килограммов почувствовал себя в примерочной кем-то вроде персонажа MMORPG, который апнул уровень и теперь может таскать шмот поинтереснее.</p>\n<p>Проблемы, в общем, примерно те же, включая извечный вопрос «а надо ли мне покупать этот лайт сет, если скоро новый левел-ап».</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "шмот под левел 13 июля 2014 · тем временем видеоигры слегка обновил летний гардероб. без привычных килограммов почувствовал себя в примерочной кем-то вроде персонажа mmorpg, который апнул уровень и теперь может таскать шмот поинтереснее. проблемы, в общем, примерно те же, включая извечный вопрос «а надо ли мне покупать этот лайт сет, если скоро новый левел-ап».",
    "tags": [
      "meanwhile",
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/my-school\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Выбор\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>5 июня 2014</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Семья</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Дочка усердно расчесывает ногу. Говорю ей: эй, не чеши, болеть будет. Она на меня серьезно так смотрит и отвечает: пап, это мой выбор, чесать или не чесать.</p>\n<p>Не нашел, что возразить.</p>\n<p><img alt=\"Моя школа!\" src=\"https://kostyanetsky.ru/notes/my-school/bender.jpg\"/></p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "выбор 5 июня 2014 · семья дочка усердно расчесывает ногу. говорю ей: эй, не чеши, болеть будет. она на меня серьезно так смотрит и отвечает: пап, это мой выбор, чесать или не чесать. не нашел, что возразить.",
    "tags": [
      "family"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/pillar-of-light\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Столп света\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>7 апреля 2014</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Чтение собственного прошлогоднего кода отчетливо отдает мазохизмом: ага, вот тут я неявный запрос в цикле организовал, а вот тут — получил таблицу остатков и зачем-то сгруппировал её. Молодец, дружище!</p>\n<p>С другой стороны, это хоть какой-то индикатор роста. Игры играми, но в реальной жизни порой жуть как не хватает каких-нибудь столпов света, падающих с небес при получении нового уровня.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "столп света 7 апреля 2014 · видеоигры работа чтение собственного прошлогоднего кода отчетливо отдает мазохизмом: ага, вот тут я неявный запрос в цикле организовал, а вот тут — получил таблицу остатков и зачем-то сгруппировал её. молодец, дружище! с другой стороны, это хоть какой-то индикатор роста. игры играми, но в реальной жизни порой жуть как не хватает каких-нибудь столпов света, падающих с небес при получении нового уровня.",
    "tags": [
      "videogames",
      "work"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/cake-recipe\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Рецепт торта\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>3 декабря 2013</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">English</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>На курсах английского разбирали тему кухни — посуда, мебель, еда, вот это всё. Зачитал <a href=\"https://www.youtube.com/watch?v=fXzr5iwGFfE\" target=\"_blank\">рецепт торта</a> из Portal как пример блюда, которое готовится из множества компонентов. Имел определенный успех :-)</p>\n<p>Кстати, редкий случай отличной локализации: в русской версии игры этот монолог (да и все остальные реплики GLaDOS) звучат куда выразительнее.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "рецепт торта 3 декабря 2013 · english видеоигры на курсах английского разбирали тему кухни — посуда, мебель, еда, вот это всё. зачитал рецепт торта из portal как пример блюда, которое готовится из множества компонентов. имел определенный успех :-) кстати, редкий случай отличной локализации: в русской версии игры этот монолог (да и все остальные реплики glados) звучат куда выразительнее.",
    "tags": [
      "english",
      "videogames"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/skittles\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Кегли на дороге\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>3 июня 2013</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Интересно, какому проценту пешеходов, переходящих дорогу где придется, реально тяжело добраться до зебры, а какому — просто плевать на последствия? Недавно прочитал «<a href=\"http://mymaster.livejournal.com/344609.html\" target=\"_blank\">Откровения кегли</a>» (клёвую заметку Антона Буслова про ситуацию с зебрами с точки зрения больного человека) — но мне всё равно трудно поверить, что все эти упитанные и совсем не старые люди настолько измотаны, что не могут добраться до перехода.</p>\n<p>Ладно я, велосипед легко маневрирует и быстро тормозит. А вот что испытывают водители автомобилей и мотоциклов — боюсь представить.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "кегли на дороге 3 июня 2013 · тем временем интересно, какому проценту пешеходов, переходящих дорогу где придется, реально тяжело добраться до зебры, а какому — просто плевать на последствия? недавно прочитал « откровения кегли » (клёвую заметку антона буслова про ситуацию с зебрами с точки зрения больного человека) — но мне всё равно трудно поверить, что все эти упитанные и совсем не старые люди настолько измотаны, что не могут добраться до перехода. ладно я, велосипед легко маневрирует и быстро тормозит. а вот что испытывают водители автомобилей и мотоциклов — боюсь представить.",
    "tags": [
      "meanwhile"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/silent-night\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Спокойного сна\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>17 апреля 2013</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Тем временем</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Ночью в Березовском невероятно тихо. Большие города так крепко засыпать не умеют — всегда кто-нибудь по улицам шляется, машины ездят, музыку слышно, собаки какие-нибудь воют.</p>\n<p>А тут — ни души, одни бесконечные фонари да сонные светофоры. И мертвая тишина. Вообще ни единого звука — только эхо собственных шагов.</p>\n<p>Ощущение… Странное. Как будто я попал в какой-нибудь, не знаю, Сайлент Хилл или Припять, а не в маленький шахтерский городок.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "спокойного сна 17 апреля 2013 · тем временем ночью в березовском невероятно тихо. большие города так крепко засыпать не умеют — всегда кто-нибудь по улицам шляется, машины ездят, музыку слышно, собаки какие-нибудь воют. а тут — ни души, одни бесконечные фонари да сонные светофоры. и мертвая тишина. вообще ни единого звука — только эхо собственных шагов. ощущение… странное. как будто я попал в какой-нибудь, не знаю, сайлент хилл или припять, а не в маленький шахтерский городок.",
    "tags": [
      "meanwhile"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/trip-plan\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                План на поездку\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>25 марта 2013</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Семья</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Укатил в Екатеринбург на конференцию по софту для автовокзалов. Наказал Кэт слушаться дочку, а дочке — слушаться Кэт. Подозреваю, их ждет веселая неделя.</p>\n<p><a href=\"https://kostyanetsky.ru/notes/trip-plan/plan.jpg\" target=\"_blank\"><img alt=\"План\" src=\"https://kostyanetsky.ru/notes/trip-plan/plan-thumbnail.jpg\"/></a></p>\n<p>Вернусь в субботу. Скучайте.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "план на поездку 25 марта 2013 · семья укатил в екатеринбург на конференцию по софту для автовокзалов. наказал кэт слушаться дочку, а дочке — слушаться кэт. подозреваю, их ждет веселая неделя. вернусь в субботу. скучайте.",
    "tags": [
      "family"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/eagles\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Орлы-телепаты\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>9 марта 2013</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Семья</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Почерк у Кэт такой, что опытные медики давятся от зависти. Сегодня, если верить записке, она попросила по дороге домой купить четыре шурупных ведра и двенадцать орлов-телепатов.</p>\n<p>Ладно шурупы, но где мне добыть орлов? Да и еще и телепатов?</p>\n<p>Я в растерянности, жизнь прожита зря.</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "орлы-телепаты 9 марта 2013 · семья почерк у кэт такой, что опытные медики давятся от зависти. сегодня, если верить записке, она попросила по дороге домой купить четыре шурупных ведра и двенадцать орлов-телепатов. ладно шурупы, но где мне добыть орлов? да и еще и телепатов? я в растерянности, жизнь прожита зря.",
    "tags": [
      "family"
    ]
  },
  {
    "html": "\n\n        <article class=\"rounded-2xl bg-white\">\n\n          <header class=\"space-y-2\">\n\n                        \n            <header class=\"space-y-2\">\n            <a href=\"https://kostyanetsky.ru/notes/theme-hospital\"\n                class=\"inline text-2xl font-semibold tracking-tight hover:underline\">\n                Частная станция\n            </a>\n            </header>\n            \n\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 text-sm text-slate-600\">\n              <span>3 февраля 2013</span>\n              \n                <span class=\"text-slate-300\">·</span>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Видеоигры</span>\n                </div>\n                \n                <div class=\"flex flex-wrap gap-2\">\n                    <span class=\"inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-700\">Работа</span>\n                </div>\n                \n              \n            </div>\n\n          </header>\n\n          <div class=\"mt-5\">\n            <div class=\"prose-like\">\n              <p>Кассы Беловского автовокзала изнутри остро напомнили старый-престарый симулятор больницы для DOS — «<a href=\"https://ru.wikipedia.org/wiki/Theme_Hospital\" target=\"_blank\">Theme Hospital</a>».</p>\n<p>Во всяком случае я, когда играл, кабинеты терапевтов делал по тому же принципу: одинаковые квадратные комнатки, урна строго в одном углу, цветок строго в другом углу, батарея строго под окном и так далее :-)</p>\n            </div>\n          </div>\n          \n        </article>\n\n",
    "text": "частная станция 3 февраля 2013 · видеоигры работа кассы беловского автовокзала изнутри остро напомнили старый-престарый симулятор больницы для dos — « theme hospital ». во всяком случае я, когда играл, кабинеты терапевтов делал по тому же принципу: одинаковые квадратные комнатки, урна строго в одном углу, цветок строго в другом углу, батарея строго под окном и так далее :-)",
    "tags": [
      "videogames",
      "work"
    ]
  }
]