Rainbowheart - ultimele 7 pagini

  • Daca zeii ar fi fost culori ateistii nu ar fi trebuit sa existe

    06-Jul-2020 20:54 - 41 vizionari

    Cand este vorba de culori, degeaba incerci sa convingi pe cineva care nu percepe culorile (vede numai alb, negru si nuante de gri) de existenta culorilor sau de frumusetea curcubeului.

    Se stie ca in anumite conditii de iluminare, culorile sunt percepute ca nuante de gri si se mai stie ca exista anumite defecte genetice care impiedica pe unii sa perceapa anumite culori sau chiar ii determina sa vada numai in alb-negru.

    Dar filmul mai vine cu alta analogie interesanta: daca ar exista o colectie de carti antice in care culorile ar fi descrise, numarate si analizate, fiecare carte cu definitia proprie si numar diferit de culori, ba chiar cu afirmatii pompoase ca exista o singura culoare, dar e formata din trei, sau ca exista o singura culoare care nu se schimba niciodata, dar care la jumatea cartii sugereaza ca s-a schimbat (lasand Fiul sa se jertfeasca ca sa satisfaca orgoliul Tatalui), …

    Nu poti spune unei persoane care nu poate (genetic) percepe anumite culori (ii lipsesc niste celule-con din retina) ca nu se straduieste suficient de mult ca sa vada culorile.

    Analogie: nu il vad sau nu il percep pe Dumnezeu pentru ca nu ma straduiesc suficient de mult, dar tocmai stradania m-a indepartat si mai mult de perceptie: cu cat am citit mai mult din Biblie, cu atat mi-a venit mai greu sa cred in veridicitatea Bibliei si in consistenta teologiei (Crestine, pentru ca m-am nascut Crestin si sunt inconjurat de Crestini). Este dupa cum spunea Ion Aion (Ilie Toader) in cartea sa, Spovedania unui preot ateu, Intre religie si credinta este un raport de inversa proportionalitate: cu cat devine cineva mai credincios cu atat ii pasa mai putin de continutul religiei si invers: cu cat va cunoaste mai bine continutul propriei religii, cu atat ii va fi mai greu sa creada in ea.

    Romani 1:20 – Dumnezeu este usor de vazut si de inteles si oamenii nu au nicio scuza.

    Marcu 16:16 – Cine crede si e botezat va fi salvat, cine nu, va fi condamnat.

    2 Corinteni 6:14 – Credinciosii sa evite pe necredinciosi sau pe eretici, pentru ca lumina nu poate sa stea cu intunericul.

    Asta inseamna ca religia e simpla si usor de inteles, iar misionariatul si prozelitismul nu isi au rostul.

    Bunul simt (intuitia, experienta) imi spune ca nu poti intelege artistul doar din examinarea operei sale, doar poti detecta anumite afectiuni oftalmologice (glaucom la Van Gogh) sau neurologice.

    In Natura lantul trofic determina ca de milioane de ani majoritatea fiintelor vii sa isi piarda viata in chinuri cand sunt vanate si mancate de pradatori.

    Ce impresie ne face Zeul VT din studiul Bibliei? Ca exista un Creator sadic care cere jertfe sangeroase (jertfa lui Cain cu vegetale nu a fost placuta) sau care cere jertfe umane, ca este un savant nemilos care urmareste evolutia biologica a fiintei perfecte (pradatorul suprem), care sustine razboiul, violenta, foloasele necuvenite (din Tinutul Promis) si prada de razboi, …

    Pe de alta parte, tot bunul simt imi spune ca Pictura nu are capacitatea sa il inteleaga pe Pictor si degeaba il imparte in 3 si inventeaza o explicatie pe tema asta pe care o numeste teologie, sau ca este inutil ca Pictorul sa se jertfeasca pe El sau pe Fiul Sau (inca nu e clar daca Tatal si Fiul una sunt sau Fiul e una si cel ce l- a trimis e mai mare, dar e clar ca in Gradina Getsimani Fiul nu se ruga la el insusi), integrandu-se in Pictura ca Pictura sa fie salvata sau sa devina mai buna, cand putea sa o picteze perfect (estetic) de la inceput sau sa o distruga (prin Potop?) sau sa o vanda sau sa o dea cadou la dusmani si sa picteze alta …

    Nu ma hazardez sa aberez mai mult si sper ca in curand Fiinta Umana se va vindeca de religia organizata si se va concentra pe evolutia personala, nu pe mantuirea grupului.


  • Svelte

    22-Jun-2020 18:33 - 49 vizionari

    In minunata lume JS am gasit Svelte, un mediu de dezvoltare aplicatii Internet care chiar se lupta cu greii: Vue.js, Angular, React, AngularDart, …

    De doua saptamani studiez Svelte: mai intai copy/paste cateva exemple din tutorial sau teste online cu REPL, apoi o solutie cu websockets, ca o continuare la modulul LiveView, teste Svelte Material UI, teste SMELTE, aplicatii de editare formuri si liste definite in JSON, …

    Svelte este rapid (compileaza si redeseneaza aplicatia in mai putin de o secunda), codul rezultat ocupa putin spatiu (in proiectul meu 344 kb cod js compilat (190 kb fara fisierul map) in timpul dezvoltarii si 176 kb cod optimizat la final (64 kb fara fisierul map)) si usor de invatat.

    Ca orice mediu de dezvoltare din lumea JS si Node.js, si Svelte vine cu utilitarul sau de construire aplicatii plecand de la un sablon:

    
    # npx este un utilitar node.js
    # mai intai trebuie instalat degit
    npm install -g degit
    
    # apoi se creaza un proiect svelte bazat pe rollup
    npx degit sveltejs/template nume-aplicatie-svelte
    
    # sau un proiect bazat pe webpack
    npx degit sveltejs/template-webpack nume-aplicatie-svelte
    
    

    Dupa ce a fost creata aplicatia dintr-un sablon, dezvoltarea continua cu

    
    # instalare pachete necesare aplicatiei
    npm install
    
    # pornire modul de dezvoltare
    # in acest mod se compileaza proiectul in mod neoptimizat
    # si svelte asteapta ca un fisier din proiect sa se modifice
    # si la orice modificare proiectul este recompilat automat (modul watch)
    npm run dev
    
    # compilare optimizata si executata o singura data
    npm run build
    
    

    Este plin Internetul de exemple banale in Svelte, dar iata o solutie de meniu definit in pagina de pornire ne mai vazuta si ne mai auzita pana acum, mi-a luat 2-3 ore sa imaginez aplicatia bazata pe svelte-tabs si sunt impresionat ca se poate atat de elegant:

    
    <script>
      import { Tabs, Tab, TabList, TabPanel } from "svelte-tabs";
      import { count1, count2, count3 } from "./store.js";
      import Contor from "./Contor.svelte";
      import Test1 from "./Test1.svelte";
      import Test2 from "./Test2.svelte";
      import qrcode from "./QRCode.svelte";
      import tf1 from "./TestForm1.svelte";
      import tf2 from "./TestForm2.svelte";
    
      const menu = [
        { title: "Form 1", ob: tf1 },
        { title: "Form 2", ob: tf2 },
        { title: "QR", ob: qrcode, opts: { title: "Server URL", msg: "" } },
        { title: "cnt 1", ob: Contor, bindvar: $count1, opts: { cls: "btn1" } },
        { title: "cnt 2", ob: Contor, bindvar: $count2, opts: { cls: "btn2" } },
        { title: "cnt 3", ob: Contor, bindvar: $count3, opts: { cls: "btn3" } },
        { title: "Achiz 1", ob: Test1, opts: { title: "Ach 1", interval: 1000 } },
        { title: "Achiz 2", ob: Test1, opts: { title: "Ach 2", interval: 500 } },
        { title: "Achiz 3", ob: Test1, opts: { title: "Ach 3", interval: 100 } },
        { title: "Test 3", ob: Test2, opts: {} }
      ];
    </script>
    
    <style>
      :global(.svelte-tabs li.svelte-tabs__tab) {
        color: #110101;
        font-size: 1.5em;
        font-weight: 600;
      }
    
      :global(.svelte-tabs li.svelte-tabs__tab:hover) {
        border-color: #dee2e6 #dee2e6 #e9300f;
        color: #ff0000;
        background-color: #f3e9e9;
      }
    
      :global(.svelte-tabs li.svelte-tabs__selected) {
        border-color: #dee2e6 #dee2e6 #2b0fc9;
        color: #3f0eaf;
        background-color: #f0f0f0;
      }
    
      :global(.svelte-tabs div.svelte-tabs__tab-panel) {
        color: #2b0644;
      }
    </style>
    
    <Tabs>
      <TabList>
        {#each menu as item}
          <Tab>{item.title}</Tab>
        {/each}
      </TabList>
    
      {#each menu as item}
        <TabPanel>
          <svelte:component
            this={item.ob}
            bind:count={item.bindvar}
            {...item.opts} />
        </TabPanel>
      {/each}
    </Tabs>
    
    

    Mai intai se importa componentele Svelte in sectiunea <script> … </script>, apoi se defineste meniul ca o lista de obiecte JS si fiecare obiect are proprietati (title, ob, opts, bindvar), urmeaza sectiunea de stiluri, <style> … </style>, unde sunt redefinite stilurile meniului de navigare (nu era necesara, dar mi-a placut mie sa schimb un pic stilul meniului), apoi urmeza sectiunea de html, unde Svelte genereaza meniul conform listei.


  • Mecanismele de siguranta ale inimii

    01-Jun-2020 18:21 - 102 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 - 119 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 - 120 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 - 122 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, React si Vue

    16-May-2020 14:48 - 148 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.

    7 iunie 2020: am uitat de Vue.js – se pare ca Vue.js este mai bun din toate punctele de vedere (simplitate, usurinta de invatare, rapiditate, marime cod) decat Angular sau React sau AngularDart. Mai intai trebuie instalat utilitarul de generare proiecte (npm install -g @vue/cli – au fost adaugate 1103 pachete de la 660 contribuitori in 416 secunde in plus fata de pachetele utilizate de Angular sau React), apoi se genereaza un proiect Vue.js (vue create nume-project - alte 1220 pachete de la 846 contribuitori au fost adaugate in folderul creat in 376 secunde si marime 98.7 mega) si se testeaza proiectul (npm run serve) sau se compileaza proiectul (585 kb are compilarea proiectului generat) pentru distributie si executie in alta locatie(npm run build).

    Si se mai pare ca si Svelte concureaza cu greii.


Ultimele pagini: RSS

Alte adrese de Internet

Categorii

Istoric


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