Archivi Categorie: Python

Maiuscolo|minuscolo – ultima puntata

tmm-finOggi concludo la telenovela serie sulla conversione maiuscolo|minuscolo all’interno della clipboard. Le puntate precedenti sono qui e qui.
Avevo pensato di poter utilizzare il comando echo con l’opzione dell’here document ma non ci sono riuscito. Non so se è una mia carenza o il metodo non è praticabile. Sono ricorso a cat, soluzione meno bella perché ho dovuto creare un file temporaneo in /tmp.

Il codice è commentato e semplicissimo (non cambia granché dalla puntata precedente) per cui eccolo, senza preamboli:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/newlisp

;; get state of CapsLock
(set 'clON (% (int (slice (string 
        (exec "xset q | grep LED")) -4 2)) 2))

;; get clipboard content
(set 'txt (join (exec "xsel -ob") "\n"))
;;  case translate
(if (= clON 1) 
    (set 'txt (upper-case txt))
    (set 'txt (lower-case txt)))

;; park in a temp file
(set 'tmpf "/tmp/Mm")
(write-file tmpf txt)

;; put the temp file it in the clipboard
(set 'cmd (join (list "cat " tmpf " | xsel -ib")))
(exec cmd)
(delete-file tmpf)

(exit)

Si potrebbe ancora modificarlo rendendolo più lispico ma poi si perderebbe la possibilità di confronto con la versione del passo successivo, questo che segue immediatamente.

Se a questo punto qualcuno ponesse la domanda “ma si deve fare con newLISP?” risponderei “certo che no! ecco la versione con Python”.

#!/usr/bin/python
# -*- coding: utf-8 -*-

import subprocess, os

# stato di capslock
cmd = "xset q | grep LED"
ps = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,
                      stderr=subprocess.STDOUT)
output = (ps.communicate()[0]).strip()
clON = int(output[-2:]) % 2

# contenuto della clipboard
cmd = "xsel -ob"
ps = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
txt = (ps.communicate()[0])

# converto
if clON:
    txt = txt.upper()
else:
    txt = txt.lower()

# lo parcheggio in un file temporaneo
tmpf = "/tmp/Mm"
f = open(tmpf, 'w')
f.write(txt)
f.close()

# copio il file nella clipboard
#cmd = "cat"
cmd = "cat {0} | xsel -ib".format(tmpf)
os.system(cmd) #, "", shell = True)
os.remove(tmpf)

Sono quasi equivalenti. Ecco un dump del test effettuato.

MMSì newLISP converte anche le lettere non ASCII :-D
Ma siccome è un’inutility il discorso, per me, si chiude qua ;-)

Convertire testo in maiuscolo|minuscolo

OK, una cosa completamente inutile. Ma siccome ci ho lavorato per qualche ora ve la voglio raccontare. Caso mai non leggetelo.

togc

Io sono diversamente smart –è risaputo anche se non mi va che si dica in giro– e con l’installazione di Ubuntu RR mi sono trovato parecchie cose che non funzionavano più come prima. Anche Gedit, colpa mia, certo, ma era sparita l’opzione Modifica maiuscole/minuscole dal menu Modifica. E prima di scoprire che dovevo attivare i plugin mi sono messo a googlare per Python + clipboard + capslock e allora ecco qui.

Allora c’è da dire che si trova tutto già fatto, solo da assemblare.
La prima cosa da fare è scaricare il modulo pyperclip, da qui: Pyperclip – A cross-platform clipboard module for Python.

Per determinale lo stato del tasto Bloc Maiusc è bastata un’altra googlata, qui: Python – How to get current keylock status?

È poi richiesta l’installazione di due utilities: xclip e xset.

OK, abbiamo tutto, ecco lo script Python (togc.py):

#!/usr/bin/python
# -*- coding: utf-8 -*-

import pyperclip, commands

t = pyperclip.paste()
capson = (int (commands.getoutput("xset q | grep LED")[65])) % 2
if capson:
    t = t.upper()
else:
    t = t.lower()
pyperclip.copy(t)

Basta renderlo eseguibile con chmod +x togc.py e funziona.

Il passo successivo è di creare un pulsante sul desktop o sulla barra dei lanciatori.

unity

Facilissimo, eccolo (togc.desktop):

[Desktop Entry]
Name=Lanciatore Semplice
GenericName=Lanciatore Semplice
Comment=Lanciatore Semplice
Exec=/home/juhan/lab/APPs/togc/togc.py
Icon=/home/juhan/lab/APPs/togc/togc.png
Terminal=false
Type=Application
NotShowIn=GNOME;
X-Ubuntu-Gettext-Domain=synaptic

Name[it_IT]=togc

La solita avvertenza: modificare come richiesto le righe 5 e 6, prima di renderlo eseguibile.
Come icona ho usato l’immagine messa in testa al post.

Poi si può provare, ma è OK, almeno per me:

adesso provo togc -- vediamo 123 Привет мир!
ADESSO PROVO TOGC -- VEDIAMO 123 Привет мир!
adesso provo togc -- vediamo 123 привет мир!
ADESSO PROVO TOGC -- VEDIAMO 123 привет мир!

I caratteri non latini non vengono convertiti, ma neanche Gedit lo fa.
E, sì, è completamente inutile.
E, sì, lo so, ci sarebbe Emacs o almeno vim; vi lo usavo prima che parecchi di voi nascessero, e prima ancora usavo ed e roba simile.

Però ho trovato un altro paio di cose che voglio condividere con voi, prossimamente… forse… ;-)

Interprete Lisp in Python

Un post un po’ particolare, insolito. Ma ultimamente sono attivi due autori über-bravi, Robitex e Dikiyvolk e allora vado con questa cosa difficile da definire.lambdaRecentemente sono finito invischiato in una cosa che non so bene come raccontare. E che continuava a venirmi in mente anche quando pensavo a altro, insomma ne sono stato completamente invischiato. E vorrei coinvolgere anche voi. Comincio con il presentare l’autore: Michael Nielsen un australiano che sta negli USA e si definisce a writer, scientist, and programmer.

Allora c’è questo post Lisp as the Maxwell’s equations of software (code repository) che parte con un paio di reminescenze personali per finire in un progetto inutile in ultima analisi ma fantastico: costruire un interprete Lisp minimale, funzionante e completo e farlo in Python.

C’è riuscito e molto bene. Per onestà occorre dire che si è basato su una cosa simile di Peter Norvig di cui ho già accennato in passato ma conto di tornarci (dipende ovviamente dalle reazioni a questo post) e c’è riuscito benissimo.setIntanto parte con un minicorso del suo interprete Tiddlylisp (tiddlywinks è un vecchio gioco, ormai in disuso, conosciuto da noi come pulci). Tiddlylisp è piccolo ma completo. Certo mancano delle cose che in un interprete serio professionale si danno per scontate; un’istruzione dev’essere contenuta in una riga, per esempio e mancano costrutti usuali. Ma funziona e il corso di Michael è preciso e esauriente. Chi non conosce il Lisp può farsi un’idea precisa, tanto poi se passa a una versione vera scopre che ci sono i dialetti e ogni implementazione è una cosa a se e che ogni utente personalizza la sua copia fino a diventare incompatibile con il resto del mondo.

Se invece di usare interattivamente l’interprete gli si da un file di codice da eseguire la limitazione dell’istruzione monoriga cade e abbiamo (come Michael ci dimostra) la possibilità di risolvere compiti più complessi.pythonQuesta è la prima parte del post (sì è lungo, molto più lungo di quello che si trova di solito nei blog). Ma adesso viene il bello, cioè no, si continua ma adesso con Python. E c’è il codice e la descrizione che è non banale ma, in fondo, molto più semplice di quello che mi sarei immaginato.

Per finire si parla di costruire un interprete Lisp in (esatto) Lisp. E i commenti dei lettori ampliano ancora il discorso. Tutti più bravi di me, ovviamente.

Ecco, che ne pensate? Forse sono solo io a stupirmi di questo modo di intendere la programmazione, o è il mantra “Lisp is a programmable programming language“.

Poi, certo, si usano altre cose, C++, Java, Python, …
Io per diversi anni avevo solo il Fortran. Poi le cose sono peggiorate: è arrivato il Basic (non c’è mai limite al peggio).

Ancora una nota: lo cita anche Michael ma è troppo bello devo farlo anch’io: The Roots of Lisp di Paul Graham.

Python libri da scaricare

Python è il nostro linguaggio preferito, o uno dei nostri linguaggi preferiti, o uno dei linguaggi di programmazione che vanno di moda, o insomma, quello che è.
python-logo-officialE se si trovano delle risorse su Python tanto vale darci un’occhiata, chissà…
E allora ben venga quest’iniziativa di Leet Tips (ma Leet si deve scrivere 1337?) che vi vado a presentare: top 10 free python pdf ebooks download to learn python.

Anzi, vi riporto l’elenco qui sotto, in italiano, con un piccolo giudizio per ognuno di loro. No, non li ho letti, non ancora, ma dall’indice e una scorsa veloce si possono scoprire tante cose. Forse.

A Byte of Python: facile per iniziare, 129 pagine, sembra bello e completo. Uh! esiste anche una versione in italiano.

Learn Python the Hard Way: questo è famoso, l’ho usato tanto tempo fa, forse ne ho anche parlato. Si può leggere la versione HTML online.

How to think like a computer scientist: Bello, forse un po’ serioso (sapete come sono gli scientisti ;-) ),  da scaricare, 280 pagine.
Come fa notare Jeremie nei commenti c’è una nuova versione in html, qui.

The Python Tutorial: questo è sul sito ufficiale di Python, dovreste già conoscerlo; lo conoscete e consultate vero?

Think Python: questo per chi vuole essere guidato passo-passo, 240 pagine; è un alternativa a “How to Think…”, nuovissimo.

Python 101: introduttivo, un unico file HTML lunghissimo, un po’ vecchio ma OK.

Python Programming: un Wiki usato all’MIT, anche in versione PDF, 159 pagine.

Python Standard Library: vecchio, non aggiornato, ma forse da tener presente. HTML consultabile online.

PLEAC Python: un ricettario di esempi concisi, in HTML.

Text Processing in Python: non recentissimo, ma chissà…

OK, non credo servano tutti, ci sono altre cose da fare nella vita oltre che leggere manuali di Python. Ma intanto buona lettura :-D

Non so se vale fare la traduzione, semplificata, di un post ma se mi limito a una segnalazione so già che pochi seguono il link. I miei lettori vogliono leggere me ;-)

Statistica con J

jredSi può usare J, la mia ultima scoperta?
Ci sono dei casi in cui, mi dicono, è proprio quello che ci vuole. Allora, ci ho provato. Confesso che sono ancora mooolto n00b|niubbo ma ho cominciato a leggere la documentazione (è un mattone!), con scarsi risultati per adesso. Questo post è un primo tentativo di valutazione, anche in funzione di un incontro con un guru di J, R e altri linguaggi orientati alla matematica e statistica. Mi preparo a una ramanzina di quelle mai viste.
Se nel frattempo arrivassero suggerimenti… chissà ;-)

