āĻœā§‡āĻ¨āĻ•āĻŋāĻ¨ā§āĻ¸ā§‡ āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻ…āĻŸā§‹āĻŽā§‡āĻļāĻ¨: āĻĢāĻ˛āĻžāĻĢāĻ˛āĻŸāĻŋ āĻ¸ā§āĻ¨ā§āĻĻāĻ°āĻ­āĻžāĻŦā§‡ āĻĢāĻŋāĻ°āĻŋāĻ¯āĻŧā§‡ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž

āĻ†āĻŦāĻžāĻ° āĻŦā§āĻ¯āĻŦāĻ¸ā§āĻĨāĻžāĻ° āĻĨāĻŋāĻŽ āĻ…āĻŦā§āĻ¯āĻžāĻšāĻ¤ āĻ°āĻžāĻ–āĻž āĻœāĻŋāĻ°ā§‹ āĻŸāĻžāĻš PROD RDS āĻāĻ° āĻ…āĻ§ā§€āĻ¨ā§‡. āĻ­āĻŦāĻŋāĻˇā§āĻ¯āĻ¤ā§‡āĻ° āĻĄāĻŋāĻŦāĻŋāĻāĻ—ā§āĻ˛āĻŋ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ PROD āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻ¸āĻ•ā§āĻˇāĻŽ āĻšāĻŦā§‡ āĻ¨āĻž, āĻ¤āĻŦā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻ¸āĻ•ā§āĻˇāĻŽ āĻšāĻŦā§‡ā§ˇ āĻœā§‡āĻ¨āĻ•āĻŋāĻ¨ā§āĻ¸ āĻāĻ•āĻŸāĻŋ āĻ¸ā§€āĻŽāĻŋāĻ¤ āĻ¸ā§‡āĻŸ āĻ…āĻĒāĻžāĻ°ā§‡āĻļāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻšāĻžāĻ•āĻ°āĻŋāĨ¤ āĻĄāĻŋāĻŦāĻŋāĻ āĻ•āĻžāĻœ āĻļā§āĻ°ā§ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻ•āĻŋāĻ›ā§ āĻ¸āĻŽāĻ¯āĻŧ āĻĒāĻ°ā§‡ āĻāĻ‡ āĻ…āĻĒāĻžāĻ°ā§‡āĻļāĻ¨ āĻ¸āĻŽāĻžāĻĒā§āĻ¤āĻŋāĻ° āĻ°āĻŋāĻĒā§‹āĻ°ā§āĻŸ āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻšāĻŋāĻ āĻŋ āĻĒāĻžāĻ¯āĻŧāĨ¤ āĻ†āĻ¸ā§āĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ•āĻžāĻ›ā§‡ āĻāĻ‡ āĻĢāĻ˛āĻžāĻĢāĻ˛āĻ—ā§āĻ˛āĻŋ āĻ‰āĻĒāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻžāĻ° āĻ‰āĻĒāĻžāĻ¯āĻŧāĻ—ā§āĻ˛āĻŋ āĻĻā§‡āĻ–āĻŋā§ˇ

āĻœā§‡āĻ¨āĻ•āĻŋāĻ¨ā§āĻ¸ā§‡ āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻ…āĻŸā§‹āĻŽā§‡āĻļāĻ¨: āĻĢāĻ˛āĻžāĻĢāĻ˛āĻŸāĻŋ āĻ¸ā§āĻ¨ā§āĻĻāĻ°āĻ­āĻžāĻŦā§‡ āĻĢāĻŋāĻ°āĻŋāĻ¯āĻŧā§‡ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž

āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻĒāĻžāĻ ā§āĻ¯

āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ¤ā§āĻšā§āĻ› āĻĻāĻŋāĻ¯āĻŧā§‡ āĻļā§āĻ°ā§ āĻ•āĻ°āĻž āĻ¯āĻžāĻ•āĨ¤ āĻĒā§āĻ°āĻĨāĻŽ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻŸāĻŋ āĻāĻ¤āĻ‡ āĻ¸āĻšāĻœ āĻ¯ā§‡ āĻāĻ–āĻžāĻ¨ā§‡ āĻ•āĻĨāĻž āĻŦāĻ˛āĻžāĻ° āĻŽāĻ¤ā§‹ āĻ•āĻŋāĻ›ā§āĻ‡ āĻ¨ā§‡āĻ‡ (āĻ˛ā§‡āĻ–āĻ• āĻāĻ° āĻĒāĻ°ā§‡ āĻĢā§āĻ°āĻŋāĻ¸ā§āĻŸāĻžāĻ‡āĻ˛ āĻ•āĻžāĻœāĻ—ā§āĻ˛āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡āĻ¨):

āĻœā§‡āĻ¨āĻ•āĻŋāĻ¨ā§āĻ¸ā§‡ āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻ…āĻŸā§‹āĻŽā§‡āĻļāĻ¨: āĻĢāĻ˛āĻžāĻĢāĻ˛āĻŸāĻŋ āĻ¸ā§āĻ¨ā§āĻĻāĻ°āĻ­āĻžāĻŦā§‡ āĻĢāĻŋāĻ°āĻŋāĻ¯āĻŧā§‡ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž

sqlcmd āĻ•āĻŋāĻ›ā§ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻ†āĻŽāĻ°āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ•āĻžāĻ›ā§‡ āĻ¤āĻž āĻ‰āĻĒāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻŋāĨ¤ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ āĻ•āĻžāĻœā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻĻāĻ°ā§āĻļ:

āĻœā§‡āĻ¨āĻ•āĻŋāĻ¨ā§āĻ¸ā§‡ āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻ…āĻŸā§‹āĻŽā§‡āĻļāĻ¨: āĻĢāĻ˛āĻžāĻĢāĻ˛āĻŸāĻŋ āĻ¸ā§āĻ¨ā§āĻĻāĻ°āĻ­āĻžāĻŦā§‡ āĻĢāĻŋāĻ°āĻŋāĻ¯āĻŧā§‡ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž

āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, āĻ­ā§āĻ˛ā§‡ āĻ¯āĻžāĻŦā§‡āĻ¨ āĻ¨āĻž āĻ¯ā§‡ RDS āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ/āĻ°āĻŋāĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻ° āĻ…āĻ§ā§€āĻ¨ā§‡ āĻ…ā§āĻ¯āĻžāĻ¸āĻŋāĻ™ā§āĻ•ā§āĻ°ā§‹āĻ¨āĻžāĻ¸, āĻ¤āĻžāĻ‡ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻāĻŸāĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡:

declare @rds table
  (id int, task_type varchar(128), database_name sysname, pct int, duration int, 
   lifecycle varchar(128), taskinfo varchar(max) null, 
   upd datetime, cre datetime,
   s3 varchar(256), ovr int, KMS varchar(256) null)
waitfor delay '00:00:20' 
insert into @rds exec msdb.dbo.rds_task_status @db_name='{db}'
select @xid=max(id) from @rds

again:
waitfor delay '00:00:02'
delete from @rds
insert into @rds exec msdb.dbo.rds_task_status @db_name='{db}' 
# {db} substituted with db name by powershell
select @stat=lifecycle,@info=taskinfo from @rds where id=@xid
if @stat not in ('ERROR','SUCCESS','CANCELLED') goto again

āĻĻā§āĻŦāĻŋāĻ¤ā§€āĻ¯āĻŧ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ, CSV

āĻāĻ–āĻžāĻ¨ā§‡ āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻ–ā§āĻŦ āĻ¸āĻšāĻœ:

āĻœā§‡āĻ¨āĻ•āĻŋāĻ¨ā§āĻ¸ā§‡ āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻ…āĻŸā§‹āĻŽā§‡āĻļāĻ¨: āĻĢāĻ˛āĻžāĻĢāĻ˛āĻŸāĻŋ āĻ¸ā§āĻ¨ā§āĻĻāĻ°āĻ­āĻžāĻŦā§‡ āĻĢāĻŋāĻ°āĻŋāĻ¯āĻŧā§‡ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž

āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, āĻāĻ‡ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻŸāĻŋ āĻ¤āĻ–āĻ¨āĻ‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡ āĻ¯āĻ–āĻ¨ CSV āĻ¤ā§‡ āĻĢā§‡āĻ°āĻ¤ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻĄā§‡āĻŸāĻž "āĻ¸āĻšāĻœ" āĻšāĻ¯āĻŧāĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻāĻ‡āĻ­āĻžāĻŦā§‡ TOP N CPU āĻ¨āĻŋāĻŦāĻŋāĻĄāĻŧ āĻ•ā§āĻ¯ā§‹āĻ¯āĻŧāĻžāĻ°ā§€āĻ—ā§āĻ˛āĻŋāĻ° āĻāĻ•āĻŸāĻŋ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻĢā§‡āĻ°āĻ¤ āĻĻā§‡āĻ“āĻ¯āĻŧāĻžāĻ° āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°ā§‡āĻ¨, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ•ā§āĻ¯ā§‹āĻ¯āĻŧāĻžāĻ°ā§€ āĻŸā§‡āĻ•ā§āĻ¸āĻŸā§‡ āĻ¯ā§‡āĻ•ā§‹āĻ¨ āĻ…āĻ•ā§āĻˇāĻ° - āĻ•āĻŽāĻž, āĻ‰āĻĻā§āĻ§ā§ƒāĻ¤āĻŋ āĻāĻŦāĻ‚ āĻāĻŽāĻ¨āĻ•āĻŋ āĻ˛āĻžāĻ‡āĻ¨ āĻŦāĻŋāĻ°āĻ¤āĻŋ āĻĨāĻžāĻ•āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻāĻ‡ āĻ•āĻžāĻ°āĻŖā§‡ CSV "āĻ•āĻ°ā§‹āĻĄ" āĻšāĻŦā§‡āĨ¤ āĻ…āĻ¤āĻāĻŦ, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ†āĻ°āĻ“ āĻœāĻŸāĻŋāĻ˛ āĻ•āĻŋāĻ›ā§ āĻĻāĻ°āĻ•āĻžāĻ°āĨ¤

