Archivio autore:

Sul FORTRAN di EWD

f0A seguito del post su Dijkstra  e di un paio di telefonate mi è venuta voglia di farvi vedere com’era il codice quando ho iniziato a lavorarci io. In realtà sto barando: con il Fortran 77 l’if era ormai multilinea, come if/then/else ma i vecchi (di allora) continuavano a usare il IV e lo imponevano.

Sieve_of_Eratosthenes_animation

L’immagine che illustra il crivello di Eratostene che in questi giorni circola su G+ (credo sia di John Baez Skopp (vedi commento, grazie Annarita!)) è l’ideale per implementare un programmino nel Fortran delle origini. Eccolo

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
C     ERAHOSTHENES

      DIMENSION NUMERI(20), LPRIMI(10)

C     NUMERI CONTIENE I NUMERI CHE POSSONO ESSERE PRIMI  
      DO 10, I = 1, 20
10    NUMERI(I) = I
      NUMERI(1) = 0  

C     NPRIMI = IL NUMERO DI PRIMI TROVATI
      NPRIMI = 0
      NTROV = 2

C     QUANDO NE TROVO UNO LO AGGIUNGO ALLA LISTA DEI PRIMI
20    NPRIMI = NPRIMI + 1
      LPRIMI(NPRIMI) = NTROV

C     ELIMINO I SUOI MULTIPLI NELLA LISTA DEI NUMERI
      J = 1 
30    J = J + 1
      NT = NTROV * J
      IF(NT .GT. 20) GOTO 40
      NUMERI(NT) = 0
      GOTO 30

C     PASSO ALL ESAME DEL CANDIDATO SUCCESSIVO
40    N = NTROV
41    N = N + 1
      IF(N .GT. 20) GOTO 60
      IF(NUMERI(N) .EQ.0) GOTO 41
50    NTROV = N
      GOTO 20

C     FINE DELL ESAME DELLA LISTA
60    DO 65 I = 1, NPRIMI
65    WRITE(*, 90) I, LPRIMI(I)
90    FORMAT(2I4)

      END

ERAT

Nello spirito del tempo ho scritto tutto in maiuscolo ;-) Però non ce l’ho fatta a non lasciare spazi: allora si sarebbe scritto tutto come J = J + 1. E un’altra cosa ancora: la riga a cui l’esecuzine saltava a seguito di un GOTO era tipicamente del tipo:

50    CONTINUE

essendo quest’istruzione segnaposto fatta proprio apposta per questo. Ma il mio programma sarebbe diventato troppo lungo, inutilmente.
Un’altra cosa: è quasi immediata l’ottimizzazione considerando che 2 è l’unico primo pari, dimezzando il numero di numeri da testare ma il codice si allunga, lasciato come esercizio.

Ecco, allora si programmava così. Non ho più il libro ma nel testo che si usava al Poli c’era scritto: “finito di perforare le schede fai una stampa del listato e controllala attentamente prima di provare l’esecuzione“, vero anche perché a me al primo tentativo è successo questo:

0

Avevo sbagliato il numero di una label.
Bon! Nostalgia OFF! :-D

EWD1284

Twitter è meraviglioso! Lì trovi delle dritte, dei suggerimenti che non trovi in nessun altro social-coso. Perché forse lo sapete già che io sono relegato qui in fondo alla West Padagna. Prendi per esempio Robert Smith, un vecchio matematico e lispista noto come Symbo1ics Ideas.

L’altro giorno ha twittato questo:

ewdL’URL è relativa a un pezzo del solito E.W. Dijkstra, in particolare Computing Science: Achievements and Challenges  dove ci sono tante idee. Roba che letto alla sera sul Kindle mi ha fornito incubi per tutta la notte.

OK, è vecchio, diciamo sui 15 anni, e racconta di cose ancora più vecchie, più di 60 anni. Parla dei primi linguaggi di programmazione: FORTRAN, LISP e ALGOL 60. E altre cose ancora, leggetelo.

