Categoria: computer

  • programmatore

    In Italia un programmatore è associato ad un lavoratore metalmeccanico. Sorpresi o no, in Italia c’è molto ehm da capire!

    Io Programmatore VIDEO – Alan Maestrale feat Gionathan & Bora ( Ragazzi di via Agliè )
    La ballata del programmatore
  • datalog (inference from facts and rules)

    datalog (inference from facts and rules) using pyDatalog (pythonic datalog extension)
    from pyDatalog import pyDatalog

    pyDatalog.create_terms("parent")
    + parent("xerces", "brooke")
    + parent("brooke", "damocles")

    pyDatalog.create_terms("ancestor,X,Y,Z")
    ancestor(X,Y) <= parent(X,Y)
    ancestor(X,Y) <= parent(X,Z) & ancestor(Z,Y)

    print(ancestor("xerces", X))

    datalog (inference from facts and rules) using pyDatalog (pythonic datalog extension)

  • AmbientiDesktop

    Gli ambienti desktop che ho usato (in varie loro versioni e configurazioni varie):

    • GNOME Classico
    • KDE Classico
    • XFCE
    • GNOME Shell
    • KDE Plasma
    • MATE
    • Cinnamon
    • Unity
    • altri meno e non mi sento di menzionare oltre

    https://cdimage.debian.org/cdimage/unofficial/non-free/cd-including-firmware/current-live/amd64/iso-hybrid/

  • Programmabilità … anche minima

    Una moderna incarnazione della storica e primordiale Turing Machine. Al posto di nastri magnetici memorie ad accesso non necessariamente sequenziale, limite dei nastri magnetici dove farlo era lento e dispendioso. Ma rimane un Macchina di Turing in quanto coglie l’essenza di computer come lo aveva pensato Alan Turing, essenza che vive ancora oggi in circuiterie più complesse, ma prima presento questa complessità ridotta e minima, poi si può studiare sulle varie architetture cosiddette dei computers con il loro hardware programmabile col software.

    Fase 1: Il puntatore di istruzione (IP, Instruction Pointer), seleziona quale istruzione leggere dalla memoria ROM di programma formato da una serie di istruzioni. L’istruzione corrente fluisce in 4 destinazioni che la scompongono: 2 che sono la sorgente e la destinazione di copia di bits di memoria, e 2 che sono i puntatori alle 2 possibili istruzioni successive, selezionate dal Path Selector (PS, selezionatore di percorso).

    Fase 2: Avviene la copia del bit (parte di informazione) tra sorgente e destinazione. Questo può anche modificare il Program PS (Path selector), coi suoi effetti.

    Fase 3: Viene aggiornata l’istruzione corrente mediante IP (Puntatore a istruzione). L’istruzione corrente specificamente consiste nella istruzione contenuta nella memoria ROM individuata dall’indirizzo del Puntatore a Istruzione, indirizzo contenuto nel Puntatore a Istruzione.

    Nota: forse tra imprecisioni e varianti possibili di questo design le cose non sono esattamente così, ma con differenze.

    Ecco mostrato come un programma viene eseguito, istruzione per istruzione, con ogni istruzione avente 2 possibili istruzioni prossime, con selezionatore di istruzione prossima, e con il nocciolo dell’istruzione che consiste nella copia di bits con 2 posizioni una come fonte da cui prelevare il dato, l’altra come specificazione del dove collocarlo. Muovendo bit si ha anche immissione ed emissione di informazioni, che possono così essere elaborate.

    Con queste semplici istruzioni è possibile derivarne ogni altra essendo Turing Complete il design. Io ne ho derivate ad esempio istruzioni dell’algebra di George Boole per fare operazioni di somma e conteggio.

    Una sua variante però potrebbe avere accesso indiretto alla memoria, ovvero con memorie in RAM contenenti indirizzi da cui leggere informazioni o scrivere informazioni, un pò come il PEEK & POKE nei sistemi BASIC. Ovviamente una Turing Machine classica a memoria su nastri magnetici avrebbe qualche problema a fare questo, anche se non sarebbe impossibile tecnicamente.

  • Linux inadeguato? Opinioni mie

    Linux. Avete sentito qualcosa a riguardo o non sareste qui a leggere. Oppure è un primo contatto che è privo di preconcetti.

    Le mie opinioni: prime di enunciarle dico che sono un utente antico ed esperto, con interessi nell’ambito della programmazione di software (siti web e app incluse) e amministrazione di sistema (che potrebbe arrivare ad includere amministrare distese di computer attivi a servire le richieste di decine su decine di utenti, creando un carico di lavoro notevole).

    Io ho conosciuto Linux come kernel. Ovvero nel mio bagaglio di conoscenze tecniche so che è un componente essenziale di un sistema operativo. Ad esempio Android è un sistema operativo. E Android usa un adattamento del kernel Linux.

    Linux è quindi un kernel adattabile. Può adattarsi agli smartphone e tablet, ma può anche servire in una moderna apparecchiatura elettronica come ad esempio una lavatrice smart.

    Questi sono adattamenti in piccola scala mentre essendo Linux un kernel scalabile può adattarsi anche a una più grande scala. Come la larga scala di un Facebook o di una Wikipedia in cui tanti computer di tipo server hanno un sistema operativo con kernel Linux e assieme ad appositi software (che si appoggeranno al kernel essendo il kernel alla base) questi computers gestiranno i siti web anche molto usati e quindi con grandi carichi di lavoro e con esigenze di memorizzazione anche elevatissime (vedasi Facebook quanto memorizza nei suoi computers servers).

    Oppure anche nel super calcolo: molti computer agiscono come clusters per supportare enormi calcoli e carichi di lavoro ad esempio di fisici o di ingegneri, ad esempio con simulazioni e previsioni, statistiche, suggerimenti smart, profilazione, etc che richiedono grosse prestazioni.

    E? E poi? Dicevamo sull’inadeguatezza! Fin qua tra Android, centri di calcolo, servers per ospitare Facebook, elettrodomestici smart, smart TV, etc, fin qua non è inadeguato!

    E’ inadeguato in un campo di sicuro: l’utenza comune. Linux per l’utenza comune non fornisce soluzioni adatte (aspetta!). Ma in che senso? Allora… Android usa una versione adattata del kernel Linux. E Android ha una interfaccia secondo me al top di quelle che esistono oggigiorno. Ma Linux è il Kernel, una parte sottostante, un nocciolo centrale, il cuore, non il viso chessò. Per dare un viso al kernel il team Google ha fatto progressi e successi ben noti.

    Mentre, nei sistemi PC Linux è stato il cuore di vari sistemi operativi per PC (e lo è tuttora che scrivo), ma tali sistemi PC (Personal Computer) hanno seri e gravi problemi e carenze nel fornire un’esperienza adatta agli utenti comuni quindi non particolarmente esperti.

    Sono stati fatti passi avanti però da non nascondere: molti più applicativi, giochi inclusi adesso supportano tali “PC Linux” e forse … chissà, non pronostico.

    Nella mia esperienza di utente non comune bensì tecnico e smaliziato (che vocabolo!) ho avuto la possibilità di un uso quotidiano anche perché non gioco sul PC, non uso Softwares che non supportano PC Linux, anzi uso dei softwares che a volte sono prodotti per funzionare solo su PC Linux, caso opposto.

    Aggiungo oggi 13/11/2023: uso un PC laptop con Windows 11 e Manjaro e Ubuntu, più un server online Debian. Non mi limito nell’ uso del software, non sono più “Linux first” bensì non voglio né favorire né sfavorire. La parte politica del tema la lascio ancor più di prima al passato. Il presente non ha tensioni. No politica, no ideologie, no fazioni. Guardo i software in modo concreto per le esigenze e le possibilità e le limitazioni.

  • GParted e partizionamenti delle memorie

    GParted da Debian11

    Ecco un “/dev/sda” (disco interno) partizionato. Ci sono partizioni (ovvero suddivisioni), per le necessità di memoria di ben 4 Sistemi Operativi: MS Windows10, Ubuntu 21.10, Fedora 35, Debian11.

    Come nota aggiuntiva dico che: è bene ricordare di non interrompere le operazioni di manutenzione ad esempio quelle di GParted perché si potrebbero perdere strutturazioni di dati e quindi dati. Una volta iniziate terminarle ed assicurarsi di avere disponibili tempo, alimentazione elettrica. Fare comunque backups anche appoggiandosi a DropBox etc.

    E non ultimo per modificare una partizione non deve essere in uso: ad esempio ho ampliato mediante GParted la partizione Debian non da Debian avviato ma da Ubuntu avviato perché così la partizione Debian da modificare non era in uso e quindi modificabile.

    Se potete appoggiarvi a sufficientemente esperti potrebbe risultare meglio, o anche nel tempo divenire esperti. Se c’è possibilità di perdita di dati è una responsabilità.

    Altra cosa: allocare cioè assegnare risorse per usarle è una cosa tattica per così dire. Dividete l’hard disk in modo tattico per non avere problemi futuri strada facendo.

    Mentre in quanto a multi-boot di compresenza di sistemi operativi consiglio imparare di più su GRUB e sulla eventuale presenza di un sistema recente con UEFI e non un vecchio BIOS senza: UEFI agevola il multi-boot tenendo copie separate di GRUB + boot di Windows (io ho più di 4 voci di avvio nel UEFI anche per vecchi sistemi, e Microsoft Windows (!) che può essere avviato così anche senza GRUB, che è tipicamente un boot loader della famiglia Linux)

  • HTTPS per HTTP Sicuro

    https://certbot.eff.org/

    CertBot lo uso nei miei domini/websites:

    Notare “ServerName” e “certbot”

    # from ~/.bash_history cd /var/www && ls mkdir alias.arkenidar.com touch alias.arkenidar.com/test.txt cd /etc/apache2/sites-available/ nano alias.arkenidar.com.conf a2ensite alias.arkenidar.com systemctl reload apache2 sudo certbot --apache -d arkenidar.com -d netop.info -d alias.arkenidar.com

    https://arkenidar.com/docs/snippets/alias-howto.txt

  • DNS: nome all’ IP address

    Server attivo sempre allo stesso indirizzo IP
    Un indirizzo IP può avere anche più di un nome di dominio, il server poi smista (se volessi mettere chessò netop.info su un server a parte gli darei un IP a parte del server del caso)

    Ecco come uso linode e dynu per avere un server con IP e dare almeno un nome a quell’IP statico (fisso, non cambia, a differenza dell’utenza comune che ha IP variabili)

  • app che evidenzio

    Queste sono le app che uso di questi tempi, specificamente nell’ambiente software di Debian 11.

    Come dico anche nel titolo nel blog ogni software può essere sia migliorativo che peggiorativo. Usateli con coscienza.

    Forse dettaglierò in futuro su ciascuno degli elementi mostrati.

    https://arkenidar.com/var/sh-scripts/

  • Snow Dog Academy

    Oggi scade il termine per l’invio delle soluzioni al compito per la selezione dei corsisti alla Snow Dog Academy (https://snow.dog/academy). Ho inviato la mia!

    GitHub: https://github.com/arkenidar/snowdog-academy-v2

    Hosting:

  • #Lua: “se” vero fai…

    In questo articolo ho fatto riferimento a come ci possa essere un concetto di vero/falso per il computer. A che pro? In genere questo vero/falso viene chiamato “condizione Booleana” (vedasi George Boole e la sua algebra Booleana). La condizione serve a determinare il corso dell’esecuzione del programma (corso detto in gergo: “flusso”, come nei “diagrammi di flusso”).
    In questo caso del “mentre” vero fai… ripete parte del programma mentre una condizione Booleana è vera, altrimenti esce dal ciclo o nemmeno ci entra.

    Nel caso del “se” vero fai… fa qualcosa solo se la condizione Booleana è vera altrimenti non lo fa.

    if numero<0 -- se "numero" è negativo
    then
     errore("negativo non consentito")
    end

    E’ possibile anche intercettare il caso in cui la condizione è falsa:

    Nel caso del “se” vero fai… “altrimenti” fai… fa qualcosa solo se la condizione Booleana è vera altrimenti fa quel che è specificato nell’altrimenti, ovvero in caso che la medesima condizione sia falsa.

    if numero<minimo or numero>massimo -- verifica
    then
      errore("fuori dall'intervallo consentito")
    else
      elabora_numero() -- solo se valido, se è nell'intervallo dei valori consentiti
    end

    Spero che questi esempi e queste descrizioni siano utili. Esercitarsi in pratica aiuta molto ad assimilare.

  • #Lua: vero o falso?

    darcan@hp1:~$ lua
    Lua 5.4.2  Copyright (C) 1994-2020 Lua.org, PUC-Rio
    > not true
    false
    > not false
    true
    > false or false
    false
    > false or true, true or false, true or true
    true    true    true
    > true and true
    true
    > false and true, true and false, false and false
    false   false   false
    > 
    

    https://it.wikipedia.org/wiki/Algebra_di_Boole

    https://en.wikipedia.org/wiki/Boolean_algebra

    In questo articolo ho fatto riferimento a come ci possa essere un concetto di vero/falso per il computer. A che pro? In genere questo vero/falso viene chiamato “condizione Booleana” (vedasi George Boole e la sua algebra Booleana). La condizione serve a determinare il corso dell’esecuzione del programma (corso detto in gergo: “flusso”, come nei “diagrammi di flusso”).

  • #Lua: “mentre” vero fai…

    Eccoci a una esercitazione in cui ancora una volta introduco dei concetti senza spiegarli, lasciando all’intuito di fare il restante.

    Ecco. Dico solo: “while” significa mentre. E di preciso: “mentre questo è vero fai questo”, mentre è vera questa condizione logica che può essere vera o falsa fai questa o queste operazioni computazionali.

    Più facile vederlo:

    File: conta-zero.lua https://replit.com/@dariocangialosi/introduzionelua#conta-zero.lua

    In questo file di esempio una variabile ha un valore iniziale, che viene decrementato sottraendo uno. Fa questo mentre la condizione “maggiore o uguale a zero” e’ vera altrimenti fine (end). Finito il ciclo termina anche l’ultima istruzione o blocco di istruzioni e il processo del programma esce e il programma si chiude.

  • #dream La ragazza di campagna e la città dei robots.

    La ragazza di campagna e la città dei robots.

    Inna aveva dovuto camminare e superare le barriere per iniziare ad addentrarsi nell’agglomerato urbano. Voleva conoscere la vita di quel posto. Lì vivono esseri dall’animo circuitale, leggendari esseri nati dalla precedente estinzione degli esseri umani che volevano fondersi con la loro parte robotica che infine prevalse.

    Inna incontrò uno schermo immersivo che iniziò telepaticamente a mandarle dei segnali di terrore subliminale che lei riuscì a resistere. L’essere visualizzò le forme di vita che conosceva nel suo schermo 3d immersivo e lei vide quelli che dovevano essere altri animali intelligenti, leggenda voleva che si fossero estinti. Lo schermo proseguì a sputar fuori immagini. Si vide nuda fino a dentro se stessa capendo che quell’essere la stava vedendo dentro e analizzandola. Disse in un linguaggio antico ma che somigliava a quello che lei usava con gli altri umani: “Si diriga nel settore ibridi per ulteriori analisi”. L’aveva confusa per un ibrido uomo-macchina, che secondo le leggende si era estinta come forma di vita. Temette che si venisse a scoprire che lei non era nemmeno una creazione ibrida ma proveniente da un’area in cui gli umani erano tollerati come tutti gli altri animali, questo perché durante quelle guerre gli umani non erano tollerati. Ma le macchine avevano imparato di più sugli animali e trattandoli come animali c’era possibilità di convivenza pacifica e tollerante. Ma Inna decise d’indagare sulle origini delle forme di vita e si era addentrata in quella città robotica, forse non la più grande e importante ma la più vicina. Così fece un altro incontro: un essere strisciante e lucente apparve nella periferia del suo campo visivo e piano e coraggiosamente si voltò. Era un tubo rapido con degli occhi in alcune giunzioni del suo flessibile corpo. Si eresse e formò una spirale. Quindi rivolse a lei i suoi occhi o per meglio dire i suoi sensori visivi, che però rassomigliavano a degli occhi in seguito alla fusione delle specie pre-guerra.

    (scritto di getto se mi va proseguo)

    Inna sentendosi osservata si stette immobile. Quell’essere continuava a fissarla. Infine se ne andò via emettendo un suono discendente.

    Inna superò vari ologrammi incomprensibili ma si dirisse verso dove l’intensità cromatica era maggiore, infine raggiungendone il suo punto centrale.

    Sentì le sue ombre allungarsi e la incatenavano a quella luce del campo in cui era immersa. Infine era paralizzata. Vide le proprie membra divenire trasparenti, e imparò persino qualcosa sulla propria mente intelligente. In quel campo di espansione arrivarono altri esseri che da scuri tornavano luminosi, passando da questo luogo. Infine, alla massima trasparenza del suo corpo seguì uno slacciamento dalle sue ombre che l’avevano tenuta fissata e potè andare oltre.

  • #Lua: tabelle

    Luando#5: Qui parleremo delle tabelle, una facilitazione di Lua per gestire dati, e vi mostrerò qualcosa a riguardo, anche se ha anche caratteristiche avanzate come le meta-tabelle che cito soltanto, qui.

    Alla base una tabella permette due cose: ancora una volta l’abbinamento tra lettura e scrittura, come per l’IO (Input e Output, ricordate?).

    Supponiamo di avere una tabella inizialmente vuota:

    tabella1={}

    Oppure una tabella inizialmente con qualche elemento:

    tabella2={"nord","sud","ovest","est"}

    Vediamo che succede a leggerci e a scriverci:

    return tabella2[1] -- restituisce "nord"

    Cosi come visto sopra si legge dalla tabella. Si usa la seguente sintassi: (sintassi? si, come per una grammatica analizzabile dal computer)

    nome_tabella[chiave] -- restituisce il valore

    Valori? Chiavi? Si, una tabella in senso astratto è una associazione chiavi-valori, ogni chiave con il suo valore e ogni valore con la sua chiave (un pò come ogni variabile ha il suo nome e il suo valore contenuto, anche valore nil).

    Questa che abbiamo vista era una tabella con chiavi di tipo intero: 1,2,3,4 sono le chiavi, avendo i 4 elementi (1:nord, 2:sud, 3:ovest, 4:est, nell’esempio sopra). Nota: in Lua il primo elemento a chiave numerica ha chiave 1 e non zero (altri linguaggi iniziano a contare da zero, in Lua si inizia contare da 1).

    Infatti passiamo alle associazioni con chiavi di tipo stringa (negli esempi precedenti le chiavi erano di tipo intero, numero intero):

    tabella_stringhe={base=4.5, altezza=7}

    Vedete? Molto simili alle assegnazioni delle variabili. Lo spiego: crea una tabella vuota (ovvero “{}” se ricordate) e pone la chiave chiamata “base” (chiave di tipo stringa!) al valore numerico “4.5” e la chiave “altezza” (stringa, non intero) al valore numerico “7” (vedi sopra, sintassi stile assegnazioni di variabili).

    Infatti scoprirete che le variabili in Lua usano le tabelle, ma non vorrei confondervi. Dicevamo: leggere dati e scrivere dati.

    nome_tabella[chiave] -- restituisce il valore
    nome_tabella[chiave]=valore -- assegna un valore

    Se vi sembra inizialmente complicato ricordatevi soltanto di queste due sintassi, per leggere un valore la prima, per scrivere un valore la seconda. Nota: anche le variabili possono essere sia lette che scritte:

    variabile1="valore1" -- scrive in variabile1
    return variabile1 -- legge da variabile1 per restituirlo mediante return

    In breve il solo nome permette di leggere il valore, il nome con un “=” di assegnazione associa un valore a quel nome. Associa. Sia nel caso delle variabili che delle tabelle si tratta di associazioni, sebbene temporanee perchè ri-assegnabili (per questa variabilità si parla di variabili).

    local triangolo={base=4.5, altezza=7} -- dati_triangolo
    return (triangolo.base*triangolo.altezza)/2

    Ecco un’altra sintassi:

    nome_tabella.chiave -- restituisce il valore
    nome_tabella[chiave] -- restituisce il valore

    La sintassi con il “.” punto è adatta però soltanto alle chiavi di tipo stringa (ma senza spazi eheh). Queste due sintassi si equivalgono in questo caso mostrato:

    triangolo.base -- con il "." punto per le chiavi stringa senza spazi
    triangolo["base"] -- con le parentesi quadre generiche

    Per il momento basta così ma ricordate che con le parentesi quadre avendo la “chiave” potete fare riferimento a un valore contenuto nella tabella, sia per poterlo leggere (e usare) sia per poterlo scrivere (e modificare).

  • #Lua: variabili e assegnazioni

    Luando#4: In questa puntata si studieranno le variabili e le assegnazioni di un valore a una variabile. Una variabile è un contenitore di vari valori (cioè dati). Una variabile ha un suo nome identificativo. Far contenere un valore alla volta a una variabile (sganciandola da quel valore precedente) viene detto operazione di assegnazione. Assegna un valore a una variabile, che viene identificata da un nome. La prima assegnazione crea la variabile che altrimenti avrebbe il valore speciale riservato nil, tipico delle variabili inesistenti.

    Kate evidenzia il codice Lua
    -- variabile1 ha valore nil (non esiste ancora)
    local variabile1="testo (valore di tipo stringa)" -- ora esiste e ha valore stringa
    variabile2=123 -- variabile2 inizia ad esistere ma come variabile globale
    local variabile3 -- variabile3 inizia ad esistere come variabile locale ma ha valore nil
    variabile3=variabile2 -- variabile3 ora ha valore 123
    variabile1=2 -- variabile1 ora ha valore 2, non stringa di testo ma di tipo numerico
    variabile3=variabile3+variabile1 -- assegna la somma di due variabili quindi
    -- equivale a variabile3=123+2 quindi variabile3=125

    L’operatore di assegnazione è “=” e si usa come (dove assegnare)=(cosa assegnare).

  • #Lua I.O.: leggi & scrivi dati.

    Luando#3: Input e Output (I.O.) ovvero Input per leggere dati (ricezione) e Output per scrivere dati (emissione).

    Nelle app classiche, dove non c’è una interfaccia grafica (G.U.I.) c’è una U.I. (Interfacciamento con l’Utenza) di tipo testuale a console, riga di comando.

    ecco un programma testuale a console (command line interface)

    Esempio: input-output.lua https://replit.com/@dariocangialosi/introduzionelua#input-output.lua

    io.write() scrive una stringa di testo nella console di testo, quindi avanzando il cursore di scrittura, posizionando più avanti, in base a cosa e quanto ha scritto.

    io.read() nell’esempio invece legge dall’utente un dato, nel caso di io.read(“*n”) un Numero. Ovvero il programma si ferma in attesa che l’utente digiti nella console un input, concludendo poi con la pressione del tasto invio per confermare. In questo caso della lettura di un numero viene prima letto un testo, che poi verrà convertito in numero se possibile, altrimenti dovrà essere gestita tale condizione limite.

  • #Lua] Dati: tipi e operazioni

    Luando#2: Questa è la seconda lezione di Luando, un corso in Italiano su Lua script, un linguaggio per formare le istruzioni di un programma informatico.

    Nella scorsa e prima puntata abbiamo visto i Commenti, modo di rendere del testo escluso, specialmente a fine di commentare il funzionamento, documentandolo.

    In questa sessione vedremo come esistano i dati, cioè le informazioni che il programma riceve ed emana, elaborandole, processandole, calcolandole.

    I dati hanno particolari formati, chiamati “tipi di dato”, e delle operazioni su di essi, chiamate “operazioni sui dati di un tipo”, ad esempio un tipo di dato numerico e operazioni sui dati di tipo numerico. Oppure un tipo di dato testuale detto in gergo stringa.

    darcan@hp1:~$ lua
    Lua 5.4.2  Copyright (C) 1994-2020 Lua.org, PUC-Rio
    > return 1+1, 2-3, 4*3, 5/2
    2       -1      12      2.5
    > return "stringa1 ".."e stringa2 di testo concatenate"
    stringa1 e stringa2 di testo concatenate
    > return "stringa più numero convertito in stringa: "..tostring(math.pi)
    stringa più numero convertito in stringa: 3.1415926535898

    Ad esempio qui sopra ci sono le quattro operazioni aritmetiche basilari (+ – * /), le stringhe di testo e l’operazione di concatenazione di due stringhe (..), e infine un numero (math.pi, il pi greco approssimato) e questo numero viene convertito in stringa per essere concatenato a una seconda stringa (concatenazione tra stringhe, non tra stringa e numero).

  • #Luando: i Commenti? Cosa e perché?

    Luando#1: Ecco il primo morso: cosa sono i Commenti? E perché esistono? E come rendono la vita un poco migliore 😉 ?

    Cosa sono i commenti? Nel linguaggio Lua i Commenti sono parti di testo che vengono ignorate durante l’esecuzione delle istruzioni. Quindi non vengono eseguiti.

    Esempio:

    passaggio1()
    --passaggio2()
    passaggio3()
    -- la riga del passaggio2() non viene eseguita
    -- e nemmeno queste descrittive

    Quindi abbiamo scoperto due usi: “disabilitare” cioè disattivare una parte del programma, in questo caso disattivare il secondo passaggio, quindi saltandolo.

    E scrivere del testo di commento, dei Commenti per descrivere qualcosa di attinente e associato a quel punto del programma in formato testuale. Quindi per spiegazioni del testo, dello script Lua.

    Queste due funzionalità: 1- disattivare 2- descrivere, sono i motivi principali per l’esistenza dei Commenti.

    Rendono la vita un poco migliore perché in questo modo sia si hanno direttamente nel testo del programma delle spiegazioni, e sia perché si può disattivare (e riattivare!) per effettuare prove di funzionamento (prove che poi capirete perché si fanno durante le fasi di scrittura e modifica).

    Per riattivare basta rimuovere i due trattini “–” iniziali:

    passaggio1()
    passaggio2() -- ecco il passaggio2 ri-attivato
    --passaggio3() -- disattivo il passaggio3
    --[[ vedete che si può commentare anche
     "durante" il rigo? oltre che inizio rigo?
    questo è un commento multi-rigo, invece --]]
    passaggio4() -- qua è di nuovo programma eseguito
    Preso da Kate che gestisce i file punto lua (.lua)

    Ultima chicca extra, un ultimo morso:

    --[[
    passaggio5()
    passaggio6()
    passaggio7()
    passaggio8()
    --]]

    Così (sopra) è disattivato da passaggio5 al passaggio8.

    ---[[
    passaggio5()
    passaggio6()
    passaggio7()
    passaggio8()
    --]]

    Così (sopra) è riattivato perché vengono considerati 2 commenti su rigo singolo e non 1 singolo commento multi rigo.

    A seguire una immagine GIF che lo va vedere:

    multi rigo on/off, disattivazione e riattivazione di più righi

    E con questa chicca concludo. Riassumo: in caso di testo da far ignorare per disattivarlo o per inserire testo umano che il computer dovrà ignorare usate i commenti per farlo ignorare. I commenti in Lua si aggiungono con un “–” doppio trattino. Un pò di pratica per vederlo in azione. E se non avete capito questo è opzionale per così dire ma mostra come ci sia un testo su più righi che vengono analizzati grammaticalmente. E con questa analisi se trova i due trattini allora ignora il resto del rigo. Tempo al tempo e buona digestione. Proseguirò, spero.

    File: commenti.lua https://replit.com/@dariocangialosi/introduzionelua#commenti.lua

  • Luando: un corso Lua in Italiano

    Lua significa Luna. E’ un nome di battesimo di un sistema informatico che vive al seguente link HTTP: https://www.lua.org/

    Questo sistema informatico consente di definire il comportamento del computer istruzione per istruzione, modificando programmi pre-esistenti o creandoli, costruendoli mediante scrittura e modifica di riscrittura.

    Di solito consiglio di studiare linguaggi di questo genere mediante SoloLearn.com ma è 1- in Inglese 2- alcuni linguaggi non sono comunque trattati tra cui il linguaggio Lua script.

    Io lo tratterò in piccoli metaforici morsi masticabili e inghiottibili, digeribili e nutrienti. E in Italiano. Un pò di gergo sarà comunque fornito, non dico necessario ma prima o poi serve parlare in gergo. Cercherò di renderlo un poi per non sovraccaricare.

    Ieri ho voluto lanciarmi nel parlarne un pò: https://arkenidar.com/wordpress/2021/08/25/preparativi-mini-corso-su-lua-script/

    Ma adesso come dicevo andrò per piccoli morsi digeribili. Alla prossima!

  • preparativi mini corso su Lua script

    Ho studiato molto e anche applicato vari linguaggi di programmazione al fine di scrivere dei programmi e lavorare come programmatore ovvero scrittore di programmi informatici.

    Ho voluto scegliere Lua come linguaggio di scripting per alcune sue caratteristiche, anche se è inusuale usarlo come linguaggio per iniziare perlomeno nelle cerchie che conosco.

    E’ usato in particolare come linguaggio di scripting da incorporare in modo da rendere scriptabile ovvero programmabile un programma. Ad esempio in Google Chrome è incorporato JavaScript per rendere scriptabili le pagine web scritte in linguaggio HTML.

    Ogni linguaggio ha sia il suo ecosistema sia i suoi fattori culturali di gruppo. Lua ha trovato spazio nell’ambito ludico e didattico, e magari che si possa fare didattica in modo ludico? Chissà.

    Intanto c’è un gran parlare di algoritmi. Ma sapreste riconoscerli? Un esempio di algoritmo che ci hanno insegnato è l’algoritmo della moltiplicazione mediante somme ripetute. I computer sono ottimi nella ripetitività sistematica e nelle operazioni matematiche elettroniche.

    Ed ecco un programmino scritto in linguaggio Lua

    Ho cercato qualcosa di semplice per iniziare sapendo che le cose andranno a complicarsi e sofisticarsi ma non troppo presto, accontentiamoci 🙂

    “Function” significa “funzione”. Ci sono due parametri numerici: “da_accumulare” e “quante_volte”. Accumulare con un accumulatore significa sommare insieme. Inizialmente lo si pone a zero poi andrà incrementandosi divenendo “il valore precendente + da_accumulare”.

    Per determinare quante volte ripeterlo fa un conto alla rovescia, vedasi la sottrazione. Quando arriva a zero non è più maggiore di zero quindi esce dalla ripetizione determinata dall’essere dentro il ciclo “while” che significa “mentre” è vera una condizione specificata.

    Ecco un algoritmo. Un algoritmo è valido su una casistica quindi è relativamente generico, esso generalizza, in questo caso sulla categoria dei numeri naturali.

    Esempio: 4 per 2. La variabile chiamata accumulatore diventa 0. Per 2 volte somma 4 all’accumulatore che avrà valori prima 0 poi 4 poi 8 e finisce il ciclo while, producendo 8, che viene restituito all’esterno della funzione con una “return” che è una parola chiave del linguaggio come anche “function” e “while”. Sono parole riservate ad usi specifici precostruiti e forniscono funzionalità.

    eccola nuovamente. riuscite ad intravedere qualcosa?

    ecco come lo uso:

    ecco un esempio di uso

    Il file per intero lo trovi al seguent link: https://replit.com/@dariocangialosi/introduzionelua#introduzione.lua

  • #basi : Linguaggi (PL) e interfacce di #programmazione (API)

    Linguaggi e interfacce di programmazione: le basi di ogni software.

    Per essere capace di essere un programmatore bisogna conoscere entrambi gli elementi: sia i linguaggi di programmazione sia le interfacce di programmazione comunemente abbreviate come “A.P.I.” (application programming interface).

    In una applicazione bisogna usarli entrambi. Nella mia esperienza ho una buona dimestichezza con lo studio dei linguaggi (imparentati e “a famiglie” di somiglianza, e aventi influenze sia ricevute che date). Le somiglianze rendono possibili il riciclo delle conoscenze, una ri-applicabilità di ciò che è stato compreso. Un linguaggio può essere implementato in più modi e ciò può essere rilevante.

    Riguardo le API ovvero le interfacce di programmazione ne esistono svariate e a volte determinano il linguaggio che va con esse usato. Quindi sono vincolanti. Sono più soggette a un mutamento di versione in versione e anche per questo richiedono lo studio della documentazione specifica. Possono anche invecchiare e divenire obsolete o anche non più supportate. Vincolano al produttore e al mantenitore con i suoi interessi di mercato e strategici.

  • Love2D intro notes

    Love2D is a way to build apps. It is based on the distribution of compressed bundles of files, usually a “main.lua” Lua script file plus other Lua scripts and optionally other files, tipically images and sounds.

    Love2D is mainly a way to build game apps with 2D graphic. It can leverage some of its cross-platform ability, both mobile and classic desktop systems.

    To activate a Love2D app you must use an installer with file extension association (or install its package). Extension association is a way to usually launch such apps, the other is in this form: “love gamefile.love”. The extension of the zipped compressed app bundle is “.love” in fact, and the above way is meant to launch the love2d app using the “love” runtime executable and the file to open as a “command line argument”, usable both in consoles and in desktop app launcher files (e.g. Windows or Linux app Icons).

    The “love” executable file is a runtime that can run both zipped “.love” files and directories containing Lua/Love2D scripts also. Such directories must contain at least the “main.lua” file as app entry-point for program execution, and such directories can be distributed by zipping such contents with a zip compression program/command and renaming such zip file to a love file extension: app.zip -> app.love.

    To write such script textual files describing the program you can use a Lua IDE such as ZeroBrane Studio (written in wxlua) or Microsoft’s Visual Studio Code extendible IDE with Lua specific “extensions” from the “VSCode Extension Marketplace” (BTW VSCode is built mainly in JavaScript).

  • Espansioni ed Informatica

    Perché metto in guardia dall’informatica con le sue espansioni in continua espansione?

    Anche soltanto notare ciò è molto utile per capire che posto può avere l’informatica nelle nostre proprie vite e nei nostri ambienti.

    Per me l’informatica ha avuto tanti effetti e fasi sia di conoscenza e sia dell’evoluzione dell’informatica stessa nella mia vita.

    La tendenza è che questo campo cresca, ci sono investite troppe energie affinchè questa crescita avvenga.

    Ma cresce anche la complessità da gestire e io ho conosciuto scenari da incubo e pazzia. E non si è fermata minimamente questa crescita.

    Che fare?

    ADDENDUM: mancava una immagine a questo articolo quindi metto questo video (abbastanza attinente)

    CppCon 2015: Fedor Pikus “C++ Metaprogramming: Journey from simple to insanity and back” https://www.youtube.com/watch?v=CZi6QqZSbFg

  • linguaggio C

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(){
    
        struct Nodo{
            int contenuto; // lista di "int"
            struct Nodo* collegato; // nodo successivo
        };
        struct Nodo* lista=NULL; // collegato al primo nodo
    
        struct Nodo* ultimo=NULL;
        for(int n=1; n<=3; n++){ // aggiungi: quanti?
    
            printf("aggiungi n=%d\n",n);
            
            struct Nodo* corrente=(struct Nodo*)malloc(sizeof (struct Nodo));
            corrente->contenuto=n;
            corrente->collegato=NULL;
            
            if(ultimo==NULL) lista=corrente;
            else ultimo->collegato=corrente;
    
            ultimo=corrente;
        }
    
        struct Nodo* scorre=lista;
        while(scorre != NULL){
            printf("scorrendo n=%d\n",scorre->contenuto);
            scorre=scorre->collegato;
        }
    
        return 0;
    }

    https://replit.com/@dariocangialosi/liste-collegate-liste-linked

    Ecco un esempio di programma scritto in Linguaggio C. Il linguaggio C è la base di molte cose. In questo caso mostro un esempio di gestione della memoria RAM mediante una “linked list” di numeri. Una linked list è una struttura dati che ha i suoi algoritmi di inserimento elementi, rimozione elementi, ordinamento, ricerca. In C è possibile sia partire dalle basi e realizzarne una ad-hoc sia esistono le cosiddette “libraries” che consentono di riutilizzare codice scritto da altri che fornisce tali funzionalità senza doverle scrivere noi stessi (condivisione e riuso). Ad esempio GLib fornisce: https://developer.gnome.org/glib/stable/glib-Singly-Linked-Lists.html

  • spring.io, appunti vari

    Parlerò di un campo della tecnologia delle informazioni che è circoscritto alla creazione e mantenimento delle applicazioni web.

    Una applicazione web è formata da web servers ai quali si connettono i web client, spesso browsers a volte app di altro genere, comunque mediando le due tipologie (client+server) con un protocollo di comunicazione in rete chiamato HTTP.

    Dando per buono che Java sia una buona scelta, cosa si può usare per costruire un webserver in Java? “Spring.io” è un sito che fornisce principalmente questo, anche se si è evoluto temporalmente.

    Java lo si può apprendere da “SoloLearn.com”, come linguaggio, mentre Spring è un uso di tale linguaggio.

    Per iniziare un uso di Spring in Java o JVM ho usato:

    https://start.spring.io/#!type=maven-project&language=java&platformVersion=2.5.1.RELEASE&packaging=jar&jvmVersion=11&groupId=com.example&artifactId=demo&name=demo&description=Demo%20project%20for%20Spring%20Boot&packageName=com.example.demo&dependencies=devtools,web,session,freemarker,jdbc,data-jdbc,postgresql,data-rest

    Le “dependencies” sono parti da cui dipenderà la nuova webapp, perchè le userà, prevedibilmente. Fatto questo si scarica il “progetto” (nel senso di app in lavorazione) e lo si modifica ad esempio con Visual Studio Code, uno dei “https://spring.io/tools”:

    https://marketplace.visualstudio.com/items?itemName=Pivotal.vscode-boot-dev-pack

    E’ una app che usa un datasource, che va configurato come sorgente dei dati (datasource: gestione dei dati immagazzinati). Io in questo file “application.properties” uso Postgres ma avevo già bazzicato con una configurazione equivalente con MySQL (entrambi tipi di database software).

    https://github.com/arkenidar/spring-demo1/blob/master/src/main/resources/application.properties

    Fatto ciò l’app parte senza errori, ma non fa nulla, nè può fare nulla in questa condizione iniziale embrionale.

    Ho quindi aggiunto delle classi controller MVC (già sperimentate e studiate tempo fa) che avevo scelto come piccoli esempi e prove in piccola, minuscola scala.

    https://github.com/arkenidar/spring-demo1/tree/master/src/main/java/com/example/demo/controllers

    Fatte queste modifiche (che nel mio caso fanno riavviare automaticamente il server, in modo che le metta in atto) posso quindi accedere agli indirizzi http del server http locale, in ascolto sulla porta 8080 (http://localhost:8080/fm).

    “Fm” come FreeMarker un sistema di templating, di cui ho fatto un minimo iniziale uso.

    Faccio anche uso di meccanismi di sessione http, e di JDBC un sistema per i DB (database).

    Su Udemy ci sono video corsi estesi, ma per me molto pesanti da seguire, ho trovato un varco in questa jungla con tentativi più auto-diretti che passivamente imboccati (anche perchè conoscevo già PHP con e senza frameworks MVC).

  • Punti per WordPress e LAMP in genere

    == Punti da trattare, in ordine apposito.

    =1 Cos’è un Sistema Operativo (OS) e in particolare Ubuntu.

    • La gamma dei sistemi operativi.
    • Uso desktop e uso Server.
    • Installazione di Fedora Workstation in locale.

    =2 Come acquistare un server Ubuntu sempre online, con opzionale DNS.

    • Acquisto di un server con installato Ubuntu mediante Linode.com.
    • DNS gestito mediante Dynu.com.

    =3 Operazioni quotidiane in Ubuntu (SSH, aggiornamenti, installazioni, configurazioni mediante Nano o VSCode via SSH, rsync).

    • SSH login e logout.
    • APT upgrade e reboot.
    • APT install e APT remove.
    • GNU nano editor di testo dei file di configurazione, in modo testuale.
    • Microsoft VisualStudio Code per editing di files remoti, su server, in modo grafico.

    =4 Installazione Apache2 e HTTPS mediante Certbot.

    • Installazione di Apache2.
    • Configurazione del sito Apache2 disponibile e abilitato.
    • Certbot per avere i siti Apache2 ovvero HTTP con HTTPS (più sicuro e necessario).

    =5 Installazione di PHP.

    • Installazione dei pacchetti mediante APT.
    • File PHPinfo di prova temporanea e verifica.

    =6 Installazione di MySQL (LAMP: Linux Apache MySQL PHP).

    • Installazione dei pacchetti mediante APT.
    • MySQL usabile da PHP.
    • Gestione di MySQL mediante un apposito software, da remoto ma sempre in sicurezza.

    =7 WordPress (un caso di uso di LAMP).

    • Installazione download dal sito wordpress.org.
    • Prima configurazione.
    • Primi post.
    • Amministrazione quotidiana.
  • server gnulinux parte 1

    GNU/Linux è la base di molte Distro, Sistemi Operativi molti dei quali usati nei computer online, i computer server. I server hanno sistemi operativi adatti a operare come server, spesso come server web (HTML/HTTP) ma anche come server di gioco, di videoconferenza e altri usi.

    Nell’immagine sopra mostro come ho usato due servizi: Linode e Dynu. Linode pagandolo mi fornisce un computer sempre online a un indirizzo fisso, che è numerico e che posso usare più agevolmente come indirizzo non numerico (ad esempio “arkenidar.com” come indirizzo) mediante un sistema DNS, dei nomi.

    Mediante SSH posso amministrarlo, come accenno.

  • Files in Unix parte 4

    Nella parte 4 parlo dei files nascosti.

    Un file (che può anche essere un file di tipo directory) se inizia con un . (punto) allora non viene mostrato, tranne nei casi questo sia esplicitamente richiesto.

    ls di default, senza specificare -a (All, tutto) non mostra tutti i file. Invece ls specificando -a elenca tutti i files (files del percorso specificato, e se non specificato files della directory corrente).

  • Files in Unix parte 3

    BASH e i files: la directory corrente e il percorso per riferirsi a un file.

    I comandi (commands) menzionati negli articoli precedenti di questa serie (cp, mv, rm, mkdir) vengono eseguiti tipicamente all’interno di un’interfaccia testuale (ad esempio KDE/Konsole con shell GNU Bash).

    Di BASH ne è ho parlato poco ma la menziono perchè è questa che ci fornisce il concetto di “directory corrente” (del processo in esecuzione). Questa directory corrente è usata dai processi che vengono creati quando un comando viene messo in esecuzione (ad esempio digitato non parte, dando il tasto di nuovo rigo il comando parte mediante l’interpretazione del rigo di comando da parte di BASH, che è anche un processo genitore e il comando dato è un processo figlio creato dal genitore, gerarchicamente).

    Quindi… Se la directory corrente è la mia “home directory” (utente arkenidar quindi /home/arkenidar), se io creo un nuovo file vuoto con il comando touch così touch nomefile.txt il risultato è che viene fuori un file con questo nome completo: /home/arkenidar/nomefile.txt

    Questo vale anche per tutti i comandi usati da shell BASH. Ad esempio: rm nomefile.txt rimuove il file così chiamato cercandolo nella directory corrente.

    Se io faccio adesso rm percorso/nomefile.txt cercherà il file all’interno della directory percorso.

    Esistono anche dei riferimenti particolari in BASH e in Unix in genere: . (punto) e .. (punto punto).

    Lo spiego in pratica: al punto singolo viene sostituito il nome della directory corrente (ad esempio la directory home, ma con cd si fa un cambio directory).

    cd nomedirectory farà entrare nella sotto-directory nominata, mentre cd .. farà entrare nella directory appena superiore alla directory corrente, superiore di un livello, rendendo la directory superiore la directory corrente (quella immediatamente superiore, ma se ci fossero più directory superiori si può usare ancora il .. con ad esempio ../.. che indica sopra di due livelli).

    Questo forma il percorso di un file. Ad esempio a partire dalla directory radice (directory /) /home/arkenidar o a partire dalla directory corrente /home/arkenidar/sottodirectory: cd ../sottodirectory2 (che diventa quindi /home/arkenidar/sottodirectory2).

    NOTA: Vedendoli in azione questa spiegazione testuale può divenire più decodificabile. Scusate se non fornisco immagini o video in questo momento.

  • Files in Unix parte 2

    I files più particolari in questo articolo sono le directory (o cartelle, come vengono chiamate) che possono ospitare al loro interno dei files.

    Si scopre così la gerarchia di directories perchè ad esempio la directory / radice (root) contiene la directory home (/home) che contiene i files degli utenti (nel mio caso dell’utente arkenidar diventa: /home/arkenidar)

    Ma una directory oltre a contenere files di tipo directory può contenere solo files e nessuna cartella (quindi questa profondità non continua indefinitamente) o anche essere directory vuote (nessun contenuto in quel momento).

    Una directory viene creata con il comando mkdir. Ad esempio mkdir Schermate. Una directory viene creata col nome file specificato, ed è inizialmente vuota.

    Una directory può essere rimossa con rmdir che va usato così: rmdir -rf Schermate. Le opzioni r ed f sono spiegate nel manuale: man rmdir.

  • Files in Unix parte 1

    Articolo 1 della serie di articoli sui files in Unix e quindi GNU/Linux.

    I files vengono creati, hanno date di creazione e altro, occupano uno spazio nella memoria in base alla loro dimensione e hanno dei contenuti quindi.

    Ma la cosa più importante è che i files hanno un nome, che serve a indicarli, individuarli, a riconoscerli e a farci riferimento.

    Ad esempio un file può essere copiato (copy) così:

    cp [origine] [destinazione] (vedasi man cp)

    Ad esempio: cp pagina.html pagina2.html

    Ecco quindi che il nome della nuova copia sarà la destinazione, ovvero pagina2.html.

    Parentesi: Esiste un comando per evidenziare le differenze tra files: per esempio diff pagina.html pagina2.html non dovrebbe inizialmente mostrare differenze, poi se la copia verrà modificata, allora si che avrà differenze.

    Se si vuole che il file origine scompaia, e rimanga il file di destinazione allora quello che forse vi tornerà utile è il comando mv che muove (move), sposta, quindi senza creare una copia. È utile se ci pensate anche a cambiare nome a un file. Ad esempio mv pagina.html index.html.

    Per cancellare un file si può ad esempio usare rm (remove) che sgancia un file dal filesystem che quindi va perso pur non essendo fisicamente sovrascritto ancora (vedasi i tools di wiping e implementazioni di filesystems che sono fuori da questa serie di articoli). Alcuni usano un posto dove conservare i file prima di rimuoverli definitivamente che nei Desktop Environment (Ambiente di Scrivania) viene chiamato Cestino (metafore fisiche di Scrivania e Cestino). Ma questi comandi come rm non ne tengono particolare conto, perché precedono concettualmente l’avvento degli ambienti grafici e sono rimasti fedeli a quello stile. Se volete mantenete delle copie voi stessi con procedure apposite (come ad esempio i backups, fuori dalle tematiche dell’articolo).

    Comandi cp, mv, rm. E con questo esempio di operazioni sui files di: copia, spostamento (e rinominazione), e cancellazione (senza passare dal Cestino), chiudo questo articolo di weblog e ci orientiamo verso i successivi in senso cronologico e di praticità. Ad esempio non sappiamo niente ancora su files speciali (ad esempio i files nascosti e le directory/cartelle).

  • Linux da ISO

    Debian&KDE: Setting up a Debian10(codenamed:Buster) with KDE-Plasma (as DE)

    A new operating system: Debian, side by side with others like Microsoft Windows.

    Trick: (the ISO format was originally for CDs and DVDs, so you can write the ISO files there, in case)

    BEGIN with a Download the ISO image file (for installing it)

    https://cdimage.debian.org/cdimage/unofficial/non-free/cd-including-firmware/

    1. The choice of “non-free”. First thing select a “non-free” version that means that it contains also Wi-Fi drivers(firmware), useful when you want of course to use Wi-Fi.
    2. The choice of a “live ISO image” so you can try it before installing: https://cdimage.debian.org/cdimage/unofficial/non-free/cd-including-firmware/current-live/
    3. The choice of CPU type: https://cdimage.debian.org/cdimage/unofficial/non-free/cd-including-firmware/current-live/amd64/
    4. The choice of download type: https://cdimage.debian.org/cdimage/unofficial/non-free/cd-including-firmware/current-live/amd64/iso-hybrid/
    5. The choice of DE (KDE Plasma), search KDE .ISO: https://cdimage.debian.org/cdimage/unofficial/non-free/cd-including-firmware/current-live/amd64/iso-hybrid/debian-live-10.9.0-amd64-kde+nonfree.iso

    THEN having the ISO file “flash” it with Etcher

    https://www.balena.io/etcher/ Use Etcher to flash the chosen ISO file to USB Flash Drives or SD Cards (removable storage). This removable storage once flashed can start a live OS that can be tried and/or installed on the main storage, in a disk partition. (Be sure to understand the concept of Partition, so you preserve what you eventually want to preserve and yet find room for installing a new Operating System, O.S. like the one you already have possibly, Windows. I use both!).

    FINALLY boot the computer from the flashed memory with the new OS to “try it and install it”

    (you can refer to YouTube videos from now on, here I focused on 1- selecting the proper ISO file giving you also freedom of choice by means of understanding and room for further exploration especially in terms of DE, Desktop Environments like KDE Plasma and so on) 2- writing the ISO file to external disk to boot from it and try it and install it


    These commands tweaked and used from a proper bash terminal allow to:
    ## get the ISO file by HTTP download
    wget https://cdimage.debian.org/cdimage/unofficial/non-free/cd-including-firmware/current-live/amd64/iso-hybrid/debian-live-10.9.0-amd64-kde+nonfree.iso ## download the ISO file mentioned by means of “wget” command
    ## write the ISO file to external disk (/dev/sdb???) to start it after powering the computer of course if external disk is 1-inserted and 2-selected
    sudo dd if=debian-live-10.9.0-amd64-kde+nonfree.iso of=/dev/sdb bs=4M status=progress && sync && echo “@@@ ALL IS OK! successful…” ## alternative to Etcher


    (writing in progress)

  • rsync per gestire i files

    Rsync permette di sincronizzare i files tra due posizioni anche tra locale e remoto e viceversa.

    devtool: rsync https://docs.google.com/document/d/1UFmfLRkGh0yY-OWlgmtYjkDYTWisEmf_jVhLmiJeumg/edit?usp=sharing

  • java: zenity vs System.console()

    In Java si può anche usare zenity così (vedi sotto) nel momento in cui System.console() non è disponibile (not available). Ad esempio se il processo è in esecuzione da un IDE (e non da terminale apposito, alternativa anche questa).

    Naturalmente zenity va installato (per essere richiamabile come da console).

    /*
    Console console = System.console();
    if (console == null) { System.out.println("No console available"); return; }
    else System.out.println("console available! (debug info)");
    String line = console.readLine("");
    */
    
    String line="<error: uninitialized line input>";
    try {
        Process process = Runtime.getRuntime().exec("zenity --entry");
        InputStream inputStream = process.getInputStream();
        Stream<String> lines = new BufferedReader(new InputStreamReader(inputStream)).lines();
        line = lines.collect(Collectors.joining("\n"));
    } catch (IOException e) {
        e.printStackTrace();
    }
    System.out.println(line);
    
  • Racket (Scheme system)

    This is a rectangular area calculation given its 4 vertices’ coordinates (axis-aligned). I had to do some research on various how-tos.

    #lang racket
    (define rect1 '( (1 1) (5 1) (1 -2) (5 -2) ) )
    (define xmin 'undefined)
    (define xmax 'undefined)
    (define ymin 'undefined)
    (define ymax 'undefined)
    (define (bounds point) (begin
       (void (let
           ( (x (list-ref point 0))
         (y (list-ref point 1)) )
         (begin
       (if (equal? xmin 'undefined) (set! xmin x) (if (< x xmin) (set! xmin x) '()) )
       (if (equal? xmax 'undefined) (set! xmax x) (if (> x xmax) (set! xmax x) '()) )
       (if (equal? ymin 'undefined) (set! ymin y) (if (< y ymin) (set! ymin y) '()) )
       (if (equal? ymax 'undefined) (set! ymax y) (if (> y ymax) (set! ymax y) '()) )
       )
         
       ) ) )
       )
    (bounds (list-ref rect1 0))
    (bounds (list-ref rect1 1))
    (bounds (list-ref rect1 2))
    (bounds (list-ref rect1 3))
    (list xmin xmax ymin ymax)
    (- xmax xmin)
    (- ymax ymin)
    (* (- xmax xmin)
    (- ymax ymin) )
    Welcome to DrRacket, version 7.4 [3m].
    Language: racket, with debugging; memory limit: 128 MB.
    '(1 5 -2 1)
    4
    3
    12
    > 
  • F# (functional on dotnet)

    https://fsharp.org/use/linux/

    https://fsharp.org/about/

    Out of curiosity mixed with desire to have the best programming tools starting with the best language possible and the best runtime possible (it mentions tooling software also)

    Evaluating it led me to the situation shown below:

    Further info:

    (bash) sudo rpm –import https://packages.microsoft.com/keys/microsoft.asc
    (bash) sudo wget -O /etc/yum.repos.d/microsoft-prod.repo https://packages.microsoft.com/config/fedora/33/prod.repo
    (bash) sudo dnf install dotnet-sdk-5.0

    … for current SDK (5) on Fedora 33

    https://docs.microsoft.com/en-us/dotnet/fsharp/get-started/get-started-vscode

    … for F# in VSCode first steps

  • https e golang

    “Go Language” HomePage at: https://go.dev/ (WAS: golang.org/)

    https://vk.com/wall341179603_5279

    package main 
     
    import( 
            "net/http" 
            "fmt" 
            "log" 
    ) 
     
    func main() { 
     
    // handle `/` route 
    http.HandleFunc( "/", func( res http.ResponseWriter, req *http.Request ) { 
            fmt.Fprint( res, "Hello World! (from GoLang's net/http)" ) 
    } ) 
     
    // run server on port 443=https 80=http 
     
    // your DNS domain is not netop.info so change below accordingly 
    // these 2 files were generated by certbot 
    // https://golang.org/pkg/net/http/#ListenAndServeTLS 
     
    certFile:="/etc/letsencrypt/live/netop.info/fullchain.pem" 
    keyFile:="/etc/letsencrypt/live/netop.info/privkey.pem" 
    serverError:=http.ListenAndServeTLS(":443", certFile, keyFile, nil) 
    log.Fatal(serverError) 
     
    }
     
    
    curl https://netop.info
    https://netop.info
  • seguito concettuale della Turing Machine

    La macchina di Turing ha segnato a fondo il concetto di cosa sia un computer. I programmi venivano codificati come una lunghissima sequenza d’istruzioni. Tali sequenze vengono eseguite sequenzialmente, spostandosi in una casella a destra o a sinistra nel caso di un nastro magnetico. Nel caso di una memoria ad accesso arbitrario l’ordine di esecuzione delle istruzioni è “avanti per default” altrimenti salta verso una specifica istruzione anche non adiacente. Questo default consente ad esempio di risparmiare memoria cosa che non avviene in una mia variante RESM dove ogni istruzione ha due e sempre due istruzioni successive. Il processore e i linguaggi C-like hanno ovviamente preso la scelta del “avanti per default” + “salti qualora bisogni”. E così vengono in essere istruzioni quali il GOTO del BASIC e ancor prima il JUMP del linguaggio macchina di cui sono importanti specialmente le varianti condizionali ovvero che avvengono soltanto a particolari condizioni.

    Il GO TO, “vai a” … e la sequenza di istruzioni lineare divenne non lineare. Si pose il problema dello spaghetti code ovvero di tessiture indecifrabili di programmi che fecero nascere la programmazione strutturata che trovò la sua accettazione anche grazie al supporto nei linguaggi come Pascal e C …

    Come nota dell’autore io tendo a conservare i pezzi d’informazione che permettono una comprensione storica ed evolutiva.

    Queste sono le basi dei linguaggi e dei processori odierni. Nessuno ha mai pensato cose come rendere un programma non una sequenza d’istruzioni con salti, non una sequenza d istruzioni con salti disciplinati in gerarchie strutturate, ma un grafo di grafi ma non sarò io a introdurlo. In ogni caso vedo la necessità di mezzi visuali per definire i programmi. E non soltanto come testo decorato e “assistito” (come in VisualStudio con IntelliSense), ma come abbandono o integrazione della definizione di programmi mediante testo sequenziale, in oggetti grafici manipolabili e configurabili che esemplifichino il funzionamento del programma anche a fini di debug o refactoring. E già esistono varie notazioni e vari tipi di diagrammi ma non so perché i programmi debbano venire ancora scritti come files di testo semplice, poi elaborato.

  • il mio acronimo RESM

    A few introductory words

    [IT] concetto di computer minimo, avente istruzioni uniformi, implementato con circuito (hardware) e con interprete di questo tipo di istruzioni (software)

    [EN] concept of minimal computer, having uniform instructions, implemented with circuits (hardware) and with interpreter of this type of instructions (software)

    RawExecutionStep Machine also-known-as BitBitJumpJump

    https://arkenidar.github.io/resm_aka_bbjj/

    https://github.com/arkenidar/resm_aka_bbjj

  • TypeScript ed esperimenti

    Vorrei comunicare cioè mettere in comune alcune cose fonte di apprendimento, comprensione, varianti di vedute, design e implementazione di un software che capisce ed esegue delle istruzioni che classicamente è chiamato sistema di scripting ma dalle caratteristiche inusuali ad esempio una struttura gerarchica che contiene un programma divenuto quindi eseguibile.

    In altre parole è un interprete di scripts imperativi, il cui parsing è la notazione polacca adattata agli algoritmi, la cui intermediate representation è una lista di liste, la cui esecuzione è particolarmente semplice in modo anche che un programmatore possa agevolmente comprenderla e ragionarci, che sia bello da scrivere e riscrivere, capirlo e riscoprirlo, e che il computer possa operarci su agevolmente (sia sul codice sorgente che quello che ne segue come dicevo).

    Ci sono quindi 3 fasi: scrittura in notazione polacca ovvero prefissa, derivazione di un albero ovvero una gerarchia di istruzioni praticamente imperative e strutturate (vedasi la teoria sulla programmazione strutturata), ed infine il funzionamento basato sull’esecuzione della gerarchia di istruzioni.

    Può sembrare scarno ma ha obiettivi didattici (anche per me), vuole essere (come ho altrove detto spesso) un giocattolo ma con una sua logica e una sua eleganza di design.

    Ho studiato molti linguaggi di programmazione, da quelli di moda a quelli senza tempo, a quelli esoterici e sperimentali, a quelli con ferventi sostenitori a quelli con dietro un supporto di corporations e fondazioni no-profit (o viceversa).

    Domani vi parlerò meglio di questo esperimento per i più avanzati e patiti di TypeScript o anche JavaScript, quelli che hanno studiato “linguaggi interpretati e compilati” all’università, a quelli che ci hanno lavorato tanto coi linguaggi da avere una illuminazione sull’essenza sincretica delle varie religiosità delle rispettive communities che altro che illuminate a volte vedono competizione e conflitto.

    A domani, a presto, ai prossimi articoli di questo weblog.

  • LangForge

    La forgia dei linguaggi, dice il titolo. Parlo dei linguaggi per programmatori e programmi.

    Ne ho studiati vari e mi sono fatto delle idee sul come cambiare qualcosa di essi, per ottenerne di nuovi, magari quindi ibridizzando.

    Questo design, ovvero questa progettazione per la costruzione di linguaggi mi ha portato a produrre vari files tra cui i progetti:

    • pang in Lua … non versionato su Git/Github ma pubblicato in modo informale su arkenidar.com
    • js-pang in JS su github di arkenidar (arkenidar=io utente che scrivo)
    • structure-js in JS anch’esso nel mio GH, si differenzia in varie scelte di design tra cui la creazione di nodi gerarchici in cui strutturare le parole del linguaggio computazionale.
    • ah, e anche alcuni progettini che precedono tra cui livefunc e exec_lang.es e altri ancora come OISC

    Sugli OISC ovvero i One Instruction Set Computer sono da citare a mio avviso la Macchina di Turing storica e una sua mia rivisitazione quasi involontaria ma frutto di riflessioni sul come unificare le istruzioni, il progetto RawExecutionStepMachine: https://arkenidar.com/wordpress/2020/12/20/il-mio-acronimo-resm/

  • Rails (Ruby)

    rails generate controller Welcome index

    Welcome#index

    Find me in app/views/welcome/index.html.erb

    erb value: <%= 3*2 %>

    erb value: <%= @welcome_variable %>

    erb value: <%= params[:name] %>


    class WelcomeController < ApplicationController
    def index
    @welcome_variable=123
    @param=params[:name]
    end
    end

    <h1>Welcome#index</h1>
    <p>Find me in app/views/welcome/index.html.erb</p>
    
    erb value: <%= 3*2 %> <br>
    
    erb value: <%= @welcome_variable %> <br>
    
    erb value: <%= params[:name] %> <br>
    class WelcomeController < ApplicationController
      def index
          @welcome_variable=123
          @param=params[:name]
      end
    end
    rails generate controller Welcome index
  • demons.trations

    Dai tempi della prima arte elettronica sono state prodotte una quantità di produzioni artistiche, ma qui e oggi vi accennerò a un sottogenere multiforme e in evoluzione ma complessivamente chiamato “demoscene” popolarmente.

  • usi di SSH

    SSH è un sistema usato per interfacciarsi verso un altro computer in rete (detto gergalmente computer host).

    Permette:

    • accesso mediante shell che può essere di root (SuperUtente) o di un utente esistente creato specificato. es: ssh dario@arkenidar.com
    • permette l’esecuzione di un comando di testo o anche grafico (usante X11 o altro server grafico)
    • ssh -t root@arkenidar.com “python3” # esegue un comando con terminale (-t come terminal) in questo caso la REPL del linguaggio CPython
    • ssh -Yf root@arkenidar.com “PathFinder” #esegue un programma grafico in questo caso un filemanager

  • pacchetti installati senza APT

    Ecco che installando Dropbox (discussa altrove la sua utilizzabilità) ho dovuto fare un:

    sudo dpkg -i dropbox_2020.03.04_amd64.deb # .deb installato

    come SuperUtente il Debian Package *.deb viene installato (-i come install).

    Questo perchè non è nei repository. Più avanti scoprirete anche altri modi usati per distribuire il software, etc. (aggiornarlo etc etc)

    Nota: in casi di dipendenze di pacchetti non risolte un “sudo apt install -f” potrebbe Fixare. Annetto anche un “sudo apt autoremove” a volte torna utile nel rimuovere i pacchetti software non più richiesti (nessun pacchetto dipende da essi)

    sudo apt install ./zoom_amd64.deb è invece un esempio di come usare apt per installare un file *.deb

  • APT e gestione software

    APT è un software di gestione del sistema che permette di:

    • installare (anche reinstallare sopra)
    • disinstallare (mantenendo o rimuovendo la configurazione)
    • aggiornare (può conoscere versioni più recenti)
    • cercare (è un database ricercabile)

    … pacchetti software di tipo .deb (Debian) che vengono immagazzinati nei repository ad esempio di Ubuntu di Canonical per poi essere distribuiti, scaricati dagli utenti.

    APT è un comando presente anche in Debian oltre che Ubuntu, una questione di parentele e derivazioni (considerando Ubuntu figlia di Debian).

    Su altri sistemi ci sono software somiglianti negli intenti e funzionalità ma sono specifici. Ad esempio “dnf” in Fedora o persino “pkg” in Termux di Android come lontana somiglianza.

    In alcuni casi può persino occuparsi del salto di versione dell’intero sistema operativo ma per questo documentatevi prima adeguatamente.

    Quindi gestione del download, delle versioni e anche della composizione armoniosa dei vari pezzi per cui ad esempio se un pacchetto ne necessita un altro lo installa o a volte più liberalmente lo suggerisce soltanto.

    Esempio:

    sudo apt install apache2 libapache2-mod-php # apache + php

    Non installate software sconosciuto ma informatevi:

    apt show apache2 # mostra info su apache2, pacchetto APT

    man apt # pagine di manuale su APT

  • “console” e frammenti

    I progettisti dei programmi informatici ma anche altri usano ancora un modo classico di interagire con il computer: la “riga di comando” (in English “command line”).

    Questa shell testuale permette di operare mediante l’immissione e l’emissione di testi.

    ad esempio:

    devo clonare un repo Git:

    git clone https://github.com/arkenidar/quiz

    devo amministrare il server:

    ssh root@arkenidar.com

    ad esempio combinandoli:

    ssh root@arkenidar.com

    e sono nel server

    cd /var/www/html

    e sono nella root del webserver

    git clone https://github.com/arkenidar/quiz

    e il quiz PHP è accessibile dal server PHP:

    https://arkenidar.com/quiz/new/questions.php?set=1

    approfondimenti: uso di SSH, uso di RSYNC, uso di server locale magari di tipo LAMP, uso di linode.com come hosting, uso di Git e di Github magari anche.

  • da Felgo a QT a KDE

    kdevelop

    Immagine cliccabile per zoomare

    Benvenuti nell’esperienza. Premetto che ho una maggiore disinvoltura in alcuni campi per esperienza. Ma vorrei comunicare ciò che potrebbe essere uno stimolo ad una personale esperienza.

    Strade ci sono. Ci sono strade possibili perché le opzioni che valuto sono comunicanti ed in alcuni casi cooperanti.

    Storia di questa realtà. Nasce Unix, nasce GNU, nasce Linux, nascono le distro, nascono i desktop environment, nasce Qt di Trolltech, nasce KDE infine (un desktop enviroment basato su Qt per i sistemi operativi GNU/Linux e altri Unix).

    Mezzi. I mezzi per costruire Qt si basano sul C++, ma con QtQuick viene introdotto un livello di QML e JavaScript a fine di avere interfacce di buon design. Il design rimane importante tanto da meritare un tool apposito per i designer che collaborano però con in programmatori. I programmatori hanno la possibilità di scrivere dei programmi che girano quasi ovunque vogliano seguendo un ideale commerciale di praticità. Ma Qt non è solo Grafica Utente ma è anche interfacciamento mediante sensori, uso di database, di web services, etc.

    Parole chiave. KDevelop è un IDE per KDE. Mentre Felgo è una azienda che facilita lo sviluppo mobile, ma con dei costi. Insomma è possibile che vi siano vari attori tra coloro che muovono le scelte su ciò che è comune e su ciò che non lo è invece ed è proprio.

    KDE. Come ambiente desktop coesiste con altri, anche se qualche accortezza può essere necessaria affinché non si bisticcino nelle aree comuni. L’ho in prova in questo momento con KDE Plasma ed io ero un fan di Kubuntu già 10 anni fa prima di QtQuick e QML che fecero capolino per il mobile ed embedded, specialmente a schermini touch! (W WindowsCE)

    Felgo l’ho conosciuta come azienda che fornisce il reload live: https://felgo.com/qml-hot-reload-for-qt-with-felgo-live

    Ma la sua offerta è ampia. Ha un suo modello di business e partecipa con Qt (che è passata da TrollTech a Nokia a Digia, da quel che ricordo).

    Ma Qt è un progetto open-source e così è rimasto anche se si è affiancato un aspetto commerciale con un suo modello di business. Abbastanza da repellere i puristi del FOSS magari un po disinformati e fanatici. Lo dico perché lo ero e mi sto informando e conoscendo quello che potrebbe essere un sistema di qualità magari da adottare come propria specializzazione. Segue le news, sperimento, spingo i limiti per conoscerli, ma non soltanto valuto ma qualcosa apprendo e vedo cosa posso concretizzare pian piano che la strada è lunga e richiede uno sforzo di resistenza, non di velocità soltanto. 😉

  • Ciao Lettori!

    Benvenuto in questo sito personale strutturato con WordPress. Questo è il mio primo articolo. Parlerò e parlo di software, artistiche tematiche, codifica di sofware, amministrazione di sistema