Il caso che considero è elementare: calcolare media e deviazione standard (sigma) di una serie di dati.
Si può fare facilmente in millemila modi, ne considero tre, tipici secondo me.

J è fatto apposta e allora proviamolo. Cioè vorrei ma la cosa non è così semplice (sono ancora un pivello, l’ho già dichiarato).
Dalla documentazione che arriva con l’installazione (o da una successiva googlata, non ricordo esattamente) ho messo assieme questo script. Pessimo, sono un pischello, non ho trovato come passare i dati sulla linea di comando. E J mi fa rimpiangere finanche Perl!

#!/home/juhan/bin/j7
mean =: +/ % #
dev =: - mean
stddev =: [: %:@mean *:@dev

dati =: (1 2 3 4 5)
echo 'dati = ' , ": dati
m =: mean dati
echo 'mean = ' , ": m

d =: dev dati
echo 'dev = ' , ": d

stdd =: stddev dati
echo 'std_dev = ' , ": stdd
exit''

std_j

Mi piace poco la shebang, si deve cambiarla cambiando macchina; forse il symlink j7 conviene spostarlo in /bin quando si installa J.

E se --solo per adesso finché scopro come si usa davvero J-- lo script fosse eseguito dalla shell, che invoca j7 attraverso una pipe? In questo modo riesco a passare i dati sula linea di comando.
Questo modo di usare la pipe non funziona però con Windows. E anche $* e la shebang e l'opzione -n di echo. Insomma con Windows si dovrebbe operare in modo completamente differente (ho anche un abbozzo ma lo tengo per il futuro).

#!/bin/sh
echo dati = $*
echo -n "   media ="
echo "(+/ % #)" $* | j7
echo -n variance =
echo "(- (+/ % #))" $* | j7
echo -n std dev =
echo "([: %:@(+/ % #) *:@(- (+/ % #)))" $* | j7
echo ""

m_j

Ma non c'è solo J, per fortuna!

Il linguaggio di programmazione ideale per queste cose, secondo me, è Python. O Ruby, o Lua, o Falcon, o quello cui siete abituati.
Con Python è facilissimo e, a differenza del precedente, chiaro:

s = [1, 2, 3, 4, 5]
def average(s): return sum(s) * 1.0 / len(s)
avg = average(s)
print "avg =", avg
variance = map(lambda x: (x -avg)**2, s)
print "variance =", variance
print "average(variance) =", average(variance)
std_dev = average(variance)**0.5
print "std_dev =", std_dev

stddev

OK, l’ho trovato sul Web (mentre cercavo per J). E dentro si trovano sia map() che lambda(). Non che siano necessari ma fa fine, imho. Devo abituarmi a usarle più spesso.

La versione Python (o linguaggio affine, come detto sopra) è la mia versione. Non avrei difficoltà a modificarla, stravolgerla al volo se se ne presentasse l’occasione. Niente panico :-D

OK, in realtà esiste una terza soluzione, l’ho lasciata per ultima ma sarebbe quella utilizzata nella quasi totalità dei casi: la soluzione del mio amico Beppe S, quella che impiega Excel, o un altro foglio di calcolo, io ho usato LibreOffice Calc (ma l’ho verificata con Excel, funziona anche di là).

excel

L’unica difficoltà (sono niubbo) è stato trovare il nome della funzione, STD.DEV.POP().

Per il resto è OK, anche i dati si riescono (loro io sono n00b) a copia-incollare nella relazione, scritta usando Word. E volendo riesco anche a diagrammare all’interno del foglio di calcolo: nessuno ama Gnuplot.

Riguardo J: devo ancora leggere un mucchio di roba ma continuo a domandarmi se ha senso usare verbi di una o due lettere, per niente mnemonici. Allergia alla tastiera?

Panico: adesso pare non funzionino le opzioni per la selezione, copia e stampa dei codici inseriti, chissà se è solo temporaneo :-o :-(

lcm – J (e Python)

La serie su lcm  –minimo comune multiplo– continua, ancora per questa puntata. Poi come tutte le cose belle (a me è piaciuta questa passeggiata in territori nuovi (per me)).
I post precedenti sull’argomento (proposto dall’amica Annarita) li trovate qui, qui e qui.

Oggi una cosa completamente diversa, frutto della googlata per vedere quali linguaggi trattavano l’argomento e come. Subito sono arrivato a una pagina molto interessante e non vi dico la fatica per riuscire a non dirvelo finora!

rosetta

Rosetta Code è davvero da seguire, lcm lo trovate qui: Least common multiple.

Uh! 60 linguaggi, alcuni mai sentiti. Ma tra i tanti (c’è anche awk però sarebbe una quasi ripetizione del post sul Fortran) ce n’è (secondo me) uno speciale: J.

J provides the dyadic verb *. which returns the least common multiple of its left and right arguments.

Vero che ci sarebbero anche altre cose interessanti: CL (i saputi non dicono mai Common Lisp), Factor e Haskell ce l’hanno già pronto. Ma torno a J.

J

Questa è l’occasione buona per installarlo, me ne hanno parlato in passato, ne ho parlato anch’io e oggi è il giorno di ora o mai più.

L’installazione si fa partendo dalla J Home, crea due directories nella home (su Linux, esiste anche la versione Windows). Ci sono tre modalità d’uso: classica, nel browser e con GUI. Io che sono vecchio uso la migliore.

Siccome l’installazione è non standard la prima cosa che conviene fare è un link simbolico (quello che in Nautilus viene chiamato collegamento) all’interprete, nel mio caso ecco il risultato:

link

Allora proviamo…

j0

Funziona! Un paio di dritte per chi, come me, non afferra subito tutto al volo:

  • il prompt di J è 3 spazi, quasi invisibile;
  • exit'' per uscire, non vi dico l’energia spesa per trovarlo (leggere il manuale prima! o almeno un’intro).

Esiste anche la possibilità di fare uno script che invochi l’interprete. Però nella shebang dovete mettere la vostra home scritta per bene, non vale ~ e neanche $HOME.

Ma si può fare anche con la shell, così:

#!/bin/sh
echo "(*./)" $* | j7
exit''

j1

OK.

Si può fare un passo ancora, integrare lo script J entro il nostro linguaggio abituale, per esempio Python. Cerrrto usando la pipe.
Avevo già trattato questo argomento nell’antichità, qui ma avevo usato funzioni che adesso sono deprecate e poi si può fare più brevemente, così:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import subprocess

cmd = ['./lcm.j', '3 4 5 6']

res = subprocess.check_output(cmd)
p = res.find('\n')
num = res[:p]
n = int(num)
print n

j2

L’esempio è minimo perché su Python sappiamo tutto vero? E poi devo andare a leggere il manuale di J, promette che in sei mesi dimentico che esistono i loop ;-) :-) :-D

