суббота, 2 декабря 2023 г.

sort linked list

 #include <iostream>

#include <stdlib.h>

struct node {
    int item;
    node *next;

    node(int x, node *t){
        item = x;
        next = t;
    }
};

typedef node *link;

void printList(link list){
    while(list != nullptr){
        std::cout << list->item << " -> ";
        list = list->next;
    }

    std::cout << "(null)" << std::endl;
}

link getInsertPosition(link sortedList, int valueToSearch);
void insertAfter(link insertPosition, link node);

link generateList(int listLength){

    link head = new node(0, nullptr);
    link tail = head;

    for(int i = 0; i < listLength; i++){
        tail->next = new node(rand() % 1000, nullptr);
        tail = tail->next;
    }

    return head;
}

/// @param nonSortedList - несортированный список, с фиктивным узлом вначале
link sortList(link nonSortedList){

    link headOfSorted = new node(0, nullptr);

    link currentNonSorted = nonSortedList->next;

    while(true){

        if (currentNonSorted == nullptr){
            break;
        }

        link nextNonSorted = currentNonSorted->next;

        link firstGreater = getInsertPosition(headOfSorted, currentNonSorted->item);
        insertAfter(firstGreater, currentNonSorted);

        currentNonSorted = nextNonSorted;
    }

    return headOfSorted;
/*
    link headOfSorted = new node(0, nullptr);
    link nextNonSorted;

    for(link currentNonSorted = nonSortedList->next; currentNonSorted != nullptr;){

        nextNonSorted = currentNonSorted->next;

        link currentSorted;

        for(currentSorted = headOfSorted; currentSorted->next != nullptr; currentSorted = currentSorted->next){
            if (currentSorted->next->item > currentNonSorted->item) { break; }
        }

        currentNonSorted->next = currentSorted->next;
        currentSorted->next = currentNonSorted;

        currentNonSorted = nextNonSorted;
    }

    return headOfSorted;
*/
}

/// @param sortedList сортированный список, с фиктивным узлом вначале
/// @param valueToSearch - узел для поиска
link getInsertPosition(link sortedList, int valueToSearch){

    while(true){
        if (sortedList->next == nullptr){
            break;
        }

        if (sortedList->next->item > valueToSearch){
            break;
        }

        sortedList = sortedList->next;
    }

    return sortedList;
}

void insertAfter(link insertPosition, link node){
    node->next = insertPosition->next;
    insertPosition->next = node;
}

int main(int argc, char *argv[]){
    int listLength = atoi(argv[1]);

    link notSortedList = generateList(listLength);
    printList(notSortedList);

    link sortedList = sortList(notSortedList);
    printList(sortedList);

    return 0;
}

суббота, 11 ноября 2023 г.

coupling alg

 /*quick weighted union with path compression*/

#include <stdio.h>

#include <iostream>

#define N 10


int get_root(int id[], int element){

    while(id[element] != element){

        element = id[element];

    }

    return element;

}


int main(){

    int id[N];

    int size[N];


    for (int i = 0; i < N; i++){

        id[i] = i;

        size[i] = 1;

    }


    int p;

    int q;


    while(std::cin >> p >> q){

        int pRoot = get_root(id, p);

        int qRoot = get_root(id, q);


        if (qRoot == pRoot) {

            continue;

        }


        if (size[pRoot] > size[qRoot]){

            id[qRoot] = id[q] = pRoot;

            size[pRoot] += size[qRoot];

        }

        else {

            id[pRoot]= id[p] = qRoot;

            size[qRoot] += size[pRoot];

        }


        printf("%d %d\n", p, q);


    }


    for(int i =0; i < N; i++){

        printf("%d \t", id[i]);

    }

    printf("\n");


    for(int i =0; i < N; i++){

        printf("%d \t", size[i]);

    }

    printf("\n");


    return 0;

}

//---------------------------------

/*quick weighted union with max path length */

#include <stdio.h>

#include <iostream>


#define N 10


int get_root(int id[], int element){


    while(id[element] != element){

        element = id[element];

    }


    return element;

}


