From dcdc0409189b5efa666d89001cf853b1f2eddb7c Mon Sep 17 00:00:00 2001 From: "E.Gavrilov" Date: Sun, 17 May 2026 19:09:30 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=B3=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=D0=B8=D1=82=D1=8C=20=D1=81=D0=B0=D0=B9=D1=82=20=D0=BA=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + README.md | 20 + web/.gitignore | 4 + web/.npmrc | 1 + web/app/articles/[slug]/page.jsx | 59 ++ web/app/globals.css | 282 ++++++ web/app/layout.jsx | 38 + web/app/page.jsx | 51 + web/data/articles.json | 184 ++++ web/lib/articles.js | 17 + web/next.config.mjs | 10 + web/package-lock.json | 914 ++++++++++++++++++ web/package.json | 18 + .../assets/illustrations/bitrix-offer-api.svg | 12 + .../illustrations/bitrix-photo-editor-ui.svg | 8 + .../illustrations/bitrix-photo-editor.svg | 8 + .../illustrations/bitrix-translit-api.svg | 12 + .../assets/illustrations/cover-virus.svg | 8 + .../assets/illustrations/ctfe-engine.svg | 8 + .../assets/illustrations/dconf-gc-cover.svg | 8 + web/public/assets/illustrations/dmd-win64.svg | 8 + .../assets/illustrations/firefox-timeout.svg | 8 + .../assets/illustrations/gc-large-pool.svg | 14 + .../assets/illustrations/gc-small-pools.svg | 11 + .../assets/illustrations/jquery-webpack.svg | 12 + .../assets/illustrations/php-ssl-cacert.svg | 8 + .../assets/illustrations/preg-match-all-d.svg | 12 + .../assets/illustrations/taskschd-action.svg | 22 + .../assets/illustrations/taskschd-run.svg | 19 + .../assets/illustrations/tilix-cover.svg | 8 + .../assets/illustrations/tilix-screenshot.svg | 24 + web/public/assets/illustrations/vibe-api.svg | 8 + .../assets/illustrations/vibe-async.svg | 8 + .../assets/illustrations/vibe-cover.svg | 8 + web/public/assets/illustrations/vibe-db.svg | 8 + web/public/assets/illustrations/vibe-diet.svg | 8 + .../assets/illustrations/vibe-dlang.svg | 8 + web/public/assets/illustrations/vibe-io.svg | 8 + web/public/assets/illustrations/vibe-web.svg | 8 + .../assets/media/-имени-e1495740674880.png | Bin 0 -> 47270 bytes .../assets/media/bitrix-foto-editor-1.jpg | Bin 0 -> 21727 bytes ...ped-WallpapersMania.nnm_.ru_vol141-087.jpg | Bin 0 -> 142303 bytes web/public/assets/media/i-880x660.jpg | Bin 0 -> 39568 bytes web/public/assets/media/logo.png | Bin 0 -> 9522 bytes web/public/assets/media/vibe.d.png | Bin 0 -> 40981 bytes web/public/assets/media/Без-имени.png | Bin 0 -> 37724 bytes web/scripts/buildDatabase.mjs | 583 +++++++++++ 47 files changed, 2456 insertions(+) create mode 100644 .gitignore create mode 100644 web/.gitignore create mode 100644 web/.npmrc create mode 100644 web/app/articles/[slug]/page.jsx create mode 100644 web/app/globals.css create mode 100644 web/app/layout.jsx create mode 100644 web/app/page.jsx create mode 100644 web/data/articles.json create mode 100644 web/lib/articles.js create mode 100644 web/next.config.mjs create mode 100644 web/package-lock.json create mode 100644 web/package.json create mode 100644 web/public/assets/illustrations/bitrix-offer-api.svg create mode 100644 web/public/assets/illustrations/bitrix-photo-editor-ui.svg create mode 100644 web/public/assets/illustrations/bitrix-photo-editor.svg create mode 100644 web/public/assets/illustrations/bitrix-translit-api.svg create mode 100644 web/public/assets/illustrations/cover-virus.svg create mode 100644 web/public/assets/illustrations/ctfe-engine.svg create mode 100644 web/public/assets/illustrations/dconf-gc-cover.svg create mode 100644 web/public/assets/illustrations/dmd-win64.svg create mode 100644 web/public/assets/illustrations/firefox-timeout.svg create mode 100644 web/public/assets/illustrations/gc-large-pool.svg create mode 100644 web/public/assets/illustrations/gc-small-pools.svg create mode 100644 web/public/assets/illustrations/jquery-webpack.svg create mode 100644 web/public/assets/illustrations/php-ssl-cacert.svg create mode 100644 web/public/assets/illustrations/preg-match-all-d.svg create mode 100644 web/public/assets/illustrations/taskschd-action.svg create mode 100644 web/public/assets/illustrations/taskschd-run.svg create mode 100644 web/public/assets/illustrations/tilix-cover.svg create mode 100644 web/public/assets/illustrations/tilix-screenshot.svg create mode 100644 web/public/assets/illustrations/vibe-api.svg create mode 100644 web/public/assets/illustrations/vibe-async.svg create mode 100644 web/public/assets/illustrations/vibe-cover.svg create mode 100644 web/public/assets/illustrations/vibe-db.svg create mode 100644 web/public/assets/illustrations/vibe-diet.svg create mode 100644 web/public/assets/illustrations/vibe-dlang.svg create mode 100644 web/public/assets/illustrations/vibe-io.svg create mode 100644 web/public/assets/illustrations/vibe-web.svg create mode 100644 web/public/assets/media/-имени-e1495740674880.png create mode 100644 web/public/assets/media/bitrix-foto-editor-1.jpg create mode 100644 web/public/assets/media/cropped-WallpapersMania.nnm_.ru_vol141-087.jpg create mode 100644 web/public/assets/media/i-880x660.jpg create mode 100644 web/public/assets/media/logo.png create mode 100644 web/public/assets/media/vibe.d.png create mode 100644 web/public/assets/media/Без-имени.png create mode 100644 web/scripts/buildDatabase.mjs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9774bf4 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.webarchive/ diff --git a/README.md b/README.md index e69de29..97e7f9c 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,20 @@ +ProgCode.Ru +=========== + +Structure: + +- `web/` — Next.js application. +- `web/data/articles.json` — article data used by the site. +- `web/public/assets/illustrations/` — SVG illustrations and article covers. +- `web/public/assets/media/` — raster images used by the site. +- `web/scripts/buildDatabase.mjs` — refreshes article data and generated assets from local source files. + +Useful commands: + +```bash +cd ~/tmp/progcode/web +npm install +node scripts/buildDatabase.mjs +npm run dev -- --port 3000 +npm run build +``` diff --git a/web/.gitignore b/web/.gitignore new file mode 100644 index 0000000..fa5fece --- /dev/null +++ b/web/.gitignore @@ -0,0 +1,4 @@ +.next +node_modules +out +*.log diff --git a/web/.npmrc b/web/.npmrc new file mode 100644 index 0000000..214c29d --- /dev/null +++ b/web/.npmrc @@ -0,0 +1 @@ +registry=https://registry.npmjs.org/ diff --git a/web/app/articles/[slug]/page.jsx b/web/app/articles/[slug]/page.jsx new file mode 100644 index 0000000..9d736ee --- /dev/null +++ b/web/app/articles/[slug]/page.jsx @@ -0,0 +1,59 @@ +import Link from 'next/link'; +import { notFound } from 'next/navigation'; +import { formatDate, getArticleBySlug, getArticles } from '../../../lib/articles'; + +export function generateStaticParams() { + return getArticles().map((article) => ({ slug: article.slug })); +} + +export async function generateMetadata({ params }) { + const { slug } = await params; + const article = getArticleBySlug(decodeURIComponent(slug)); + + if (!article) { + return { title: 'Статья не найдена' }; + } + + return { + title: `${article.title} | ProgCode.Ru`, + description: article.excerpt, + }; +} + +export default async function ArticlePage({ params }) { + const { slug } = await params; + const article = getArticleBySlug(decodeURIComponent(slug)); + + if (!article) { + notFound(); + } + + return ( +
+
+ + +
+
+
+ + {article.author} + {article.readingMinutes} мин +
+

{article.title}

