Visualizzazioni Totali

TRA I PRIMI IN ITALIA A PARLARE DI BITCOIN (DAL 2012!): PER ESSERE SEMPRE AGGIORNATI SULLE NOVITA' TECNOLOGICHE DEL WEB SEGUITE LA PAGINA FACEBOOK (LINK A SINISTRA)
Visualizzazione post con etichetta Programmazione. Mostra tutti i post
Visualizzazione post con etichetta Programmazione. Mostra tutti i post

martedì 10 marzo 2026

I Migliori Libri su Trading, Investimenti, Cripto e Intelligenza Artificiale (Guida Completa)

Negli ultimi anni il mondo della finanza, della tecnologia e dell’intelligenza artificiale è cambiato più velocemente che mai. Tra mercati azionari, criptovalute, ETF, trading e AI, orientarsi può sembrare complesso, soprattutto per chi vuole costruire competenze solide, non è facile sapere da dove iniziare.
Uno dei modi migliori per sviluppare una comprensione profonda di questi ambiti è leggere i libri giusti. Esistono testi che hanno formato generazioni di investitori, trader, imprenditori e sviluppatori, offrendo principi fondamentali che rimangono validi anche nei mercati moderni.
In questa guida ho raccolto alcuni dei migliori libri su trading, investimenti, finanza personale, blockchain e intelligenza artificiale. La lista include sia classici intramontabili sia testi più tecnici dedicati a programmazione, machine learning e sviluppo di applicazioni AI.
Che tu voglia migliorare la tua mentalità finanziaria, imparare a valutare aziende, capire come funzionano Bitcoin e le criptovalute o esplorare il futuro degli AI agents, questi libri rappresentano un ottimo punto di partenza. Di seguito troverai una selezione organizzata per argomenti, con brevi descrizioni per aiutarti a scegliere i titoli più adatti ai tuoi interessi e al tuo livello di esperienza. Alcuni sono in italiano, altri solo in inglese.


BITCOIN, BLOCKCHAIN E CRYPTO TECHNOLOGY
Un approfondimento tecnico sul funzionamento di Bitcoin, che copre crittografia, transazioni, mining e architettura di rete.

Una spiegazione per principianti di Bitcoin, della tecnologia blockchain e del funzionamento delle criptovalute.

Programming Bitcoin (Jimmy Song) 
Una guida pratica per implementare i concetti chiave di Bitcoin in Python, imparando al contempo come funziona effettivamente il protocollo.

Ethereum - Blockchains, Digital Assets, Smart Contracts, DAO (Daniel Drescher)
Spiega i concetti di Ethereum e la logica alla base degli smart contract e delle organizzazioni autonome decentralizzate (DAO).

Mastering Ethereum (Andreas M. Antonopoulos, Gavin Wood)
Una guida a Ethereum pensata per gli sviluppatori, che include smart contract, EVM e applicazioni decentralizzate.

Introduzione pratica alla scrittura, al test e all'implementazione di smart contract utilizzando Solidity.

Insegna la programmazione in Rust con particolare attenzione alle prestazioni, alla sicurezza e allo sviluppo di sistemi.


CRYPTO INVESTING AND BITCOIN ECONOMICS
The Bitcoin Standard (Saifedean Ammous)
Analizza Bitcoin da una prospettiva economica, confrontandolo con i sistemi monetari storici e le banche centrali.

Digital Gold (Nathaniel Popper)
Una storia narrativa di Bitcoin e degli imprenditori, hacker e investitori che hanno contribuito a plasmare il settore.

Cryptoassets (Chris Burniske, Jack Tatar)
Un framework per comprendere e investire in criptovalute, token e asset basati su blockchain.


STOCK MARKET, ETF AND LONG TERM INVESTING
A Random Walk Down Wall Street (Burton G. Malkiel)
Spiega l'efficienza del mercato e perché l'investimento passivo tramite fondi indicizzati spesso batte il trading attivo.

The Intelligent Investor (Benjamin Graham)
Un libro fondamentale sul value investing, che enfatizza disciplina, margine di sicurezza e strategia a lungo termine.

Una guida pratica alla finanza personale, agli investimenti e alla gestione automatizzata del denaro.

How To Get Rich (Felix Dennis)
Una prospettiva schietta e non convenzionale sulla creazione di ricchezza, imprenditorialità e indipendenza finanziaria.

The Little Book of Common Sense Investing (John C. Bogle)
Introduce l'investimento in fondi indicizzati e spiega perché gli ETF a basso costo superano la maggior parte dei gestori attivi.

The Bogleheads' Guide to Investing (Taylor Larimore)
Una strategia semplice per investimenti a lungo termine che utilizza diversificazione, fondi indicizzati e un'allocazione disciplinata.

Si concentra sulla valutazione della gestione aziendale, del potenziale di crescita e dei vantaggi competitivi.

One Up On Wall Street (Peter Lynch)
Mostra come gli investitori individuali possono scoprire azioni promettenti prima degli analisti di Wall Street.

The Simple Path To Wealth (J. L. Collins)
Spiega come l'indipendenza finanziaria può essere raggiunta attraverso investimenti in fondi indicizzati.


FUNDAMENTAL ANALYSIS AND FINANCIAL STATEMENTS
The Interpretation of Financial Statements (Benjamin Graham, Spencer B. Meredith)
Un'introduzione alla lettura di bilanci e conti economici per valutare la salute finanziaria delle aziende.

Una guida pratica per comprendere e creare i bilanci utilizzati nell'analisi aziendale.
 

TRADING, TECHNICAL ANALYSIS AND MARKET STRATEGIES
Trading In The Zone (Mark Douglas)
Si concentra sulla psicologia del Trading e sulla mentalità necessaria per ottenere prestazioni costanti sui mercati finanziari.

A Beginner's Guide to Forex Trading (Matthew Driver)
Introduce le basi dei mercati valutari, dell'analisi tecnica e della gestione del rischio.

Un riferimento completo su analisi dei grafici, indicatori e tecniche di trading utilizzate nei mercati.

Market Wizards (Jack D. Schwager)
Interviste con i migliori trader che svelano le loro strategie, filosofie e principi di gestione del rischio.

The New Trading for a Living (Alexander Elder)
Combina psicologia del Trading, sistemi tecnici e money management in un approccio di Trading strutturato.

 

PSYCHOLOGY, DECISION MAKING AND MENTAL DISCIPLINE
The Psychology of Money (Morgan Housel)
Esplora come il comportamento e le emozioni influenzino le decisioni finanziarie più della pura conoscenza.

Mindset (Carol Dweck)
Introduce il concetto di mentalità fissa vs. mentalità di crescita e come influisce sull'apprendimento e sulle prestazioni.

The Four Agreements (Don Miguel Ruiz)
Un quadro filosofico incentrato sulla disciplina personale, il controllo emotivo e la chiarezza di pensiero.

12 Rules for Life (Jordan B. Peterson)
Un insieme di principi filosofici e psicologici volti a costruire disciplina e responsabilità. 


ECONOMICS AND MACRO UNDERSTANDING
Economics in One Lesson (Henry Hazlitt)
Un'introduzione classica al ragionamento economico e alle conseguenze indesiderate delle politiche governative.

 

BUSINESS, PRODUCTIVITY AND MANAGEMENT
The Goal (Eliyahu M. Goldratt)
Spiega la Teoria dei Vincoli attraverso una narrazione aziendale sul miglioramento dell'efficienza operativa.

Traction (Gino Wickman)
Fornisce un framework (EOS) per migliorare la disciplina organizzativa, la leadership e la crescita aziendale. 


PERSONAL FINANCE AND WEALTH STRATEGY
Rich Dad Poor Dad (Robert Kiyosaki)
Contrappone due mentalità finanziarie e sottolinea l'importanza degli investimenti e dell'educazione finanziaria.

Tax-Free Wealth (Tom Wheelwright)
Spiega come funzionano i sistemi fiscali e come investitori e imprenditori possono ridurre legalmente le tasse.

 

REAL ESTATE INVESTING
Spiega le metriche chiave utilizzate per valutare gli investimenti immobiliari e la redditività degli immobili in affitto. 

ARTIFICIAN INTELLIGENCE: CONCEPTS AND IMPACT
Artificial Intelligence: A Modern Approach (Stuart Russell)
Un'introduzione accademica completa all'intelligenza artificiale che copre algoritmi, ragionamento e apprendimento automatico.

Life 3.0 (Max Tegmark)
Esplora il futuro dell'intelligenza artificiale e il suo potenziale impatto sulla società e sull'umanità.

Superintelligence (Nick Bostrom)
Analizza i rischi e le possibilità a lungo termine dei sistemi di intelligenza artificiale altamente avanzati.

AI 2041 (Kai-Fu Lee)
Combina narrativa e analisi per illustrare come l'intelligenza artificiale potrebbe trasformare i settori industriali nei prossimi decenni.


