Rainbowheart - ultimele 7 pagini

  • Mecanismele de siguranta ale inimii

    01-Jun-2020 18:21 - 11 vizionari

    Din intamplare am dat peste un film Youtube despre cum sa citesti EKG.

    Spre surprinderea mea, am descoperit ca inima are cinci mecanisme de siguranta privind generarea ritmului cardiac: sinoatrial (sistemul principal), atrioventricular si inca alte trei.

    Daca semnalul sinoatrial (60 - 100 batai pe minut) este prea slab sau propagarea lui catre nodul atrioventricular este oprita de ceva, nodul atrioventricular preia comanda si genereaza el ritmul inimii (40 – 60 batai pe minut), daca esueaza si nodul atrioventricular, preia stafeta urmatorul mecanism (Bundle of His tot la 40 – 60 BPM), apoi, in caz de esec, celelalte doua mecanisme merg la 20 - 40 BPM.

    Consider interesant mecanismul din punct de vedere tehnic, pentru ca un mecanism asemanator se foloseste la majoritatea microprocesoarelor Microchip si probabil si la altele dar nu stiu eu: procesorul foloseste un oscilator extern, dar poate functiona si din oscilatorul intern si, daca este configurat sa le foloseasca pe ambele, oscilatorul extern este prioritar.

    Conform Wikipedia, nodul sinoatrial a fost descoperit in 1907 la cartita si asta inseamna ca mecanismul de siguranta al inimii nu este specific omului.

    Este interesant cum Evolutia, Creatorul sau ambii au creat acest mecanism.

    Inima mai are un sistem de siguranta: un bypas natural facut din vase de sange colaterale pentru situatia in care arterele sunt infundate.


  • Modul LiveView pentru serverul meu de aplicatii web

    20-May-2020 22:51 - 39 vizionari

    O incercare de apropiere de tehnologia Phoenix.LiveView folosind Python si JavaScript.

    Solutia este un modul (extensie de server) pentru serverul meu de aplicatii web, AppServer, si se numeste livedemo.

    Acum implementeaza 4 functii executate in server si accesibile din JavaScript din browserul de web: pub, call, init si get:

    
      // ws function to call server
      function wsSendVars(ob) {
        ws.send(JSON.stringify({ type: "pub", data: ob }));
      }
      function wsCall(name, args) {
        ws.send(JSON.stringify({ type: "call", data: name, args: args }));
      }
      function wsInit(name, value) {
        ws.send(JSON.stringify({ type: "init", data: name, value: value }));
      }
      function wsGet(name) {
        ws.send(JSON.stringify({ type: "get", data: name }));
      }
    
    

    Se pot executa comenzi (call) in server si rezultatul se poate trimite la toti clientii conectati (pub).

    Imediat dupa incarcarea paginii de web variabilele folosite in popularea paginii pot fi initializate (init) daca nu au o valoare de pornire, apoi pot fi aduse in memoria browserului si afisate in diferite locuri in pagina web (get).

    Websocket Live Demo

    Demonstratia consta in modificarea unui contor si implementarea unui chat.

    Tagurile folosite in html sunt << @variabila >>, << ?variabila valoare_intiala >> si << !nume_functie un_singur_argument >>.

    In urma preprocesarii, tagurile definite intre << si >> sunt izolate, transformate si inserate in codul html ca taguri <span></span> cu id unic si apeluri JavaScript.

    Sunt ceva probleme cu sesiunea http (Beaker Cache and Session Library) pe partea de websocket, dar cu putina atentie, securitatea nu este compromisa.

    Pe partea de server implementarea celor 4 functii:

    
    while True:
        data = wsclient.receive()
        if data is None:
            # client disconnected
            break
    
        # expect json data to be a python dict
        msg = json.loads(data)
        msg_type = msg.get('type')
        data = msg.get('data')
    
        if msg_type == "get":
            self.broadcast({data: self.vars.get(data)})
    
        if msg_type == "init":
            value = msg.get('value')
            if not self.vars.get(data):
                with self.lock:
                    self.vars[data] = value
    
        if msg_type == "pub":
            with self.lock:
                for k, v in data.items():
                    self.vars[k] = v
            self.broadcast(data)
    
        if msg_type == "call":
            args = msg.get("args")
            func = self.funcs.get(wsclient, {}).get(data)
            if func:
                func(args)
    
    # client disconnected
    with self.lock:
        self.clients.remove(wsclient)
        try:
            del self.funcs[wsclient]
        except:
            pass
    

  • Demonstratie LiveView cu Python

    18-May-2020 18:00 - 46 vizionari

    Dupa ce am vazut demonstratiile Phoenix.LiveView si am inteles ca actualizeaza pagina de web in timp real prin websocket, in cateva ore am imaginat o solutie cu Python.

    Este vorba de o implementare naiva care actualizeaza cinci variabile JavaScript: cnt, operation, a, b si messages.

    Codul este pentru serverul meu de aplicatii web, scris in Python si gasit pe github – AppServer, si consta in doua fisiere:

    __init__.py – salvat in radacina modulului (extensiei) pentru AppServer:

    
    import bottle
    import threading
    from bottle.ext.websocket import websocket
    
    from appmodule import AppModule
    
    app = AppModule()
    
    def update_app(module_name, server_config):
        app.update(module_name, server_config)
    
    clients = set()
    lock = threading.Lock()
    
    @app.route('/')
    @app.auth('access module')
    @app.view('index.tpl')
    def _():
        """
            Default view
        """
        title = 'Websocket Live Demo'
        return dict(title=title)
    
    @app.get('/live', apply=[websocket])
    def _(ws):
        """
            The Live Socket
        """
        with lock:
            clients.add(ws)
        while True:
            msg = ws.receive()
            if msg is None:
                break
            print('clienti:{}, msg:{}'.format(len(clients), msg))
            for c in clients:
                c.send(msg)
        with lock:
            clients.remove(ws)
    
    

    index.tpl – salvat in folderul view (folderul cu sabloane):

    
    % include('header.tpl')
    
    <h1>{{title}}</h1>
    
    <button id="inc">+</button>
    <button id="dec">-</button>
    <span id="cnt">0</span>
    <br>
    <span id="operation"></span> -- <span id="a"></span> -- <span id="b"></span>
    <br>
    <form id="chatform">
      Name:
        <input id="name" type="text" value="name">
      Message:
        <input id="message" type="text" value="message" />
        <input type="submit" value="Send" />
    </form>
    <div id="messages"></div>
    
    <script>
      var cnt = 0;
    
      function getWebsocketUrl(url){
        pathArray = location.href.split( "/" );
        host = pathArray[2];
        return `ws://${host}/{{module_name}}/${url}`;
      }
    
      $(document).ready(function() {
    
        if (!window.WebSocket) {
          if (window.MozWebSocket) {
            window.WebSocket = window.MozWebSocket;
          } else {
            $('#messages').append("<li>Your browser doesn't support WebSockets.</li>");
          }
        }
    
        ws = new WebSocket(getWebsocketUrl('live'));
        ws.onopen = function(evt) {
          $('#messages').append('<li>Connected to chat.</li>');
        }
    
        ws.onmessage = function(evt) {
          ret = JSON.parse(evt.data);
          for (var prop in ret) {
            if(prop == 'msg')
              $('#messages').append('<li>' + ret[prop] + '</li>');
            else{
              $('#'+prop).text(ret[prop]);
              eval(`${prop} = ${ret[prop]}`);
              }
          };
        }
    
        $('#chatform').submit(function() {
          var name = $('#name').val();
          var message = $('#message').val();
          var msg = `${name}: ${message}`;
          ws.send(JSON.stringify({msg:msg}));
          $('#message').val('').focus();
          return false;
        });
      
        $("#inc").off().click(function(){
          cnt = cnt + 1;
          ws.send(JSON.stringify({cnt:cnt, operation:'inc', a:100, b:200}));
        });
    
        $("#dec").off().click(function(){
          cnt = cnt - 1;
          ws.send(JSON.stringify({cnt:cnt, operation:'dec', a:500, b:600}));
        });
    
      });
    </script>
    
    % include('footer.tpl')
    
    

    Comunicatia websocket in Mozilla Firefox:

    livesocket

    Implementarea este atat de simpla incat imi este rusine sa o public pe github, dar cat de curand voi imagina o aplicatie de chat mai complexa, care sa foloseasca un protocol compact de comunicare cu serverul prin websocket: variabilele sa aiba un id numeric si comunicatia sa fie de tip command:variabile_id:variable_value, …

    Serverul de web necesita GeventWebSocketServer (pip install gevent-websocket) si extensia bottle-websocket (pip install bottle-websocket).


  • Elixir si Phoenix LiveView

    18-May-2020 10:31 - 47 vizionari

    Am vazut un film Youtube (postat pe 22 aprilie 2020) despre Phoenix Web Framework si tehnologia Phoenix.LiveView:

    O scurta introducere mai veche, din 5 noiembrie 2019, clarifica ce face Phoenix LiveView:

    Impresionat de aceste doua filme, am inceput sa studiez Elixir si sa construiesc aplicatii Phoenix.

    Am reusit sa parcurg (nu le-am terminat) cateva tutoriale (incrementarea unui contorPhoenix Framework Tutorial Part 1 si autentificare cu pow) si acum ma lupt sa inteleg limbajul Elixir.

    Limbajul este total diferit si promite multe: sintaxa simpla, implementare robusta (se compileaza si se executa in masina virtuala Erlang), …

    Ce m-a impresionat pana acum in Elixir este usurinta cu care se pot inlantui anumite tipuri de comenz (folosind Pipe Operator):

    
    def test1 do
        IO.puts("apel test1")
    
        {:ok, 100}
        |> test2(:aaa1)
        |> test2(:aaa2)
        |> test2(:aaa3)
    
        {:da, 200}
        |> test2(60)
        |> test2(61)
        |> test2(62)
      end
    
      def test2({cod1, cod2}, msg) do
        IO.puts("    test2 #{cod1}:#{cod2}--#{msg}")
        {cod1, cod2}
      end
    
    

    In exemplul de mai sus functia test1 apeleaza de cateva ori functia test2 intr-un mod foarte ciudat, dar codul este foarte clar in ceea ce face.

    Evident, mai am multe de invatat.


  • Minunata lume JS, ES, TS, Dart, Angular si React

    16-May-2020 14:48 - 52 vizionari

    JS = JavaScript, ES = EcmaScript, JS este sursa standardului ECMA-262, TS = TypeScript, iar Angular si React se bazeaza pe TS.

    Impresionat de Dart, am inceput sa explorez AngularDart fara sa banuiesc cat de vast este domeniul.

    Dar, curios sa inteleg ce este Angular, am inceput sa studiez Agular1 (numit si AngularJS si creat in 2009), dar am renuntat si am facut ceva teste in Angular2 (acum se numeste Angular) - mai multe detalii in istoria angular dupa Michał Dziwoki.

    Pentru prima data in peste 25 de experienta in programare am inteles ce inseamna abordarea profesionista in crearea unei aplicatii software si consider ca trebuie sa fi nebun sa faci asa ceva:

    • 1

      Creezi un proiect care face nimic, dar este plin de foldere si fisiere cu declaratii despre implementarea proiectului, de ce module depinde si cum sa fie testat. Operatia se executa cu un utilitar dedicat:

      In Angular:
      
      npm install -g @angular/cli
      ng new proiect-aplicatie-in-angular
      
      
      

      In React:
      
      npx create-react-app proiect-aplicatie-in-react --use-npm
      
      

      In AngularDart:
      
      pub global activate webdev
      pub global activate stagehand
      mkdir proiect-aplicatie-in-angular-dart
      cd proiect-aplicatie-in-angular-dart
      stagehand web-angular
      pub get
      
      
    • 2

      Aduci pachetele necesare aplicatiei tocmai create si pornesti serverul de web local pentru dezvoltarea aplicatiei:

      In Angular:
      
      ng serve –-open
      rem sau
      npm run start
      

      In React:
      
      npm run start
      
      

      In AngularDart:
      
      webdev serve –v web:8080
      
      
    • 3

      Cand aplicatia este aproape terminata, construiesti pachetul de instalare a aplicatiei, care reprezinta varianta compilata a aplicatiei:
      In Angular si React:
      
      npm run build
      
      

      In AngularDart:
      
      webdev build
      
      

    Toate aceste operatii (actualizare pachete, compilare pachete, compilare/recompilare proiect) se vor executa in 15-45 minute (nu exagerez) pentru fiecare aplicatie nou creata in stadiul 1 si partial in 2 si 3 si vor umple directorul proiectului cu sute de mega de date (402 mb pentru Angular, 157 mb pentru React si 107 mb pentru AngularDart), dar aplicatia compilata va ocupa cel putin 14 mb pentru Angular, 510 kb pentru React si 285 kb pentru AngularDart.

    Aplicatia finala (compilata) scrisa in AngularDart are numai 4 fisiere: favicon.png, index.html, main.dart.js si styles.css, dar, probabil la aplicatiile mai vechi, ca depinde si de continutul folderului packages (din folderul build), care are 20 mb.

    Sunt multe avantaje si dezavantaje Angular vs React, se pare ca React este mai popular, dar mie imi place AngularDart si Dart, pentru ca asta invat acum.

    Mai am multe de invatat, mai ales ca am gasit altceva mai tare decat JS si Angular: Phoenix Web Framework si impresionant este filmul lor demonstrativ si filmul de introducere.

    (Cred ca trebuie sa reiau dezvoltarea pe Erlang si sa invat Elixir.)

    18 mai 2020: am gasit un film care confirma nebunia node.js.

    Angular si React functioneaza in node.js, iar AngularDart imprumuta mult din node.js.

    Ryan Dahl este creatorul node.js si prezinta foarte clar neajunsurile sistemului:

    In final este anuntat un nou sistem care probabil va inlocui node.js: Deno.

    Deno este anagrama de la node.


  • Calcul Pi cu nodejs si Dart

    12-May-2020 17:57 - 63 vizionari

    O continuare la Calcul Pi in c, go, JavaScript, Ducktape si Lua.

    Am inceput sa invat Dart si imi place, deja am testat cateva solutii in Flutter (acum ma joc cu Flutter) folosind limbajul Dart.

    Dart

    Curios cat de rapid este Dart, am rulat un mic test:

    calcul_pi_dart

    Aproximativ 7 secunde pentru 300 de milioane de iteratii.

    Scriptul dart:

    
    double calcul_pi(double N){
       print('N are ${N/1e6} milioane');
       double pi = 2;
       var t1 = DateTime.now().millisecondsSinceEpoch;
       var sec = 0;
       for(int i = 1; i < N; i++){
          pi = pi * 2*i * 2*i / (2*i-1) /(2*i+1);
       }
       var t2 = DateTime.now().millisecondsSinceEpoch;
       var durata = t2-t1;
       print('pi=$pi');
       print('durata [ms]: ${durata}');
       return pi;
    }
    
    
    void main(){
       calcul_pi(3e8);
    }
    
    

    Node.js

    Dar JavaScript rulat sub Node.js este un pic mai rapid:

    calcul_pi_node_js

    Scriptul rulat sub Node.js cu modulul express (server de web):

    
    const express = require('express')
    const app = express()
    const port = 80
    
    app.get('/', function (req, res){
    	console.log('index', req)
    	return res.send('<html>Hello World! - <a href="/pi">pi</a>')
    })
    
    app.get('/pi', function (req, res){
    	var pi = calcul_pi(3e8)
    	return res.send(`Pi=${pi}`)
    })
    
    app.listen(port, () => console.log(`Calcul pi app listening at http://localhost:${port}`))
    
    function calcul_pi(N){
       console.log('N are', N/1e6, 'milioane');
       var pi = 2;
       t1 = new Date().getTime();
       var sec = 0;
       for(i = 1; i < N; i++){
          pi = pi * 2*i * 2*i / (2*i-1) /(2*i+1);
       }
       t2 = new Date().getTime();
       console.log('     pi=',pi);
       console.log('Math.PI=',Math.PI);
       console.log('durata [ms]:', (t2-t1));
       return pi;
    }
    
    

    Aproape 5 secunde pentru 300 de milioane de iteratii.


  • Flutter este noua mea jucarie

    04-May-2020 18:41 - 106 vizionari

    Plictisit ca aproape toata ziua m-am chinuit sa integrez gRPC in Java, ca o continuare la gRPC in py si go, am cedat nervos si astazi am creat prima mea aplicatie in Flutter si mi-a luat 2-3 ore, mai mult a durat configurarea IDE, pentru ca documentatia din Internet este un pic in urma cu ritmul alert de dezvoltare al tehnologiilor.

    Urmarind cateva filme pe Youtube despre Golang, am ramas surprins de o remarca acida: “Echipa de programatori pentru Google Fuchsia au ales limbajul Dart pentru dezvoltare, considerand ca Golang este nepotrivit (Fuchsia Programming Language Policy)”, apoi a fost facuta o referire la Flutter.

    Ciudata afirmatia prezentatorului, pentru ca Google Fuchsia este un nou sistem de operare dezvoltat de Google, iar Golang este un limbaj dedicat pentru aplicatii de sistem (procese care ruleaza in fundal) si este mai portabil decat C sau C++.

    Cautand ceva filme despre Flutter am intalnit numai cuvinte de lauda din partea artistilor care recunosteau ca nu sunt programatori, dar ca in scurt timp au reusit sa obtina aplicatii functionale.

    Cred ca principalul avantaj al lui Flutter este posibilitatea sa vezi schimbarea in aplicatia dezvoltata in mai putin de o secunda. Pana de ceva timp apreciam asta la Python, dar Golang se compileaza in cateva secunde si Flutter este instant. Cand raspunsul obtinut in procesul de dezvoltare este rapid, inveti repede, dezvolti repede, am si uitat sa mai fac teste, oare cum se fac testele unei aplicatii dezvoltata in Flutter?

    Se pare ca Google Fuchsia va inlocui sistemul Android si, indiferent de ce va fi in viitor, decat sa astept zeci de secunde pana se actualizeaza aplicatia scrisa in Java sau Kotlin cu ajutorul Android Studio, mai bine invat Dart si Flutter.

    Flutter combinat cu Dart, cand este vorba de construirea unei aplicatii de la zero, este atat de rapid, incat in 3 zile un incepator in Dart (dar cu 20 de ani de experienta de programare in alte sisteme) poate obtine o aplicatie functionala care ar fi luat cateva saptamani in alte limbaje. Tot acelasi autor, divan, spune ca a patit acelasi lucru cu 5 ani in urma, cand a descoperit limbajul go.

    Dart este incercarea nereusita a lui Google de inlocuire JavaScript.

    Flutter cu Dart acopera toata gama de aplicatii desktop si mobile, eliminand definitiv (cuiul final in cosciug) Java (Java nu e bun pe servere ca necesita mult RAM, nu e bun pentru Android ca Flutter e mai productiv) si, probabil, si Python.



Ultimele pagini: RSS

Alte adrese de Internet

Categorii

Istoric


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