Ora sono pochi i linguaggi attuali che non abbiano tracce di Algol nel loro DNA. Sul Lisp ci sarebbero troppe cose da dire (e di solito scappano tutti quando ne parlo) ma quello che mi ha colpito è il Fortran, io sono|ero un fortrainer.
I giovani danno per scontato che certe cose ci siano sempre state: falso! Anche cose semplici sono state grandi conquiste, per dirne una chi oggi perderebbe tempo per scrivere una funzione per l’ordinamento di un array?
Ma ci sono di mezzo anche le persone, gli umani con le loro convinzioni.

Tornando al Fortran questo aveva ambizioni molto limitate: velocizzare calcoli che fatti a mano avrebbero richiesto troppo tempo: un sistema di 3 equazioni in 3 incognite si risolve al volo, con 4 diventa impegnativo e poi se il numero aumenta come certe volte è richiesto molto oneroso. La macchina lo fa al volo (quasi, ma allora sembrava così). Ah! sì, le moltiplicazioni e le divisioni si facevano con il regolo (io so ancora usarlo).
Però con il Fortran non potevi fare tutto. E qui EWD racconta:

During an oral examination I had a student develop a program which we would now recognize as implementing pointer manipulations using a one-dimensional array. The candidate did very well until at the very end he got mysteriously stuck, neither of us understanding why. It turned out that he should have written down “a[a[i]]:= ….” but that mental block prevented him from conceiving that because FORTRAN (to which he had been exposed extensively) did not allow index expressions as complicated as “a[i]“. It was a revealing warning of the devious influence the tools we use may have on our thinking habits.

Ecco, anch’io mi sono bloccato su questo. Tant’è vero che voglio vedere cosa si può fare con 60 anni di ritardo e, purtroppo, senza il compilatore di allora.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
program edw0

implicit none
integer :: i, a(10) = [3, 4, 5, 6, 7, 8, 9, 10, 1, 2]

print *, 'inizio'
print '(10i3/)', a

i = 5
a(a(i)) = 42

print *, 'dopo'
print '(10i3/)', a

end

p0

OK, funziona, come pensavo. C’è stata un’evoluzione anche nei compilatori.
Il problema piuttosto è un altro con questi pseudo-puntatori:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
program edw1

implicit none
integer :: i, j, a(10) = [3, 4, 5, 6, 7, 8, 9, 42, 1, 2]

print *, 'inizio'
print '(10i3/)', a

i = 2
j = 8
a(a(i)) = a(a(j))

print *, 'dopo'
print '(10i3/)', a

end

p1

Notare come il quarto elemento dell’array sia 0, se il programma fosse più complesso probabilmente avremmo un valore casuale. Inoltre questo tipo di errori logici non vengono rilevati dal compilatore. Si sa i pointers sono delle brutte bestie, in Fortran non c’erano ma questo caso era tipico dei COMMON.

I vecchi direbbero subito che questo non è Fortran, non si scriveva così non solo nel IV ma nemmeno nel 77.
Ma intanto oggi quello che si faceva con il Fortran si fa con altre cose, per esempio Python.

OK, posso smettere quando voglio ;-)

Ruby – operatori logici

r6

Gli operatori logici (o booleani) consentono di stabilire se una cosa è vera o no. “Uno vale uno” (cit.), verifichiamo:

l0

OK! Notare il doppio segno di uguale; siccome il segno di uguale lo usiamo per l’assegnazione, p.es. a = 5 per valutare l’uguaglianza lo raddoppiamo. Vediamo un altro caso:

l1

vero, cioè falso, cioè 1 è diverso da 2 ;-)

C’è poi l’operatore != (diverso), verifichiamo:

l2

che, ovviamente restituisce l’opposto di == (uguale).

Adesso l’operatore > (maggiore):

l3

e < (minore):

l4

Ci sono poi >= (maggiore o uguale) e <= (minore o uguale):

