mercoledì 25 settembre 2019

Creazione tweet in automatico su Twitter con Python

Per creare una app per postare in automatico su twitter per prima cosa si deve avere un account developer 


Si crea quindi una app (si deve attendere che la app sia autorizzata dopo aver compilato un breve form....necessitano 24 ore per la risposta) e si copiano le chiavi consumer e access_token
per semplicita' si usera' lal libreria tweepy
-----------------------------------------------------------------------
import tweepy

consumer_key        = 'oNexxxxxxxxxxxxxxxxxxxxxx'
consumer_secret     = 'ti4xxxxxxxxxxxxxxxxxxxxxxxx'
access_token        = '4402008xxxxxxxxxxxxxxxxxxxxxxxx'
access_token_secret = '59nofxxxxxxxxxxxxxxxxxxxxxxxxxxx'

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)

now = datetime.datetime.now()

testo = "Fir " + now.strftime("%d-%m-%Y %H:%M:%S") +"\n"

api.update_status(testo)

Scrittura post automatici su pagina Facebook

Per creare dei post automatici su una pagina di Facebook (non il proprio account personale ma una relativa al proprio utente) si installa prima l'SDK in Python di Facebook

A questo punto dal Graph Explorer si devono concedere i permessi di scrittura che devono essere almeno a manage_pages and publish_pages



Si crea quindi una app dal proprio account developer Facebook e per semplicita' si elimina "Richiedi la chiave segreta" per le connesssioni tra server


il codice Python a questo punto e' molto semplice

-------------------------------------------------------------------------------
import facebook # facebook-sdk

access_token = "xxxxxxxxxxxxxx" # da recuperare nel GraphExplorer
graph = facebook.GraphAPI(access_token)

facebook_id = "120763xxxxxx" # id della pagina, si trova nelle Informazioni
                             # o la parte numerica della URL
graph.put_object(facebook_id,"feed",message="messaggio")

giovedì 19 settembre 2019

Grep e nomi file

Di solito il comando grep ha come output il testo dove si verifica la stringa richiesta
Per avere solo il nome del file si puo' fare

grep -Ril "stringa" *


venerdì 13 settembre 2019

Ocatve e MNIST

Volevo visualizzare i dati contenuti nei file di test del database MNIST spesso usati come esempi delle rete neurali (vedi esempi di TensorFlow)



il formato file e' IDX  descritto in fondo alla pagina sopra linkata

----------------------------------------------------------------------------------------
clear all;
filename = "C:/Users/l.innocenti/Downloads/train-images.idx3-ubyte";
immagini_id = fopen(filename,"r");
immagini = fread(immagini_id,Inf,"uint8");
numero_immagini = immagini(7,1)*256+immagini(8,1);
righe = immagini(9,1)*16777216+immagini(10,1)*65536+immagini(11,1)*256+immagini(12,1)*1
colonne = immagini(13,1)*16777216+immagini(14,1)*65536+immagini(15,1)*256+immagini(16,1)*1
indice_immagine = 1016;
im1 = immagini(17+(indice_immagine*784):17+((indice_immagine+1)*784)-1);
im1_s = reshape(im1,28,28);

imshow(fliplr(rot90(im1_s,-1)),[]); # mostra a scala di grigi


f2 = "C:/Users/l.innocenti/Downloads/train-labels.idx1-ubyte";
f2_id = fopen(f2,"r");
f2 = fread(f2_id,Inf,"uint8");
valore = f2(indice_immagine+9);

venerdì 30 agosto 2019

Stringhe in C

Mi sono rimesso a studiare un po' di C

--------------------------------------------
#include <stdio.h>
#include <stdlib.h>

#include <string.h>


//calcola la lunghezza di una stringa 
// con un ciclo for ed i puntatori
int strlen_for(char *s)
{
    int n;
    for(n=0; *s!='\0'; s++)
        n++;
    return n+1;
}

//calcola la lunghezza di una stringa 
// con un ciclo while ed i puntatori
//il trucco di fine ciclo e' che 
// il terminatore di una stringa in C 
// e' 0 che corrisponde anche alla condizione
// False 

void print_for(char *s)
{
    for (; *s; s++)
        printf("%c",*s);

    printf("\n");
}

// stampa una stringa
void print_while(char *s)
{
    while(*s){
        printf("%c",*s);
        s++;
        }
    printf("\n");
}

//crea una nuova stringa di una lunghezza non predefinita
char *new_string(int lunghezza)
{
    char *transi = malloc(lunghezza + 1);
    memset(transi, 'a', lunghezza);
    transi[lunghezza] = 0;
    return transi;
}

// concatena due stringhe
char *concatena(char *uno, char*due)
{
    //printf("%i\n",sizeof(uno));


    char *transi = malloc(sizeof(uno)+sizeof(due) + 1);
    int contatore = 0;
     for (; *uno; uno++)
     {
        transi[contatore] = *uno;
        contatore++;
     }
     for (; *due; due++)
     {
        transi[contatore] = *due;
        contatore++;
     }
    transi[contatore] = 0;

    return transi;
}


// taglia una stringa
char *taglia(char *stringa,int caratteri)
{
    stringa[caratteri] = 0;
    return stringa;

}

int main()
{
    char *a = "chiara";
    char b[5] = "luca";
    print_for(a);
    print_while(a);
    int lung = strlen_for(b);
    printf("%i\n",lung);

    char *nuova_stringa = new_string(10);
    print_for(nuova_stringa);

    char *nome = "Luca";
    char *cognome = "Innocenti";
    char *unione = concatena(nome,cognome);
    print_for(unione);

    char *tagliato = taglia(unione,5);
    print_for(tagliato);
    printf("%i\n",sizeof(tagliato)+1);

    //array di puntatori
    char *elementi[] = {"Luca", "Innocenti", "Firenze"};

    print_for(elementi[0]);
    print_for(elementi[2]);



    return 0;
}


giovedì 29 agosto 2019

6502 RetroShield

Ho provato un progetto interessante... in pratica invece di emulare un processore con RetroShield viene accoppiato ad una Arduino Mega un vero processore 6502 (puo' montare anche uno z80) su cui vengono realmente eseguite le istruzioni senza emulazione software





Il clock e' molto piu' basso rispetto al 6502 puro (circa 10 volte piu' lento ovvero 100 KHz) ma la cosa divertente e' che si puo' emulare un Apple 1 con un apposito sketch Arduino con inclusi nel firmware Apple Basic 1 e Woz Monitor (l'interfaccia avviene sulla porta seriale come terminale)

Per accedere al basic si attende il prompt dopo una CPU Reset e si digita

E000R

per rientrare al Basic

E2B3R

per effettuare il dump della memoria del programma in basic
004A.00FF
0800.0FFF
.
L'aspetto che lascia piu' interdetti e' il basic di Apple I e' altrimenti conosciuto come Integer Basic perche' sono ammessi solo numeri interi come variabili compresi tra -32.768 3 e 32767. Inoltre il nome delle variabili puo' essere solo una lettera o una lettera ed un numero. Tanto per dare un'idea il manuale originale era di 14 pagine



Resuscitare un telefono Vernee

Un telefono Android di marca Vernee era andato in modalita' bootloader e quando mi e' arrivato  oramai non aveva piu' batteria perche' il proprietario non lo aveva spento



Nonostante avere tenuto il telefono in carica per piu' di un giorno non presentava segni di vita..a questo punto il dispositivo e' stato smontato per staccare fisicamente la batteria (un tentativo come un altro). La batteria era collegata da una flat con connettore a pressione ed e' stato facile disconnetterla. A telefono aperto e' stato semplice verificare (anche per la presenza di due comode piazzole) che la tensione della batteria era di circa 3.2 V e nonostante il cavo USB di alimentazione la batteria non veniva ricaricata.

Leggendo su internet e' emerso che il voltaggio aveva raggiunto un livello tale che il circuito di ricarica impediva la ricarica stessa...E' stato quindi collegata un cavo USB alle due piazzole ed la batteria e' stata alimentata a 5V dal cavo USB fino a quando non ha raggiunto i 3.6 V. Dopo di cio' il circuito di ricarica e' entrato in azione ed il telefono e' ripartito in bootloader senza problemi (l'origine del problema era un corruzione del sistema Android)...un reset alle impostazioni di fabbrica (con menu ovviamente in cinese) ed il telefono e' ripartito.

Probabilmente avere lasciato il telefono in modalita' bootloader ha impedito ad Android di evitare l'eccessivo scaricamento della batteria e probabilmente non ci sono dispositivi hardware immediatamente collegati alla batteria (come accade nelle LiPo vendute singolarmente)

Debugger integrato ESP32S3

Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede  nell'ID USB della porta Jtag. Nel modulo...