int main(){


    int id[N];

    int size[N];


    for (int i = 0; i < N; i++){

        id[i] = i;

        size[i] = 1;

    }


    int p;

    int q;


    while(std::cin >> p >> q){

        int pRoot = get_root(id, p);

        int qRoot = get_root(id, q);


        if (qRoot == pRoot) {

            continue;

        }


        if (size[pRoot] >= size[qRoot]){

            id[qRoot] = pRoot;


            if (size[pRoot] == size[qRoot]){

                size[pRoot] += 1;

            }

        }

        else {

            id[pRoot] = qRoot;

        }


        printf("%d %d\n", p, q);


    }


    for(int i =0; i < N; i++){

        printf("%d \t", id[i]);

    }

    printf("\n");


    for(int i =0; i < N; i++){

        printf("%d \t", size[i]);

    }

    printf("\n");


    return 0;

}

вторник, 10 ноября 2020 г.

google.protobuf encode variants

 private static int GetDestBytes(ulong number)

        {

            for (int i = 0; i < sizeof(ulong); i++)

            {

                if (number < (ulong)1 << (8 * (i + 1) - 1) >> i)

                {

                    return i + 1;

                }

            }


            if ((number & ((ulong)1 << 63)) != 0)

            {

                return sizeof(ulong) + 2;

            }


            return sizeof(ulong) + 1;

        }


        private static int GetMinBytes(ulong number)

        {

            for (int i = 0; i < sizeof(ulong) - 1; i++)

            {

                if (number < (ulong)1 << (8 * (i + 1)))

                {

                    return i + 1;

                }

            }


            return sizeof(ulong);

        }


        public static byte[] GetVariant_my(ulong number)

        {

            int destLength = GetDestBytes(number);


            if (destLength == 1) //nothing to encode

            {

                return new byte[]

                {

                    (byte)number

                };

            }


            byte[] byteArray = BitConverter.GetBytes(number).Take(GetMinBytes(number)).ToArray();

            byte[] destArray = new byte[destLength];


            //save first 1 bit

            byte prevFirstBits = (byte)((uint)byteArray[0] >> 7);

            destArray[0] = (byte)(byteArray[0] | 128); // set msb = 1


            for (int i = 1; i < byteArray.Length; i++)

            {

                var firstBits = (byte)((uint)byteArray[i] >> (8 - i - 1));


                //shift to right and apply saved bits from prev octet

                destArray[i] = (byte)(byteArray[i] << i | prevFirstBits);


                //for non-last octet set msb = 1

                if (i < destLength - 1)

                {

                    destArray[i] = (byte)(destArray[i] | 128);

                }


                prevFirstBits = firstBits;

            }


            // apply prev saved bit to last byte

            if (prevFirstBits != 0)

            {

                destArray[byteArray.Length] = prevFirstBits;

            }


            //for numbers > 2^63 need to save msb

            if (destArray.Length == 10)

            {

                destArray[^1] = 1;

            }


            return destArray;

        }

понедельник, 14 октября 2019 г.

gulp + react + babel + browserify

var gulp = require('gulp');
var babel = require("gulp-babel");
var browserify = require('browserify');
var gutil = require('gulp-util');
var source = require('vinyl-source-stream');
var buffer = require('vinyl-buffer');
var watch = require('gulp-watch');
var gutil = require('gulp-util');
const babelify = require('babelify');


function transform() {
    return gulp.src('./src/*.js')
        .pipe(babel({
            presets: ["@babel/preset-env", "@babel/preset-react"]
        }))
        .pipe(gulp.dest('dist'));
}

function bundle() {
    return browserify('./src/index.js',
        { bundleExternal: true, external: ['react', 'react-dom'] })
        .transform(babelify, { presets: ["@babel/preset-env", "@babel/preset-react"] })
        .bundle()
        .on('error', gutil.log)
        .pipe(source('index.js'))
        .pipe(buffer())
        .pipe(gulp.dest('./dist/'));

}

function bundleprimereact() {
    //, { ignore: [require.resolve('react')] }
    return browserify('./node_modules/primereact/datatable',
        { external: ['react', 'react-dom'] })
        .bundle()
        .on('error', gutil.log)
        .pipe(source('primereact_datatable.js'))
        .pipe(buffer())
        .pipe(gulp.dest('./dist/'))

}

exports.transform = transform;

exports.bundle = bundle;

exports.bundleprimereact = bundleprimereact;

воскресенье, 11 августа 2019 г.

willie script, psh

$count_in_serial = 4 #
$overall_count = 20 #
$sleep_sec = 6 #

Add-Type -AssemblyName System.speech
$speak = New-Object System.Speech.Synthesis.SpeechSynthesizer
$speak.SelectVoice('Microsoft Zira Desktop')

$rnd = [random]::new()