l5

Secondo Karthikeyan, I Love Ruby, ci sono altri due operatori logici che di solito non si trovano nei linguaggi di programmazione !< (non minore) e !> (non maggiore):

l6

no! pare di no. Ma se ci pensate !< è un doppione di >=. E se usassimo un linguaggio serio questo operatore mancante, se proprio volessimo, lo potremmo implemtare al volo, prima di subito! (Sì, sto parlando di quello, il Lisp).

Un’ultima cosa: true e false sono costanti logiche (o booleane) predefinite. Per cui capita che:

l7

Chiaro vero? L’ho capito anch’io: “true” e “false” sono stringhe; come lo sarebbero ‘true’ e ‘false’.

Siamo pronti per gli operatori di scelta, if, unless, case e simili, il prossimo post ;-) :-)

Visto nel Web – 79

Parecchie news, prossimamente, forse…
Per intanto ecco cosa ho visto nel Web.

laser-safety-page
I vip, gli insulti su Twitter, i troll e la gente comune che non è anonima

mitica Galatea!
::: IL nuovo mondo di Galatea

Twitter: servono nuove regole. No, abbiamo bisogno di cultura digitale
::: Valigia Blu

Samsung is hurting Android
::: Trusted Reviews

dentro

Mettiamo il turbo sburlo al nostro androide da 99 euri
::: il nido del Picchio

Android e i cambiamenti apportati al kernel Linux
avevo linkato l’originale poi ho visto il lavoro del Bl@ster
::: Bl@ster’s

Con una semplice modifica la Casa Bianca accelera sugli open data. E in Italia?
::: il Sole 24 Ore

BJtMEPRCEAIFMwI

Se SQLite vi sembra lento…
::: Robitex

Chiudere o non chiudere, questo è il problema!
::: My Social Web

Il Piccolo Libro di MongoDB
::: Nicola Iarocci

Archimede Smipper

Archimede Smipper

Plotly automatically makes a beautiful graph
::: plotly

Go 1.1 is released
::: The Go Programming Language

tl;drLegal, le licenze Open Source spiegate semplicemente
::: LinuxBird

bonifici

Terra
Terra is a new low-level system programming language that is designed to interoperate seamlessly with the Lua programming language
::: Terra ::: Lambda the Ultimate

Add Clippy or his friends to any website for instant nostalgia
::: Smore

Windows Kernel Developer Vents Out Against Microsoft; Says It Shuns Innovation
::: EFYTimes

windows95

How Mighty Mint became one of the most popular Linux distros
::: TechRadar

Why Go?
::: Nathan Youngman ::: Ars Technica

9 mesi di carcere per una pagina Facebook: abbiate paura
fondamentale il .mau.
::: tom’s ::: Il Fatto Quotidiano ::: voices

029

OpenGL 101: Drawing primitives – points, lines and triangles
::: Solarian Programmer

With Lucky Sort creators on board, Twitter is officially a data company
::: GigaOM

The $12 Gongkai Phone
::: bunnie:studios

formigoni

Has Supercomputing Hit a Brick Wall?
::: Slashdot

Il futuro di Android e di Chrome OS
::: LinuxBird

Wikeleaks e il decreto Romani
::: Nicola D’Angelo

IMG_1551

UNESCO to make its publications available free of charge as part of a new Open Access policy
::: UNESCO

Enseignement de l’informatique – rapport de l’académie des sciences
::: Le slow blog de Serge

So Long, Cinnamon: Cinnarch Linux is reborn as Antergos
::: PCWorld

8c08b3e19980bb3628fe8dff16f02bb8

Larry Page’s Vocal Cords Are Partially Paralyzed
::: Slashdot

Netactview: tenere sotto controllo la nostra connessioni di rete in Ubuntu Linux
::: lffl

Interpol filter scope creep: ASIC ordering unilateral website blocks
::: Delimiter

lupi

