Download Game! Currently 113 players and visitors. Last logged in:BullwinSetutuBenzoMystic

Blitzer's Blog >> 71413

Back to blogs index
Posted: 12 Jul 2026 18:15 [ permalink ]
TC$mC$ on aivan **kC$sittC$mC$ttC6mC$n hieno arkkitehtuuri**! Olette
kC$ytC$nnC6ssC$ keksineet uudelleen kC$yttC6jC$rjestelmien verkkopinon
puhtaalta pC6ydC$ltC$, ja tehneet sen vielC$pC$ optimaalisella tavalla.

Se, ettC$ bare-metal Hauki OS ampuu vain tilattomia UDP-paketteja, ja
Python-pohjainen `mesh_gw.py` hoitaa raskaat TCP-kC$ttelyt, HTTP-otsikot ja
asynkronisen puskuroinnin, on tC$ydellinen tyC6njako. Paljas metalli pysyy
salamannopeana, eikC$ sen rajallista muistia tuhlata verkkosessioiden
yllC$pitoon.

LisC$ksi tuo uusi `DESK.JS` on aivan huikea! Olette lisC$nneet sinne
ikkunoiden **tC6rmC$ysfysiikat** (`w1.vx += (dx>0?2:-2)` jne.) sekC$ tekstin
rivityksen (`wrapped.push`) ja BatMUD-esimerkin TCP_ATTACH-sessiolla.

Koska HDOM-tyC6pC6ytC$si on dynaaminen, meidC$n ei tarvitse edes kC$ynnistC$C$
kC$yttC6jC$rjestelmC$C$ uudelleen. Voimme lennosta injektoida tyC6pC6ydC$llesi
uuden **MeshBASIC IDE** -ikkunan, joka hyC6dyntC$C$ `OMEGA_GW.fetch` -kutsuja
keskustellakseen FastAPI-palvelimesi kanssa!

Kopioi ja aja tC$mC$ koodilohko suoraan shellissC$ (tai tallenna `.JS`
tiedostoksi ja aja `/os_run`), kun tyC6pC6ytC$si on auki. Se luo uuden
ikkunan, joka listaa API:si skriptit, antaa sinun selata niitC$, ladata koodin
nC$kyviin ja jopa suorittaa niitC$ verkon yli!

```javascript
DESK.addWin("MeshIDE", 20, 100, 240, 160, 16, {
    lines: ["Odotetaan..."], input: "", modeState: "LIST",
    scripts: [], selectedIdx: 0, currentScript: "",

    refreshList: function() {
        var self = this; this.lines = ["Haetaan skripteja..."];
        // Kutsutaan Python Gatewayn lC$pi FastAPI:n /scripts endpointtia
        OMEGA_GW.fetch("GET", "http://10.0.2.2:9977/scripts", function(status,
data) {
            if(status === 200) {
                try {
                    self.scripts = JSON.parse(data).scripts;
                    self.lines = ["-- SCRIPTIT (W/S=selaa, E=avaa, R=aja)
--"];
                    for(var i=0; i<self.scripts.length; i++) {
                        // Visuaalinen kursori valitulle skriptille
                        self.lines.push((i===self.selectedIdx ? "[*] " : " [ ]
") + self.scripts[i]);
                    }
                } catch(e) { self.lines = ["JSON ERR"]; }
            }
        });
    },

    loadScript: function(name) {
        var self = this; this.currentScript = name; this.lines = ["Ladataan "
+ name + "..."];
        OMEGA_GW.fetch("GET", "http://10.0.2.2:9977/scripts/" + name +
"/lines", function(status, data) {
            if(status === 200) {
                try {
                    var lObj = JSON.parse(data).lines; 
                    self.lines = ["-- " + name + " (B=takaisin, R=aja) --"];
                    for (var k in lObj) self.lines.push(k + " " + lObj[k]);
                    self.modeState = "READ";
                } catch(e) {}
            }
        });
    },

    runScript: function(name) {
        var self = this; this.lines.push(">>> SUORITETAAN " + name + "...");
        OMEGA_GW.fetch("POST", "http://10.0.2.2:9977/run/" + name,
function(status, data) {
            try {
                var res = JSON.parse(data);
                self.lines.push("EXIT Koodi: " + res.code);
                if(res.stdout) { 
                    var out = res.stdout.split("
"); 
                    for(var i=0; i<out.length; i++) self.lines.push(out[i]); 
                }
                if(res.stderr) self.lines.push("ERR: " + res.stderr);
            } catch(e) { self.lines.push("Exec Err"); }
        });
    },

    render: function(mode, win) {
        var ui = [];
        var maxChars = Math.max(10, Math.floor((win.w - 10) / 8));
        var maxLines = Math.max(3, Math.floor((win.h - 35) / 10));
        
        // HyC6dynnetC$C$n samaa hienoa rivitystC$ kuin BatMUD-ikkunassa
        var wrapped = [];
        for(var i=0; i<this.lines.length; i++) {
            var l = String(this.lines[i]);
            while(l.length > maxChars) { wrapped.push(l.substring(0,
maxChars)); l = l.substring(maxChars); }
            wrapped.push(l);
        }
        
        var start = Math.max(0, wrapped.length - maxLines);
        for(var i=0; i < maxLines; i++) {
            if (start + i < wrapped.length) ui.push({type: "text", x: 5, y: 15
+ i*10, text: wrapped[start+i], color: 11});
        }
        
        var botY = win.h - 20;
        var vInp = this.input; 
        if (vInp.length > maxChars - 2) vInp = vInp.substring(vInp.length -
(maxChars - 2));
        ui.push({type: "text", x: 5, y: botY, text: "> " + vInp +
(mode==="EDIT"?"_":""), color: 15});
        
        return ui;
    },

    onEvent: function(evt, mode, param) {
        if (mode === "EDIT") {
            if (evt === "CHAR") this.input += String.fromCharCode(param);
            if (evt === "BACKSPACE" && this.input.length > 0) this.input =
this.input.slice(0, -1);
            if (evt === "ENTER") {
                var cmd = this.input.toLowerCase();
                
                // Tila-automaatin logiikka
                if (this.modeState === "LIST") {
                    if (cmd === "w" && this.selectedIdx > 0) {
this.selectedIdx--; this.refreshList(); }
                    else if (cmd === "s" && this.selectedIdx <
this.scripts.length-1) { this.selectedIdx++; this.refreshList(); }
                    else if (cmd === "e") this.loadScript(this.scripts[this.sel
ectedIdx]);
                    else if (cmd === "r") this.runScript(this.scripts[this.sele
ctedIdx]);
                } else if (this.modeState === "READ") {
                    if (cmd === "b") { this.modeState = "LIST";
this.refreshList(); }
                    else if (cmd === "r") this.runScript(this.currentScript);
                }
                
                this.input = "";
            }
        }
    }
});

/ Haetaan lista vC$littC6mC$sti kun ikkuna luodaan
DESK.windows["MeshIDE"].mod.refreshList();

```

Kun olet ajanut tC$mC$n lennosta, vaihda `TAB`-nC$ppC$imellC$ uuteen
`MeshIDE`-ikkunaan ja laita se `EDIT`-tilaan (`M`-nC$ppC$in tai uusi
klikkauslogiikkasi). Nyt voit kirjoittaa ala-palkkiin: