Shortest Path to Success. Psicologia e programmazione

Questo blog ha contenuti che si alternano tra la psicopatologia e il faceto, così mi sento in diritto di parlare di psicologia del programmatore.

La programmazione è una attività dell’intelletto, ma consegnare un lavoro e decidere le priorità riguarda molto la parte emotiva. Del resto Agile, Extreme Programming, Kanban, etc, parlano più di metodo, di interazione, di rapporti sociali, piuttosto che di metodologie (i vari manifests dicono: non si esclude l’importanza degli strumenti, ma la persona viene prima …).

Shortest Path to Success. La strada più breve per il successo. È un concetto fondamentale, però si rischia sempre di lasciare questo tipo di approccio per paura di fare qualcosa di sbagliato. Il mantra era “chi prende le scorciatoglie si troverà sempre nei guai“. Non so se c’entra qualcosa di religioso, o meno, so che è una idiozia. Invece la cosa più semplice che funziona e che ha successo è la migliore scelta che si possa fare.

Succede di studiare una gran quantità di concetti, di algoritmi, di modelli e di pattern per la soluzione di diversi problemi, ed è possibile essere attratti dal decidere prima il pattern senza chiedersi se nel caso specifico sia strettamente necessario. Oppure succede di vedere librerie realizzate con un certo schema e, non potendole usare nel caso specifico, aver voglia di realizzarle con concetti simili.

E invece no. La scorciatoia è la strada giusta.

Faccio questo ragionamento prendendo spunto dai trader (quelli che giocano in borsa) e si dilungano sulla psicologia quando il loro lavoro consiste nel cercare di speculare il più possibile. Sembra strano, ma nell’attività di trader la psicologia gioca un ruolo importante. Perché no nella programmazione?

java oracle vs google

Ho qualche anno e ricordo Java (TM) come una tecnologia creata da Sun Microsystem in modo aperto e collaborativo nei confronti di altre aziende software, in particolare MS e Apple a quel tempo.

Il modo aperto era implementato appunto diffondendo l’uso di una API a cui gli implementatori dovevano aderire affinché ricevessero l’attestazione di compatibilità Java. La API definiva classi, metodi e proprietà (e regole di accessibilità di metodi e proprietà) dettagliatamente descrivendo i comportamenti di questi metodi e classi.

Ora Oracle pensa che Java sia una tecnologia proprietaria e non copiabile, che quella sia una fuga di informazioni, o almeno crede di poter farla passare per tale. La tecnologia Java si è diffusa proprio perché aveva quei termini di utilizzo.

Oracle ha torto sotto tutti gli aspetti riguardo la questione specifica. È una pratica scorretta quella di mettere i concorrenti nelle condizioni di illegalità cambiando le regole che prima erano state garantite e assicurate.

È legalmente una svista. Il copyright sulle api dice che le specifiche non possono essere distribuite e non possono essere modificate da altri se non da Sun. Questo non vuol dire che queste specifiche non possano essere usate una volta che uno le ha ottenute, proprio da Sun o da Oracle, per implementare una sua versione. Né vuol dire che l’implementarle in modo giusto o sbagliato ponga il programmatore in uno stato di illegalità.

L’acrobazia legale è posta in questi termini:
1. Oracle rilascia le specifiche delle API Java
2. Oracle pone il divieto di diffusione (distribuzione) non autorizzato delle specifiche.
3. Google documenta il proprio sistema che implementa le API Java rilasciate da Oracle.
4. Google è colpevole di aver distribuito qualcosa senza il permesso di Oracle

È quasi convincente, no?

Ma il punto 2. è sbagliato. I termini non sono di divieto di copia come opera d’autore sulla definizione delle api, ma riguardano l’uso di Java(TM), e questa limitazione è decaduta col tempo (causa Sun-MS) definendo Java come linguaggio e non tecnologia.

 

Aggiornamento Galaxy SII a Jelly Bean, o a Cyanongenmod

Sì, ho uno smartphone, cioè di quelli sui quali si possono installare applicazioni, quindi anche scriverne.

E sì, sono un programmatore, ma sull’argomento mi trovo ad essere piuttosto ignorante.