Georgia Tech and Udacity Partner for Online M.S. in Computer Science
dubbi: funziona?
::: Slashdot

Canadian Anti-Piracy Outfit Pirates Photos for its Website
::: TorrentFreak

Apple’s new Objective-C to Javascript Bridge
::: steamclock

weird

8 Reasons Why Ubuntu Users Should Try Out Linux Mint
::: TechSource

Collusion, un add-on per scoprire chi ti traccia online
::: LinuxBird

Mappa del Made in Italy digitale
::: LinuxBird

monads

[OS X] Creare USB live di qualsiasi distribuzione linux
::: ReefBits

Extreme syntax
leggere anche i commenti; tentato di farci un post noioso
::: The Endeavour

thread profiling in Python
::: idle thoughts

493_475494699170650_848025430_n

Patenting Open Source Software
::: Slashdot

Comunicazione e condivisione in tempo reale attraverso il web
::: LinuxBird

CommaFeed il nuovo aggregatore di feed open source
io adesso uso TheOldReader ma chissà…
::: lffl

217369_553189708055484_408712827_n

Sorry, Larry Page: Tech-Industry Viciousness Is Here To Stay
::: Slashdot

Australian Government Backdoor Internet Filter Shuts Down 1,000 Websites
::: Slashdot

unixkcd
::: xkcd

childhood

How to Learn Emacs: A Hand-drawn One-pager for Beginners
::: Sacha Chua

[Editoriale] Skype è il nostro “Grande Fratello”?
::: lffl

perl 5.18.0 is now available!
::: perl.org

scratch

A Guide to Python’s Magic Methods
::: rafekettler

Electronics-Loving ‘Crazy Ants’ Invading Southern US
::: Slashdot

Using Definite Clause Grammars in SWI-Prolog
in un modo diverso?
::: Pathways

fb

Arduino Branches Out, With a Plug-and-Program Robot
::: Slashdot

The Evolution Of Hacker News
::: TechCrunch

vim

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 ;-)

Ruby – leggere da terminale e commenti

r5OK, c’è stata una lunga pausa nell’esame di Ruby. L’ultima puntata è stata questa, tanto tempo fa: Ruby – iniziamo con gli script.
Ora ripaprto. E continuiamo a fare pratica con gli script. Dopo “Hello World!” sarebbe bello che lo script salutasse proprio te. Così:

#!/usr/bin/ruby
puts "Ciao sono il 'puter"
print "come ti chiami:"
name = gets()
puts "Ciao #{name}Buona giornata!"

c1

gets fa l’opposto di puts: invece di scrivere la stringa sul terminale legge quella che scriviamo.

Naturalmente la quinta riga potevamo scriverla anche come: puts "Hello " + name + " Buona giornata!"

Due cose:

  • notare l’a-capo anomalo prima di "Buona giornata", sarà da indagare in futuro;
  • solo per chi usa Linux la prima riga è speciale, permette di rendere lo script eseguibile in questo modo:

c1-1

In Windows non esiste l’equivalente e la riga viene considerata come un commento, come in realtà è.

Già, i commenti. Tranne dentro le stringhe “” come nel caso precedente Ruby considera il carattere # e tutto quello che segue fino alla fine della riga come un commento, serve a noi ed è ignorato dall’interprete, come in questo caso:

#!/usr/bin/ruby

# esempio (scemo) di commenti
v1 = 5 # primo dato
v2 = 7 # secondo
res = v1 + v2 # somma
print "la somma di #{v1} + #{v2} vale #{res} #sapevatelo\n"

c2

Qui vediamo diversi tipi di commenti:

  • la prima riga, speciale di cui abbiamo già detto (è talmente speciale che ha un nome, shebang);
  • la terza riga, tutta di commento;
  • le righe 4, 5 e 6 con un’istruzione e poi un commento;

Notare che il carattere # nell’ultima riga non è un commento. Anche le righe vuote, come la seconda vengono ignorate dall’interprete, proprio come i commenti.

