diff options
| author | 2026-02-14 13:06:23 +0300 | |
|---|---|---|
| committer | 2026-02-14 13:06:23 +0300 | |
| commit | d8b5023d7269fd67374cf65a1372e374b41964e0 (patch) | |
| tree | 661c2901040fa3200e379d9ecfdd5ee941a867d6 | |
| parent | Пост про stplr (diff) | |
| download | blog-d8b5023d7269fd67374cf65a1372e374b41964e0.tar.gz blog-d8b5023d7269fd67374cf65a1372e374b41964e0.tar.bz2 blog-d8b5023d7269fd67374cf65a1372e374b41964e0.tar.xz blog-d8b5023d7269fd67374cf65a1372e374b41964e0.zip | |
New post, didaceted theme
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 по желанию. + +[](https://oc.neonxp.ru) + +``` +[](https://oc.neonxp.ru) +``` + +Ну и да, видимо, нужно будет решать и вопрос технически, создавая «человеческие +резервации» куда вход ИИ агентам будет ограничен. Как? Ну сейчас есть решения в +виде WAF которые проверяют на человечность тем, что запускают определённые +вычисления в браузере пользователя, предполагая, что для ИИ агента это будет +слишком накладно. Но как это поможет от агентов, которые управляют вполне себе +человеческим браузером на машине пользователя (тот же нашумевший OpenClaw) — не +понятно. Скорее всего, никак. Остаётся только пускать в загончик после +верификации участников через «сеть доверия», когда каждый участник однозначно +подтверждён другим участником. Да, как на олдскульных CryptoParty. Ну или +верификация через заведомо «доверенные центры сертификации людей» (да да, вход +по паспорту через ГосУслуги). Я не вижу других способов. + +Очень напоминает «чёрный заслон» из вселенной CyberPunk. + +О чём-то таком я уже писал некоторое время назад [^5]. Забавно, что мой +тогдашний текст, по сути, не утратил актуальности, а наоборот сегодня получил +подтверждение. + +[^5]: https://neonxp.ru/posts/2024-11-27-hyperlocality/ @@ -0,0 +1,5 @@ +module neonxp.ru + +go 1.25.7 + +require go.neonxp.ru/hugo/base v0.0.0-20260214100422-501283be1fc6 // indirect @@ -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= @@ -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> ({{$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>© 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 Binary files differdeleted file mode 100644 index da16cb8..0000000 --- a/themes/neonxp/static/favicon.ico +++ /dev/null |