for($i=0; $i -lt $overall_count; $i++){
    $str = ""
    for($j=0; $j -lt $count_in_serial; $j++){
      $str += " " + $rnd.Next(1,10) 
    }
    write-host $str
    $speak.Speak($str)
    Start-Sleep -Seconds $sleep_sec
}

willie, python script

count_in_serial = 3 # count in serie
overall_count = 20 # series count
sleep_sec = 5 # series delay

incomp_punch = { 9 : [8], 8: [9], 3 : [4], 4: [3], 3: [3], 4: [4] }

import random
import win32com.client as wincl
import time
speak = wincl.Dispatch("SAPI.SpVoice")
speak.Rate = -2

random.seed()

for i in range(overall_count):
    str = ""
    ser = [random.randint(1, 9) for x in range(count_in_serial)]
    for j in range(count_in_serial-1):
        while ser[j+1] in incomp_punch.get(ser[j],[]):
            ser[j+1] = random.randint(1, 10)
    print(ser.__str__())
    speak.Speak(ser.__str__().replace(',',' '))
    time.sleep(sleep_sec)

воскресенье, 30 июня 2019 г.

scom html dashboard, win computer summary

<!DOCTYPE HTML>
<html>

<head>
<style>
.healthStyle_healthy {
background-color: lightgreen;
}
.healthStyle_critical {
background-color: Salmon;
}
.healthStyle_warning {
background-color: yellow;
}
.healthStyle_unavailable-healthy {
background-color: grey;
}
#compInfo > p {
margin: 1px;
padding: 1px;
font-size: small;
}
#compInfo {

}

#divAlert > p {
margin: 1px;
padding: 1px;
}
</style>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script type="text/javascript">

//var lastSelectedName = "lastObjSelected_c92650fd-5b51-4fb3-a6fe-d3cd845a7066";
var computerClass = "Microsoft.Windows.Library!Microsoft.Windows.Computer";
var groupId = "1d62280e-f437-1369-316b-1e8659500e9a";
var DurationMin = 1440;

function renderComputerList(){
$.ajax({
url: "/OperationsManager/data/state",
type: "POST",
headers: {
"Content-Type": "application/json"
},
data: JSON.stringify({
"classId": computerClass,
"objectIds": { groupId: -1},
"criteria": "((HealthState = '0') OR (HealthState = '1') OR (HealthState = '2') OR (HealthState = '3') OR HealthState is null)",
"displayColumns": [
"healthstate",
"id",
"displayname",
"path",
"maintenancemode"
]
}).replace("groupId", groupId),
success: function (result) {
debugger;
let objSel = $('#computers');
for (var i = 0; i < result.rows.length; i++) {
objSel.append('<option value="' + result.rows[i].id +'" class="healthStyle_' + result.rows[i].healthstate + '">'+result.rows[i].displayname+'</option>');
}
let lastObjSelected = localStorage.getItem("lastObjSelected_c92650fd-5b51-4fb3-a6fe-d3cd845a7066");
if (lastObjSelected) {
objSel.val(lastObjSelected);
}
else {
objSel[0].selectedIndex = 0;
}
objChanged();
}
});
}

        window.onload = function () {
renderComputerList();
        }

function GetProp(dict, nameRus, nameEng){
return dict.filter(function( item ) {
return (item.name == nameRus || item.name == nameEng);
});
}

function ProcessObjProperties(properties){
var ipAddr = GetProp(properties, "IP-адрес", "IP Address")[0].value;
var domainName = GetProp(properties, "DNS-имя домена", "DNS Domain Name")[0].value;
var siteName = GetProp(properties, "Сайт Active Directory", "Active Directory Site")[0].value;
//var ou = GetProp(properties, "Подразделение", "")[0].value;
var pCPU = GetProp(properties, "Physical Processors", "Физические процессоры")[0].value;
var lCPU = GetProp(properties, "Logical Processors", "Логические процессоры")[0].value;
var isVM = GetProp(properties, "Виртуальная машина", "Virtual Machine")[0].value;
var innerHTML = "<p>IP: " + ipAddr + "</p>" +
"<p>Domain: " + domainName + "</p>" +
"<p>Site: " + siteName + "</p>" +
"<p>CPU: " + pCPU +" <block title='Logical Processors'>(" + lCPU + ") </block></p>";
if (isVM == 'True'){
var vmName = GetProp(properties, "Имя виртуальной машины", "Virtual Machine Name")[0].value;
var vmHost = GetProp(properties, "Имя сервера узла", "Host Server Name")[0].value;
innerHTML += "<p>VMName: " + vmName + "</p><p>Host: " + vmHost + "</p>";
with($('#compIcon')[0]){
src = "https://img.icons8.com/color/96/000000/windows-client.png";
alt="Virtual Server";
title="Virtual Server";
}
//innerHTML = '<img src="https://img.icons8.com/color/96/000000/windows-client.png" alt="Virtual Server" title="Virtual Server">' + innerHTML;
}
else {
with($('#compIcon')[0]){
src = "https://img.icons8.com/color/96/000000/server.png";
alt="Physical Server";
title="Physical Server";
}
//innerHTML = '<img src="https://img.icons8.com/color/96/000000/server.png" alt="Physical Server" title="Physical Server">' + innerHTML;
}
var divInfo = $('#compInfo');
divInfo.html(innerHTML);
}