+
+ {article.categories.map((category) => ( + {category} + ))} +
+
+ +
+ +
+
+
+ ); +} diff --git a/web/app/globals.css b/web/app/globals.css new file mode 100644 index 0000000..f665c57 --- /dev/null +++ b/web/app/globals.css @@ -0,0 +1,282 @@ +:root { + --bg: #f3f0e8; + --paper: #fffdfa; + --ink: #1e252d; + --muted: #64707d; + --line: #d8d0c2; + --accent: #216869; + --accent-2: #b4432a; + --code: #111827; +} + +* { + box-sizing: border-box; +} + +body { + margin: 0; + background: var(--bg); + color: var(--ink); + font-family: Arial, Helvetica, sans-serif; + line-height: 1.6; +} + +a { + color: inherit; +} + +img { + display: block; + max-width: 100%; +} + +.site-hero { + min-height: 360px; + background: + linear-gradient(90deg, rgba(20, 24, 28, 0.86), rgba(20, 24, 28, 0.35)), + url('/assets/media/cropped-WallpapersMania.nnm_.ru_vol141-087.jpg') center / cover; + color: #fff; + display: flex; + align-items: flex-end; +} + +.site-hero__inner { + width: min(1120px, calc(100% - 40px)); + margin: 0 auto; + padding: 72px 0 46px; +} + +.eyebrow { + margin: 0 0 10px; + color: var(--accent-2); + font-size: 12px; + font-weight: 700; + letter-spacing: 0; + text-transform: uppercase; +} + +.site-hero .eyebrow { + color: #f5b08c; +} + +h1, +h2, +h3 { + line-height: 1.15; + margin: 0; +} + +.site-hero h1 { + font-size: clamp(44px, 8vw, 82px); +} + +.site-description { + max-width: 680px; + margin: 18px 0 0; + color: #e5e7eb; + font-size: 20px; +} + +.articles-shell { + width: min(1120px, calc(100% - 32px)); + margin: 34px auto 64px; +} + +.articles-header, +.top-nav, +.meta-line, +.tag-list { + display: flex; + align-items: center; + gap: 12px; + flex-wrap: wrap; +} + +.articles-header { + justify-content: space-between; + margin-bottom: 20px; +} + +.articles-header h2 { + font-size: 34px; +} + +.articles-header > span, +.meta-line { + color: var(--muted); + font-size: 14px; +} + +.article-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 18px; +} + +.article-card { + min-height: 100%; + overflow: hidden; + border: 1px solid var(--line); + border-radius: 8px; + background: var(--paper); + text-decoration: none; + transition: transform 160ms ease, border-color 160ms ease, box-shadow 160ms ease; +} + +.article-card:hover { + border-color: #9f8f7a; + box-shadow: 0 12px 30px rgba(39, 33, 25, 0.12); + transform: translateY(-2px); +} + +.article-card > img { + width: 100%; + aspect-ratio: 16 / 9; + object-fit: cover; + border-bottom: 1px solid var(--line); + background: #fff; +} + +.article-card__body { + padding: 18px; +} + +.article-card h3 { + margin-top: 10px; + font-size: 22px; +} + +.article-card p { + color: var(--muted); +} + +.tag-list span { + border: 1px solid #c5bba9; + border-radius: 999px; + padding: 4px 10px; + background: #f8f5ee; + color: #5c4a37; + font-size: 13px; +} + +.article-page { + width: min(1040px, calc(100% - 32px)); + margin: 0 auto 72px; +} + +.top-nav { + padding: 22px 0; +} + +.top-nav a { + color: var(--accent); + font-weight: 700; + text-decoration: none; +} + +.article-hero { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(280px, 420px); + gap: 28px; + align-items: center; + padding: 28px 0 34px; + border-bottom: 1px solid var(--line); +} + +.article-hero h1 { + margin: 14px 0 18px; + font-size: clamp(34px, 6vw, 58px); +} + +.article-hero > img { + width: 100%; + border: 1px solid var(--line); + border-radius: 8px; + background: #fff; +} + +.article-content { + max-width: 820px; + margin: 34px auto 0; + font-size: 18px; +} + +.article-content h2 { + margin: 42px 0 14px; + font-size: 30px; +} + +.article-content h3 { + margin: 34px 0 12px; + font-size: 24px; +} + +.article-content p, +.article-content ul, +.article-content ol { + margin: 0 0 20px; +} + +.article-content a { + color: var(--accent); + text-decoration-thickness: 1px; + text-underline-offset: 3px; +} + +.article-content figure { + margin: 28px 0; +} + +.article-content figure img { + width: 100%; + border: 1px solid var(--line); + border-radius: 8px; + background: #fff; +} + +.article-content figcaption { + margin-top: 8px; + color: var(--muted); + font-size: 14px; +} + +.article-content pre { + overflow-x: auto; + border-radius: 8px; + margin: 26px 0; + padding: 18px 20px; + background: var(--code); + color: #e5e7eb; + font-size: 15px; + line-height: 1.55; +} + +.article-content code { + font-family: SFMono-Regular, Menlo, Consolas, monospace; +} + +.article-content :not(pre) > code { + border-radius: 4px; + padding: 2px 5px; + background: #ede6da; + color: #663c1f; + font-size: 0.92em; +} + +@media (max-width: 760px) { + .site-hero { + min-height: 320px; + } + + .site-description { + font-size: 17px; + } + + .article-hero { + grid-template-columns: 1fr; + } + + .article-content { + font-size: 16px; + } +} diff --git a/web/app/layout.jsx b/web/app/layout.jsx new file mode 100644 index 0000000..303de73 --- /dev/null +++ b/web/app/layout.jsx @@ -0,0 +1,38 @@ +import './globals.css'; +import Script from 'next/script'; + +export const metadata = { + title: 'ProgCode.Ru - блог программиста', + description: 'Статьи о PHP, Bitrix, JavaScript, D, Windows и практических задачах разработки.', +}; + +export default function RootLayout({ children }) { + return ( + + + + + {children} + + + ); +} diff --git a/web/app/page.jsx b/web/app/page.jsx new file mode 100644 index 0000000..12946f1 --- /dev/null +++ b/web/app/page.jsx @@ -0,0 +1,51 @@ +import Link from 'next/link'; +import { formatDate, getArticles } from '../lib/articles'; + +export default function HomePage() { + const articles = getArticles(); + + return ( +
+
+
+

Личный блог программиста

+

ProgCode.Ru

+

+ PHP, Bitrix, JavaScript, D, Windows и практические заметки из ежедневной разработки. +

+
+
+ +
+
+
+

Материалы

+

Статьи

+
+ {articles.length} записей +
+ +
+ {articles.map((article) => ( + + +
+
+ + {article.readingMinutes} мин +
+

{article.title}

+

{article.excerpt}

+
+ {article.categories.map((category) => ( + {category} + ))} +
+
+ + ))} +
+
+
+ ); +} diff --git a/web/data/articles.json b/web/data/articles.json new file mode 100644 index 0000000..47fe7b0 --- /dev/null +++ b/web/data/articles.json @@ -0,0 +1,184 @@ +[ + { + "slug": "использование-jquery-в-webpack", + "title": "JavaScript. Использование jQuery в Webpack", + "date": "2019-01-12T21:54:18+00:00", + "author": "DarkRiDDeR", + "categories": [ + "JavaScript" + ], + "cover": "/assets/illustrations/jquery-webpack.svg", + "excerpt": "Webpack является одним из самых мощных и гибких инструментов для сборки фронтенд-проектов. Иногда необходимо включить в проект Webpack одну из самых популярных JavaScript библиотек jQuery. Для начала необходимо установить jQuery из репозитория npm командой: np", + "contentHtml": "

Webpack является одним из самых мощных и гибких инструментов для сборки фронтенд-проектов. Иногда необходимо включить в проект Webpack одну из самых популярных JavaScript библиотек jQuery.

\n

Для начала необходимо установить jQuery из репозитория npm командой:

\n
npm i jquery
\n

либо (если используем менеджер пакетов Yarn):

\n
yarn add jquery
\n

Чтобы jQuery стал доступным в глобальной области видимости в «бандле» (собираемом пакете, от bundle) можно использовать ProvidePlugin (см. официальную документацию https://webpack.js.org/plugins/provide-plugin/):

\n\n
module.exports = {\n  plugins: [\n    new webpack.ProvidePlugin({\n      $: 'jquery',\n      jQuery: 'jquery'\n    }),\n  ]\n};
\n\n

Так библиотека jQuery будет доступна через глобальные переменные $, jQuery, window.jQuery.
\nИногда в проектах Webpack собираются несколько бандлов. Например, есть финальный скрипт, который подключается на все страницы и в нём необходима библиотека jQuery. А в других скриптах она уже не нужна, так как она будет уже подключена глобально. В таком случае только в модуле, который будет глобальным, необходимо подключить jQuery (для импорта модулей будем использовать стандарт ES6/ES2015):

\n\n
import $ from 'jquery';\n \nglobal.jQuery = $;\nglobal.$ = $;
\n\n

Также jQuery можно подключить в проект Webpack через CDN с помощью плагина html-webpack-externals-plugin (https://www.npmjs.com/package/html-webpack-externals-plugin):

\n\n
module.exports = {\n  plugins: [\n    new HtmlWebpackExternalsPlugin({ // optional plugin: inject cdn\n      externals: [\n        {\n            module: 'jquery',\n            entry: 'https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js'\n        }\n      ],\n    }),\n  ]\n};
\n\n

После чего можно использовать jQuery библиотеки, подключая их следующим образом:

\n\n
require("inputmask/dist/inputmask/jquery.inputmask.js");
\n

Итоговая схема подключения

\n

Для старого проекта jQuery в Webpack лучше подключать явно: установить пакет, импортировать его в точке входа и отдельно решить вопрос с глобальными переменными. ProvidePlugin удобен, когда в модулях встречаются свободные идентификаторы $ или jQuery. Но если старый плагин лезет именно в window.jQuery, одного ProvidePlugin может быть мало — нужно положить jQuery в window самостоятельно.

\n
import $ from 'jquery';\n\nwindow.$ = $;\nwindow.jQuery = $;
\n

После этого можно добавить ProvidePlugin, чтобы не писать импорт в каждом файле:

\n
const webpack = require('webpack');\n\nmodule.exports = {\n  plugins: [\n    new webpack.ProvidePlugin({\n      $: 'jquery',\n      jQuery: 'jquery',\n    }),\n  ],\n};
\n

Порядок подключения имеет значение. Сначала в entry-файле импортируем jQuery и кладём его в window, потом импортируем старые плагины, которым нужен глобальный объект. Если плагин подключается через require, делаем это после установки window.jQuery.

\n
import './jquery-global';\nimport 'inputmask/dist/jquery.inputmask';\nimport './app';
\n

Проверка простая: в браузерной консоли должны существовать window.$ и window.jQuery, а в собранном bundle не должно быть двух разных копий jQuery. Если проект новый, лучше не тащить jQuery без необходимости. Если проект старый и плагины уже написаны под jQuery, такая схема делает зависимость явной и предсказуемой.

", + "readingMinutes": 2 + }, + { + "slug": "bitrix-api-add-foto-editor", + "title": "Bitrix API. Вставка на страницу встроенного редактора картинок", + "date": "2018-10-19T01:50:29+00:00", + "author": "DarkRiDDeR", + "categories": [ + "Bitrix", + "PHP" + ], + "cover": "/assets/illustrations/bitrix-photo-editor.svg", + "excerpt": "В CMS Bitrix имеется довольно неплохой по функциональным возможностям и дизайну встроенный графический редактор картинок. Поэтому может возникнуть желании использовать его на сайте. Но как это сделать? На самом деле это не так сложно. Класс компонента графичес", + "contentHtml": "

В CMS Bitrix имеется довольно неплохой по функциональным возможностям и дизайну встроенный графический редактор картинок.
\n

\"Редактор
Редактор картинок Bitrix

\n

Поэтому может возникнуть желании использовать его на сайте. Но как это сделать? На самом деле это не так сложно. Класс компонента графического редактора является \\Bitrix\\Main\\UI\\FileInput и располагается в файле /bitrix/modules/main/lib/ui/fileinput.php

\n

Для вывода кода компонента необходимо создать экземляр класс с помощью статического метода createInstance. Затем получить код на вывод через метод show. Полный код вызова компонента будет иметь следующий вид:

\n\n
<?=\\Bitrix\\Main\\UI\\FileInput::createInstance([\n\t"name" => "picture",\n\t"description" => true,\n\t"upload" => true,\n\t"allowUpload" => "I",\n\t"medialib" => true,\n\t"fileDialog" => true,\n\t"cloud" => true,\n\t"delete" => true,\n\t"maxCount" => 1\n\t])->show($id);\n?>
\n\n

Переменная $id содержит идентификатор картинки в системе.

\n

Параметры:

\n\n

Также необходимо учитывать, что некоторые параметры будут работать только при определённых условиях, как, например, medialib и cloud.

\n

Завершение интеграции

\n

После вывода компонента важно не забыть обработать результат формы: сохранить ID файла, проверить тип загруженного файла и права пользователя. Сам редактор решает задачу интерфейса, но безопасность и привязка к сущности остаются на стороне вашего кода.

\n

В параметрах компонента отдельно проверьте allowUpload, medialib, fileDialog, cloud, delete, edit и maxCount. Не все параметры будут иметь эффект в любой установке Bitrix: часть зависит от подключённых модулей, прав пользователя и контекста страницы.

\n
$fileId = (int)$_POST['picture'];\n\nif ($fileId > 0) {\n    $file = CFile::GetFileArray($fileId);\n    if ($file && str_starts_with($file['CONTENT_TYPE'], 'image/')) {\n        // сохраняем ID картинки в своей сущности\n    }\n}
\n

Если редактор не открывается, проверьте подключение модулей main и fileman, права на загрузку, административные JS-расширения и наличие сессии пользователя. В публичной части сайта проблема часто оказывается не в FileInput, а в том, что на странице не подключены нужные скрипты Bitrix.

\n

Рабочая схема такая: выводим FileInput, разрешаем только картинки, ограничиваем количество, после отправки формы валидируем ID файла и сохраняем его в свою сущность. Тогда встроенный редактор становится нормальной частью формы, а не просто красивой кнопкой загрузки.

", + "readingMinutes": 2 + }, + { + "slug": "о-tilix-и-d-интервью-с-геральдом-нанном", + "title": "О Tilix и D: интервью с Геральдом Нанном", + "date": "2017-08-25T21:37:08+00:00", + "author": "DarkRiDDeR", + "categories": [ + "DLang", + "Интервью" + ], + "cover": "/assets/illustrations/tilix-cover.svg", + "excerpt": "Йоаким — интервьюер-резидент блога о D. Он также брал интервью у членов D-сообщества для This Week in D и ответственен за портирование LDC для Android . Геральд Нанн — разработчик Tilix (ранее называвшийся Terminix). Tilix— продвинутый тайлинговый эмулятор тер", + "contentHtml": "

Йоаким — интервьюер-резидент блога о D. Он также брал интервью у членов D-сообщества для  This Week in D и ответственен за портирование LDC для Android.

\n

Геральд Нанн — разработчик Tilix (ранее называвшийся  Terminix). Tilix— продвинутый тайлинговый эмулятор терминалов с открытым исходным кодом, который является самым «звёздным»  проектом на основе D на GitHub, недавно даже обогнавший стандартный компилятор D, DMD. В этом году на DConf в Берлине он рассказывал о том, как использует D. Имеются слайды и видео. В своей повседневной работе, которая не имеет ничего общего с настольными графическими приложениями, он является старшим разработчиком промежуточных решений в Red Hat. [Подробнее об истории Джеральда в расширенном интервью — Ред.]

\n

Йоаким: — Что такое тайлинговый эмулятор терминала?

\n

Геральд: — Тайлинговый эмулятор терминала позволяет разделить терминал на несколько частей и распределить их в удобном порядке и месте, что наиболее удобно при работе над конкретной задачей. Люди, которые работают на нескольких терминалах одновременно, как правило, находят такие инструменты наиболее полезными, особенно с постоянно увеличивающимися размерами мониторов и разрешений.

\n

Несмотря на то, что Tilix очень хорош, основной причиной, по которой я создал его, было то, что мне нужен был эмулятор терминала, который следовал бы концепции Gnome HIG (Human Interface Guidelines — рекомендации по созданию интуитивных, легко изучаемых и логичных интерфейсов взаимодействия с пользователем) и использовал CSD (Client-Side Decorations — отрисовку на стороне клиента). Tilix следует Gnome HIG, опубликованным здесь, что означает соблюдение интервалов, макетов и других рекомендаций. После HIG важно, чтобы приложение соответствовало всему рабочему столу в целом.

\n

CSD ссылается на заголовок окна, где не диспетчер дисплея, а пользователь берёт на себя ответственность за него и может заполнять панель заголовка кнопками и другими элементами управления. Это часть концепции Gnome HIG, и большинство приложений Gnome (gedit, файлы, видео) по умолчанию используют этот подход. Единственное исключением является gnome-terminal, который вообще не использует CSD.

\n

Й.: — Можете привести несколько примеров того, как вы используете концепцию Gnome HIG?

\n

Г.: — Gnome HIG определяет конкретный язык дизайна в отношении того, как приложения, работающие в Gnome, должны выглядеть и показывать себя. Некоторые примеры Tilix, следующие концепции HIG, включают использование CSD и меню приложений по рекомендациям, таким как интервалы, макеты и т.д. Кроме того, разработчики Gnome собрали множество макетов, как они думают, как должны выглядеть различные приложения. Tilix использует макеты, разработанные дизайнерами Gnome для терминала, где это возможно. Например, в Tilix диалог предпочтений и профилей использовался отдельно, однако один из дизайнеров Gnome предложил этот макет для gnome-терминала. Я пошел вперед и реализовал его в Tilix, гораздо лучше, чем раньше.

\n

В результате использования CSD и концепции Gnome HIG, надеюсь, что использование Tilix в Gnome более органичено для пользователей.

\n

Интересная вещь — это напряженность между людьми, которые используют Tilix на Gnome и тех, кто использует его в других дистрибутивах. Хотя я не имею никаких сомнений в том, что разработка под Gnome является моей основной целью, я стараюсь сделать Tilix лучше и в других средах рабочего стола, разрешив пользователю отключить CSD в пользу обычного заголовка, если они того пожелают.

\n

Й.: — Вы попали в D из среды Java. Вы все еще пишете код в стиле Java на D? Это было легко, т.е. сколько вам пришлось привыкать, чтобы писать на D?

\n

Г.: — Да, чаще всего работаю с Java. Я нашёл это довольно интересным на DConf, когда я спросил, как много людей пришли не из среды C/C++ , только один человек поднял руку.

\n

Если вы посмотрите на мой код в Tilix, то он очень похож на Java-код. Некоторое из этого связано с моей обычное средой, в которой я работаю, а некоторое из-за того, что GtkD является оболочкой классов.

\n

Я считаю, что переключение между D и Java является довольно плавным по большей части; между ними гораздо меньше когнитивного трения, чем, скажем, между переключением между Java и Python.

\n

Самая важная идиома D, которую мне пришлось изучить, — это диапазоны, поскольку они являются основополагающей особенностью D. Однако это не было сильно сложным.  Выполнение функций времени компиляции (CTFE) по-прежнему остаются для меня неестественными. Когда я использую их, мне приходится каждый раз искать про них информацию, и мои текущие попытки использования CTFE с точки зрения кода довольны глупы. Я хотел бы больше использовать CTFE в Tilix, поскольку я получаю всё больший опыт использования D.

\n

Наконец, мой недостаток опыта работы с C выявляет другую проблему, с которой я немного борюсь — это взаимодействие с кодом на C. Хотя по большей части это довольно просто, но, когда мне приходится расшифровывать что-то сложное, оно становится не таким простым. Поддержка FlatPak (система изолированных контейнеров для графических приложений) в настоящее время есть, так как мне не приходилось так сильно напрягаться по некоторым вопросам, с которыми я сталкивался на C.

\n

Сказав это, у меня есть некоторый опыт разработки собственного кода, поскольку много лет назад я потратил много времени на разработку кода на Delphi и Object Pascal. Именно на это и приходится большая часть моего опыта работы с графическим интерфейсом.

\n

Й.: — И из вашего выступления на DConf вы явное не беспокоились о сборщике мусора (GC). Вам приходилось думать о нём, когда вы разрабатывали Tilix? Имелись ли проблемы задержек с GUI, вызванные GC?

\n

Г.: — Придя из Java, GC для меня довольно естественен, и я определенно не считаю его плохим для D. Я думаю, что GC в D получает много плохой прессы на основе опыта Java, но важно помнить, что GC в D сильно отличается от того, что в Java. Самое большое различие для меня в том, что в D есть больше возможностей для его управления, так как он хорошо понимает, когда он может начать цикл GC. Я был очень рад видеть, как больше людей поднимают различные темы на reddit и форумах, жалуются на использование GC.

\n

У меня не было никаких проблем с GC с точки зрения пауз, и ни один пользователь Tilix не сообщал об этом. У меня было несколько проблем, связанных с GC, в основном связанных с утечкой памяти из-за хранения ссылок, но все они были ошибками программного кода, а не проблемой с реализацией GC в D. У меня есть другое приложение на GTK D, Visual Grep, где я столкнулся с ужасающей эффективностью при обработке большого количества совпадений в tight-цикле (цикл, который содержит несколько инструкций и повторяется много раз.). Тем не менее, просто отключив GC для этого раздела кода, ускорилось все.

\n

Й.: — Репозиторий github для Tilix замечательно чист, нет открытых запросов «pull request» (PR) и низкий процент проблем, которые все еще открыты. Сколько времени вы еженедельно тратите на Tilix? Является ли Tilix только хобби или он стал чем-то большим?

\n

Г.: — Tilix — это просто хобби. Я, вероятно, провожу от 5 до 10 часов в неделю. На данный момент — это зрелое приложение, следовательно, относительно небольшое количество проблем. Я также уделяю приоритетное внимание исправлению ошибок при добавлении новых функций, что помогает сохранить список управляемым.

\n

Что касается запросов на «pull request» (PR), я твердо убежден в том, что я должен быть отзывчивым, поэтому я, как правило, отвечаю на PR в течение дня или двух. В качестве участника разработок я знаю, что ничего не убивает интерес, как видеть, что ваш PR томится в течение нескольких недель, месяцев или даже лет. Если вы хотите, чтобы люди вносили свой вклад, что я определенно делаю, то я чувствую, что вы обязаны участникам разработки своевременно реагировать на их PR.

\n

На данный момент Tiltx — это относительно небольшой проект, поэтому мне легко принять этот подход. Я понимаю, почему более крупные проекты могут иметь больше проблем в этой области.

\n

Й.: — D имеет много особенностей, насколько хорошо вы их знаете? Вы упомянули, что хотите использовать некоторые из возможностей времени компиляции. Как вы думаете за счёт каких особенностей D и что Tilix выиграет в будущем и как?

\n

Г.: — Я не думаю, что знаю это, если честно, помимо основного набора особенностей, которые я использую в Tilix. Я всегда удивляюсь ребятам на форуме, которые могут утверждать достоинства/недостатки низкоуровневых деталей языка. Это определенно не я. Я бы хотел поправиться, но на самом деле я использую D только как хобби, поэтому я не могу тратить столько же времени, сколько и на Java. Кроме того, моя работа в Red Hat имеет больше компонентов инфраструктуры, чем мои предыдущие рабочие места, поэтому большая часть моего времени расходуется дома на обучение в этом направлении.

\n

Что касается возможностей, от которых Tilix выиграет, я думаю, что использование CTFE и диапазонов было бы очень полезно для того, чтобы улучшить некоторые моменты в GtkD более идиоматичным способом. У меня есть достаточное количество кода, где он может быть намного более кратким при соответствующем использовании CTFE. В качестве простого примера можно использовать диапазоны для поддержки итераций по различным артефактам с использованием foreach, а не классическим циклом. Тем не менее, я думаю, что некоторые из более сложных вариантов использования, таких как поддержка D-Bus (система межпроцессного взаимодействия, которая позволяет приложениям в операционной системе сообщаться друг с другом) и GObject, будут очень полезны.

\n

Для тех, кто не знаком с GObject — это объект базового уровня в GTK и является счётчиком ссылок. Возможность легко создавать GObjects в D, как можно и в Python, упростит взаимодействие с некоторыми из API; прямо сейчас это эквивалентно написанию его в сыром C, и это несколько трудоемко. Майк Вей, сопровождающий GtkD, начал делать некоторые работы над этим.

\n

Й.: — Вы упомянули на DConf, что D имеет быстрый цикл компиляции: как вы используете это, то есть какие IDE, компиляторы, toolchain (набор программ, необходимых для создания других программ) вы используете как для разработки, так и для выпуска релизов?

\n

Г.: — Я использую MS Visual Studio Code на Linux с отличным плагином code-d, написанным Jan «WebFreak» Jurzitza. Это дает мне все необходимые функции (автозаполнение кода, подсказки, рекомендации и т. Д.). Единственное, чего я не вижу, что есть в Java IDE, — это возможность рефакторинга. Для разработки я использую DMD, поскольку он имеет самое быстрое время компиляции. Сборку версий выполняю с использованием LDC, компилятора D с бэкэном LLVM, поскольку он генерирует меньшие и более быстрые двоичные файлы. Мне редко приходится запускать отладчик, но, когда я это делаю, я просто использую GDB из командной строки.

\n

Й.: — Какие проблемы у вас были с D? Какие его особенности вам не нравятся?

\n

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

\n

Никаких серьёзных проблем с Phobos, а скорее кучей раздражителей. Например, нельзя легко использовать immutable для отправки в std.concurrency, std.experimental.logger являющиеся все ещё экспериментальными, парсер json имеет проблемы, если в локализации установлена запятая для отделения десятичных знаков чисел и т.д. и т.п. Ни один из данных недочётов по себе не является особо важным, и большинство из скорее всего связаны из-за нехватки трудовых ресурсов. Я на самом деле несколько неохотно жалуюсь на них, потому что я, наверное, мог исправить их сам и отправить PR.

\n

Меня больше раздражает негативность на форумах в отношении GC. Я чувствую, что иногда люди так поворачиваются в сторону D, что хотят видеть его идеальным системным языком (т.е. без GC, без безопасности памяти и т.д.), упуская из виду, что он очень хороший язык для создания приложений на данный момент. Пока D сравнивают с Rust, в некотором смысле сравнение с Go для меня более интересно. Оба языка основаны на GC и оба начинали как системные языки, однако Go опирается на GC и «удваивается» (от переводчика: скорее всего имеется в виду рост популярности), добиваясь успеха. Один из продуктов Red Hat, который я поддерживаю, OpenShift, использует Kubernetes (проект Google) для управления кластером контейнеров Linux как единой системой, и он написан на Go.

\n

Я думаю, что как язык D намного превосходит Go, и мне хотелось, что мы бы заявляли об этом громче вместо постоянного отрицательного обсуждения системного программирования. На данный момент надо сказать ради справедливости, что Go имеет крупного корпоративного спонсора, в отличие от D, однако контраст в позиционировании по-прежнему интересен мне.

\n

Й.: — Каковы ваши будущие планы в отношении Tilix?

\n

Г.: — Две самые большие функции, которые я хотел бы добавить, это поддержка режима управления tmux и добавление возможности отображения боковой панели popout.

\n

Для тех, кто не знаком с tmux, это терминальный мультиплексор; это, по сути, терминальный разделитель, но внутри самого терминала. Он также поддерживает ряд других функций, но наиболее интересным является сохранение терминальных сеансов, находящихся вне терминала. Поскольку он работает в терминале, он немного ухудшает производительность, а с точки зрения графического интерфейса он не может использовать собственные виджеты, такие как полосы прокрутки. Чтобы смягчить это, он поддерживает так называемый режим управления, который позволяет ему интегрироваться с эмулятором тайлингово терминала для создания новых терминалов, т.е. подтерминалов внутри одного терминала, управляющихся за пределами tmux. Это значительно улучшает его производительность, позволяя пользователям использовать другие функции, поддерживаемые tmux. На данный момент поддерживается только iterm2 на OSX насколько мне известно.

\n

Боковая панель в Tilix является одним из наиболее противоречивых элементов интерфейса. Я решил не реализовывать интерфейс с вкладками, потому что я счел их бесполезными с точки зрения поиска открытия необходимой вкладки; там просто недостаточно места для вкладок, чтобы отличить их, и переименовывать их вручную — это «боль». Боковая панель — это моя попытка альтернативы, она отображает миниатюру каждого сеанса (известную также как ярлык) на боковой панели, которая может быть убрана по мере необходимости для переключения между сеансами.

\n

\"Боковая
Боковая панель Tilix в действии

\nБоковая панель Tilix в действии.

\n

У некоторых людей есть сильное предпочтение к тому, что постоянно доступно, но, к сожалению, все, что видно на боковой панели, непросто, так как генерация эскизов занимает значительное количество времени из-за структуры GTK. Существуют потенциальные способы заставить это работать быстрее, но требуется время на то, чтобы попробовать разные варианты, чтобы увидеть, что как отображается, а затем, что наиболее эффективно.

\n

В мечтах, я бы хотел переключиться на использование эмулятора терминала, написанного изначально в D, а не GTK VTE (Virtual Terminal Emulator), который написан на C, и который я использую сейчас. Для тех, кто не знаком с ним, VTE — это виджет эмуляции терминала, используемый терминалом Gnome и доступен в виде многоразового виджета. Многие эмуляторы терминала в Linux используют этот виджет (gnome-terminal, guake, terminator, tilix и т.д.), поскольку он обеспечивает полностью готовый к работке эмулятор, который прошел через огромное количество тестов.

\n

Недостатком этого является то, что любые пользовательские функции, которые вы хотите реализовать, которые включают фактический уровень эмуляции терминала, требуют модификации VTE и получения этих изменений вверх по потоку (*upstream). У меня есть несколько патчей, которые Tilix поддерживает (для триггеров и значков), но, честно говоря, я провёл плохую работу по внедрению вверх по потоку (*upstream). Частично это связано с тем, что VTE написано на C и сделать быстрый и качественный патч на C занимает достаточно много времени.

\n

Таким образом, наличие эмуляции терминала, написанного на D, сделало бы это намного проще, однако это огромные инвестиции времени, поскольку люди недооценивают объем работы. В эмуляции терминала много сложных случаев, плюс добавление всего материала, чтобы сделать его удобным для пользователей (поиск, клики по ссылкам и т.д.), это много, чтобы взять на себя. У меня просто нет времени, чтобы сделать это реальностью, если только я не выиграю в лотерею. Если кто-то захочет взять на себя это роль и создать виджет эмуляции терминала GTK, который имеет все необходимые функции и поддерживал бы его в течение длительного времени, я был бы рад работать с ним, чтобы интегрировать его с Tilix. Адам Рапп уже создал один, который работает достаточно хорошо по моим тестам; если кто-то хочет работать над преобразованием его в виджет GTK, добавит необходимые улучшения и согласится его поддерживать, то пусть не стесняется писать и надоедать сообщениями (*ping) мне. ?

\n

Й.: — Пожалуйста, расскажите из своего опыта, как вы впервые обнаружили D и использовали его для написания Tilix?

\n

Г.: — На протяжении всей моей карьеры я всегда имел хобби. Некоторые вещи, над которыми я работал, включали популярную надстройку для Delphi под названием Gexperts, замену проводника файлов Windows, Java IDE под названием Gel и популярное приложение для Android под названием OnTrack Diabetes, которое я продал несколько лет назад. Пару лет назад я искал что-то новое для работы в качестве моей программы в качества хобби и остановился на идее создания десктопного приложения для Linux. Я знал, что нужно использовать инструментарий GTK, так как Gnome — моя предпочтительная среда рабочего стола, и особенно с моим прошлым опытом Delphi в графических интерфейсах, которые я мог бы использовать. Я также знал, что меня не интересует разработка на C или C ++, поэтому я посмотрел, какие альтернативы были.

\n

Я начал с Python, так как у него отличная поддержка GTK, и я немного поработал над программированием Jython в WebLogic, так как я использовал Weblogic Scripting Tool (WLST). Однако большая часть моей предыдущей работы была небольшими сценариями, и я быстро понял, что в больших масштабах Python не для меня. Я вообще предпочитаю статически типизированные языки, и динамический набор текста на Python приводил меня в замешательство, особенно в качестве хобби, где я постоянно нуждался в использование справочных материалов, так как я работал на нем нечасто.

\n

Я также смотрел в сторону Rust и Go, но в то время ни у одного из них не было полнофункциональных GTK-привязок. Кроме того, в то время у Rust было много позитивной прессы, но у него был плохой материал для убеждения в правильности его подхода, и я был не так сильно убежден в том, что управление безопасностью памяти с помощью контролера заимствований было лучшим подходом, чем GC.

\n

Я знал о D, поскольку я посматривал на D много лет назад и полюбил этот язык, но экосистема была настолько слабой, что это было не сильно полезно для практической работы. Я взглянул на него снова и обнаружил, что он значительно улучшился и даже удивительно: были доступны полные привязки GtkD. Это также помогло тому, чтобы D и Java были достаточно похожи, и чтобы собирать на D было невероятно легко. Как только я узнал, как работают диапазоны, было легко начать кодить.

\n

Сначала я создал небольшое приложение под названием Visual Grep, которое переносит grep в графический интерфейс. Когда я консультировался, мне часто приходилось собирать большие базы кода, ищущие конкретные шаблоны, и графический интерфейс, который делал просмотр шаблонов, был абсолютной необходимостью. Это было отличное первое приложение, так как я узнал немало вещей о D. Производительность приложения была изначально плохой с большими наборами результатов, потому что GC постоянно был перегружен при загрузке результатов из-за постоянного распределения. Отключение GC во время этого tight-цикла улучшило производительность неизмеримо. Я также узнал об интеграции GTK с возможностями многопоточности D.

\n

Я был вдохновлен пользовательским интерфейсом от Gnome Builder IDE, и подумал, что он хорошо подойдёт для эмулятора терминала. Таким образом, Tilix родился. Ну, на самом деле сначала он назывался Terminix, но как только он начал получать популярность, я получил вежливую просьбу на переименование из-за компании Terminix, американской компании по борьбе с вредителями. Будучи канадцем, я не слишком хорошо их знал, поэтому я не много думал об этом имени. Извлеченный урок: потратьте время на выбор хорошего имени, если ваше приложение станет более популярным, чем вы ожидаете.

\n

Я наслаждаюсь временем, проведённым с D, и это отличный язык для создания настольных приложений в GTK. Во многих отношениях, я чувствую, что D является естественным преемником Vala, который был языком, созданным специально для создания приложений GTK, но постепенно умирающим, в основном из-за его узкой направленности. Если вы не создаёте приложения GTK, вы не используете Vala, что означает, что количество людей, использующих его и работающий над ним, по определению очень мало.

\n

Я также считаю, что D является естественным преемником Delphi, по крайней мере с GtkD, как мощным инструментом для создания настольных приложений. Благодаря быстрому времени компиляции и легкому изучению языка, он приносит множество лучших атрибутов Delphi в современную эпоху. Плюс я могу ввести {и} вместо Begin и End и увеличить свою эффективность на 75% или около того. ?

\n

Оригинал (англ.) http://dlang.org/blog/2017/08/11/on-tilix-and-d-an-interview-with-gerald-nunn/

\n

Что вынести из интервью

\n

Главный практический вывод прост: D может быть не только системным языком, но и удобным языком для прикладных desktop-инструментов. Tilix показывает, что связка D, GtkD и аккуратного следования GNOME HIG способна дать зрелое приложение, которым пользуются каждый день.

\n

В интервью хорошо видно, что выбор языка был не религиозным, а практическим. Автору не хотелось писать GUI на C или C++, Python оказался неудобен для крупного статически проверяемого приложения, а D дал знакомую после Java модель, нативную скорость и нормальные GTK-привязки. Это важный критерий выбора технологии: не «самый модный язык», а язык, на котором конкретный автор может быстро и спокойно делать продукт.

\n

Если хочется повторить такой путь, начинать стоит не с большого терминала, а с маленькой GTK-утилиты: окно, настройки, несколько действий, сборка через DUB, упаковка и обновления. На таком проекте сразу проявятся реальные вопросы: работа с GtkD, структура проекта, взаимодействие с C-библиотеками, обработка событий и паузы GC.

\n\n

Именно поэтому интервью полезно не только поклонникам D. Оно показывает нормальный инженерный путь: выбрать задачу, подобрать инструмент, сделать небольшую работающую версию, а затем постепенно доводить приложение до зрелого состояния.

", + "readingMinutes": 19 + }, + { + "slug": "bitrix-api-функция-для-генерации-кода-элемент", + "title": "Bitrix API. Функция для генерации кода элемента из имени через транслит", + "date": "2017-08-15T16:35:54+00:00", + "author": "DarkRiDDeR", + "categories": [ + "Bitrix", + "PHP" + ], + "cover": "/assets/illustrations/bitrix-translit-api.svg", + "excerpt": "Часто в Bitrix необходимо сгенерировать код элемента из имени. Привожу пример реализации именно такой функции с помощью функции Bitrix API для транслита CUtil::translit :", + "contentHtml": "

Часто в Bitrix необходимо сгенерировать код элемента из имени.
\nПривожу пример реализации именно такой функции с помощью функции Bitrix API для транслита CUtil::translit:

\n\n
function strToElementCode($str, $maxLength = 100) {\n\t$params = array(\n\t\t\t"max_len" => $maxLength,\n\t\t\t"change_case" => "L",\n\t\t\t"replace_space" => "_",\n\t\t\t"replace_other" => "_",\n\t\t\t"delete_repeat_replace" => "true",\n\t\t\t"use_google" => "false",\n\t\t);\n\treturn CUtil::translit($str, "ru", $params);\n}
\n

Как использовать функцию безопасно

\n

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

\n
telefon-samsung\ntelefon-samsung-2\ntelefon-samsung-3
\n

Также стоит сразу нормализовать результат: привести к нижнему регистру, заменить пробелы на дефис, убрать повторяющиеся дефисы и обрезать дефис в начале или конце строки. Это мелочь, но именно такие мелочи потом портят адреса страниц.

\n
$code = CUtil::translit($name, 'ru', [\n    'replace_space' => '-',\n    'replace_other' => '-',\n    'change_case' => 'L',\n]);\n\n$code = trim(preg_replace('/-+/', '-', $code), '-');
\n

Проверку уникальности лучше делать в том же инфоблоке, где будет создан элемент. Если сайт многоязычный или есть разделы с одинаковыми товарами, заранее решите правило: уникальность на весь инфоблок или только внутри раздела. Для SEO обычно проще и надёжнее уникальность на весь инфоблок.

\n

В итоге функция должна не просто транслитерировать строку, а возвращать готовый символьный код: чистый, нижнего регистра, без мусора и без совпадений с уже существующими элементами.

", + "readingMinutes": 1 + }, + { + "slug": "bitrix-api-создание-добавление-торгового-пре", + "title": "Bitrix API. Создание (добавление) торгового предложения товара", + "date": "2017-08-14T17:02:36+00:00", + "author": "DarkRiDDeR", + "categories": [ + "Bitrix", + "PHP" + ], + "cover": "/assets/illustrations/bitrix-offer-api.svg", + "excerpt": "Хороший пример создания (добавления) торгового предложения в Bitrix через API :", + "contentHtml": "

Хороший пример создания (добавления) торгового предложения в Bitrix через API:

\n\n
use \\Bitrix\\Main\\Loader;\n \nif (!Loader::includeModule('iblock') || !Loader::includeModule('catalog'))\n{\n\tdie('Error loading module iblock or catalog');\n}\n \n$IBlockOffersCatalogId = 3; // ID инфоблока предложений (должен быть торговым каталогом)\n$productName = "Товар"; // наименование товара\n$offerName = "Торговое предложение"; // наименование торгового предложения\n$offerPrice = 100.50; // Цена торгового предложения\n \n \n$arCatalog = CCatalog::GetByID($IBlockOffersCatalogId);\n \n$IBlockCatalogId = $arCatalog['PRODUCT_IBLOCK_ID']; // ID инфоблока товаров\n$SKUPropertyId = $arCatalog['SKU_PROPERTY_ID']; // ID свойства в инфоблоке предложений типа "Привязка к товарам (SKU)"\n \n$obElement = new CIBlockElement();\n$arFields = array(\n   'NAME' => $productName,\n   'IBLOCK_ID' => $IBlockCatalogId,\n   'ACTIVE' => 'Y'\n);\n$productId = $obElement->Add($arFields); // добавили товар, получили ID\n \nif ($productId)\n{\n\t$obElement = new CIBlockElement();\n\t// свойства торгвоого предложения\n\t$arOfferProps = array(\n\t\t$SKUPropertyId => $productId,\n\t);\n\t$arOfferFields = array(\n\t\t'NAME' => $offerName,\n\t\t'IBLOCK_ID' => $IBlockOffersCatalogId,\n\t\t'ACTIVE' => 'Y',\n\t\t'PROPERTY_VALUES' => $arOfferProps\n\t);\n \n\t$offerId = $obElement->Add($arOfferFields); // ID торгового предложения\n \n\tif ($offerId)\n\t{\n\t\t// добавляем как товар и указываем цену\n\t\t$catalogProductAddResult =\tCCatalogProduct::Add(array(\n\t\t\t\t"ID" => $offersId,\n\t\t\t\t"VAT_INCLUDED" => "Y", //НДС входит в стоимость\n\t\t\t));\n\t\tif ($catalogProductAddResult && !CPrice::SetBasePrice($offerId, $offerPrice, "RUB"))\n\t\t\tthrow new Exception("Ошибка установки цены торгового предложения \\"{$offerId}\\"");\n\t\telse\n\t\t\tthrow new Exception("Ошибка добавления параметров торгового предложения \\"{$offerId}\\" в каталог товаров");\n\t}\n\telse\n\t{\n\t\tthrow new Exception("Ошибка добавления торгового предложения: " . $obElement->LAST_ERROR);\n\t}\n}\nelse\n{\n\tthrow new Exception("Ошибка добавления товара: " . $obElement->LAST_ERROR);\n}
\n

Что проверить после создания предложения

\n

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

\n\n

Минимальная последовательность такая: создать элемент торгового предложения в инфоблоке SKU, записать связь с товаром, сохранить параметры товара, установить цену, установить количество. Если хотя бы один шаг пропущен, предложение может быть видно в админке, но не попадёт в публичный каталог.

\n
CModule::IncludeModule('iblock');\nCModule::IncludeModule('catalog');\n\n$offerId = $el->Add($fields);\nCCatalogProduct::Add([\n    'ID' => $offerId,\n    'QUANTITY' => 10,\n]);\nCPrice::SetBasePrice($offerId, 990, 'RUB');
\n

На боевом проекте обязательно логируйте результат Add и текст ошибки LAST_ERROR. Bitrix часто молча возвращает false, а настоящая причина находится именно там: обязательное поле, неправильный инфоблок, неверный код свойства или недостаточные права.

", + "readingMinutes": 2 + }, + { + "slug": "firefox-увеличение-ожидания-загрузки-timeout-стр", + "title": "Firefox. Увеличение ожидания загрузки (timeout) страницы.", + "date": "2017-08-04T16:24:11+00:00", + "author": "DarkRiDDeR", + "categories": [ + "Firefox", + "Настройки" + ], + "cover": "/assets/illustrations/firefox-timeout.svg", + "excerpt": "При выполнении каких-либо ресурсоёмких операций на интернет ресурсах, когда время отклика может переваливать за минуты, а то и больше, браузеры прерывают соединение и сообщают, что сервер не доступен. К таким операция, например, можно отнести выгрузку дампа ба", + "contentHtml": "

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

\n

К таким операция, например, можно отнести выгрузку дампа базы данных в phpmyadmin, парсинг больших файлов и прочее.

\n

Максимальное время ожидания (timeout) в браузерах по умолчанию обычно настроено на несколько минут. В браузере Firefox, если я не ошибаюсь, это значение равно 5 минут.

\n

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

\n

Благо данную настройку в Firefox можно изменить. Для этого:

\n
    \n
  1. Открываем новую вкладку
  2. \n
  3. В адресной строку пишем «about:config» и нажимаем Enter
  4. \n
  5. Соглашаемся с сообщением о риске
  6. \n
  7. В поле поиска вводим параметр «network.http.response.timeout»
  8. \n
  9. Двойным нажатием открываем окно настройки данного параметра
  10. \n
  11. Вводим необходимое время в секундах, например, 1800 (пол часа)
  12. \n
  13. Нажимаем ОК и закрываем вкладку.
  14. \n
\n

P.S. Иногда данная опция оказывается даже очень полезной. В небезызвестном браузере Chrome данный параметр для настройки отсутствует.

\n

Когда лучше не увеличивать timeout

\n

Увеличение ожидания помогает при разовых административных операциях, но не должно маскировать медленный сайт. Если обычная страница требует минуты, правильнее вынести задачу в фон: очередь, cron, прогресс-бар и отдельная проверка статуса.

\n

Важно не путать разные таймауты. Ожидание HTTP-ответа — это одно, долго выполняющийся JavaScript на странице — другое, а таймауты прокси или веб-сервера — третье. Если Firefox ждёт дольше, но nginx, Apache, PHP-FPM или upstream уже оборвал соединение, настройка браузера не поможет.

\n\n

Если параметра в about:config нет, его можно создать вручную только тогда, когда вы понимаете, какая версия Firefox и какой именно timeout вам нужен. После завершения работы лучше вернуть настройку к обычному значению, чтобы браузер не висел слишком долго на реально недоступных сайтах.

\n

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

", + "readingMinutes": 2 + }, + { + "slug": "ошибка-php-ssl-certificate-error-unable-to-get-local-issuer-certificate", + "title": "Ошибка PHP. SSL certificate error: unable to get local issuer certificate", + "date": "2017-07-12T23:20:53+00:00", + "author": "DarkRiDDeR", + "categories": [ + "PHP", + "SSL" + ], + "cover": "/assets/illustrations/php-ssl-cacert.svg", + "excerpt": "В PHP при загрузке или обмене данными с другим сервером через защищённое соединение может возникнуть ошибка: SSL certificate error: unable to get local issuer certificate Ошибка означает, что на сервере не установлен SSL сертификат. Чаще всего она наблюдается,", + "contentHtml": "

В PHP при загрузке или обмене данными с другим сервером через защищённое соединение может возникнуть ошибка:

\n

SSL certificate error: unable to get local issuer certificate

\n

Ошибка означает, что на сервере не установлен SSL сертификат.

\n

Чаще всего она наблюдается, когда мы ставим локальные платформы (сервера) быстрого развёртывания для веб-разработки, таких как WAMP, XAMPP и других.

\n

Для решения проблемы нам необходимо установить SSL сертификат.

\n

Сертификат, например, можно взять отсюда (чтобы самим не генерировать ;):

\n

https://curl.haxx.se/docs/caextract.html

\n
    \n
  1. Скачиваем сертификат помещаем в папку C:\\wamp\\cacert.pem
    \n(у меня установлен WAMP, рекомендую)
  2. \n
  3. Включаем в  Apache mod_ssl.
  4. \n
  5. Добавляем расширение (ну или раскомментируем строчку) в файле php.ini:
    \nextension=php_openssl.dll
  6. \n
  7. Добавляем в php.ini также параметры:
    \ncurl.cainfo=»C:/wamp/cacert.pem»
    \nopenssl.cafile=»C:/wamp/cacert.pem»
  8. \n
\n

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

\n

Финальная проверка настройки

\n

После подключения файла сертификатов перезапустите веб-сервер или PHP-FPM и выполните тестовый HTTPS-запрос из того же окружения, где возникала ошибка. Важно проверять не браузер, а именно PHP: CLI и веб-сервер могут использовать разные php.ini.

\n
php --ini\nphp -i | grep -E \"curl.cainfo|openssl.cafile\"\nphp -r \"var_dump(file_get_contents('https://example.com') !== false);\"
\n

Для cURL указывается curl.cainfo, для потоков OpenSSL — openssl.cafile. На Windows путь лучше писать полностью и без относительных директорий. Если используется не глобальный php.ini, а отдельная настройка клиента, можно передать CA bundle прямо в cURL:

\n
curl_setopt($ch, CURLOPT_CAINFO, 'C:\\php\\extras\\ssl\\cacert.pem');
\n

Не отключайте проверку SSL через CURLOPT_SSL_VERIFYPEER = false как постоянное решение. Это скрывает проблему и делает соединение уязвимым. Такая настройка допустима только для короткой диагностики в локальной среде, и после проверки её нужно вернуть обратно.

\n

Если CA bundle указан верно, но ошибка осталась, проверьте цепочку сертификатов на стороне удалённого сервера. Иногда браузер открывает сайт, потому что умеет достраивать цепочку, а PHP/cURL получает неполную цепочку и честно падает. В таком случае исправлять нужно сертификаты сервера, а не PHP-код.

\n

Правильный итог: актуальный cacert.pem, явно указанные curl.cainfo и openssl.cafile, перезапуск PHP и тест именно из того окружения, где работает приложение.

", + "readingMinutes": 2 + }, + { + "slug": "dconf-2017-под-капотом-мусорщика-ди-дмитрий-ол", + "title": "DConf-2017. Под капотом мусорщика D (Дмитрий Ольшанский)", + "date": "2017-06-24T00:48:13+00:00", + "author": "DarkRiDDeR", + "categories": [ + "DLang", + "GC" + ], + "cover": "/assets/illustrations/dconf-gc-cover.svg", + "excerpt": "DConf-2017. Дмитрий Ольшанский. 2017 июня 14 дня. Оригинал (англ.): http://olshansky.me/gc/runtime/dlang/2017/06/14/inside-d-gc.html Перевод: Глеб Куликов Оригинал перевода: https://yadi.sk/i/dftROrt33KLww6 Небольшие правочки: DarkRiDDeR Во время проходившего ", + "contentHtml": "

DConf-2017. Дмитрий Ольшанский. 2017 июня 14 дня.

\n

Оригинал (англ.): http://olshansky.me/gc/runtime/dlang/2017/06/14/inside-d-gc.html
\nПеревод: Глеб Куликов
\nОригинал перевода: https://yadi.sk/i/dftROrt33KLww6
\nНебольшие правочки: DarkRiDDeR

\n

Во время проходившего на конференции DConf-2017 хакатона, я самоуверенно возглавил группу из двух человек, хакающих Ди’шный сборщик мусора (GC). После нескольких часов я уже не мог избавиться от навязчивой мысли «эгей, парень, это надо бы переписать!». Так что я решил отправиться в квест в поисках лучшего мусорщика для Ди, где первым шагом стал бы более быстрый, клаcсический сборщик, отмечающий достижимые объекты (mark-sweep).

\n

Для пояснения моих мотивов, я намерен описать внутренности современного сборщика, отмечая промахи архитектуры. В конце концов, надо же понять, «куды тыкать»!

\n

Пулы, везде пулы!

\n

Игнорируя излишние детали, мусорщик — это просто массив объектов пула. Каждый пул — это кусочек отображённой (mmap) памяти + немного метаданных в куче (таблиц маркирующих бит, освобождающих бит ну и так далее). Выделение памяти происходит внутри пула. Если одиночный пул не в состоянии обслужить выделение памяти, заводится новый пул. Размер пула определяется арифметической прогрессией от числа пулов (или 150% от размера выделения, смотря, что окажется больше).

\n

Важно, что пулы бывают двух типов, для больших и маленьких объектов. В «маленьких» пулах выделяются объекты размером до 2 Кб, всё остальное обслуживается «большими» пулами. На самом деле, маленькие пулы более интересны, так что давайте на них первым делом и взглянем.

\n

\"Пулы
Пулы малых объектов в GC D

\n

Прежде всего, размер памяти для любого маленького выделения округляется до подходящего (по степеням двойки) класса размера — 16, 32, 64, 128, 256, 512, 1024, 2048. Затем для данного размера проверяется глобальный список свободных блоков и, если такового найти не получается, продолжается поиск маленького пула.

\n

Маленький пул выделит новую страницу памяти и внесёт её в список свободных блоков данного размера. Вот и «вылезла» первая большая ошибка существующей архитектуры: класс размера назначается на страничной основе, поэтому нам требуется таблица (чтобы жизнь мёдом не казалась, называемая таблицей страниц), ставящая в соответствие каждому классу размера соответствующую страницу. Теперь, чтобы найти начало объекта по внутреннему указателю, мы сперва ищем страницу, к которой он принадлежит, затем ищем класс размера и, наконец, накладываем битовую маску. Более того, метаданные представляют собой кучу простых битовых таблиц, которые теперь должны покрывать страницы разного размера, поэтому на каждые 16 байт требуется примерно 7 бит независимо от размера объекта.

\n

Чем была обусловлена эта архитектура? У меня на этот счёт есть две гипотезы. Первая связана с нежеланием резервировать память для недоиспользуемых пулов (что, на самом деле, не является проблемой, так как для виртуальной памяти работает ленивая фиксация). Вторая — с опасениями получить слишком много пулов, замедлив выделение и полезную маркировку. Последнее больше похоже на причину, так как во время фазы маркировки, мусорщик действительно довольно часто производит линейное сканирование по пулам и бинарный поиск для каждого предполагаемого указателя (!).

\n

Вот и вторая ошибка: поиск пула за log(P), где P — число пулов, и соответственно, отметка за N*log(P). Хэш–таблица могла бы малость сэкономить циклы.

\n

Завершая наш обзор маленького пула, мы также должны взглянуть на выбор классов размеров. Это третья погрешность (не ошибка, скорее, спорный выбор): размеры, следующие степеням двойки, гарантируют нам внутреннюю фрагментацию, доходящую до 50 %. Современные выделители, подобные jemalloc’у, обычно предлагают ещё один класс, размер которого лежит между степеням двойки. Деление по модулю на константу, не являющуюся степенью двойки, несколько медленнее одиночного битового, но и вполне приемлемо.

\n

\"Пул
Пул больших объектов в GC D

\n

Давайте взглянем на пулы больших объектов. Первое, что нужно заметить, так это гранулярность страницы памяти (4 КБ) как для метаданных, так и собственно выделений памяти. Наборы свободных страниц внесены в один список, который линейно сканируется при каждом запросе на выделение памяти. Это четвёртая ошибка, которая, впрочем, не оказывает влияния на производительность выделения больших объектов. Для поиска начала объекта организована отдельная таблица, в которой для каждой страницы хранится индекс начала объекта, к которой он принадлежит.

\n

Схема разумна до тех пор, пока не коснётся больших (более 100 МБ) выделений памяти. В этом случае, скорее всего, не удастся перераспределить память «по месту», в результате чего будет выделен новый пул и огромный объём памяти метаданных будет истрачен на всего один объект.

\n

Процесс сбора

\n

До сих пор мы наблюдали конвейер выделения памяти, освобождение проходит примерно также. Более интересен автоматический возврат памяти, который и является смыслом сборщика мусора. Прежде всего позвольте мне отметить очевидное: во первых, сборщик мусора в Ди является консервативным, то есть, он не знает, является ли что-то указателем или нет. Во-вторых, он поддерживает финализаторы — действия, которые выполняются на объекте, прежде чем возвратить его память в общий пул. Эти два решения сильно ограничивают архитектуру сборщика.

\n

С точки зрения высокого уровня, процесс сборки, как ни странно, представляет собой целостный 4-фазный процесс: подготовка — полная маркировка – подчистка — возврат памяти.

\n

Стадия подготовки даёт наибольшие основания для сомнений. В сущности, для предотвращения сканирования свободной памяти, на этой стадии следовало бы скопировать биты–признаки свободных блоков в биты–признаки отметок. Однако всю малину портит то, что требуется вычислить полное свободное место, для чего перебрать списки свободных блоков. Это уже пятая(хм?) ошибка, потому что резкое распутывание бессчётного количества указателей — явно последнее, что нужно сделать во время «приостановки мира». Лучшей архитектурой было бы переворачивание битов–признаков свободных блоков во время выделения / освобождения памяти, тем более, что список свободных блоков поддерживает указатели на пул для каждого объекта, так что искать нужный пул не потребуется.

\n

Фаза маркировки сводится, на самом деле, к вызову MarkAll, который просто передаёт подходящие участки памяти в маркировочную функцию, заслуживающую более пристального рассмотрения.

\n\n

Собственно, это всё, что нужно сказать о функции пометки, не считая забавных манипуляций с ограничением на стек (для того, чтобы избежать переполнения стека всё ещё пытаемся использовать выделение стека).

\n

Упомянутый ранее поиск пула — далеко не единственный недостаток. Имеющее место смешение несканируемой памяти (без указателей) и нормальной памяти в одном и том же пуле, приводит к необходимости дополнительного просмотра битовой таблицы. А ведь если бы мы разделили пулы по классам размеров, можно было бы с лёгкостью избежать просмотра таблицы страниц. Не стоит даже упоминать сомнительную оптимизацию, касающуюся бита–признака «без внутреннего указателя», которая мало того, что делает код небезопасным (объект может быть сметён в мусор, хотя на него всё ещё ссылаются), но ещё и вводит несколько дополнительных проверок по критическому пути для всех больших объектов, включая возможный просмотр битовой таблицы.

\n

Уф, весьма запутанно. Однако, стоит иметь в виду, что фаза отметки — это воистину сердце любого сборщика.

\n

Перейдём теперь к третье фазе — очистки. Ирония в том, что вопреки ожиданиям, в текущем Ди’шном сборщике очиститель вовсе не очищает списки свободных блоков. Всё, что его волнует, так это вызвать финализаторы, если таковые имеются, и установить биты–признаки «свободен» и прочие таблицы. Заметьте, что это требует поиска битов–отметок и соответственно, линейного прохода по памяти каждого пула.

\n

Последняя стадия — возврат освобождённой памяти. На самом деле, на этой стадии перестраиваются списки свободных блоков. и опять это линейный проход по (всем) пулам, но только по маленьким пулам. И опять нужен просмотр таблицы страниц для каждой страницы в пуле. И только для того, чтобы определить её размер. . . определённо, хочется плакать! Основной вопрос без ответа — зачем? Зачем лишний проход? Я долго пытался представить разумную причину, но так и не смог.

\n

Возможно, слабое, но вполне возможное объяснение — «для простоты». По моему мнению, это последняя большая ошибка.

\n

Чего же там нет?

\n

До сих пор я критиковал то, что бросается в глаза. Пора перейти к тому, что попросту отсутствует.

\n

Кэш нитей — одно из таких больших упущений. Правда, следует помнить, что Ди’шный мусорщик родом из 2000–ых, так что это не удивительно. В любом современном распределителе есть хоть какая-то форма кэша нитей, некоторые даже пытаются поддерживать кэш для каждого процессора. Кэш работает для каждого потока, выделяя память скопом и придерживая сделанные выделения памяти на будущее. Такой подход уменьшает стоимость просмотра разделяемых структур данных кучи. Точнее говоря, мелкозернистые блокировки имеются, но не на уровне всего пула.

\n

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

\n

Заключительные размышления

\n

Это сообщение получилось гораздо длиннее и более подробное, чем бы мне хотелось. Тем не менее, сохраняется его главный посыл: Ди’шный мусорщик медленный не из-за каких–то фундаментальных ограничений, а просто потому, что почти половина решений в его реализации откровенно плоха. Действуя в том же духе легко можно было бы построить медленный и точный «поколенческий» мусорщик, просто из-за отсутствия хороших методик реализации.

\n

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

\n
    \n
  1. Разделить маленькие пулы по классам размеров.
  2. \n
  3. Использовать поиск в пуле с эффективностью O(1).
  4. \n
  5. Чтобы избавиться от внутренней фрагментации, попробовать использовать больше классов размеров, в том числе, не кратных степеням двойки (а-ля jmalloc).
  6. \n
  7. Упростить маркировку, разделив все пулы по атрибуту «не сканировать».
  8. \n
  9. Ввести третий класс пулов для массивных выделений памяти (более 16 МБ), предназначенных исключительно для одиночных объектов.
  10. \n
  11. Пулы больших объектов требуют более хитрой работы. Возможно, деревья с ключами на основе длины блока придутся кстати (jemalloc использует красно–чёрные деревья).
  12. \n
  13. Надо бы убрать атрибут „без внутреннего указателя“. В текущей реализации он предназначен для борьбы с ложными указателями, что характерно для консервативного мусорщика. Однако это принципиально небезопасно и цена слишком высока. В конце концов, это полностью бессмысленно в 64-битных системах, где собственно и живут ваши серверы.
  14. \n
  15. Не нужно «юродство» с многофазной сборкой в цикле „отметка – очистка“. Он должен отмечать и очищать, только и всего.
  16. \n
  17. Добиться мелкогранулированной блокировки с самого начала. Я не вижу проблем с блокировками на уровне пула.
  18. \n
\n

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

\n

На третьей итерации (если доживём), ожидаем совершенно новый дизайн, вдохновлённый коллегой immix1 — сборщик, основанный на отметки областей.

\n

На этой оптимистичной ноте я завершаю озвучивание моих планов. Предупреждаю, что собираюсь начать реализацию в Линукс–специфике, медленно доводя её до совместимости с POSIX. Поддержка Windows — отдалённая возможность.

\n

Дмитрий Ольшанский, исследователь и инженер–программист. Биографию см. в http://olshansky.me/about.html

\n

Практический вывод

\n

Статья важна не только для разработчиков компилятора. Она показывает, почему аллокатор и сборщик мусора нельзя оценивать одной фразой «GC медленный». Нужно смотреть на классы размеров, поиск пулов, стоимость маркировки и то, сколько работы выполняется во время остановки мира.

\n

Для прикладного D-кода вывод такой: держите горячие циклы предсказуемыми, не создавайте лишние временные объекты в tight-loop и измеряйте паузы. Если участок действительно критичен, D позволяет локально управлять GC и заменить поток мелких аллокаций заранее подготовленными буферами.

\n
import core.memory : GC;\n\nGC.disable();\nscope(exit) GC.enable();\n\n// горячий участок без лишних временных объектов
\n

Отключать GC нужно аккуратно. Это не волшебная оптимизация, а договор: пока сборщик выключен, программа не должна бесконтрольно накапливать мусор. Поэтому такой приём подходит для короткого измеримого участка, а не для всего приложения.

\n\n

Главный смысл доклада в том, что производительность памяти — это архитектура. Если в программе много мелких объектов, непредсказуемых ссылок и больших пауз, проблема редко решается одной настройкой. Нужно менять модель данных, жизненный цикл объектов и место, где выделяется память.

", + "readingMinutes": 11 + }, + { + "slug": "пишем-аналог-функции-php-preg_match_all-на-языке-прог", + "title": "Пишем аналог функции PHP preg_match_all на языке программирования D", + "date": "2017-06-17T18:53:17+00:00", + "author": "DarkRiDDeR", + "categories": [ + "DLang", + "Регулярные выражения" + ], + "cover": "/assets/illustrations/preg-match-all-d.svg", + "excerpt": "В PHP есть очень удобная функция для глобального поиска шаблона регулярного выражения в строке preg_match_all . Давайте напишем аналогичный класс статических методов для реализации этой функции с разными флагами на языке программирования D. Описание функции: i", + "contentHtml": "

В PHP есть очень удобная функция для глобального поиска шаблона регулярного выражения в строке preg_match_all. Давайте напишем аналогичный класс статических методов для реализации этой функции с разными флагами на языке программирования D.

\n

Описание функции:

\n\n
int preg_match_all ( string $pattern , string $subject [, array &amp;$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )
\n\n

Функция ищет в строке subject все совпадения с шаблоном pattern и помещает результат в массив matches в порядке, определяемом комбинацией флагов flags.
\nПосле нахождения первого соответствия последующие поиски будут осуществляться не с начала строки, а от конца последнего найденного вхождения.

\n

Данная функцию очень удобна и чаще всего она применяется с третьим параметром, чтобы обработать полученный массив совпадений шаблона. В D подобной регулярной функции нет. Мне вообще не сильно нравятся, как реализованы регулярные выражения в D. Ну да ладно.

\n

Полную документацию по функции можете посмотреть здесь http://php.net/manual/ru/function.preg-match-all.php.

\n

Возможные флаги функции preg_match_all:

\n\n

Не будем заморачиваться с реализацией через передачу константы, как в PHP, или через шаблоны в D. Создадим для каждого флага PHP данной функции аналогичные статические методы. Параметр offset оставим за бортом. Класс давайте назовём PReg. Вырисовывается следующая структура:

\n\n
class PReg\n{\n\tpublic static:\n \n\t… matchAllPatternOrder (...) {...}\n\t… matchAllSetOrder (...){...}\n\t… matchAllOffsetCapture (…) {...}\n}
\n\n

Как параметры будем передавать строку для поиска (тип string), регулярное выражение (тип ???) и переменную для вывода количества совпадений шаблона регулярного выражения (тип out int). Тип регулярного выражения можно посмотреть, чтобы не капаться в модуле, применив такую хитрость:

\n
writeln(typeof(regex(`\\d+`)).stringof);
\n

Также как аргумент вы без проблем сможете передавать compile-time регулярное выражение (ctRegex). Для данного типа создадим алиас типа, чтобы поудобнее было.
\nФункция matchAllPatternOrder и matchAllSetOrder будет возвращать двумерный массив строк, для них тоже создадим алиас типов (мне так кажется, что путаницы меньше). MatchAllOffsetCapture пока оставим на закуску.

\n

В итоге у нас получается:

\n\n
class PReg\n{\n\tprivate static alias typeRegex = Regex!char;\n \n\tpublic static:\t\n\talias typePatternOrder = string[];\n\talias typeSetOrder = string[];\n \n\ttypePatternOrder[] matchAllPatternOrder (string subject, typeRegex obRegex, out int count) {..}\n\ttypeSetOrder[] matchAllSetOrder (string subject, typeRegex obRegex, out int count){...}\n\t… matchAllOffsetCapture (string subject, typeRegex obRegex, out int count)\t{...}\n}
\n\n

Привожу пример реализованной функции matchAllPatternOrder (основные моменты пояснены ниже):

\n\n
typePatternOrder[] matchAllPatternOrder (string subject, typeRegex obRegex, out int count)\n{\n\ttypePatternOrder[] matches;\n\tauto stdMatches = matchAll(subject, obRegex);\n \n\twhile (!stdMatches.empty) {\n\t\tmatches.length++;\n\t\tmatches[0] ~= stdMatches.front.hit;\n \n\t\tfor (int i = 1; i < stdMatches.front.length; i++) {\n\t\t\tmatches.length++;\n\t\t\tmatches[count+1] ~= stdMatches.front[i];\n\t\t}\n\t\tstdMatches.popFront();\n\t\tcount++;\n\t}\n\treturn matches;\n}
\n\n\n

Реализация функции matchAllSetOrder по сути ничем сильно не отличается кроме как позициями найденных строк в массиве (она даже проще). Приведу лишь реализованный вариант:

\n\n
typeSetOrder[] matchAllSetOrder (string subject, typeRegex obRegex, out int count)\n{\n\ttypeSetOrder[] matches;\n\tauto stdMatches = matchAll(subject, obRegex);\n \n\twhile (!stdMatches.empty) {\n\t\tfor (int i = 0; i < stdMatches.front.length; i++) {\n\t\t\tmatches.length++;\n\t\t\tmatches[count] ~= stdMatches.front[i];\n\t\t}\n\t\tstdMatches.popFront();\n\t\tcount++;\n\t}\n\treturn matches;\n}
\n\n

Реализация функции matchAllOffsetCapture имеет свои особенности. Найденные данные функции будем хранить в двумерном массиве картежа типов Tuple!(string, «text», int, «position»), по которому можно будет получить позицию и найденую строку. Реализация:

\n\n
alias typeOffsetCapture = Tuple!(string, "text", int, "position")[];\n \ntypeOffsetCapture[] matchAllOffsetCapture (string subject, typeRegex obRegex, out int count)\n\t{\n\t\ttypeOffsetCapture[] matches;\n \n\t\tauto stdMatches = matchAll(subject, obRegex);\n\t\tmatches.length = stdMatches.front.length;\n \n\t\twhile (!stdMatches.empty) {\n\t\t\tTuple!(string, "text", int, "position") match;\n\t\t\tmatch.text = stdMatches.front.hit;\n\t\t\tmatch.position = cast(int)(match.text.ptr - subject.ptr);\n\t\t\tmatches[0].length = count+1;\n\t\t\tmatches[0][count] = match;\n\t\t\tfor (int i = 1; i < stdMatches.front.length; i++) {\n\t\t\t\tmatches[i].length = matches[0].length;\n\t\t\t\tmatch.text = stdMatches.front[i];\n\t\t\t\tmatch.position = cast(int)(stdMatches.front[i].ptr - subject.ptr);\n\t\t\t\tmatches[i][count] = match;\n\t\t\t}\n\t\t\tstdMatches.popFront();\n\t\t\tcount++;\n\t\t}\n\t\treturn matches;\n\t}
\n\n

Единственное, что здесь важно отметить, как определяются позиции, а именно:

\n\n
match.position = cast(int)(match.text.ptr - subject.ptr);
\n\n

Позиция определяется через разность указателей позиций элементов массива. Также здесь выполняется приведение типа к int, так как многие процессоры уже использует 64-х битное представление, и указатели будут иметь тип long.

\n

Полная реализация модуля с тестами представлена ниже:

\n\n
module preg;\n \nimport std.string: format;\nimport std.typecons;\nimport std.regex: Regex, regex, ctRegex, matchFirst, matchAll;\n \n// analog of preg regex in php\n \nclass PReg\n{\n\tprivate static alias typeRegex = Regex!char;\n \n\tpublic static:\n \n\talias typePatternOrder = string[];\n\talias typeSetOrder = string[];\n\talias typeOffsetCapture = Tuple!(string, "text", int, "position")[];\n \n\ttypePatternOrder[] matchAllPatternOrder (string subject, typeRegex obRegex, out int count)\n\t{\n\t\ttypePatternOrder[] matches;\n\t\tauto stdMatches = matchAll(subject, obRegex);\n \n\t\twhile (!stdMatches.empty) {\n\t\t\tmatches.length++;\n\t\t\tmatches[0] ~= stdMatches.front.hit;\n \n\t\t\tfor (int i = 1; i < stdMatches.front.length; i++) {\n\t\t\t\tmatches.length++;\n\t\t\t\tmatches[count+1] ~= stdMatches.front[i];\n\t\t\t}\n\t\t\tstdMatches.popFront();\n\t\t\tcount++;\n\t\t}\n\t\treturn matches;\n\t}\n \n \n\ttypeSetOrder[] matchAllSetOrder (string subject, typeRegex obRegex, out int count)\n\t{\n\t\ttypeSetOrder[] matches;\n \n\t\tauto stdMatches = matchAll(subject, obRegex);\n \n\t\twhile (!stdMatches.empty) {\n\t\t\tfor (int i = 0; i < stdMatches.front.length; i++) {\n\t\t\t\tmatches.length++;\n\t\t\t\tmatches[count] ~= stdMatches.front[i];\n\t\t\t}\n\t\t\tstdMatches.popFront();\n\t\t\tcount++;\n\t\t}\n\t\treturn matches;\n\t}\n \n\ttypeOffsetCapture[] matchAllOffsetCapture (string subject, typeRegex obRegex, out int count)\n\t{\n\t\ttypeOffsetCapture[] matches;\n \n\t\tauto stdMatches = matchAll(subject, obRegex);\n\t\tmatches.length = stdMatches.front.length;\n \n\t\twhile (!stdMatches.empty) {\n\t\t\tTuple!(string, "text", int, "position") match;\n\t\t\tmatch.text = stdMatches.front.hit;\n\t\t\tmatch.position = cast(int)(match.text.ptr - subject.ptr);\n\t\t\tmatches[0].length = count+1;\n\t\t\tmatches[0][count] = match;\n\t\t\tfor (int i = 1; i < stdMatches.front.length; i++) {\n\t\t\t\tmatches[i].length = matches[0].length;\n\t\t\t\tmatch.text = stdMatches.front[i];\n\t\t\t\tmatch.position = cast(int)(stdMatches.front[i].ptr - subject.ptr);\n\t\t\t\tmatches[i][count] = match;\n\t\t\t}\n\t\t\tstdMatches.popFront();\n\t\t\tcount++;\n\t\t}\n\t\treturn matches;\n\t}\n}\n \nunittest\n{\n\timport std.stdio;\n\twriteln("test PReg.matchAll");\n \n\tint count;\n \n\tauto matches1 = PReg.matchAllPatternOrder(`one two`, regex(`(\\w)(\\w)\\w+`), count);\n\tassert(matches1[0][0] == `one`);\n\tassert(matches1[0][1] == `two`);\n\tassert(matches1[1][0] == `o`);\n\tassert(matches1[1][1] == `n`);\n\tassert(matches1[2][0] == `t`);\n\tassert(matches1[2][1] == `w`);\n\tassert(count == 2);\n \n\tauto matches2 = PReg.matchAllSetOrder(`one two`, regex(`(\\w)(\\w)\\w+`), count);\n\tassert(matches2[0][0] == `one`);\n\tassert(matches2[0][1] == `o`);\n\tassert(matches2[0][2] == `n`);\n\tassert(matches2[1][0] == `two`);\n\tassert(matches2[1][1] == `t`);\n\tassert(matches2[1][2] == `w`);\n\tassert(count == 2);\n \n\tauto matches3 = PReg.matchAllOffsetCapture(`one two`, ctRegex!(`(\\w)(\\w)\\w+`), count);\n\tassert(matches3[0][0].text == "one");\n\tassert(matches3[0][0].position == 0);\n\tassert(matches3[0][1].text == "two");\n\tassert(matches3[0][1].position == 4);\n \n\tassert(matches3[1][0].text == "o");\n\tassert(matches3[1][0].position == 0);\n\tassert(matches3[1][1].text == "t");\n\tassert(matches3[1][1].position == 4);\n \n\tassert(matches3[2][0].text == "n");\n\tassert(matches3[2][0].position == 1);\n\tassert(matches3[2][1].text == "w");\n\tassert(matches3[2][1].position == 5);\n\tassert(count == 2);\n}
\n\n

Надеюсь, что из этой статьи вы подчеркнули для себя что-то полезное и интересное. Всем спасибо!

\n

Как довести класс до рабочего состояния

\n

После реализации флагов обязательно добавьте тесты на три случая: нет совпадений, одно совпадение с группами и несколько совпадений с позициями. Именно на позициях чаще всего появляются ошибки, потому что PHP возвращает смещения в исходной строке, а не в подстроке после очередного поиска.

\n
assert(matchAll(r\"(w+)=(d+)\", \"a=1 b=22\").length == 2);\nassert(matchAll(r\"z+\", \"abc\").empty);
\n

В D стоит явно решить, какой формат результата нужен. PHP поддерживает несколько режимов: PREG_PATTERN_ORDER, PREG_SET_ORDER и вариант с PREG_OFFSET_CAPTURE. Если пытаться сделать всё сразу, код быстро станет запутанным. Лучше сначала реализовать простой режим, затем режим группировки по совпадениям, и только после этого добавить позиции.

\n
struct MatchPart\n{\n    string text;\n    ptrdiff_t offset;\n}\n\nalias MatchSet = MatchPart[][];
\n

Отдельно проверьте Unicode. Если шаблон и строка содержат кириллицу, важно понимать, что именно возвращается в offset: позиция в байтах или позиция в символах. PHP для PREG_OFFSET_CAPTURE возвращает байтовое смещение. Если в D вы хотите повторить поведение PHP, нужно документировать именно байтовый offset, иначе результаты будут отличаться.

\n

Финальный класс должен иметь маленькую поверхность API: метод без offset, метод с offset и понятный enum для порядка результата. Тогда аналог preg_match_all будет не просто копией PHP-функции, а удобным D-инструментом, который предсказуемо работает в тестах.

", + "readingMinutes": 7 + }, + { + "slug": "новый-движок-ctfe", + "title": "Dlang. Новый движок CTFE", + "date": "2017-05-26T11:51:22+00:00", + "author": "DarkRiDDeR", + "categories": [ + "DLang", + "Compile-time" + ], + "cover": "/assets/illustrations/ctfe-engine.svg", + "excerpt": "В течение последних 9 месяцев велась работа над проектом под названием NewCTFE, в котором переписываются методы выполнения функций времени компиляции (СTFE) . СTFE считается одной из технологий способных изменить D. Как следует из названия, CTFE позволяет комп", + "contentHtml": "

В течение последних 9 месяцев велась работа над проектом под названием NewCTFE, в котором переписываются методы выполнения функций времени компиляции (СTFE). СTFE считается одной из технологий способных изменить D.

\n

Как следует из названия, CTFE позволяет компилятору выполнять некоторые функции, когда он компилирует исходный код, в котором реализованы функции. Пока все аргументы функции доступны во время компиляции, а функция чиста (не имеет побочных эффектов), тогда функция квалифицируется как CTFE, и компилятор заменяет вызов функции результатом.

\n\n

Поскольку это неотъемлемая часть языка, чистые функции могут быть вычислены везде, где может находиться константа времени компиляции. Простой пример можно найти в стандартном модуле std.uri, где CTFE используется для вычисления таблицы поиска. Это выглядит так:

\n\n
private immutable ubyte[128] uri_flags = // indexed by character\n({\nubyte[128] uflags;\n// Compile time initialize\nuflags['#'] |= URI_Hash;\nforeach (c; 'A' .. 'Z' + 1)\n{\nuflags[c] |= URI_Alpha;\nuflags[c + 0x20] |= URI_Alpha; // lowercase letters\n}\nforeach (c; '0' .. '9' + 1) uflags[c] |= URI_Digit;\nforeach (c; ";/?:@&amp;=+$,") uflags[c] |= URI_Reserved;\nforeach (c; "-_.!~*'()") uflags[c] |= URI_Mark;\nreturn uflags;\n})();
\n\n

Вместо заполнения таблицы магическими значениями используется простой экспрессивный литерал функции. Это намного проще понять и отладить, чем некоторые непрозрачные статические массивы. ({ запускает функцию-литерал, а }) закрывает ее. () в конце говорит компилятору немедленно вызвать этот литерал, чтобы uri_flags стал результатом литерала.

\n

Функции выполняются только во время компиляции, если они необходимы. Uri_flags в приведенном выше фрагменте объявляется в области видимости модуля. Когда переменная области видимости модуля инициализируется таким образом, инициализатор должен быть доступен во время компиляции. В этом случае, поскольку инициализатор является функциональным литералом, будет предпринята попытка выполнить CTFE. Этот конкретный литерал не имеет аргументов и является чистым, поэтому попытка выполнена успешно.

\n

Более подробное обсуждение CTFE смотрите в статье H. S. Teoh D Wiki.

\n

Конечно, подобный метод может быть применен и к более сложным проблемам. Например, std.regex можно использовать со специализированным автоматом для выполнения регулярного выражения во время компиляции с использованием CTFE. Однако, как только std.regex используется с CTFE для нетривиальных паттернов, то время компиляции может стать чрезвычайно длительным (в D все, что занимает больше секунды при компиляции — избыточность :)). В конце концов, по мере усложнения паттернов, у компилятора появится нехватка памяти, и, возможно, произойдёт крах всей системы.

\n

Причина этого может крыться в текущей архитектуре интерпретатора CTFE. Это интерпретатор AST (абстрактного синтаксического дерева) — это означает, что он интерпретирует AST во время его обхода. Чтобы представить результат интерпретируемых выражений, он использует классы узлов DMD в AST. Это означает, что на каждое вновь встреченное выражение будет выделено один или несколько узлов AST. В ограниченном цикле интерпретатор может легко создать более 100.000.000 узлов и использовать несколько гигабайт оперативной памяти. Это может быстро израсходовать память.

\n

В issue 12844 имеет место проблема, что std.regex занимает более 16 ГБ ОЗУ для одного шаблона. Также есть issue 6498 , которая показывает, что выполняется простой от 0 до 10.000.000 узлов во время выполнения CTFE и что приводит к критичной нехватки памяти.

\n

Простое освобождение узлов не устраняет проблему, так мы точно не знаем, какие узлы необходимо освободить, и что cделает весь компилятор очень медленным из-за сборщика мусора. К счастью, есть еще один подход, который не выделяет память для каждого вновь встреченного выражения. Он включает в себя компиляцию функции в виртуальную ISA (архитектуру набора инструкций). Эта виртуальная ISA, также известная как байт-код, затем передается выделенному интерпретатору для этой ISA (в случае, когда виртуальный ISA совпадает с ISA хоста, мы называем его JIT (Just in Time) интерпретатором).

\n

Проект NewCTFE занимается реализацией такого интерпретатора байт-кода. Написание фактического интерпретатора (эмулятора CPU для виртуального CPU/ISA) достаточно просто. Однако компиляция кода для виртуального ISA выполняется в точности так же, как и при компиляции его в реальном ISA (хотя виртуальная ISA имеет дополнительное преимущество, которое может быть расширено для индивидуальных потребностей, но это затруднит выполнение JIT позже). Вот почему потребовался всего месяц, чтобы пучить первые простые примеры, работающие на новом движке CTFE, и почему немного более сложные из них все еще не работают даже после 9 месяцев разработки. В конце статьи вы найдете примерный график выполненной к настоящему времени работы (см. оригинал).

\n

Я буду выступать с презентацией на DConf 2017, где я расскажу о своем опыте внедрения движка и объясню некоторые технические детали, особенно относительно компромиссов и архитектурных решений, которые я применил. Текущая оценка состоит в том, что версия 1.0 не будет реализована к тому времени, но я буду заниматься разработкой, пока не закончу данный проект.

\n

Те, кто хочет отслеживать разработку, могут сделать это на форуме D. В будущем я планирую написать еще одну статью о некоторых технических деталях реализации. К тому времени, я надеюсь, что следующий список поможет пролить свет на то, как много работы по реализации NewCTFE.

\n

Данная статья является переводом статьи Штефана Коха, который является разработчиком sqlite-d, встроенного пакета в D для работы с sqlite, также он внес свой вклад в такие проекты, как SDC (Stupid D Compiler) и vibe.d. Он также был ответственен за 10% -ное повышение производительности в текущей реализации CTFE в D и в настоящее время пишет новый движок CTFE.

\n

Оригинал статьи смотрите по ссылке The D Blog/The New CTFE Engine.

\n

Как применять выводы на практике

\n

CTFE полезен там, где результат можно посчитать один раз во время компиляции: таблицы констант, парсинг небольших DSL, генерация однотипного кода, предварительная подготовка строк и проверка инвариантов. Но не стоит превращать компиляцию в полноценный runtime. Чем проще входные данные и чем меньше побочных эффектов, тем легче будет сопровождать проект.

\n
enum table = buildLookupTable();\n\nstatic assert(table.length == 256);
\n

Хороший кандидат для CTFE — функция, которая зависит только от литералов, типов и конфигурации сборки. Плохой кандидат — код, которому нужен ввод-вывод, сеть, текущее время, состояние окружения или большая внешняя база данных. Такой код лучше оставить в runtime или вынести в отдельный генератор, который запускается до сборки.

\n

Для контроля качества CTFE-кода полезно держать рядом static assert. Он сразу показывает, что вычисление действительно произошло на этапе компиляции и вернуло ожидаемый результат. Если compile-time функция стала слишком сложной, её стоит разбить на маленькие чистые функции: так компилятору проще, и человеку проще понять, что происходит.

\n

Практический вывод такой: CTFE в D — мощный инструмент, но сила его не в магии, а в переносе предсказуемых вычислений из runtime в compile-time. Используем его для констант, генерации и проверок. Не используем его как замену обычной программе.

", + "readingMinutes": 6 + }, + { + "slug": "особенности-vibe-d", + "title": "Особенности Vibe.d", + "date": "2017-05-23T17:55:03+00:00", + "author": "DarkRiDDeR", + "categories": [ + "DLang", + "Vibe.d" + ], + "cover": "/assets/illustrations/vibe-cover.svg", + "excerpt": "Основная идея vibe.d заключалась в том, чтобы использовать быструю и ресурсоемкую асинхронную модель ввода-вывода (AIO) и сделать ее удобной в использовании. Некоторые другие программные платформы, такие как node.js, напрямую отображают интерфейс AIO с использ", + "contentHtml": "

Простота

\n

Модель программирования псевдоблокировки на основе волокн

\n

\"Асинхронная
Асинхронная модель vibe.d
Основная идея vibe.d заключалась в том, чтобы использовать быструю и ресурсоемкую асинхронную модель ввода-вывода (AIO) и сделать ее удобной в использовании. Некоторые другие программные платформы, такие как node.js, напрямую отображают интерфейс AIO с использованием событий, используя функции обратного вызова. Хотя это приемлемый подход, он имеет ряд недостатков.

\n

Прежде всего, в node.js часто становится утомительным и запутанным писать последовательности кода (например, выполнять несколько последовательных запросов к базе данных). На каждом шаге будет представлен новый callback-вызов (обратный) с новой областью, callback-вызовы ошибок часто приходится обрабатывать отдельно. Это часто является причиной того, что возникает соблазн выполнить слабую обработку ошибок.

\n

Другим следствием асинхронных callback-вызовов является отсутствие значимого стека вызовов. Мало того, что это может усложнить отладку, но такие функции, как исключения, не могут эффективно использоваться в такой среде.

\n

Подход vibe.d заключается в использовании асинхронного ввода-вывода под оболочкой, но в то же время кажется, что все операции были синхронными и блокирующими, как и обычные операции ввода-вывода.

\n

Это делает возможным поддержку для так называемых волокон (также часто называемых совместными подпрограммами). Волокна ведут себя как потоки, просто они фактически работают в одном потоке. Как только бегущее волокно вызывает специальную функцию yield(), она возвращает управление функции, которая запустила волокно. Затем волокно может быть возобновлено в точно таком же положении и с тем же состоянием, которое было у него при вызове yield(). Таким образом, волокна могут мультиплексироваться вместе, выполняться квазипараллельно и максимально использовать каждую емкость нитей.

\n

Все это обычно скрыто за функциями API vibe.d, так что все кажется простой работой с обычными потоками и блокировкой операций. Все блокирующие функции, такие как sleep() или read(), останавливают работу, когда им необходимо ждать, и возобновляют её при возникновении события.

\n

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

\n

Сказав все это, vibe.d может также использоваться без волокон и без цикла обработки событий, если это необходимо, наподобие стандартной блокирующей модели ввода-вывода.

\n

Компактное API

\n

\"Короткий
Короткий API vibe.d
Акцент делается на короткий и простой API. Общие задачи выполняются как можно короче и на высоком уровне, но при этом, при необходимости, допускается низкоуровневый контроль. Используя некоторые из продвинутых функций D, типичные программы на основе vibe.d становятся лаконичными, что обычно могут предложить только скриптовые языки, такие как Ruby.

\n

Нулевое время простоя при изменениях

\n

Встроенный балансировщик нагрузки, способный динамически создавать, запускать и тестировать новые процессы после того, как код был изменен, прежде чем переключать их в главный поток. Это позволяет осуществлять «бесшовные» и с низким уровнем риска изменения в работающих системах.

\n

Обработка ошибок на основе исключений

\n

Обычно обработка исключений ограничивается локальными обработчиками ошибок в средах, основанных на событиях, так как невозможно поместить последовательность событий в блок try-catch, потому что каждая операция создает новую область, когда задействованы обратные вызовы. С другой стороны, vibe.d с его волоконно-ориентированным подходом обладает полной поддержкой обработки исключений.

\n

Волокно ведет себя почти так же, как поток относительно стека: один согласованный стек вызовов существует во всех событиях, которые обрабатываются последовательно. Таким образом, становится возможно естественным образом использовать обработку исключений, и особенно в среде веб-служб, где исключения являются идеальной формой обработки ошибок.

\n

Исключения имеют чрезвычайно полезную функцию, которую едва можно игнорировать. Таким образом, становится гораздо труднее создать трудноотлавливаемые ошибки и дыры в безопасности, непреднамеренно игнорируя условия ошибки. Любые неперехваченные исключения автоматически генерируют страницу ошибок и записывают всю полезную информацию в случае HTTP-сервисов.

\n

Преимущества

\n

Полностью интегрированный веб-фреймворк

\n

\"Веб-стек
Веб-стек vibe.d
Библиотека vibe.d содержит полный набор инструментов, необходимых для разработки веб-сайтов и веб-сервисов. В дополнение к HTTP 1.0/1.1 серверу уже интегрированы статические файлы, эффективная система шаблонов, веб-сокеты, сеансы и другие функции. К числу таких функций относятся фильтр markdown, драйверы MongoDB и Redis, криптография, поддержка JSON и BSON и простой SMTP-клиент.

\n

Есть также средства для автоматической генерации JSON / REST или HTML-интерфейсов на основе форм из классов D, что устраняет много работы и потенциальных ошибок из-за избежания стандартного кода. Генератор интерфейса REST поддерживает генерацию как сервера, так и клиентской части, и как таковой может использоваться как удобный механизм RPC.

\n

Встроенные драйверы баз данных

\n

\"Драйверы
Драйверы баз данных vibe.d
Основная библиотека содержит встроенную поддержку баз данных MongoDB и Redis. Эти драйверы по умолчанию обеспечивают быстрое и гибкое хранение данных. Дополнительные драйверы базы данных доступны в реестре пакетов DUB, например, совместимый с vibe.d драйвер MySQL.

\n

Совместимость существующих драйверов легко сделать благодаря блокирующей природе API vibe.d. Единственное, что нужно сделать в большинстве случаев – заменить вызовы сокетов (send (), recv (), connect () и т. д.) соответствующими функциями vibe.d. В блоге дается обзор того, что нужно сделать, используя MySQL в качестве примера.

\n

«Сырая» сеть и обработка файлов

\n

Конечно, «сырые» (необработанные) TCP/UDP и доступ к файлам поддерживаются набором инструментальных средств для включения пользовательских протоколов и форматов файлов. I/O происходит через интерфейс блокирующего потока, который эффективно скрывает тот факт, что базовые операции фактически основаны на событиях.

\n

Общие инструменты параллелизма

\n

Помимо операций ввода-вывода поддерживаются все обычные инструменты для общих задач программирования:

\n\n

Интеграция графического интерфейса пользователя

\n

В отличие от большинства других сред, поддерживающих асинхронный ввод-вывод, vibe.d полностью интегрируется с циклом событий пользовательского интерфейса, поэтому его можно использовать для реализации приложений с графическим интерфейсом пользователя.

\n

Для Windows существует собственная реализация драйвера событий (включается с VibeWin32Driver), которая использует функцию MsgWaitForMultipleObjectsEx для обработки оконных сообщений вместе с событиями ввода/вывода или параллелизма. Для систем, работающих под управлением X11, можно использовать createFileDescriptorEvent для прослушивания связи дисплея вместо использования XNextEvent.

\n

Производительность

\n

Асинхронные операции ввода-вывода

\n

\"Неблокирующий
Неблокирующий ввод-вывод
Вместо использования классического блокирующего ввода-вывода и многопоточности для выполнения параллельных сетевых и файловых операций все операции используют асинхронные API-интерфейсы операционной системы. По умолчанию libevent используется для доступа к этому API операционной системы независимо.

\n

Использование асинхронного ввода-вывода имеет ряд преимуществ, главным из которых является то, что накладные расходы памяти намного ниже. Это связано с тем, что для обработки произвольного количества одновременных операций необходим только один аппаратный поток. Поток обычно остается в ожидании событий и разбужен операционной системой сразу же после поступления новых данных, установления нового соединения или возникновения ошибки. После каждой инициированной операции блокировки (например, записи данных в сокет) поток вернется в спящий режим и позволит операционной системе выполнить операцию в фоновом режиме.

\n

Другим важным аспектом для скорости является то, что, поскольку требуется только один или несколько потоков, часто можно сохранить много дорогих контекстных переключателей потока. Однако, если приложение должно выполнять много вычислений помимо операций ввода-вывода, vibe.d имеет полную поддержку многопоточности, чтобы полностью использовать многоядерный процессор системы.

\n

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

\n

Поддержка многопоточности

\n

Хотя производительность, как правило, очень высока в однопоточном приложении из-за использования асинхронных операций ввода-вывода и волокон, есть приложения, которые могут извлечь большую пользу из использования нескольких ядер. Vibe.d поддерживает несколько способов использования этой дополнительной вычислительной мощности, оставляя решение по архитектуре потоков программисту.

\n

Помимо разрешения использовать потоков D низкого уровня, предоставляется пул потоков, который используется для любой задачи, запущенной с помощью runWorkerTask вместо runTask. Это в основном полезно для выполнения вычислительно дорогостоящих операций, таких как декодирование изображений, наряду с обычным потоком программ, но оно также может быть использовано для лучшей производительности тяжелых задач ввода-вывода в некоторых случаях.

\n

Библиотека очень гибкая в том, что многопоточность может быть использована, и она гарантирует, что не могут возникнуть условия «низкоуровневых гонок», если не используются небезопасные операции, такие как cast () или __gshared переменные. В следующем списке показаны некоторые типичные архитектуры потоков:

\n\n

HTTP-серверу (а также любому другому серверу на базе TCP) можно поручить обработку входящих соединений по рабочим потокам пула потоков, а не по основному потоку. Для приложений, которым не требуется разделять состояние между различными соединениями в этом процессе, это может увеличить линейное число запросов в секунду по количеству ядер в системе. Эта функция активируется с использованием настроек HTTPServerOption.distribute или TCPListenOptions.distribute.

\n\n

Вычислительные дорогостоящие задачи могут быть выгружены из основного потока, выполнив их с помощью runWorkerTask. Любая такая задача будет выполнена в пуле потоков. Этот подход полезен в тех случаях, когда приложение требует выполнения таких дорогостоящих задач, поскольку оно позволяет чистому выполнению операций ввода-вывода оставаться без изменений при большой вычислительной нагрузке. Вероятно, наиболее распространенным примером такой задачи является обработка/декодирование/кодирование изображений.

\n\n

Нормальные потоки D также могут использоваться вместе с vibe.d. Это важно, когда используются потоковые примитивы стандартной библиотеки D. Помимо основных потоков D, это std.parallelism и std.concurrency. Обратите внимание, что части стандартной библиотеки D не следует смешивать с функциями ввода-вывода vibe.d, поскольку они блокируют цикл обработки событий. В частности, функции передачи сообщений в std.concurrency_* в настоящее время несовместимы с циклом событий vibe.d и должны быть заменены функциями vibe.core.concurrency.

\n

Обратите внимание, что vibe.d также включает в себя экспериментальную библиотеку поддерживающую изолированные и ограниченные ссылки. Это позволяет передавать изменяемые данные между потоками без использования мьютексов или аналогичных средств для синхронизации доступа к данным. Это особенно полезно при передаче данных, используемых в рабочих задачах между рабочим потоком и основным потоком.

\n

Встроенный компилятор кода

\n

\"Язык
Язык D как основа vibe.d
Vibe.d написан на языке программирования D. D – это C-подобный язык, который компилируется с использованием машинного кода с минимальными затратами времени выполнения. Помимо того, что D является быстрым, D предлагает ряд функций, которые позволяют повысить производительность и улучшить читаемость кода, безопасность и удобство использования по сравнению с другими языками, такими как C ++.

\n

Некоторые заметные отличия перечислены здесь, но есть много дополнительных вещей, которые выходят за рамки этого текста. Смотрите страницу функций D или книгу Programming in D для более тщательного обзора.

\n\n

Метопрограммирование в D чрезвычайно эффективно. Шаблоны (сравнимые с шаблонами C ++) поддерживают параметры variadic, а также параметры строк и параметры-псевдонимы (alias) – это функции, которые обеспечивает очень удобные интерфейсы во время компиляции.

\n

Мощность языка дает возможность выполненять обычные функций во время компиляции, а также возможность компилировать строку, заданную во время компиляции как код D. Эта возможность похожа на функцию eval () в JavaScript: результат статически компилируется в машинный код (и без последствий безопасности eval ()).

\n

Эти функции вместе с возможностью чтения файлов во время компиляции позволили создать мощный синтаксический анализатор шаблонов Diet.

\n\n

Среда выполнения D предлагает встроенную сборку мусора, которая предоставляет некоторые интересные возможности, помимо очевидного преимущества отсутствия необходимости ручного управления памятью и связанного с этим риска утечек памяти и опасных потеряных ссылок.

\n

В частности, он позволяет работать с неизменяемыми данными, такими как строки или объекты, на которые можно безопасно ссылаться и передавать между потоками без каких-либо издержек синхронизации. При передаче данных между потоками статически закрепляется, что данные безопасны для ссылок из нескольких потоков. Это позволяет избежать целого класса трудно воспроизводимых и отслеживаемых ошибок, часто встречающихся в многопоточном коде многих других языков.

\n\n

Функции, также известные из некоторых скриптовых и функциональных языков, а также в C # и некоторых других – замыкания и лямбда-функции. Они позволяют указывать функции обратного вызова очень компактным и читаемым способом. В свою очередь, они, как правило, оказывают сильное влияние на архитектуру API, так как они могут сделать вычислительно эффективные или безопасные API-интерфейсы действительно переносимыми (или даже приятными) в использовании.

\n\n

Свойства – это функции, которые выглядят как поля класса или структуры. Они используются в API для получения логического и интуитивно понятного интерфейса без всякого рода ограничений и дополнительной типизации, необходимой для нормальных вызовов функций.

\n\n

Массивы поддерживают встроенный функциональные возможности выполнения срезов с очень естественным синтаксисом. Совместно со сборщиком мусора они обеспечивают чрезвычайно быструю реализацию синтаксического анализатора строк. Данные операции безопасны (проверяются границы) и легко читаются.

\n\n

Синтаксис в целом очень чистый и по смыслу – особенно в сравнение с его, возможно, самым близким родственником, C ++. Но в этом отношении также не нужно бояться современных скриптовых языков, таких как Ruby и Python. Помимо явной необходимости указывать явный типизации типы могут быть приведены автоматически при помощи оператора auto. Вы обнаружите, что использование auto работает предсказуемо, почти без промахов, и что разработка на D очень эффективна.

\n

Компилируемый шаблонизатор “Diet”

\n

\"Шаблоны
Шаблоны Diet
Vibe.d имеет встроенную поддержку HTML-шаблонов Diet на основе синтаксиса шаблона Pug, известного из node.js, который, в свою очередь, основан на Haml. Эти шаблоны устраняют все синтаксические накладные расходы, которые присущи нотации HTML-тегов, а также позволяют вести встроенную спецификацию динамических элементов. Как правило, эти элементы написаны на языке динамических скриптов (JavaScript в случае Pug).
\nОднако в vibe.d шаблоны могут содержать встроенный код D. Шаблоны читаются и анализируются, пока приложение компилируется и оптимизируется. Для них создается код на D. Это означает, что накладные расходы времени выполнения для этих шаблонов отсутствуют – не осуществляется доступ к диску, не выполняется синтаксический анализ, и нет необходимости в копировании строк, поскольку все это уже будет сделано до того, как приложение будет запущено.
\nВ то же время вы можете программировать на том же языке и остальную часть приложения, что обеспечивает очень последовательную разработку.

\n

Перевод http://vibed.org/features

\n

Когда выбирать vibe.d

\n

vibe.d хорошо подходит для небольших и средних веб-сервисов на D, где важны неблокирующий ввод-вывод, простая маршрутизация и единая экосистема DUB. Начать можно с минимального HTTP-сервера, затем добавить Diet-шаблоны, MongoDB или Redis и вынести повторяющиеся части в отдельные модули.

\n
shared static this()\n{\n    auto settings = new HTTPServerSettings;\n    settings.port = 8080;\n    listenHTTP(settings, &handleRequest);\n}
\n

При проектировании сервиса главное не забывать, что удобный синтаксис не отменяет асинхронную модель. Долгие CPU-задачи нельзя выполнять прямо в обработчике запроса, иначе они будут мешать обработке ввода-вывода. Для таких задач лучше использовать отдельные worker-потоки, очередь или заранее подготовленные данные.

\n\n

Если проект требует большого количества готовых интеграций, заранее проверьте наличие пакетов в DUB и состояние нужных драйверов. Если же нужна компактная серверная часть на D, vibe.d остаётся прямым и понятным выбором: один язык, быстрый нативный код, нормальная маршрутизация, шаблоны и асинхронный ввод-вывод.

", + "readingMinutes": 13 + }, + { + "slug": "вирус-самопроизвольный-запуск-брауз", + "title": "Вирус. Самопроизвольный запуск браузера и перенаправление на вредоносные сайты.", + "date": "2017-05-20T00:07:00+00:00", + "author": "DarkRiDDeR", + "categories": [ + "Windows", + "Вирусы" + ], + "cover": "/assets/illustrations/cover-virus.svg", + "excerpt": "Недавно столкнулся с такой проблемой: браузер через приблизительно одинаковые промежутки времени сам запускался и открывал различные рекламные и вредоносные сайты. «О! Нет! Это вирус!» – воскликнули с ужасом в сердцах. Все мы напуганы зловредами, которые могут", + "contentHtml": "

Недавно столкнулся с такой проблемой: браузер через приблизительно одинаковые промежутки времени сам запускался и открывал различные рекламные и вредоносные сайты.

\n\n

«О! Нет! Это вирус!» – воскликнули с ужасом в сердцах.

\n

Все мы напуганы зловредами, которые могут нанести ощутимый вред, особенно на фоне недавней атаки вируса шифровальщика WannaCry, который широко разгулялся и нанёс принёс ощутимые убытки большому числу компаний и организаций. Но в нашем случае всё не так страшно.

\n

Данный вирус практически никакой угрозы не представляет, он даже вирус в кавычках. Основной его вред в том, что по большему счёту лишь надоедает и отвлекает. Сидишь ли делаешь работу, или может отдыхаешь, смотришь любимый сериал, и постоянно запускается браузер с каким-то левым сайтом, на котором находится нелицеприятный контент. Это начинает довольно сильно мешать.

\n

После чего уже начинаешь задумываться. А какого фига данный вирус попал ко мне на компьютер? Как его удалить? Основная причина попадания таких вирусов – это установка какого-либо пиратского контента. Но бог с ним, как он к нам попал. Теперь его как-то надо удалять.

\n

Мы сначала запускаем свой любимый установленный на нашем компьютере антивирус. У меня лично стоит ESET NOD32 Smart Security (рекомендую). Но сканирование ничего не даёт. Что же делать? Порывшись в закоулках ОС Windows я нашёл причину этой проблемы. Это планировщик заданий, в котором было указано задание на запуск браузера с последующим переходом на зловредный сайт.

\n

Чтобы попасть в планировщик заданий Windows запустите командную строку набором клавишь Win+R и введите команду taskschd.msc, которая и запустит его.

\n

\"Окно
Окно запуска taskschd.msc

\n

Просмотрев команды планировщика можно легко найти ту, которая запускает наш браузер (у меня Firefox).

\n

\"Подозрительное
Подозрительное задание в планировщике Windows

\n

В задании видно, на какой сайт идёт перенаправление.

\n

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

\n

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

\n

В данной статье описан один из возможных способов решения данной проблемы. Возможно в вашем случае имеет место та же проблема, и я надеюсь, что помог вам.

\n

Всего хорошего!

\n

Проверяем, что проблема решена

\n

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

\n

В планировщике заданий важно смотреть не только название задания. Название злоумышленник может сделать вполне безобидным: Update Service, Browser Check, Windows Helper. Смысл находится в действии. Если в действии указан путь к браузеру, а после него стоит адрес сайта, то перед нами как раз тот самый случай.

\n\n

Если задача появляется снова, значит в системе остался установщик или служба, которая её восстанавливает. В таком случае дополнительно смотрим «Приложения и возможности», папки автозагрузки пользователя, ключи HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run и HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Run. После очистки нужно обновить антивирусные базы и выполнить полную проверку.

\n

Итог простой: в этом случае лечится не браузер, а причина его запуска. Находим периодическое задание, проверяем действие, отключаем, убеждаемся, что оно не восстановилось, и только после этого удаляем. Так проблема закрывается полностью, а не до следующей перезагрузки.

", + "readingMinutes": 3 + }, + { + "slug": "компиляция-64-x-разрядных-программ-на-dmd-по", + "title": "Компиляция 64-x разрядных программ на DMD под Windows x64", + "date": "2017-05-04T18:13:42+00:00", + "author": "DarkRiDDeR", + "categories": [ + "DLang", + "DMD", + "Windows" + ], + "cover": "/assets/illustrations/dmd-win64.svg", + "excerpt": "Существуют проблемы совместимости с 32-x битными файлами DMD в Windows x64, так как они скомпилированы с использованием DMC фоновых программ, которые могут производить только OMF двоичные файлы. Поэтому для того, чтобы избежать проблем с подключением к внешним", + "contentHtml": "

Существуют проблемы совместимости с 32-x битными файлами DMD в Windows x64, так как они скомпилированы с использованием DMC фоновых программ, которые могут производить только OMF двоичные файлы. Поэтому для того, чтобы избежать проблем с подключением к внешним скомпилированным библиотекам, гораздо легче придерживаться использования 64-разрядных двоичных файлов. Это можно осуществить использованием Visual Studio компоновщика для DMD, который будет создавать совместимые COFF двоичный файлы. Еще одна проблема в том, что 32-битные DMD двоичные файлы связаны с устаревшими 32-битными библиотека WinAPI, в которых отсутствуют некоторые очень важные функции, в то время как 64-разрядные двоичные файлы должны быть связаны с 64-битными библиотеками, поставляемыми в SDK Windows. Решим эту проблему.

\n

Для начала нужно установить Microsoft Windows SDK for Windows. Найти различные версии можно по ссылке http://www.microsoft.com/en-us/search/result.aspx?q=sdk%20windows. Скачиваем для своей версии Windows. Устанавливаем.

\n

Директория установки Windows SDK в Windows 7 по умолчанию — C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\. Создадим системную переменную VCINSTALLDIR с данным адресом директории.

\n

Далее нам будет предложено выбрать устанавливаемые средства разработки, нам важны только 64-x разрядные библиотеки и компилятор Visual Studio, выберем данные пункты.

\n

Далее создадим ещё одну системную переменную DEV_DIR_WINSDK, в которой будет храниться путь к Windows SDK. В моё случае это C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\.

\n

Теперь необходимо отредактировать файл конфигурации компилятора DMD, он находится по пути dmd2\\windows\\bin\\sc.ini. Файл разбит на разделы, которые отмечены квадратными скобками, на потребуется изменить данные в разделе Environment64:

\n
    \n
  1. Изменим значение параметра LINKCMD на %VCINSTALLDIR%\\bin\\amd64\\link.exe
  2. \n
  3. Раскомментируем строку WindowsSdkDir= и приравняем к %DEV_DIR_WINSDK%
  4. \n
  5. Далее необходимо закомментировать (символ «;») строки с параметром LIB, в которых прописаны пути к Wimdows SDK не для вашей платформы.
  6. \n
\n

На этом настройка завершена, попробуем скомпилировать проект (запись блога ), открываем командную строку, пишем:

\n

rdmd -m64 C:\\D\\projects\\test\\hello.d

\n

Если всё прошло удачно, будет выведено «Hello, World!». Поздравляю, теперь вы можете компилировать 64-х разрядные приложения на D для Windows.

\n

Основная информация взята с http://wiki.dlang.org/Installing_DMD_on_64-bit_Windows_7_%28COFF-compatible%29

\n

Короткая памятка для современных и старых сборок

\n

Главная мысль остаётся той же: нельзя смешивать 32-битные OMF-библиотеки и 64-битную сборку. В старых установках DMD под Windows это часто упиралось в ручную настройку sc.ini, Windows SDK и Visual Studio linker. В более новых установках официальный установщик DMD обычно делает большую часть этой настройки сам, а для нормальной работы достаточно иметь Visual Studio Build Tools или установленную Visual Studio с C++ tooling.

\n

Для простой 64-битной сборки используем явную архитектуру:

\n
dmd -m64 main.d -of=app.exe\ndub build --arch=x86_64
\n

Если используется старая 32-битная сборка, смотрим, какой формат объектных файлов нужен проекту. Старый OMF и MS-COFF несовместимы между собой. Для современных библиотек Windows чаще нужен MS-COFF, а для 64-битной сборки это фактически обычный путь.

\n\n

Типичная ошибка выглядит так: код компилируется, а линковка падает на внешней библиотеке. В большинстве случаев виноват не D-код, а то, что рядом лежит библиотека другого формата или другой разрядности. Сначала проверяем toolchain и зависимости, и только потом ищем ошибку в исходниках.

", + "readingMinutes": 3 + } +] diff --git a/web/lib/articles.js b/web/lib/articles.js new file mode 100644 index 0000000..960e64a --- /dev/null +++ b/web/lib/articles.js @@ -0,0 +1,17 @@ +import articles from '../data/articles.json'; + +export function getArticles() { + return articles; +} + +export function getArticleBySlug(slug) { + return articles.find((article) => article.slug === slug); +} + +export function formatDate(date) { + return new Intl.DateTimeFormat('ru-RU', { + day: '2-digit', + month: 'long', + year: 'numeric', + }).format(new Date(date)); +} diff --git a/web/next.config.mjs b/web/next.config.mjs new file mode 100644 index 0000000..5bc715f --- /dev/null +++ b/web/next.config.mjs @@ -0,0 +1,10 @@ +import { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const nextConfig = { + turbopack: { + root: dirname(fileURLToPath(import.meta.url)), + }, +}; + +export default nextConfig; diff --git a/web/package-lock.json b/web/package-lock.json new file mode 100644 index 0000000..fa80107 --- /dev/null +++ b/web/package-lock.json @@ -0,0 +1,914 @@ +{ + "name": "progcode", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "progcode", + "version": "1.0.0", + "dependencies": { + "next": "^16.0.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@next/env": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.6.tgz", + "integrity": "sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==", + "license": "MIT" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.6.tgz", + "integrity": "sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.6.tgz", + "integrity": "sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.6.tgz", + "integrity": "sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.6.tgz", + "integrity": "sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.6.tgz", + "integrity": "sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.6.tgz", + "integrity": "sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.6.tgz", + "integrity": "sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.6.tgz", + "integrity": "sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.30", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.30.tgz", + "integrity": "sha512-xjOFN16Ha1+Rz4nFYKqHU/LSB+gx/Vi3yQLX7r7sAW+Wa+8hhF2h4pvqTrTMc8+WcDBEunnUurr46Jvv0jk3Vg==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001793", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", + "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/next/-/next-16.2.6.tgz", + "integrity": "sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==", + "license": "MIT", + "dependencies": { + "@next/env": "16.2.6", + "@swc/helpers": "0.5.15", + "baseline-browser-mapping": "^2.9.19", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.2.6", + "@next/swc-darwin-x64": "16.2.6", + "@next/swc-linux-arm64-gnu": "16.2.6", + "@next/swc-linux-arm64-musl": "16.2.6", + "@next/swc-linux-x64-gnu": "16.2.6", + "@next/swc-linux-x64-musl": "16.2.6", + "@next/swc-win32-arm64-msvc": "16.2.6", + "@next/swc-win32-x64-msvc": "16.2.6", + "sharp": "^0.34.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", + "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz", + "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.6.tgz", + "integrity": "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==", + "license": "MIT", + "peer": true, + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.6" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + } + } +} diff --git a/web/package.json b/web/package.json new file mode 100644 index 0000000..658053b --- /dev/null +++ b/web/package.json @@ -0,0 +1,18 @@ +{ + "name": "progcode", + "version": "1.0.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start" + }, + "dependencies": { + "next": "^16.0.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "overrides": { + "postcss": "^8.5.10" + } +} diff --git a/web/public/assets/illustrations/bitrix-offer-api.svg b/web/public/assets/illustrations/bitrix-offer-api.svg new file mode 100644 index 0000000..5c2f8b6 --- /dev/null +++ b/web/public/assets/illustrations/bitrix-offer-api.svg @@ -0,0 +1,12 @@ + + + + +Bitrix API: SKU +Создание торгового предложения и привязка к товару + + + +CModule::IncludeModule("iblock");$el = new CIBlockElement;$id = $el->Add($fields);CPrice::SetBasePrice($id, 990); + + \ No newline at end of file diff --git a/web/public/assets/illustrations/bitrix-photo-editor-ui.svg b/web/public/assets/illustrations/bitrix-photo-editor-ui.svg new file mode 100644 index 0000000..d707dce --- /dev/null +++ b/web/public/assets/illustrations/bitrix-photo-editor-ui.svg @@ -0,0 +1,8 @@ + + + + +Редактор картинок Bitrix +Читаемый интерфейс FileInput +ОбрезатьПовернутьСохранить + \ No newline at end of file diff --git a/web/public/assets/illustrations/bitrix-photo-editor.svg b/web/public/assets/illustrations/bitrix-photo-editor.svg new file mode 100644 index 0000000..983a60f --- /dev/null +++ b/web/public/assets/illustrations/bitrix-photo-editor.svg @@ -0,0 +1,8 @@ + + + + +Bitrix photo editor +Встроенный FileInput для загрузки и редактирования картинки +FileInputcreateuploadimageeditcropsavefile ID + \ No newline at end of file diff --git a/web/public/assets/illustrations/bitrix-translit-api.svg b/web/public/assets/illustrations/bitrix-translit-api.svg new file mode 100644 index 0000000..301538a --- /dev/null +++ b/web/public/assets/illustrations/bitrix-translit-api.svg @@ -0,0 +1,12 @@ + + + + +Bitrix API: translit +Символьный код из имени элемента + + + +$code = CUtil::translit($name, "ru", [ "replace_space" => "-", "replace_other" => "-",]); + + \ No newline at end of file diff --git a/web/public/assets/illustrations/cover-virus.svg b/web/public/assets/illustrations/cover-virus.svg new file mode 100644 index 0000000..b11dc71 --- /dev/null +++ b/web/public/assets/illustrations/cover-virus.svg @@ -0,0 +1,8 @@ + + + + +Планировщик против рекламного запуска +Схема поиска вредного задания +taskschd.mscfirefox.exe + URL + \ No newline at end of file diff --git a/web/public/assets/illustrations/ctfe-engine.svg b/web/public/assets/illustrations/ctfe-engine.svg new file mode 100644 index 0000000..040eb1e --- /dev/null +++ b/web/public/assets/illustrations/ctfe-engine.svg @@ -0,0 +1,8 @@ + + + + +NewCTFE +Вычисления во время компиляции без лишней магии +ASTinputCTFE VMevaluateResultconstantBinaryready + \ No newline at end of file diff --git a/web/public/assets/illustrations/dconf-gc-cover.svg b/web/public/assets/illustrations/dconf-gc-cover.svg new file mode 100644 index 0000000..4dc0b5b --- /dev/null +++ b/web/public/assets/illustrations/dconf-gc-cover.svg @@ -0,0 +1,8 @@ + + + + +D GC under the hood +Пулы, страницы, маркировка и очистка +PoolmemoryMarkscanSweepfreeReusealloc + \ No newline at end of file diff --git a/web/public/assets/illustrations/dmd-win64.svg b/web/public/assets/illustrations/dmd-win64.svg new file mode 100644 index 0000000..c880570 --- /dev/null +++ b/web/public/assets/illustrations/dmd-win64.svg @@ -0,0 +1,8 @@ + + + + +DMD x64 под Windows +Не смешиваем OMF и COFF библиотеки +D sourcemain.ddmd -m64compilerCOFF libsx64EXEwin64 + \ No newline at end of file diff --git a/web/public/assets/illustrations/firefox-timeout.svg b/web/public/assets/illustrations/firefox-timeout.svg new file mode 100644 index 0000000..1c21452 --- /dev/null +++ b/web/public/assets/illustrations/firefox-timeout.svg @@ -0,0 +1,8 @@ + + + + +Firefox timeout +Когда браузеру нужно ждать дольше +network.http.response.timeout = 600Для административных операций, а не для маскировки медленного сайта. + \ No newline at end of file diff --git a/web/public/assets/illustrations/gc-large-pool.svg b/web/public/assets/illustrations/gc-large-pool.svg new file mode 100644 index 0000000..3ebc05a --- /dev/null +++ b/web/public/assets/illustrations/gc-large-pool.svg @@ -0,0 +1,14 @@ + + + + +GC D: большие объекты +Метаданные растут вместе с диапазоном страниц + + +object > 100 MB + + +Один большой объект может оставить заметный хвост таблиц и свободных страниц. + + \ No newline at end of file diff --git a/web/public/assets/illustrations/gc-small-pools.svg b/web/public/assets/illustrations/gc-small-pools.svg new file mode 100644 index 0000000..6d9e68f --- /dev/null +++ b/web/public/assets/illustrations/gc-small-pools.svg @@ -0,0 +1,11 @@ + + + + +GC D: малые пулы +Классы размеров и страницы памяти + +16 B32 B64 B128 B256 B512 B +Каждая строка показывает отдельный класс размера и фрагментацию внутри страницы. + + \ No newline at end of file diff --git a/web/public/assets/illustrations/jquery-webpack.svg b/web/public/assets/illustrations/jquery-webpack.svg new file mode 100644 index 0000000..af0f34f --- /dev/null +++ b/web/public/assets/illustrations/jquery-webpack.svg @@ -0,0 +1,12 @@ + + + + +jQuery в Webpack +Один экземпляр библиотеки для модулей и старых плагинов + + + +import $ from "jquery";window.$ = window.jQuery = $;new webpack.ProvidePlugin({ $: "jquery", jQuery: "jquery"}); + + \ No newline at end of file diff --git a/web/public/assets/illustrations/php-ssl-cacert.svg b/web/public/assets/illustrations/php-ssl-cacert.svg new file mode 100644 index 0000000..5806d42 --- /dev/null +++ b/web/public/assets/illustrations/php-ssl-cacert.svg @@ -0,0 +1,8 @@ + + + + +PHP SSL CA bundle +Ошибка лечится сертификатами, а не отключением проверки +PHPrequestOpenSSLverifyCA filecacert.pemHTTPSok + \ No newline at end of file diff --git a/web/public/assets/illustrations/preg-match-all-d.svg b/web/public/assets/illustrations/preg-match-all-d.svg new file mode 100644 index 0000000..e61bafe --- /dev/null +++ b/web/public/assets/illustrations/preg-match-all-d.svg @@ -0,0 +1,12 @@ + + + + +preg_match_all на D +Регулярные выражения, группы и позиции совпадений + + + +auto r = regex(r"(\\w+)=(\\d+)");auto m = matchAll("a=1 b=22", r);foreach (hit; m) { writeln(hit.captures);} + + \ No newline at end of file diff --git a/web/public/assets/illustrations/taskschd-action.svg b/web/public/assets/illustrations/taskschd-action.svg new file mode 100644 index 0000000..d7878ac --- /dev/null +++ b/web/public/assets/illustrations/taskschd-action.svg @@ -0,0 +1,22 @@ + + + + +Планировщик заданий: действие +В аргументах браузера виден лишний URL + + +Библиотека планировщика заданий + + +Update Service +Browser Updater +Mozilla Firefox Task + +Программа: +firefox.exe +Аргументы: +http://example-bad-site.test + + + \ No newline at end of file diff --git a/web/public/assets/illustrations/taskschd-run.svg b/web/public/assets/illustrations/taskschd-run.svg new file mode 100644 index 0000000..ee599c5 --- /dev/null +++ b/web/public/assets/illustrations/taskschd-run.svg @@ -0,0 +1,19 @@ + + + + +Запуск планировщика заданий +Win + R, затем taskschd.msc + + +Выполнить + +Открыть: + +taskschd.msc + +OK +Так открывается системный инструмент, где видны все периодические запуски. + + + \ No newline at end of file diff --git a/web/public/assets/illustrations/tilix-cover.svg b/web/public/assets/illustrations/tilix-cover.svg new file mode 100644 index 0000000..4f3be6a --- /dev/null +++ b/web/public/assets/illustrations/tilix-cover.svg @@ -0,0 +1,8 @@ + + + + +Tilix + D +Desktop-приложение на GtkD +GtkDUIDlogicVTEterminalGNOMEHIG + \ No newline at end of file diff --git a/web/public/assets/illustrations/tilix-screenshot.svg b/web/public/assets/illustrations/tilix-screenshot.svg new file mode 100644 index 0000000..e0cc1c3 --- /dev/null +++ b/web/public/assets/illustrations/tilix-screenshot.svg @@ -0,0 +1,24 @@ + + + + +Tilix +Тайлинговый терминал с боковой панелью сессий + + + +project: ~/src/tilix + +sessions +build +ssh prod +logs + + + +$ dub build +$ journalctl -f +$ grep -R GtkD source/ +ready + + \ No newline at end of file diff --git a/web/public/assets/illustrations/vibe-api.svg b/web/public/assets/illustrations/vibe-api.svg new file mode 100644 index 0000000..6f5db37 --- /dev/null +++ b/web/public/assets/illustrations/vibe-api.svg @@ -0,0 +1,8 @@ + + + + +Короткий API +Минимум кода для типовых веб-задач +маршруты рядом с логикойпростые настройки сервераDUB-пакеты + \ No newline at end of file diff --git a/web/public/assets/illustrations/vibe-async.svg b/web/public/assets/illustrations/vibe-async.svg new file mode 100644 index 0000000..eeb0cd3 --- /dev/null +++ b/web/public/assets/illustrations/vibe-async.svg @@ -0,0 +1,8 @@ + + + + +Асинхронность +Задачи выглядят синхронно, I/O остаётся неблокирующим +fiber на запросожидание без блокировкипростая модель ошибок + \ No newline at end of file diff --git a/web/public/assets/illustrations/vibe-cover.svg b/web/public/assets/illustrations/vibe-cover.svg new file mode 100644 index 0000000..3651225 --- /dev/null +++ b/web/public/assets/illustrations/vibe-cover.svg @@ -0,0 +1,8 @@ + + + + +vibe.d +Асинхронный веб-стек на языке D +HTTPserverFiberasync I/OMongo/RedisdriversDietviews + \ No newline at end of file diff --git a/web/public/assets/illustrations/vibe-db.svg b/web/public/assets/illustrations/vibe-db.svg new file mode 100644 index 0000000..4793767 --- /dev/null +++ b/web/public/assets/illustrations/vibe-db.svg @@ -0,0 +1,8 @@ + + + + +Базы данных +MongoDB и Redis доступны из коробки +асинхронные драйверыпростые запросырасширение через DUB + \ No newline at end of file diff --git a/web/public/assets/illustrations/vibe-diet.svg b/web/public/assets/illustrations/vibe-diet.svg new file mode 100644 index 0000000..8d47d4b --- /dev/null +++ b/web/public/assets/illustrations/vibe-diet.svg @@ -0,0 +1,8 @@ + + + + +Diet templates +HTML без лишнего синтаксического шума +наследник Pug/Hamlдинамические вставкичитаемые view + \ No newline at end of file diff --git a/web/public/assets/illustrations/vibe-dlang.svg b/web/public/assets/illustrations/vibe-dlang.svg new file mode 100644 index 0000000..6be2e87 --- /dev/null +++ b/web/public/assets/illustrations/vibe-dlang.svg @@ -0,0 +1,8 @@ + + + + +Язык D +Скорость нативного кода и выразительность высокого уровня +типы и шаблоныбыстрая компиляцияудобная метапрограмма + \ No newline at end of file diff --git a/web/public/assets/illustrations/vibe-io.svg b/web/public/assets/illustrations/vibe-io.svg new file mode 100644 index 0000000..22e2f93 --- /dev/null +++ b/web/public/assets/illustrations/vibe-io.svg @@ -0,0 +1,8 @@ + + + + +Неблокирующий I/O +libevent и системные API вместо ожидания потока +сетевые операциифайловые операциименьше простаивания + \ No newline at end of file diff --git a/web/public/assets/illustrations/vibe-web.svg b/web/public/assets/illustrations/vibe-web.svg new file mode 100644 index 0000000..297faf7 --- /dev/null +++ b/web/public/assets/illustrations/vibe-web.svg @@ -0,0 +1,8 @@ + + + + +Веб-инструменты +HTTP, WebSocket, сессии и шаблоны +статические файлыJSON/BSONSMTP и криптография + \ No newline at end of file diff --git a/web/public/assets/media/-имени-e1495740674880.png b/web/public/assets/media/-имени-e1495740674880.png new file mode 100644 index 0000000000000000000000000000000000000000..00289a00a4bf6e21f8a771cc1138a3381b8f55e6 GIT binary patch literal 47270 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 WLXmJtD`4pW{4mfl(XPN=zWaYZZDd>k literal 0 HcmV?d00001 diff --git a/web/public/assets/media/bitrix-foto-editor-1.jpg b/web/public/assets/media/bitrix-foto-editor-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d493e3034b97a212be92532995d3bc83df1b0b27 GIT binary patch literal 21727 zcmcG$1za6Hw=cXm?(XhVq`137afjk=#jVidQrz9$-L<&8dvPgl1&ZC>=jqe;y!V`Q z<#)d?WKUN9Sy?M9lSyVWYj|CH-2|Y>NJvWnfS^DRqz3?AUjXQ$j;4mrrY0nAmd+L= zlG1XDud4u205}-fuLuedpa=;A2?+rK2?q@g1%m*GfB+8%508k1hJuKMiUbdjf`x*L zj)94ZiGYlagN1>EhJlIkO9&7gR0jeQ77`K`0}&n(65D z3ViJY5CDJxFmR9wfIk5o0tf~P1q}l##rtL4ukfc300aYB0QI^8KmZ5TL;*(u0D#ZJ z_P-gX=GMAPTKrX;5lTKs9km$@T%@?^uA> z;jVF?*sSG>CY;k|CQT+2tzbVh*6c7ZmUYS=T67-h{Fo@BNHYB`5LggRvM~A9+<)OS zMaQz|%t{go!ThyWd+SYV^fB7?@n~I9xkKui>CE_*F5%cdKiNU)?J?(w&6!BwLRsl= zA)LC(@G%NnJ8Kumd4&ChvUVhY7l756)Ud-=4E@eYmnT$;zo%IOM4y-o{fz;2sx?ys z7IuHCTE$wVV`;?Xio75~NnsIgd7IqWUJbJFaw@G&))5$2Pc-19%pGrNA{8uVCH z&HT)J&jgL33Hhy~&Aqtt+e4)eQ0+SIwzXgUzgXEo;Y(Gukz36Jr@~q#Wxz zx+hCRR^$JXSK1icw>bLJ6nuSm_#%c|sa=(!Hh!QppU9|7GSGNX@o+r<(B^!99%CMT z9(wGC^}@bzP>C(;wSD3F8SBIQ7#i*y9?+ouJ4i@rrapX|yLd7_eQNeFg0*DeJM&Ww zZLZ#N{_^pd;C5kaHn>Do1GjB|%L$MA{5{%9H?FfvRx|bfF4Rl!;oiUE=wa1Nf5*y$veW8TL3y8%V~}b+u|2io zaO_w{-mX&bitnJ~arW@`Mi=u;V)IX1eqCXmqz75?e43W}Wo7%Bi+j#j`tRcVW!gra zJr3A;)Y6U|)6XS7Tr#^0?3>i|KaL)|-n9N_b0$sh=lo6DhMhvIEIBaUJU&sSiHSC3 z%H>8CX*?}Q7Q0%PL1pD}cGjrx%KXs|1acc$p}&v*8-R$@qSFcaQwSiZpqCS|cKi** zT2o+?8~iDSJ2w3HQcCL>l0T)8j@?F9fxm|3@~>hCYAmO_rFQfeEzWh8vzYk&X`aDKyWZf&>9Q| z4gmjE3*2u(V0;&grLbOu&_y4Fj+~+IM~<~L5my=Xz2q&f?Y!N#f^ZSozPQJ zWh!F385%OPUHP=N!NZ0W#Y3(yY0Ap+Wiy`j^cY$00o`1&(9soW;M=OJlT$wm>8=L` z^v&;5OHm_@vLS;5W0l_(M}`U*-$bgOj)%pC%IB(*mB>`gU|(AX|V|xy5eL zIP{lD-c*xr(ooTucU0dbi2FnPjcPQ@)#)(*Cqit6oDKkYK|Ou>-S$V^J-g4=bAqn( z(ieG(AFlx4sR4I?Qz;|41SxCk(YZQ_2dgA4$5Z-SbWgIw@cHQox?Ta({0J0S!kF!xH@oOvGaS0zmL&=)(WJ#mcXUG@3)iKd2m=@geGLYPoGY;)!*c*#y zR4eJf-z@*8YhV>>Us@o5U<<$(HdFkHQ`mb{RGNi+dgM^t@e05*wm)3+C|ud}j-QEF zpf^-R6SuOLhnqv%zKLV8a7)#eY^)67IxHu9BMY}xP#DVmrbA~qQ1&b{@q^<;mV6c( zf6c(1M9s=a!5HIWthG{=*>_6V;bOhh&9{Qre(lR%wmJ0&Ulj$!`AKxAr%QFbAUI@{l{jL!ZkXAuMZ>T}M6G$R-C7yRl8(A5QD*YqOvCo9`*m#(^B&=Ld0`ACMhFuV@~ zl4WEvlr*iMadCZNwd=LaU!3pbbenHiuO=j-@*L8HBEyl4#8g;tsVU13ce37@&u^D% zhC8tntqtduP*Sjlp5{AxSmF|}kl}_zAtee~VY_(>4~fUH8Pp!U_}r7#i&YZScY`FQ zQ*l}3_w)CZ^XHYs36~`rSr*Lb4jbT7yPMqQ@FbbCd$u)*jv$=VrNvOE3JJ3nUX7B+ z$MT9|N>4o2qG!CTZzgZsJm^O3A-8yNViuIx5m0U5z~msi9OmGyRodR8Lt@Sr|01VG zu@n@|Hh~ghi7C6gqeie8tu8~?lB}17;#h!J5$uosQMYWOw?9-Rw#_uZlxzJM-y86> z8QhoJ?(lv3!BM&iG*ARY!ysd;gL1)f$xv~Q@f;{gxzwb!2w95DJ{rdB(Y�vJi2N z<+kE&2;Nr5z9QFPp3F}TxBes%<+)l}ZdM%IG2E+MKFUz2D}YdrLN_={Vhp;yan=km2}szWJlao89xn%;L|O^*J}5mbo|S zxlt!S-%6ds@DnV1H<(cV$h!U!r<61U-}jly;Uhowy29a)TEPMeA)+`gM1{O4MbX36 znylOjYsj1zR#*WF>%54HsL@2Z&WP@p4GQm)3sVE29+4K)*MFPSuJ)k?eluK>tP>d9 zcLU3JC|fo8iL?O*!EQ0SY&Z9XI!KyuTkq*!xL$kKq%`FlP1ADhL%?n$--(e!0o5%!aN}H0cVg&CbE!gXgm*R zA698@5Er-Jn4tR&Px1~qN4Rk^rKAdhiP?0x6GZWM**Ty*EYf5_bxzGFf`a)aqD<=o4^Zc#vw z?}EUW3u$p&h4~`B`lsiKkPoyS9bVs#Fp9Jb7;ojO=<~d3O;KmG?7l0T9jU#&pFB+( zhUdF!+Is~+(k{xB*kw50Wa<0oSv9zxddGRTxp02se8Q?aeGT#owmhphl<w2v07yyA#cCIXSoO}`eA354;bK7Qv(pDcRT$>G&@KAZjK zw(sSEQ6MRHsF%4S=vV$cCpann=I8#WPFBi|pK{x-EjkBxuK>Z6k&y)X-P9k(KMOx~ zLhZF?ao_u;W^i;IUth7UHy5TU7ua4ZUV$~x(8Mayv=}@h6TZ+@xWQ7xVu}>UgzPYZSYptlitC9D zQ&R3bo7Oakxui;|;q*=ENp5=}v+t30&gd~2q8P*j;+6_?y0e2Gu(5|Oi-a$TTGk{A zEjq%!&oyj^PdkvgTgcNoF-E|r$op^dJ2ginSjxhd+nQ`q_H9w_%}7)B_rWg9v72*?%4=vX+9ePmC)aIAChGJcPcgtfGBZE0r0##t|GvlGz z{Y)n#bEIYwk;KLr#(e7~yWBlZr;}&gQD+XBPt5L!tn`^DsHHzB z#$xT$iGlLasz|l_I&ablHRX-xVzpB2)3HGTP1k>u{}<6fzb?WkcVX97s$OR-u~d z3z6LJEdwKa$LQFvntnhla z-*%1XqD~sw&a*^OA8S{sr_Z#d9* zX7$_pEH16*1cER;2ocxM91kMCA3FLzrga|89K}@;6TYPL#&D`m5DD<|)m#S5TG%~G zlMg-(%k2+3zXH_1wh+KMiKe9StSB*{7io0+oZnDHcd%U{_p6vI-P zgo2Gw`2xrU;KEl>D6Qp%+hiIQ3p&Kes^u3v{$i2wYfyE0OP}@n?&L zeS#DayEy_^VhS0e>vXzga;{RkT(DH9ei%h?TYu0Dey6rJ^kxW~Tl}P+YL*cV%LY1t z$1G(|?G0%INfB!ntY0^@lG>FMpuT8^!Gc~hQ7?_LK7ru2II-0EApm3L4U`p}xtI&4 znck2V4U@2}p(UdlO|X+619D-h&fDNvK5F8o`3JDqt`qy;z*K7rWMv8(?_G`LgVHGlrnSsP$i_4qFBxhH4a`uhQsj2PW zz969xG4jjpp)_&y57=Vj5LGeAzfAbORRJXkc9@LfPQwVeRF;Lz72eEl2Je?wmr0CM7AcBMU;ZuzRT15Y!ve7jKoE=rPeI>! z5nv?xxzmt|OattdwP822L;f$=u-V`r;Xa%?L_P6P`CF+HQR^;Bk``(q+pjtgcr8 zE@%28v~JIS2jO$+5+VuBa)x+eU8&IQM?=A0=o)N}J!{Sg_v#9nip_JYuL0Jqd2k8u z#bZas2O?eOj^F#k3S6f0$e*a4`X*gFM+gmv^eQ*0ml+i@V7(Wme<)m}tYmD7IL`Xo zW>k?`vwWmlV0q~goW%`aky)z=S z;?p|5LGh2Z=Tsj=^eFB6FeSsB8`V!lAmFE##8UnO)rw0^I1kBc?HPiB{!^;Ka}riIgC#m4^jHPFGJ$D zthZcYV53((k*m`${4v^>V%h6D4PBwV{I+mZE~QZ!=OaCKu7G3rJboZ5AnK=l`+C|0 z?X8vG=br;@$%n1d1!)o5IsBcxHr7^(SXMsVtv2X@w7SRl0$S?t8R*`X-+*_Q@An_D zAwV&ZC%7G{H!e0U)N5JK60iAu&^Y5SzWXQl>y_zD%QX zWq-LE)Q{jn@(1PTZ<2wd+ph*alU6CFTA4?RZ zPNsguHhYXDraeN4h=e8)&1<%U&9he?+SH)RniMD)F1ns9akPB8{;rei&G$1gVIZM|rsqG6_|Q4J#O_5@eq*Hp2E7?XBIy8UBGN%(I>*|f0I#%7j{&&q)e)MOVPj1tKbL~x_ zL&-w^@mwkVsq2L!*RSpvei0RzO?Xt3Xz)v5!qY|1#&lI_ocT;QLmLe1*p#*5{cU;~ zUk6I4{2LCj=?Dj7K`BA@OC%kFl1eNXa`|JPV<;QNxmHX2^O)x0Q*s6H9sZWtZC+y-lek~ zHgbMsB(-HPiMm}la_wG_j)bhB$XgM{f`V?Wc9D6%?&citRh~xrDQx^kFz&VqUPC#z zdV8%lUgo=zXGc52u>4Dak@RtVxH%4h2TEmCwz}R+Q^AjIHQ}goTz~PDRW`SD!`zifB$z^ zjml@RENoahH_I2_=EyfA8Rx!X4ge?|935foSo;iNW^Hxu#6gB+(ronlbxDop(cwO* z%}_AP%~ZDRb7GFdWQZPX^N_wv)$=VfZ}v!ZT+CgM2$yLy&s{j-`h2*7=(Vlk58om& zF7IV4iCT#+y@+e^g#Xf5_(Un#$Rm_d$O0+4<+WXS1|P3oU5xrg=_gLgsIRt$e`^CR zBZ&>rNP~71uE2565>`9O?}b6(WS8PZD56EeG0jS{6U{$OBuwex>P|vX=g1DN!&o4C6CsPpyPrWM^LH9 zVe1)!jcB;lCydRwvb^1{;s~R?WjC7lhk@-}5?+Cs%Y6k{IaqIhc_p~R35nr@wPZz24!td znWNv3=E^&rX)2aoYp|-+z~pGuNSGB3VX=K93}sB&uF2mnm7~#Arh|Jc)*9AaX_bBK zS6w&1<6JT}N1)k~8u^``wt*3c3q|_`{lahB;|P@xHJL!+j*Dzha4XU0T_IVE27#1x`vkeM`T+{G z_YdFIsOBD*qSvr&E8cJan5u4Ybm%W*PjB4`MPk=JVFuU!#NA|!wkTuQNU*f#)$piN z2L1fGT> zqI-Fv60XxSVqxJ(90^_&280%#t}iqyPJz#+X(C97sS#gF2uj4WgF1XNs9ph$H+M!o z3$23vp=i3UNceB*Vpk*jc6@KsMLNj{M@>%y41rw6BR`7LA&~Fni`-V-qME4>kIb_!>~2@G4Td31T-5{6PAQ~0T5wa*WBo4-ZfY)Hn2BE#_u!~ zU^VG-9A`Ed++#g!{XS)OTH(H0Va(44Qr~j-^al_Rn!(`Xa25M9Z1Iu$7K4tgGTd#1 zl$^hMQ<|p>7uvC9d`(BOLD60)!Jfh zdL+7S#4dq@KRm`!5b=5K8a|gKAkLUWx`Xq+0{F1~GD>agC$GW-2*m;HNXbJ>n~sno z!#e_Wj+L&@qu0Ku<#sA3i!W6>n)l|!p)YK(7k#gQf+s8fBt~NFC#h<8o$i zEdQ_lU-A66ggvd>-(TiESIVEy-+Hr9xGNfWj^ED;Hbg9JxiR0z6T=M;Acvj5P%Jd{ zLi(`5Tz(RmfnK(eyz}m>xhNbW@4tNouy}SPF2G#b4O9}tTgYb3zXH%Kh_L31@4s%V zob-7YJXsbkhvSiO_Iu+Iuj>E&8lidOcAfcFy1uGU&lf$W%bJvp(7<`XrIiJOhxgYC z5}Ewgt{1e3r_2Rd9fe0kru!mAZnaZI^cJ#kw6Z|TAGROhXM4FbzSE#Ai=7{~+HG*u zZeh?#to*NmxrZR`$X1C4Tmm>k{5B4o?u-Z>=Z+LUHU$B4T$4}&wYsi|b6p^Sa z1il12ztit|1&BKSbqfJfUkOg4x;CaOx0vUJdRIkRwlZ;brQK0}{`UVza#FkaVDo!q z2Yxm9*~m5r#EffXGPPy6e?FQEi9}`cni0Y-E-ORqwJ*cKcZ+h-(hua>Y0YgW5Tbt3Bood z&}G7}iWdM96~S~^oW`^B3i3be1H3^2dD{Sg?H~Vg+WPCU5*0xD*Y=lTj*xH6MNRkC z^d$+C!9TCI1xathtsN(5aC2a)fhEj=j9UHRY@}EKb}FWVQLb#W0J1Kq`~i#>a}0#3 z08PMLa!(Tdwr?s*7yvI0M|m$@kyQlM09@G^PNyyu%0h%5U?pq#F3~|~97fy+Q97K~ zal*@>s?5gtuRkMl1-Z*tz&f7x9)>-uGO7W(2syk?ZX}eI2tAmEn4xvNQrEbYxQ`r6 zID=y-7j6kmHEa%QV5O2II6Em8kd2I~VT5MWET624DnJ6OMVtU(EPyceO`dOR zbQmBN6$d1m2rU)d${}o>!TaiZFk2mMVu?qX#*AdPMJScW6> zBF9yd4uZqmRN4TpO@C{HMd5%%7=;*eM-*FynO;HvQP2T4Pa@sQRiUfFxnq?Zp@MoZVnDm(-6zA^d3;Kv)QI zNC-vS3);olxi?EAlr&smbixwL?kLqHL5G=!)NU5Zu3x5^FYe}58T0}t+}|*n5R=yu z9MwSi7>JPaN<3?cRiJ?5*ehq02Fmu2#3QyzV%bX zhI)@d$Ix|Ro*@iC1mGZ@MCL-q0Q%uck`mpe2mBhJ$AoSjHp@{l-U#83ca9kUH2YQ* zfu;Qe>GPn#PL{)D^TC?a8TTE*W8{AeY%Vb~IYD3v+Y1|DVqF5(E#^fCgAQ^pTs^Qf zG0l4C+_i5{X9qI5pFQ*^yjh`{wy%Up$9Dl;{;1N2pI!lbp#4e<{_e1gn|Z(+&i}~h z?9mcAC@tz<(xDM{d)BOFhZUAWu@6cYGg z#PjyPP@iEMq3_MPFgT>iK7+xK$RB^IZK1jam|@CYJ&W!5pu;jbA-$y_BiIm95WhcG zq7nv34Zs8V;Q4*BOrAx=QK9Q(v!RPx=LuTfr^o=U=_6o#?*LNd763EPiOJKqO(B^m zfiN)iBJbZp`hI}K!9qo`6WA5eJ0(9Z1V=LLlI)eCebnS1gI*D;+U?;sDxa)Bm3?C> zRmvX+&58~f8|z{|=9PBR<+F&Q$OPkHlE*e@KLs>??`$9UKZA9-+8)}5zpkt;75un-CSY&aHJ3b zutWn!xKLe`vT@K9$=pGMP?CKd?r2{8M)UlQ!I_zCQm3(LYhpNJuo;)&>Do9oOo-W6 zLV7)@nK9+GAE4KVMt78|dzgYo-v3MyK}$n+2fj=}Fx`;hL+^$F_%B-Dp2I#{$r5yJ z3ymRBAh;laRf8)eei;lXVh&FnNWnFO%KysXR)b{IgckKQZNfu%pbH&PV5~erX>|eb_^aPJ_(^mJF*j} zj`4vJ2deoWND~{Zg=Ob3E27}|F9VVK?AdXtN+G9Wh zME+_d2va7cXi)2T^3g{|YNaM#U+~C(eMsG{MCk(N2hXSObFg*!^{-5k96|*P0C#34 zCQ;6|HDMbc1DHa=ExHoS!%yYjPLLJ=Fw641WifPCWr@H~+i)?JVW@TW5R2YzBE2EN zy1@LQ@-@);08D_Ky15|u&D`>+*7+>6^O=mHs3dOmHe5p&q`rKhCwwao1j~klYGrsK zwe43=g`E}2427T$W`mU?u+AU>r-Wdd2eURl;UI&N11B_w2^$^=Lxqch;2?Gae6z8# zJwSmmW`A5!|Hd5PbbFH7tkV7Y7HxW;(x-t0a*3n|EGLBBV6mAj+zUw-KCqh8+cgOy zHB87t;Rp`>E(D&h())x2;;5U7g$O(%@7kHBBl~uckx3Uu>L>G{`(XkcE*26h&GOrO zS%Plp=$UO8KCo{@b;8yUH<#IClu9{)Ph#25i@C(aA({QHET%2inq~;76`O2!z8fT9 zKA5B*vg0HHRqpf0j(}bW)28OI(itS>LlH5$r3w-ujQsEu#9I6yDllJ7aKj*lM?!ho zP)wKfC9c6w{_xp&Km@>8tTi6SPSvsYGTS_ar+acGvO)HiJ$zs%3)D4>X5Yu}C=K7? z@y<5^VvFcL5MU6|)ySVo)O{&pG05P3h*(q8BC-=tjrK(t4v~VMz_ROQV?M?{ zjsfxjD;P|l+=IB5ATN@+<9Q90gQe&e)NF(K`7FCm&%JWpotqH(-u(!u=l$L!-~^@v zAse|hlQ8cXG2W)1OzK45S01D&UG;<8FO~w6RQ>A*s0*WT4j(LMOqh?>m{1X^0IYY| ziP0y*L%K;dMBD1E!1Q@r$(Dc<`>qPqYnN(26`yeApSW7YZWaNaoBULqXl)%9o;W2z z+uEU}5P6?CO|w0_*?VffoUUNFK|<^7z(2tC=+>?P0Avg~{>i+GsQv{&WGyw0bmz;$ z)E{%j5BzyQuWH|CABF`+Y#E~@QXk0XN{OwEJ&y7CT961gk8#D5d(aqckTqUm5aN(p zYf|V4*=Q_3Bw6}kkYDu@MEl3iOC{=KjQAkh;4Cs_gJnw#M&Bom^-hjdhQav`52;egp{AW<#2R zmS^EUs7~LxZ;$|mW$YXAXH;)7{ptT5@tI=F7rPss=VLN=0D3Hb0BbZJXd+zVai1Ob z5bbtma>7(k{1I6u^WLLJQMnUzqIWw;H(PPILsuwJS53ed+(x;McEr9=rf9)@!p^TT z>JP)B*Zh-=v=j8T1MZQMxr4{QhzZz$eKvh5cA6cyx##v904CFK;@oEBKU8LN3a@c! zIcR52A&sg>EJlflGz-hZrUn~uev9hZ!rKBeK^g38TKbM6W(#Vio=7(-;Gq(uKr6UQ z^@rPVcYM4NF(&crV?ubywmiLifRGRd2El?BEIueP=3TVU=B7CZMG;3APGIJMF_?64 zqH1+CEV?FnSTN!toPzIq|Lb_X3X~icCeDTsMy>{UjAP@oP*a5le8Gk35h15?q%W58 zjSiaUfX5?I57~fc&q3Cuqh*@}Y6{S8Vd^*f@7CGCC`{BMDc z>!uvP!M=*dir?Td?Qdd(a`fFlsFuYLfhvIsb>Pan&WsBZz{KBRe^dW9=W+tKkg-#aGEDzSP%`r|#;91%)ILB+ios6`g;z$A$%u)5JXX=Z((s`#+qfnH25lQwmM50A7xN zv7WpFLb0>;MMWcWEvf&Td^sl}={R38y{MOkN@<;iH zM1#NmLda$RIS-Aic6I;wirD>8y=t2B8;sNb7l`m1q)c7-1FoC><7)ElkLt!zR@}d; zOHutxbtA6F-<%@s6@NHu$NuqDN&6RP68>+x=J5|`yL95pOBgw5T(k5?^}iEMpvQX} zRM1;uFd)P)50}4OTtIJ)QAwFmgoKq09Y}Jz6@6oBE)4$V6oztSox0yr`Rh0HHX|8Uv_q-LH*L{-&m;>%}MxXUMRtC>z_= zK(^a}zVar!kU@yCPU)&LNWbxUHA6?a&#`%s(1lG;Mi7K4gsY*Sm%UiF8H2Kj&DWgn6ILp>mPDeUXk-!Lasof# zek6=M^~b-&n{$1VhkNe+Dqu+nZLe=E{8-;n5|UbvbhX~tpjqaN z&lq}_dsfEPqh{y0$@_Ji7ra5Y%0+#T3-dWBw1Y%*Df@l9t3{vqjxzS&h=KI-F z{S1c|8=E0rnQUcwQ+!U7YF)&|4vkgxfba?s&N^h0^S0ppc%C_YmbrYMdC!p|WggJj z#k$^q5+q$T-41j@3raqnO~*?{&gzAwqnA>Nrm8fL#Z7?B=S>DW7~`Z^nSW_$?j&QJ zRh>PAXG+4jrOK^}ySSi*>zOjhMWIdpneipmNZ$gXaK|mh0boTUa!;93YPm>&m*sMA zx{$4o@+MG-RHP^N{Bez%0V-r!d%#)uLO;vgV%9f&Rj zuLY=%=+I)EVfjN?LDgZ#6Hq8AKY7hq-YU)G`G{*hu_V2_=6!e|(Hfwci9d}nK<)Mj zS+u|#YR>kyddX%bUg0k!y72TpGtz?aQ>doOaOf@$g8wp%LA?>AYtzuPPV>A8=+|WU z)XhGYcaM6?3D?z1ysu{WD29aIC9(1(>z*Vh#%KR1VhM9QkX>^lLp~3AigrqnpDCrh z494sF>xra}ZTbPxN7r_)|Vq=(;GWs#JkZdKaqo&Gz zRradIZ9~81gAP`1p@9xwx3T({vtM1BNLl`!+A=i7x|UYf%HKEe2$LdltfWxW0SXgS zr%{=P75|KlQD;rO=P%|{%rPV&C1oYm!i9QKd;{g0Xb_DVE;tH1>WYa9uUP*(-*YA^ zPzzGG5wG8}RMaZfVk){ZF+*+QHz)c-oAj&^?opYNo6tHjg+^l0TBM@OH*e0(08rkj z+N`}x*iqTTNU$&8Skh>3N?C#FpGaXb*y4rvy2l0+76I}B8{lvU?+ zOFwHdi28m6QZ?tZ3X845Dv&w}!#E6E*|CRqCYh>VhT>-Yi>H;Et*p zYc*mXTuKfk5gK?Suz4*xdq~?7c6yYRP>|0dc?5q#Fyb@K5G}Z`yS$K6uSXvXW#-Ug zG1CS2zQdcISqem|3XGi&INDq_p99Ra0Z|T3lj<0)WgNYa;dF^PO1kM3d!~BMh;b1l z{D7O_ksJpGvvYMazZfQZNf^zMBK-{1bTV4hw$IGq!Y5SMin};)rCpft?Y+`VX0hqb zOz#8WZ~%aG2MJ8Pq4fk^=yuWh{N zxHxX~IBu0V=q+yLPV^*hr#Q4!!yC)cAd=O5wsVoEgS8MJN=D}dhb9Yt-`*wsaL(ke z1?n(PIRiUjc53xc6xT$zJTK!ju?i!co^f&$-ED;BMAWf4lo1UymgX^ZDZ}O_O=^_X z5_NKo2_mq!lb?rH=*+Scwcc!@coK<8&<#+IWSb?oqmq6J0hY_u0lNHdeF_Df1xo7( z&ks6xg>AqTa}?RkQHBedi{%UmOlld`HxmP}i&2wP5oA+6aZ)ejr>5|$f4Ylytm%Gp z#GL(f5=zL3V4GV#icd*i3%`H|A>T!6hf-QH6gj6Kus6aM9~72`T)Oci`z>*-70T6^ zR>5wJIPEnKOp+ydF6fgwuc_%lrq%~DhbX1T?m~SL_!7O^DA;$o9}R~gaKju|v-pF3 zc1N=9$M=j!46I~vLP6i?KJ}?OKL`y?#uwmRC9w8d-P2uWrUX!R;QK_ zF-_seLtiTrHN)aG%M>B~ZAG>g@tiT~^7foCn*j*v3?qN#mGWbJlnZP+^A)U0G#&16 ze$WC-V#?Lr(cZAbD4tZM)9C~VN3>OR8G|&XRN384OT(@7nDF6u_a+f< zepGr0u9DT)j4u(H8!a$7OAFL38JLA0qa8BQrJ)~~D-N_}3Z0!pQ8NH;L zXcZtd6mrzip|sZfqVozkhe0$YsyX1%Zh!W|ksa{5WP=KL=C^~a!tuhc`eJG0H8adk z$o&dPP%$e0l-+BSX?~#2o2ceW&ojx`aX=161QuWX0i`ge8#a^ns#)0dy|-&1q~=vR z!l@FBVW(j26n&+l7VE~>>i*NM`r1bA3!hYlx957*YEOd821p6O?-pz?U3zV!k8pld zm>--_>#8r%TmSV#{ZI2hf<{G~9f*cK(b0XHomN8Rr$?1X^NfQ9w8Hpf`4ZeUSPeU)cTn(gU>0fc{MY z322G=*ZVq@XLg`Ev<4=!bMkGne^L;2?RKOx4ze4M;R^FHGxS>o1=D_ld?unZ=iYkb z1tTOqoXpWsZYcx)wWDB*!SX(Wc4q!049Dm$&z4!F=_su)-0nu6j5K?sK6g%qgn2}D zD2^9>KXjBvM1f}qvb+-fW+Z!CAt%jw@j>A06UnaO9%I6zz39shlC%iWZ5d3bIJe0W z(1TYySzUBMy#ep=gZqiU4iu%x)W_J*ylrKxJi;sNTp+=h{dck;!Q>~u1b2W0?}VKt zg9J-1g9JzX5x2;Bz%DBYlAp6*V*+-!746=_!U;<>H^)LIl zI*&m1nS4$M*|+%1K8MeD8g1WEyu=VIB$jJ{s|@9sFU?zA8%!elUnlkyp$m3o z^=k!zDQbm#ru5_9VF5)rwW75=8Rz%PMowW2ymdJX&B)6LKsCr1p{77Ho?=wrdKvhc zy0!@d;tPy7G-wgg<0uh`q&%>i*c|;RWFKV-d9S`Xb zupwnVLIKVJ)mDrUNfHsseXd1t>-&~dkz5*LzjQm)D59uVTaD`wNkFjIP-?)e8wV>$ zJe#c=_OSaL+oHC}GpjX;Y89!LM_=;22!IpAl|XDwLdWsF0u;ipp9NSaZ|)}rXLtTz z^I$xsHu5+}lQmntHk#NWoIy({)M(aZRqw90-f}MiWi|`acA~nmzq!Sd0Y|l5Cbj&7YcrY~OgJs4X^?iE+%@m5= zM*6(MFYlf%)4i(dMSUCijxR58??9i3sSVzJ6BrBzUgGi5FoJK^b72to43YS-8o-yv zDcFs{Kr&nFR2SZ22n{=3Qn{OFtUZ|Hco;Ir&}3WJbezr6x_sik27hTDMY zn)nsE_?}8=p=M@?W;Xu?{l(pw=YH!0kY-QXZsF|RW%h|N8bu<4vUw!MtO3P>)C~#~ zR=&foWp~3i?!6G6iya~QHi?jF`bMTb{Ga0!C)}Uf4+oq=kBOtuadJtxEMBffD`Tq$ z@cOakUYI4w4T&ct9l#E$z!Z&;ewZ&^>(SJEVW#oJd-c}H_g58 zZUd;EKYAE@8+GrKnc%zdyW)j6zkRb=2q~Kn#jz~&hqH&~A~BcMi(Y&M@H^&V((+Y_ zPKc@o`&kkyI2`%-onw8zb2*!Zf?2rLK1Gy-x3|A#AAFm$N;;jZ0~tBu>~!Mp$aZ$N zStyaAyAJu}NRj*!3V{*sRt{Fej|fIIxU;qLqN+#&ujZ{UmR)1L1L{Xs4BU)b+wVwF zU(+jN;(F0I0pXu}-x>+f-tMU;uODgL7O= zxMKWOoM<`F_mrAJ#-1eC?bjp9&~c+X;fr5?5alnqANx_e6WXcmK(mGw*;P^Nfk!%E z__wcfS$lmQP?S^p;VQ#r4i20_01dqX3Y-!t`~eE79GKMS$(_;m)CbT&ahGFu&Ev=; z&~!3^gx>-0#3Nk14YJCgN<9ba`pR!Cmx#8}KlJ~PTCOvw2`vi)36LPY_~;#^OK5`N zBNUMm5fXy*M^&2C&_!B;6s2P*5kpgYks@8BE4@hX#n1yHO@y~`cXoDv?BD%$XYQFf zbILvEe0S!%mt1v+>eq$?F+O`$7sFsh4Fx=4ATY!)uN-AjO?HH|9{kG2;nsTe$sg!k zJbnuFUnpN<*Tpa^Hg5e|Hgp7-9*4BbfNTX;4gH$~j}lt8hjR{);8-V&zo@n8CIi7&)%3;`6Dw-nw3bzSstMFc3b+5d=@H1Ph=vYhmIq=!QhA_eEEgr>sr&Hl{qjEsKjBdG@%Uf{UWsG-P z#|!*s`e5ZY0+Esm9^-7OdegWlph2uhk!%Jk8ve|t4Vc+j0=OI)8n#6x8SecWz+5#4*a{3t`IX6d}Qyk2mDh&k)oljhLmAMb3wenYwE zS^91MV=?d4Z?b<{P|2gx!chmSW;+sY1#}mW&K`Z{^x|v~2-E8E@|+@zxnr;bPJ{~I zm`auI`5qBC$?wfW<`84$3RvI48O3tHUj{DIKI?tXZq4_QIj9Hwc(l7M%y*ic;-F3O z?2Ps=O+f`;;uJvwDWo?*s5fSx4o8^aw=+99q+-{CRFvq%Rd+`FPJ}=PG{wW01FcuG z+QK>LlOCU!)J|RcFIH;GlSlhvaLW#l9lC2U`*z3v)}W5yOvF)flUnZd7aIQw|5I6L z!~KFl3okSi*>giy@3}T1RRP(@+EDP*0WlSjD_*kir~Sr0k4|4&HcLVV4Qg(NSW(ty z1*}kOJrs7(m>%8@^kR8flS0{kpWYCPJ-u}>%VK!*C26bzmf9)pg7kTDKYDUU%v9{B zm=JdJFkeuAfhD_yV5MQ8+v+FPS$kRJ9IaEY^^aG5r4y|AL0v9bt>hcjNT!NbJGaqO zs#*#+VaX;agcS`0?z+C%H!A5i)d2D2-S^dw%_h&fA-HKH;ZNOV@%(N%8y6!^aooSb zVlu_39N_GSR?ZJ+1!+yd2ayK~K(+`Z&9;4N~yK4`r1SZHxTAFSj=} zWL@)7`HmVQDh5VtG^rhkZVHccfGZWjs)9o5?TVn-id#he>94u=nC=lm$(4 z@*t>`8F?nis07C-_L!w=v{SazD21jM&0PF^WAWs1RTW*P^C1y55h(g|CB=we;p-3} z9U#e)hreQqqfso)(y{#E?}d0c#}4Fu#I^y@T9d#a)z!C> z_pV_{wHH@#T&@=_!7^Fxxz9^bqAE z6}{M|igMT12rlC<0r7Jq6tgtMs(gR?Mp&rR-_)!|)1k2jU9%yLpTBHHayJ z-zhnu_c}|_-@v^{e8Myza|W$~8Kbf2tf09ifVJOPPs5_Q_!D_2F{x+6LM9%CH06#= zv#lw%=R|qd$?<=QwS|s)=ShIrBkc^_JqqoK3Hf@win8}*KobNjdDns`F8u+d-WlE^ z+|;qma7`xdW8)~rVv-lB1Q;Fgc}ZQ~Srq#}jK3Y9ZG19~G*W;AQdpqfFY(1i=OSAj zO4}#Vm|WI?>g8Q?TxGH%Yh<$?zmztYNtQG2t6o?1D{-xn3_+y3qBBnFoz6-lFtENQ z*qi)Obb$$xLUd7ehZjk9!R81#aE(e-VY<(BpB$e82tikJ5lp}M3$#gT^N$)cus#VE-K=@~fb@+~{ViQ4&4fk*)ps6&UPCds0S3(UQ5rRQUPPSGV>x)( z{`RC;Cs#~>i~8PDrTbh|c^5ed5H<`eSBy8REv-T<(OY6QOTz0AM$xq@?)02>Lv`%& zx62opFCipa{;}8A($h8?W!Q+yO~sOh0S}qCI8MVj@j2`2v)lsFlcNQh{n~`@jlk+} z&vZLK$<8CHD&i~k^BrCQ)A2Nr5YNMkhWF1c$^2Kw&8cQ6XnYqJh(hLHE$~ThOz{+{VZ~4H`JmQM#z8-YR3iUxtYs>P)i>uN^Vq0h;z22R#-P)gTlr-S^ z8pi~*3f+$?d)uAJan5&hViLG+;B?_3Hem(BKQgaU)yE$Hg#AsX_hw7}QuKfCby0Hc z1)3Ra0Ce-F4ohA`2C3ob4Vyb8L%pyp?`W>Ih zIoWNH!uPy6Svl&yW}ZZN-G8LnI%Bdv6b^Y3yJ^4nba#lU8oB ztz56pGYl+-%>1u?_8-gFWV=JnOU<~luo gV6{i{|5TfHWh2-`_L;0IVGnvj6}9 literal 0 HcmV?d00001 diff --git a/web/public/assets/media/cropped-WallpapersMania.nnm_.ru_vol141-087.jpg b/web/public/assets/media/cropped-WallpapersMania.nnm_.ru_vol141-087.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3991c685c2165028fe013248cbfd44eda2193e59 GIT binary patch literal 142303 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%0DIeW`kq{(W$D7fIujkL{p`(~!F0;Q;|M|0evzq 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 literal 0 HcmV?d00001 diff --git a/web/public/assets/media/i-880x660.jpg b/web/public/assets/media/i-880x660.jpg new file mode 100644 index 0000000000000000000000000000000000000000..901fdb78124abd91d17550865df38e484802a7da GIT binary patch literal 39568 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 AEdT%j literal 0 HcmV?d00001 diff --git a/web/public/assets/media/vibe.d.png b/web/public/assets/media/vibe.d.png new file mode 100644 index 0000000000000000000000000000000000000000..ceb8c79a3e1e652b992d9ff683ad74155ee756db GIT binary patch literal 40981 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%0Aq}Af#u5^p^giC%k)#HhLKMr2Wd_3HK#a5?> zy7@H*$%g*63OxSTE~7p?%GpsYe65VdgKG<(HV`vt0Uw`m#cn5xdgVSL+d$j=bJ}Mq z;pD+aUSZGln7rNL$fVQO{QBh2U?DzvP27-HqQER;zjKzGq&kqda60Va+Kn{JcX0vPD!6`NVQxf*UzDx4Z> z(WZA{V@@_%pI582_Jm947CdKsJA?`Hi$DjVKqq-td;`Z#D>HywpmF0IW37nLSak?K`{z^AUFSsn8;mUN4lkmQ@kx!ms37C3mIC>-~p%|TEOC}vshkiZ6p1v#l zQ%c+i&epA=O2RtZVH@SSWI?p&=MT6V#((_ycL?)*-*F9}zp*zxiXc0-B})u?Mbqh6 zY2&}9tFtCw9&)^!e<+QU^R$`qrHPWLJEC98lbcIW3*=G4QIdR?HFo1XQz|nn;^t7I8Eoje|n?t2g&`Hw)8^kxqJMWY&xPN?$id@ z2)j<8t*x@~Q4V!%4xcd1)ptr6Q)!Fow)hUbf`zv%mA4kOhA7eE11S1)oq7Yw#GS!k z0RODQ$lr4cnBQVXKTY8{I8#D{5)ZIyKMfi@zfKPi@7<-Fd?R6m#blK%M3Bk$PRj&O z>giUeSypAICIiO>GlNrEnap6KN?@hrTz9bZPUFyjIHoMn(}wj(PWW z&Vr0lcN7flqD;QoPFfx;*usG8>%*1%(f^$PaCYYm(F6cyby6Q z+%`#H_w&=QjE*I_;cF~Uv^Co<$fd&`@8`?Be}yO-#M#=aC8tJas^Dua-$tTkF**6F z2@~==Z=&bu2a(3Chw{}Z-A0EY#u1lZ*@Adjw%*_I|KPPzWPsNOML<;s?(KZKt&Pot z>%ERyMVj6kn+nXatu2gZx`KSPE#dqU=2C)Oe&a@M_XVECWB8*P1Sh_Y+?Ex-ldC`5 zuVx<*+`K#S*V^92*L6Jr1w~EDj1v@TDZ& zALY{Z{H%nOS?2fwH{{K*US|jVL+Q_pEhsLOX4op{Z2x!oq++6q*4Hk8)$f2sy!*%H zr?Y=%F#ec{nOPX5wG0aY1N3v8QhQS(azTwj$MjP&t*Y7(n=_uTU~hIZwo*&u=Rqh2 zE1ffXD78CO$|rf%a@jAyEvlsqo!VJkJj~t88YS~d&^F!#c8Fq_eP;WrGP+I{8&3m^ z$1_kX-T;MIblvRuw~{(j_vnQ%Pes$FQT`YuxYR&j)eX^Ci3iSx%$Yg!%9BQL$q#J?;s#C3Q{Sl$(TymI9{;!&2*dR)g$?*E@MSFDaJlF0 z?U?~+yw}g*D@pZQf_ILa9`pk3HVjxqQ9qxTn@4%vtBAjfoJ$WNR}kPN>cH~8!`0l5 zdF5Lc$Xu{TNRXM$5yT&LEnb>b*DY7kp?G-ycg)?X#VeV1^77!dj>BUvrE^rdoEJO7 z4+uaa9t6A9?^+IIS)cv|HE+o#^b2T&E#b3A8W|=VPC#|jBVIUht}puazX~@A&yILh z@s~-pdBQy8ubcE2Ib^XK-e#3wQk6(PU17ZU+{Ubj#kvHJy}J3nRX25VvgE0&iifV& zkf-mwXEVMgAz&nt$ITC%<}a-83;=8?ayuP7PK39b;L6^GD9kI2$j7IEwf1%lpsSV7 zl6I<&lv!YS%f*QAf?3GgMWt8L?D{I{r}N@UMkbB{)up=JnGIJLpF(lYMDHuI=p>8e zRptl9i7J}ACkmL62KQuc?xnWJ0p1OW*elG__FZ@gk{p(#Lr4DpP4o)A0u$ZG@m22JP5YTb$g@d4~4zHUvU-1x?Q?{yPQgM4Mx%XWdmw~TH zNyNp`;8M0Mep`P3S8QG@S zdF^cIC?4%*(GDK#hiPePzZopXG0;Os#~knuIm`SV+{y2;rST$g&rPffh3$2En^nUr z=Z8lx*QKf|P$D|KO89Cd0-cyJaz10{F6W7_`!BCfsj~x#ZSW|_tB3*VymW717)omu z?BQ=yF?I%T5@TpC3%)JO^%?v3jPnYHHDP->fLbIW7VB+c@1!IHSF~~5^VRUm*dRVUHeW<0E?sUZ1&66PPt@*x=TXws8Y;xezn~u{eX^j93N(xw_o~Hd9JWNKk(&wX28H%Yo$X-Ac42g)hdm$pHzG zF5H&5+ZTY?@1A*0JGSPnu4Ka6GG(-NlWd7mZuulNr_XxniFT2boDy=tLE%!0=&4_? zfMjM3v@mOQY6U0B4Nh*dX*@xh2MY-3{#fa}Fgls7poaQv_Cm&4KC*x0i>awH;7TJU z1C-eNVE}d>#A--#eELfrsntn;SzWepkSjph#{?r=>fu#--O@ZJ5$`ygC0Y%s;oY9E z0bE60LqicDk8Pi-D+}JplN~jboAsbW4W*XO;SbJ$Qo`63R)#?N!ekgsw_%$Xna;jD zr1~=Z(f4vXfW9Ar*st9c3u%AQfJP4AX?$8eBc9iq)Z29;;9}C46(;LuH7m~V+!u$i zKyl9S!Q$lU2S3?8;$0UZ718mP@MR8mB)s22p>-W7mG|d>v+#Bl%pfQKOdjN*p=oSr zg;eikea{24{WB91REdLW?~gJ+CS;xEW2y|PJA=f6jNkoFycnBtkQ}80(96-&)}=rA znm$PYpJe9E&z=QnZ*BQ|=t>@Z%7Q9y$lMLt7B0CM9?L%d&YMTEk0*?@JOF0xps;ms zeytFIXoVNMLe@DUPbC8!JN?NThTM$etYsqI8Dlh42pGv3p6&%LZaMq9TnV_YFJN5B z0s&iBfT$0HCs;a7SZftYYwZE9k5;4Zs#Ymhbx@425~T&ks*aw2oW_)av3cf)P~zgm zD3@Z=`wM)0noc$)%6a3G=z#MjmTuaGQ{Wc`|HY{r0P*_KO^NhROrE7M?QhVNNhsev z5L7+dHJFd2VS*~0DyLLb6&6w15z){A6|h1zC9=a))!0}N5VF9fU%2K3NXE^8G26KC zgm)Bxg_!bRUe6=B>O7y;r?VQK0)@A+QYC2GXmmCdJmu zXt!3#5g?)xh-O`MfdD-fNh;;4XH>yAkqDAA_ir#GThs@ffEcgggbZ9L^w}C7A{JYl z>Vd_t0%RdIfE3WelR)i=W?lD@o>lb*^VKY=D=ki6TOXkIH6e zitPrC^l=bZSjj-KBu_B6ej^^H8c~~Tl~2-8LqXY-W|VTqUeSpxoJuZpw0IyCi`7Nv zFK^VPL8P4{7uBG~TR==+0ccnG*7BKYAo)WLcv;%YXZGcsG1+{=Y5J$tPO`XHq^M~S zh|q8>d+i;XQW@G$^ZZ4SE<@pyK67h1SO$OMtFlVU~#8lHvqkT+}F*MOMe3P{w*0*>Tw z!415EX7X^&`bLC^9njkXNZT&17w;A_?Z7y)DO*t^*Gh{Cvb*_*pR(<;1mHkK-=hA; zS02df=pmpQh_rkGkL)@1d}hW$4SXE|ICE*l6w47{wh2sR4<+l`e|e#K$H}i{#BG^e zaTzd19suH_2=K-SG>lr1i_-}RbT8G%fVI*|W~IA`3~?w=4tl%i5&-GE_Y2~qNYPNn zGS~xPDQ=xd%$qHY$zM}1P=@|}{ohXBN3uBQq@m_eQ@9{&&#ZJ>FWV;g8F z--5&aEns3S0#3V_At??bQ7`_OGTnIy~08vpoR2p}3Jf|D9R zqH;??S-xNc`PmROrp#7YQ=?C7{jBLdkW+s79tx6nv#{sw2l;K*3jEE$b0Kf!Bal7n zUqc(G$7YXj>xe<=!b3E?gE~1p5bYb<6DNfGFs856%!|3L0t%l?$7PJVjj|}hrUnvXrs8E*Smz0bWUjy zGQazk(faO*Q1J)_t*vsLi|2G}FEJ!fM2lLcVC8;OT|bU(LZTtv`@D6oBiWS~=-j4r z?ltP7w5$5)4t&b0JKOOG$#|@Zqw)me2hEb$GB7t=nERz zJSb_T6kivLtt9NZcccHYuB!)niit9<3+pw0wu%o80z)74k}xs^0hFfAhj&aI(=&W1 zNi6Zc^N6Ydansd%`fOlopcGHlM(&?i7)usrFU4NCw6Q>y?$A^u3DhRkoZ4;AUNSx`vOO(dN2bzi?jNM+D(|*Sk)uDt zl3E*q39w(8s#7Q2(>d`?XWxuu)t@yFK`Iq&%%OJ4lB22P(Cpnoj7!qYq49b+DMKVI z`fgi-eEOu zUt^J)jJJjlyS1@pq*3O?3`a-vO}hI8^7d436~NIc8(K&8)`tHRF)Mp~0UAxlG!gd4 zOzE2U0`0JtXXDDi)z-I#w78Y4`bMMFEpgpR`nSG!+vmzR{Pg4LXiK~hw3x4Y=#x32 zZ8X+Qt`rh#5W3a5+3h66RQvBmZpJ=(D;=gyf{7jHO3bEBu;-&gg4H?Ce=uErGKXr} z_Sdi8>1Q_x;`_Gr&-B8@>719IH8}|rtV5@t{@JS7H;IlSQf9fk=eT=J;D%aR(gVvg zvebzYsm~SgIRZcPQ8EV(X26;D_{hf&V}u{CyLa}FA=ke@rU)xcB>z}p25C04-IMqUu7M5{bwYKz|33Extr6}(d6{h?~&?aTDBz=Th#0< z`oWHH!}henwK9*cN7iU$te?$lRbVBQdPdb$-spYt2KBH}D2|92Cr z@4DD)u5kLG_Sym3^gu)FNF-Re7!za+%&0v7&kqpvD@sl)GJGgZ8VPLqAv27XQT=IR G%>MxD-Q7_D literal 0 HcmV?d00001 diff --git a/web/public/assets/media/Без-имени.png b/web/public/assets/media/Без-имени.png new file mode 100644 index 0000000000000000000000000000000000000000..08ce01ab0adae29b5deb27a6c03c7ee2e79fc1ed GIT binary patch literal 37724 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

6Lwpgq%VUd#=Bfju!Wz&b{N2(!zuHD*H z>iulcLCloxB6=p^X#S8d6y@cQ1x$ekVMUjCZyxz9$NS)@a z8y6Ozh(J2{7Nta<0^IJ7?*B)-t2H1MnFw zB$&*YG@UE@Wy5qr4sA+#tWrbnB>sUuF7u!DAq~@_Cv>1un6!I;5)TTROSJL5KUmD4 zuGKX zEs+Tf*GWtKLzw#a3}XV&#ek>XIIX4s(@OVR48Y8n0*ZiD{{Qk2vLj!H`!iD16UPd&5M9b6&qjR{njR?$`Q6iQ+QPnCjLY z?9r+lH9$Uf3J|GCkIWG{XpNPUy@4>g`A&|VRJzy#16+0PIP!ZaE+-^ z8D9D;3Aynb`Eh-TCq>Uf*Ia~TpGW(oLN{);1wmkLb-XkXIUy(S!@AS!^*C^@9#6)a zaSubB%%EKuv4<+vw_+Z-IFAS}7y?N3}|6gfU`xVYS^;j;Bl83yvD!dJo%WCm;qxmuhV7qelAXOsl z&Sp8o39y)cpDU6bD^*;!&a7GDOE55=$s=znAk4?lCB>Nn-7SNJo&|B3+MXS&!#O53 z>$TS|&v@F<@UPlJ)8%SL$86P8R6}Z{v!m#pO*m43(54#e?Zl1M6a16O@BO8|=r zPZa|4pam&$A^`xN@GEhN@`tX;Y-5yYCF3_c_de}oB#d*fLN1!V#i^bnr%4|pr$N5G zLn9>7%`ResSseP*L?!REo9PePACzGDex+ahX*J2kHm`b0q!=&&{pKHpjZzJA+;r{weZKl?*5x$Ac7U!vDcjCd-lGJHw-(7d{G zm4^34?$Ye*IhPP_0pq)DW%!b~Ic~{e$5O0pRD4pLk&j|Ioa>eGw3H|b#Qz*fly+Le z%84uE@hi6~V)Bi#;M@Sb6|`dPzr3-XF9Ch@7~(3!eZ|Rew9cW z>_=%*-aTzcF%a~tAHSbA_gfl1QT%{?WBy%;du~=Fty5m*Ax3Odu91FRe%eK16h2HD zgh!`kmy9)I`8RBN=IJv}nJ!n46To;i*zm-;of=BfN0ypP&F$X6qj%LBG9@PCgJc-j zJrHdP;Rk<7?8}N~O?FGs4O9oNfbt)d9Ul<$#Cy~+tMjmCYYnMreC{?Q1fTYp07U$p z>;GIzbbh0yaUQ38o9Wv7!m)x5Y>KB{6G8)j@q1r< zt}f~6<^!&$)olPu+~1=U6l|wSaP*7K+Q@)CpY#LaxKUGl>He>*QN_D0O?v>kOx^CAyl}YabISMw`8##?t7xa} zcPT|9=bC&R#Put_C>#`ObQ#x<=TB5LAO8%md&NR}r7gOh_4i@+#jx>RXqi|_=|^0u z#8V4}FBUeGWNL4w{MPq?ewyLaZsm*zgIf=7p6cqh6SGgyoOCcL;&%0>1dXZFY+oDe z1{1>tD;84Pc#&^1iJ=oGSxu9L2xj`#U%1QXZJ$v}H>u4z_*r_@eVaCxW?`AktbsJ% z8Tf;DdTgSu78QE;-HPynL1?=oKx{v+q;-}71mS=dg0>m@M;Q_hyBbJmPM*4qp|YYs zWzBWKSnjpG-Ve*nwy-*bsD*qaRxwT+hFQ@Rn}bcuOeUf8k87iF6JKc1JZ z+&UYuxBqr}A?rJE+Tu>|p8t=Lg$%+zWTyN31DS*|Ikx4Z%{BzWR2t6#aAVS$C*X87 zZ?^RYm*>l9e|JPn+ldhx8#*CvJQhZqN?)c7uWQmS1y51xQY{~){cthIYtZeFO33XB zks)v^{HxY^0eq0?msQ9P543&2;b%$@$ zu3RHV>%-UFI}b-j$@I!#r{v&d>o$o~4C|_DF9n|~WoIDtbUt)Bwix`vayqN~{dnG- zs!$H!XmdVQB)QFtIAnyvm)Nt+|H{*Z>|Yk_+s#Ri190(EIj-7{whnk(?CH;6Q-j=t z^b#!tH9;7H^zl(h1QIvi{AK(IEQI5{og{y&#&{PtEL2zV`Cqg~Bqc?=U9Gkt1tw59 z6nb1TX@iz*v@F^Zp!NInJ5;GhB$CvlF|%l8O-^3_$CVQ)l6>B!+0H<#_B@P=G91@u zB>DmU(@prR2y&2FKbFRRn6liqfru?~0@xP0=sB+$r1?Th1IB9RAypFbS_x zCzDAWuzypELx*#B*VW`>^ z;P@;m_0!ghmy=3iT#!zN41Nx2<6)}Ik_d&zFJL}=$ty4q)_(z9>p?)vfMmae&%AHisO#{UAO`8=m2*#)5(% z(enYNR<}X;{5)sm=O`LoNx{&qgP@jhQsI%nI8g9)_n#MGV7vzWM+_2%R0kO6A0*2x z!DEqrm*U(nLr-ogcB4gUWY*S#?OnS3fTaEdXUpS|B?OCZONPfgsFp{R$7u=CWPu_5 zU=1LAM(wR8y2k21!qF^^DI%>0FUuEEsTlq^$tV(!vzo=vG8bU`_Z40x;@=3J5R*Wa z{ix2Vrw{u&8-iR-qvZ=zoYsT*QqD~0DPjcmU+X|niN=zjZ5i%6kRrWgk97gS_QBO-0oy*6h&Wa4NC& zte)j`5^i?Fl`Gd2pa<+~t#lPo(3bKMi|Ps^F=ZFGxL&T&3n&ATR7)xlOHfw>dqyq7i>^P6R}Qb*v@_OnQo_+T2h6RivSQELMnuZH%n$ zn6y?gjw7yFam|Yz{TB-iXl|eN;6F#g^Iw7HRFx087H`-B#SDRuGKS*O6SQpprfSd`+B>fCsWDAjbBfw^ZxQ0sw?Lg z_}+G`Y9bV~deyjScC{>Zd*NeM9+bmpj_LKO-XFLEt}mJ+d14;`nD^E;DK0V(3UTbnC(D3z z5&kj9=JXI?aCBQY=g@s9L#kZFx|&4!v8#Psy`;7Zv0-qIK^t1ylbSkUFIXczj!Wt z!0Six+Q8C~(ij+w8c%I@KvxymDUh&ZUXcJbXgA5XkX#GXLPjukEB~J0VBY1A%=#A% zi($}*g5>f?xhW|@0XPxMukPv&*^&>j`orLGhaw{wXQ3`_6l**X!e%+;3Ptq6d^6f( zorsaX+z?cvqkt#pMP~6vx~)Y@jU5V{y1BxUuk`P(WTfN&*b+O$kWo*<7I%Hx-=tG; zPjIhw$C7cuONDuAcH~uBGF`8SGW>%<9;#@G}vQtBeAf2_{li0s_>v-lcfsn<}i1x z)}%XFCkT%WD=v0(ph4W}vllke2gjq2*iIvn7sGUUH7eZVDbIAHLhm}3bXYps+7sJW zQq&(FR-{0;rk~>K4)rwWbc&T%EcsTpP*5)_M~}_4_6K2vnOmH^YWrMyJJ`h0H&(#c zAXqOboED|9Q+#0|OoN*7_``f$$?2@dW!-5Liq)hKbW~w!BU#xZs*@x=6>5$qmRG^F z8Q??q)wamqx>+kn&>g2QKYO7_XhE9M^$d0PF6RiYzG6|1X>N24j!7Wx<@LBnguyr* z(#iKE|BsYS;vux8LOQl{vC4~G@)0t=mr$z?BBuRubf-eKd`%8W25uoS zr9Bms!FeSN*-&#+#xZ%JugmtYQUItCNvR=uw0gJ@2kI7(;)Z*MbmN#F#KekQFl8aW z?{ED>@;?y89;7{zLcX<8Dh5sjf4jdi1{b@Qd};mBnqG zZEYKCR`+ai$(*9dY@}$P5-TNVRqN9w?3(Wmwt5qZWJ#^8qBz2c+oeoYmn+C;#4sUG z%(e7d{MfM#kcH#!jM^aE9D>|hPg2iyqtugYTZZP^e@8J81|R1ZCPH&;Y6PHCiUqoER@VG6|oTRP_husF2i&l3cC-INd~uP%MADI zUZCKrO-6qX67jnR?H&|w24LPCK3J^O?sL@(>qc~-KwW?!p~08@<{a}Fo7Z>^ zt6oK9nG;2s2<#1H59Xk6xNZIGl9Zn$9dyd<2!l|rq+SA}-ob)}px7seuPW(uRQ2Y- zjmSVyUmbWR&|7j5{bz8-k0%LuLW#zJ^XFM6g!?=uif69cz z28}QR;*i74AH?$#g^cQvy)R0P71`*ZP_vkYeB#0ktUNl^L&EiIZWV{iegyBnNSCik4+O5?bWq!I(Y zcfGrvlx4LA#ovZenM4}ZZ*BXiF0BV@pLCBTybXV!Sz^9ruu#oqnDo8sy)iTJQMLf{ z>4=7M9G~rMxWXx$wjjvWCX#U};2lH;_vD<8dl8I1B|wYbmCJ$fScn&kJBl^hiDUSL zOwH(W_yg$^vseHlF!oKjPvqX8y>7h!*O6SR!59++eKwoM611$TAt}5_M;-5~YJCJB z3+$c@LHoTcM2MxNA#yvVqJK6ql*Otr6=1-L1>T*3t>wE2LqvPdo||yluknbl%WyZ? zh7V&Z_pL-Y-X`T}&c0XSa$Vu7L}+_J37byJotvK2>7HOQvM(tlK$BwSqKms%BezVW(U7gkli6ef^%==^jN5|u>Sqph9NzvQ0wYC`z)E+#?aSj`27334ep@w5O zs*L-@e~ls%ADV47*_cSAG_ok_&DXlAt)kb4O7O9koLA#AgctbNfRfAmgC9X$U z!oJ%U?e(Y3&`AV5RU;bLhept%cwK96hYX(rb$sbyLzDDA2peGQMk;&$Irhg~9bk)L z)_NxdGaD3n%~bwzMkRLEv`Q5Ds5BHgD5ybeT`X2SLq1$Q$BL*wj=9q>OciW+B_a=2 zbIHoR6omZ5{UP5?XUH)+gE0xRls{0q+Q*v=Hu5o#5+r&LcF>*FjR&R^oOu}+A+b{> zd@XxZnd;M!1oXs0r5e}f5NR1xBYCWy6#XqhMndCFVc`*0SUw3C)xrrlDODzB@jo~a6&*!-TILwLc5I_Y%Awuqv!X&uku9mPrYf}mG|P}fF#&&~ z2o}~l=Hic$B_JI#K^R7bHuk{yx6Bmb*AUirL;t+BC{N9Si$e+W>Bd~4BfJYLJ+Iy_ zh)Vfwzrjt~FUFy%E0V%=s?hCE$ObYmZkmcv=UOUM>C;6T4^Nki;=KJChX1Sel}qH+ zkq8hJxU332*K|&Qg5x@O`k+FQRJawYXRrbUV{RNq`UnySwTZK$!G(%1^G;k&KGgsVh>-dQX=(P7`;jf5m1aG`bOeRFLXaQLu&i-rR%qN&J>MNi(xn zkg2fH`RZv2YU=^bbz=SQB@X6iS(&#*7#etTf>K;1Q3MJLC=>#oxbVI>{6Xp_^!#F2*l%#&L*Njqx;ba)i#@zCFeM+G?mD@nmtuhIlwg zi6>7oktki8h!}GSx1ooyR?)JZ5!Jf>!o@CPx{a%%6`F)ZO>Z`n9-D5Qjm!~MHWoZr z($Sx)X*Nn3)a%CG+6ta9On-&`Lps~7c~(pvD!#>2{-t7HtK1m+BKRg2T+cT(ItVtl zrhMIhu0aY>_hb@ptg`v3BljvXRfC8Y)mrq?orj}&EU2vnQ4WCuT^_%3k%XX4lm0C{ z`*RMSwqjMzksN-d8qpC7m;7(Uv&t3!)6yLGKHr6oS!L9GLksUsz?3A3R^~SH6Z7r z*OMD*68IOr=9P9KjA4$D#h(t*>bu(DopZ?)S=J0jmMMN^f6vY4c?M_zkF^&Q_v=)NkYwJ<(&K zdl=A$aiQ;ZS9Qo&dM8kQkmhD^nl04@#0yllxjw zA5BUy5~tDS}tkJ#JPE z(c9OvKse!Kmpl(X*P)^?6f7wzkRM~~x!n6HmDLC1oNt#fuDGXMH}USeq&-7k{hIh1 z6)K0a7VH7K^@PmHpu(8m!>GMxGBDe@;4XUQ$c3aw4(QDgj|h^wP8{e5o|FBi8hD|E zTtTS3l^;FPyCzMeNZ%@8Z-`<)2u&JFPOhCpQhqirRF19L<_l4~T+}(OStQTG2RfGb z2mw!cbp8+vpCjVhJN_y~qJTDqdC^H;WG2~G@%V-ARa9bM)x0Jb`cnPFNSfh;yG(vN z`5T#)(Diob+*TA(>1ssv?Z3m%+L~*6vv28==a?c}M=`!4TdEl$Q=YKiFMn8BJ)DC9OPtZ)ev=rrf6l z?_c5|$}{JIgxU+|lz6Ir=-y1r!9dwZU)%Sslbr0uL)$j%VC{qq-z({`vV#rQFd-e;b;>>z)HRXOtlznkN_n zXleB*QyZNY<5_+oYc&+sJfixEr$(QO&k5Ir+sYdcizLt=Uv&ZPj$sAKR>*uyn?j(F z?%YtQyK;Yl^4o0K!y0qNqu|oUO*%j=DRPweq(Tdey@&Je@c6x zX5Z%aBUr7CN-b|IeDU4|{6*XrN;$Ft{M>&l;Yqd6S`c%`BE$sSb=7}P-6c=Qs!C-h zNb=|q;>(w4%hGZ5Ls7V;8j@MO)1gyU=VmI9Ob@+gr~;-@jfU%J#w4r|JA7g1 z-V&h1SFCL!?a*`^{#W5nN}7~}um;Ocry_bYK-sMiHcNk-P!^ILmL$R6j6=2#g2F9ZS6|1sXqVJz8+?Z~v&a>3-v>Ept2 z7Gm$uU0e%^^_}R0e!?QLBk19L1oA$z5i1!Xy||0+I4yPFTZ8sO#C^sCaSKgK;$Z8Q zI8L;|RLS?tY2BJHq9<5m{=QwEk8i`<*k_voNrRF7v?jqC*`M;K_Ss7Ohe@w2X}F19 z&aN+}sUlmWsd>B3`n6 zd|4IQ8&b(Njuz|7Q@5&kpw0d$3&McEg!8D^E%%WToTEpLCkn6mLssASEAQ{@L8vfZ zXYD8~*qG?VwAG}?Z&gM{_8QB7?@ht*{3di)YpdsC017Ym;E1IAHvN+a_3Tpq-|6#w4?!{l-r8nNFOeJB*#jT5ly^7G`pQIOlq7_T2i!&Jcgq6ng?B-iTC1r5- zXKjVWF&IZ8dl5nAgopk%HL-1IijrUiQsbX{-%CZ&(F4C#ijAkh#1cIC2VnXK{G1^8 zgSRwZiy3Yv+%ba&L=L5~@a-`Yg;mdnFU%0zd8xHf>_45Gi`<&uX1&JJcI1Hms@Z#_ zkLMvW(FG05l;G7|n6EI--~<0tB&?yi)T-SIq+}yI#)c4@nBjMlZ#qI@nX(sP<#9@UX; z`L_d|ruWhzXmeBC(~L0PZJxhSp2Aezg{QlKoQ!ePbdo?uztCSXj)b+?k-VeqXNdn2 zXUogxTqF&Tmj?>jWGmEt{TpyR?qLp!lt4rJUGwLmPX<<|NELMKtqGM7eS4Q3lxv>! zqX}yr&)TqCqv8#9ZIsZ!==LCHC0lEb7ATV_aVvSV{i{%AO8ioo5GM=GqdP?WjAi{A zpnpS`1Y-GM{wHs8?dbV|6JD`D>F^u3z+>&5>Ivi}SdK-9Fp+Sayf-|CkxVWk@dSxB!z>o_A=>`kyDgCV!MR?fpm`FEll`gU4 zimvtkv#Dg%8pTgh@-R`-DFl$&`#ej3X_4-!&$X22^`Hulx2RP0^1A@M!2UDoUhhXI z^n-7psbVDVbTEwacNPUOf%M#+9j&MQ#wO{9$*I<1Rh4D~{Yzx+6V4-l-y-WykOrSj zeSQig(m`Iu;WJLMi-Xq4i!@Hignpx>Hl2zAoLF=9m7X~wkUH)AZk$NkP9=~!mO8uy zOv)DfNMy6r6G(D3Z|)$TJL!008jOfhTpgUfcu>QBB#e@i9a*salv;f?;pe#Z(f4k! zsX+0sN-&bE+t4>0+cycF$p&0kJhH>XCzG=aKlNru7~~7{WQ@6Sx=|q_-U&`&D6O^= zKH9@2jUNjKawuTPXEuZU1CSNb?MY;cWP$^HgBK=sT{XJUatu+N_E}BXYL!higb0Q< z5T0b(`XF66zszo!tI%)6m9FTIn3 z9iWW()N{~N9K56n)h@6vb4i*`I$$JgyYYUKC+V-S!`^FQNfR{4hiON>vd{Zobtz|J zn+E>##{3ZW~OX*kpR!);I1raeD$+yAkN z=mK@aCcm1mE7&{A+blgv=U-5xmAJFqdVlP*JJk4IvvWRGY>U1 z6`bxMx?i`t+`U$KaCsSvcKW8BSuIWkq2`+G_Mj%pI2eY+q-&Y{+6|w~OIIUJl7e{e^eAhr%mOp0UNn@MF#I* z{15f(+}2lkX;?l8-S8n=yW3ZEc%U7f!j55 zLZ$#qgo24`6NsltuU&qBfF_8hpg^i?^%ys(4;lmoBUmtM8tqyy;r$^q>HhkA>dz@E z;<;bW58dKax;#0&{uMEZmsxHBx7`Ip7r-6^{m_Ynowq_xRz3T5c(6JhAA0It)nuO+ z;0;A-Nef#7rKC_9dcMVT_RegJNl629LjP~hh3u8U&RXB897-+l0mX-iV{y4Wc`Wk6 zIkE6ibzX=FVfiAZKs@Lz)*L=mhW<4f2YS;|AYN|;fqd%F77`=F~Y?0C6e$!+4|Mxv}u=jmovJqIX03S5TS)xfeL{H}J%fG^#ax zwoPR}6Q@xeF@Sv?3XW}QD^NaX^%l&YBrF@#px=>EY%36dG zD@w@G5i?Vkjwvgm_3(2+SDjhe-;(LG}TUMZ*FarI9A8zIhc};qI134%oQK%31Xo` zJtGWZy&dG zD}{ect9o+OuC%SI>UPQ>e>8X43R8yDvg40H1)`^bnq4KKm8C#b6ys*T#LV;Na0T-e zF6sh9Hgew5hZV`^rs+>GIIW0_MoocS^^TjX+6-vXOMW7?gBvEm&cX7}^amk*K1_Qa z$!IQfujZYu{LcP^kp3D>dnIH$2?DcW*gOcF7M4-)LK?idPjSYnJJ*%eiVw^3Mz-fe zRS87dxI{1pjeK` zfcq<8U;tK$ev#yD1_%N@1flT!T7;S(u`(*c>x;2;9MiJ2&+MYKoCIXD1Im&%gQ*qJXe>%2KkCDhJ#%PEjJU-jekn*CG~gQnD; zAT40>4Y2Ye<=>^%3V7&g=)78f(Cj@H{xu%9jg@(F6}0*QWdtss~Np7o[mVE1Og4nXI2C9DUzJ$`u!hKFzyA&KT$#6 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 literal 0 HcmV?d00001 diff --git a/web/scripts/buildDatabase.mjs b/web/scripts/buildDatabase.mjs new file mode 100644 index 0000000..9c19a60 --- /dev/null +++ b/web/scripts/buildDatabase.mjs @@ -0,0 +1,583 @@ +import { copyFile, mkdir, readFile, writeFile } from 'node:fs/promises'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const webRoot = join(dirname(fileURLToPath(import.meta.url)), '..'); +const sourceRoot = join(webRoot, '..', '.webarchive'); +const illustrationsDir = join(webRoot, 'public', 'assets', 'illustrations'); +const mediaDir = join(webRoot, 'public', 'assets', 'media'); +const dataDir = join(webRoot, 'data'); + +const rawArticles = JSON.parse(await readFile(join(sourceRoot, 'extracted-articles.json'), 'utf8')); + +const categories = { + 'вирус-самопроизвольный-запуск-брауз': ['Windows', 'Вирусы'], + 'использование-jquery-в-webpack': ['JavaScript'], + 'компиляция-64-x-разрядных-программ-на-dmd-по': ['DLang', 'DMD', 'Windows'], + 'новый-движок-ctfe': ['DLang', 'Compile-time'], + 'особенности-vibe-d': ['DLang', 'Vibe.d'], + 'ошибка-php-ssl-certificate-error-unable-to-get-local-issuer-certificate': ['PHP', 'SSL'], + 'о-tilix-и-d-интервью-с-геральдом-нанном': ['DLang', 'Интервью'], + 'пишем-аналог-функции-php-preg_match_all-на-языке-прог': ['DLang', 'Регулярные выражения'], + 'bitrix-api-создание-добавление-торгового-пре': ['Bitrix', 'PHP'], + 'bitrix-api-функция-для-генерации-кода-элемент': ['Bitrix', 'PHP'], + 'bitrix-api-add-foto-editor': ['Bitrix', 'PHP'], + 'dconf-2017-под-капотом-мусорщика-ди-дмитрий-ол': ['DLang', 'GC'], + 'firefox-увеличение-ожидания-загрузки-timeout-стр': ['Firefox', 'Настройки'], +}; + +const covers = { + 'вирус-самопроизвольный-запуск-брауз': '/assets/illustrations/cover-virus.svg', + 'использование-jquery-в-webpack': '/assets/illustrations/jquery-webpack.svg', + 'компиляция-64-x-разрядных-программ-на-dmd-по': '/assets/illustrations/dmd-win64.svg', + 'новый-движок-ctfe': '/assets/illustrations/ctfe-engine.svg', + 'особенности-vibe-d': '/assets/illustrations/vibe-cover.svg', + 'ошибка-php-ssl-certificate-error-unable-to-get-local-issuer-certificate': '/assets/illustrations/php-ssl-cacert.svg', + 'о-tilix-и-d-интервью-с-геральдом-нанном': '/assets/illustrations/tilix-cover.svg', + 'пишем-аналог-функции-php-preg_match_all-на-языке-прог': '/assets/illustrations/preg-match-all-d.svg', + 'bitrix-api-создание-добавление-торгового-пре': '/assets/illustrations/bitrix-offer-api.svg', + 'bitrix-api-функция-для-генерации-кода-элемент': '/assets/illustrations/bitrix-translit-api.svg', + 'bitrix-api-add-foto-editor': '/assets/illustrations/bitrix-photo-editor.svg', + 'dconf-2017-под-капотом-мусорщика-ди-дмитрий-ол': '/assets/illustrations/dconf-gc-cover.svg', + 'firefox-увеличение-ожидания-загрузки-timeout-стр': '/assets/illustrations/firefox-timeout.svg', +}; + +const imageMap = [ + ['2017-05-13_13-39-44', '/assets/illustrations/taskschd-run.svg', 'Окно запуска taskschd.msc'], + ['2017-05-13_13-41-17', '/assets/illustrations/taskschd-action.svg', 'Подозрительное задание в планировщике Windows'], + ['/2017/05/1.png', '/assets/illustrations/vibe-async.svg', 'Асинхронная модель vibe.d'], + ['/2017/05/2.png', '/assets/illustrations/vibe-api.svg', 'Короткий API vibe.d'], + ['/2017/05/3.png', '/assets/illustrations/vibe-web.svg', 'Веб-стек vibe.d'], + ['/2017/05/4.png', '/assets/illustrations/vibe-db.svg', 'Драйверы баз данных vibe.d'], + ['/2017/05/5.png', '/assets/illustrations/vibe-io.svg', 'Неблокирующий ввод-вывод'], + ['/2017/05/6.png', '/assets/illustrations/vibe-dlang.svg', 'Язык D как основа vibe.d'], + ['/2017/05/7.png', '/assets/illustrations/vibe-diet.svg', 'Шаблоны Diet'], + ['tilix-screenshot-2', '/assets/illustrations/tilix-screenshot.svg', 'Боковая панель Tilix в действии'], + ['/2017/06/1-300x225', '/assets/illustrations/gc-small-pools.svg', 'Пулы малых объектов в GC D'], + ['/2017/06/1.jpg', '/assets/illustrations/gc-small-pools.svg', 'Пулы малых объектов в GC D'], + ['/2017/06/2-200x300', '/assets/illustrations/gc-large-pool.svg', 'Пул больших объектов в GC D'], + ['/2017/06/2.jpg', '/assets/illustrations/gc-large-pool.svg', 'Пул больших объектов в GC D'], + ['bitrix-foto-editor-2', '/assets/illustrations/bitrix-photo-editor-ui.svg', 'Редактор картинок Bitrix'], +]; + +const additions = { + 'вирус-самопроизвольный-запуск-брауз': ` +

Проверяем, что проблема решена

+

После удаления задания перезагрузите компьютер и оставьте систему включенной на тот промежуток времени, через который раньше открывался браузер. Если окно больше не появляется, значит источник найден правильно. Если запуск повторяется, проверьте не только библиотеку планировщика, но и вкладку автозагрузки, ключи Run в реестре и расширения браузера.

+
    +
  • В планировщике смотрите не только имя задания, но и действие: путь к браузеру и URL в аргументах.
  • +
  • Удаляйте только понятные вредоносные задания. Системные задачи Microsoft лучше сначала отключить, а не стирать.
  • +
  • После очистки обновите антивирус и выполните полную проверку, потому что задание могло быть лишь следом установщика.
  • +
+

В итоге рецепт простой: найти периодический запуск, проверить действие задания, удалить его и убедиться, что источник не восстанавливается после перезагрузки.

`, + 'использование-jquery-в-webpack': ` +

Итоговая схема подключения

+

Для старого проекта jQuery в Webpack лучше подключать явно: установить пакет, импортировать его в точке входа и, если плагинам нужна глобальная переменная, добавить ProvidePlugin. Тогда один и тот же экземпляр библиотеки будет использоваться и вашим кодом, и плагинами.

+
const webpack = require('webpack');
+
+module.exports = {
+  plugins: [
+    new webpack.ProvidePlugin({
+      $: 'jquery',
+      jQuery: 'jquery',
+      'window.jQuery': 'jquery',
+    }),
+  ],
+};
+

Если плагин всё равно не видит jQuery, проверьте порядок импортов и отсутствие второй копии библиотеки в bundle. На этом обычно все проблемы заканчиваются.

`, + 'компиляция-64-x-разрядных-программ-на-dmd-по': ` +

Короткая памятка

+

Чтобы не возвращаться к этой настройке каждый раз, держите отдельный build-скрипт для 64-битной сборки и явно указывайте архитектуру, компилятор и путь к библиотекам. Главная мысль статьи: не смешивать 32-битные OMF-библиотеки и 64-битную сборку.

+
dmd -m64 main.d -ofapp.exe
+dub build --arch=x86_64
+

Если линковщик ругается на формат библиотек, сначала проверьте разрядность каждой внешней зависимости. В большинстве случаев ошибка не в D-коде, а в том, что рядом оказалась библиотека другого формата.

`, + 'новый-движок-ctfe': ` +

Как применять выводы на практике

+

CTFE полезен там, где результат можно посчитать один раз во время компиляции: таблицы констант, парсинг небольших DSL, генерация однотипного кода. Но не стоит превращать компиляцию в полноценный рантайм. Чем проще входные данные и чем меньше побочных эффектов, тем легче будет сопровождать проект.

+

Практическое правило такое: если вычисление зависит только от литералов и конфигурации сборки, переносите его в CTFE. Если нужен ввод-вывод, сеть или состояние окружения, оставьте это обычному коду.

`, + 'особенности-vibe-d': ` +

Когда выбирать vibe.d

+

vibe.d хорошо подходит для небольших и средних веб-сервисов на D, где важны неблокирующий ввод-вывод, простая маршрутизация и единая экосистема DUB. Начать можно с минимального HTTP-сервера, затем добавить Diet-шаблоны, MongoDB или Redis и вынести повторяющиеся части в отдельные модули.

+
shared static this()
+{
+    auto settings = new HTTPServerSettings;
+    settings.port = 8080;
+    listenHTTP(settings, &handleRequest);
+}
+

Если проект требует большого количества готовых интеграций, заранее проверьте наличие пакетов в DUB. Если же нужна компактная серверная часть на D, vibe.d остаётся прямым и понятным выбором.

`, + 'ошибка-php-ssl-certificate-error-unable-to-get-local-issuer-certificate': ` +

Финальная проверка настройки

+

После подключения файла сертификатов перезапустите веб-сервер или PHP-FPM и выполните тестовый HTTPS-запрос из того же окружения, где возникала ошибка. Важно проверять не браузер, а именно PHP: CLI и веб-сервер могут использовать разные php.ini.

+
php -i | grep cafile
+php -r "var_dump(file_get_contents('https://example.com') !== false);"
+

Не отключайте проверку SSL через CURLOPT_SSL_VERIFYPEER = false как постоянное решение. Это скрывает проблему и делает соединение уязвимым. Правильный путь — актуальный CA bundle и явно указанная директива openssl.cafile.

`, + 'о-tilix-и-d-интервью-с-геральдом-нанном': ` +

Что вынести из интервью

+

Главный практический вывод прост: D может быть не только системным языком, но и удобным языком для прикладных desktop-инструментов. Tilix показывает, что связка D, GtkD и аккуратного следования HIG способна дать зрелое приложение, которым пользуются каждый день.

+

Если хочется повторить такой путь, начинайте не с большого терминала, а с маленькой GTK-утилиты: окно, настройки, несколько действий, сборка через DUB. Так быстрее станет понятно, насколько привычки из Java, Delphi или PHP мешают или помогают писать на D.

`, + 'пишем-аналог-функции-php-preg_match_all-на-языке-прог': ` +

Как довести класс до рабочего состояния

+

После реализации флагов обязательно добавьте тесты на три случая: нет совпадений, одно совпадение с группами и несколько совпадений с позициями. Именно на позициях чаще всего появляются ошибки, потому что PHP возвращает смещения в исходной строке, а не в подстроке после очередного поиска.

+
assert(matchAll(r"(\w+)=(\d+)", "a=1 b=22").length == 2);
+assert(matchAll(r"z+", "abc").empty);
+

Дальше можно расширять API постепенно: сначала PREG_PATTERN_ORDER, затем PREG_SET_ORDER, и только после этого режим с OFFSET_CAPTURE.

`, + 'bitrix-api-создание-добавление-торгового-пре': ` +

Что проверить после создания предложения

+

После добавления торгового предложения проверьте три связи: привязку к товару, цены и остатки. В Bitrix предложение может успешно создаться, но не появиться в публичной части, если не заполнены обязательные свойства SKU или не обновлены индексы.

+
    +
  • Убедитесь, что установлен CML2_LINK или соответствующее свойство связи.
  • +
  • После записи цены вызовите обновление элемента и очистите кеш каталога.
  • +
  • Если используются склады, отдельно сохраните количество через API складского учёта.
  • +
+

Такой порядок закрывает типичную проблему: элемент есть в админке, но покупатель его не видит.

`, + 'bitrix-api-функция-для-генерации-кода-элемент': ` +

Как использовать функцию безопасно

+

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

+
telefon-samsung
+telefon-samsung-2
+telefon-samsung-3
+

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

`, + 'bitrix-api-add-foto-editor': ` +

Завершение интеграции

+

После вывода компонента важно не забыть обработать результат формы: сохранить ID файла, проверить тип загруженного файла и права пользователя. Сам редактор решает задачу интерфейса, но безопасность и привязка к сущности остаются на стороне вашего кода.

+

Если редактор не открывается, проверьте подключение модулей main и fileman, права на загрузку и наличие административных JS-расширений на странице. После этого компонент работает стабильно и может использоваться не только в админке, но и в собственных формах.

`, + 'dconf-2017-под-капотом-мусорщика-ди-дмитрий-ол': ` +

Практический вывод

+

Статья важна не только для разработчиков компилятора. Она показывает, почему аллокатор и сборщик мусора нельзя оценивать одной фразой «GC медленный». Нужно смотреть на классы размеров, поиск пулов, стоимость маркировки и то, сколько работы выполняется во время остановки мира.

+

Для прикладного D-кода вывод такой: держите горячие циклы предсказуемыми, не создавайте лишние временные объекты в tight-loop и измеряйте паузы. Если участок действительно критичен, D позволяет локально отключить GC или заменить аллокации заранее подготовленными буферами.

`, + 'firefox-увеличение-ожидания-загрузки-timeout-стр': ` +

Когда лучше не увеличивать timeout

+

Увеличение ожидания помогает при разовых административных операциях, но не должно маскировать медленный сайт. Если обычная страница требует минуты, правильнее вынести задачу в фон: очередь, cron, прогресс-бар и отдельная проверка статуса.

+

Для phpMyAdmin, импорта и парсинга больших файлов увеличение timeout допустимо. Для публичного пользовательского сценария лучше исправлять серверную часть, иначе браузер станет ждать дольше, но пользователь всё равно получит плохой интерфейс.

`, +}; + +const articleAdditions = { + ...additions, + 'вирус-самопроизвольный-запуск-брауз': ` +

Проверяем, что проблема решена

+

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

+

В планировщике заданий важно смотреть не только название задания. Название злоумышленник может сделать вполне безобидным: Update Service, Browser Check, Windows Helper. Смысл находится в действии. Если в действии указан путь к браузеру, а после него стоит адрес сайта, то перед нами как раз тот самый случай.

+
    +
  • Откройте свойства подозрительного задания и посмотрите вкладку «Действия».
  • +
  • Проверьте путь к программе: firefox.exe, chrome.exe, browser.exe или cmd.exe с последующим запуском браузера.
  • +
  • Проверьте аргументы: если там указан URL, рекламный домен или короткая ссылка, задание можно отключать.
  • +
  • Сначала отключите задание, перезагрузите компьютер и проверьте поведение. После проверки его уже можно удалить.
  • +
+

Если задача появляется снова, значит в системе остался установщик или служба, которая её восстанавливает. В таком случае дополнительно смотрим «Приложения и возможности», папки автозагрузки пользователя, ключи HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run и HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Run. После очистки нужно обновить антивирусные базы и выполнить полную проверку.

+

Итог простой: в этом случае лечится не браузер, а причина его запуска. Находим периодическое задание, проверяем действие, отключаем, убеждаемся, что оно не восстановилось, и только после этого удаляем. Так проблема закрывается полностью, а не до следующей перезагрузки.

`, + 'использование-jquery-в-webpack': ` +

Итоговая схема подключения

+

Для старого проекта jQuery в Webpack лучше подключать явно: установить пакет, импортировать его в точке входа и отдельно решить вопрос с глобальными переменными. ProvidePlugin удобен, когда в модулях встречаются свободные идентификаторы $ или jQuery. Но если старый плагин лезет именно в window.jQuery, одного ProvidePlugin может быть мало — нужно положить jQuery в window самостоятельно.

+
import $ from 'jquery';
+
+window.$ = $;
+window.jQuery = $;
+

После этого можно добавить ProvidePlugin, чтобы не писать импорт в каждом файле:

+
const webpack = require('webpack');
+
+module.exports = {
+  plugins: [
+    new webpack.ProvidePlugin({
+      $: 'jquery',
+      jQuery: 'jquery',
+    }),
+  ],
+};
+

Порядок подключения имеет значение. Сначала в entry-файле импортируем jQuery и кладём его в window, потом импортируем старые плагины, которым нужен глобальный объект. Если плагин подключается через require, делаем это после установки window.jQuery.

+
import './jquery-global';
+import 'inputmask/dist/jquery.inputmask';
+import './app';
+

Проверка простая: в браузерной консоли должны существовать window.$ и window.jQuery, а в собранном bundle не должно быть двух разных копий jQuery. Если проект новый, лучше не тащить jQuery без необходимости. Если проект старый и плагины уже написаны под jQuery, такая схема делает зависимость явной и предсказуемой.

`, + 'компиляция-64-x-разрядных-программ-на-dmd-по': ` +

Короткая памятка для современных и старых сборок

+

Главная мысль остаётся той же: нельзя смешивать 32-битные OMF-библиотеки и 64-битную сборку. В старых установках DMD под Windows это часто упиралось в ручную настройку sc.ini, Windows SDK и Visual Studio linker. В более новых установках официальный установщик DMD обычно делает большую часть этой настройки сам, а для нормальной работы достаточно иметь Visual Studio Build Tools или установленную Visual Studio с C++ tooling.

+

Для простой 64-битной сборки используем явную архитектуру:

+
dmd -m64 main.d -of=app.exe
+dub build --arch=x86_64
+

Если используется старая 32-битная сборка, смотрим, какой формат объектных файлов нужен проекту. Старый OMF и MS-COFF несовместимы между собой. Для современных библиотек Windows чаще нужен MS-COFF, а для 64-битной сборки это фактически обычный путь.

+
    +
  • Проверьте, что внешние .lib файлы собраны под ту же архитектуру.
  • +
  • Запускайте сборку из Developer Command Prompt или x64 Native Tools Command Prompt, если компоновщик не находится.
  • +
  • Если DMD не видит linker, проверьте переменные окружения и секцию Environment64 в sc.ini.
  • +
  • Если проект собирается через DUB, фиксируйте архитектуру в команде или конфигурации сборки.
  • +
+

Типичная ошибка выглядит так: код компилируется, а линковка падает на внешней библиотеке. В большинстве случаев виноват не D-код, а то, что рядом лежит библиотека другого формата или другой разрядности. Сначала проверяем toolchain и зависимости, и только потом ищем ошибку в исходниках.

`, + 'новый-движок-ctfe': ` +

Как применять выводы на практике

+

CTFE полезен там, где результат можно посчитать один раз во время компиляции: таблицы констант, парсинг небольших DSL, генерация однотипного кода, предварительная подготовка строк и проверка инвариантов. Но не стоит превращать компиляцию в полноценный runtime. Чем проще входные данные и чем меньше побочных эффектов, тем легче будет сопровождать проект.

+
enum table = buildLookupTable();
+
+static assert(table.length == 256);
+

Хороший кандидат для CTFE — функция, которая зависит только от литералов, типов и конфигурации сборки. Плохой кандидат — код, которому нужен ввод-вывод, сеть, текущее время, состояние окружения или большая внешняя база данных. Такой код лучше оставить в runtime или вынести в отдельный генератор, который запускается до сборки.

+

Для контроля качества CTFE-кода полезно держать рядом static assert. Он сразу показывает, что вычисление действительно произошло на этапе компиляции и вернуло ожидаемый результат. Если compile-time функция стала слишком сложной, её стоит разбить на маленькие чистые функции: так компилятору проще, и человеку проще понять, что происходит.

+

Практический вывод такой: CTFE в D — мощный инструмент, но сила его не в магии, а в переносе предсказуемых вычислений из runtime в compile-time. Используем его для констант, генерации и проверок. Не используем его как замену обычной программе.

`, + 'особенности-vibe-d': ` +

Когда выбирать vibe.d

+

vibe.d хорошо подходит для небольших и средних веб-сервисов на D, где важны неблокирующий ввод-вывод, простая маршрутизация и единая экосистема DUB. Начать можно с минимального HTTP-сервера, затем добавить Diet-шаблоны, MongoDB или Redis и вынести повторяющиеся части в отдельные модули.

+
shared static this()
+{
+    auto settings = new HTTPServerSettings;
+    settings.port = 8080;
+    listenHTTP(settings, &handleRequest);
+}
+

При проектировании сервиса главное не забывать, что удобный синтаксис не отменяет асинхронную модель. Долгие CPU-задачи нельзя выполнять прямо в обработчике запроса, иначе они будут мешать обработке ввода-вывода. Для таких задач лучше использовать отдельные worker-потоки, очередь или заранее подготовленные данные.

+
    +
  • HTTP и WebSocket оставляем в event loop vibe.d.
  • +
  • Тяжёлые вычисления выносим из обработчика запроса.
  • +
  • Доступ к базе оборачиваем в небольшой слой, чтобы не размазывать запросы по маршрутам.
  • +
  • Diet-шаблоны держим простыми: шаблон должен отображать данные, а не выполнять бизнес-логику.
  • +
+

Если проект требует большого количества готовых интеграций, заранее проверьте наличие пакетов в DUB и состояние нужных драйверов. Если же нужна компактная серверная часть на D, vibe.d остаётся прямым и понятным выбором: один язык, быстрый нативный код, нормальная маршрутизация, шаблоны и асинхронный ввод-вывод.

`, + 'ошибка-php-ssl-certificate-error-unable-to-get-local-issuer-certificate': ` +

Финальная проверка настройки

+

После подключения файла сертификатов перезапустите веб-сервер или PHP-FPM и выполните тестовый HTTPS-запрос из того же окружения, где возникала ошибка. Важно проверять не браузер, а именно PHP: CLI и веб-сервер могут использовать разные php.ini.

+
php --ini
+php -i | grep -E "curl.cainfo|openssl.cafile"
+php -r "var_dump(file_get_contents('https://example.com') !== false);"
+

Для cURL указывается curl.cainfo, для потоков OpenSSL — openssl.cafile. На Windows путь лучше писать полностью и без относительных директорий. Если используется не глобальный php.ini, а отдельная настройка клиента, можно передать CA bundle прямо в cURL:

+
curl_setopt($ch, CURLOPT_CAINFO, 'C:\\php\\extras\\ssl\\cacert.pem');
+

Не отключайте проверку SSL через CURLOPT_SSL_VERIFYPEER = false как постоянное решение. Это скрывает проблему и делает соединение уязвимым. Такая настройка допустима только для короткой диагностики в локальной среде, и после проверки её нужно вернуть обратно.

+

Если CA bundle указан верно, но ошибка осталась, проверьте цепочку сертификатов на стороне удалённого сервера. Иногда браузер открывает сайт, потому что умеет достраивать цепочку, а PHP/cURL получает неполную цепочку и честно падает. В таком случае исправлять нужно сертификаты сервера, а не PHP-код.

+

Правильный итог: актуальный cacert.pem, явно указанные curl.cainfo и openssl.cafile, перезапуск PHP и тест именно из того окружения, где работает приложение.

`, + 'о-tilix-и-d-интервью-с-геральдом-нанном': ` +

Что вынести из интервью

+

Главный практический вывод прост: D может быть не только системным языком, но и удобным языком для прикладных desktop-инструментов. Tilix показывает, что связка D, GtkD и аккуратного следования GNOME HIG способна дать зрелое приложение, которым пользуются каждый день.

+

В интервью хорошо видно, что выбор языка был не религиозным, а практическим. Автору не хотелось писать GUI на C или C++, Python оказался неудобен для крупного статически проверяемого приложения, а D дал знакомую после Java модель, нативную скорость и нормальные GTK-привязки. Это важный критерий выбора технологии: не «самый модный язык», а язык, на котором конкретный автор может быстро и спокойно делать продукт.

+

Если хочется повторить такой путь, начинать стоит не с большого терминала, а с маленькой GTK-утилиты: окно, настройки, несколько действий, сборка через DUB, упаковка и обновления. На таком проекте сразу проявятся реальные вопросы: работа с GtkD, структура проекта, взаимодействие с C-библиотеками, обработка событий и паузы GC.

+
    +
  • Для GUI-кода держите бизнес-логику отдельно от виджетов.
  • +
  • Не бойтесь GC, но измеряйте горячие участки и большие циклы.
  • +
  • Если нужен C API, сначала сделайте маленький прототип вызова.
  • +
  • Сначала исправляйте ошибки, потом добавляйте функции — именно так Tilix сохранил управляемый backlog.
  • +
+

Именно поэтому интервью полезно не только поклонникам D. Оно показывает нормальный инженерный путь: выбрать задачу, подобрать инструмент, сделать небольшую работающую версию, а затем постепенно доводить приложение до зрелого состояния.

`, + 'пишем-аналог-функции-php-preg_match_all-на-языке-прог': ` +

Как довести класс до рабочего состояния

+

После реализации флагов обязательно добавьте тесты на три случая: нет совпадений, одно совпадение с группами и несколько совпадений с позициями. Именно на позициях чаще всего появляются ошибки, потому что PHP возвращает смещения в исходной строке, а не в подстроке после очередного поиска.

+
assert(matchAll(r"(\w+)=(\d+)", "a=1 b=22").length == 2);
+assert(matchAll(r"z+", "abc").empty);
+

В D стоит явно решить, какой формат результата нужен. PHP поддерживает несколько режимов: PREG_PATTERN_ORDER, PREG_SET_ORDER и вариант с PREG_OFFSET_CAPTURE. Если пытаться сделать всё сразу, код быстро станет запутанным. Лучше сначала реализовать простой режим, затем режим группировки по совпадениям, и только после этого добавить позиции.

+
struct MatchPart
+{
+    string text;
+    ptrdiff_t offset;
+}
+
+alias MatchSet = MatchPart[][];
+

Отдельно проверьте Unicode. Если шаблон и строка содержат кириллицу, важно понимать, что именно возвращается в offset: позиция в байтах или позиция в символах. PHP для PREG_OFFSET_CAPTURE возвращает байтовое смещение. Если в D вы хотите повторить поведение PHP, нужно документировать именно байтовый offset, иначе результаты будут отличаться.

+

Финальный класс должен иметь маленькую поверхность API: метод без offset, метод с offset и понятный enum для порядка результата. Тогда аналог preg_match_all будет не просто копией PHP-функции, а удобным D-инструментом, который предсказуемо работает в тестах.

`, + 'bitrix-api-создание-добавление-торгового-пре': ` +

Что проверить после создания предложения

+

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

+
    +
  • Убедитесь, что модуль iblock подключён перед созданием элемента.
  • +
  • Если задаются цена и складской остаток, подключите модуль catalog.
  • +
  • Проверьте свойство связи с товаром, чаще всего это CML2_LINK или настроенное в конкретном каталоге свойство SKU.
  • +
  • После записи цены и остатков очистите кеш компонента каталога.
  • +
+

Минимальная последовательность такая: создать элемент торгового предложения в инфоблоке SKU, записать связь с товаром, сохранить параметры товара, установить цену, установить количество. Если хотя бы один шаг пропущен, предложение может быть видно в админке, но не попадёт в публичный каталог.

+
CModule::IncludeModule('iblock');
+CModule::IncludeModule('catalog');
+
+$offerId = $el->Add($fields);
+CCatalogProduct::Add([
+    'ID' => $offerId,
+    'QUANTITY' => 10,
+]);
+CPrice::SetBasePrice($offerId, 990, 'RUB');
+

На боевом проекте обязательно логируйте результат Add и текст ошибки LAST_ERROR. Bitrix часто молча возвращает false, а настоящая причина находится именно там: обязательное поле, неправильный инфоблок, неверный код свойства или недостаточные права.

`, + 'bitrix-api-функция-для-генерации-кода-элемент': ` +

Как использовать функцию безопасно

+

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

+
telefon-samsung
+telefon-samsung-2
+telefon-samsung-3
+

Также стоит сразу нормализовать результат: привести к нижнему регистру, заменить пробелы на дефис, убрать повторяющиеся дефисы и обрезать дефис в начале или конце строки. Это мелочь, но именно такие мелочи потом портят адреса страниц.

+
$code = CUtil::translit($name, 'ru', [
+    'replace_space' => '-',
+    'replace_other' => '-',
+    'change_case' => 'L',
+]);
+
+$code = trim(preg_replace('/-+/', '-', $code), '-');
+

Проверку уникальности лучше делать в том же инфоблоке, где будет создан элемент. Если сайт многоязычный или есть разделы с одинаковыми товарами, заранее решите правило: уникальность на весь инфоблок или только внутри раздела. Для SEO обычно проще и надёжнее уникальность на весь инфоблок.

+

В итоге функция должна не просто транслитерировать строку, а возвращать готовый символьный код: чистый, нижнего регистра, без мусора и без совпадений с уже существующими элементами.

`, + 'bitrix-api-add-foto-editor': ` +

Завершение интеграции

+

После вывода компонента важно не забыть обработать результат формы: сохранить ID файла, проверить тип загруженного файла и права пользователя. Сам редактор решает задачу интерфейса, но безопасность и привязка к сущности остаются на стороне вашего кода.

+

В параметрах компонента отдельно проверьте allowUpload, medialib, fileDialog, cloud, delete, edit и maxCount. Не все параметры будут иметь эффект в любой установке Bitrix: часть зависит от подключённых модулей, прав пользователя и контекста страницы.

+
$fileId = (int)$_POST['picture'];
+
+if ($fileId > 0) {
+    $file = CFile::GetFileArray($fileId);
+    if ($file && str_starts_with($file['CONTENT_TYPE'], 'image/')) {
+        // сохраняем ID картинки в своей сущности
+    }
+}
+

Если редактор не открывается, проверьте подключение модулей main и fileman, права на загрузку, административные JS-расширения и наличие сессии пользователя. В публичной части сайта проблема часто оказывается не в FileInput, а в том, что на странице не подключены нужные скрипты Bitrix.

+

Рабочая схема такая: выводим FileInput, разрешаем только картинки, ограничиваем количество, после отправки формы валидируем ID файла и сохраняем его в свою сущность. Тогда встроенный редактор становится нормальной частью формы, а не просто красивой кнопкой загрузки.

`, + 'dconf-2017-под-капотом-мусорщика-ди-дмитрий-ол': ` +

Практический вывод

+

Статья важна не только для разработчиков компилятора. Она показывает, почему аллокатор и сборщик мусора нельзя оценивать одной фразой «GC медленный». Нужно смотреть на классы размеров, поиск пулов, стоимость маркировки и то, сколько работы выполняется во время остановки мира.

+

Для прикладного D-кода вывод такой: держите горячие циклы предсказуемыми, не создавайте лишние временные объекты в tight-loop и измеряйте паузы. Если участок действительно критичен, D позволяет локально управлять GC и заменить поток мелких аллокаций заранее подготовленными буферами.

+
import core.memory : GC;
+
+GC.disable();
+scope(exit) GC.enable();
+
+// горячий участок без лишних временных объектов
+

Отключать GC нужно аккуратно. Это не волшебная оптимизация, а договор: пока сборщик выключен, программа не должна бесконтрольно накапливать мусор. Поэтому такой приём подходит для короткого измеримого участка, а не для всего приложения.

+
    +
  • Сначала измеряем: время, количество аллокаций, паузы.
  • +
  • Потом убираем лишние временные объекты и повторные выделения.
  • +
  • Только затем используем ручное управление GC, если оно действительно помогает.
  • +
  • После оптимизации оставляем комментарий, почему здесь нельзя писать «просто как обычно».
  • +
+

Главный смысл доклада в том, что производительность памяти — это архитектура. Если в программе много мелких объектов, непредсказуемых ссылок и больших пауз, проблема редко решается одной настройкой. Нужно менять модель данных, жизненный цикл объектов и место, где выделяется память.

`, + 'firefox-увеличение-ожидания-загрузки-timeout-стр': ` +

Когда лучше не увеличивать timeout

+

Увеличение ожидания помогает при разовых административных операциях, но не должно маскировать медленный сайт. Если обычная страница требует минуты, правильнее вынести задачу в фон: очередь, cron, прогресс-бар и отдельная проверка статуса.

+

Важно не путать разные таймауты. Ожидание HTTP-ответа — это одно, долго выполняющийся JavaScript на странице — другое, а таймауты прокси или веб-сервера — третье. Если Firefox ждёт дольше, но nginx, Apache, PHP-FPM или upstream уже оборвал соединение, настройка браузера не поможет.

+
    +
  • Для долгого ответа сервера проверяйте HTTP timeout в браузере и серверные таймауты.
  • +
  • Для долгого JavaScript смотрите предупреждения о зависшем скрипте и настройки выполнения JS.
  • +
  • Для импорта больших файлов лучше использовать фоновую задачу и страницу прогресса.
  • +
  • Для phpMyAdmin и разовых административных операций увеличение ожидания допустимо.
  • +
+

Если параметра в about:config нет, его можно создать вручную только тогда, когда вы понимаете, какая версия Firefox и какой именно timeout вам нужен. После завершения работы лучше вернуть настройку к обычному значению, чтобы браузер не висел слишком долго на реально недоступных сайтах.

+

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

`, +}; + +function escapeHtml(value) { + return String(value) + .replaceAll('&', '&') + .replaceAll('<', '<') + .replaceAll('>', '>') + .replaceAll('"', '"'); +} + +function decodeHtml(value = '') { + const named = { amp: '&', apos: "'", gt: '>', hellip: '...', laquo: '«', lt: '<', mdash: '—', nbsp: ' ', quot: '"', raquo: '»' }; + return value + .replace(/&#x([0-9a-f]+);/gi, (_, hex) => String.fromCodePoint(Number.parseInt(hex, 16))) + .replace(/&#(\d+);/g, (_, dec) => String.fromCodePoint(Number.parseInt(dec, 10))) + .replace(/&([a-z]+);/gi, (_, name) => named[name] ?? `&${name};`); +} + +function stripTags(value = '') { + return decodeHtml(value.replace(/<[^>]+>/g, ' ')).replace(/\s+/g, ' ').trim(); +} + +function normalizeContent(html) { + let content = html + .replace(/<\/span>/g, '') + .replace(//gi, '') + .replace(//gi, ''); + + content = content.replace(/]*>([\s\S]*?)<\/pre>/gi, (_, code) => { + const text = decodeHtml(code.replace(/<[^>]+>/g, '')); + return `
${escapeHtml(text.trim())}
`; + }); + + content = content.replace(/]*>/gi, (tag) => { + const src = decodeHtml(tag.match(/\bsrc=["']([^"']+)["']/i)?.[1] ?? ''); + const found = imageMap.find(([needle]) => src.includes(needle)); + if (!found) return ''; + const [, imageSrc, defaultAlt] = found; + const originalAlt = decodeHtml(tag.match(/\balt=["']([^"']*)["']/i)?.[1] ?? ''); + const alt = originalAlt || defaultAlt; + return `
${escapeHtml(alt)}
${escapeHtml(defaultAlt)}
`; + }); + + content = content + .replace(/\s+(srcset|sizes|width|height|class)=["'][^"']*["']/gi, '') + .replace(/

\s*<\/p>/g, '') + .replace(/\n{3,}/g, '\n\n') + .trim(); + + return content; +} + +function text(x, y, body, options = {}) { + const attrs = [ + `x="${x}"`, + `y="${y}"`, + options.size ? `font-size="${options.size}"` : '', + options.weight ? `font-weight="${options.weight}"` : '', + options.fill ? `fill="${options.fill}"` : '', + options.family ? `font-family="${options.family}"` : '', + ].filter(Boolean).join(' '); + return `${escapeHtml(body)}`; +} + +function rect(x, y, width, height, fill, stroke = '#263241', radius = 10) { + return ``; +} + +function baseSvg(width, height, title, subtitle, accent, body) { + return ` + + + +${text(56, 82, title, { size: 30, weight: 700, fill: '#1f2933' })} +${subtitle ? text(56, 116, subtitle, { size: 16, fill: '#52606d' }) : ''} +${body} +`; +} + +function diagramAsset(title, subtitle, accent, labels) { + const items = labels.map((item, index) => { + const x = 64 + index * 178; + const arrow = index < labels.length - 1 ? `` : ''; + return `${rect(x, 190, 130, 96, '#f8fafc', '#d1d8e0', 12)}${text(x + 20, 229, item[0], { size: 17, weight: 700, fill: '#1f2933' })}${text(x + 20, 258, item[1], { size: 13, fill: '#52606d' })}${arrow}`; + }).join(''); + return baseSvg(860, 420, title, subtitle, accent, items); +} + +function codeAsset(title, subtitle, accent, lines) { + const code = lines.map((line, index) => text(84, 178 + index * 28, line, { size: 17, fill: '#d7e3f5', family: 'SFMono-Regular, Menlo, Consolas, monospace' })).join(''); + return baseSvg(860, 460, title, subtitle, accent, ` +${rect(60, 140, 740, 248, '#111827', '#111827', 14)} + +${code} +`); +} + +function featureCard(title, subtitle, accent, rows) { + const body = rows.map((row, index) => { + const y = 168 + index * 58; + return `${text(124, y, row, { size: 20, fill: '#263241' })}`; + }).join(''); + return baseSvg(760, 420, title, subtitle, accent, body); +} + +function taskScheduler(kind) { + const isAction = kind === 'action'; + return baseSvg(980, 520, isAction ? 'Планировщик заданий: действие' : 'Запуск планировщика заданий', isAction ? 'В аргументах браузера виден лишний URL' : 'Win + R, затем taskschd.msc', '#2f6fed', ` +${rect(70, 148, 840, 300, '#eef3fb', '#bfccdc', 8)} +${text(96, 186, isAction ? 'Библиотека планировщика заданий' : 'Выполнить', { size: 22, weight: 700, fill: '#1f2933' })} +${isAction ? ` +${rect(96, 212, 300, 192, '#fff', '#d1d8e0', 6)} +${text(118, 248, 'Update Service', { size: 17, fill: '#1f2933' })} +${text(118, 282, 'Browser Updater', { size: 17, fill: '#1f2933' })} +${text(118, 316, 'Mozilla Firefox Task', { size: 17, fill: '#b42318', weight: 700 })} +${rect(430, 212, 420, 192, '#fff', '#d1d8e0', 6)} +${text(456, 250, 'Программа:', { size: 16, fill: '#52606d' })} +${text(456, 282, 'firefox.exe', { size: 20, fill: '#1f2933', family: 'monospace' })} +${text(456, 326, 'Аргументы:', { size: 16, fill: '#52606d' })} +${text(456, 358, 'http://example-bad-site.test', { size: 20, fill: '#b42318', family: 'monospace' })} +` : ` +${text(110, 245, 'Открыть:', { size: 18, fill: '#52606d' })} +${rect(110, 268, 540, 54, '#fff', '#9aa8b8', 6)} +${text(132, 303, 'taskschd.msc', { size: 24, fill: '#1f2933', family: 'monospace' })} +${rect(670, 268, 128, 54, '#2f6fed', '#2f6fed', 6)} +${text(704, 303, 'OK', { size: 22, fill: '#fff', weight: 700 })} +${text(110, 372, 'Так открывается системный инструмент, где видны все периодические запуски.', { size: 17, fill: '#52606d' })} +`} +`); +} + +function tilixScreenshot() { + return baseSvg(1040, 600, 'Tilix', 'Тайлинговый терминал с боковой панелью сессий', '#7c3aed', ` +${rect(66, 130, 908, 390, '#1f2933', '#111827', 12)} + +${text(100, 159, 'project: ~/src/tilix', { size: 16, fill: '#d7e3f5', family: 'monospace' })} +${rect(88, 198, 170, 286, '#111827', '#334155', 8)} +${text(112, 232, 'sessions', { size: 15, fill: '#94a3b8', family: 'monospace' })} +${text(112, 272, 'build', { size: 18, fill: '#f8fafc', family: 'monospace' })} +${text(112, 310, 'ssh prod', { size: 18, fill: '#f8fafc', family: 'monospace' })} +${text(112, 348, 'logs', { size: 18, fill: '#f8fafc', family: 'monospace' })} +${rect(286, 198, 308, 132, '#0f172a', '#475569', 8)} +${rect(616, 198, 308, 132, '#0f172a', '#475569', 8)} +${rect(286, 352, 638, 132, '#0f172a', '#475569', 8)} +${text(316, 238, '$ dub build', { size: 19, fill: '#a7f3d0', family: 'monospace' })} +${text(646, 238, '$ journalctl -f', { size: 19, fill: '#bfdbfe', family: 'monospace' })} +${text(316, 394, '$ grep -R GtkD source/', { size: 19, fill: '#fde68a', family: 'monospace' })} +${text(316, 430, 'ready', { size: 18, fill: '#e5e7eb', family: 'monospace' })} +`); +} + +function gcPools() { + return baseSvg(900, 520, 'GC D: малые пулы', 'Классы размеров и страницы памяти', '#0f766e', ` +${[16, 32, 64, 128, 256, 512].map((size, i) => { + const y = 150 + i * 48; + return `${text(74, y + 28, `${size} B`, { size: 17, fill: '#1f2933', family: 'monospace' })}${rect(150, y, 620, 32, '#ecfeff', '#99f6e4', 4)}${Array.from({ length: 10 }, (_, j) => ``).join('')}`; +}).join('')} +${text(74, 470, 'Каждая строка показывает отдельный класс размера и фрагментацию внутри страницы.', { size: 16, fill: '#52606d' })} +`); +} + +function gcLargePool() { + return baseSvg(900, 520, 'GC D: большие объекты', 'Метаданные растут вместе с диапазоном страниц', '#c2410c', ` +${rect(86, 166, 728, 92, '#fff7ed', '#fdba74', 10)} +${text(112, 222, 'object > 100 MB', { size: 25, fill: '#9a3412', family: 'monospace', weight: 700 })} +${rect(86, 310, 728, 58, '#f8fafc', '#d1d8e0', 8)} +${Array.from({ length: 18 }, (_, i) => ``).join('')} +${text(86, 410, 'Один большой объект может оставить заметный хвост таблиц и свободных страниц.', { size: 17, fill: '#52606d' })} +`); +} + +const assetFiles = { + 'cover-virus.svg': baseSvg(900, 480, 'Планировщик против рекламного запуска', 'Схема поиска вредного задания', '#2f6fed', `${rect(86, 168, 728, 178, '#eef3fb', '#bfccdc', 12)}${text(128, 230, 'taskschd.msc', { size: 38, weight: 700, fill: '#1f2933', family: 'monospace' })}${text(128, 286, 'firefox.exe + URL', { size: 28, fill: '#b42318', family: 'monospace' })}`), + 'taskschd-run.svg': taskScheduler('run'), + 'taskschd-action.svg': taskScheduler('action'), + 'jquery-webpack.svg': codeAsset('jQuery в Webpack', 'Один экземпляр библиотеки для модулей и старых плагинов', '#2563eb', ['import $ from "jquery";', 'window.$ = window.jQuery = $;', '', 'new webpack.ProvidePlugin({', ' $: "jquery",', ' jQuery: "jquery"', '});']), + 'dmd-win64.svg': diagramAsset('DMD x64 под Windows', 'Не смешиваем OMF и COFF библиотеки', '#7c2d12', [['D source', 'main.d'], ['dmd -m64', 'compiler'], ['COFF libs', 'x64'], ['EXE', 'win64']]), + 'ctfe-engine.svg': diagramAsset('NewCTFE', 'Вычисления во время компиляции без лишней магии', '#7c3aed', [['AST', 'input'], ['CTFE VM', 'evaluate'], ['Result', 'constant'], ['Binary', 'ready']]), + 'vibe-cover.svg': diagramAsset('vibe.d', 'Асинхронный веб-стек на языке D', '#059669', [['HTTP', 'server'], ['Fiber', 'async I/O'], ['Mongo/Redis', 'drivers'], ['Diet', 'views']]), + 'vibe-async.svg': featureCard('Асинхронность', 'Задачи выглядят синхронно, I/O остаётся неблокирующим', '#059669', ['fiber на запрос', 'ожидание без блокировки', 'простая модель ошибок']), + 'vibe-api.svg': featureCard('Короткий API', 'Минимум кода для типовых веб-задач', '#2563eb', ['маршруты рядом с логикой', 'простые настройки сервера', 'DUB-пакеты']), + 'vibe-web.svg': featureCard('Веб-инструменты', 'HTTP, WebSocket, сессии и шаблоны', '#dc2626', ['статические файлы', 'JSON/BSON', 'SMTP и криптография']), + 'vibe-db.svg': featureCard('Базы данных', 'MongoDB и Redis доступны из коробки', '#0f766e', ['асинхронные драйверы', 'простые запросы', 'расширение через DUB']), + 'vibe-io.svg': featureCard('Неблокирующий I/O', 'libevent и системные API вместо ожидания потока', '#9333ea', ['сетевые операции', 'файловые операции', 'меньше простаивания']), + 'vibe-dlang.svg': featureCard('Язык D', 'Скорость нативного кода и выразительность высокого уровня', '#b91c1c', ['типы и шаблоны', 'быстрая компиляция', 'удобная метапрограмма']), + 'vibe-diet.svg': featureCard('Diet templates', 'HTML без лишнего синтаксического шума', '#0f172a', ['наследник Pug/Haml', 'динамические вставки', 'читаемые view']), + 'php-ssl-cacert.svg': diagramAsset('PHP SSL CA bundle', 'Ошибка лечится сертификатами, а не отключением проверки', '#0f766e', [['PHP', 'request'], ['OpenSSL', 'verify'], ['CA file', 'cacert.pem'], ['HTTPS', 'ok']]), + 'tilix-cover.svg': diagramAsset('Tilix + D', 'Desktop-приложение на GtkD', '#7c3aed', [['GtkD', 'UI'], ['D', 'logic'], ['VTE', 'terminal'], ['GNOME', 'HIG']]), + 'tilix-screenshot.svg': tilixScreenshot(), + 'preg-match-all-d.svg': codeAsset('preg_match_all на D', 'Регулярные выражения, группы и позиции совпадений', '#be123c', ['auto r = regex(r"(\\\\w+)=(\\\\d+)");', 'auto m = matchAll("a=1 b=22", r);', '', 'foreach (hit; m) {', ' writeln(hit.captures);', '}']), + 'bitrix-offer-api.svg': codeAsset('Bitrix API: SKU', 'Создание торгового предложения и привязка к товару', '#1d4ed8', ['CModule::IncludeModule("iblock");', '$el = new CIBlockElement;', '$id = $el->Add($fields);', 'CPrice::SetBasePrice($id, 990);']), + 'bitrix-translit-api.svg': codeAsset('Bitrix API: translit', 'Символьный код из имени элемента', '#0f766e', ['$code = CUtil::translit($name, "ru", [', ' "replace_space" => "-",', ' "replace_other" => "-",', ']);']), + 'bitrix-photo-editor.svg': diagramAsset('Bitrix photo editor', 'Встроенный FileInput для загрузки и редактирования картинки', '#1d4ed8', [['FileInput', 'create'], ['upload', 'image'], ['edit', 'crop'], ['save', 'file ID']]), + 'bitrix-photo-editor-ui.svg': baseSvg(1030, 720, 'Редактор картинок Bitrix', 'Читаемый интерфейс FileInput', '#1d4ed8', `${rect(70, 150, 890, 470, '#eef3fb', '#bfccdc', 10)}${rect(110, 200, 520, 360, '#ffffff', '#9aa8b8', 8)}${rect(668, 200, 238, 56, '#fff', '#d1d8e0', 8)}${text(690, 236, 'Обрезать', { size: 20, fill: '#1f2933' })}${rect(668, 278, 238, 56, '#fff', '#d1d8e0', 8)}${text(690, 314, 'Повернуть', { size: 20, fill: '#1f2933' })}${rect(668, 356, 238, 56, '#1d4ed8', '#1d4ed8', 8)}${text(710, 392, 'Сохранить', { size: 20, fill: '#fff', weight: 700 })}`), + 'dconf-gc-cover.svg': diagramAsset('D GC under the hood', 'Пулы, страницы, маркировка и очистка', '#0f766e', [['Pool', 'memory'], ['Mark', 'scan'], ['Sweep', 'free'], ['Reuse', 'alloc']]), + 'gc-small-pools.svg': gcPools(), + 'gc-large-pool.svg': gcLargePool(), + 'firefox-timeout.svg': baseSvg(860, 420, 'Firefox timeout', 'Когда браузеру нужно ждать дольше', '#ea580c', `${rect(80, 170, 700, 80, '#fff7ed', '#fed7aa', 12)}${text(112, 222, 'network.http.response.timeout = 600', { size: 28, fill: '#9a3412', family: 'monospace', weight: 700 })}${rect(80, 286, 520, 26, '#fed7aa', '#fed7aa', 13)}${rect(80, 286, 390, 26, '#ea580c', '#ea580c', 13)}${text(80, 352, 'Для административных операций, а не для маскировки медленного сайта.', { size: 18, fill: '#52606d' })}`), +}; + +await mkdir(illustrationsDir, { recursive: true }); +await mkdir(mediaDir, { recursive: true }); +await mkdir(dataDir, { recursive: true }); + +for (const [name, svg] of Object.entries(assetFiles)) { + await writeFile(join(illustrationsDir, name), svg); +} + +for (const name of ['cropped-WallpapersMania.nnm_.ru_vol141-087.jpg', 'vibe.d.png', 'logo.png', 'bitrix-foto-editor-1.jpg', 'Без-имени.png', '-имени-e1495740674880.png', 'i-880x660.jpg']) { + try { + await copyFile(join(sourceRoot, 'assets', name), join(mediaDir, name)); + } catch { + // Generated illustrations are enough for the site; copied media is optional. + } +} + +const articles = rawArticles.filter((article) => article.slug !== 'привет-мир').map((article) => { + const content = normalizeContent(article.contentHtml); + const addition = articleAdditions[article.slug]?.trim() ?? ''; + const contentHtml = [content, addition].filter(Boolean).join('\n'); + return { + slug: article.slug, + title: article.title, + date: article.date, + author: 'DarkRiDDeR', + categories: categories[article.slug] ?? [], + cover: covers[article.slug], + excerpt: article.paragraphs.join(' ').replace(/\s+/g, ' ').slice(0, 260), + contentHtml, + readingMinutes: Math.max(1, Math.round(stripTags(contentHtml).split(/\s+/).length / 180)), + }; +}).sort((a, b) => new Date(b.date) - new Date(a.date)); + +await writeFile(join(dataDir, 'articles.json'), `${JSON.stringify(articles, null, 2)}\n`); +console.log(`Generated ${articles.length} articles and ${Object.keys(assetFiles).length} illustration assets`);