Alle volte il commento che vogliamo scrivere è troppo lungo per una riga sola. In questo caso possiamo fare così:

#!/usr/bin/ruby

=begin
    esempio (scemo) di commento multilinea
    è tutto un commento fino a quando lo
    chiudiamo con la keyword che segue
=end
v1 = 5 # primo dato
v2 = 7 # secondo
res = v1 * v2 # prodotto
print "il prodotto di #{v1} * #{v2} vale #{res} #sapevatelo\n"

c3

Quando la lunghezza dello script supera poche righe questo tipo di commenti diventano molto utili, non immaginate quanto. Notare che le keyword =begin e =end devono cominciare in prima colonna, niente spazi.

Compito a casa: cosa succede se metto un commento multilinea dentro a un commento multilinea? ;-)

Visto nel Web – 78

Vi confesso un segreto: sono in ritardo terribile su (quasi) tutto. Forse da questo scaturiranno post nei prossimi mesi ma adesso panico. Per intanto ecco cosa ho visto nel Web.

mamma

Programmez votre Raspberry Pi depuis le confort de votre navigateur Web – et en JavaScript!
::: FinuxFr

Bruce Schneier: Why Collecting More Data Doesn’t Increase Safety
::: Slashdot

Know Thy Complexities!
::: Big-O

fiamma

La nuova sfida: educare chi va sul web
::: la Stampa ::: OLMR ::: Luca De Biase ::: Nicola D’Angelo ::: manteblog ::: manteblog

Terms of Service; Didn’t Read
::: Term of Service

391097_302006316597481_611106932_n

Making UEFI Secure Boot Work With Open Platforms
::: The Linux Foundation

BitTorrent Sync, prova su strada
::: ReefBits

Ramanujan approximation for circumference of an ellipse
::: The Endeavour

linux_search

Casa domotica controllata da Android, anche con i comandi vocali di Google Now
::: Tutto Android

Big Data: la mia rubrica su Europa – L’illusione del potere della rete
::: Vincos

Signs that you’re a bad programmer
::: Software Engineering Tips

parcheggio

elementary OS Luna Beta 2 Rilasciata, le novità e download
::: lffl

Iniziative per domani. Da conoscere oggi. Innovazione, impresa, startup, informazione, diritti
::: Luca De Biase

How to be effective at open source: by programmers, for programmers
::: Daniel Lemire

BIzG6M4CYAEIXkX

Prenda hammered: Judge sends porn-trolling lawyers to criminal investigators
::: Ars Technica

U.S. Directly Blames China’s Military for Cyberattacks
::: The New York Times ::: Slashdot

Full Circle Magazine: script per scaricare facilmente tutti i numeri della rivista
::: lffl

nature

Microsoft prepares U-turn on Windows 8
::: Financial Times

LibreCAD lavora ad un proprio DWG importer
::: LinuxBird

La Nasa fait migrer les ordinateurs de la Station spatiale internationale vers Linux
::: ZDNet ::: ZDNet ::: tom’s

brooms

How the Syrian Electronic Army Hacked The Onion
::: The Onion

Minesweeper in Matplotlib
::: Pythonic Perambulations

Debian Will Serve As The Default OS For Google Compute Engine
::: TechCrunch

532947_564836803538615_733865036_n

New Zealand Set To Prohibit Software Patents
::: Slashdot

Israeli Singer Publishes a Song In Hebrew — and Perl
::: Slashdot

Obama Announces Open Data Policy With Executive Order
::: Slashdot

musper

World of Warcraft Loses 1.3 Million Players in First Quarter of 2013
::: Slashdot

Una pagina web per ogni libro pubblicato
::: LinuxBird

La più grande biblioteca del mondo
::: Nicola D’Angelo

aw060ZB_700b_v1

Turista fai-da-te? Niente paura c’è openMarkers
::: LinuxBird