lcm – minimo comune multiplo

Tutto è nato da qui: Qual è Il Più Piccolo Numero? [Per I Giochi Matematici].

quale-il-numeroCerte prof…
Che poi Annarita è coautrice del blog, l’altro blog.
E vi assicuro che è brava, rockz :-D

Allora il problema è:

Un numero intero maggiore di 2 lascia un resto di 2 quando è diviso da ciascuno dei seguenti numeri: 3, 4, 5 e 6. Qual è il più piccolo numero che abbia tali caratteristiche?

I ragazzi, alcuni allievi, altri no, hanno risposto esattamente, bravi :-D
Nessuno però ha riportato la prima cosa che ho pensato io: quel numero deve essere modulo 2 per ognuno dei numeri dati, quindi dev’essere 2 più dell’mcm (minimo comune multiplo, ai miei tempi si scriveva così, spero sia ancora valido).

Il passo successivo è stato –prima di subito– pensare di automatizzare la soluzione per qualunque lista di numeri. Usando il ‘puter, certo.
Tra tutti i linguaggi di programmazione ho pensato a Python perché molto conosciuto, facile, potente, sexy, … Insomma io consiglio Python per quasi tutto, anche per questo.
Dunque minimo comune multiplo in inglese si dice least common multiple e allora cerco nella documentazione online; probabilmente la funzione si chiamerà lcm, come per l’MCD (si scrive così, vero) si chiama gcd per greatest common divisor.