MACHINE LEARNING AND DEEP LEARNING (PROGRAMMING)
Hands-On Machine Learning with Scikit-Learn, Keras and TensorFlow (Aurélien Géron)
Una guida pratica alla creazione di modelli di apprendimento automatico utilizzando Python e i framework di ML più diffusi.

Un'introduzione matematicamente rigorosa agli algoritmi di apprendimento automatico e ai modelli probabilistici.

Deep Learning (Ian Goodfellow)
Un libro di testo fondamentale che copre reti neurali, architetture di apprendimento profondo e tecniche di ottimizzazione.

LLM, AI AGENTS AND AI ENGINEERING
Building LLM Applications with LangChain (Harrison Chase)
Spiega come creare applicazioni utilizzando modelli linguistici "large", sistemi di recupero e agenti di IA.

AI Engineering (Chip Huyen)
Tratta le sfide ingegneristiche pratiche di creazione, distribuzione e manutenzione di sistemi di IA in produzione.

Si concentra sulla progettazione di pipeline di apprendimento automatico scalabili e di infrastrutture di apprendimento automatico reali.

Machine Learning Engineering (Andriy Burkov)
Introduce le pratiche ingegneristiche necessarie per distribuire e gestire modelli di apprendimento automatico in produzione.

domenica 26 novembre 2023

Come Creare Smart Contract Su Remix Ethereum (Solidity Deploy)

Remix Ethereum
è un ambiente di sviluppo integrato (IDE) utilizzato per semplificare lo sviluppo di smart contract su Ethereum (solidity). Per creare uno smart contract veloce (ricordo di scegliere la chain EVM switchando su Metamask in base a dove intendete sviluppare il contract):

