{"id":206392,"date":"2013-12-17T16:28:03","date_gmt":"2013-12-17T12:28:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=206392"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=206392","title":{"rendered":"<span class=\"post_title\">\u0421\u0432\u043e\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 CPU \u0438 RAM \u0438\u0437 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u0432 \u0448\u0443\u0445\u043b\u044f\u0434\u0435<\/span>"},"content":{"rendered":"<div class=\"content html_format\"> \t\t\t\u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043b\u044e\u0431\u0438\u043c\u044b\u0445 \u0445\u0430\u0431\u043e\u0432 \u043d\u0430 \u0445\u0430\u0431\u0440\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044b\u043b \u0434\u043b\u044f \u043c\u0435\u043d\u044f DIY, \u044f \u0438 \u0441\u0430\u043c \u043d\u0435 \u043f\u0440\u043e\u0447\u044c \u0447\u0442\u043e-\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438. \u041d\u043e \u0442\u0430\u043a, \u043a\u0430\u043a \u044f \u0432 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442, \u0430 \u0432 \u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u2014 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u0449\u0438\u043a, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u043c\u043d\u043e\u0439 \u00ab\u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u044b\u00bb \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0435\u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u044b. \u0414\u0430\u043d\u043d\u044b\u0439 \u0434\u0435\u0432\u0430\u0439\u0441 \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. \u041a\u043e\u0434 \u0442\u043e\u0436\u0435 \u043d\u0435 \u043f\u0440\u0438\u0447\u0435\u0441\u0430\u043d, \u0442.\u043a. \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 proof-of-concept \u0447\u0435\u043c \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0434\u0443\u043c\u0430\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u0435\u043d, \u0438 \u0434\u0430\u0436\u0435 \u043d\u0430\u0439\u0434\u0443\u0442\u0441\u044f, \u0442\u0435 \u043a\u0442\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442 \u044d\u0442\u0443 \u043f\u043e\u0434\u0435\u043b\u043a\u0443.<br \/>  <a name=\"habracut\"><\/a><br \/>  \u0412\u0434\u043e\u0445\u043d\u043e\u0432\u0438\u0432\u0448\u0438\u0441\u044c \u043f\u043e\u0441\u0442\u043e\u043c \u043e \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043d\u044b\u0445 Vu-\u043c\u0435\u0442\u0440\u0430\u0445, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 CPU \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 RAM, \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442. \u041d\u0435 \u0438\u043c\u0435\u044f \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440\u043d\u044b\u0445 \u0432\u043e\u043b\u044c\u0442\u043c\u0435\u0442\u0440\u043e\u0432, \u043d\u043e \u0438\u043c\u0435\u044f \u043f\u043e\u043a\u043e\u0440\u0438\u0432\u0448\u0438\u0439 \u0441\u0432\u043e\u0435\u0439 \u0446\u0435\u043d\u043e\u0439 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u043e\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 16\u04452 \u044d\u043a\u0440\u0430\u043d \u043d\u0430 \u0431\u0430\u0437\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 <a href=\"http:\/\/ru.wikipedia.org\/wiki\/HD44780\">hd44780<\/a> \u0440\u0435\u0448\u0438\u043b \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430 \u043d\u0435\u043c. \u041a\u0430\u043a \u041c\u041a \u0431\u044b\u043b \u0432\u044b\u0431\u0440\u0430\u043d \u043b\u0430\u043d\u0447\u043f\u0430\u0434 <a href=\"http:\/\/processors.wiki.ti.com\/index.php\/MSP430G2_LaunchPad\">MSP430G2<\/a>, \u043a\u043e\u0438\u0445 \u044f \u043a\u0443\u043f\u0438\u043b \u0436\u043c\u0435\u043d\u044c\u043a\u0443, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u0431\u044b\u043b\u0438 \u043f\u043e $4.30. \u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0432\u0441\u0435 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 arduino, \u043d\u0443\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u0438\u043d\u043e\u0432.<br \/>  \u0421\u0445\u0435\u043c\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430(\u0432\u0437\u044f\u0442\u0430 \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430):<br \/>  <img decoding=\"async\" src=\"http:\/\/www.electronics-lab.com\/blog\/wp-content\/uploads\/2010\/12\/Launchpad_HD44780-490x250.jpg\" alt=\"image\"\/><br \/>  \u041c\u043e\u0436\u043d\u043e \u0435\u0449\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0443 \u0438 \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0443 \u043a\u043e\u043d\u0442\u0440\u0430\u0441\u0442\u0430, \u043d\u043e \u0434\u0443\u043c\u0430\u044e \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0442\u0440\u0443\u0434\u0430 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u044d\u0442\u0438\u043c \u0434\u0430\u0436\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u043c \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u0449\u0438\u043a\u0430\u043c(\u0441\u0443\u0436\u0443 \u043f\u043e \u0441\u0435\u0431\u0435).<br \/>  \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u0442\u0435\u0439, \u043f\u0435\u0440\u0432\u0430\u044f \u2014 \u0441\u043a\u0435\u0442\u0447 \u0434\u043b\u044f Energia\/Arduino. \u0412\u0441\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043a\u0435\u0442\u0447<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">#include &lt;LiquidCrystal.h&gt; byte cpuByte; byte ramByte; unsigned long lastUpdateTime; LiquidCrystal lcd(P2_3, P2_4, P1_5, P2_0, P2_1, P2_2); \/\/ \u0423 \u043c\u0435\u043d\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0442\u0430\u043a\u043e\u0435 \u043a\u0430\u043a \u0432 \u0441\u0445\u0435\u043c\u0435 \u0432\u044b\u0448\u0435  void setup() {   Serial.begin(9600);   lcd.begin(16, 2);   lcd.clear(); }  void loop() {      if (Serial.available() == 2) {       cpuByte = Serial.read();       ramByte = Serial.read();       lcd.setCursor(0, 0);       lcd.print(&quot;CPU             &quot;);       lcd.setCursor(4, 0);       for (int i=0; i &lt; cpuByte; i++) { lcd.write(255);}        lcd.setCursor(0, 1);       lcd.print(&quot;RAM             &quot;);       lcd.setCursor(4, 1);       for (int i=0; i &lt; ramByte; i++) { lcd.write(255);}              lastUpdateTime = millis();     }           if (millis()-lastUpdateTime &gt; 3000) {       lcd.setCursor(0, 0);       lcd.print(&quot;  DISCONNECTED  &quot;);       lcd.setCursor(0, 1);       lcd.print(&quot;                &quot;);     }      delay(50);  } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041b\u043e\u0433\u0438\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u0430, \u0436\u0434\u0435\u043c \u0434\u0432\u0430 \u0431\u0430\u0439\u0442\u0430 \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0432\u0438\u0434\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u0437 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0441 \u043a\u043e\u0434\u043e\u043c 255. \u041f\u0440\u043e\u0448\u043b\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u0442\u0438\u0440\u0430\u044e \u043f\u0440\u043e\u0431\u0435\u043b\u0430\u043c\u0438, \u0438\u0431\u043e \u0441 lcd.clear() \u0432\u0441\u0435 \u043c\u0438\u0433\u0430\u0435\u0442. \u0415\u0441\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 3\u0445 \u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u2014 DISCONNECTED.<\/p>\n<p>  \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u044e \u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u043e\u0434 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b 1C\u0445, \u0430 \u0438\u0437 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u042f\u041f \u0431\u043b\u0438\u0437\u043e\u043a \u043c\u043d\u0435 Delphi\/Pascal \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e. \u041d\u0430 Delphi \u0432\u0435\u0440\u0441\u0438\u0438 XE2 \u0438 \u0440\u0435\u0448\u0438\u043b \u044f \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0422\u0430\u043a \u043a\u0430\u043a \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0435\u0432\u0430\u0439\u0441\u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0445 \u041e\u0421 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 Windows, \u041f\u041e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u043a\u0430\u043a \u0441\u043b\u0443\u0436\u0431\u0430.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a \u043d\u0430 Delphi<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">unit Unit1;  interface  uses   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.SvcMgr, Vcl.Dialogs, Registry;  type   TFPService = class(TService)     procedure ServiceExecute(Sender: TService);     procedure ServiceCreate(Sender: TObject);   private     { Private declarations }   public     function GetServiceController: TServiceController; override;     { Public declarations }   end;  var   FPService: TFPService;  const   SystemBasicInformation = 0;   SystemPerformanceInformation = 2;   SystemTimeInformation = 3;  type   TPDWord = ^DWORD;    TSystem_Basic_Information = packed record     dwUnknown1: DWORD;     uKeMaximumIncrement: ULONG;     uPageSize: ULONG;     uMmNumberOfPhysicalPages: ULONG;     uMmLowestPhysicalPage: ULONG;     uMmHighestPhysicalPage: ULONG;     uAllocationGranularity: ULONG;     pLowestUserAddress: Pointer;     pMmHighestUserAddress: Pointer;     uKeActiveProcessors: ULONG;     bKeNumberProcessors: byte;     bUnknown2: byte;     wUnknown3: word;   end; type   TSystem_Time_Information = packed record     liKeBootTime: LARGE_INTEGER;     liKeSystemTime: LARGE_INTEGER;     liExpTimeZoneBias: LARGE_INTEGER;     uCurrentTimeZoneId: ULONG;     dwReserved: DWORD;   end; type   TSystem_Performance_Information = packed record     liIdleTime: LARGE_INTEGER; {LARGE_INTEGER}     dwSpare: array[0..750] of DWORD;   end;  var   NtQuerySystemInformation: function(infoClass: DWORD; buffer: Pointer; bufSize: DWORD; returnSize: TPDword): DWORD; stdcall = nil;    SysBaseInfo: TSystem_Basic_Information;   SysPerfInfo: TSystem_Performance_Information;   SysTimeInfo: TSystem_Time_Information;    status: Longint; {long}   liOldIdleTime, liOldSystemTime: LARGE_INTEGER;   dbSystemTime, dbIdleTime, dbIdleTimePercent: Double;   hCom: THandle;    DCB:TDCB;   Errors, Bytes : Cardinal;   TheStruct:TCOMSTAT;   Timeouts: TCommTimeOuts;    ComNum:string;  implementation  {$R *.DFM}  procedure ServiceController(CtrlCode: DWord); stdcall; begin   FPService.Controller(CtrlCode); end;  function TFPService.GetServiceController: TServiceController; begin   Result := ServiceController; end;  Procedure getComNum; var Reg: TRegistry; begin   Reg := TRegistry.Create(KEY_READ or KEY_WOW64_64KEY);   try     Reg.RootKey := HKEY_LOCAL_MACHINE;     if Reg.OpenKey('\\SOFTWARE\\FPanel', false) then     begin       ComNum := Reg.ReadString('ComNum');       Reg.CloseKey;     end;   finally     Reg.Free;   end; end;  Procedure InitCPUUsage; begin   if @NtQuerySystemInformation = nil then NtQuerySystemInformation := GetProcAddress(GetModuleHandle('ntdll.dll'), 'NtQuerySystemInformation');   status := NtQuerySystemInformation(SystemBasicInformation, @SysBaseInfo, SizeOf(SysBaseInfo), nil);   if status &lt;&gt; 0 then exit; end;  function CPUUsed: integer;    function Li2Double(x: LARGE_INTEGER): Double;   begin     Result := x.HighPart * 4.294967296E9 + x.LowPart   end;  begin   result := 0;   status := NtQuerySystemInformation(SystemTimeInformation, @SysTimeInfo, SizeOf(SysTimeInfo), nil);   if status &lt;&gt; 0 then Exit;   status := NtQuerySystemInformation(SystemPerformanceInformation, @SysPerfInfo, SizeOf(SysPerfInfo), nil);   if status &lt;&gt; 0 then Exit;    dbIdleTime := Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);   dbSystemTime := Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);   dbIdleTimePercent := dbIdleTime \/ dbSystemTime * 100;    liOldIdleTime := SysPerfInfo.liIdleTime;   liOldSystemTime := SysTimeInfo.liKeSystemTime;    if (dbIdleTimePercent \/ SysBaseInfo.bKeNumberProcessors) &lt; 0 then result := 0 else   result := round(abs(100-(dbIdleTimePercent \/ SysBaseInfo.bKeNumberProcessors)));  end;  function RAMUsed: byte; var RamStats: TMemoryStatus; begin   GlobalMemoryStatus(RamStats);   result := ramStats.dwMemoryLoad; end;  procedure con2com; var ComFN:string; begin   CloseHandle(hCom);   ComFN := '\\\\.\\COM' + comNum;   hCom := CreateFile(PWidechar(ComFN), GENERIC_WRITE or GENERIC_READ, 0, nil, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, 0); \/\/Change COM1 to the comport you are using...   if hCom = INVALID_HANDLE_VALUE then  Exit;    SetupComm(hCom,100,100);    GetCommState(hCom,DCB);   with DCB do begin     BaudRate:=9600;     ByteSize:=8;     Parity:=NoParity;     StopBits:=OneStopBit;   end;   SetCommState(hCom,DCB);    GetCommTimeouts(hCom,Timeouts);   with TimeOuts do begin     ReadIntervalTimeout := 1;     ReadTotalTimeoutMultiplier := 0;     ReadTotalTimeoutConstant := 1;     WriteTotalTimeoutMultiplier := 2;     WriteTotalTimeoutConstant := 2;   end;   SetCommTimeouts(hCom,Timeouts); end;  procedure TFPService.ServiceExecute(Sender: TService); var NumberWritten:LongWord;     twoBytes:array[0..1] of byte;  begin while not Terminated do   begin     twoBytes[0] := round(CPUUsed \/ 8.33);     twoBytes[1] := round(RAMUsed \/ 8.33);     if WriteFile(hCom, twoBytes, 2, NumberWritten, nil) = False then con2com;     Sleep(250);     ServiceThread.ProcessRequests(False);   end; end;  procedure TFPService.ServiceCreate(Sender: TObject); begin  initCPUUsage;  getComNum;  con2com; end;  end. <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0414\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u043b\u0443\u0436\u0431\u044b \u0444\u0430\u0439\u043b FP_servicel.\u0435\u0445\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \/install \u0441 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0439 \u043a\u043b\u044e\u0447 ComNum \u0432 \u0440\u0435\u0435\u0441\u0442\u0440\u0435, \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043d\u043e\u043c\u0435\u0440\u0430 COM-\u043f\u043e\u0440\u0442\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u00ab\u0432\u0438\u0441\u0438\u0442\u00bb \u043d\u0430\u0448 \u043b\u0430\u043d\u0447\u043f\u0430\u0434 \u043f\u043e \u043f\u0443\u0442\u0438 HKEY_LOCAL_MACHINE\\SOFTWARE\\FPanel, \u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 ComNum = \u00ab12\u00bb. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043b\u0443\u0436\u0431\u0443 FPService \u0447\u0435\u0440\u0435\u0437 \u043e\u0441\u043d\u0430\u0441\u0442\u043a\u0443 \u00ab\u0421\u043b\u0443\u0436\u0431\u044b\u00bb. \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u0430.<br \/>  \u0412\u0438\u0434\u0435\u043e \u0440\u0430\u0431\u043e\u0442\u044b:<br \/>  <iframe loading=\"lazy\" width=\"560\" height=\"349\" src=\"\/\/www.youtube.com\/embed\/YrMct2LNrws?wmode=opaque\" frameborder=\"0\" allowfullscreen><\/iframe><br \/>  <a href=\"http:\/\/zalil.ru\/upload\/34855706\">\u0410\u0440\u0445\u0438\u0432 Delphi \u043f\u0440\u043e\u0435\u043a\u0442\u0430+\u0433\u043e\u0442\u043e\u0432\u044b\u0439.\u0435\u0445\u0435<\/a><br \/>  \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435. \t\t\t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/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=\"http:\/\/habrahabr.ru\/post\/206392\/\"> http:\/\/habrahabr.ru\/post\/206392\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\"> \t\t\t\u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043b\u044e\u0431\u0438\u043c\u044b\u0445 \u0445\u0430\u0431\u043e\u0432 \u043d\u0430 \u0445\u0430\u0431\u0440\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044b\u043b \u0434\u043b\u044f \u043c\u0435\u043d\u044f DIY, \u044f \u0438 \u0441\u0430\u043c \u043d\u0435 \u043f\u0440\u043e\u0447\u044c \u0447\u0442\u043e-\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438. \u041d\u043e \u0442\u0430\u043a, \u043a\u0430\u043a \u044f \u0432 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442, \u0430 \u0432 \u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u2014 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u0449\u0438\u043a, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u043c\u043d\u043e\u0439 \u00ab\u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u044b\u00bb \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0435\u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u044b. \u0414\u0430\u043d\u043d\u044b\u0439 \u0434\u0435\u0432\u0430\u0439\u0441 \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. \u041a\u043e\u0434 \u0442\u043e\u0436\u0435 \u043d\u0435 \u043f\u0440\u0438\u0447\u0435\u0441\u0430\u043d, \u0442.\u043a. \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 proof-of-concept \u0447\u0435\u043c \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0434\u0443\u043c\u0430\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u0435\u043d, \u0438 \u0434\u0430\u0436\u0435 \u043d\u0430\u0439\u0434\u0443\u0442\u0441\u044f, \u0442\u0435 \u043a\u0442\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442 \u044d\u0442\u0443 \u043f\u043e\u0434\u0435\u043b\u043a\u0443.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-206392","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/206392","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=206392"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/206392\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=206392"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=206392"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=206392"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}