HTML āĻ āĻ¸ā§āĻ¨ā§āĻĻāĻ° āĻšāĻŋāĻšā§āĻ¨

āĻ†āĻŽāĻŋ āĻāĻ–āĻ¨āĻ‡ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ•ā§‹āĻĄ āĻ¸ā§āĻ¨āĻŋāĻĒā§‡āĻŸ āĻĻā§‡āĻŦ

$Header = @"
<style>
TABLE {border-width: 1px; border-style: solid; border-color: black; border-collapse: collapse;}
TH {border-width: 1px; padding: 3px; border-style: solid; border-color: black; background-color: #6495ED;}
TD {border-width: 1px; padding: 3px; border-style: solid; border-color: black;}
</style>
"@
  
$Result = invoke-Sqlcmd -ConnectionString $jstr -Query "select * from DbInv" `
  | Select-Object -Property * -ExcludeProperty "ItemArray", "RowError", "RowState", "Table", "HasErrors"
if ($Result -eq $null) { $cnt = 0; }
elseif ($Result.getType().FullName -eq "System.Management.Automation.PSCustomObject") { $cnt = 1; }
else { $cnt = $Result.Rows.Count; } 
if ($cnt -gt 0) {
  $body = "<h2>My table</h2>"
  $Result | ConvertTo-HTML -Title "Rows" -Head $header -body $body `
    | Out-File "res.log" -Append -Encoding UTF8
  } else {
    "<h3>No data</h3>" | Out-File "res.log" -Append -Encoding UTF8
  }

āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, System.Management.Automation.PSCustomObject-āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻ˛āĻžāĻ‡āĻ¨ā§‡ āĻŽāĻ¨ā§‹āĻ¯ā§‹āĻ— āĻĻāĻŋāĻ¨, āĻāĻŸāĻŋ āĻœāĻžāĻĻā§āĻ•āĻ°; āĻ¯āĻĻāĻŋ āĻ—ā§āĻ°āĻŋāĻĄā§‡ āĻ āĻŋāĻ• āĻāĻ•āĻŸāĻŋ āĻ˛āĻžāĻ‡āĻ¨ āĻĨāĻžāĻ•ā§‡, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ•āĻŋāĻ›ā§ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻĻā§‡āĻ–āĻž āĻĻā§‡āĻ¯āĻŧāĨ¤ āĻ…āĻ¨ā§‡āĻ• āĻ¨āĻž āĻŦā§āĻā§‡āĻ‡ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨āĻŸāĻž āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ¨ā§‡āĻŸ āĻĨā§‡āĻ•ā§‡ āĻ¨ā§‡āĻ“āĻ¯āĻŧāĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻĢāĻ˛āĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻ†āĻĒāĻ¨āĻŋ āĻāĻ‡ āĻŽāĻ¤ āĻ•āĻŋāĻ›ā§ āĻ†āĻ‰āĻŸāĻĒā§āĻŸ āĻĢāĻ°āĻŽā§āĻ¯āĻžāĻŸ āĻĒāĻžāĻŦā§‡āĻ¨:

āĻœā§‡āĻ¨āĻ•āĻŋāĻ¨ā§āĻ¸ā§‡ āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻ…āĻŸā§‹āĻŽā§‡āĻļāĻ¨: āĻĢāĻ˛āĻžāĻĢāĻ˛āĻŸāĻŋ āĻ¸ā§āĻ¨ā§āĻĻāĻ°āĻ­āĻžāĻŦā§‡ āĻĢāĻŋāĻ°āĻŋāĻ¯āĻŧā§‡ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž

āĻ—ā§āĻ°āĻžāĻĢ āĻ…āĻ™ā§āĻ•āĻ¨