Mentana e le autostrade percepite
::: manteblog

What’s New in Scratch 2.0?
::: Scratch

Schermata-2013-05-03-alle-23

Primers
se ho capito bene un corso di matematica con Python dentro
::: Math ∩ Programming

Facebook Home, quando 1mln di dowload è poco
::: LinuxBird

Boston Replacing Microsoft Exchange With Google Apps
::: Slashdot

troglofeed

Return of the Borg: How Twitter Rebuilt Google’s Secret Weapon
::: wired

Facebook Is Getting Serious About Original Programming With “Facebook Live”
adesso la TV!
::: TechCrunch

How Should the Law Think About Robots?
::: Slashdot

Nicolargo. Livraison de socca. Pizza hut n'a inventé rien

Nicolargo. Livraison de socca. Pizza hut n’a inventé rien

Appeals court ruling could be ‘death’ of software patents
::: Network World

Elon Musk quits Zuckerberg’s immigration advocacy group
::: Reuters

miracles_vs_time

;-)

Gedit per Windows

sito di gedit

sito di gedit

Io lo uso solo quando devo, ma capita più spesso di quanto vorrei ;-)
No non sto parlando di gedit, si tratta di Windows.

OK, tutto ciò premesso c’è una bella novità. Una cosa che magari tutti conoscono già (tutti tranne me e i miei amici). E poi forse si tratta di una notizia che non interessa, chi è che usa ancora documenti di testo, i .txt; o crea script con Python, Ruby o roba simile?
Comunque qualcuno c’è, un paio li conosco personalmente. E allora la bella notizia è che gedit c’è anche per Windows, qui: gedit win32 binary.

Trovate il solito setup.exe che s’installa in un attimo, senza problemi.

g5

Resta solo da configurare, aprire Preferenze dal menu Modifica. Ci sono diversi tab, tutti da controllare.
E non dimenticate quello dei Plugin come ho fatto io recentemente ;-)

g4

Tra i vantaggi c’è anche la syntax hilighting per millemila tipi di documenti (stavo per scrivere file).

Ancora su maiuscolo|minuscolo

tmm2OK, lo so che non serve a niente ma voglio relazionarvi. Si continua dal post precedente: Convertire testo in maiuscolo|minuscolo.
Mentre preparavo quel post mi era venuto in mente che…
Non avevo considerato la Legge di Hofstadter. Cosa imperdonabile per chiunque abbia avuto accesso a uno o più ‘puters per più di qualche anno. Ma tant’è, sembrava facile. E poi la soluzione precedente non funziona con i caratteri con numero ASCII/ANSI maggiore a 127.
Eppure guarda qua:

nl-ulahemmm, sì, ma posso smettere quando voglio, dai ;-)

Allora sono riuscito a fare questo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/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") "§"))

;;  case translate
(if (= clON 1) 
    (set 'txt (upper-case txt))
    (set 'txt (lower-case txt)))

;; set it in the clipboard
(set 'cmd (join (list "echo " txt " | xsel -ib")))
(exec cmd)

(exit)

Che non è ancora perfetto, non gestisce correttamente la selezione multilinea. Il workaround attuale è di sostituire l’a-capo con il carattere § (galassia a spirale?). E c’è ancora da vedere quelli che la shell considera caratteri speciali, che pal :-(

Insomma ci sarebbe ancora da fare, chissà forse, anche perché sembra semplice. Per esempio per la selezione multilinea c’è l’here document.

E anche i caratteri speciali possono essere escapati. Noioso ma fattibile. E per questo lo script usa parecchie variabili, ridondanti ma utili per il debug. Poi quando sarà a posto sarà molto più elegante, forse.

Chissà… Comunque posso smettere quando voglio. E c’è Ruby che aspetta. Anche se sembra tutto davvero semplice.
Anche tenendo conto della Legge di Hofstadter ;-)

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… ;-)

Iscriviti

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

Unisciti agli altri 37 follower