function GetObjectProperties(id,processFunc){
$.ajax({
                url: "/OperationsManager/data/monitoringObjectProperties/{" + id + "}",
async: true,
                type: "GET",
                headers: {
                    "Content-Type": "application/json",
"Accept-Language": "en"
                },               
                success: function (result) {
processFunc(result);
                }
            });
}

function ProcessALerts(alerts){
var criticalCounter = 0;
var warningCounter = 0;
var warningAlerts = "Warning Alerts:\n";
var criticalAlerts = "Critical Alerts:\n";

for (var i = 0; i < alerts.rows.length; i++) {
switch(alerts.rows[i].severity){
case "Error":
if (criticalCounter < 5){
criticalAlerts += alerts.rows[i].name + " (" + alerts.rows[i].age + ")\n";
}
criticalCounter++;
break;
case "Warning":
if (warningCounter < 5){
warningAlerts += alerts.rows[i].name + " (" + alerts.rows[i].age + ")\n";
}
warningCounter++;
break;
}
}

var warningColor = "green";
var errorColor = "green";
if (warningCounter > 0) { warningColor = "orange";}
if (criticalCounter >0) { errorColor = "red";}

var htmlStr = '<font style="color:' + warningColor + '" title="${warningAlerts}">'+warningCounter+'</font>/<font style="color:'+errorColor+'" title="'+criticalAlerts+'">'+criticalCounter+'</font>';
$('#alertInfo').html(htmlStr);

}

function getAlerts(id){
$.ajax({
                url: "/OperationsManager/data/alert",
                type: "POST",
                headers: {
                    "Content-Type": "application/json"
                },
                data: JSON.stringify({
"classId":null,
"objectIds":{objId:0},
"criteria":"((Severity = '1') OR (Severity = '2')) AND ((Priority = '0') OR (Priority = '2') OR (Priority = '1')) AND ((ResolutionState = '0') OR (ResolutionState = '247') OR (ResolutionState = '248') OR (ResolutionState = '249') OR (ResolutionState = '250') OR (ResolutionState = '254'))",
"displayColumns":["severity","monitoringobjectdisplayname","name","age","repeatcount","lastmodified"]
}
).replace("objId", id),
                success: function (result) {
ProcessALerts(result);
                }
            });
}

function LoadPerfData(id, counters, duration, processFunc){
$.ajax({
                url: "/OperationsManager/data/performance",
                type: "POST",
                headers: {
                    "Content-Type": "application/json",
"Accept-Language": "en"
                },
                data: JSON.stringify({
                        "id":id,
                        "performanceCounters": counters,
                        "legends":[
                            "target",
                            "path",
                            "lastvalue"
                        ],
                        "duration":duration
                    }),
                success: function (result) {
processFunc(result);
                }
            });
}

function ProcessUpTime(perfData){
var upTime = "NaN";
if (perfData){
var numSec = parseFloat(perfData.legends.rows[0].lastvalue);
upTime = Math.floor(( numSec / (24*60*60))) + "d" + new Date(numSec*1000).getHours() + "h" + new Date(numSec*1000).getMinutes() +"m";
}
$('#uptimeInfo').text(upTime);
}

function getUptime(id){
counters = [{"objectname":"System", "countername":"System Up Time","instancename":""}];
LoadPerfData(id, counters, DurationMin, ProcessUpTime);
}

