Articoli con tag programmazione

Upload FTP con Python

0

Upload FTP with Python

Fare l’upload di un file FTP con Python e il modulo ftplib è più semplice di quel che si pensa.
Stasera condivido questo breve ma utilissimo pezzo di codice:

import ftplib #importiamo la libreria che useremo per gestire la connessione FTP
 
ftp = ftplib.FTP('myserver.com','login','password') # Si connette
fp = open('file.txt','rb') # Imposta il file da inviare, apriamo uno stream per il file
#di default siamo nella cartella root del sito / - se vogliamo spostarci in un'altra directory è sufficiente scrivere: ftp.cwd('directory')
ftp.storbinary('STOR file.txt', fp) # Invia il file
 
fp.close() # Chiude lo stream del file
ftp.quit() # Chiude la connessione

Pilotare iTunes con Python – Windows

1

Ben tornati!

In serbo per voi oggi, una manciata di codice Python, per il controllo di iTunes (il software per la gestione e riproduzione di brani, Made by Apple).
Python e iTunes interagiscono via scripting, COM. (iTunes è infatti, fortunatamente dotato di un’interfaccia script).

Il modulo aggiuntivo per Python, necessario, è win32.com (Presente nel pacchetto pywin32).

import win32com.client
 
#Tramite COM interagiamo con l'interfaccia script di iTunes.
 
iTunes = win32com.client.gencache.EnsureDispatch("iTunes.Application")
 
#Mette in play il primo brano della playlist "Classifica".
iTunes.LibrarySource.Playlists.ItemByName('Classifica').PlayFirstTrack()
#Attiva la riproduzione casuale nella playlist specificata.
iTunes.LibrarySource.Playlists.ItemByName('Classifica').Shuffle = True
#Riproduce il file indicato nel percorso, aggiungendolo in libreria se non presente.
iTunes.PlayFile("C:\\Users\\ASS.MUSOLINO\\Documents\\IPOD\\Musica\\8. Beyonce - Halo.mp3")
#Restituisce 1 se c'e qualche brano in riproduzione, altrimenti 0
iTunes.PlayerState
#Mette in pausa il brano.
iTunes.Pause()
#Play
iTunes.Play()
#Stop
iTunes.Stop()
#Brano precedente
iTunes.PreviousTrack()
#Brano successivo
iTunes.NextTrack()
#Stampa a schermo il titolo del brano attualmente in riproduzione
iTunes.CurrentTrack.Name
#Stampa a schermo un numero da 0 a 100 che sta a indicare il volume attuale.
iTunes.SoundVolume
#Setta il volume a 50
iTunes.SoundVolume = 50
#Restituisce True se il volume e' attivo, altrimenti False
iTunes.Mute
#Muto
iTunes.Mute = True
#Toglie il Muto
iTunes.Mute = False
#Minimizza la finestra di iTunes.
iTunes.Windows.Item(1).Minimized = True
#Chiude iTunes
iTunes.Quit()

Linguaggio C – Struttura dati Lista Ordinata

0

In una lista ordinata, gli elementi sono inseriti in modo che la lista sia costituita da una sequenza ordinata di elementi.
La struttura su cui andremo a lavorare sarà così composta:

typedef int t_atomo;
 
typedef
struct listaord
{
t_atomo info;
struct listaord *prox;
} t_listaord;

Si tratta di una struttura ricorsiva, con un campo info e un puntatore al suo nodo successivo. Questa struttura ricorsiva non ha uno spazio di memoria preallocato, saremo noi ad allocare dinamicamente ogni nuovo elemento e a collegarli in modo opportuno.

Algoritmo di inserimento di un elemento in una lista ordinata:

//INSERIMENTO IN UNA LISTA ORDINATA:  C.computazionale: O(n)
 