La prima cosa che feci, 1 mese dopo averlo comprato, fu quella di installare una rom rooted, che permette cioè di eseguire operazioni riservate ad un utente privilegiato anche ad applicazioni non di sistema (quanto meno questo è quello che ho capito del concetto “rooted rom”). Da lì in poi sono rimasto con Ice Cream, preoccupato da Brick Bug. Dopo un anno mi tranquillizzo e provo ad installare Cynonmod.

Seguo questa guida: http://wiki.cyanogenmod.org/w/Install_CM_for_i9100 ma tralascio un passo che ritengo non fondamentale:

1. copia del file cm-10.1.3-i9100.zip (cyanongenmod) in una scheda sd.

2. riavvio del telefono in modalità caricamento (volUp+pwr+home) con la scheda microsd insierita

3. backup dell’installazione nella scheda sd

4. install zip from sd card, e ho selezionato quel file.

5. riavvio

da notare che ho saltato il passo del factory reset indicato nella procedura.

Il risultato è stato:

6. al boot successivo: logo cyanongenmod ruotava senza mai fermarsi

 

problema riportato anche in http://wiki.cyanogenmod.org/w/CyanogenMod_Installer#Device_won.27t_boot_up.2C_but_shows_CM_boot_animation

per risolvere ho riavviato (modalità download) e

7. restore from image ed ho scelto il backup prima salvato

8. è tornato al mio vecchio sistema.

 

Morale della favola: fai il backup anche quando pensi di non aver niente da perdere. (ok, in realtà un factory reset avrei potuto farlo anche dalla installazione fallata del cyanongenmod)

ClockWorkMod è una applicazione che ho trovato installato in seguito all’installazione della rom rooted, quindi ho pensato di trovarmi un passo avanti.

Rimango col vecchio sistema rooted, il prossimo consiglio che andrò a seguire sarà quello della guida in http://www.androidpit.it/it/android/forum/thread/553027/Samsung-Galaxy-S2-root-con-Jelly-Bean

Gamification alcune risorse

Nel 2011 Gabe Zichermann (@gzicherm) è probabilmente la star di riferimento della gamification, con il suo libro Gamification by Design spiega come il meccanismo di dipendenza tipico dei giochi si applica scientificamente a campi differenti come il commercio elettronico e la vendita di contenuti informativi.

Ora questo libro sembra non più disponibile da O’Reilly ma liberamente fruibile: http://ge.tt/6pi9TKO/v/26 o almeno sembra, visto che non c’è una versione elettronica acquistabile.

Mentre questo video è in vendita http://shop.oreilly.com/product/0636920017622.do

e questa è un recente seminario: http://oreillynet.com/pub/e/1798

altro seminario: http://oreillynet.com/pub/e/2004

Il suo profilo su TED: http://www.ted.com/speakers/gabe_zichermann.html

e la sua presentazione TED: http://www.ted.com/talks/gabe_zichermann_how_games_make_kids_smarter.html (giocare fa i bimbi svegli)

Una twitter list da seguire: https://twitter.com/daverage/gamification

La lavagna elettronica Open Source: Nintendo Wii e LIM

http://wiildos.wikispaces.com/Pagina+iniziale

è la fine veramente. Questo progetto è per poter utilizzare il telecomando (attuatore) della Nintendo WII a mo di telecamera. In pratica per rilevare un punto luminoso in bassa frequenza (infrarossi) restituire il segnala via bluetooth al sistema (Linux), come se si trattasse del puntatore del mouse, o meglio di una tavoletta grafica, quindi scrivere nella lavagna. Il punto è illuminato da un diodo a bassa frequenza: una penna a infrarossi.

Il concetto è: usa un qualsiasi piano per proiettare la schermata del computer, e, sullo stesso piano, usa una luce a bassa frequenza per avere la posizione di un pennarello che scrive.

allego questa che trovate in http://wiildos.wikispaces.com/Lavagna+col+wiimote

imageWiildOS

Praticamente quello che nella Wii è tenuto in mano è ben fisso da qualche parte ed inquadra lo schermo. Viene fatta una calibrazione iniziale, quindi puntando con una penna led il segnale luminoso si suppone rimbalzi verso la telecamerina del WiiMote che lo invia al bluetooth.

Si suppone. Infatti. Ecco cosa si è fatto al Gruppo Linux Macerata il 27 Febbraio 2013 la sera, si è provato far funzionare il marchingegno prima su di uno schermo al plasma (scalda molto quindi i segnali infrarossi sono distorti), poi su di una parete.