function RenderTwoLineChart(divId, data1, data2, data1Title, data2Title, chartTitle){
var chart = new CanvasJS.Chart(divId, {
zoomEnabled: true,
title:{
text: chartTitle
},
axisY:{
title: data1Title,
lineColor: "#C24642",
tickColor: "#C24642",
labelFontColor: "#C24642",
titleFontColor: "#C24642"
},
axisY2: {
title: data2Title,
lineColor: "#7F6084",
tickColor: "#7F6084",
labelFontColor: "#7F6084",
titleFontColor: "#7F6084"
},
toolTip: {
shared: true
},
legend: {
cursor: "pointer",
itemclick: toggleDataSeries
},
data: [
{
type: "line",
name: data1Title,
color: "#C24642",
axisYIndex: 0,
showInLegend: true,
dataPoints: data1
},
{
type: "line",
name: data2Title,
color: "#7F6084",
axisYType: "secondary",
showInLegend: true,
dataPoints: data2
}
]
});
chart.render();

function toggleDataSeries(e) {
if (typeof (e.dataSeries.visible) === "undefined" || e.dataSeries.visible) {
e.dataSeries.visible = false;
} else {
e.dataSeries.visible = true;
}
e.chart.render();
}
}

function GetChartDataArray(datasetData){
var perfData = [];
            let dataDictionary = datasetData;
            for (var key in dataDictionary) {
                if(dataDictionary.hasOwnProperty(key)) {
var datetime = new Date(key);
datetime = convertUTCDateToLocalDate(datetime);
                    perfData.push({
y: dataDictionary[key],
x: datetime
});
}
            }
return perfData;
}

function convertUTCDateToLocalDate(date) {
            var newDate = new Date(date.getTime()+date.getTimezoneOffset()*60*1000);
            var offset = date.getTimezoneOffset() / 60;
            newDate.setMinutes(date.getMinutes() - date.getTimezoneOffset())
            return newDate; 
        }

function ProcessCPUUsage(perfData){
var data1 = GetChartDataArray(perfData.datasets[0].data);
var data2 = GetChartDataArray(perfData.datasets[1].data);
RenderTwoLineChart("cpuChart", data1, data2, "CPU Usage %", "Queue Length", "CPU Statistics");
}

function getCPUUsage(id){
counters = [
{"objectname":"Processor Information", "countername":"% Processor Time","instancename":"_Total"},
{"objectname":"System", "countername":"Processor Queue Length","instancename":""}
];
LoadPerfData(id, counters, DurationMin, ProcessCPUUsage);
}

function ProcessRAMUsage(perfData){
var data1 = GetChartDataArray(perfData.datasets[0].data);
var data2 = GetChartDataArray(perfData.datasets[1].data);
RenderTwoLineChart("ramChart", data1, data2, "RAM Usage %", "Pages/sec", "RAM Statistics");
}

function getRAMUsage(id){
counters = [
{"objectname":"Memory", "countername":"PercentMemoryUsed","instancename":""},
{"objectname":"Memory", "countername":"Pages/sec","instancename":""}
];
LoadPerfData(id, counters, DurationMin, ProcessRAMUsage);
}

function GetPerfRules(id){
var ruleDict = [];
$.ajax({
                url: "/OperationsManager/data/performanceCounters/{" + id + "}",
async: false,
                type: "GET",
                headers: {
                    "Content-Type": "application/json"
                },               
                success: function (result) {
ruleDict = result.rows;
                }
            });
return ruleDict;
}

function FindInstances(dict, objectname, countername){
return dict.filter(function( item ) {
return (item.objectname == objectname && item.countername == countername);
});
}

function RenderDiskUsagePerc(instance, divId, freeValue, usedValue){
var chart = new CanvasJS.Chart(divId, {
title:{
text: "Disk " + instance + " Usage"
},
legend:{
cursor: "pointer"
},
data: [{
type: "pie",
showInLegend: true,
toolTipContent: "{name}: <strong>{y}%</strong>",
dataPoints: [
{ y: freeValue, name: "Free", color: "#00cc66", exploded: true },
{ y: usedValue, name: "Used", color: "#ff6666" }
]
}]
});
chart.render();
}

function ProcessDiskUsagePerc(perfData){
if (perfData){
var freeSpace = parseFloat(perfData.legends.rows[0].lastvalue);
var usedSpace = 100 - freeSpace;
var divName = "disk" + perfData.legends.rows[0].performanceinstance + "Chart";
RenderDiskUsagePerc(perfData.legends.rows[0].performanceinstance, divName, freeSpace, usedSpace);
}
}

function GetDiskUsagePerc(id, instance){
counters = [{"objectname":"LogicalDisk", "countername":"% Free Space","instancename": instance}];
LoadPerfData(id, counters, DurationMin, ProcessDiskUsagePerc);
}