-Create New File
-Scegliere il nome dello smart contract xxx.sol
-Scrivere il codice dello smart contract nel riquadro a destra
-Solidity Compiler (nel riquadro verticale all'estrema sinistra, terza icona) e Compile xxx.sol
-Deploy And Run Transactions (sempre riquadro verticale all'estrema sinistra, quarta icona) e su Environment settare Injected Provider - Metamask (leggerete il vostro address Metamask), infine Deploy (pagherete una commissione, in base alla chain che state utilizzando)

Tramite Deploy e Run Transactions è possibile distribuire i tuoi smart contract direttamente sulla blockchain Ethereum o di Layer2 (EVM). E' possibile simulare anche su blockchain scegliendo "Ambiente VM" (sempre su Environment). Inoltre, fornisce un'interfaccia per interagire con i contracts già esistenti, consentendoti di testare le funzionalità in modo interattivo. La gestione delle librerie può essere effettuata nella sezione "Solidity Compiler" sotto la scheda "Settings".
Sempre nel menù verticale, oltre al Debugger, è possibile trovare l'analizzatore statico di sicurezza: che include uno strumento di analisi statica che può aiutarti a identificare potenziali vulnerabilità di sicurezza nel tuo codice degli smart contract.


FUNZIONI DI BASE DI SOLIDITY
-Contratti: I contratti sono la base di Solidity e rappresentano le unità di codice autonomo sulla blockchain Ethereum.

contract MyContract {
    // Dichiarazioni e logica del contratto
}


-Variabili di stato: e variabili di stato conservano i dati permanenti all'interno del contratto.

uint256 public myVariable;


-Funzioni: Le funzioni eseguono logica specifica quando vengono chiamate.

function myFunction() public {
    // Logica della funzione
}


-Modificatori: i modificatori modificano il comportamento delle funzioni.

modifier onlyOwner() {
    require(msg.sender == owner, "Solo il proprietario può chiamare questa funzione");
    _;
}


-Eventi: gli eventi sono utilizzati per registrare e loggare le attività all'interno del contratto.

event LogEvent(address indexed sender, uint256 value);



-Mapping: i mapping sono strutture dati che associano chiavi a valori.

mapping(address => uint256) public balances;



-Pagamenti e trasferimenti: Solidity supporta l'invio e la ricezione di ETH.

function sendEther() public payable {
    // Ricevere ether
}


-Modelli di programmazione: Solidity supporta la programmazione ad oggetti, la programmazione procedurale e altri paradigmi.

struct Person {
    string name;
    uint256 age;
}


-Gestione delle eccezioni: utilizza require e revert per gestire situazioni di errore.

function myFunction() public {
    require(msg.sender == owner, "Permesso negato");
    // Logica della funzione
}


-ERC-20 Token (standard): Solidity è spesso utilizzato per creare token conformi allo standard ERC-20.

contract ERC20Token {
    mapping(address => uint256) public balances;

    function transfer(address to, uint256 amount) public {
        require(balances[msg.sender] >= amount, "Fondi insufficienti");
        balances[msg.sender] -= amount;
        balances[to] += amount;
    }
}


sabato 15 luglio 2023

Come Creare Uno Smart Contract Multi Firma (Gnosis Safe Proxy)

In questo articolo vedremo come creare un account multi-signature per address EVM (Ethereum, BNB Chain, Cronos Chain, Polygon, Avalanche, Fantom, etc). Si tratta di uno dei modi più sicuri per archiviare le tue criptovalute. Fondamentalmente con un account "ad unica firma", firmi una transazione e la invii. Con un account multi-firma è necessario che almeno 2 partecipanti su 3 firmino la transazione. Quali sono i vantaggi? È più difficile perdere la chiave privata o farsi rubare la liquidità. In realtà non si tratta di un wallet ma di uno smart contract chiamato Gnosis Safe Proxy (puoi controllarlo su explorer). Lo strumento con interfaccia grafica che ci permette di creare un account multi firma è chiamato appunto Gnosis Safe
Puoi importare un account (se ne hai già uno) o crearne uno nuovo. Premi su "Create New Safe", poi su "Connect" e connetti "Metamask". Puoi creare un account multi-firma con una dozzina di diverse blockchain EVM (puoi provare il tutto prima su una testnet, come Goerli). A questo punto devi impostare il nome dell'account, scegliere la blockchain e poi cliccare su "Next". Nella schermata successiva puoi aggiungere i vari indirizzi: il primo è quello di Metamask che hai appena collegato. Successivamente puoi aggiungere altri indirizzi e scegliere una soglia (se aggiungi 3 account, puoi ad esempio impostare una soglia minima di 2 firme: ovvero 2 portafogli su 3 devono firmare la transazione). Ti consiglio di creare un nuovo portafoglio. Quindi premi "Next" e conferma la firma su Metamask (pagherai la quota gas tramite il primo indirizzo). Una volta creato l'account, puoi premere "Start Using Safe". Nella dashboard su "Ovierview" vedrai l'indirizzo di ricezione dove puoi ricevere la tua criptovaluta (ti ricordo che si tratta di uno smart contract! Tuttavia riceve fondi come un normale portafoglio).

Nel menu a sinistra puoi leggere:

-Asset (e NFT)

-Transazioni

-Address Book

-App

Dopo aver inviato i fondi, puoi utilizzare questo portafoglio multi-firma in DeFi. In DeFi non puoi usare Metamask perché non ha il tuo indirizzo multi-firma. Devi utilizzare Wallet Connect. Ad esempio, se devi connetterti a PancakeSwap, Uniswap, ecc, premi "Connetti" e poi "Wallet Connect", a questo punto "Copy To Clipboard" e incollalo in App/Wallet Connect/Open su Gnosis Safe. Per ogni interazione che eseguirai, dovrai firmare la transazione almeno 2 volte, passando da un portafoglio all'altro (questa volta utilizzando Metamask). Puoi anche usarlo come "cold wallet", senza interagire in DeFi. Per spostare i fondi, torna su Gnosis Safe, premi su "New Transaction", imposta l'indirizzo a cui inviare la crypto, quindi premi su "Send Token". Per inviare i fondi: devi confermare con il primo wallet, poi tramite Metamask cambiare account, confermando con il secondo (servono 2 firme su 3. Se ne hai impostate 3, dovrai cambiare 3 volte). L'ultimo address paga le gas fee! I fondi non partono se non ci sono le firme necessarie!)

venerdì 16 giugno 2023

Migliori Linguaggi Di Programmazione Per Smart Contract (Blockchain)

Bitcoin è stato inventato per sostituire le banche, per eseguire pagamenti incensurabili, senza enti di controllo. Il decentramento ha portato alla creazione di smart contract che una volta eseguiti non prevedono l'intervento umano. L'accordo tra l'acquirente e il venditore è scritto in righe di codice, rendendo i contratti intelligenti affidabili. I dev utilizzano linguaggi di programmazione per programmare gli smart contract. Sebbene i linguaggi di programmazione famosi come C++, Java, Python, Go, Ruby, JavaScript, etc siano visti come i migliori, ne sono stati creati altri appositi quali Solidity, Move, Rust e Clarity. Gli smart contract richiedono linguaggi di programmazione creati ad hoc per semplificare le operazioni. Alcune blockchain utilizzano linguaggi "classici":

-EOS: C++
-NEO: C#
-Icon: Python
-Aion: Java

Altre blockchain usano delle varianti di questi che ne sfruttano l'infrastruttura, pur presentando qualche caratteristica diversa.




SOLIDITY (ETHEREUM, TRON E LE ALTRE EVM)
Solidity è un linguaggio di programmazione progettato da Gavin Wood (2014) specificamente progettato per sviluppare smart contract EVM (Ethereum, Avalanche, Fantom, Bnb Chain, etc) e Tron. Solidity è un codice di alto livello, leggibile dall'uomo, che lo scompone in istruzioni specifiche facilmente comprensibili per le macchine. Supporta oggetti, booleani, enumerazioni, interi, stringhe, array di byte e variabili di stato. Anche gli sviluppatori che non hanno esperienza con Solidity possono essere aiutati nello sviluppo, se sono esperti in JavaScript, Python e C++. Infatti, le basi di sviluppo blockchain di Solidity si coordinano con questi linguaggi di programmazione che sono abbastanza familiari. Esso è utilizzato per implementare smart contract nella virtual machine di Ethereum. Il codice di Solidity è scritto sull'EVM, convertito dal compilatore e poi eseguito dal processore. Esso è utilizzato per scrivere dapps anche su Tendermint (software open source per il lancio di blockchain su Cosmos).


CAIRO (ZK ROLLUP-STARK)
Si tratta di un linguaggio di programmazioni per blockchain utilizzato su un layer 2 ZK di tipo STARK. E' un linguaggio Turing completo, creato per scrivere codice dimostrabile, utilizzato per favorire decentralizzazione e progettare dapp sicure senza pagare cifre esorbitanti di gas ETH. Uno degli altri principali vantaggi di StarkNet rispetto a Ethereum è quello che è noto come Account Abstraction. Sulla rete Ethereum, la logica per la firma delle transazioni deve essere incorporata in un account. Tuttavia, su StarkNet, ogni account ha uno smart contract. Potrebbero esserci impostazioni controllate in modo modulare per cose come firme multiple, meccanica di ripristino e logica personalizzata per il gas (Immrsd.eth). Un altro vantaggio di Cairo è il modo in cui consente agli sviluppatori di sfruttare un linguaggio di programmazione non deterministico, secondo Astraly Analytics. Un algoritmo è deterministico quando può sempre produrre lo stesso output quando viene implementato un particolare input. Al contrario, un esempio di algoritmo non deterministico produrrebbe output diversi pur avendo lo stesso input.


RUST (SOLANA, POLKADOT, EGLD, NEAR)
Rust è usato principalmente per la scrittura di smart contract su Solana, Polkadot, Egld e Near. E' un linguaggio di programmazione vicino a quelli di basso livello quindi non proprio semplice, anche se non è molto dissimile da C++. Rust offre molte funzionalità come sicurezza della memoria, runtime ridotto, molte librerie, etc. Questo consente di scrivere un contratto intelligente compilato in wasm che non ha bug di memoria e consuma meno spazio di archiviazione sulla blockchain. Esso permette ai dev in grado di creare dapp personalizzabili e scalabili.

 
MOVE (APTOS, SUI NETWORK)
Creato per supportare la creazione di risorse digitali, Move è un linguaggio di programmazione bytecode open source, utilizzato per preservare la semplicità e allo stesso tempo supportare le complesse esigenze dell'infrastruttura degli smart contract. Basato su Rust, Move mira a sviluppare logiche di transazioni personalizzabili e contratti intelligenti per le blockchain Aptos e Sui Network. Move supporta booleani, riferimenti, interi a 64 bit senza segno, array di byte a dimensione fissa e indirizzi a 256 bit. Inoltre codifica la proprietà delle risorse digitali e crea procedure per il trasferimento di tali risorse. Esso affronta anche i problemi della rappresentazione indiretta introducendo risorse, un tipo personalizzabile ispirato alla logica lineare. Inoltre, ogni singola transazione ha uno script che è responsabile della codifica della logica che un validatore dovrebbe eseguire. Il linguaggio Move ha fondamentalmente tre componenti: Tipi, Strutture e Procedure. I tipi sono dati primitivi utilizzati in esso come Boolean, Integer, array di byte a dimensione fissa e tipo di dati di indirizzo. Gli struct sono fondamentalmente limitati e illimitati (strutture di risorse e strutture generali). Le procedure sono metodi semplici nel linguaggio di programmazione Move.


COSMWASM (COSMOS)
CosmWasm, abilita le macchine virtuali (VM) WebAssembly (WASM) in Cosmos SDK.
L'aggiunta di WebAssembly a Cosmos SDK consente al software di funzionare in modo sicuro su una blockchain. Wasm è un linguaggio intermedio che compila il codice dello sviluppatore in una macchina virtuale portatile. Questo prodotto consente agli sviluppatori di scrivere moduli in Rust che si integrano perfettamente con Cosmos SDK, in modo che possano sfruttare i moduli SDK e l'algoritmo di consenso BPoS Tendermint sviluppando una logica applicativa personalizzata in gran parte basata su Rust. In secondo luogo, la possibilità di caricare il codice nelle transazioni, anziché riavviare la catena, consente un'implementazione molto più rapida delle nuove funzionalità.


HASKELL (CARDANO)
Si tratta di un linguaggio di programmazione funzionale. Haskell ha le sue radici sia nel mondo accademico che nello studio della logica, e anche in precedenti iterazioni di linguaggi di programmazione funzionale, come Miranda. I linguaggi di programmazione funzionale pongono l'accento sull'utilizzo di funzioni "pure", ove possibile: funzioni che danno sempre lo stesso risultato per lo stesso input. Esso è adatto per codici e programmi che richiedono un alto grado di verifica formale. Attraverso Haskell, i contratti intelligenti Plutus e Marlowe di Cardano possono essere implementati con un codice preciso e formalmente verificato che offre un alto livello di garanzia sin dall'inizio. Plutus e Marlowe sono offerti come un insieme di librerie per Haskell, sfruttando la documentazione Haskell esistente, i toolkit e una comunità altamente professionale per fornire una base da cui partire per costruire contratti intelligenti sicuri e di livello aziendale.
Sia il codice off-chain che on-chain per Cardano è scritto in Haskell.


CLARITY (BLOCKSTACK)
Clarity è un linguaggio di programmazione smart contract introdotto da Blockstack per la propria blockchain Stacks. Blockstack mira a costruire la propria Internet, fornendo servizi di smart contract. Si tratta di un linguaggio di programmazione, progettato come "non completo" e "non destinato alla compilazione" (è un linguaggio interpretato). Clarity supporta i tipi Boolean, Optional, tuple, list, response e principal. Con l'aiuto della sua incompletezza di rotazione, Clarity è in grado di calcolare con largo anticipo le transazioni. In Clarity, il codice sorgente del contratto stesso viene pubblicato ed eseguito dai nodi blockchain, rimuovendo qualsiasi rappresentazione intermedia precompilata. Tramite funzioni di controllo riesce a ridurre anche eventuali bug. La prevedibilità consente ai dev di sapere come verrà eseguito il programma.


SCILLA (ZILLIQA)
Scilla (Smart Contract Intermediate-Level Lannguage) è un linguaggio per contratti intelligenti di livello intermedio sviluppato per la blockchain di Zilliqa. Esso è progettato come un linguaggio con il principale scopo della sicurezza degli smart contract.
Scilla impone una struttura agli smart contract che renderà le applicazioni meno vulnerabili agli attacchi eliminando alcune vulnerabilità note direttamente a livello linguistico. Inoltre, la struttura di principio di Scilla renderà le applicazioni intrinsecamente più sicure e suscettibili di verifica formale.
Il linguaggio viene sviluppato di pari passo con la formalizzazione della sua semantica ed è incorporato nell'assistente di prova Coq (uno strumento all'avanguardia per le prove meccanizzate sulle proprietà dei programmi). Coq si basa su una teoria avanzata della tipizzazione dipendente e presenta un ampio set di librerie matematiche. È stato applicato con successo in precedenza per implementare compilatori certificati (cioè completamente verificati meccanicamente), applicazioni simultanee e distribuite, incluse blockchain tra gli altri. Zilliqa utilizza lo sharding che gli conferisce scalabilità.


MICHELSON (TEZOS)
Questo linguaggio usato da Tezos è basato su stack, con primitive e tipi di dati di alto livello e un rigoroso controllo di tipo statico. Il suo design cherry raccoglie tratti da diverse famiglie linguistiche (Forth, Scheme, ML e Cat). Michelson è una serie di istruzioni eseguite in sequenza: ogni istruzione riceve in input lo stack risultante dall'istruzione precedente e lo riscrive per la successiva. Lo stack contiene sia valori immediati che strutture allocate nell'heap. Tutti i valori sono immutabili e Garbage Collection. I tipi dello stack di input e output sono fissi e monomorfici e il programma viene verificato prima di essere introdotto nel sistema. Nessuna esecuzione di smart contract può fallire perché un'istruzione è stata eseguita su uno stack di lunghezza o contenuto imprevisto.

sabato 11 dicembre 2021

Come Creare Una Criptovaluta (Guida Completa)

Nel 2021 siamo stati invasi dalle shitcoin: da Dogecoin a Safemoon. In seguito si sono aggiunte: Safemars, Elongate, Shiba Inu, Sanshu Inu, Hodl, Floki Inu, Baby Doge, Baby Shiba, Baby Floki, Baby Shiba Billionaire, etc
Perchè questa invasione di shitcoin e scam? Cos'è cambiato rispetto al passato? Sicuramente l'avvento della Binance Smart Chains ha permesso il proliferare di tutte queste shitcoin perchè è molto facile crearle ed è anche poco costoso (a differenza della blockchain di Ethereum).
Prima di tutto, vediamo la nostra "tabella di marcia" per avere successo e seguire il trend!

I trend che sono stati utilizzati in shitcoin e scam sono stati:
1) Memecoin ed in generale animali (i trend vanno e vengono, 1 anno fa, c'era quello inerente i cibi e le piattaforme di farming trainate da Yearn Finance)
2) Supply enorme (1.000.000.000.000.000)
3) Burn per ogni transazione (se acquisti, vendi, trasferisci)
4) Token distribuiti agli holders
5) Token aggiunti al LP per ogni transazione effettuata
6) Eventuale creazione di wallet, swap, NFT
7) Quotazione su CoinMarketCap e Coingecko
8) Listing sugli exchange (vengono pagati alcuni exchange di basso livello come Hotbit o Bkex)

Un sito per creare token è Cointool
Collega Metamask al sito con un po' di gas per pagare le commissioni (puoi usare BSC, Fantom, Polygon, Heco, Ethereum e il suo layer2 Arbitrum)

Quali parametri devo inserire?
1) Nome
2) Simbolo
3) Supply
4) Decimali (18)
5) Creatore / Proprietario (il tuo indirizzo)
6) Can Burn (se vuoi inserire un burn)
7) Can Mint (se è possibile creare altra supply)
8) Can Pause (è possibile bloccare lo smart contract)
9) Blacklist (posso bloccare alcuni indirizzi)
10) Deflation (abbassa la supply, grazie al Burn e mi aggiunge tutte le feature di sotto)
11) Transaction Fee
12) Burn Fee (% di Burn su ogni transazione)
13) Indirizzo di ricezione (chi riceve la commissione di transazione)
14) Distribuzione agli holders (se vogliamo dare una quota agli holders per ogni transazione bruciata)
15) Automatic LP (una certa percentuale di ogni operazione effettuata sul dex, ad esempio Uniswap o PancakeSwap, viene trasferita al pool di liquidità)
16) Transaction Tax (si riferisce solo alle trade effettuate, posso inserire un indirizzo)

Dopodiché posso fare "Create token". Ipotizziamo di usare la BSC. A questo punto il sito offre anche un'interessante funzione per aumentare gli holders del nostro token. Basta andare su "BSC Batch Wallet Generate" ed inserire il numero di wallet che si desidera creare! Otterremo un file CSV con indirizzi pubblici, chiavi private e seed.
Andando su "BSC Token MultiSender " posso avviare la distribuzione (airdrop). Tramite "upload" importo il mio file CSV e invio! Bene, avremo i nostri titolari! Il costo sarà di circa 300 $.
Se ho scelto PancakeSwap come dex, ora devo aggiungere la mia liquidità. Mi collego a PancakeSwap, vado su "liquidità" (a sinistra) e "aggiungo liquidità". Incollo il contratto del mio token e lo aggiungo. Nel pool devo aggiungere il mio token e altra liquidità (ad esempio 10.000 $ in BNB o BUSD). A questo punto posso anche generare dei "falsi volumi" con gli indirizzi a cui ho distribuito l'airdrop effettuando degli scambi tra il mio token e BNB. Posso spammare con Telegram, Twitter e altri social network.
Posso utilizzare anche un altro sito (più economico), ovvero DappBuilder. In questo caso scelgo la blockchain e collego Metamask. Poi le funzioni sono le solite: supply, burn, token deflazionari, iper-deflazionari, token con ref program, etc
Inserisco nome, supply, sent to andress (cioè l'indirizzo del mio Metamask), symbols, decimals (9 o 18) e create token. Confermata l'operazione su Metamask, sul sito otterrò l'address del mio token (contract).
Poi vado su PancakeSwap/Trade/Liquidity/Add Liquidity. Aggiungerò BNB e il mio token (indirizzo del contract). Ricordo che la liquidità dovrà essere 50 e 50%.
Sostanzialmente se 1 BNB vale 600$ ed io inserisco 600 token, vorrà dire che ogni mio token varrà 1$. Questo è il prezzo di partenza. Poi sarà la domanda e l'offerta a fare il resto. Ovviamente bisognerà aggiungere un po' di liquidità in BNB, altrimenti lo slippage sarà altissimo. Se non sai come funziona un dex vai qui: Come Funzionano I Dex (AMM-Automated Market Maker)
Se sei interessato a trovare nuove cripto, vai qui: Come Trovare Nuove Shitcoin Da 1000x

venerdì 16 aprile 2021

Cosa Sono I Files .Jar? Come Eseguirli?

I files .jar riguardano il linguaggio di programmazione Java (lanciato da Oracle negli anni 90) orientato agli oggetti e in particolare si tratta di un file di applicazione che può essere avviato o di un archivio (libreria con più file). L’estensione .jar è un’abbreviazione di "Java Archive" infatti. Quest' archivio contiene solitamente più file Java e metadati, che vengono compressi e inviati insieme (al suo interno posso trovare non solo file .jar, ma anche immagini, file audio e altri formati di file). La funzione è quindi comparabile ad un archivio zippato. Tali librerie vengono utilizzate per semplificare la programmazione di applicazioni e applet Java. L’archivio di meta informazioni (file di testo XML e file JSON inerenti Java entrambi apribili con il blocco note), grafici ed audio può essere integrato come elemento in altri progetti. Archivio può contenere anche un file eseguibile. 


SOFTWARE DI DECOMRPESSIONE DELL'ARCHIVIO
Per avere accesso all'archivio Java si deve effettuare l’estrazione dei file della libreria. Per farlo, basta utilizzare WinRAR, WinZip, 7-Zip, WinAce, IZArc2Go o HaoZip (che supporta 50 formati file). 
Se avete installato uno di questi programmi potete estrarre il file .jar. A tal fine potete aprire il programma di compressione installato, scegliete di seguito il file .jar tramite il percorso del file o trascinatelo direttamente nel programma. Poi fate "estrai".
Oppure con il tasto destro sul file .jar, di seguito selezionate l’opzione "apri con" scegliendo WinRAR o WinZip o un altro menzionato prima.
Fatto ciò, sarà possibile aprire la cartella con un doppio clic. All’interno saranno elencati tutti i file contenuti. Tramite l’estensione riconoscerete il tipo di file e saprete se potete aprire i file stessi: se si tratta dei formati comuni basterà un doppio clic per aprirli. Per selezionare un altro programma per l’estrazione, aprire il menu a comparsa con un clic del tasto destro sul file, di seguito cliccate con il tasto sinistro sull’opzione "apri con" e selezionate il programma desiderato.


ESEGUIBILE
Nel caso in cui nell’archivio Java si trovino dei file .jar eseguibili, o se il file stesso è eseguibile, è necessario un programma apposito per farlo partire. Il comune Java Runtime Environment (JRE) è disponibile per essere scaricato gratuitamente per i sistemi operativi Windows e macOS dal sito Internet di Java: Jave (Download)
Per eseguire files jar è possibile utilizzare l'utility: Jarx (Download). Se si desidera eseguire direttamente il file all'interno di Java Runtime Environment, schiacciare sempre su "proprietà", "apri con" e selezionare java.exe .

domenica 12 luglio 2020

La Conversione Dei Numeri Binari-Decimali e La Logica Di Boole (AND, OR, XOR, NOT)

Scopo dell'articolo non vuole essere quello di sostituire i libri di testo quanto quello di dare una veloce infarinatura sui numeri binari vedendo velocemente la logica di Boole e la loro rappresentazione (e conversione con i decimali).


LOGICA
Il linguaggio dei computer prevede un universo fatto solo di due numeri: 0 e 1. Per convenzione lo 0 indica "falso" (false/off) e l'1 "vero" (true/on). In gergo si parla di operatori booleani. Esistono anche il NAND (AND negato), NOR (OR negato), XNOR (XOR negato). In generale quest'algebra viene utilizzata per reti e circuiti (molto utile a livello di tensioni).
NOT rappresenta la negazione, AND la congiunzione, OR la disgiunzione inclusiva e XOR quella esclusiva.



DA DECIMALE A BINARIO
Per passare da sistema decimale a binario bisogna dividere il nostro numero per 2 e così ogni risultato ottenuto sino ad ottenere come quoziente lo 0. Per ogni divisione dobbiamo appuntarci il resto (1 o 0) e poi trascriverlo dal basso verso l'altro ottenendo il nostro numero binario.

Numero 13 (Esempio)
13:2=6 con resto di 1
6:2=3 con resto di 0
3:2=1 con resto di 1
1:2=0 con resto di 1

Avremo quindi 1101

Numero 66 (Esempio)
66:2=33 con resto di 0
33:2=16 con resto di 1
16:2=8 con resto di 0
8:2=4 con resto di 0
4:2=2 con resto di 0
2:2=1 con resto di 0
1:2=0 con resto di 1

Avremo quindi 1000010


DA BINARIO A DECIMALE
Abbiamo il nostro numero binario e partendo da destra verso sinistra lo moltiplichiamo per potenze di 2. Poi sommando tutti i risultati otterremo il corrispettivo numero decimale.

Numero 100 (Esempio)
0x2^0=0 (cioè 0 per 2 elevato alla 0)
0x2^1=0
1x2^2=4

0+0+4=4


Numero 10100 (Esempio)
0x2^0=0
0x2^1=0
1x2^2=4
0x2^3=0
1x2^4=16

0+0+4+0+16=20

venerdì 2 novembre 2018

Funzionamento Della Programmazione a Blocchi o Visuale: Software Migliori

La programmazione a blocchi o visuale, è il modo più facile per avvicinarsi al coding quindi alla "programmazione". Con la programmazione a blocchi si possono anche programmare i robot, grazie ad app e software intuitivi, facili da capire e usare. Il coding consente di apprendere le basi della programmazione informatica, aiuta a sviluppare la logica, stimola la creatività ed educa al pensiero computazionale, a ragionare su problemi concreti e sulla loro risoluzione. La programmazione a blocchi è un metodo di programmazione visuale (quindi diversa dalla più nota programmazione testuale). In poche parole basta manipolare degli oggetti, spostare degli elementi sullo schermo del tuo PC e l'app è bella che pronta. Tramite ciò è possibile creare giochi, animazioni, storie interattive, sequenze musicali ma può anche essere usata per programmare un robot, per fargli compiere determinati movimenti e comportamenti, per aggiungere delle nuove abilità a un androide.
Il tutto senza scrivere codici. Basta spostare e ordinare in sequenza una serie di blocchi o oggetti grafici su un monitor, come se fossero i pezzi di un puzzle. A ogni mattoncino corrisponde un comando, un’istruzione che non ha bisogno di essere digitata.


SCRATCH
Scratch è un ambiente di programmazione a blocchi per il coding e la robotica educativa che consente di realizzare giochi e storie interattive in modo intuitivo. Assemblando i blocchetti sullo schermo puoi far muovere un personaggio virtuale a tuo piacimento. Puoi farlo muovere, ballare, personalizzarne l’aspetto oppure puoi creare immagini che ruotano e si animano in base alla musica.
Sito ufficiale: Scratch


GOOGLE BLOCKY
Blockly è un ambiente di programmazione visuale simile a Scratch.
Anche in questo caso, devi spostare e unire dei blocchi colorati di forme e dimensioni diverse per completare una serie di missioni: uscire da un labirinto, colpire un bersaglio con un cannone, disegnare figure geometriche, etc Di Blockly esiste anche una versione in italiano.
Sito ufficiale: Blockly


ARDUBLOCK
Ardublock è un ambiente per la programmazione a blocchi specifico per Arduino.
Per utilizzarlo è necessario installare Arduino IDE sul computer, un software che consente di scrivere codice informatico in maniera semplice e intuitiva. Il meccanismo di funzionamento è analogo a quello di Blockly e Scratch. In più con Ardublock, ogni volta che sposti un mattoncino, puoi visualizzare la riga di codice corrispondente in una finestra a parte del programma.
Sito ufficiale: Ardublock


CHOREGRAPHE
Questo software permette di programmare i comportamenti di Nao robot, robot Pepper e Romeo robot, i tre robot umanoidi realizzati da SoftBank Robotics.
Sito ufficiale: Choregraphe


MIT APP INVENTOR 2
Con App Inventor 2 lo sviluppo dell’interfaccia grafica e del codice a blocchi di una applicazione viene effettuato interamente nel browser web, ma per eseguirla bisogna compilare ogni volta l’applicazione e trasferirla su un cellulare o un tablet Android.
Per saperne di più: Guida App Inventor 2


SITO ONLINE PER IL CODING
Code.org è una piattaforma online, gratuita, che offre la possibilità a insegnanti e bambini da 4 anni in su di “giocare” con la programmazione. Sul sito sono disponibili una serie di esercizi incentrati sull’uso della programmazione visuale.


Altri software e siti per programmare: Mamamo: Software ed App Per Programmare a Blocchi

sabato 14 luglio 2018

Dal Linguaggio Macchina All'Assembly: Istruzioni Principali

Per rendere più facile la vita al programmatore, ad ogni istruzione linguaggio macchina (ovvero una lunga sequenza di 0 ed 1) è stato dato un nome simbolico mnemonico.
L'insieme dei codici mnemonici prende il nome di linguaggio "assembly".
Il programma in assembly può essere scritto con un qualsiasi editor di testo (come il blocco note di Windows).
Tramite un programma assemblatore (assembler) poi si convertono le istruzioni assembly in codice macchina direttamente eseguibile.
Per ogni istruzione assembly esiste una sola sequenza binaria in codice macchina.
In generale un programma scritto in linguaggio macchina usa poca memoria, è veloce nell'esecuzione perchè può accedere completamente alle risorse fornite dal micro.
Ovviamente l'assembly ha diversi svantaggi, che sono di solito quelli che spingono ad utilizzare linguaggi di alto livello come il C, Cobol, Fortran o il Basic: i programmi sono più difficili da scrivere, interpretare e correggere, richiedono molte istruzioni anche per effettuare operazioni semplici, ed è molto difficoltoso effettuare calcoli.
In questo articolo (assolutamente non esaustivo) vedremo le principali istruzioni assembly.


HARDWARE
Essendo l'assembly strettamente legato all'hardware, le sue istruzioni risentono dei limiti (o delle potenzialità) offerte dall'hardware stesso.
Una minima conoscenza dell'hardware è quindi indispensabile.
Ad esempio micro con architettura a 8 bit possono lavorare direttamente solo con numeri rappresentabili in 8 bit (valori compresi tra 0 e 255).
Hanno inoltre una memoria per le istruzioni del programma separata dalla memoria dati (RAM).
La prima è di tipo flash, riprogrammabile elettricamente.
La RAM invece contiene tutte le informazioni di lavoro necessarie durante l'esecuzione del programma, ma a differenza della prima si cancella ogni volta che il computer viene spento.
In questi micro ogni cella della RAM può essere pensata come un registro a 8 bit in cui salvare e leggere i nostri dati.
Le locazioni di memoria, sia programma che dati, hanno un indirizzo crescente che parte da 0.
In particolare le prime locazioni della RAM prendono il nome di SFR (special function registers), e servono per controllare il funzionamento dell'hardware.
Attraverso i registri della sezione SFR si possono anche attivare ed usare le diverse periferiche interne, come i timers, il convertitore analogico/digitale (ADC), la memoria EEPROM, etc
Le aree di memoria su cui si può agire da programma sono i registri della memoria dati e il registro accumulatore W, che non fa parte dell'area dati ma è un ulteriore registro hardware specializzato, usato nelle operazioni aritmetico logiche.
La RAM è inoltre suddivisa in due o più banchi quindi durante l'esecuzione di un programma è importante sapere sempre quale banco si sta utilizzando.


LINGUAGGIO MACCHINA E ASSEMBLER
Il linguaggio macchina è quanto di più vicino ci sia all'hardware.
Dal punto di vista fisico ogni istruzione è una sequenza binaria di livelli elettrici in grado di attivare in modi differenti i circuiti interni.
Le istruzioni assembler sono solo una forma mnemonica comoda per descrivere  le sequenze binarie che danno luogo alle funzioni logiche che vogliamo far eseguire al micro, tra tutte quelle che è fisicamente in grado di eseguire.
Le istruzioni sono le operazioni elementari che è possibile usare per manipolare i bit delle sue informazioni in modo da arrivare al risultato voluto.
In particolare però le istruzioni aritmetiche considerano effettivamente i registri come byte (8 bit)  che contengono un valore numerico da 0 a 255 codificato in forma binaria.


SISTEMA DECIMALE, BINARIO, ESADECIMALE
Riguardo al sistema usato, al posto del canonico sistema decimale con potenze di 10 (1, 10, 100, etc) abbiamo potenze di 2 (1,2,4 etc) e le cifre invece di poter assumere valori da 0 a 9 possono essere solo 0 e 1 (da qui il nome bit: binary digit).
La cifra meno significativa è chiamata D0 o bit 0  (LSB) e ha peso 1, quella più significativa è chiamata  D7 o bit 7 (MSB) ed ha peso 128.
Si può calcolare che se tutti i bit fossero a 1 la somma darebbe esattamente 255, cioè il massimo valore codificabile con 8 bit.
Abbiamo una terza rappresentazione quella esadecimale che è molto usata perché una cifra (digit) esadecimale rappresenta esattamente 4 bit binari (un nibble).
Con due cifre esa da 00 a FF si rappresenta l'intero range di valori codificabili con 8 bit (1 byte).
Le cifre possono assumere tutti i valori compresi tra 0 e 15, e i valori tra 10 e 15 vengono indicati con le lettere dalla A alla F.
L'esadecimale è molto usato per rappresentare in modo compatto i valori binari contenuti in memoria e il valore degli indirizzi di memoria, e anche perché permette di passare rapidamente alla notazione binaria.
In questo caso si tratta solo di convenzioni (come lo sono anche quelle dei linguaggi di alto livello, come il C, C++, Cobol, Java, Javascript, Fortran, etc) create per facilitarci la lettura dei valori e la scrittura del programma, i circuiti del micro a livello fisico lavorano solo e sempre con livelli binari, cioè assenza o presenza di tensione.


ASSEGNAZIONE DI VALORI
La prima importante categoria di istruzioni è composta perciò da quelle istruzioni che permettono di assegnare valori ben precisi ai registri, e di spostare questi valori da un registro all'altro.
Per esempio l'istruzione

       MOVLW    174

fa assumere all'accumulatore W il valore 174 (binario 10101110).
Siccome l'assemblatore accetta anche numeri scritti direttamente in binario o in esadecimale è possibile scrivere anche:

       MOVLW    10101110B
       MOVLW    0xAE
       MOVLW    0AEh

Il PIC 16F628 nel banco RAM 0 dispone di un'area dati liberamente usabile per memorizzare i propri valori, quest'area parte dall'indirizzo  32 (20h). Quindi se supponiamo che sia attivo il banco 0 e vogliamo trasferire il contenuto dell'accumulatore nella cella (registro) 32 dobbiamo scrivere:

       MOVWF    32

Sarebbe molto scomodo però doversi ricordare a memoria gli indirizzi di tutte le celle che ci interessa usare, per facilitare il compito l'assemblatore accetta la definizione di un nome simbolico per i valori e gli indirizzi usati nel programma tramite la "direttiva di compilazione" EQU:

     DARKSPACE  EQU      32

     MOVWF    DARKSPACE

In questo modo è possibile assegnare un nome comodo da ricordare (DARKSPACE) ad ogni cella.
Come si può vedere non esiste alcun modo per assegnare in un colpo solo un valore ad un registro, ma occorre sempre passare per l'accumulatore usando quindi due istruzioni.



ESEMPIO PROGRAMMA
La prima parte del programma è detta header e contiene informazioni specifiche per l'assemblatore.
Il programma vero e proprio è composto solo dalle 6 righe centrali racchiuse tra la testata e l'end finale. Nella testata si indica all'assemblatore il tipo di micro usato, la base di default in cui vanno considerati scritti i numeri, si include un file di definizioni EQU che permette di assegnare automaticamente un nome a tutti i registri di uso comune (come per esempio TRISB e STATUS), si definisce la configurazione hardware per il funzionamento del micro (in questo caso per esempio si predispone il funzionamento con clock interno a 4MHz, 16 pin di I/O e WDT disattivato).
Org 0 indica l'indirizzo di partenza a cui andranno caricate le istruzioni nella memoria programma (il micro all'accensione inizia ad eseguire le istruzioni partendo dall'indirizzo 0), e l' END finale indica all'assemblatore la fine del programma.

    PROCESSOR 16F628
    RADIX  DEC
    INCLUDE "P16F628.INC"
    __CONFIG  11110100010000B
    ORG  0

    BSF STATUS,RP0; Attiva banco 1
    CLRF TRISB; Rende PORTB un'uscita
    BCF STATUS,RP0; Ritorna al banco 0
    MOVLW 10101110B; Carica 174 nell'accumulatore
    MOVWF PORTB ; Mandalo sui pin di uscita
    SLEEP; Stop programma

    END

Se il programma funziona, appena si fornisce alimentazione i LED devono accendersi coerentemente al valore binario impostato in W, rammentando che la cifra meno significativa (LSB) si trova sul pin RB0, mentre quella più significativa (MSB) su RB7.
Un gruppo di 4 bit si chiama nibble.


ISTRUZIONI
L'istruzione SWAPF scambia tra di loro i 4 bit meno significativi di un registro con quelli più significativi.
Anche in questo caso il risultato può essere rimesso nel registro di partenza oppure in W a seconda del valore che si da al parametro d.
Le istruzioni MOVLW e MOVWF non alterano il flag Z.
L'istruzione MOVF invece modifica il flag Z, che risulta settato (s=set=1) se il valore caricato è 0, e resettato (c=clear=0) negli altri casi.
Una MOVF può trasferire il valore nella stessa locazione da cui viene letto, il suo valore perciò non cambia, ma, visto che il flag Z viene modificato, è un modo rapido per verificare se contiene zero.
L' istruzione SWAPF scambia i nibbles (i 4 bit superiori e i 4 bit inferiori) di un registro, e deposita il risultato nell'accumulatore o nella locazione stessa da cui è stao prelevato.
Le istruzioni CLRF e CLRW permettono un caricamento diretto del valore 0 in una locazione dati o nell'accumulatore.

ADDLW  n  C Z  W = W + n
ADDWF  reg,d   C Z d = W + (reg)
SUBLW  n  C Z W = n - W
SUBWF  reg,d  C Z d = (reg) - W
INCF   reg,d    Z d = (reg) + 1
DECF   reg,d    Z  d = (reg) - 1

La seconda grande categoria di istruzioni è quella aritmetica, grazie ad esse il micro ha la possibilità di effettuare dei calcoli o di confrontare dei valori.
I PIC delle famiglie 12F e 16F sono in grado di sommare, sottrarre, incrementare e decrementare valori a 8 bit (compresi tra 0 e 255).
La prima, somma semplicemente un valore "n" (compreso tra 0 e 255) all'accumulatore W.
La seconda invece somma l'accumulatore con un registro, e il risultato viene come sempre posto dove specificato con il parametro d.
Le istruzioni di sottrazione sono un pò diverse da quelle di altri tipi di assembly, infatti qui è sempre l'accumulatore ad essere sottratto:

      SUBLW 15           significa: W = 15 - W
      SUBWF DARKSPACE,W      significa: W = DARKSPACE - W
      SUBWF DARKSPACE,F      significa: DARKSPACE = DARKSPACE - W

Le ultime due istruzioni (INCF e DECF) incrementano o decrementano di 1 il valore contenuto nel registro specificato, il risultato viene posto dove specificato con d.
Queste istruzioni settano flag Z se il risultato dell'operazione è 0.

   MOVLW   200       Carica 200 nell'accumulatore
   MOVWF   DARKSPACE    Lo mette nel registro DARKSPACE
   MOVLW   170       Carica 170 nell'accumulatore
   ADDWF   DARKSPACE,W   Lo somma con il valore di DARKSPACE
   MOVWF   PORTB     Lo manda sui pin di uscita

Per quanto riguarda le istruzione logiche:

ANDLW  n  Z  W = W AND n
ANDWF  reg,d   Z  d = W AND (reg)
IORLW  n  Z  W = W OR n
IORWF  reg,d  Z  d = W OR (reg)
XORLW  n  Z  W = W XOR n
XORWF  reg,d  Z d = W XOR (reg)
COMF   reg,d  Z  d = NOT (reg)

Queste istruzioni sono quelle che forse più assomigliano alle funzioni svolte dai comuni circuiti logici, ed in effetti a livello hardware si comportano proprio come delle semplici porte logiche che operano sui bit dei registri o dell'accumulatore.
Tutte le istruzioni a parte l'ultima richiedono due operandi su cui effettuare l'operazione logica.
Gli operandi possono essere l'accumulatore e un valore numerico diretto "n", oppure l'accumulatore e un registro, in questo caso  naturalmente va specificata la destinazione con il parametro d.
Sfruttando le caratteristiche dell'operazione logica XOR è possibile evitare l'uso di registri temporanei e ridurre le istruzioni necessarie solamente a 3:

   XORWF   DARKSPACE,F
   XORWF   DARKSPACE,W
   XORWF   DARKSPACE,F

La prima non altera il valore di W, ma in DARKSPACE si viene a trovare il risultato di DARKSPACE XOR W. La seconda effettua di nuovo uno XOR tra W e DARKSPACE, il risultato è perciò complessivamente DARKSPACE XOR W XOR W, cioè il valore inizialmente contenuto in DARKSPACE, che viene tenuto in W. Infine si effettua un terzo XOR tra DARKSPACE (che contiene sempre l'iniziale DARKSPACE XOR W) e W che contiene il valore iniziale di DARKSPACE, il risultato dell'operazione è complessivamente DARKSPACE XOR W XOR DARKSPACE, che è perciò il valore iniziale di W che viene salvato in DARKSPACE.
Così facendo i due valori hanno così cambiato di posto.
Sfruttando lo stesso principio è possibile anche scambiare tra di loro il valore di due registri (cioè REG1 e REG2) senza usarne altri di appoggio:

   MOVF    REG1,W
   XORWF   REG2,F
   XORWF   REG2,W
   XORWF   REG2,F
   MOVWF   REG1

Infine vediamo le funzioni RLF, RRF, BCF e BSF:
RLF   reg,d   C  d = rlf (reg)
RRF   reg,d  C   d = rrf (reg)
BCF   reg,b Bit b di (reg) = 0
BSF   reg,b Bit b di (reg) = 1

Le istruzioni RLF e RRF ruotano rispettivamente a sinistra o a destra i bit contenuti in un registro.
Il risultato è depositato nell'accumulatore o nel registro stesso, la rotazione avviene sempre attraverso il flag C.
La RRF funziona nello stesso modo, solo che la rotazione avviene nell'altro senso.
Queste istruzioni permettono di risolvere e semplificare numerosi problemi, per esempio legati al controllo di ogni singolo bit di un registro, alla serializzazione dei bit durante una trasmissione o al loro riassemblaggio in ricezione. Inoltre va ricordato che spostare a sinistra o a destra di una posizione i bit di un registro equivale rispettivamente a moltiplicare o dividere per 2 il suo valore numerico.
Le ultime due istruzioni permettono di resettare (BCF) o settare (BSF) un qualsiasi bit di un qualsiasi registro lasciando invariati gli altri. Questo permette per esempio di usare i singoli bit di un registro come 8 semplici memorie a due stati, ottenendo così un grande risparmio nell'utilizzo di registri.

lunedì 7 maggio 2018

Come Svolgere Il Debug Di Un Software

Col termine “Debug” ci si riferisce agli eventuali errori (bug appunto) di un programma.
Gli errori possono essere di due tipi: sintattici (rilevati sempre dal compilatore in fase di compilazione del programma) e semantici (difficilmente rilevabili).
In quest'ultimo caso ci si riferisce ad un programma che "funziona", anche se non svolge la funzione voluta (ad esempio utilizzando un prodotto "*" al posto di una potenza "**". Il programma funziona ma io mi aspetterei un prodotto, invece il software svolge una potenza).
Dunque per "debuggare" manualmente un software verifico quali sono gli effetti che una data funzione mi dovrebbe dare.
Se la verifica fallisce, ho trovato l'errore.
Il programmatore quindi deve essere in grado, per ogni istruzione del proprio programma, di prevedere cosa farà tale istruzione.
Generalmente l’ambiente di sviluppo ci mette a disposizione una serie di funzionalità per: eseguire passo passo ogni istruzione, controllare lo “stato” del nostro programma, visualizzare il contenuto delle variabili e lo stack delle chiamate a funzione.
Premettendo che ogni Debug varia in base alle funzioni quindi all'ambiente di sviluppo, ogni programma in questa fase viene lanciato in modalità Debug (a indicare che è ancora sotto test)
Così facendo sarà possibile controllare istruzione per istruzione il vostro codice.
Cominciare il debug dall’inizio del programma può essere davvero complicato, in questi casi si usano i cosiddetti "breakpoints" (punti del programma che ci interessa monitorare).
Il programma viene eseguito normalmente fino al breakpoint, poi passa in “modalità debug”
I breakpoint possono essere associati a condizioni e altre proprietà configurabili (a seconda di un certo risultato o variabile, se uguale a 0, 1 e così via).
Vanno monitorati nomi, caratteri, espressioni, variabili.


Per svolgere un Debug con Visual Studio vi rimando a questa guida: Eseguire Un Debug Con Visual Studio (Visual Basic, C, C++, C#
Per Java: Debug Java (Guida)

martedì 24 aprile 2018

Cos'è Un Algoritmo e Come Costruirlo

Un algoritmo o, se preferite, "un procedimento di calcolo" è “un insieme finito di istruzioni atte a risolvere un problema in una determinata categoria.
Qualsiasi operazione viene svolta da macchine è, alla fine della fiera, un algoritmo.
Ma estendendo il discorso, qualsiasi operazioni che svolgiamo durante il giorno è schematizzabile grazie ad un algoritmo (tutte le operazioni che svolgiamo per fare il caffè, per mettere in moto una macchina, per fare la spesa, etc).
Questo termine deriva dalla trascrizione latina del nome del matematico persiano al-Khwarizmi.
In ambito informatico, un problema è calcolabile quando è risolvibile mediante un algoritmo.
In altre parole, tutti i problemi risolvibili mediante algoritmo sono automaticamente calcolabili da un calcolatore.
Inoltre l’algoritmo è fondamentale per la programmazione in quanto è “scritto” in un linguaggio umano, traducibile in qualsiasi linguaggio di programmazione e garantisce la correttezza delle operazioni svolte.


REGOLE
Siamo noi a decidere come impostare un algoritmo, tuttavia ci sono delle regole da rispettare:
-Le istruzioni non devono essere ambigue (ogni operazione prevista dall’algoritmo deve essere univocamente interpretabile dall’esecutore).
-Ogni operazione deve essere eseguibile con le risorse a disposizione dell’esecutore.
-Ordine di esecuzione delle istruzioni deterministico.
-Numero finito di passi di esecuzione: questo implica che il numero totale di istruzioni da eseguire, per ogni insieme di dati di ingresso, è finito e le operazioni da esse specificate devono essere eseguite un numero finito di volte.
-Deve essere efficiente: cioè fare un uso limitato di risorse (tempo di esecuzione e quantità di memoria utilizzata).
-Deve essere facilmente comprensibile.
-Modificabile (nel caso di modifiche nelle specifiche del problema risolto dall’algoritmo).


COSTRUZIONE DI UN ALGORITMO
Siamo appunto noi a decidere come impostarlo ma è buona regola sapere che ogni istruzione da eseguire o variabile da assegnare ad una data cella ha una certa forma geometrica (ovviamente ciò ai fini della programmazione serve a niente. L'unica funzionalità è magari rendere più leggibile questa sequenza di operazioni ma come detto ai fini della programmazione, in questa fase, ha poca importanza se l'istruzione "IF" viene inglobata in un rettangolo, rombo o cerchio).

Ad ogni modo ci sono varie figure geometriche così schematizzabili:
-Ovale: questo simbolo si utilizza per indicare l’inizio e la fine dell’algoritmo.
-Parallelogramma: usato per indicare operazioni di ingresso (Input) oppure operazioni di uscita (Output).
Gli input sono dati che l’utente da inserisce nel programma, come ad esempio l’ inserimento di un numero, mentre l’output è il risultato che il sistema restituisce dopo aver svolto delle operazioni, come ad esempio il risultato di una somma.
-Rettangolo: nel rettangolo si scrivono le operazioni (assegnazioni, operazioni aritmetiche) che vogliamo far svolgere al nostro programma (ad esempio somma tra operazioni, sottrazione, etc)
-Rombo: il rombo indica una condizione, le condizioni sono molto importanti nei programmi in quanto permettono di scegliere strade diverse in funzione del risultato della condizione. (ad esempio se A è maggiore di B, allora scrivi 1, altrimenti scrivi 0; se A è uguale a B, scrivi 0, altrimenti scrivi 1; se A è diverso da 0, aggiungi B ad A).


domenica 8 aprile 2018

Quale Linguaggio Di Programmazione Conviene Imparare?

Nonostante la grande varietà di linguaggi di programmazione disponibili, la maggior parte delle posizioni lavorative aperte richiede la conoscenza di uno (o più) tra i seguenti cinque linguaggi: Java, Javascript, C#, Python, PHP, C e C++.
Tuttavia ogni linguaggio di programmazione è più adatto di altri in un certo settore.
Ad esempio HTML/CSS e JavaScript per il lato client, ovvero l’interfaccia del sito.
Per il lato server, quindi per le varie operazioni a livello di database, la scrittura su file e tutte le operazioni più “classiche”, conviene imparare il PHP.


Applicazioni Matematiche, Fisiche, Chimiche e Ricerca
I linguaggi più adatti sono ancora il Fortran (77) e l’Algol perché dalla loro creazione è stato scritto ogni genere di programma matematico e quindi non è economicamente pensabile convertire tutto il codice già esistente per un altro linguaggio di programmazione.
Ad oggi esistono però molti applicativi (il più famoso di tutti è il Matlab) usati in ambito universitario che hanno potenzialità maggiori in termini di prestazioni e di rappresentazione grafica, ma rimangono solamente ad uso e consumo dei pochi interessati che studiano materie scientifiche/ingegneristiche. Molto usato anche il C++, Delphi, R e Python (ad oggi il linguaggio più usato per l'analisi di dati, grazie ad importanti librerie di matematica, fisica, ingegneria, GIS, machine learning, computer vision, scienza computazionale).


Applicazioni Mobili, Videogame, Smartwatch, Smart TV e Dispositivi Indossabili
Lo sviluppo di videogiochi avviene principalmente utilizzando il C++ (per i motori dei giochi, per gli strumenti audio e l'elaborazione di immagini) e in alcune occasioni (per migliorare la velocità della grafica) anche l’ostico Assembler (usato anche per i dispositivi indossabili).
Bisogna dire però che possono essere creati semplici videogiochi anche utilizzando il Java ed il Flash, anche se quest’ultimo non può essere considerato un vero linguaggio di programmazione.
Altri gettonati sono: Javascript (sia app ibride che native, sviluppo di software multipiattaforma e nell'Internet degli oggetti IoT), Java (Android), Kotlin (Android), C# (e il suo Unity 3D per i Videogames).
Objective-C sino a qualche anno fa era molto usato per la costruzione di applicazioni per OS X e iOS ed era lo strumento principale per gli sviluppatori per dispositivi iPhone e iPad, prima dell'avvento di Swift (usato anche per Smartwatch ed Smart TV).


Programmi Gestionali
La programmazione di database è implementata tramite Visual Basic e C/C++ anche su sistemi operativi Unix (o come si chiama ora, OpenServer) o Linux.
Per banche dati molto importante il PERL e SQL.
Anche il datato Cobol era molto usato.
La scelta su quale linguaggio usare è totalmente libera, bisogna però considerare quale sistema operativo useranno maggiormente i nostri clienti.


Big Data
Il re indiscusso è Java, infatti i principali strumenti di questo settore usano proprio questo linguaggio (Hadoop, HBase, Accumulo, ElasticSearch).
In rampa di lancio anche Scala.


Programmi per Windows
Oggi per creare un programma Windows esistono molti linguaggi, primo tra tutti il Visual Basic, i più famosi poi sono il Visual C++, C# (lanciato da Microsoft nel 2000), Delphi (l’evoluzione visuale del Pascal), Ruby e Java.


Programmi MultiPiattaforma
Java, pur con le sue pecche, permette di creare programmi che possono girare indistintamente su Windows, su Mac, su Linux, in remoto su pagine internet o, addirittura, su elettrodomestici o cellulari.
Il punto di forza di Java rimane la Java Virtual Machine che, una volta installata su una periferica o un sistema operativo permette di eseguire i programmi Java senza problemi legati all’hardware o alla diversa impostazione dei sistemi operativi.


Programmi di Apprendimento
Sono molto usati l’HTML, il Pascal e il C++.
Si può dire che questi linguaggi sono ottimi per imparare a programmare, soprattutto il Pascal, che rappresenta le basi della programmazione.


Sviluppo Siti Dinamici e Statici
Per lo sviluppo di siti dinamici (in HTML) si possono utilizzare molti linguaggi, come il Perl o l’Asp.
PHP è molto usato in tutti i siti web (ad esempio Facebook). La sua ubiquità e la distribuzione attraverso provider di hosting, oltre al la perfetta integrazione con il MySQL RDBMS e applicazioni di avvio hanno portato ad una massiccia domanda di sviluppatori web PHP in tutto il mondo.
Recentemente stanno emergendo anche Python (utilizzato dalla NASA, da Instagram, Reddit, Quora, pitnerest), Zope (che utilizza il Python) e Jsp, un linguaggio di scripting che utilizza le librerie di Java.
Ad esempio Netflix e LinkedIn implementano Java.
Javascript invece è usato per creare pagine interattive.


Sistemi Operativi
La programmazione di un sistema operativo richiede il controllo di tutte le risorse del computer e ciò è possibile solamente scrivendo il motore del sistema operativo nel linguaggio più vicino al linguaggio macchina, ovvero l’Assembler il quale però è estremamente difficile da imparare.
Per l’interfaccia utente si usa il C e il C++.


Di seguito invece alcuni siti che permettono di imparare a programmare online e in modo gratuito:
CodeAcademy
FreeCodeCamp
Udacity
Developer Mozilla
Pluralsight

sabato 31 marzo 2018

Cos'è Il Linguaggio Macchina? Principi Di Funzionamento

Ogni microprocessore (e in generale computer) è progettato per eseguire determinate operazioni in presenza di determinate sequenze binarie che vengono lette una dopo l'altra da un'area detta memoria programma. 
Queste sequenze sono binarie ovvero istruzioni in linguaggio macchina (L.M.), l'unico direttamente comprensibile dai circuiti.
Ci si riferisce ad istruzioni di questo tipo: 00100000011.
Ovvero sequenze lunghe o più o meno lunghe di 0 ed 1.
Ogni istruzione compilata seguendo le regole di questo codice esegue solamente un'operazione molto precisa: scrivere dati nella suddetta cella di memoria, saltare una cella di memoria e passare alla successiva, compiere un'operazione logico, una aritmetica e così via.
Ogni programma eseguito direttamente dalla CPU, dunque, è scritto usando una serie di istruzioni di questo genere.
Si tratta del più basso livello di rappresentazione di un programma assemblato o come un linguaggio di programmazione primitivo e strettamente dipendente dall'hardware utilizzato per eseguire le istruzioni.
Programmare usando il codice binario può essere particolarmente complesso e portare facilmente a commettere errori. Per programmare in codice macchina, infatti, si devono costantemente ricordare e calcolare gli indirizzi di memoria che si utilizzano e "maneggiare" con attenzione ogni singolo bit di informazione che è necessario al programma.
Tutti i software che utilizziamo quotidianamente sono realizzati utilizzando linguaggi di programmazione di alto livello (tipo Java, C, C++, Fortran, Cobol, Pascal, Ruby, etc) non direttamente leggibili (quindi eseguibili dal calcolatore).
Il codice sorgente del software sarà quindi tradotto in istruzioni elementari da appositi strumenti chiamati assembler o compilatori.
Fanno eccezione i programmi interpretati, nei quali il codice sorgente è eseguito direttamente (anziché essere tradotto) grazie a speciali tool detti interpreti.
Dal  lato teorico la strutturazione e il funzionamento del Linguaggio Macchina sono piuttosto semplici.
Cioè questo codice si compone di lettere, parole (combinazioni di più lettere del codice binario) e frasi (combinazioni di più parole corrispondenti a una singola istruzione fornita al processore). Per quanto possa apparire semplice, questa organizzazione è alla base del funzionamento di qualunque software in circolazione, compresi i più complessi e moderni.



ESEMPIO DI PROGRAMMA
Ipotizzando di programmare in codice binario la somma di due numeri:

10111010
Muove nel registro general purpose DX il numero seguente di 16 bit,

00000010
00000000
Il numero 2 in binario. Poiché l'istruzione precedente richiede un numero a 16 bit, riempiamo di 0 gli 8 bit che non ci servono.

10111011
Muove nel registro BX il numero seguente di 16 bit.

00000011
00000000
Il numero 3 in binario. Stessa cosa di prima per via dell'istruzione che richiede un operando a 16 bit quindi si aggiungono gli 8 zero.

00000001
Istruzione di 16 bit che somma il contenuto dei registri DX ed BX.

11011010
Salva il risultato nel registro DX.

Ogni codice corrisponde all'azione che la CPU deve compiere dopo aver processato l'istruzione in ingresso.
Azione ad esempio su un prodotto o somma.
Viene ovviamente specificato anche l'indirizzo delle celle di memoria nelle quali devono essere lette o salvate delle informazioni.
Parlare di linguaggio macchina in senso assoluto, come se fosse univoco, è un errore.
Le varie tipologie di CPU e SoC in commercio, infatti, sono contraddistinte da una propria architettura e organizzazione interna: ciò le rende uniche e incapaci di eseguire le istruzioni scritte in un linguaggio macchina differente dal loro.