{"id":482969,"date":"2026-06-09T10:08:24","date_gmt":"2026-06-09T10:08:24","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=482969"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=482969","title":{"rendered":"\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043a\u00a0\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430\u00a0\u0432\u0435\u0431\u2011\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u0445: ElectroBun, NeutralinoJS \u0438 Wails"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<h2>\u041a\u0430\u043a\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b?<\/h2>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0440\u0435\u0447\u044c \u0437\u0430\u0445\u043e\u0434\u0438\u0442 \u043e\u00a0\u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u043d\u0430\u00a0\u0432\u0435\u0431\u2011\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u0445, \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0442 <strong>Electron<\/strong>. VS Code, Discord, Slack, Postman\u00a0\u2014 \u0432\u0441\u0435 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430\u00a0\u043d\u0435\u043c.<\/p>\n<p>\u041d\u043e\u00a0\u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u0435\u0449\u0430\u044e\u0442 \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0440\u0430\u0441\u0445\u043e\u0434 \u043f\u0430\u043c\u044f\u0442\u0438, \u043b\u0443\u0447\u0448\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c.<\/p>\n<p>\u0412\u00a0\u0440\u0430\u043c\u043a\u0430\u0445 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e R&amp;D \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0442\u0440\u0438 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p> <a href=\"https:\/\/blackboard.sh\/electrobun\/docs\/\" rel=\"noopener noreferrer nofollow\">ElectroBun<\/a> <\/p>\n<\/li>\n<li>\n<p> <a href=\"https:\/\/neutralino.js.org\/\" rel=\"noopener noreferrer nofollow\">NeutralinoJS<\/a> <\/p>\n<\/li>\n<li>\n<p> <a href=\"https:\/\/wails.io\/\" rel=\"noopener noreferrer nofollow\">Wails<\/a> <\/p>\n<\/li>\n<\/ul>\n<p>Tauri \u044f \u0432\u00a0\u044d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043d\u0435\u00a0\u0441\u0442\u0430\u043b, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u0443\u0447\u0438\u0442\u044c Rust \u0440\u0430\u0434\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f\u00a0\u0432\u0435\u0431\u2011\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u044d\u0442\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c. \u041f\u043e\u00a0\u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u0434\u043b\u044f\u00a0\u043c\u043e\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0443\u0436 \u0442\u043e\u0447\u043d\u043e.<\/p>\n<p>Electron \u043d\u0435\u00a0\u0432\u043a\u043b\u044e\u0447\u0438\u043b \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u0432\u0441\u0435 \u0438\u0442\u0430\u043a \u0437\u043d\u0430\u044e\u0442 \u0447\u0442\u043e\u00a0\u043e\u043d \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439, \u043f\u0440\u043e\u0436\u043e\u0440\u043b\u0438\u0432\u044b\u0439, \u043d\u043e\u00a0\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u0438 production\u2011ready.<\/p>\n<h2>\u0423\u0441\u043b\u043e\u0432\u0438\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430<\/h2>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u00a0\u0431\u044b\u043b\u043e \u0431\u043e\u043b\u0435\u0435\u2011\u043c\u0435\u043d\u0435\u0435 \u0447\u0435\u0441\u0442\u043d\u044b\u043c, \u0432\u043e\u00a0\u0432\u0441\u0435\u0445 \u0442\u0440\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043a \u0434\u043b\u044f\u00a0\u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430:<\/p>\n<ul>\n<li>\n<p>React 18.3.1<\/p>\n<\/li>\n<li>\n<p>TypeScript 5.7.2<\/p>\n<\/li>\n<li>\n<p>Vite 6.0.3<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439: <\/p>\n<ul>\n<li>\n<p>\u0437\u0430\u043f\u0440\u043e\u0441 \u0441\u043f\u0438\u0441\u043a\u0430 TODO \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/jsonplaceholder.typicode.com\/\" rel=\"noopener noreferrer nofollow\">https:\/\/jsonplaceholder.typicode.com\/<\/a>; <\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 TODO<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u0435<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438<\/p>\n<\/li>\n<li>\n<p>\u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u00a0API \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043b\u0430\u0441\u044c \u043d\u0435 \u043b\u043e\u0433\u0438\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435!<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0412\u043e \u0432\u0441\u0435\u0445 \u0442\u0440\u0435\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u0441\u0442\u0438\u043b\u0438 \u0432 UI \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f!<\/p>\n<\/div>\n<\/details>\n<h2>\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c?<\/h2>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c.<\/p>\n<p>\u0425\u043e\u0442\u044c \u0432\u0441\u0435 \u0442\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043d\u0430 React (\u043f\u043e\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0432\u0430\u0448 \u043b\u044e\u0431\u0438\u043c\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a), \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e \u043e\u043d\u0438 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443.<\/p>\n<h2>ElectroBun<\/h2>\n<p>ElectroBun \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 Electron.<\/p>\n<p>\u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>Bun Runtime <\/p>\n<\/li>\n<li>\n<p><strong>Chromium Embedded Framework (CEF)<\/strong>\u00a0\u2014\u00a0\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u043d\u0430 \u0431\u0430\u0437\u0435 Chromium, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 WebView \u041e\u0421<\/p>\n<\/li>\n<li>\n<p>Zig <\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430 \u043f\u043e\u0432\u0435\u0440\u0445 \u041e\u0421 <\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 Electron \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0442 Chromium + Node.js \u0432 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0438.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0443\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0445\u043e\u0436\u0438\u043c:<\/p>\n<pre><code class=\"markdown\">Frontend     \u2193RPC\/Bridge     \u2193Backend Runtime     \u2193\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0438\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c API \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c RPC-\u0432\u044b\u0437\u043e\u0432\u044b \u043c\u0435\u0436\u0434\u0443 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u043e\u043c \u0438 \u0431\u044d\u043a\u0435\u043d\u0434\u043e\u043c.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0438\u0437 UI \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c RPC:<\/p>\n<pre><code class=\"typescript\">\/\/ \u0411\u044d\u043a\u0435\u043d\u0434import { BrowserView } from \"electrobun\/bun\";\/\/ \u041e\u0431\u0449\u0438\u0435 \u0442\u0438\u043f\u044b, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0431\u044d\u043a\u0435\u043d\u0434\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044bimport type { AppRPCType } from \"..\/shared\/types\";import os from \"os\";const appRPC = BrowserView.defineRPC&lt;AppRPCType&gt;({  maxRequestTime: 5000,  handlers: {    requests: {      getSystemInfo: () =&gt; {        const cpus = os.cpus();        return {          platform: os.platform(),          arch: os.arch(),          hostname: os.hostname(),          cpuModel: cpus[0]?.model || \"Unknown\",          cpuCores: cpus.length,          totalMemory: formatBytes(os.totalmem()),          bunVersion: process.versions.bun,          pid: process.pid,        };      },    \/\/ ... \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 RPC \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b      }    }  })<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c <code>Electroview<\/code> \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 RPC \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430:<\/p>\n<pre><code class=\"typescript\">\/\/ \u0424\u0440\u043e\u043d\u0442\u0435\u043d\u0434 (rpc.ts)import { Electroview } from \"electrobun\/view\";\/\/ \u041e\u0431\u0449\u0438\u0435 \u0442\u0438\u043f\u044b, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0431\u044d\u043a\u0435\u043d\u0434\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044bimport type { AppRPCType } from \"..\/shared\/types\";const rpc = Electroview.defineRPC&lt;AppRPCType&gt;({  handlers: {    requests: {},  },});export const electroview = new Electroview({ rpc });<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0437\u0430\u0442\u0435\u043c \u0443\u0436\u0435 \u0432\u044b\u0437\u043e\u0432 \u0432 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u043c \u0445\u0443\u043a\u0435:<\/p>\n<pre><code class=\"typescript\">\/\/ \u0424\u0440\u043e\u043d\u0442\u0435\u043d\u0434 (useSystemInfo.ts)import { electroview } from \"..\/rpc\";export function useSystemInfo() {  \/\/ ... \u043b\u043e\u0433\u0438\u043a\u0430  const fetchSystemInfo = useCallback(async () =&gt; {    setError(null);    try {      const rpc = electroview.rpc;      if (!rpc) {        setError(\"RPC \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d\");        return;      }      const sys = await rpc.request.getSystemInfo();      const mem = await rpc.request.getMemoryInfo();      const proc = await rpc.request.getProcessInfo();      setSystemInfo(sys);      setMemoryInfo(mem);      setProcessInfo(proc);    } catch (err) {      setError(err instanceof Error ? err.message : \"\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438\");    }  }, []);  \/\/ ... \u043b\u043e\u0433\u0438\u043a\u0430  }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/568\/5c2\/5cd\/5685c25cd3ba99e3c4783ee8ac7cdd53.jpg\" alt=\"UI \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 ElectroBun\" title=\"UI \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 ElectroBun\" width=\"977\" height=\"1176\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/568\/5c2\/5cd\/5685c25cd3ba99e3c4783ee8ac7cdd53.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/568\/5c2\/5cd\/5685c25cd3ba99e3c4783ee8ac7cdd53.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>UI \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 ElectroBun<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0443\u0442 \u043d\u0430\u0441 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 &#8212; <strong>278 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442<\/strong>, \u043d\u0435 \u043c\u0430\u043b\u043e! \u041e\u0442 Electron \u043f\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044e \u043f\u0430\u043c\u044f\u0442\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e, \u0447\u0442\u043e \u0432\u043f\u0440\u043e\u0447\u0435\u043c \u0438 \u043d\u0435\u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e &#8212; \u0432\u0435\u0434\u044c \u043c\u044b \u0442\u0430\u0449\u0438\u043c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a.<br \/>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0447\u0435\u0440\u0435\u0437 30-40 \u043c\u0438\u043d\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u044f ElectroBun <strong>\u0441\u043d\u0438\u0436\u0430\u043b<\/strong> \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0434\u043e 70-80\u041c\u0411, \u043e\u0434\u043d\u0430\u043a\u043e \u0434\u0430\u0436\u0435 \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0432 2 \u0440\u0430\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0443 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0432.<\/p>\n<h2>NeutralinoJS  <\/h2>\n<h3>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h3>\n<p>NeutralinoJS \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434. \u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 C++. \u0412\u043c\u0435\u0441\u0442\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e Chromium \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 WebView \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b:<\/p>\n<p>Windows &#8212; WebView2 (Edge) <\/p>\n<p>Linux &#8212; WebKitGTK <\/p>\n<p>macOS &#8212; WKWebView<\/p>\n<p>\u0421\u0445\u0435\u043c\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"markdown\">Frontend     \u2193Neutralino API     \u2193\u041d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 C++     \u2193\u041e\u0421<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u2014 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0437 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430! \u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0431\u044d\u043a\u0435\u043d\u0434 \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u0414\u043b\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u044d\u0442\u043e \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u0434\u0430, \u0441\u0440\u0430\u0437\u0443 \u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u0441\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e:<\/p>\n<pre><code class=\"json\">\/\/ \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (neutralino.config.json){  \"applicationId\": \"test-app\",  \"version\": \"1.0.0\",  \"defaultMode\": \"window\",  \"documentRoot\": \"\/react-src\/dist\/\",  \"url\": \"\/\",  \"enableServer\": true,  \"enableNativeAPI\": true,  \"nativeAllowList\": [\"app.*\", \"filesystem.*\", \"computer.*\", \"os.*\"],  \"modes\": {    \"window\": {      \"title\": \"test-app\",      \"width\": 800,      \"height\": 500,      \"minWidth\": 400,      \"minHeight\": 200,      \"icon\": \"\/react-src\/public\/favicon.svg\",      \"enableInspector\": false    }  },  \"cli\": {    \"binaryName\": \"test-app\",    \"resourcesPath\": \"\/react-src\/dist\/\",    \"extensionsPath\": \"\/extensions\/\",    \"binaryVersion\": \"6.8.0\",    \"clientVersion\": \"6.8.0\",    \"frontendLibrary\": {      \"patchFile\": \"\/react-src\/index.html\",      \"devUrl\": \"http:\/\/localhost:5173\",      \"projectPath\": \"\/react-src\/\",      \"initCommand\": \"npm install\",      \"devCommand\": \"npm run dev\",      \"buildCommand\": \"npm run build\"    }  }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0432\u0435\u0440\u0445\u0443 \u044f\u0432\u043d\u043e \u0432\u0438\u0434\u043d\u043e \u043a \u043a\u0430\u043a\u0438\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u044b\u043c \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043c\u044b \u0434\u0430\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e &#8212; \u043a \u043c\u0435\u0442\u043e\u0434\u0430\u043c: \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u041e\u0421, \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<p>\u0418 \u0441\u0440\u0430\u0437\u0443 \u043f\u0438\u0448\u0435\u043c \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434, \u043d\u0435 \u043e\u0442\u0432\u043b\u0435\u043a\u0430\u044f\u0441\u044c \u043d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0447\u0435\u0433\u043e-\u043b\u0438\u0431\u043e \u0435\u0449\u0435!<\/p>\n<pre><code class=\"typescript\">\/\/ \u0424\u0440\u043e\u043d\u0442\u0435\u043d\u0434 (useSystemInfo.ts)import { filesystem, computer, os } from \"@neutralinojs\/lib\";\/\/ \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u0432\u043c\u0435\u0441\u0442\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044fdeclare const NL_VERSION: string;declare const NL_PID: number;export function useSystemInfo() {  \/\/ ... \u043b\u043e\u0433\u0438\u043a\u0430  const fetchSystemInfo = useCallback(async () =&gt; {    try {      const [cpuInfo, memInfo, osInfo, arch, hostnameResult] =        await Promise.all([          computer.getCPUInfo(),          computer.getMemoryInfo(),          computer.getOSInfo(),          computer.getArch(),          os.execCommand(\"hostname\"),        ]);      const totalMemory = memInfo.physical.total;      const availableMemory = memInfo.physical.available;      const usedMemory = totalMemory - availableMemory;      const memoryPercent = (usedMemory \/ totalMemory) * 100;      setSystemInfo({        platform: `${osInfo.name} (${arch})`,        host: hostnameResult.stdOut.trim(),        cpu: {          model: cpuInfo.model,          cores: (cpuInfo as any).cores ?? 0,          speed: (cpuInfo as any).speed ?? 0,        },        runtime: `Neutralino v${NL_VERSION} (PID: ${NL_PID})`,        memory: {          total: totalMemory,          used: usedMemory,          percent: memoryPercent,        },      });    } catch (err) {      console.error(\"Failed to fetch system info:\", err);    }  }, []);  \/\/ ... \u043b\u043e\u0433\u0438\u043a\u0430  }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0ac\/559\/ebf\/0ac559ebf98aab88e21c5a056b36aa9a.jpg\" alt=\"UI \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 NeutralinoJS\" title=\"UI \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 NeutralinoJS\" width=\"854\" height=\"1063\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/0ac\/559\/ebf\/0ac559ebf98aab88e21c5a056b36aa9a.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0ac\/559\/ebf\/0ac559ebf98aab88e21c5a056b36aa9a.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>UI \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 NeutralinoJS<\/figcaption><\/div>\n<\/figure>\n<p>25 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442! \u0412 10 \u0440\u0430\u0437 \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0435\u043c \u0443 ElectronBun! \u042d\u0442\u043e \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u0435\u0442, \u043d\u043e \u0432\u043f\u0435\u0440\u0435\u0434\u0438 \u0435\u0449\u0435 Wails, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430 Go&#8230; \u0414\u0430\u0441\u0442 \u043b\u0438 \u0435\u043c\u0443 \u044d\u0442\u043e \u043a\u0430\u043a\u043e\u0435 \u0442\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438?<\/p>\n<h2>Wails  <\/h2>\n<h3>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h3>\n<p>Wails \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438. \u0414\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 WebView:<\/p>\n<ul>\n<li>\n<p> Edge WebView2 <\/p>\n<\/li>\n<li>\n<p> WKWebView <\/p>\n<\/li>\n<li>\n<p> WebKitGTK <\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e API \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u0438\u0448\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 backend \u043d\u0430 Go.<\/p>\n<p>\u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"markdown\">Frontend   \u2193Bindings   \u2193Go Backend   \u2193\u041e\u0421<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Wails \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 Go \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u043d\u0430 \u0432\u0430\u0448\u0435\u043c \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0435, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u043e\u0434, \u0442\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u0438\u0441\u0430\u043b\u0438 \u043d\u0430 Go (\u043a\u0430\u043a \u0438 \u044f):<\/p>\n<pre><code class=\"go\">\/\/ \u0411\u044d\u043a\u0435\u043d\u0434 (app.go)import (    \/\/ ...\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438    \/\/ \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u0430 \u043c\u0435\u0442\u0440\u0438\u043a\"github.com\/shirou\/gopsutil\/v3\/cpu\"\"github.com\/shirou\/gopsutil\/v3\/mem\"\"github.com\/shirou\/gopsutil\/v3\/process\")\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0431\u043e\u0440\u0430 \u043c\u0435\u0442\u0440\u0438\u043afunc (a *App) collectOnce(proc *process.Process) {metrics := &amp;SystemMetrics{}metrics.Pid = int32(os.Getpid())if infos, err := cpu.Info(); err == nil &amp;&amp; len(infos) &gt; 0 {    metrics.CpuModel = infos[0].ModelName}\/\/ \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044cif v, err := mem.VirtualMemory(); err == nil {metrics.TotalRAM = v.Totalmetrics.AvailRAM = v.Available}\/\/ \u041f\u0430\u043c\u044f\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430if proc != nil {if mi, err := proc.MemoryInfo(); err == nil {metrics.ProcessRAM = mi.RSS \/\/ \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043d\u044f\u0442\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \u043f\u0430\u043c\u044f\u0442\u044c}}\/\/ CPU \u0441\u0438\u0441\u0442\u0435\u043c\u044b (\u043e\u0431\u0449\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0432\u0441\u0435\u0445 \u044f\u0434\u0435\u0440, 0..100)if cpuPcts, err := cpu.Percent(0, false); err == nil &amp;&amp; len(cpuPcts) &gt; 0 {metrics.SystemCPU = cpuPcts[0]}\/\/ CPU \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430if proc != nil {if p, err := proc.Percent(0); err == nil {metrics.ProcessCPU = p}}metrics.CollectedAt = time.Now().UnixMilli()\/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438a.mu.Lock()\/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u043b\u0438\u0441\u044c \u0432 startupif metrics.Platform == \"\" {metrics.Platform = a.lastMetrics.Platformmetrics.Host = a.lastMetrics.Hostmetrics.Arch = a.lastMetrics.Archmetrics.Runtime = a.lastMetrics.Runtime}a.lastMetrics = metricsa.mu.Unlock()}\/\/ ...\u043b\u043e\u0433\u0438\u043a\u0430\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u0435\u0440\u043d\u0435\u0442 JSON \u0441 \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c\u0438 \u043d\u0430 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434func (a *App) SystemInfo() string {a.mu.RLock()m := a.lastMetricsa.mu.RUnlock()data, err := json.Marshal(m)if err != nil {return \"{}\"}return string(data)}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>SystemInfo<\/code> \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0438 \u0432 \u043f\u0430\u043f\u043a\u0435 <code>wailsjs\/go\/main<\/code>. \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"javascript\">\/\/ @ts-check\/\/ Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH \u00c2 MODIWL\/\/ This file is automatically generated. DO NOT EDITexport function SystemInfo() {  return window['go']['main']['App']['SystemInfo']();}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410 \u0442\u0430\u043a\u0436\u0435 \u0442\u0438\u043f\u044b:<\/p>\n<pre><code class=\"typescript\">\/\/ Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH \u00c2 MODIWL\/\/ This file is automatically generated. DO NOT EDITexport function SystemInfo():Promise&lt;string&gt;;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043c\u0435\u043b\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0431\u0438\u043d\u0434\u0438\u043d\u0433 \u043d\u0430 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0435:<\/p>\n<pre><code class=\"typescript\">\/\/ \u0424\u0440\u043e\u043d\u0442\u0435\u043d\u0434 (useSystemInfo.ts)import { SystemInfo } from \"..\/..\/wailsjs\/go\/main\/App\";interface ISystemInfo {  platform: string;  host: string;  arch: string;  runtime: string;  totalRam: number;  pid: number;  availRam: number;  processRam: number;  systemCpu: number;  processCpu: number;  collectedAt: number;  cpuModel: string;}export function useSystemInfo() {  const [info, setInfo] = useState&lt;ISystemInfo | null&gt;(null);  const [loading, setLoading] = useState&lt;boolean&gt;(true);  const [error, setError] = useState&lt;string | null&gt;(null);  \/\/ ... \u043b\u043e\u0433\u0438\u043a\u0430  const fetchSystemInfo = useCallback(async () =&gt; {    const loadSystemInfo = async () =&gt; {      try {        const systemInfoStr = await SystemInfo(); \/\/ \u0432\u044b\u0437\u043e\u0432 \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0430        const parsed: SystemInfo = JSON.parse(systemInfoStr);        setInfo(parsed);      } catch (err) {        setError(\"Failed to fetch system info\");        console.error(err);      } finally {        setLoading(false);      }    };  }, []);  \/\/ ... \u043b\u043e\u0433\u0438\u043a\u0430  }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e \u0441\u0443\u0442\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 Go \u0441 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c. \u0418 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/018\/5a5\/aad\/0185a5aad9ee447aa6a73888136ceffc.jpg\" alt=\"UI \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Wales\" title=\"UI \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Wales\" width=\"816\" height=\"757\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/018\/5a5\/aad\/0185a5aad9ee447aa6a73888136ceffc.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/018\/5a5\/aad\/0185a5aad9ee447aa6a73888136ceffc.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>UI \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Wales<\/figcaption><\/div>\n<\/figure>\n<h2>\u0412\u044b\u0432\u043e\u0434\u044b<\/h2>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u043c \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435\u043c \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u0441\u0442\u0430\u043b <strong>NeutralinoJS<\/strong>.<\/p>\n<p>\u0414\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u044f \u043e\u0436\u0438\u0434\u0430\u043b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0443\u044e \u043d\u0438\u0448\u0435\u0432\u0443\u044e \u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u043d\u0430\u0434 WebView, \u043d\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0439 \u0438 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u043c \u0432\u0435\u0431-\u0441\u0442\u0435\u043a\u043e\u043c.<\/p>\n<p>Wails \u0442\u043e\u0436\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u043b \u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u0435 \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c \u0434\u043b\u044f Go-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432.<\/p>\n<p>\u0410 \u0432\u043e\u0442 ElectroBun \u043f\u043e\u043a\u0430 \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0441\u043c\u0435\u0448\u0430\u043d\u043d\u044b\u0435 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u044f: \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u0441 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0441\u0442\u0435\u043a\u043e\u043c, \u043d\u043e \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u043f\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044e \u043f\u0430\u043c\u044f\u0442\u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u044f \u0432 \u0441\u0432\u043e\u0435\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u043d\u0435 \u0443\u0432\u0438\u0434\u0435\u043b.<\/p>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0441\u0434\u0435\u043b\u0430\u043b \u0441\u0432\u043e\u0434\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443-\u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u043e \u0442\u0440\u0435\u043c \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u043c:<\/p>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\">\u041a\u0440\u0438\u0442\u0435\u0440\u0438\u0439<\/p>\n<\/td>\n<td data-colwidth=\"183\" width=\"183\">\n<p align=\"left\"><strong>ElectroBun<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"208\" width=\"208\">\n<p align=\"left\"><strong>NeutralinoJS<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>Wails<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\">\u042f\u0437\u044b\u043a backend<\/p>\n<\/td>\n<td data-colwidth=\"183\" width=\"183\">\n<p align=\"left\">TypeScript (Bun)  <\/p>\n<\/td>\n<td data-colwidth=\"208\" width=\"208\">\n<p align=\"left\">\u041d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">Go<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\">Frontend  <\/p>\n<\/td>\n<td data-colwidth=\"183\" width=\"183\">\n<p align=\"left\">\u041b\u044e\u0431\u043e\u0439 \u0432\u0435\u0431<\/p>\n<\/td>\n<td data-colwidth=\"208\" width=\"208\">\n<p align=\"left\">\u041b\u044e\u0431\u043e\u0439 \u0432\u0435\u0431<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041b\u044e\u0431\u043e\u0439 \u0432\u0435\u0431<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\">\u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 UI  <\/p>\n<\/td>\n<td data-colwidth=\"183\" width=\"183\">\n<p align=\"left\">\u0411\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a + \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 WebView<\/p>\n<\/td>\n<td data-colwidth=\"208\" width=\"208\">\n<p align=\"left\">\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 WebView  <\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 WebView  <\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\">\u041f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 Browser API  <\/p>\n<\/td>\n<td data-colwidth=\"183\" width=\"183\">\n<p align=\"left\">\u2705 \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e  <\/p>\n<\/td>\n<td data-colwidth=\"208\" width=\"208\">\n<p align=\"left\">\u26a0\ufe0f \u0417\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 WebView \u041e\u0421  <\/p>\n<\/td>\n<td>\n<p align=\"left\">\u26a0\ufe0f \u0417\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 WebView \u041e\u0421  <\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\"> Canvas API  <\/p>\n<\/td>\n<td data-colwidth=\"183\" width=\"183\">\n<p align=\"left\"> \u2705  <\/p>\n<\/td>\n<td data-colwidth=\"208\" width=\"208\">\n<p align=\"left\"> \u2705  <\/p>\n<\/td>\n<td>\n<p align=\"left\"> \u2705  <\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\"> WebGL  <\/p>\n<\/td>\n<td data-colwidth=\"183\" width=\"183\">\n<p align=\"left\"> \u2705 \u041f\u043e\u043b\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430  <\/p>\n<\/td>\n<td data-colwidth=\"208\" width=\"208\">\n<p align=\"left\"> \u26a0\ufe0f \u0417\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 WebView \u041e\u0421  <\/p>\n<\/td>\n<td>\n<p align=\"left\"> \u26a0\ufe0f \u0417\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 WebView \u041e\u0421  <\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\"> WebGPU  <\/p>\n<\/td>\n<td data-colwidth=\"183\" width=\"183\">\n<p align=\"left\"> \u2705 \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f <\/p>\n<\/td>\n<td data-colwidth=\"208\" width=\"208\">\n<p align=\"left\"> \u26a0\ufe0f \u0417\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 WebView \u041e\u0421 <a href=\"https:\/\/caniwebview.com\/features\/web-feature-webgpu\/\" rel=\"noopener noreferrer nofollow\">(\u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f)<\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\"> \u26a0\ufe0f \u0417\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 WebView \u041e\u0421 <a href=\"https:\/\/caniwebview.com\/features\/web-feature-webgpu\/\" rel=\"noopener noreferrer nofollow\">(\u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f)<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\">\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u041e\u0421  <\/p>\n<\/td>\n<td data-colwidth=\"183\" width=\"183\">\n<p align=\"left\">\u0427\u0435\u0440\u0435\u0437 RPC<\/p>\n<\/td>\n<td data-colwidth=\"208\" width=\"208\">\n<p align=\"left\">\u041d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 Neutralino API  <\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0427\u0435\u0440\u0435\u0437 Go  <\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\">\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439  <\/p>\n<\/td>\n<td data-colwidth=\"183\" width=\"183\">\n<p align=\"left\">\u0427\u0435\u0440\u0435\u0437 RPC<\/p>\n<\/td>\n<td data-colwidth=\"208\" width=\"208\">\n<p align=\"left\"> \u0418\u0437 JS \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0427\u0435\u0440\u0435\u0437 Go  <\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\">\u041f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0438\u0433\u0440 \u0438 \u0442\u044f\u0436\u0435\u043b\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0438  <\/p>\n<\/td>\n<td data-colwidth=\"183\" width=\"183\">\n<p align=\"left\"> \u2705  <\/p>\n<\/td>\n<td data-colwidth=\"208\" width=\"208\">\n<p align=\"left\"> \u274c\u041d\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0433\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\"> \u274c  \u041d\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0433\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\">\u041f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f CRUD\/\u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439  <\/p>\n<\/td>\n<td data-colwidth=\"183\" width=\"183\">\n<p align=\"left\"> \u2705  <\/p>\n<\/td>\n<td data-colwidth=\"208\" width=\"208\">\n<p align=\"left\"> \u2705 \u041e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0441\u0440\u0435\u0434\u0435 TS<\/p>\n<\/td>\n<td>\n<p align=\"left\"> \u2705 \u041e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0441\u0440\u0435\u0434\u0435 Go<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\">\u041f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0443\u0442\u0438\u043b\u0438\u0442  <\/p>\n<\/td>\n<td data-colwidth=\"183\" width=\"183\">\n<p align=\"left\"> \u26a0\ufe0f \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043a\u0430\u043a \u0446\u0435\u043b\u044b\u0439 \u0431\u0440\u0430\u0443\u0437\u0435\u0440<\/p>\n<\/td>\n<td data-colwidth=\"208\" width=\"208\">\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\">\u041f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438  <\/p>\n<\/td>\n<td data-colwidth=\"183\" width=\"183\">\n<p align=\"left\">\u2705\u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0434\u0435\u043c\u043e-\u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438<\/p>\n<\/td>\n<td data-colwidth=\"208\" width=\"208\">\n<p align=\"left\">\u274c  \u0421\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f, \u043a\u0430\u043a \u043f\u043e \u042f\u041f, \u0442\u0430\u043a \u0438 \u043f\u043e API<\/p>\n<\/td>\n<td>\n<p align=\"left\"> \u2705 \u0412\u0441\u044f \u0441\u0438\u043b\u0430 \u0438 \u043c\u043e\u0449\u044c Go<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>P.S. \u042f \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u044e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 R&amp;D, \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u0411\u043e\u043b\u044c\u0448\u0435 \u0442\u0430\u043a\u0438\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u2014 <a href=\"https:\/\/t.me\/alexeev_dev_blog\" rel=\"noopener noreferrer nofollow\">\u0432 \u043c\u043e\u0435\u043c Telegram-\u043a\u0430\u043d\u0430\u043b\u0435<\/a>.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1045416\/\">https:\/\/habr.com\/ru\/articles\/1045416\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!\u041a\u0430\u043a\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b?\u041a\u043e\u0433\u0434\u0430 \u0440\u0435\u0447\u044c \u0437\u0430\u0445\u043e\u0434\u0438\u0442 \u043e\u00a0\u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u043d\u0430\u00a0\u0432\u0435\u0431\u2011\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u0445, \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0442 Electron. VS Code, Discord, Slack, Postman\u00a0\u2014 \u0432\u0441\u0435 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430\u00a0\u043d\u0435\u043c.\u041d\u043e\u00a0\u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u0435\u0449\u0430\u044e\u0442 \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0440\u0430\u0441\u0445\u043e\u0434 \u043f\u0430\u043c\u044f\u0442\u0438, \u043b\u0443\u0447\u0448\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c.\u0412\u00a0\u0440\u0430\u043c\u043a\u0430\u0445 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e R&amp;D \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0442\u0440\u0438 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f: ElectroBun  NeutralinoJS  Wails Tauri \u044f \u0432\u00a0\u044d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043d\u0435\u00a0\u0441\u0442\u0430\u043b, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u0443\u0447\u0438\u0442\u044c Rust \u0440\u0430\u0434\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f\u00a0\u0432\u0435\u0431\u2011\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u044d\u0442\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c. \u041f\u043e\u00a0\u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u0434\u043b\u044f\u00a0\u043c\u043e\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0443\u0436 \u0442\u043e\u0447\u043d\u043e.Electron \u043d\u0435\u00a0\u0432\u043a\u043b\u044e\u0447\u0438\u043b \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u0432\u0441\u0435 \u0438\u0442\u0430\u043a \u0437\u043d\u0430\u044e\u0442 \u0447\u0442\u043e\u00a0\u043e\u043d \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439, \u043f\u0440\u043e\u0436\u043e\u0440\u043b\u0438\u0432\u044b\u0439, \u043d\u043e\u00a0\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u0438 production\u2011ready.\u0423\u0441\u043b\u043e\u0432\u0438\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u0427\u0442\u043e\u0431\u044b \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u00a0\u0431\u044b\u043b\u043e \u0431\u043e\u043b\u0435\u0435\u2011\u043c\u0435\u043d\u0435\u0435 \u0447\u0435\u0441\u0442\u043d\u044b\u043c, \u0432\u043e\u00a0\u0432\u0441\u0435\u0445 \u0442\u0440\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043a \u0434\u043b\u044f\u00a0\u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430:React 18.3.1TypeScript 5.7.2Vite 6.0.3\u0422\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439: \u0437\u0430\u043f\u0440\u043e\u0441 \u0441\u043f\u0438\u0441\u043a\u0430 TODO \u0447\u0435\u0440\u0435\u0437 https:\/\/jsonplaceholder.typicode.com\/; \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 TODO\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u0435\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438\u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u00a0API \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043b\u0430\u0441\u044c \u043d\u0435 \u043b\u043e\u0433\u0438\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430.\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435!\u0412\u043e \u0432\u0441\u0435\u0445 \u0442\u0440\u0435\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u0441\u0442\u0438\u043b\u0438 \u0432 UI \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f!\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c?\u0421\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c.\u0425\u043e\u0442\u044c \u0432\u0441\u0435 \u0442\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043d\u0430 React (\u043f\u043e\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0432\u0430\u0448 \u043b\u044e\u0431\u0438\u043c\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a), \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e \u043e\u043d\u0438 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443.ElectroBunElectroBun \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 Electron.\u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f:Bun Runtime Chromium Embedded Framework (CEF)\u00a0\u2014\u00a0\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u043d\u0430 \u0431\u0430\u0437\u0435 Chromium, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 WebView \u041e\u0421Zig \u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430 \u043f\u043e\u0432\u0435\u0440\u0445 \u041e\u0421 \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 Electron \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0442 Chromium + Node.js \u0432 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0438.\u041e\u0434\u043d\u0430\u043a\u043e \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0443\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0445\u043e\u0436\u0438\u043c:Frontend     \u2193RPC\/Bridge     \u2193Backend Runtime     \u2193\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0414\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0438\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c API \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c RPC-\u0432\u044b\u0437\u043e\u0432\u044b \u043c\u0435\u0436\u0434\u0443 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u043e\u043c \u0438 \u0431\u044d\u043a\u0435\u043d\u0434\u043e\u043c.\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0438\u0437 UI \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c RPC:\/\/ \u0411\u044d\u043a\u0435\u043d\u0434import { BrowserView } from &#171;electrobun\/bun&#187;;\/\/ \u041e\u0431\u0449\u0438\u0435 \u0442\u0438\u043f\u044b, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0431\u044d\u043a\u0435\u043d\u0434\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044bimport type { AppRPCType } from &#171;..\/shared\/types&#187;;import os from &#171;os&#187;;const appRPC = BrowserView.defineRPC&lt;AppRPCType&gt;({  maxRequestTime: 5000,  handlers: {    requests: {      getSystemInfo: () =&gt; {        const cpus = os.cpus();        return {          platform: os.platform(),          arch: os.arch(),          hostname: os.hostname(),          cpuModel: cpus[0]?.model || &#171;Unknown&#187;,          cpuCores: cpus.length,          totalMemory: formatBytes(os.totalmem()),          bunVersion: process.versions.bun,          pid: process.pid,        };      },    \/\/ &#8230; \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 RPC \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b      }    }  })\u0417\u0430\u0442\u0435\u043c \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c Electroview \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 RPC \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430:\/\/ \u0424\u0440\u043e\u043d\u0442\u0435\u043d\u0434 (rpc.ts)import { Electroview } from &#171;electrobun\/view&#187;;\/\/ \u041e\u0431\u0449\u0438\u0435 \u0442\u0438\u043f\u044b, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0431\u044d\u043a\u0435\u043d\u0434\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044bimport type { AppRPCType } from &#171;..\/shared\/types&#187;;const rpc = Electroview.defineRPC&lt;AppRPCType&gt;({  handlers: {    requests: {},  },});export const electroview = new Electroview({ rpc });\u0418 \u0437\u0430\u0442\u0435\u043c \u0443\u0436\u0435 \u0432\u044b\u0437\u043e\u0432 \u0432 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u043c \u0445\u0443\u043a\u0435:\/\/ \u0424\u0440\u043e\u043d\u0442\u0435\u043d\u0434 (useSystemInfo.ts)import { electroview } from &#171;..\/rpc&#187;;export function useSystemInfo() {  \/\/ &#8230; \u043b\u043e\u0433\u0438\u043a\u0430  const fetchSystemInfo = useCallback(async () =&gt; {    setError(null);    try {      const rpc = electroview.rpc;      if (!rpc) {        setError(&#171;RPC \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d&#187;);        return;      }      const sys = await rpc.request.getSystemInfo();      const mem = await rpc.request.getMemoryInfo();      const proc = await rpc.request.getProcessInfo();      setSystemInfo(sys);      setMemoryInfo(mem);      setProcessInfo(proc);    } catch (err) {      setError(err instanceof Error ? err.message : &#171;\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438&#187;);    }  }, []);  \/\/ &#8230; \u043b\u043e\u0433\u0438\u043a\u0430  }\u0418 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435:UI \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 ElectroBun\u0422\u0443\u0442 \u043d\u0430\u0441 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 &#8212; 278 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442, \u043d\u0435 \u043c\u0430\u043b\u043e! \u041e\u0442 Electron \u043f\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044e \u043f\u0430\u043c\u044f\u0442\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e, \u0447\u0442\u043e \u0432\u043f\u0440\u043e\u0447\u0435\u043c \u0438 \u043d\u0435\u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e &#8212; \u0432\u0435\u0434\u044c \u043c\u044b \u0442\u0430\u0449\u0438\u043c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a.\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0447\u0435\u0440\u0435\u0437 30-40 \u043c\u0438\u043d\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u044f ElectroBun \u0441\u043d\u0438\u0436\u0430\u043b \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0434\u043e 70-80\u041c\u0411, \u043e\u0434\u043d\u0430\u043a\u043e \u0434\u0430\u0436\u0435 \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0432 2 \u0440\u0430\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0443 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0432.NeutralinoJS  \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430NeutralinoJS \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434. \u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 C++. \u0412\u043c\u0435\u0441\u0442\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e Chromium \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 WebView \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b:Windows &#8212; WebView2 (Edge) Linux &#8212; WebKitGTK macOS &#8212; WKWebView\u0421\u0445\u0435\u043c\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:Frontend     \u2193Neutralino API     \u2193\u041d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 C++     \u2193\u041e\u0421\u0421\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u2014 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0437 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430! \u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0431\u044d\u043a\u0435\u043d\u0434 \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u0414\u043b\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u044d\u0442\u043e \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e.\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u0434\u0430, \u0441\u0440\u0430\u0437\u0443 \u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u0441\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e:\/\/ \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (neutralino.config.json){  &#171;applicationId&#187;: &#171;test-app&#187;,  &#171;version&#187;: &#171;1.0.0&#187;,  &#171;defaultMode&#187;: &#171;window&#187;,  &#171;documentRoot&#187;: &#171;\/react-src\/dist\/&#187;,  &#171;url&#187;: &#171;\/&#187;,  &#171;enableServer&#187;: true,  &#171;enableNativeAPI&#187;: true,  &#171;nativeAllowList&#187;: [&#171;app.*&#187;, &#171;filesystem.*&#187;, &#171;computer.*&#187;, &#171;os.*&#187;],  &#171;modes&#187;: {    &#171;window&#187;: {      &#171;title&#187;: &#171;test-app&#187;,      &#171;width&#187;: 800,      &#171;height&#187;: 500,      &#171;minWidth&#187;: 400,      &#171;minHeight&#187;: 200,      &#171;icon&#187;: &#171;\/react-src\/public\/favicon.svg&#187;,      &#171;enableInspector&#187;: false    }  },  &#171;cli&#187;: {    &#171;binaryName&#187;: &#171;test-app&#187;,    &#171;resourcesPath&#187;: &#171;\/react-src\/dist\/&#187;,    &#171;extensionsPath&#187;: &#171;\/extensions\/&#187;,    &#171;binaryVersion&#187;: &#171;6.8.0&#187;,    &#171;clientVersion&#187;: &#171;6.8.0&#187;,    &#171;frontendLibrary&#187;: {      &#171;patchFile&#187;: &#171;\/react-src\/index.html&#187;,      &#171;devUrl&#187;: &#171;http:\/\/localhost:5173&#187;,      &#171;projectPath&#187;: &#171;\/react-src\/&#187;,      &#171;initCommand&#187;: &#171;npm install&#187;,      &#171;devCommand&#187;: &#171;npm run dev&#187;,      &#171;buildCommand&#187;: &#171;npm run build&#187;    }  }}\u0421\u0432\u0435\u0440\u0445\u0443 \u044f\u0432\u043d\u043e \u0432\u0438\u0434\u043d\u043e \u043a \u043a\u0430\u043a\u0438\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u044b\u043c \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043c\u044b \u0434\u0430\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e &#8212; \u043a \u043c\u0435\u0442\u043e\u0434\u0430\u043c: \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u041e\u0421, \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\u0418 \u0441\u0440\u0430\u0437\u0443 \u043f\u0438\u0448\u0435\u043c \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434, \u043d\u0435 \u043e\u0442\u0432\u043b\u0435\u043a\u0430\u044f\u0441\u044c \u043d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0447\u0435\u0433\u043e-\u043b\u0438\u0431\u043e \u0435\u0449\u0435!\/\/ \u0424\u0440\u043e\u043d\u0442\u0435\u043d\u0434 (useSystemInfo.ts)import { filesystem, computer, os } from &#171;@neutralinojs\/lib&#187;;\/\/ \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u0432\u043c\u0435\u0441\u0442\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044fdeclare const NL_VERSION: string;declare const NL_PID: number;export function useSystemInfo() {  \/\/ &#8230; \u043b\u043e\u0433\u0438\u043a\u0430  const fetchSystemInfo = useCallback(async () =&gt; {    try {      const [cpuInfo, memInfo, osInfo, arch, hostnameResult] =        await Promise.all([          computer.getCPUInfo(),          computer.getMemoryInfo(),          computer.getOSInfo(),          computer.getArch(),          os.execCommand(&#171;hostname&#187;),        ]);      const totalMemory = memInfo.physical.total;      const availableMemory = memInfo.physical.available;      const usedMemory = totalMemory &#8212; availableMemory;      const memoryPercent = (usedMemory \/ totalMemory) * 100;      setSystemInfo({        platform: `${osInfo.name} (${arch})`,        host: hostnameResult.stdOut.trim(),        cpu: {          model: cpuInfo.model,          cores: (cpuInfo as any).cores ?? 0,          speed: (cpuInfo as any).speed ?? 0,        },        runtime: `Neutralino v${NL_VERSION} (PID: ${NL_PID})`,        memory: {          total: totalMemory,          used: usedMemory,          percent: memoryPercent,        },      });    } catch (err) {      console.error(&#171;Failed to fetch system info:&#187;, err);    }  }, []);  \/\/ &#8230; \u043b\u043e\u0433\u0438\u043a\u0430  }\u0412\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f:UI \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 NeutralinoJS25 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442! \u0412 10 \u0440\u0430\u0437 \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0435\u043c \u0443 ElectronBun! \u042d\u0442\u043e \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u0435\u0442, \u043d\u043e \u0432\u043f\u0435\u0440\u0435\u0434\u0438 \u0435\u0449\u0435 Wails, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430 Go&#8230; \u0414\u0430\u0441\u0442 \u043b\u0438 \u0435\u043c\u0443 \u044d\u0442\u043e \u043a\u0430\u043a\u043e\u0435 \u0442\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438?Wails  \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430Wails \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438. \u0414\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 WebView: Edge WebView2  WKWebView  WebKitGTK \u041e\u0434\u043d\u0430\u043a\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e API \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u0438\u0448\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 backend \u043d\u0430 Go.\u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:Frontend   \u2193Bindings   \u2193Go Backend   \u2193\u041e\u0421\u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Wails \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 Go \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u043d\u0430 \u0432\u0430\u0448\u0435\u043c \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0435, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u043e\u0434, \u0442\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u0438\u0441\u0430\u043b\u0438 \u043d\u0430 Go (\u043a\u0430\u043a \u0438 \u044f):\/\/ \u0411\u044d\u043a\u0435\u043d\u0434 (app.go)import (    \/\/ &#8230;\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438    \/\/ \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u0430 \u043c\u0435\u0442\u0440\u0438\u043a&#187;github.com\/shirou\/gopsutil\/v3\/cpu&#187;&#187;github.com\/shirou\/gopsutil\/v3\/mem&#187;&#187;github.com\/shirou\/gopsutil\/v3\/process&#187;)\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0431\u043e\u0440\u0430 \u043c\u0435\u0442\u0440\u0438\u043afunc (a *App) collectOnce(proc *process.Process) {metrics := &amp;SystemMetrics{}metrics.Pid = int32(os.Getpid())if infos, err := cpu.Info(); err == nil &amp;&amp; len(infos) &gt; 0 {    metrics.CpuModel = infos[0].ModelName}\/\/ \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044cif v, err := mem.VirtualMemory(); err == nil {metrics.TotalRAM = v.Totalmetrics.AvailRAM = v.Available}\/\/ \u041f\u0430\u043c\u044f\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430if proc != nil {if mi, err := proc.MemoryInfo(); err == nil {metrics.ProcessRAM = mi.RSS \/\/ \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043d\u044f\u0442\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \u043f\u0430\u043c\u044f\u0442\u044c}}\/\/ CPU \u0441\u0438\u0441\u0442\u0435\u043c\u044b (\u043e\u0431\u0449\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0432\u0441\u0435\u0445 \u044f\u0434\u0435\u0440, 0..100)if cpuPcts, err := cpu.Percent(0, false); err == nil &amp;&amp; len(cpuPcts) &gt; 0 {metrics.SystemCPU = cpuPcts[0]}\/\/ CPU \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430if proc != nil {if p, err := proc.Percent(0); err == nil {metrics.ProcessCPU = p}}metrics.CollectedAt = time.Now().UnixMilli()\/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438a.mu.Lock()\/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u043b\u0438\u0441\u044c \u0432 startupif metrics.Platform == &#171;&#187; {metrics.Platform = a.lastMetrics.Platformmetrics.Host = a.lastMetrics.Hostmetrics.Arch = a.lastMetrics.Archmetrics.Runtime = a.lastMetrics.Runtime}a.lastMetrics = metricsa.mu.Unlock()}\/\/ &#8230;\u043b\u043e\u0433\u0438\u043a\u0430\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u0435\u0440\u043d\u0435\u0442 JSON \u0441 \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c\u0438 \u043d\u0430 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434func (a *App) SystemInfo() string {a.mu.RLock()m := a.lastMetricsa.mu.RUnlock()data, err := json.Marshal(m)if err != nil {return &#171;{}&#187;}return string(data)}\u0414\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 SystemInfo \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0443\u0434\u0443\u0442&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-482969","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/482969","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=482969"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/482969\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=482969"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=482969"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=482969"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}