Rainbowheart - ultimele 7 pagini

  • Server de web in golang cu sesiuni si POST date in JSON

    14-Apr-2022 15:48 - 83 vizionari

    Un exemplu de server in golang apelat cu functii JavaScript descrise in JS Promises, Fetch and Arrow Functions.

    
    package main
    
    import (
    	"embed"
    	"encoding/json"
    	"fmt"
    	"html/template"
    	"net/http"
    	"time"
    
    	"github.com/braintree/manners"
    	"github.com/gorilla/mux"
    	"github.com/gorilla/sessions"
    )
    
    //go:embed static
    var static_fs embed.FS
    
    //go:embed templates
    var tpl_fs embed.FS
    var tpl, _ = template.ParseFS(tpl_fs, "templates/*.tmpl") // ignor eroarea
    
    // key must be 16, 24 or 32 bytes long (AES-128, AES-192 or AES-256)
    var key = make([]byte, 16)
    var store *sessions.CookieStore
    
    const session_cookie_name = "gowebsession"
    
    type dict map[string]interface{}
    
    func main() {
    	fmt.Println("Start app.")
    
    	r := mux.NewRouter()
    	store = sessions.NewCookieStore(key)
    
    	r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    
    		const time_format = "02/Jan/2006 15:04:05"
    		// now := time.Unix(time.Now().Unix(), 0).Format((time_format))
    		now := time.Now().Format((time_format))
    
    		// get session, update, then save
    		session, _ := store.Get(r, session_cookie_name)
    		if session.Values["cnt"] == nil {
    			session.Values["cnt"] = 0
    		}
    		session.Values["cnt"] = session.Values["cnt"].(int) + 1
    		session.Values["now"] = now
    		session.Save(r, w)
    
    		fmt.Printf("index session values = %v\n", session.Values)
    		title := "go App with Webserver"
    		data := dict{
    			"title": title,
    		}
    		tpl.ExecuteTemplate(w, "index", data)
    	})
    
    	r.HandleFunc("/x", func(w http.ResponseWriter, r *http.Request) {
    		// oprire server de web folosing modulul "manners"
    		fmt.Fprintf(w, "Server shutting down ...")
    		go func() {
    			time.Sleep(1 * time.Second)
    			fmt.Println("Server shutting down ...")
    			manners.Close()
    		}()
    	})
    
    	r.HandleFunc("/test/{oid}", func(w http.ResponseWriter, r *http.Request) {
    
    		vars := mux.Vars(r)
    		oid := vars["oid"]
    
    		fmt.Printf("/test m=%s oid=%s q=%v\n", r.Method, oid, r.URL.Query())
    
    		// post
    		decoder := json.NewDecoder(r.Body)
    		var args interface{} // generic - orice fel de obiect json
    		err := decoder.Decode(&args)
    		if err != nil {
    			fmt.Printf("\tError: %v\n", err)
    		} else {
    			fmt.Printf("\ttest POST args  = %v\n", args)
    			prettyJSON, err := json.MarshalIndent(args, "", "    ")
    			if err == nil {
    				fmt.Println(string(prettyJSON))
    			}
    
    		}
    
    		// time.Sleep(1 * time.Second) // for test timeout
    		var ret dict = dict{"ok": true, "method": r.Method, "da": false, "x": dict{"a": 1, "b": true, "c": dict{"ax": 33, "bx": 34}}}
    		w.Header().Set("Content-Type", "application/json")
    		jsonString, _ := json.Marshal(ret)
    		fmt.Fprint(w, string(jsonString))
    	})
    
    	r.PathPrefix("/static/").Handler(http.FileServer(http.FS(static_fs)))
    
    	addr := ":8080"
    	fmt.Printf("Start webserver on %s\n", addr)
    	manners.ListenAndServe(addr, r)
    	fmt.Println("End app.")
    }
    
    

    Exemplul de server de mai sus include, dupa compilare, continutul folderelor static si templates folosind modulul embed.

    Pentru executia programului este nevoie numai de fisierul binar generat (aproximativ 9.6 mega), pentru ca in interiorul executabilului este inserat (embed) continutul folderelor static si templates.

    Folderul templates contine cel putin 3 fisiere: index.tmpl, header.tmpl si footer.tmpl.

    index.tmpl

    
    {{define "index"}}
    {{template "header" .}}
    
    <h3>{{.title}}</h3>
    
    <script>
    
        (async () => {
            var ret = null
    
            ret = await getFetch('/test/100?a=1&b=222')
            if (typeof (ret) != 'object') console.log("Err", ret)
            else console.log("call 1 =", ret)
    
            ret = await postFetch('/test/200?a=333&b=444', { a: 1 })
            if (typeof (ret) != 'object') console.log("Err", ret)
            else console.log("call 2 =", ret)
    
        })()
    
    </script>
    
    {{template "footer" .}}
    {{end}}
    

    header.tmpl

    
    {{define "header"}}
    
    <html lang="en">
    <head>
       
       <meta content="IE=edge" http-equiv="X-UA-Compatible">
       <meta name="viewport" content="width=device-width, initial-scale=1">
       
       <link rel="stylesheet" type="text/css" href="/static/app.css">
       <script src="/static/app.js"></script>
    
    
    {{end}}
    

    footer.tmpl

    
    {{define "footer"}}
    </body>
    </html>
    {{end}}
    

    Folderul static contine fisiere .css si .js necesare aplicatiei livrate de serverul de web.


  • JS Promises, Fetch and Arrow Functions

    13-Apr-2022 19:53 - 89 vizionari

    Incepand cu 2013 si sigur dupa 2017 toate browserele serioase suporta: promisiuni + fetch + functii arrow.

    Desi am solutii echivalente in Svelte, care compileaza si adapteaza codul JavaScript si pentru browsere mai vechi, uneori prefer solutii js mai simple.

    Solutia postata nu este o mare descoperire, dar o notez pentru mine (sa o gasesc cand am nevoie) si pentru cine mai cauta asa ceva.

    O metoda simpla si eleganta pentru comunicarea cu serverul de web este conectare cu limitare timp de raspuns:

    
    const fetchWithTimeout = (uri, options = {}, timeout = 5000) => {
        const controller = new AbortController()
        const config = { ...options, signal: controller.signal }
        const timeoutHandler = setTimeout(() => {
            controller.abort()
        }, timeout)
        return fetch(uri, config)
            .then((response) => {
                if (!response.ok) {
                    throw new Error(`${response.status}: ${response.statusText}`)
                }
                return response
            })
            .catch((error) => {
                if (error.name === 'AbortError') {
                    throw new Error('Response timed out')
                }
                throw new Error(error.message)
            }).finally(() => clearTimeout(timeoutHandler))
    }
    
    const promiseTimeoutFetch = async (url, method = "GET", data = null) => {
        var ret = null
        try {
            var options = {
                method: method,
                headers: { Accept: 'application/json' }
            }
            if (data != null) {
                options['body'] = JSON.stringify(data)
            }
            response = await fetchWithTimeout(url, options, 1500)
            ret = await response.json()
        } catch (e) {
            ret = e.message
        }
        return ret
    }
    
    const getFetch = async (url) => { return promiseTimeoutFetch(url) }
    
    const postFetch = async (url, data) => { return promiseTimeoutFetch(url, "POST", data) }
    
    

    Trimit JSON catre server si serverul raspunde in format JSON.

    Functiile care ma intereseaza in programul final sunt getFetch si postfetch si un exemplu de utilizare este:

    
        (async () => {
            var ret = null
    
            ret = await getFetch('/test/1?a=100&b=200')
            if (typeof (ret) != 'object') console.log("Err", ret)
            else console.log("call 1 =", ret)
    
            ret = await postFetch('/test/2?a=55&b=66', { a: 1, b: 2, c: "test C" })
            if (typeof (ret) != 'object') console.log("Err", ret)
            else console.log("call 2 =", ret)
    
        })()
    
    

    Comunicatia cu serverul depinde si de AbortController, care a fost implementata in browsere incepand cu Firefox 57, Edge 16, Chrome 66, …

    Acum Firefox este la versiunea 99, Edge este la versiunea 100, iar Chrome la versiunea 102.


  • Ce gandesc animalele

    11-Apr-2022 19:27 - 80 vizionari

    Doua documentare despre comunicarea telepatica cu animalele.

    Nu am energia potrivita sa comentez, dar consider filmul emotionant si motivant (pentru carnivori).


  • Laptop HP OMEN 16

    02-Mar-2022 12:39 - 321 vizionari

    Saptamana trecuta mi-am cumparat un laptop HP cu procesor Intel i7-11800H si 32 giga de RAM si placa video nVidia RTX 3060 (memorie 6 giga).

    Laptopul a venit preinstalat si licentiat cu Windows 11, care s-a dovedit a fi o mare dezamagire.
    In Windows 11, jocul instalat (The Witcher 3) a mers perfect si din prima incercare cu detaliile de grafica setate la maxim.
    Placa video a laptopului este ieftina si buna si sunt multumit de ea, dar de Windows 11 nu.
    Degeaba interfata Windows 11 este un pic mai placuta decat Windows 10, daca lipsesc customizari importante din Windows 11.

    In Windows 11 nu pot vedea in taskbar ce programe se ruleaza, nu pot sa vad lista de ferestre ca icoane sau ca icoane combinate cu titlul ferestrelor, nu pot sa mut taskbarul sus sau stanga sau dreapta, este permanent pozitionat jos. Exista un program care restaureaza taskbarul windows 11, l-am instalat si merge ok, dar este comercial si trebuie sa-l cumpar.

    Am redimensionat partitia windows din windows la 256 giga si in restul de spatiu liber (aproximativ 700 giga) am instalat Linux, pentru ca vreau sa pastrez licenta de windows si sa joc anumite jocuri, dar si pentru ca am nevoie de un sistem de operare robust, gratis, puternic, flexibil, customizabil, etc.

    Initial am testat Linux Mint, dar am renuntat la el pentru ca este dificil de potrivit driverele de video cu monitorul extern si cu selectia Intel-nVidia.

    Apoi am testat, dar nu instalat, Linux Solus (am scris despre el), dar am renuntat la instalare pentru ca nu a detectat harddiscul SSD.

    Am renuntat temporar la Linux Mint si am instalat Ubuntu desktop, un sistem care s-a dovedit incredibil de flexibil si de customizabil: am instalat repede driverul nVvidia si am gasit preinstalat un utilitar care schimba usor intre placa video Intel (onboard oferita de procesor) si placa nVidia (placa externa), am descoperit ca placa video Intel nu are iesire HDMI si ca merge numai cu afisajul laptopului si numai cu nVidia pot avea monitor extern pe HDMI simultan cu afisare pe ecranul laptopului, probabil si pe conexiunea Thunderbolt.

    Probabil daca insist (acum stiu ce vreau si cum sa le combin) merge ok si Linux Mint, dar raman cu Ubuntu.

    In Ubuntu am instalat Mate Desktop si la login am selectat Mate si interfata este exact cum imi place si cum am folosit-o si in Linux Solus.

    Urmatorul test a fost sa vad cum merge Python cu Inteligenta Artificiala pe placa video nVidia.

    Deja stiam la ce sa ma astept pentru ca am facut cateva teste gratis (nu am abuzat) in serverele Google, dar am vrut sa testez modele AI pe calculator cu 32 Giga RAM si placa nVidia.

    Ca sa pot accesa din Python puterea de calcul a placii grafice, am gasit un articol si am instalat pachetele necesare (pentru sisteme tip Debian cum e Ubuntu si Mint, dar nu si Solus) in doi pasi:

    LAMBDA_REPO=$(mktemp)
    wget -O${LAMBDA_REPO} https://lambdalabs.com/static/misc/lambda-stack-repo.deb
    sudo dpkg -i ${LAMBDA_REPO} && rm -f ${LAMBDA_REPO} && \
    sudo apt-get update && sudo apt-get install -y lambda-stack-cuda

    urmat de restart Linux, apoi aproape acelasi lucru:

    LAMBDA_REPO=$(mktemp) && \
    wget -O${LAMBDA_REPO} https://lambdalabs.com/static/misc/lambda-stack-repo.deb && \
    sudo dpkg -i ${LAMBDA_REPO} && rm -f ${LAMBDA_REPO} && \
    sudo apt-get update && \
    sudo apt-get --yes upgrade && \
    sudo apt-get install --yes --no-install-recommends lambda-server && \
    sudo apt-get install --yes --no-install-recommends nvidia-headless-455 && \
    sudo apt-get install --yes --no-install-recommends lambda-stack-cuda

    si iar restart.

    Un alt articol documenteaza cum sa instalezi pytorch pentru CUDA 11.3:

    pip3 install torch==1.10.2+cu113 torchvision==0.11.3+cu113 torchaudio==0.10.2+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html
    

    Am instalat pachetele necesare pentru Python (pynvml, pytorch-lightning, torchvision, …) si am reusit sa rulez exemple de programe AI.

    Sunt un pic dezamagit ca in primele ore de teste programul se termina afisand ca placa video nu are suficienta memorie, adica 6 Giga nu sunt de ajuns.

    In imaginea urmatoare, programul python3 foloseste 5.4 Giga din placa nVidia si o parte (146 Mega) folosete Linux pentru afisarea grafica:

    nvidia smi

    Dar am redus imaginea generata la 250x250 puncte si am avut success.

    Calcul 200 iteratii folosind GPU intr-un minut si 7 secunde:

    VQGAN script

    Pentru o imagine de 250x250 puncte si folosind un CPU i7-1165G7 (4 nuclee) 200 de iteratii s-au facut in 13-14 minute.

    Pentru o imagine de 250x250 puncte si folosind un CPU i7-11800H (8 nuclee) 200 de iteratii s-au facut in 8 minute.

    Pentru o imagine de 600x600 puncte si folosind numai CPU (pentru ca nu merge pe placa nVidia ca nu are suficient RAM) cele 200 de iteratii pe laptopul meu se termina in 29 de minute sau mai mult, ca nu am avut rabdare si pe celalalt laptop in o ora.

    Se pare ca laptopul HP OMEN este bine ventilat si procesoarele nu depasesc 80 de grade cand am testat prime95 cateva minute, dar dupa 2-3 ore de jocuri temperatura ajunge la maxim 90 de grade pe setare medie  (nu maxim) si la 100 de grade pe setari ultra, dar acestea sunt valori maxime atinse in cateva ore si media este de 70-80 de grade.

    Acum, cand scriu la laptop si am si o masina virtuala pornita, procesoarele merg la 34-38 de grade.


  • O interesanta introducere in neurostiinta

    19-Jan-2022 10:53 - 196 vizionari

    Un film aparent banal despre creier si neuroni, dar care a devenit interesant dupa 27 de minute.

    Pe la momentul 27:55 este prezentat reflexul rotulian (reflex neconditionat).

    La 31:53 este explicat cum o combinatie de neuroni pot sa detecteze marginile obiectelor intr-o imagine intunecata. Exemplu practic: imbunatatire vedere nocturna pentru evitarea pericolelor. La 33:36 semnalul este calculat fara detectia marginilor (banal) si la 34:55 semnalul video este trecut prin neuroni care inhiba neuronii din apropiere (lateral inhibition) si asa functioneaza detectarea marginilor (edge detection).

    Descoperirea in sistemul vizual a neuronilor care inhiba neuronii din apropiere (lateral inhibition)  explica anumite iluzii optice.

    Adesea am probleme de focalizare si mi se pare ca vad dublu sau in ceata, uneori este o pata de murdarie pe monitor, alteori este efectul varstei, dar acum sunt bucuros ca am integrat (de catre natura) in creier un mecanism de filtrare si imbunatatire a imaginilor.

    Vedere cu filtrare si imbunatatire = ceea ce vezi nu este identic cu sursa = nu este realitatea = este o iluzie = este o parere generata de creier pe baza experientei (educatiei) si a ratiunii = o perceptie subiectiva.

    Acum am inteles cum se pot implementa in domeniul Inteligentei Artificiale algoritmi de filtrare si imbunatatire a imaginii (ex: imbunatatirea unei imagini xeroxate prost).

    La 36:38 – iluzia “Mach bands”.

    La 39:50 – exista neuroni care genereaza semnal periodic fara sa primeasca semnal de la cineva anume => utilizati pentru activitati ritmice, cum ar fi respiratia si cicluri de 24 de ore (ritmul circadian) si la 40:01 este prezentat mecanismul de functionare, folosind ioni de Calciu.

    Acum am inteles de in alt film se specifica de ce este important sa te trezesti de dimineata si sa privesti rasaritul soarelui si apusul soarelui. Rasararitul si apusul soarelui activeaza anumiti neuroni in creier (si inima are aproximativ 40,000 de neuroni si sistemul digestiv are neuroni pe toata lungimea lui) si sincronizeaza (reseteaza) ritmul circadian. Adica din intelepciunea populara: Cine se scoala de dimineata, departe ajunge.

    42:15 – gena per duce la sintetizarea proteinei PER, iar proteina PER inhiba gena per si opreste producerea de proteine PER. In timp proteina PER se degradeaza, se descompune si efectul de inhibare se anuleaza si gena per produce iar proteine PER  = ritmul circadian. Asa functioneaza si operonul lactozei si operonul triptofanului. Sistemele de reglare automata a proceselor din industrie au fost inspirate de biologie.

    42:55 – deplasarea patrupeda, aici am inteles de ce in anumite filme despre Inteligenta Artificiala s-au prezentat mari descoperiri in AI pretinzand ca AI a gasit metode mai simple de locomotie, inimaginabile de catre om, dar care functioneaza.

    Curand artificialul (electromecanicul) va depasi naturalul (biologicul), pentru ca, desi naturalul a evoluat in sute de milioane de ani, artifcialul a obtinut rezultate remarcabile in cateva zeci de ani.


  • Neuronii oglinda si empatia mamiferelor

    13-Oct-2021 17:00 - 301 vizionari

    Neuronii oglinda au fost descoperiti intre anii 1980 si 1990 de niste cercetatori care faceau experimente pe macaci: Maimuta vede – maimuta face.

    Cercetatorii au observat ca in creierul macacilor se activa aceeasi zona de neuroni in ambele situatii: cand maimuta observa pe cineva ca apuca cu mana un obiect si cand maimuta studiata apuca acelasi obiect.

    In pagina wikipedia este o imagine in care un macac nou nascut imita un om care il tine in brate, scotand limba.

    Se pare ca toate mamiferele (nu numai macacii sau omul) au abilitatea de a intelege imaginea privita, cercetatorii inca din anii 1950 au observat ca mamiferele ajuta spontan membrii din aceeasi specie cand au probleme, cand cercetatorii au aplicat socuri electrice unui soarece, ceilalti soareci care au urmarit experimentul au reactionat, dovedind ca au inteles ce se intampla (sursa: wikipedia).

    Wikipedia: Neuronii oglinda sunt o clasa de neuroni care au activitate cand individul executa un act motor specific sau cand observa acelasi act sau ceva similar efectuat de alt individ.

    Cu ce ne ajuta aceasta descoperire?

    Am vazut la TV odata un experiment (nu am link) in care participantii care s-au antrenat fizic timp de o vreme au depasit in performanta cu 1-2% pe grupul care doar s-a antrenat in minte (isi imaginau ca alearga, isi imagineau ca arunca mingea la cos, etc) si doar au vizionat filme cu activitati fizice. Sunt multe trucuri pe care le pot folosi sportivii de performanta, amintesc doar un link, trebuie sa meditezi si sa iti antrenezi mintea cum iti antrenezi corpul.

    Prin relaxare si meditatie, folosind intentia in mod constient (prezenta aici si acum), se poate amplifica efectul procesului la care te gandesti de cateva ori, de 5 ori spune Dr Adrian Cranta.


  • Invata sa te relaxezi

    12-Oct-2021 16:36 - 399 vizionari

    Un film extraordinar de util oferit de Domnul Adrian Cranta la 6 TV:

    Cateva informatii prezentate in film:

    - credinta = intentie = opusul indoielii

    - cel mai mare ajutor al omului in viata aceasta este stresul, stresul este mecanismul de adaptare aici si acum a existentei noastre, stresul nu trebuie confundat cu distresul

    - prin relaxare, volitiv isi maresti constienta si iti iei in primire functii care merg automat (vegetativul se ocupa de foarte multe forme reflexe de functionare) si devii constient de modul in care poti sa iti optimizezi bataile inimii, respiratia, circulatia, sistemul endocrin, partea cognitiva (vointa, imaginatia, intuitia, intentia)

    - cand un om se relaxeaza patrunde intr-o stare profunda pe care in somn nu o poate atinge

    - orice lucru pe care il faci constient are un efect amplificat de 5 ori

    - a face constient un lucru inseamna a fi prezent acolo

    - cea mai dificila concentrare este sa incepi munca de relaxare cu propria persoana

    - poti sa convertesti stresul si nelinistea in vitalitate

    - un incepator se relaxeaza pentru a medita

    - un avansat mediteaza pentru a se relaxa


Ultimele pagini: RSS

Alte adrese de Internet

Categorii

Istoric


Atentie: Continutul acestui server reprezinta ideile mele si acestea pot fi gresite.