int in_lista_ordinata(t_listaord **p, t_atomo x){ // Inserisce in una lista p, un elemento x
t_listaord *temp, *prec, *corr;
temp = (t_listaord *) malloc(ziseof(t_listaord)); //Al solito, allochiamo un blocchetto di memoria in temp, che collegheremo alla lista ordinata.
 
if(temp){ //Se l'allocazione di memoria avviene con successo
temp->info = x; //Inserisce nel campo info, il valore X.
temp->prox = NULL; //Mentre prox lo fa puntare a NULL.
 
if (*p){ //Se la lista è diversa da NULL vorrà dire che vi saranno altri elementi. 
prec = NULL; //precedente lo fa diventare uguale a NULL. (perchè dato che partiremo dal nodo iniziale della lista, il suo precedente non esisterà e sarà uguale a NULL)
corr = *p; //corrente diventa uguale a *p (quindi partiamo dall'inizio della lista)
while((corr) && (corr->info < x)){ //finchè corr è diverso da NULL e il campo info di corr è < di x: 
prec = corr; //Il prcedente diventa il corrente.
corr = corr->prox; //il corrente diventa il successivo: corr->prox
}
 
//uscendo dal ciclo sopra avremo scansionato tutta la lista, e quindi corr è diventato NULL giungendo alla fine oppure è stato trovata la posizione dove inserire x.
if (prec) //Se prec è diverso da NULL (effettuiamo il controllo su prec e non su corr perchè corr potrebbe essere diventato uguale a NULL (in quel caso vorrà dire che dobbiamo inserire x alla fine della lista)).
{ //Se prec non è NULL, allora avremo trovato una posizione di mezzo in cui inserire l'elemento x. Di conseguenza inseriamo temp fra prec e corr.
prec->prox = temp; //Il campo prox di prec, punterà a temp.
temp->prox = corr; //Il campo prox di temp punterà a corr. in questo modo temp sarà perfettamente innestato fra i due.
}else{ //Se prec è NULL vorrà dire che X è minore del primo elemento in lista, di conseguenza diventa il primo elemento della lista.
temp->prox = *p; //il campo prox punterà al vecchio primo nodo della lista
*p = temp; //temp diventa il primonodo.
}
 
}else //Altrimenti se la lista è vuota, semplicemente vi inserisce temp (senza modificare il suo campo prox che punterà a NULL. 
*p = temp;
 
return 0; //Inserimento avvenuto con successo
}else //Allocazione di temp non riuscita
return 1;
}

Algoritmo di Ricerca in una lista ordinata:

//RICERCA IN UNA LISTA ORDINATA: C. computazionale: O(n), come una ricerca sequenziale.
 
t_listaord *ricerca_listaord(t_listaord *p, t_atomo x){ //mettiamo l'asterisco perchè deve restituire l'indirizzo di memoria in cui trova l'elemento.
t_listaord *prec, *corr; //ci dichiariamo prec e corr.
prec = NULL; //prec lo inizializziamo a null
corr = p; //corri lo inizializziamo al puntatore p.
while((corr) && (corr->info < x)){ //finchè corr è diverso da NULL e finchè non trova un elemento maggiore uguale a x.
prec = corr; //il precedente diventa il corrente
corr= corr->prox; //il corrente diventa il successivo.
}
 
//Uscendo dal ciclo sopra, se corr diventa uguale a NULL avremo scansionato tutto l'array senza trovarlo. Altrimenti se l'altra condizione diventa falsa, avremo trovato un elemento maggiore o uguale a x (che potrebbe essere uguale a x o semplicemente maggiore, in quest'ultimo caso non avremo altre possibilità di trovarlo perchè la lista è ordinata e se c'era doveva trovarsi la).
if (corr && (corr->info == x)) //se corr è diverso da null è il campo info di corr è uguale a x
return corr; //Elemento trovato. Restituisce corr.
else
return NULL; //Elemento non trovato. Restituisce NULL.
 
}

Assembler – Moltiplicazione di numeri

0

Riprendiamo a parlare di linguaggio a basso livello.
Ecco un nuovo esercizio in linguaggio Assembler: realizzare un programma capace di effettuare la moltiplicazione di due numeri con somme ripetute. (Stampa del prodotto max a 2 cifre).

;ESERCIZIO: Moltiplicazione di due numeri con somme ripetute. (stampa max 2 cifre)
 
.model small
 
.stack 100h
 
.data
striper byte 32d, 'per', 32d, '$'
 
.code
 
start:
 
mov ah, 1h
int 21h
sub al, 30h  ; dato che un carattere immesso da tastiera viene convertito nel corrispettivo codice ascii. Per poter lavorare col numero ascii, dobbiamo sottrarre 30h. (dal segmento data invece lo abbiamo già diretto il numero ascii)
 
 
mov bl, al
 
cmp bl, 0
je finez
 
sub bl, 1
 
mov ax, @data
mov ds, ax
 
mov dx, offset striper
mov ah, 9h
int 21h
 
mov ah, 1h
int 21h
sub al, 30h
 
cmp al, 0
je finez
 
mov dl, al
 
prodotto:
 
cmp bl, 0
jle fine
add dl, al
dec bl
jmp prodotto
 
fine:
 
mov bl, dl
 
mov dl, ' '
mov ah, 2h
int 21h 
 
mov dl, '='
mov ah, 2h
int 21h
 
mov dl, ' '
mov ah, 2h
int 21h
 
mov ah, 0
mov al, bl
 
mov cl, 10
 
div cl
 
add ah, 30h
mov bl, ah
 
add al, 30h
 
mov dl, al
mov ah, 2h
int 21h
 
mov dl, bl
mov ah, 2h
int 21h
 
mov ax, 4c00h
int 21h
 
finez:
 
mov dl, ' '
mov ah, 2h
int 21h
 
mov dl, '='
mov ah, 2h
int 21h
 