āĻ¸āĻ¤āĻ°ā§āĻ•ā§€āĻ•āĻ°āĻŖ: āĻ¨āĻŋāĻšā§‡āĻ° āĻ•ā§‹āĻĄ!
āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡ āĻāĻ•āĻŸāĻŋ āĻŽāĻœāĻžāĻ° āĻĒā§āĻ°āĻļā§āĻ¨ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ āĻ¯āĻž āĻļā§‡āĻˇ āĻāĻ¨ āĻŽāĻŋāĻ¨āĻŋāĻŸā§‡āĻ° āĻœāĻ¨ā§āĻ¯ CPU āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°ā§‡ - āĻĻā§‡āĻ–āĻž āĻ¯āĻžāĻšā§āĻ›ā§‡ āĻ¯ā§‡ āĻ•āĻŽāĻ°ā§‡āĻĄ āĻŽā§‡āĻœāĻ° āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻŽāĻ¨ā§‡ āĻ°ā§‡āĻ–ā§‡āĻ›ā§‡āĻ¨! āĻāĻ‡ āĻ•ā§āĻ¯ā§āĻ‡āĻœ āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°ā§āĻ¨:

DECLARE @ts_now bigint = (SELECT cpu_ticks/(cpu_ticks/ms_ticks) 
  FROM sys.dm_os_sys_info WITH (NOLOCK)); 
SELECT TOP(256) 
  DATEADD(ms, -1 * (@ts_now - [timestamp]), GETDATE()) AS [EventTime],
  SQLProcessUtilization AS [SQLCPU], 
  100 - SystemIdle - SQLProcessUtilization AS [OtherCPU]
FROM (SELECT record.value('(./Record/@id)[1]', 'int') AS record_id, 
  record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') 
    AS [SystemIdle], 
  record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') 
    AS [SQLProcessUtilization], [timestamp] 
  FROM (SELECT [timestamp], CONVERT(xml, record) AS [record] 
  FROM sys.dm_os_ring_buffers WITH (NOLOCK)
  WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' 
    AND record LIKE N'%<SystemHealth>%') AS x) AS y 
ORDER BY 1 DESC OPTION (RECOMPILE);

āĻāĻ–āĻ¨, āĻāĻ‡ āĻĢāĻ°āĻŽā§āĻ¯āĻžāĻŸāĻŋāĻ‚ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ ($Fragment āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛)

<table style="width: 100%"><tbody><tr style="background-color: white; height: 2pt;">
  <td style="width: SQLCPU%; background-color: green;"></td>
  <td style="width: OtherCPU%; background-color: blue;"></td>
  <td style="width: REST%; background-color: #C0C0C0;"></td></tr></tbody>
</table>

āĻ†āĻŽāĻ°āĻž āĻšāĻŋāĻ āĻŋāĻ° āĻļāĻ°ā§€āĻ° āĻ—āĻ āĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ:

$Result = invoke-Sqlcmd -ConnectionString $connstr -Query $Query `
  | Select-Object -Property * -ExcludeProperty `
  "ItemArray", "RowError", "RowState", "Table", "HasErrors"