Non l’ho trovata! Panico? No, niente panico! c’è scritto anche sulla copertina della Guida Galattica :-D

Si può fare, mi son detto, che sarà mai…
Ma mi sono accorto subito che sì, è fattibile ma viene lunga, vediamo se qualcuno ha avuto un’idea migliore, il Web è pieno di geeks.
In questi casi la cosa migliore è Stack Overflow e difatti ecco qua: Least common multiple for 3 or more numbers.

Ho imparato da tempo che conviene leggere fino in fondo, difatti ecco che c’è scritto “[...] Here’s one:  enrico-franchi.org/2010/09/nice-functional-lcm-in-python.html

OK, quello che cercavo, bravo Enrico :-)

Allora, si ha:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from fractions import gcd

def lcm(numbers):
    return reduce(lambda x, y: (x * y) / gcd(x, y), numbers, 1)

numeri = sys.argv[1:]

for n in range(len(numeri)):
	numeri[n] = int(numeri[n])

print numeri
LCM = lcm(numeri)
print LCM

lcm

La funzione di Enrico fa tutto lei, basta passargli la lista degli argomenti, togliendo il primo (quello con indice 0 che contiene il nome dello script). Ah sì, gli argomenti sono stringhe e vanno trasformati in interi. Tutto qui.

Ma aspetta un attimino: non hai raccontato di SymPy recentemente?
Sì, vediamo: Computes integer least common multiple of two numbers.
OK, per due numeri. Quindi diventa:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from sympy import ilcm