mov dl, ' '
mov ah, 2h
int 21h
 
mov dl, '0'
mov ah, 2h
int 21h
 
mov ax, 4c00h
int 21h
 
end start

Assembler – Array di stringhe

0

Nonostante l’assembler sia un linguaggio di basso livello, iniziamo a esplorare una delle strutture dato fondamentali in ogni linguaggio di programmazione, l’array o vettore.

Il seguente frammento di codice stampa un array di stringhe, ogni elemento (stringa) viene stampato su una nuova riga:

.model small
.stack 100h
 
.data
stringhe db 10d, 50 dup('ciao', 10d), '$'  ;  array di 50 elementi (inizializzati alla stringa "ciao" + CR ovvero ritorno a capo), il dollaro è fondamentale perchè indica la fine dell'array di stringhe.
 
.code
 
start:
 
mov ax, @data    ; si passa obbligatoriamente attraverso ax perchè ds (data segment) può ricevere dati solo da registri
mov ds, ax
mov dx, offset stringhe   ; dx conterrà l'indirizzo (comando offset) del nostro array.
 
call puts            ; chiamata della subroutine puts che fa l'output della stringa contenuta in ds : dx / dato : indirizzo
 
mov ax, 4c00h
int 21h
 
    ; inizio della subroutine puts: 
 
puts:
 
mov ah, 9h     ; 9h = output di una stringa
int 21h
ret          ; istruzione di ritorno
 
end start

L’interrupt usato, è il solito 21h per i servizi del DOS.

Assembler – conversione da Maiuscolo a minuscolo.

0

Altro Programma in Assembler, il linguaggio di basso livello per eccellenza, che legge un carattere Maiuscolo e lo converte in minuscolo. (La strategia usata è basilare, basta avere in mano una tabella ascii per capire come procedere nella stesura del codice).

; Nella codifica ASCII le lettere minuscole si trovano 32 posizioni dopo le equivalenti lettere maiuscole,
; per esempio la posizione decimale di A è 65, di a è 97, e così via. Scrivere un programma MASM ASSEMBLER
; che legga un carattere MAIUSCOLO e lo converta in minuscolo.
 
.model small
 
.stack 100h
 
.data
istr db 'Carattere M: ', '$'     ; NB. ricordare sempre il carattere di escape finale $, che indica la fine della stringa (o di un array).
ostr db 'Carattere m: ', '$'
 
.code
 
start:
 
mov ax, @data     ;  mettiamo in ax tutto il segmento dati.
mov ds, ax        ;  spostiamo nel data segment tutto ax (non possiamo farlo direttamente perchè ds riceve input solo da registri)
mov dx, offset istr   ;  in dx mettiamo invece l'indirizzo del dato che vogliamo utilizzare.
 
call puts    ; chiamata della subroutine puts che stampa a video il contenuto di DS : DX (stampa a video la stringa)
call getc    ; chiamata della subroutine getc che riceve un input da tastiera con eco (8h input senza eco), l'input viene salvato in al.
 
mov bl, al      ; copiamo al in bl.
add bl, 32d     ; sommiamo al valore intero del carattere preso da tastiera (bl), il valore decimale 32. E lo salviamo in bl.
call put1310    ; chiamiamo la subroutine put1310 che stampa a schermo LF e CR
 
mov dx, offset ostr  ; mettiamo in dx il valore dell'indirizzo della variabile ostr (avendo già in ds tutto il segmento di dati, per stampare un dato specifico di volta in volta è sufficiente cambiare l'indirizzo del dato contenuto in dx
call puts        ;   richiamiamo la subroutine per la stampa del valore in ds : dx
 
mov dl, bl    ;   copiamo bl in dl (bl sarà il codice ascii del carattere  + 32)
call putc     ;   stampa il carattere in dl (tramite 2h).
 
mov ax, 4c00h  ;   stoppa l'interrupt (simile ad un return).
int 21h
 
; subroutine getc  -  attende per l'inserimento di un carattere da tastiera con eco.
getc:
mov ah, 1h
int 21h
ret
 
; subroutine putc
putc:
mov ah, 2h    ;   inseriamo in ah il comando da passare all'interrupt, 2h stampa il carattere contenuto in dl
int 21h
ret
 
; subroutine puts che serve a stampare la stringa (9h pesca la stringa da ds : dx / data segment: indirizzo.
puts:              
mov ah, 9h       ; stampa la stringa tramite la funzione 9h che inseriamo in ah per poter inviare il comando all'interrupt.
int 21h
ret
 
; subroutine put1310 - serve and andare a capo, stampando i caratteri LF e CR (codice ascii: rispettivamente 13 e 10)
put1310:
mov dl, 13d
mov ah, 2h
int 21h
mov dl, 10d
mov ah, 2h
int 21h
ret
 
end start
Torna all'inizio