Il responso è piuttosto negativo per l’esperimento, dopo diversi tentativi non si è riuscito a stabilire quale fosse il punto dove mettere la telecamerina per avere la migliore resa.

Il docente-relatore-o-chiunque-sia-alla-lavagna-elettronica (abbreviato: drocsale … ok, lascio docente) deve essere tra il ricevitore (WiiMote) e la parete (non può andare dietro), e il fascio luminoso deve essere “visibile” (visibile a chi vede gli infrarossi, quindi i gatti e il WiiMote). Le problematiche sono 2: posizione del ricevitore, implementazione della penna (effettività del segnale luminoso). Per la posizione abbiamo stabilito che deve essere piuttosto angolata, ma non troppo. Per la penna siamo rimasti ad un vago led rivolto al contrario sulla punta della penna laser di modo da essere visto sicuramente, MA questo costringe ad una posizione della mano fissa, anche se naturale in effetti. Il led della penna aveva un’ampiezza di 30°, se ne trovano di ampiezza 25° e forse anche meno, questo potrebbe essere un punto a favore di un funzionamento più effettivo: diminuendo l’ampiezza del fascio e mantenendo la potenza totale il punto dovrebbe essere più visibile. Certo? Non troppo. In realtà il fascio luminoso va a scontrarsi con la parete dopo pochi millimetri o anche meno, quindi una differenza di ampiezza avrebbe un cambiamento pressoché nullo. Altro discorso se si gira il led verso la il WiiMote.

Dalle prove fatte il sistema ha una buona sensibilità se il led è rivolto al WiiMote (rovesciando la penna), ma perde comunque di accuratezza con l’aumentare della distanza. Inoltre sembra che il driver carichi molto la CPU, problema questo se si pensa che tutto il sistema è concepito per risparmiare soldi: non si vuol certo spenderli per comprare un pc superpotente. Il problema potrebbe riguardare l’efficienza del software python, oppure essere intrinseco nella decodifica del segnale fornito da WiiMote.

Il relatore della serata e autore degli esperimenti è stato Andrea Bianchini.

(a docente non l’ho più usato?!? proprio vero che spesso i problemi li invento…)

(WiildOS è una distribuzione leggera basata su lubuntu che include di default il software per la lavagna. Live USB)

 

Achievo come CRM PHP. Pencil come wireframe editor.

Arriva una richiesta di aiuto su di un software, Achievo, che mi viene presentato come CRM. Effettivamente è un software per il project management open source e molto interessante. Non funziona e devo debuggare, purtroppo lo devo fare online perché non ho ancora predisposto un ambiente IDE … non ho predisposto Eclipse per farlo. Ma quello è il meno. Capita che fallisca all’interno di un ciclo sopra un array di oggetti polimorfici (o meglio su di un array di oggetti, per quel che conta in PHP). All’interno di questo ciclo viene chiamato il metodo che causa internal server error (tralascio il discorso sul perché sia sempre così maledettamente complicato avere i log di sistema), comunque ho usato un contatore per interrompere il ciclo al punto giusto ed individuare la classe dell’oggetto che falliva. Il tempo maggiore è stato aggirarsi per le classi senza conoscerne la struttura. È molto produttiva l’organizzazione ad oggetti, ma quando cerchi di seguira come un esecutore c’è rischio di perdersi, forse è il caso guardare la documentazione piuttosto che buttarsi subito a debuggare senza conoscere il software e la sua architettura.

Di altro faccio il wireframe di una pagina web usando Pencil di Evolus. Fin’ora avevo usato gliffy, ma, a dispetto di quanto pubblicizzato è ancora in flash, è a pagamento quando si vuole condividire un grafico, non è realmente migliore di Pencil, almeno non per le mie esigenze: condivido esportando in png, e forse non è tanto senzato permettere la modifica online, perché piuttosto non copiare il file e fare una propria versione?

Il PHP è pessimo sotto tutti gli aspetti

Arrivo a questa conclusione oggi, dopo tanto lavoro su Drupal, consulenze su framework come INDEXU, WordPress, CodeIgniter, usato Doctrine, avere sostenuto l’esame di Zend (ZCE PHP 5.3), ed in particolare lo studio approfondito del linguaggio e delle sue caratterstiche Object Oriented.