numeri = sys.argv[1:]

for n in range(len(numeri)):
	numeri[n] = int(numeri[n])

print numeri
LCM = reduce(ilcm, numeri)
print LCM

lcm_sympy

In ogni caso per una lista di numeri bisogna usare reduce(). Che è una di quelle cose che all’inizio uno si chiede a cosa serva, come lambda (che c’è nella versione di Enrico).

Allora reduce, lo cerchiamo sulla guida online:

reduce(function, iterable[, initializer])

Applica function di due argomenti cumulativamente agli elementi di iterable, da sinistra a destra, in modo da ridurre l’iterabile a un solo valore. Per esempio, reduce(lambda(x, y: x+y, [1, 2, 3, 4, 5]) calcola ((((1+2)+3)+4)+5).

OK, caso chiuso, per Python.
Ma per gli altri linguaggi?
Calma, prossimamente: Ankh-Morpork non è stata costruita in un giorno ;-)

Invece del link

Continuo dal post precedente Usare un link simbolico  vista l’impraticabilità della soluzione “symbolic link” con Windows.
Come mi è stato fatto notare quelli su Windows non sono link ma collegamenti (ahemmm…). Anzi in inglese si chiamano shortcut, nessuna possibilità di confusione. Per sapere tutto su questa bestia c’è, al solito, Wikipedia.
OK, l’alternativa. Ma a questo punto devo dare prima una spiegazione: a cosa serve, cosa devo fare?
Ecco, si tratta di Gnuplot. Qui un esempio semplicissimo, per comodità ricopio lo script:

set term dxf
set output 'dxf.dxf'
TITLE = "DXF"
set title TITLE offset char 0, char -1
set xrange [0:7]
set yrange [0.7:10.3]
unset key #toglie la legenda

plot "dati-dxf" with linespoints # lw 3

Quello che rende bello questo script è che i dati da diagrammare (plottare) sono su un file separato, non c’è bisogno di cambiare lo script per altri dati. Almeno con Linux se le linee 2 e 9 contengono nomi di link simbolici invece di nomi di file. Adesso immaginatevi un lavoro vero: ci saranno da produrre diversi diagrammi, tutti simili, una pizza, se si deve fare con Windows.

Ancora un’osservazione: sì ho scorso il manuale (non tutto ma le parti che mi sembravano sull’argomento) e pare che non sia un’opzione prevista. Il manuale l’ho trovato anche molto soporifero e un po’ confuso.

La soluzione per Windows è di fare una copia dello script sostituendo la stringa segnaposto per i nomi dei file con quella passata come parametro. Non sarà ottimale ma funziona.

Allora, questo è lo script, modificato, da usare come template.

set term dxf
set output 'NOMEFILE.dxf'
TITLE = "DXF"
set title TITLE offset char 0, char -1
set xrange [0:7]
set yrange [0.7:10.3]
unset key #toglie la legenda

plot "NOMEFILE" with linespoints # lw 3

E questo lo script Python

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os, sys

if len(sys.argv) <= 2:
	print 'uso:', sys.argv[0], '<nome script> <nome dati>'
	sys.exit(1)

nomescript = sys.argv[1]
nomedati = sys.argv[2]

if not os.path.exists(nomescript):
	print nomescript, 'non esiste'
	sys.exit(2)

nomecopia = '{}_{}'.format(nomedati, os.path.basename(nomescript))
print 'creo', nomecopia,

f = open(nomescript, 'r')
scr = f.read()
f.close()

cerco = 'NOMEFILE'
off = len(cerco)
p = scr.find(cerco)
while p >= 0:
	print p,
	scr = '{}{}{}'.format(scr[0:p], nomedati, scr[p+off:])
	p = scr.find(cerco, p + off + 1)

g = open(nomecopia, 'w')
g.write(scr)
g.close()
print

tpl

Ecco il risultato:

meld

OK.

Conclusioni:

  • sembra che funzioni;
  • mi rileggo il manuale non vorrei mai che…;
  • queste cose si fanno su Ubuntu (TehBoss).

Basta, torno a Go.