function ProcessDiskUsageStats(perfData){
if (perfData){
instanceName = perfData.legends.rows[0].performanceinstance;
var divName = "disk" + instanceName + "StatChart";
var data1 = GetChartDataArray(perfData.datasets[0].data);
var data2 = GetChartDataArray(perfData.datasets[1].data);
RenderTwoLineChart(divName, data1, data2, "Queue Length", "Avg sec/transfer", "Disk " + instanceName +" Statistics");
}
}

function GetDiskUsageStats(id, instance){
counters = [
{"objectname":"LogicalDisk", "countername":"Current Disk Queue Length","instancename":instance},
{"objectname":"LogicalDisk", "countername":"Avg. Disk sec/Transfer","instancename":instance}
];
LoadPerfData(id, counters, DurationMin, ProcessDiskUsageStats);
}

function ProcessLANUsageStats(perfData){
if (perfData){
instanceName = perfData.legends.rows[0].performanceinstance;
instanceID = perfData.legends.rows[0].id;
let divName = "lan" + instanceID + "Chart";
$('#trLAN').append('<div id="' + divName + '" style="height: 250px; width: 250px;"></div>');
var data1 = GetChartDataArray(perfData.datasets[0].data);
var data2 = GetChartDataArray(perfData.datasets[1].data);
RenderTwoLineChart(divName, data1, data2, "Bytes Total/sec", "Usage %", instanceName +" Statistics");
}
}

function GetLANUsageStats(id, instance){
counters = [
{"objectname":"Network Adapter", "countername":"Bytes Total/sec","instancename":instance},
{"objectname":"Network Adapter", "countername":"PercentBandwidthUsedTotal","instancename":instance}
];
LoadPerfData(id, counters, DurationMin, ProcessLANUsageStats);
}

function objChanged(){
var objSel = $('#computers');
//debugger;
GetObjectProperties(objSel[0].value, ProcessObjProperties);
getAlerts(objSel[0].value);
getUptime(objSel[0].value);
getCPUUsage(objSel[0].value);
getRAMUsage(objSel[0].value);
var perfRules = GetPerfRules(objSel[0].value);
$('#trDisk').empty();
var diskInstances = FindInstances(perfRules, "LogicalDisk", "% Free Space");
for (var i = 0; i < diskInstances.length; i++) {
let divName = "disk" + diskInstances[i].instancename + "Chart";
let divstatName = "disk" + diskInstances[i].instancename + "StatChart";
$('#trDisk').append('<div id="' + divName + '" style="height: 250px; width: 250px;"></div>');
$('#trDisk').append('<div id="' + divstatName + '" style="height: 250px; width: 250px;"></div>');
GetDiskUsagePerc(objSel[0].value, diskInstances[i].instancename);
GetDiskUsageStats(objSel[0].value, diskInstances[i].instancename);
}
$('#trLAN').empty();
var lanInstances = FindInstances(perfRules, "Network Adapter", "PercentBandwidthUsedTotal");
for(var i = 0; i < lanInstances.length; i++) {
GetLANUsageStats(objSel[0].value, lanInstances[i].instancename);
}

localStorage.setItem("lastObjSelected_c92650fd-5b51-4fb3-a6fe-d3cd845a7066", objSel[0].value);
}
    </script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/canvasjs/1.7.0/canvasjs.min.js"></script>
</head>

<body>
<div>Computer: <select id="computers" name="computers" onchange="objChanged()"></select></div>
<div style="display: inline-flex;">
<div style="width:250px; height:250px">
<table id="compInfoTable" >
<tr>
<td style="width:100px">
<img id="compIcon"/>
</td>
<td>
<div id="divAlert" style="font-family: sans-serif; text-align: center;">
<p style="font-size: x-small">Alerts:</p>
<p id="alertInfo" style="font-size: xx-large"></p>
<p style="font-size: x-small">Up Time:</p>
<p id="uptimeInfo" style="font-size: x-large"></p>
</div>
</td>
</tr>
<tr>
<td colspan="2">
<div id="compInfo"></div>
</td>
</tr>
</table>
</div>
<div id="cpuChart" style="width:250px; height:250px"></div>
<div id="ramChart" style="width:250px; height:250px"></div>
</div>
<div id="trDisk" style="display: inline-flex;"></div >
<div id="trLAN" style="display: inline-flex;"></div >
</body>

</html>