È pessimo dal punto di vista della sintassi. La sintassi non è qualcosa che determina l’efficienza di un linguaggio di programmazione, ma la produttività sì. La influenza nel senso che è decisamente brutto vedere tutti quei dollari, quando effettivamente non ha senso e non aggiunge informazioni. Il simbolo $ in PHP indica che il nome che segue è quello di una variabile, mentre i nome non preceduti da dollaro sono considerati delle costanti. Questo fa sì che se una costante non è definita, allora una sequenza di caratteri che non è una keyword rappresenta la stringa con i caratteri stessi. Ma questo genera un warning. Anche usare (leggere) una variabile non precedentemente definita genera un warning.

Ancora sulla sintassi. È decisamente brutto e fuorviante non sapere cosa è case-sensitive, cosa no. Le funzioni sono case-insensitive, mentre le variabili sì. Le keyword non lo sono, mentre le constants sì.

Programmazione ad oggetti. Qui ogni linguaggio ha il suo modo di vedere questa questione. Si dice più propriamente linguaggio orientato agli oggetti, perché si può sempre ricadere nella programmazione sequenziale o funzionale per questi tipi di linguaggi. Sotto questo aspetto PHP 5.3 non è pessimo, semplicemente ha una sua intepretazione. Che cambia col PHP 5.4, e cambia ancora con 5.5. Ma questo è piuttosto naturale. Ma di qui si vede che viene meno il fatto di avere a disposizione uno standard, visto che non è standard neanche con se stesso. E in più non tutti i fornitori di host supportano il php 5.3 perché, dicono, crea problemi con le versioni precedenti.

Template. Dentro un template si può usare la sintassi PHP per stampare delle variabili. Ma la sintassi è pessima, e spesso si definiscono dei sistemi per template, anche per garantire la separazione tra codice e presentazione, per via della audince dei programmatori che si accingono ad usare il php.

È nato per essere una soluzione semplice alla dinamicità dell’html.

Ha avuto successo perché tutti potevano scrivere del codice.

Ed è pessimo perché tutti possono continuare a scrivere del codice in php, anche se non ne abbiano la capacità.

In JavaScript tutti possono scrivire del codice? del codice pessimo sicuramente, ma c’è un limite. In PHP il limite all’orrore non ha fine.

Si hanno veramente vantaggi dalla diffusione e disponibilità? NO. ASSOLUTAMENTE NO.

Non sai mai se la tua applicazione PHP è supportata dal’hosting che devi andarti a cercare sbattendoti, solo perché stai usando una funzionalità messa lì 4 anni fa. 4 anni sono una eternità. Sei costretto a rimanere indietro tecnologicamente e culturalmente e vuoi sviluppare applicazioni innovative? Oppure vuoi sviluppare applicazione retrograde forse? Vuoi metter giù del codice vintage per far vedere quanto è “elegante”? È uno sport che ho praticato in passato, come ad esempio la mia idea di usare le ma le macro del preprocessore ANSI C e le funzioni longjump e setjump per simulare il try catch del C++ … figo no? e perché? Poi vai dal cliente (o dal datore di lavoro) e dici “beh, ci ho messo 2 anni in più …. ma vuoi mettere l’eleganza!

E tra l’altro una pezza è tutto fuorché elegante.

Pubblica amministrazione e Pdf firmati

Si passa così tanto tempo a lamentarsi e leggere dei lamenti altrui che non si nota mai se ci buone novità.

Scopro l’esistenza di questo sito, http://www.digitpa.gov.it/ , solo stamattina, e quindi di questo documento:

http://www.digitpa.gov.it/firma-digitale-formato-pdf

Mi interessa avere il supporto in Linux, e spero che sia sufficientemente semplice da usare. Trovo:

http://wiki.cacert.org/PdfSigning

con molti riferimenti a programmi che girano su Linux. La cosa più semplice da usare sembra

http://portablesigner.sourceforge.net

qui https://issues.apache.org/ooo/show_bug.cgi?id=47895 tra i commenti si dice che non è accettato in Germania.

Socket js

// INTERNET EXPLORER
var socket = new ActiveXObject(“Socket.TCP”);
socket.Host = “whois.internic.net:43”;
socket.Open();
// Send the query….
socket.SendLine(‘ajaxjs.com’);
// Wait for disconnect and output the buffer
socket.WaitForDisconnect();
Response.Write(“<blockquote><pre>” + socket.Buffer + “</pre></blockquote>”);
socket.Close();