if ($Result.HasRows) {
  foreach($item in $Result) 
    { 
    $time = $itemEventTime 
    $sqlcpu = $item.SQLCPU
    $other = $itemOtherCPU
    $rest = 100 - $sqlcpu - $other
    $f = $fragment -replace "SQLCPU", $sqlcpu
    $f = $f -replace "OtherCPU", $other
    $f = $f -replace "REST", $rest
    $f | Out-File "res.log" -Append -Encoding UTF8
    }

āĻ¯āĻž āĻāĻ‡ āĻŽāĻ¤ āĻĻā§‡āĻ–āĻžāĻŦā§‡:

āĻœā§‡āĻ¨āĻ•āĻŋāĻ¨ā§āĻ¸ā§‡ āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻ…āĻŸā§‹āĻŽā§‡āĻļāĻ¨: āĻĢāĻ˛āĻžāĻĢāĻ˛āĻŸāĻŋ āĻ¸ā§āĻ¨ā§āĻĻāĻ°āĻ­āĻžāĻŦā§‡ āĻĢāĻŋāĻ°āĻŋāĻ¯āĻŧā§‡ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž

āĻšā§āĻ¯āĻžāĻ, āĻŽāĻšāĻžāĻļāĻ¯āĻŧ āĻŦāĻŋāĻ•ā§ƒāĻ¤āĻŋ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ…āĻ¨ā§‡āĻ• āĻ•āĻŋāĻ›ā§ āĻœāĻžāĻ¨ā§‡āĻ¨! āĻāĻŸāĻŋ āĻ†āĻ•āĻ°ā§āĻˇāĻŖā§€āĻ¯āĻŧ āĻ¯ā§‡ āĻāĻ‡ āĻ•ā§‹āĻĄāĻŸāĻŋāĻ¤ā§‡ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡: āĻĒāĻžāĻ“āĻ¯āĻŧāĻžāĻ°āĻļā§‡āĻ˛ (āĻāĻŸāĻŋāĻ¤ā§‡ āĻ˛ā§‡āĻ–āĻž), SQL, Xquery, HTMLāĨ¤ āĻāĻŸāĻž āĻĻā§āĻƒāĻ–ā§‡āĻ° āĻŦāĻŋāĻˇāĻ¯āĻŧ āĻ¯ā§‡ āĻ†āĻŽāĻ°āĻž HTML āĻ āĻœāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ āĻ¨āĻž (āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻāĻŸāĻŋ āĻ˛ā§‡āĻ–āĻžāĻ° āĻœāĻ¨ā§āĻ¯), āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻĒāĻžāĻ‡āĻĨāĻ¨ āĻ•ā§‹āĻĄ āĻĒāĻžāĻ˛āĻŋāĻļ āĻ•āĻ°āĻž (āĻ¯āĻž āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛-āĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡) āĻĒā§āĻ°āĻ¤ā§āĻ¯ā§‡āĻ•ā§‡āĻ° āĻ•āĻ°ā§āĻ¤āĻŦā§āĻ¯!

āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻĒā§āĻ°ā§‹āĻĢāĻžāĻ‡āĻ˛āĻžāĻ° āĻŸā§āĻ°ā§‡āĻ¸ āĻ†āĻ‰āĻŸāĻĒā§āĻŸ

āĻāĻŸāĻž āĻ¸ā§āĻĒāĻˇā§āĻŸ āĻ¯ā§‡ āĻŸā§‡āĻ•ā§āĻ¸āĻŸāĻĄā§‡āĻŸāĻž āĻĢāĻŋāĻ˛ā§āĻĄā§‡āĻ° āĻ•āĻžāĻ°āĻŖā§‡ āĻŸā§āĻ°ā§‡āĻ¸āĻŸāĻŋ CSV-āĻ¤ā§‡ āĻĢāĻŋāĻŸ āĻšāĻŦā§‡ āĻ¨āĻžāĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻāĻ•āĻŸāĻŋ āĻšāĻŋāĻ āĻŋāĻ¤ā§‡ āĻāĻ•āĻŸāĻŋ āĻŸā§āĻ°ā§‡āĻ¸ āĻ—ā§āĻ°āĻŋāĻĄ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°āĻžāĻ“ āĻ…āĻĻā§āĻ­ā§āĻ¤ - āĻ†āĻ•āĻžāĻ°ā§‡āĻ° āĻ•āĻžāĻ°āĻŖā§‡ āĻāĻŦāĻ‚ āĻāĻ‡ āĻĄā§‡āĻŸāĻž āĻĒā§āĻ°āĻžāĻ¯āĻŧāĻļāĻ‡ āĻ†āĻ°āĻ“ āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻšāĻ¯āĻŧāĨ¤ āĻ…āĻ¤āĻāĻŦ, āĻ†āĻŽāĻ°āĻž āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤āĻ—ā§āĻ˛āĻŋ āĻ•āĻ°āĻŋ: āĻ†āĻŽāĻ°āĻž āĻāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ•āĻ˛ āĻ•āĻ°āĻŋ invoke-SqlCmd āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ, āĻ¯āĻžāĻ° āĻ—āĻ­ā§€āĻ°āĻ¤āĻžāĻ¯āĻŧ āĻāĻŸāĻŋ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ

select 
  SPID,EventClass,TextData,
  Duration,Reads,Writes,CPU,
  StartTime,EndTime,DatabaseName,HostName,
  ApplicationName,LoginName
   from ::fn_trace_gettable ( @filename , default )  

āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻŦāĻ¨ā§āĻ§ā§ DBA āĻĻā§āĻŦāĻžāĻ°āĻž āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸āĻ¯ā§‹āĻ—ā§āĻ¯ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡, āĻāĻ•āĻŸāĻŋ āĻ–āĻžāĻ˛āĻŋ āĻŸā§‡āĻŽāĻĒā§āĻ˛ā§‡āĻŸ āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻŸā§āĻ°ā§‡āĻ¸ā§‡āĻ¸ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡, āĻŽāĻĄā§‡āĻ˛ āĻĒā§āĻ˛ā§‡āĻŸ, āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ˛āĻžāĻŽ āĻ—ā§āĻ°āĻšāĻŖ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤āĨ¤ āĻ†āĻŽāĻ°āĻž āĻāĻ‡ āĻŽāĻĄā§‡āĻ˛āĻŸāĻŋāĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ…āĻ¨āĻ¨ā§āĻ¯ āĻ¨āĻžāĻŽā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡ āĻ…āĻ¨ā§āĻ˛āĻŋāĻĒāĻŋ āĻ•āĻ°āĻŋ:

$dt = Get-Date -format "yyyyMMdd"
$tm = Get-Date -format "hhmmss"
$tableName = $srv + "_" + $dt + "_" + $tm
$copytab = "select * into " + $tableName + " from Model"
invoke-SqlCmd -ConnectionString $tstr -Query $copytab 

āĻāĻŦāĻ‚ āĻāĻ–āĻ¨ āĻ†āĻŽāĻ°āĻž āĻāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻŸā§āĻ°ā§‡āĻ¸ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ Data.SqlClient.SqlBulkCopy - āĻ†āĻŽāĻŋ āĻ‰āĻĒāĻ°ā§‡ āĻāĻ° āĻāĻ•āĻŸāĻŋ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻ†āĻ—ā§‡āĻ‡ āĻĻāĻŋāĻ¯āĻŧā§‡āĻ›āĻŋāĨ¤ āĻšā§āĻ¯āĻžāĻ, TextData-āĻ āĻ§ā§āĻ°ā§āĻŦāĻ• āĻŽāĻžāĻ¸ā§āĻ• āĻ•āĻ°āĻžāĻ“ āĻ­āĻžāĻ˛ā§‹ āĻšāĻŦā§‡:

# mask data
foreach ($Row in $Result)
{ 
  $v = $Row["TextData"]
  $v = $v -replace "'([^']{2,})'", "'str'" -replace "[0-9][0-9]+", '999'
  $Row["TextData"] = $v
}

āĻ†āĻŽāĻ°āĻž 999 āĻĻāĻŋāĻ¯āĻŧā§‡ āĻāĻ• āĻ…āĻ•ā§āĻˇāĻ°ā§‡āĻ° āĻŦā§‡āĻļāĻŋ āĻ˛āĻŽā§āĻŦāĻž āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž āĻĒā§āĻ°āĻ¤āĻŋāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻŋ āĻāĻŦāĻ‚ āĻ†āĻŽāĻ°āĻž 'str' āĻĻāĻŋāĻ¯āĻŧā§‡ āĻāĻ• āĻ…āĻ•ā§āĻˇāĻ°ā§‡āĻ° āĻšā§‡āĻ¯āĻŧā§‡ āĻĻā§€āĻ°ā§āĻ˜ āĻ¸ā§āĻŸā§āĻ°āĻŋāĻ‚ āĻĒā§āĻ°āĻ¤āĻŋāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻŋāĨ¤ 0 āĻĨā§‡āĻ•ā§‡ 9 āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ āĻ¸āĻ‚āĻ–ā§āĻ¯āĻžāĻ—ā§āĻ˛āĻŋ āĻĒā§āĻ°āĻžāĻ¯āĻŧāĻļāĻ‡ āĻĒāĻ¤āĻžāĻ•āĻž āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻ†āĻŽāĻ°āĻž āĻ¤āĻžāĻĻā§‡āĻ° āĻ¸ā§āĻĒāĻ°ā§āĻļ āĻ•āĻ°āĻŋ āĻ¨āĻž, āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻ–āĻžāĻ˛āĻŋ āĻāĻŦāĻ‚ āĻāĻ•āĻ•-āĻ…āĻ•ā§āĻˇāĻ° āĻ¸ā§āĻŸā§āĻ°āĻŋāĻ‚ - 'Y', 'N', āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋ āĻĒā§āĻ°āĻžāĻ¯āĻŧāĻļāĻ‡ āĻ¤āĻžāĻĻā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻ¯āĻžāĻ¯āĻŧāĨ¤

āĻ†āĻ¸ā§āĻ¨ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻœā§€āĻŦāĻ¨ā§‡ āĻ•āĻŋāĻ›ā§ āĻ°āĻ™ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻŋ (āĻ•āĻ ā§‹āĻ°āĻ­āĻžāĻŦā§‡ 18+)

āĻ¸āĻžāĻ°āĻŖāĻŋāĻ¤ā§‡, āĻ†āĻĒāĻ¨āĻŋ āĻĒā§āĻ°āĻžāĻ¯āĻŧāĻļāĻ‡ āĻāĻŽāĻ¨ āĻ•āĻ•ā§āĻˇāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻšāĻžāĻ‡āĻ˛āĻžāĻ‡āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ¨ āĻ¯āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻŽāĻ¨ā§‹āĻ¯ā§‹āĻ— āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨āĨ¤ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻŦā§āĻ¯āĻ°ā§āĻĨāĻ¤āĻž, āĻ‰āĻšā§āĻš āĻ¸ā§āĻ¤āĻ°ā§‡āĻ° āĻŦāĻŋāĻ­āĻ•ā§āĻ¤āĻ•āĻ°āĻŖ āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋāĨ¤ āĻ…āĻŦāĻļā§āĻ¯āĻ‡, āĻāĻŸāĻŋ āĻ–āĻžāĻ˛āĻŋ āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛-āĻ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻĒā§āĻ°āĻŋāĻ¨ā§āĻŸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻāĻ‡āĻšāĻŸāĻŋāĻāĻŽāĻāĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻāĻŦāĻ‚ āĻœā§‡āĻ¨āĻ•āĻŋāĻ¨ā§āĻ¸ā§‡ āĻāĻ‡āĻšāĻŸāĻŋāĻāĻŽāĻāĻ˛ āĻĢāĻžāĻ‡āĻ˛ā§‡āĻ° āĻ§āĻ°āĻ¨ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻž:

declare @body varchar(max), @chunk varchar(max)
set @body='<font face="Lucida Console" size="3">'
set @body=@body+'<b>Server name: '+@@servername+'</b><br>'
set @body=@body+'<br><br>'
set @body=@body+'<table><tr><th>Job</th><th>Last Run</th><th>Avg Duration, sec</th><th>Last Run, Sec</th><th>Last Status</th></tr>'
print @body

DECLARE tab CURSOR FOR SELECT '<tr><td>'+name+'</td><td>'+
  LastRun+'</td><td>'+
  convert(varchar,AvgDuration)+'</td><td>'+
  convert(varchar,LastDuration)+'</td><td>'+
    case when LastStatus<>'Succeeded' then '<font color="red">' else '' end+
      LastStatus+
      case when LastStatus<>'Succeeded' then '</font>' else '' end+
     +'</td><td>'
  from #j2
OPEN tab;  
FETCH NEXT FROM tab into @chunk
WHILE @@FETCH_STATUS = 0  
BEGIN
  print @chunk
  FETCH NEXT FROM tab into @chunk;  
END  
CLOSE tab;  
DEALLOCATE tab;
print '</table>'

āĻ•ā§‡āĻ¨ āĻ†āĻŽāĻŋ āĻāĻ‡ āĻ§āĻ°āĻ¨ā§‡āĻ° āĻ•ā§‹āĻĄ āĻ˛āĻŋāĻ–āĻ˛āĻžāĻŽ?

āĻœā§‡āĻ¨āĻ•āĻŋāĻ¨ā§āĻ¸ā§‡ āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻ…āĻŸā§‹āĻŽā§‡āĻļāĻ¨: āĻĢāĻ˛āĻžāĻĢāĻ˛āĻŸāĻŋ āĻ¸ā§āĻ¨ā§āĻĻāĻ°āĻ­āĻžāĻŦā§‡ āĻĢāĻŋāĻ°āĻŋāĻ¯āĻŧā§‡ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž

āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ†āĻ°ā§‹ āĻ¸ā§āĻ¨ā§āĻĻāĻ° āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻ†āĻ›ā§‡āĨ¤ āĻ•āĻ¨āĻ­āĻžāĻ°ā§āĻŸ āĻŸā§-āĻāĻ‡āĻšāĻŸāĻŋāĻāĻŽāĻāĻ˛ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•ā§‹āĻˇāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ°āĻ™ āĻ•āĻ°āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧ āĻ¨āĻž, āĻ¤āĻŦā§‡ āĻ†āĻŽāĻ°āĻž āĻ¸āĻ¤ā§āĻ¯ā§‡āĻ° āĻĒāĻ°ā§‡ āĻāĻŸāĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋāĨ¤ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻ†āĻŽāĻ°āĻž 80-āĻāĻ° āĻŦā§‡āĻļāĻŋ āĻāĻŦāĻ‚ 90-āĻāĻ° āĻŦā§‡āĻļāĻŋ āĻĢā§āĻ°ā§āĻ¯āĻžāĻ—āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāĻ¨ āĻ˛ā§‡āĻ­ā§‡āĻ˛ āĻ¸āĻš āĻ¸ā§‡āĻ˛ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ‡āĨ¤ āĻ†āĻ¸ā§āĻ¨ āĻļā§ˆāĻ˛ā§€ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻŋ:

<style>
.SQLmarkup-red { color: red; background-color: yellow; }
.SQLmarkup-yellow { color: black; background-color: #FFFFE0; }
.SQLmarkup-default { color: black; background-color: white; }
</style>

āĻ•ā§āĻ¯ā§‹āĻ¯āĻŧāĻžāĻ°ā§€āĻ¤ā§‡āĻ‡ āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻĄāĻžāĻŽāĻŋ āĻ•āĻ˛āĻžāĻŽ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻŦ āĻ…āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§‡ āĻ†āĻ—ā§‡ āĻ•āĻ˛āĻžāĻŽ āĻ†āĻŽāĻ°āĻž āĻ°āĻ™ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ‡. āĻ•āĻ˛āĻžāĻŽ āĻŦāĻ˛āĻž āĻ‰āĻšāĻŋāĻ¤ āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛āĻŽāĻžāĻ°ā§āĻ•āĻ†āĻĒ-āĻ•āĻŋāĻ›ā§:

case  
  when ps.avg_fragmentation_in_percent>=90.0 then 'SQLmarkup-red'
  when ps.avg_fragmentation_in_percent>=80.0 then 'SQLmarkup-yellow'
  else 'SQLmarkup-default' 
  end as [SQLmarkup-1], 
ps.avg_fragmentation_in_percent, 

āĻāĻ–āĻ¨, āĻĒāĻžāĻ“āĻ¯āĻŧāĻžāĻ°āĻļā§‡āĻ˛ āĻĻā§āĻŦāĻžāĻ°āĻž āĻœā§‡āĻ¨āĻžāĻ°ā§‡āĻŸ āĻ•āĻ°āĻž āĻāĻ‡āĻšāĻŸāĻŋāĻāĻŽāĻāĻ˛ āĻĒāĻžāĻ“āĻ¯āĻŧāĻžāĻ° āĻĒāĻ°ā§‡, āĻ†āĻŽāĻ°āĻž āĻšā§‡āĻĄāĻžāĻ° āĻĨā§‡āĻ•ā§‡ āĻĄāĻžāĻŽāĻŋ āĻ•āĻ˛āĻžāĻŽāĻŸāĻŋ āĻ¸āĻ°āĻŋāĻ¯āĻŧā§‡ āĻĻā§‡āĻŦ āĻāĻŦāĻ‚ āĻĄā§‡āĻŸāĻžāĻ° āĻŦāĻĄāĻŋāĻ¤ā§‡ āĻ†āĻŽāĻ°āĻž āĻ•āĻ˛āĻžāĻŽ āĻĨā§‡āĻ•ā§‡ āĻ¸ā§āĻŸāĻžāĻ‡āĻ˛ā§‡ āĻŽāĻžāĻ¨ āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ° āĻ•āĻ°āĻŦāĨ¤ āĻāĻŸāĻŋ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻĻā§āĻŸāĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ:

$html = $html `
  -replace "<th>SQLmarkup[^<]*</th>", "" `
  -replace "<td>SQLmarkup-(.+?)</td><td>",'<td class="SQLmarkup-$1">'

āĻĢāĻ˛āĻžāĻĢāĻ˛:
āĻœā§‡āĻ¨āĻ•āĻŋāĻ¨ā§āĻ¸ā§‡ āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻ…āĻŸā§‹āĻŽā§‡āĻļāĻ¨: āĻĢāĻ˛āĻžāĻĢāĻ˛āĻŸāĻŋ āĻ¸ā§āĻ¨ā§āĻĻāĻ°āĻ­āĻžāĻŦā§‡ āĻĢāĻŋāĻ°āĻŋāĻ¯āĻŧā§‡ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž

āĻāĻŸāĻž āĻŽāĻžāĻ°ā§āĻœāĻŋāĻ¤ āĻ¨āĻž? āĻ¯āĻĻāĻŋāĻ“ āĻ¨āĻž, āĻāĻ‡ āĻ°āĻ™ āĻ†āĻŽāĻžāĻ•ā§‡ āĻ•āĻŋāĻ›ā§ āĻŽāĻ¨ā§‡ āĻ•āĻ°āĻŋāĻ¯āĻŧā§‡ āĻĻā§‡āĻ¯āĻŧ
āĻœā§‡āĻ¨āĻ•āĻŋāĻ¨ā§āĻ¸ā§‡ āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻ…āĻŸā§‹āĻŽā§‡āĻļāĻ¨: āĻĢāĻ˛āĻžāĻĢāĻ˛āĻŸāĻŋ āĻ¸ā§āĻ¨ā§āĻĻāĻ°āĻ­āĻžāĻŦā§‡ āĻĢāĻŋāĻ°āĻŋāĻ¯āĻŧā§‡ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