Usare un link simbolico

Questo post (e un altro in via di preparazione) è molto meno intrigante e attuale di quelli comparsi su questo blog a firma dei miei collaboratori (Wal dikiyvolk, per esempio) ma è quello di cui mi sto occupando. Con dei non informatici (non lo sono neanch’io), il mondo è grande, e vario.
Ma poi torno alle cose normali, promesso.
symlnkIdea (non mia, grazie Lole (il post avresti dovuto scriverlo te (imho))): invece di riferirsi a un file usare un link simbolico allo stesso.

0
Ma funziona anche con Python?

#!/usr/bin/python
# -*- coding: utf-8 -*-

flink = 't.txt'    # symlink a text.txt
f = open(flink, 'r')
txt = f.read()
f.close()
print txt

l1

OK, funziona, non metto lo screenshot, è uguale al precedente. E si può creare dentro Python il link?

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os

fname = 'text.txt' # file di testo
flink = 't.txt'    # symlink a fname

os.symlink(fname, flink)
f = open(flink, 'r')
txt = f.read()
f.close()
print txt

OK, funziona. E se il link esiste già?

l2

OPS! errore, modifico:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os

fname = 'text.txt' # file di testo
flink = 't.txt'    # symlink a fname

if os.path.lexists(flink):
	print 'esiste, lo cancello\n'
	os.remove(flink)

os.symlink(fname, flink)
f = open(flink, 'r')
txt = f.read()
f.close()
print txt

l3

Ma si può fare di meglio: se il symlink punta già al file giusto non c’è bisogno di cancellarlo e ricrearlo.

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os

fname = 'text.txt' # file di testo
flink = 't.txt'    # symlink a fname

if os.path.lexists(flink):
	rpl = os.path.realpath(flink)
	print rpl
	rpf = os.path.realpath(fname)
	print rpl
	ok = rpl == rpf
	print ok

l4

OK, quindi basterebbe mettere tutto assieme … ma funziona anche con Windows?

w0 w1 w2 w3 w4

Disastroso :-(
Questa via non è praticabile, se vogliamo l’interoperabilità degli script tra i due sistemi operativi. Anzi, nel nostro caso siamo maggiormente interessati a Windows.

C’è però un’alternativa, si diceva… prossimamente… forse ;-)

SymPy – un esempio, anzi la soluzione

sympyRecentemente mi sono occupato di SymPy, con 4 post noiosi tipo “Uh! vediamo quello che fa!“. Qui, qui, qui e qui.
È arrivato il momento di confessare il perché del mio interesse istantaneo appena John D. Cook me ne ha parlato (vedi il primo link).
Quello che m’interssava era di velocizzare un programmino (non a tutti piace il termine ‘script’ ;-) ) per la soluzione di equazioni di terzo grado. In realtà sono andato un po’ oltre, parecchio oltre: lo script il programmino di oggi è molto più generale.

Ah, sì! è da finire, mettergli una veste grafica sexy e rendere l’espressione della riga 7 una variabile da leggere in un box. Ma quella è una cosa ordinaria, vero? Anche se fareste bene, come sempre, a tener conto della legge di Hofstadter.

Allora ecco lo script, tutto qui:

#!/usr/bin/python
# -*- coding: utf-8 -*-

from sympy import *

#dati
my_expr = 'x**3 -3 * x**2 + 42' # espressione (senza = 0)
my_sym = 'x'					# risolverla per x

res = solve(my_expr, my_sym)
numres = len(res)
print numres, 'soluzioni\n'

for s in res:
	vs = s.evalf()  # valore di s
	tv = vs.is_real # s è reale e non complesso
	strs = str(s)	# espressione, non troppo lunga
	if len(strs) > 60:
		p = strs.find(' ', 60)
		if p > 0:
			strs = '{0}\n{1}'.format(strs[:p].rstrip(),
			                         strs[p+1:].lstrip())
	print strs, '\n -> ', vs, tv, '\n'

s0

Sembra forse troppo semplice per farci un post. Ma c’è dietro tutto Python e Sympy, e poi è sabato :-D

Iscriviti

Ricevi al tuo indirizzo email tutti i nuovi post del sito.

Unisciti agli altri 37 follower