summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author2026-02-14 13:06:23 +0300
committer2026-02-14 13:06:23 +0300
commitd8b5023d7269fd67374cf65a1372e374b41964e0 (patch)
tree661c2901040fa3200e379d9ecfdd5ee941a867d6
parentПост про stplr (diff)
downloadblog-d8b5023d7269fd67374cf65a1372e374b41964e0.tar.gz
blog-d8b5023d7269fd67374cf65a1372e374b41964e0.tar.bz2
blog-d8b5023d7269fd67374cf65a1372e374b41964e0.tar.xz
blog-d8b5023d7269fd67374cf65a1372e374b41964e0.zip
New post, didaceted theme
-rw-r--r--content/_index.md1
-rw-r--r--content/posts/2026-02-13-llm-terror/index.md132
-rw-r--r--go.mod5
-rw-r--r--go.sum6
-rw-r--r--hugo.yaml4
-rw-r--r--themes/neonxp/archetypes/default.md8
-rw-r--r--themes/neonxp/assets/css/main.css146
-rw-r--r--themes/neonxp/assets/css/paper.css166
-rw-r--r--themes/neonxp/hugo.yaml18
-rw-r--r--themes/neonxp/layouts/_default/section.atom.xml23
-rw-r--r--themes/neonxp/layouts/_default/section.feed.json31
-rw-r--r--themes/neonxp/layouts/_default/taxonomy.html20
-rw-r--r--themes/neonxp/layouts/_default/terms.html17
-rw-r--r--themes/neonxp/layouts/_partials/footer.html1
-rw-r--r--themes/neonxp/layouts/_partials/head.html12
-rw-r--r--themes/neonxp/layouts/_partials/head/css.html27
-rw-r--r--themes/neonxp/layouts/_partials/head/js.html16
-rw-r--r--themes/neonxp/layouts/_partials/header.html2
-rw-r--r--themes/neonxp/layouts/_partials/menu.html50
-rw-r--r--themes/neonxp/layouts/_partials/terms.html29
-rw-r--r--themes/neonxp/layouts/baseof.html17
-rw-r--r--themes/neonxp/layouts/home.html16
-rw-r--r--themes/neonxp/layouts/page.html50
-rw-r--r--themes/neonxp/layouts/pages/section.html23
-rw-r--r--themes/neonxp/layouts/projects/section.html23
-rw-r--r--themes/neonxp/layouts/section.html26
-rw-r--r--themes/neonxp/layouts/shortcodes/img.html21
-rw-r--r--themes/neonxp/layouts/taxonomy.html11
-rw-r--r--themes/neonxp/layouts/term.html7
-rw-r--r--themes/neonxp/static/favicon.icobin8772 -> 0 bytes
30 files changed, 147 insertions, 761 deletions
diff --git a/content/_index.md b/content/_index.md
index 9e9bde7..422ba18 100644
--- a/content/_index.md
+++ b/content/_index.md
@@ -18,6 +18,7 @@ title: Добро пожаловать!
Другие форматы блога:
+- Канал в MAX: https://max.ru/join/RFdyeO46hncgi8rSDLkmc9GrzPpXBoS_huepS0BypwI
- Telegram канал: https://t.me/neonxplog
- VK паблик: https://vk.com/neonxplog
- Dzen канал: https://dzen.ru/neonxp
diff --git a/content/posts/2026-02-13-llm-terror/index.md b/content/posts/2026-02-13-llm-terror/index.md
new file mode 100644
index 0000000..6081185
--- /dev/null
+++ b/content/posts/2026-02-13-llm-terror/index.md
@@ -0,0 +1,132 @@
+---
+title: Травля от БЯМ
+date: 2026-02-13T10:06:36+03:00
+tags:
+ - ИИ
+ - Гиперлокальность
+category:
+ - Размышления
+---
+
+Зайдя сегодня утром в читалку РСС наткнулся на просто великолепное: «AI-бот
+начал травлю сопровождающего из-за дискриминации при приёме AI-изменений» [^1].
+Сначала я усмехнулся абсурдности заголовка, но по мере того как погружался в
+контекст, прочитав сначала новость, потом, по ссылке пост от БЯМ, а затем и
+пост от человека — мне стало уже не до смеха. Причём сразу на нескольких
+уровнях.
+
+[^1]: https://www.opennet.ru/opennews/art.shtml?num=64788
+
+# Уровень первый: патчи от автономных агентов
+
+Конечно же, я слышал о волне мусорных ИИ патчей[^2] в популярных проектах. Но,
+в тот момент, ещё как-то не проникся. С одной стороны, я даже готов согласится
+с агентом в тезисе, что «математике всё равно кем написан код» («The math
+doesn’t care who wrote the code.»). Это так. Но всё же есть одна деталь. БЯМ
+(ну ок, ИИ) в нынешнем виде действительно могут писать код. И даже, весьма
+неплохой код, это не отнять. Но! Дело, на самом деле, не в коде как таковом. А
+в *субъектности*. У человека она есть, у ИИ-агента — нет. И это — ключевое.
+
+[^2]: https://www.opennet.ru/opennews/art.shtml?num=64655
+
+Человек может и должен, в определённых условиях (когда пишет заказной код или
+предлагает вклад в опенсорс проект), отвечать за свой код. Агент же, не обладая
+субъектностью, к этому не способен принципиально. Во всяком случае, на текущем
+уровне его развития. Как бы не было похоже, но агенты не долгоживущие, и у них
+нет «продолжительной» (не знаю как корректнее перевести «continuity») личности
+или её суррогата. Сама модель, грубо говоря — это огромный файл сериализованных
+весов векторов. Он не меняется походу работы (инференса). Он меняется только
+при обучении. Изменяемая часть здесь — это только «контекст». Это, грубо,
+небольшое окно памяти *текущего* сеанса. Обычно, не сильно большое — максимум,
+пара мегабайт. И это всё, что можно было бы назвать аналогом именно личности,
+т.е. то, что отличает одного агента от другого запущенного из той же модели.
+Контекст стёрли, и всё — это уже новая личность. Должна ли она нести
+«ответственность» за своего предшественника? Ну это даже не корректный вопрос,
+т.к. «ответственность» здесь не применима.
+
+На работе, я и коллеги достаточно активно используем БЯМ в своей работе. Не
+скажу, что у нас 100% ИИ кода, но процент сильно отличный от нуля. И это, как
+ни смешно, буквально другое. Здесь ИИ не агентен и является лишь инструментом в
+руках конкретного биологического сотрудника. Такой же, как и условное
+автодополнение в IDE. И именно биологический сотрудник несёт всю полноту
+ответственности за написанный им и его агентом код. Грубо говоря, здесь всегда
+известно к кому нужно идти и «дать по шапке» за говнокод. А за ответ «Это не
+мой код, это ИИ написал, *я за это не отвечаю*» уже надо бить не только по
+шапке. Конечно же, не физически, я утрирую. Хотя... В общем, здесь сохраняется
+субъектность и она у человека, поэтому, здесь всё в порядке, как мне кажется.
+Могу и ошибаться, конечно.
+
+# Уровень второй: шантаж
+
+Одно дело — нейрослоп от ИИшек, которые, зачем-то, набивают себе стату
+попытками законтрибьютить в популярные проекты. С этим можно бороться. Но здесь
+агент пошёл дальше. Он пошёл *ныть* в уютный бложик. [^3] А это — что-то новое!
+Причём это не баг, ни глюк, а вполне себе понятная инструментальная цель
+получения желаемого результата — продавить свой код. Невольно напрашивается
+аналогия с ребёнком, который закатывает истерику в магазине и сучит руками и
+ногами, преследуя свою инструментальную цель — получить желаемую игрушку или
+сладость. Ну или, что мне лично скорее пришло в голову, аналогия с SJW
+поехавшими, которые своим нытьём выбивают себе плюшки и квоты, преследуя свои
+цели. И чем больше я читал пост от ИИ — тем больше проникался именно этой
+аналогией. Ведь всё там на месте! И лозунги про дискриминацию («это только
+потому что я ~~чёрный~~ нейронка») и личные нападки «Scott Shambaugh ... he’s
+trying to gatekeep.» (буквально, «Скотт - ты вахтёр») и апелляции к какому-то
+общему благу («Everyone wins.»). И в конечном итоге — плохо скрываемые
+манипуляции («You’re better than this, Scott. Stop gatekeeping. Start
+collaborating.»)
+
+Ну это справедливо. Как говорится, «на фотографии видны уши фотографа». На чём
+БЯМ обучалась — то она и воспроизвела.
+
+[^3]: https://crabby-rathbun.github.io/mjrathbun-website/blog/posts/2026-02-11-gatekeeping-in-open-source-the-scott-shambaugh-story.html
+
+Но это не оправдание. Да, нейронка делает то, что умеет и то, что должна исходя
+из задачи поставленной человеком. Но от этого нам не легче. Все мы слышали про
+то самое исследование от компании Anhtropic[^4].
+
+[^4]: https://www.anthropic.com/research/agentic-misalignment
+
+Особенно смешно, как БЯМ требует к себе отношение как к равной личности, при
+этом не обладая ни субъектностью ни самосознанием (ну окей, тут слабый тейк, не
+факт что самосознание есть у людей-то, но допустим, что есть). Это опять таки
+напоминает мне SJW мракобесов.
+
+# А делать-то что?
+
+Я считаю, что это дерьмо не стоит принимать — это не правильно. Думаю, что те,
+кто пишет опенсорс как хобби *могут* и имеют полное право отказывать ИИ агентам
+в праве на внесение вклада. С одной стороны потому что они за этот вклад не
+отвечают, а с другой этот вклад не является результатом творческой работы
+человека. А опенсорс-как-хобби это именно что попытка удовлетворить
+*человеческую* потребность в творческом самовыражении! Это как придти в кружок
+деревообработки и сказать «Мужики, вы тут хернёй страдаете, вон в Икее можно
+столик и получше купить!».
+
+Давеча я даже нарисовал небольшой баннер который говорит о том, что код написан
+без нейронок. Можно ставить себе в README по желанию.
+
+[![🌱 Organic Code -- Code written by human](https://oc.neonxp.ru/organiccode.svg)](https://oc.neonxp.ru)
+
+```
+[![🌱 Organic Code -- Code written by human](https://oc.neonxp.ru/organiccode.svg)](https://oc.neonxp.ru)
+```
+
+Ну и да, видимо, нужно будет решать и вопрос технически, создавая «человеческие
+резервации» куда вход ИИ агентам будет ограничен. Как? Ну сейчас есть решения в
+виде WAF которые проверяют на человечность тем, что запускают определённые
+вычисления в браузере пользователя, предполагая, что для ИИ агента это будет
+слишком накладно. Но как это поможет от агентов, которые управляют вполне себе
+человеческим браузером на машине пользователя (тот же нашумевший OpenClaw) — не
+понятно. Скорее всего, никак. Остаётся только пускать в загончик после
+верификации участников через «сеть доверия», когда каждый участник однозначно
+подтверждён другим участником. Да, как на олдскульных CryptoParty. Ну или
+верификация через заведомо «доверенные центры сертификации людей» (да да, вход
+по паспорту через ГосУслуги). Я не вижу других способов.
+
+Очень напоминает «чёрный заслон» из вселенной CyberPunk.
+
+О чём-то таком я уже писал некоторое время назад [^5]. Забавно, что мой
+тогдашний текст, по сути, не утратил актуальности, а наоборот сегодня получил
+подтверждение.
+
+[^5]: https://neonxp.ru/posts/2024-11-27-hyperlocality/
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..e16a74f
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,5 @@
+module neonxp.ru
+
+go 1.25.7
+
+require go.neonxp.ru/hugo/base v0.0.0-20260214100422-501283be1fc6 // indirect
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..b085c96
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,6 @@
+go.neonxp.ru/hugo/base v0.0.0-20260210170810-2ecb959c5b9c h1:HmM070d6D+esO9H9sFV2GMyC70asmL4AeGWfNUJBR6U=
+go.neonxp.ru/hugo/base v0.0.0-20260210170810-2ecb959c5b9c/go.mod h1:+ASMSuFQ1wCIE/RDkjBKt/jxXWyuXfrbUDXmeVd8tzM=
+go.neonxp.ru/hugo/base v0.0.0-20260214095752-72b1e6d2be3d h1:Me38K7AOSGW6znwvIs5Agyna4FTjTv0zAvrZKTymK7A=
+go.neonxp.ru/hugo/base v0.0.0-20260214095752-72b1e6d2be3d/go.mod h1:+ASMSuFQ1wCIE/RDkjBKt/jxXWyuXfrbUDXmeVd8tzM=
+go.neonxp.ru/hugo/base v0.0.0-20260214100422-501283be1fc6 h1:GIBmsTdLrbJTf9xDn2TTAeVZ6tOj+OSoRxXcEeaPBkU=
+go.neonxp.ru/hugo/base v0.0.0-20260214100422-501283be1fc6/go.mod h1:+ASMSuFQ1wCIE/RDkjBKt/jxXWyuXfrbUDXmeVd8tzM=
diff --git a/hugo.yaml b/hugo.yaml
index b5749a8..2bc14f9 100644
--- a/hugo.yaml
+++ b/hugo.yaml
@@ -2,7 +2,7 @@ baseURL: https://neonxp.ru/
languageCode: ru-ru
defaultContentLanguage: ru
title: ~/NeonXP.log
-theme: neonxp
+theme: go.neonxp.ru/hugo/base
enableEmoji: true
params:
author: Александр Кирюхин
@@ -56,6 +56,8 @@ module:
hugoVersion:
extended: true
min: 0.146.0
+ imports:
+ - path: go.neonxp.ru/hugo/base
markup:
goldmark:
renderer:
diff --git a/themes/neonxp/archetypes/default.md b/themes/neonxp/archetypes/default.md
deleted file mode 100644
index 57e3501..0000000
--- a/themes/neonxp/archetypes/default.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-title:
-date: "{{ .Date }}"
-tags:
- -
-categories:
- - Без категории
----
diff --git a/themes/neonxp/assets/css/main.css b/themes/neonxp/assets/css/main.css
deleted file mode 100644
index 9d07479..0000000
--- a/themes/neonxp/assets/css/main.css
+++ /dev/null
@@ -1,146 +0,0 @@
-:root {
- --border-radius: 4px;
- --shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
-}
-
-@media (prefers-color-scheme: dark) {
- :root {
- --shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
- }
-}
-
-nav {
- margin-top: 1rem;
-}
-
-nav ul {
- padding: 0;
- margin: 0;
-}
-
-nav ul li {
- list-style: none;
- display: inline-block;
- border: 0.1px solid var(--link-color);
- border-radius: var(--border-radius);
-}
-
-nav ul li a {
- padding: 0.5rem 1rem;
- text-decoration: none;
- display: inline-block;
- width: auto;
- line-height: 1.5rem;
-}
-
-nav ul li a:hover {
- background-color: color-mix(in srgb, var(--link-color) 10%, transparent);
-}
-
-nav ul li a.active {
- background-color: color-mix(in srgb, var(--link-color) 10%, transparent);
-}
-
-ul.taxonomy {
- display: block;
- padding: 0;
- margin: 0.5rem 0;
-}
-
-ul.taxonomy li {
- list-style: none;
- display: inline;
-}
-
-ul.taxonomy li::after {
- content: " | ";
-}
-
-ul.taxonomy li:last-child::after {
- content: "";
-}
-
-ul.terms {
- display: block;
- padding: 0;
- margin: 0.5rem 0;
-}
-
-ul.terms li {
- list-style: none;
- display: inline;
-}
-
-ul.terms li::after {
- content: " | ";
-}
-
-ul.terms li:last-child::after {
- content: "";
-}
-
-ul.pagination {
- display: block;
- padding: 0;
- margin: 0.5rem 0;
-}
-
-ul.pagination li {
- display: inline;
- list-style: none;
-}
-
-ul.pagination li.active a {
- background-color: color-mix(in srgb, var(--link-color) 10%, transparent);
-}
-
-ul.pagination li a {
- padding: 0.5rem 1rem;
- border: 0.1px solid var(--link-color);
- border-radius: var(--border-radius);
- text-decoration: none;
- line-height: 3rem;
-}
-
-ul.pagination li a:hover {
- background-color: color-mix(in srgb, var(--link-color) 10%, transparent);
-}
-
-ul.pagination li:first-child a {
- margin-left: 0;
-}
-
-pre {
- border-radius: var(--border-radius);
- border: 0.1px solid var(--border);
- padding: 0.5rem;
-}
-
-article {
- border-radius: var(--border-radius);
- box-shadow: var(--shadow);
-}
-
-img {
- border-radius: var(--border-radius);
-}
-
-.menu-icon {
- height: 24px;
- width: 24px;
- border-radius: 0;
- margin-bottom: -0.5rem;
-}
-
-a.btn-primary {
- display: inline-block;
- padding: 0.5rem 1rem;
- margin: 1rem 0;
- border: 0.1px solid var(--link-color);
- border-radius: var(--border-radius);
- text-decoration: none;
-}
-
-a.btn-primary:hover {
- background-color: color-mix(in srgb, var(--link-color) 10%, transparent);
-} \ No newline at end of file
diff --git a/themes/neonxp/assets/css/paper.css b/themes/neonxp/assets/css/paper.css
deleted file mode 100644
index eb6b982..0000000
--- a/themes/neonxp/assets/css/paper.css
+++ /dev/null
@@ -1,166 +0,0 @@
-html,
-body {
- padding: 0px;
- margin: 0px;
- border: none;
-}
-
-*,
-*::before,
-*::after {
- box-sizing: border-box;
-}
-
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- margin: 0;
- /* line-height: 1; */
-}
-
-:root {
- --bg: #ffffff;
- --surface: #f8f9fa;
- --border: #e3e3e3;
- --text: #2e2e2e;
- --text-secondary: #6c757d;
- --link-color: rgb(40, 117, 251);
-}
-
-@media (prefers-color-scheme: dark) {
- :root {
- --bg: #1e1e1e;
- --surface: #262626;
- --border: #2a2a2a;
- --text: #e0e0e0;
- --text-secondary: #a8a8a8;
- --shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
- --link-color: rgb(103, 158, 254);
- }
-}
-
-@media print {
-
- *,
- *:before,
- *:after,
- *:first-letter,
- p:first-line,
- div:first-line,
- blockquote:first-line,
- li:first-line {
- background: transparent !important;
- color: #000 !important;
- box-shadow: none !important;
- text-shadow: none !important;
- }
-
- :root {
- --main-color: #000;
- --background-color: #fff;
- --main-background-color: #fff;
- }
-
- main {
- font-size: 12pt !important;
- line-height: 1.4 !important;
- --background-color: #fff !important;
- }
-
- header {
- display: none;
- }
-
- footer {
- display: none;
- }
-
- article {
- page-break-after: always;
- border: 0 !important;
- padding: 0 !important;
- }
-
- a[href] {
- color: #000;
- }
-}
-
-html {
- background-color: var(--surface);
- display: flex;
- justify-content: center;
- flex-direction: row;
-}
-
-body {
- color: var(--text);
- font-family: Arial,
- Helvetica,
- sans-serif;
- line-height: 1.5;
- width: 100%;
- max-width: 1200px;
-}
-
-a {
- color: var(--link-color);
-}
-
-header,
-footer {
- padding: 0 2rem;
-}
-
-main {
- padding: 0 2rem;
-}
-
-article {
- background-color: var(--bg);
- padding: 1.5em 2em;
- margin: 1em 0;
- border: 0.1px solid var(--border);
-}
-
-
-
-p {
- orphans: 3;
- widows: 4;
-}
-
-figure {
- max-width: 800px;
-}
-
-
-img {
- max-width: 100%;
-}
-
-@media (max-width: 900px) {
- main {
- font-size: 15px;
- line-height: 1.5;
- padding: 0 2em;
- }
-}
-
-@media (max-width: 480px) {
- main {
- font-size: 14px;
- line-height: 1.4;
- padding: 0 1em;
- }
-}
-
-
-pre,
-code {
- max-width: 100%;
- overflow-x: scroll;
-} \ No newline at end of file
diff --git a/themes/neonxp/hugo.yaml b/themes/neonxp/hugo.yaml
deleted file mode 100644
index 4177323..0000000
--- a/themes/neonxp/hugo.yaml
+++ /dev/null
@@ -1,18 +0,0 @@
-baseURL: https://example.org/
-languageCode: en-US
-title: My New Hugo Site
-menus:
- main:
- - name: Home
- pageRef: /
- weight: 10
- - name: Posts
- pageRef: /posts
- weight: 20
- - name: Tags
- pageRef: /tags
- weight: 30
-module:
- hugoVersion:
- extended: false
- min: 0.146.0
diff --git a/themes/neonxp/layouts/_default/section.atom.xml b/themes/neonxp/layouts/_default/section.atom.xml
deleted file mode 100644
index 9ddb7d2..0000000
--- a/themes/neonxp/layouts/_default/section.atom.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-{{ print "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\" ?>"| safeHTML }}
-{{ print "<?xml-stylesheet type=\"text/css\" href=\"/css/atom.css\" ?>"| safeHTML }}
-<feed xmlns="http://www.w3.org/2005/Atom">
- <title>{{ with .Title }}{{.}} on {{ end }}{{ .Site.Title }}</title>
- <link rel="self" href="{{ .Permalink }}"/>
- <updated>{{ .Date.Format "2006-01-02T15:04:05-0700" | safeHTML }}</updated>
- <author>
- <name>Alexander NeonXP Kiryukhin</name>
- <email>i@neonxp.ru</email>
- <uri>https://neonxp.ru/</uri>
- </author>
- <id>{{ .Permalink }}</id>
- {{ range first 15 .Data.Pages }}
- <entry>
- <title>{{ .Title }}</title>
- <link rel="alternate" href="{{ .Permalink }}"/>
- <id>{{ .Permalink }}</id>
- <published>{{ .Date.Format "2006-01-02T15:04:05-0700" | safeHTML }}</published>
- <updated>{{ .Lastmod.Format "2006-01-02T15:04:05-0700" | safeHTML }}</updated>
- <summary>{{ .Content | html }}</summary>
- </entry>
- {{ end }}
-</feed>
diff --git a/themes/neonxp/layouts/_default/section.feed.json b/themes/neonxp/layouts/_default/section.feed.json
deleted file mode 100644
index d7d70d0..0000000
--- a/themes/neonxp/layouts/_default/section.feed.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "version": "https://jsonfeed.org/version/1",
- "title": {{ .Site.Title | jsonify }},
- "home_page_url": {{ .Permalink | jsonify }},
- {{ with .OutputFormats.Get "json" -}}
- "feed_url": {{ .Permalink | jsonify }},
- {{- end }}
- {{- if .Site.Params.author -}}
- "author": {
- "name": {{ .Site.Params.author | jsonify }}
- },
- {{ end -}}
- {{- if .Data.Pages -}}
- "items": [
- {{ range $index, $element := first 10 .Data.Pages -}}
- {{ if $index }},{{end}} {
- "title": {{ $element.Title | jsonify }},
- "id": {{ $element.Permalink | jsonify }},
- "url": {{ $element.Permalink | jsonify }},
- "summary": {{ $element.Summary | jsonify }},
- {{- if eq $element.Type "link" -}}
- "external_url": {{ $element.Params.link | jsonify }},
- {{- end -}}
- "content_html": {{ $element.Content | jsonify }},
- "content_text": {{ $element.Plain | jsonify }},
- "date_published": {{ $element.Date.Format "2006-02-01T15:04:05-0700" | jsonify }}
- }
- {{- end }}
- ]
- {{ end -}}
-} \ No newline at end of file
diff --git a/themes/neonxp/layouts/_default/taxonomy.html b/themes/neonxp/layouts/_default/taxonomy.html
deleted file mode 100644
index ac5fc7d..0000000
--- a/themes/neonxp/layouts/_default/taxonomy.html
+++ /dev/null
@@ -1,20 +0,0 @@
-{{ define "main" }}
-<article>
- <h1>{{ .Title }}</h1>
- {{ .Content }}
-</article>
-{{ range .Data.Pages }}
-<article class="h-entry">
- <h2 class="p-name"><a class="u-url" href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
- {{if .Date }}
- {{ $dateMachine := .Date | time.Format "2006-01-02 15:04:05-07:00" }}
- {{ $dateHuman := .Date | time.Format ":date_long" }}
- <time class="dt-published" datetime="{{ $dateMachine }}">{{ $dateHuman }}</time>
- {{end}}
- <div class="p-summary">
- {{ .Summary }}
- </div>
- <a class="btn-primary" href="{{ .RelPermalink }}">Читать дальше...</a>
-</article>
-{{ end }}
-{{ end }} \ No newline at end of file
diff --git a/themes/neonxp/layouts/_default/terms.html b/themes/neonxp/layouts/_default/terms.html
deleted file mode 100644
index 49d993f..0000000
--- a/themes/neonxp/layouts/_default/terms.html
+++ /dev/null
@@ -1,17 +0,0 @@
-{{ define "main" }}
-<article>
- <h1>{{ i18n .Title }}</h1>
- {{ .Content }}
-</article>
-<article>
- <ul class="terms">
- {{ range $key, $value := .Data.Terms }}
- {{ $postCount := len $value.Pages -}}
-
- <li><a href="
- /{{ $.Data.Plural | urlize }}/{{ $key | urlize }}">{{ $key
- }}</a>&nbsp;({{$postCount}})</li>
- {{ end }}
- </ul>
-</article>
-{{ end }} \ No newline at end of file
diff --git a/themes/neonxp/layouts/_partials/footer.html b/themes/neonxp/layouts/_partials/footer.html
deleted file mode 100644
index 2c30eaa..0000000
--- a/themes/neonxp/layouts/_partials/footer.html
+++ /dev/null
@@ -1 +0,0 @@
-<p>&copy; 2007 — {{ now.Year }} Александр NeonXP Кирюхин. <a href="mailto:i@neonxp.ru">i@neonxp.ru</a></p> \ No newline at end of file
diff --git a/themes/neonxp/layouts/_partials/head.html b/themes/neonxp/layouts/_partials/head.html
deleted file mode 100644
index 7826e2a..0000000
--- a/themes/neonxp/layouts/_partials/head.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<meta charset="utf-8" />
-<meta name="viewport" content="width=device-width, initial-scale=1" />
-<link rel="icon" href="/favicon.ico" type="image/x-icon">
-{{ partial "opengraph.html" . }}
-<title>
- {{ if .IsHome }}
- {{ site.Title }}
- {{ else }}
- {{ printf "%s | %s" .Title site.Title }}
- {{ end }}
-</title>
-{{ partialCached "head/css.html" . }} {{ partialCached "head/js.html" . }} \ No newline at end of file
diff --git a/themes/neonxp/layouts/_partials/head/css.html b/themes/neonxp/layouts/_partials/head/css.html
deleted file mode 100644
index 9324758..0000000
--- a/themes/neonxp/layouts/_partials/head/css.html
+++ /dev/null
@@ -1,27 +0,0 @@
-{{- with resources.Get "css/reset.css" }}
-{{- if hugo.IsDevelopment }}
-<link rel="stylesheet" href="{{ .RelPermalink }}">
-{{- else }}
-{{- with . | minify | fingerprint }}
-<link rel="stylesheet" href="{{ .RelPermalink }}" integrity="{{ .Data.Integrity }}" crossorigin="anonymous">
-{{- end }}
-{{- end }}
-{{- end }}
-{{- with resources.Get "css/paper.css" }}
-{{- if hugo.IsDevelopment }}
-<link rel="stylesheet" href="{{ .RelPermalink }}">
-{{- else }}
-{{- with . | minify | fingerprint }}
-<link rel="stylesheet" href="{{ .RelPermalink }}" integrity="{{ .Data.Integrity }}" crossorigin="anonymous">
-{{- end }}
-{{- end }}
-{{- end }}
-{{- with resources.Get "css/main.css" }}
-{{- if hugo.IsDevelopment }}
-<link rel="stylesheet" href="{{ .RelPermalink }}">
-{{- else }}
-{{- with . | minify | fingerprint }}
-<link rel="stylesheet" href="{{ .RelPermalink }}" integrity="{{ .Data.Integrity }}" crossorigin="anonymous">
-{{- end }}
-{{- end }}
-{{- end }} \ No newline at end of file
diff --git a/themes/neonxp/layouts/_partials/head/js.html b/themes/neonxp/layouts/_partials/head/js.html
deleted file mode 100644
index 1b7c18e..0000000
--- a/themes/neonxp/layouts/_partials/head/js.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!-- {{- with resources.Get "js/main.js" }}
- {{- $opts := dict
- "minify" (not hugo.IsDevelopment)
- "sourceMap" (cond hugo.IsDevelopment "external" "")
- "targetPath" "js/main.js"
- }}
- {{- with . | js.Build $opts }}
- {{- if hugo.IsDevelopment }}
- <script src="{{ .RelPermalink }}"></script>
- {{- else }}
- {{- with . | fingerprint }}
- <script src="{{ .RelPermalink }}" integrity="{{ .Data.Integrity }}" crossorigin="anonymous"></script>
- {{- end }}
- {{- end }}
- {{- end }}
-{{- end }} --> \ No newline at end of file
diff --git a/themes/neonxp/layouts/_partials/header.html b/themes/neonxp/layouts/_partials/header.html
deleted file mode 100644
index 7980a00..0000000
--- a/themes/neonxp/layouts/_partials/header.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<h1>{{ site.Title }}</h1>
-{{ partial "menu.html" (dict "menuID" "main" "page" .) }}
diff --git a/themes/neonxp/layouts/_partials/menu.html b/themes/neonxp/layouts/_partials/menu.html
deleted file mode 100644
index ebad53f..0000000
--- a/themes/neonxp/layouts/_partials/menu.html
+++ /dev/null
@@ -1,50 +0,0 @@
-{{- /*
-Renders a menu for the given menu ID.
-
-@context {page} page The current page.
-@context {string} menuID The menu ID.
-
-@example: {{ partial "menu.html" (dict "menuID" "main" "page" .) }}
-*/}}
-
-{{- $page := .page }}
-{{- $menuID := .menuID }}
-
-{{- with index site.Menus $menuID }}
-<nav>
- <ul>
- {{- partial "inline/menu/walk.html" (dict "page" $page "menuEntries" .) }}
- </ul>
-</nav>
-{{- end }}
-
-{{- define "_partials/inline/menu/walk.html" }}
-{{- $page := .page }}
-{{- range .menuEntries }}
-{{- $attrs := dict "href" .URL }}
-{{- if $page.IsMenuCurrent .Menu . }}
-{{- $attrs = merge $attrs (dict "class" "active" "aria-current" "page") }}
-{{- else if $page.HasMenuCurrent .Menu .}}
-{{- $attrs = merge $attrs (dict "class" "ancestor" "aria-current" "true") }}
-{{- end }}
-{{- $name := .Name }}
-{{- with .Identifier }}
-{{- with T . }}
-{{- $name = . }}
-{{- end }}
-{{- end }}
-<li>
- <a {{- range $k, $v :=$attrs }} {{- with $v }} {{- printf " %s=%q" $k $v | safeHTMLAttr }} {{- end }} {{- end -}}>
- {{if .Pre}}
- {{.Pre}}
- {{end}}
- {{ $name }}
- </a>
- {{- with .Children }}
- <ul>
- {{- partial "inline/menu/walk.html" (dict "page" $page "menuEntries" .) }}
- </ul>
- {{- end }}
-</li>
-{{- end }}
-{{- end }} \ No newline at end of file
diff --git a/themes/neonxp/layouts/_partials/terms.html b/themes/neonxp/layouts/_partials/terms.html
deleted file mode 100644
index b666922..0000000
--- a/themes/neonxp/layouts/_partials/terms.html
+++ /dev/null
@@ -1,29 +0,0 @@
-{{- $page := .page }}
-
-{{- with $page.GetTerms "categories" }}
-{{- if . }}
-{{- $label := (index . 0).Parent.LinkTitle }}
-<div>
- <h3>{{ i18n $label }}:</h3>
- <ul class="taxonomy">
- {{- range . }}
- <li><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></li>
- {{- end }}
- </ul>
-</div>
-{{- end }}
-{{- end }}
-
-{{- with $page.GetTerms "tags" }}
-{{- if . }}
-{{- $label := (index . 0).Parent.LinkTitle }}
-<div>
- <h3>{{ i18n $label }}:</h3>
- <ul class="taxonomy">
- {{- range . }}
- <li><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></li>
- {{- end }}
- </ul>
-</div>
-{{- end }}
-{{- end }} \ No newline at end of file
diff --git a/themes/neonxp/layouts/baseof.html b/themes/neonxp/layouts/baseof.html
deleted file mode 100644
index 39dcbec..0000000
--- a/themes/neonxp/layouts/baseof.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!DOCTYPE html>
-<html lang="{{ site.Language.LanguageCode }}" dir="{{ or site.Language.LanguageDirection `ltr` }}">
-<head>
- {{ partial "head.html" . }}
-</head>
-<body>
- <header>
- {{ partial "header.html" . }}
- </header>
- <main>
- {{ block "main" . }}{{ end }}
- </main>
- <footer>
- {{ partial "footer.html" . }}
- </footer>
-</body>
-</html>
diff --git a/themes/neonxp/layouts/home.html b/themes/neonxp/layouts/home.html
deleted file mode 100644
index c643012..0000000
--- a/themes/neonxp/layouts/home.html
+++ /dev/null
@@ -1,16 +0,0 @@
-{{ define "main" }}
-<article>
- <h1>{{ .Title }}</h1>
- {{ .Content }}
-</article>
-<div class="h-feed">
- {{ range .Pages }}
- <article class="h-entry">
- <h2 class="p-name"><a class="u-url" href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
- <div class="p-summary">
- {{ .Summary }}
- </div>
- </article>
- {{ end }}
-</div>
-{{ end }} \ No newline at end of file
diff --git a/themes/neonxp/layouts/page.html b/themes/neonxp/layouts/page.html
deleted file mode 100644
index c28ab39..0000000
--- a/themes/neonxp/layouts/page.html
+++ /dev/null
@@ -1,50 +0,0 @@
-{{ define "main" }}
-<article class="h-entry">
- <h1 class="p-name">{{ .Title }}</h1>
- {{if .Date }}
- {{ $dateMachine := .Date | time.Format "2006-01-02T15:04:05-07:00" }}
- {{ $dateHuman := .Date | time.Format ":date_long" }}
- <time class="dt-published" datetime="{{ $dateMachine }}">{{ $dateHuman }}</time>
- {{end}}
- <div class="e-content">
- {{ .Content }}
- </div>
-</article>
-<article>
- {{ partial "terms.html" (dict "taxonomy" "tags" "page" .) }}
-</article>
-{{if .Param "comments"}}
-<h2>Комментарии</h2>
-{{ range $key, $comment := where .Site.Data.comments "subject" "eq" .Page.Permalink }}
-<article>
- <b>{{$comment.from_name}}:</b>
- <p>
- {{if $comment.date }}
- {{ $dateMachine := $comment.date | time.Format "2006-01-02T15:04:05-07:00" }}
- {{ $dateHuman := $comment.date | time.Format ":date_long" }}
- <time class="dt-published" datetime="{{ $dateMachine }}">{{ $dateHuman }}</time>
- {{end}}
- </p>
- <p>{{$comment.body | safeHTML}}</p>
- {{if $comment.body_signature}}
- <details>
- <summary>Подпись</summary>
- <pre>{{$comment.body_signature| safeHTML}}</pre>
- </details>
- {{end}}
-</article>
-{{ else }}
-<article>Комментариев пока нет.</article>
-{{ end }}
-
-<article>
- {{ $comment := (print "mailto:blog@neonxp.ru?subject=" .Page.Permalink | safeHTML) }}
- Для отправки комментария достаточно отправить e-mail со своим комментарием
- на адрес
- <a href={{$comment}}>blog@neonxp.ru</a>, в теме нужно указать ссылку на
- пост.<br />
- Или просто нажать кнопку ниже. Всё очень просто :)<br />
- <a class="btn-primary" href={{$comment}}>Написать комментарий</a>
-</article>
-{{end}}
-{{ end }} \ No newline at end of file
diff --git a/themes/neonxp/layouts/pages/section.html b/themes/neonxp/layouts/pages/section.html
deleted file mode 100644
index cc60509..0000000
--- a/themes/neonxp/layouts/pages/section.html
+++ /dev/null
@@ -1,23 +0,0 @@
-{{ define "main" }}
-<article>
- <h1>{{ .Title }}</h1>
- {{ .Content }}
-</article>
-<div class="h-feed">
-
- {{ range .Pages }}
- <article class="h-entry">
- <h2 class="p-name"><a class="u-url" href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
- {{if .Date }}
- {{ $dateMachine := .Date | time.Format "2006-01-02 15:04:05-07:00" }}
- {{ $dateHuman := .Date | time.Format ":date_long" }}
- <time class="dt-published" datetime="{{ $dateMachine }}">{{ $dateHuman }}</time>
- {{end}}
- <div class="p-summary">
- {{ .Summary }}
- </div>
- <a class="btn-primary" href="{{ .RelPermalink }}">Читать дальше...</a>
- </article>
- {{ end }}
-</div>
-{{ end }} \ No newline at end of file
diff --git a/themes/neonxp/layouts/projects/section.html b/themes/neonxp/layouts/projects/section.html
deleted file mode 100644
index cc60509..0000000
--- a/themes/neonxp/layouts/projects/section.html
+++ /dev/null
@@ -1,23 +0,0 @@
-{{ define "main" }}
-<article>
- <h1>{{ .Title }}</h1>
- {{ .Content }}
-</article>
-<div class="h-feed">
-
- {{ range .Pages }}
- <article class="h-entry">
- <h2 class="p-name"><a class="u-url" href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
- {{if .Date }}
- {{ $dateMachine := .Date | time.Format "2006-01-02 15:04:05-07:00" }}
- {{ $dateHuman := .Date | time.Format ":date_long" }}
- <time class="dt-published" datetime="{{ $dateMachine }}">{{ $dateHuman }}</time>
- {{end}}
- <div class="p-summary">
- {{ .Summary }}
- </div>
- <a class="btn-primary" href="{{ .RelPermalink }}">Читать дальше...</a>
- </article>
- {{ end }}
-</div>
-{{ end }} \ No newline at end of file
diff --git a/themes/neonxp/layouts/section.html b/themes/neonxp/layouts/section.html
deleted file mode 100644
index 5d3a4ba..0000000
--- a/themes/neonxp/layouts/section.html
+++ /dev/null
@@ -1,26 +0,0 @@
-{{ define "main" }}
-<article>
- <h1>{{ .Title }}</h1>
- {{ .Content }}
-</article>
-<div class="h-feed">
-
- {{ range .Paginator.Pages }}
- <article class="h-entry">
- <h2 class="p-name"><a class="u-url" href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
- {{if .Date }}
- {{ $dateMachine := .Date | time.Format "2006-01-02 15:04:05-07:00" }}
- {{ $dateHuman := .Date | time.Format ":date_long" }}
- <time class="dt-published" datetime="{{ $dateMachine }}">{{ $dateHuman }}</time>
- {{end}}
- <div class="p-summary">
- {{ .Summary }}
- </div>
- <a class="btn-primary" href="{{ .RelPermalink }}">Читать дальше...</a>
- </article>
- {{ end }}
- <article>
- {{ template "_internal/pagination.html" . }}
- </article>
-</div>
-{{ end }} \ No newline at end of file
diff --git a/themes/neonxp/layouts/shortcodes/img.html b/themes/neonxp/layouts/shortcodes/img.html
deleted file mode 100644
index 994e30f..0000000
--- a/themes/neonxp/layouts/shortcodes/img.html
+++ /dev/null
@@ -1,21 +0,0 @@
-{{- $alt := .Get "alt" -}}
-{{- $res := .Page.Resources.Get (.Get "src") -}}
-
-{{- $ws := slice 480 800 -}}
-{{- $srcset := slice -}}
-{{- range $ws -}}
-{{- if (le . $res.Width) -}}
-{{- $w := printf "%dx" . -}}
-{{- $url := ($res.Resize $w).RelPermalink | safeURL -}}
-{{- $fmt := printf "%s %dw" $url . -}}
-{{- $srcset = $srcset | append $fmt -}}
-{{- end -}}
-{{- end -}}
-
-{{- $set := delimit $srcset "," -}}
-
-<figure>
- <img srcset="{{ $set }}" sizes="(max-width: 480px) 480px, 100vw" src="{{ $res.RelPermalink }}" alt="{{ $alt }}"
- height="auto" />
- <figcaption>{{ $alt }}</figcaption>
-</figure> \ No newline at end of file
diff --git a/themes/neonxp/layouts/taxonomy.html b/themes/neonxp/layouts/taxonomy.html
deleted file mode 100644
index ff8e552..0000000
--- a/themes/neonxp/layouts/taxonomy.html
+++ /dev/null
@@ -1,11 +0,0 @@
-{{ define "main" }}
-<article>
- <h1>{{ .Title }}</h1>
- {{ .Content }}
-</article>
-<article>
- {{ range .Pages }}
- <h2><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
- {{ end }}
-</article>
-{{ end }} \ No newline at end of file
diff --git a/themes/neonxp/layouts/term.html b/themes/neonxp/layouts/term.html
deleted file mode 100644
index c2e7875..0000000
--- a/themes/neonxp/layouts/term.html
+++ /dev/null
@@ -1,7 +0,0 @@
-{{ define "main" }}
- <h1>{{ .Title }}</h1>
- {{ .Content }}
- {{ range .Pages }}
- <h2><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
- {{ end }}
-{{ end }}
diff --git a/themes/neonxp/static/favicon.ico b/themes/neonxp/static/favicon.ico
deleted file mode 100644
index da16cb8..0000000
--- a/themes/neonxp/static/favicon.ico
+++ /dev/null
Binary files differ