Visualizzazione post con etichetta software. Mostra tutti i post
Visualizzazione post con etichetta software. Mostra tutti i post

giovedì 24 settembre 2015

Volkswagen 2.0

Ci avete provato e vi hanno pizzicato. Vabbè, se proprio vi piace fare i furbetti, dovreste assumere qualche manager italiano che in questo sono dei maestri, soprattutto per dare le colpe agli altri. 
Ora si tratta di ricostruire l'immagine dell'azienda. Per farlo, avete solo una strada. Centraline Open Hardware e firmware Open source! Pensateci seriamente.

P.S. la marmellata è nella dispensa. Ripeto: la marmellata è nella dispensa.

martedì 24 febbraio 2015

Un sistema (poco)operativo

Periodicamente,  per fortuna saltuariamente, devo avviare nel PC su cui lavoro ogni giorno la partizione di quel sistema che non voglio nominare, perchè solo a farlo porta una sfiga nera, ma nera di quelle potenti. Devo avviarlo in quanto alcuni produttori promettono cose che poi puntualmente non mantengono, tipo "funziona sotto linux" senza mai specificare il tipo di distribuzione o le dipendenze necessarie. Anche nel caso in cui le dipendenze sono soddisfatte... c'è sempre qualcosa che non funziona a dovere, nonostante le promesse. Oggi, devo aggiornare il firmware di un aggeggio seguendo le istruzioni su iutùb che mi suggeriscono, per evitare intoppi, di usare quel sistema. Ok, ci può stare ed acconsento. Avvio la macchina... sono le 14:00... il disco inizia a sbatacchiare come un forsennato e lo schermo resta completamente nero per parecchi minuti, per poi fermarsi ed alla fine far intravedere a tratti il logo maledetto della Corporation che lampeggia non poche volte (scompare e riappare). Il disco continua a sbatacchiare ed alla fine mi viene proposto il desktop. a questo punto partono i soliti programmi che non ho mai installato, fra cui Messenger (mai usato, mai installato...da dove salti fuori non si sa), oltre ad altri antivirus tipo Defender mai aggiornati che non mi interessano (non ricevo posta e non navigo nei siti porno con quel sistema), fanchiulo gli aggiornamenti inutili.
A questo punto parte la saga degli aggiornamenti ulteriori che silentemente il sistema inizia a scaricare senza alcun avvertimento, non senza avvisarmi di aver configurato quelli installati dopo l'ultimo spegnimento. Lasciamolo fare poverino, anche senza avergli dato il permesso esplicito. Avvio Firefox... vado su iutùb ed inizia ad avvisarmi che firefox è vecchio e non supportato, flash player è vecchio e sono a rischio, adobe reader è vecchio a sono a rischio...caxo! cosa rischio? boh...non lo dicono ma la minaccia sembra seria data la sintesi. Aggiorniamo dai, altrimenti non riesco a procedere. Nel frattempo l'8 core inizia a scaldarsi e la ventola inizia a soffiare come un gatto incazzato (con linx non lo fa quasi mai) anche se sembra che apparentemente il PC non stia facendo nulla di nulla, almeno non mi avvisa di cosa sta facendo. Firefox download, flash download... pigio i bottoni proposti, clicco sugli eseguibili scaricati e l'installazione inizia... ad un certo punto flash mi dice di chiudere firefox... l'ho chiuso ma flash "lo sente" ancora aperto... è chiuso ma aperto, che figata di sistema... devo riavviare ma.... il sistema invece di ubbidire inizia ad installare gli aggiornamenti silentemente scaricati... e va avanti parecchio....aspetto, 6 aggiornamenti.... la cosa buffa è che ordino di spegnersi ed il sistema fa un pò il caxo che gli pare... installa, lui, invece di spegnersi. 
Provo a riavviare, alla fine, ma compare una scritta Registry qualcosa ed il sistema si rispegne quasi immediatamente, wow. Riavvio ed il sistema parte ad installare e configurare gli aggiornamenti, poi con calma, moolta calma, si riavvia iniziando la solita tiritera.... avvio programmi non richiesti, lancio di avvisi di aggiornamento di Defender, ecc,ecc... ed io aspetto pazientemente di poter iniziare a fare le mie cose. Termina l'avvio, ovvero termina finalmente di mostrarmi il desktop e... parte l'aggiornamento di Java Auto Updater. Mavaffanchiulo! Scarica l'installer, poi scarica l'aggiornamento, poi installa l'aggiornamento, ed io aspetto che il sistema "operativo" mi metta in condizioni di inziare a fare le mie cose che anch'io vorrei essere operativo. Nel frattempo provo ad avviare Firefox ed andare su iutùb ma il video non si vede... an error has occouured. Please Try again later... anche iutùb mi invita ad aspettare, è una congiura. Chiudo firefox ma java mi chiede se voglio installare Ask Search app (proponendomi le caselle già spuntate che se non si sta attenti ci si ritrova con le solite schifezze impossibili da rimuovere). Tolgo la spunta e termino l'installazione di Java. Ovviamente rivvio il tutto, again!, aspetto l'installazione degli aggiornamenti, aspetto la configurazione degli aggiornamenti al riavvio, aspetto che partano i programmi da chiudere, li chiudo... alla fine riesco a partire con le mie cose....15:10.... un ora abbondante del mio tempo per quella schifezza di sistema che fa un pò quello che gli pare, lavora per conto suo senza istruzioni da me impartite, totalmente fuori controllo, un virus insomma. In tre minuti netti riesco ad aggiornare il firmware, spegnere e riavviare linux. Che fantastica user experience!
Ora...è tempo di alcune considerazioni. Alcuni utonti, sembra la maggioranza, considera "normale" un comportamento come quello descritto. Non avendo riferimenti a paragone, lo considera un ottimo strumento per lavorare..."lavorare".... un ora abbondante per tre minuti di attività. e questo sarebbe un ottimo strumento? Ma come possono giudicare se non hanno mai visto altro in vita loro? Forse si basano sul sentito dire di altri? boh. Il mistero del vuoto mentale mi ha sempra affascinato. Utonti imbecilli e catatonici ne conosco sin troppi. Mi immagino un intervento di assistenza presso il loro sistema... un ora retribuita ad aspettare che termini i suoi comodi... magari un pensierino lo faccio se poi devo lavorare effettivamente solo 5 minuti, in caso di lamentela è sempre colpa di quel sistema. E poi... che possibilità ci sono con quella skifezza?? accendi, spegni, accendi, installa, disinstalla, riavvia, aspetta... wow che professionalità. Ma vaffanchiulo!

P.S. Abelardo passeggia al tramonto. Ripeto:  Abelardo passeggia al tramonto.

giovedì 5 febbraio 2015

Spamassassin Tool V.pre-Alpha

Ho ripreso con lo sviluppo di software, giusto per rilassarmi. Sì perchè se si programma senza un capo bastardo che ti soffia sul collo per metterti fretta ed ansia, senza l'utonto che crede di sapere tutto lui e che ti chiede di sviluppare cose stupide ed inutili... senza rompicogli*ni... programmare è rilassante e ci si diverte pure. 
Ho terminato "orora" un programmino di utilità in free pascal (Lazarus IDE) che prende i messaggi di posta elettronica indesiderata, lo spam che manualmente deposito in una cartella apposita (/home/utente/Maildir/.Junk) in quanto non sempre i filtri bayesani fanno il loro dovere (poverini, li capisco), esegue un parsing testuale per capire chi è il mittente, filtra la lista ottenuta per eliminare i doppioni, ordina per dominio o per indirizzo per verificare se i soliti spam-bot creano indirizzi in sequenza preordinata, memorizza il tutto nella blacklist di spamassassin con il formato richiesto (/etc/spamassassin/local.cf). Manca solo l'inserimento automatico delle wildcards per bannare interi domini se necessario, tipo i .ru  .tw .cn per capirci, tanto i caratteri cirillici o gli ideogrammi cinesi non li conosco e non mi interessano proprio.  Tutto automatico, basta lanciarlo con i privilegi di superutente tramite un cron e non ci penso più e fanchiulo agli spammer. 
Ci ho messo solo un paio d'ore. Fosse stato un prodotto per qualche cliente, come minimo sarebbe servita una settimana. Già, perchè avrei dovuto implementare i controlli anti utonto, l'help, gli hint per ogni componente a video, e chissà quale altra funzione inutile ma percepita come scontata e sempre compresa nel prezzo. Da dire che con Webmin la funzione per bannare le e-mail è già implementata, ma dall'ultimo aggiornamento, l'1.730, non funziona più, o meglio non riesco a vedere le cartelle che contengono i messaggi sa spammare.... non ho risolto.... non ho voglia di perderci ulteriore tempo per capire cosa non va... pertanto mi sviluppo un programma che lo fa a modo mio, implementando certe figate di funzionalità iper personalizzate, a me riservate, introvabili, esclusive ed utilissime... he he he... tiè, così faccio prima ed ho ciò che mi serve.
Non programmo più per soggetti terzi, non se lo meritano, o meglio si meritano certi programmatori disposti a chinare sempre il capo ad ogni richiesta isterica (e puntualmente trasformare il progetto in una cosa da buttare e rifare), e si meritano pure quei commerciali che riescono a vendere a peso d'oro anche le banalità più assurde, ben vi sta. Del resto ve la siete cercata ed a furia di cercare, alla fine, si trova sempre una "soluzione". Programmare mi rilassa, specie quando inizio a vedere i risultati, a constatare che le cose funzionano e verificare che riprendere la mano dopo tanti anni di fermo... bèh.... è come andare in bicicletta e la ruggine dopo qualche minuto si scioglie... alla prossima. 

P.S. Matteo ha il colera e Roberto è brutto. Ripeto: Matteo ha il colera e Roberto è brutto.

venerdì 25 marzo 2011

mpg2avi - mpg2flv converter

Succede di dover far fronte agli incarichi più assurdi, quando ci si occupa di Tecnologia e scienza delle informazioni e si entri in contatto con utonti istituzionali, ovvero coloro che hanno il potere. Questi utonti di stato sono pagati profumatamente e godono di molti privilegi ma hanno un terribile difetto. Quando, per qualsiasi motivo entrano in contatto con un computer, o ne sentono solo accennare la parola, ecco che in loro scatta la tipica reazione dell'utonto, che li autorizza a spegnere totalmente il cervello e chiedere "aiuto" al "tecnico". Ai loro occhi il "tecnico" è "l'amico del cuggino che lavora all'ibiemme" o il rivenditore di cancelleria sotto casa che, ovviamente conscio che il mercato è ormai composto da polli già spennati e cotti pronti all'uso, infila negli scaffali fra CD e DVD da masterizzare dei PC giusto per figurare come rivenditori di tecnologia ad alto valore aggiunto. Stavolta è toccato a me essere chiamato perchè il committente non riesce a visualizzare nel suo PC dei filmati. (strano...non ho nessun cuggino che si occupa di informatica). E' solo un problema di codec ma non sono autorizzato e nemmeno ne ho l'intenzione di installarglieli. Preferisco procedere con una conversione in formati diversi, almeno uno di questi riuscirà a leggerlo... spero. Dato che sono centinaia, ho preferito crearmi uno script che automatizza il processo e velocizzare le operazioni. Lo script per GNU linux usa mencoder e ffmpeg per convertire dal formato .mpg ad .avi e .flv (Flash)
Eccolo:
#---------------------------------------
#!/bin/bash

#mpg2avi mpg2flv (Converte filmati mpeg streams in avi mpeg4con audio mp3 e flv flash movie)


#inizio
clear

current_directory=$( pwd )
# video bitrate (1100 = per filmati di circa 500 MB )
#vbitrate=1100
vbitrate=800


# rimuove gli spazi nel nomefile
for i in *.[Mm][Pp][Gg]; do mv "$i" `echo $i | tr ' ' '_'`; done > /dev/null 2>&1 &

# rimuove le maiuscole
for i in *.[Mm][Pp][Gg]; do mv "$i" `echo $i | tr '[A-Z]' '[a-z]'`; done > /dev/null 2>&1 &

# converte mpg -> avi con mencoder

for i in *.[Mm][Pp][Gg]; do nice -n 10 mencoder $i -ovc lavc -lavcopts vcodec=mpeg4 -vf pp=md, -oac lavc -lavcopts abitrate=128 -o "`basename "$i"`.avi";echo "Conversione OK";done



# converte mpg -> flv con ffmpeg

for i in *.[Mm][Pp][Gg]; do nice -n 10 ffmpeg -i $i -y -sameq -ar 44100 -f flv "`basename "$i"`.flv";echo "Conversione OK";done

exit;
#-----------------------------------------
Fatto. Funziona. Non è stato facile districarsi fra le decine e decine di opzioni, il cui significato di alcune mi è ancora oscuro e che a spiegarle per bene occorrerebbe scrivere un libro. Ma alla fine funziona. Resta il dubbio...ma quel sistema che non voglio nominare con installato un lettore di filmati che non so il nome,  avrà i codec anche per questi formati?? Boh. Sempre meglio che stampare fotogramma per fotogramma ore e ore di riprese a 30fps come mi era stato richiesto. Riprodurre su carta un filmato...ma è proprio una richiesta da utonti che non meritano di usare un PC e nemmeno di ricevere uno stipendio. E' come nominare un dirigente analfabeta.....ma da voi in "itaglia", questo ed altro, branco di ignoranti. Alla prossima. 

P.S. Cappuccetto rosso è con il lupo ed i sette nani da biancaneve. Ripeto: Cappuccetto rosso è con il lupo ed i sette nani da biancaneve.

domenica 11 gennaio 2009

Recuperare dati da supporti danneggiati

Per chi ha un attività o gestisce un impresa, l'evento più disastroso che scatena il panico è la sorpresa data dalla perdita dei dati elettronici dai supporti usati per memorizzarli. Mi accorgo di ciò quando entro in ufficio e trovo una moltitudine di chiamate perse al cellulare. Il disastro si verifica solitamente negli orari meno opportuni, quasi sempre nei giorni festivi e spesso quando sono oberato di impegni inderogabili. Solo allora divento indispensabile ed oggetto di suppliche, mai accompagnate dalla promessa di retribuire adeguatamente la mia disponibilità a risolvere la situazione. Stavolta è toccato ad una chiavetta usb, con gli archivi dei clienti di un dentista. Non mi chiedo come mai i dati dei clienti siano memorizzati in un archivio di lavoro su una chiavetta usb invece del PC dello studio dentistico. Accetto l'incarico "agratis" e, dato che non è la mia attività principale ma solo un favore fatto in funzione di un lavoretto che dovrei far fare alla mia arcata dentale superiore, sperando nella disponibilità futura ad un pagamento "in natura" (cambio merce), decido di dare un occhiata al supporto. A volte mi arrivano dei casi veramente disperati, supporti danneggiati a tal punto che il recupero è quasi impossibile. Ecco qui gli strumenti che utilizzo per riportare il sorriso a chi si affida a me, anche se non sempre la fiducia riposta trova una vera soluzione.
Gli strumenti che uso per il recupero dei dati? Sono dei programmi in ambiente GNU-linux. Vediamoli:

dd_rescue
È una variante dell'utility unix “dd”. Estrae i dati dal supporto e trasferisce ciò che è leggibile su un file o su un device a blocchi. Crea un "clone" dei dati con blocchi a zero se non riesce a leggerli dall'origine.

fsck
E' uno strumento di unix per la manutenzione dei filesystem. È composto da una suite di programmi, ciascuno dei quali lavora su uno specifico filesystem: per esempio fsck.ext3 lavora su filesystem ext3, fsck.vfat su FAT16/FAT32, ecc… Verifica la consistenza della struttura del filesystem e risolve gli eventuali problemi. Può lavorare sia su device a blocchi (es. /dev/sdb /dev/hda ecc...) che su file immagine (creati ad es. con dd_rescue).

testdisk
E' un programma di recupero dati interattivo che ricostruisce in modo "semi-automatico" una tavola di partizione danneggiata. Legge i settori iniziali di ciascun cilindro del disco e cerca quelli che potrebbero assomigliare ad una partizione. E' in grado di rilevare in automatico il tipo di filesystem (ne riconosce davvero moltissimi) e le sue dimensioni provando anche a volte di correggere problemi di consistenza.

photorec
L'interfaccia è simile a testdisk. Recupera i files direttamente dall'area dati senza affidarsi al filesystem. È utile quando il filesystem è pesantemente danneggiato e/o non è supportato dagli altri strumenti. Sarebbe da impiegare come ultima spiaggia dato che è in grado di recuperare solo alcuni tipi di file. Ovviamente non può mantenere i nomi originali dei files, per cui ci si potrebbe trovare nella situazione di aprirli uno ad uno per comprendere cosa contengano aiutandosi con l'estensione.

La procedura
Do per scontato che nelle operazioni di recupero si utilizzi uno strumento predisposto a farlo, ovvero un PC con gli strumenti software installati, spazio sufficiente per trasferire i dati da recuperare, eventualmente delle porte ide libere (evito, se posso, gli adattatori usb-ide), collegato ovviamente in rete per scaricare eventuali aggiornamenti.


Controllo il partizionamento del supporto per individuare quali partizioni contiene. Se il device è /dev/sdb:

fdisk -l /dev/sdb

Se l'MBR è corrotta non si può effettuare il mount in sola lettura, altrimenti provo a montare in read-only la partizione in esame (SDB1 per la prima):

mkdir -p /mnt/dati
mount -o ro /dev/sdb1 /mnt/dati

Se il mount non va a buon (MBR è corrotta) o non è leggibile, devo clonare l’intero disco:

ddrescue /dev/sdb /mnt/immagine_chiavetta.img

Con il comando precedente, estraggo tutto il dispositivo con tutte le sue partizioni.

Se dd_rescue va a buon fine senza errori, occorre ripristinare una tavola di partizione corretta:

testdisk /mnt/immagine_chiavetta.img

che esegue una scansione dell’immagine alla ricerca dei possibili punti di inizio delle partizioni. Se esce il messaggio "partition sector don't have the end mask 0xAA55" significa che la tabella delle partizioni è completamente andata (salta al passo photorec direttamente) e difficilmente è possibile ripristinarla a mano (in alcuni casi si può fare).
Se tutto va bene, testdisk ripristina il tutto e si può procedere a salvare la nuova MBR. Quando si lavora con testdisk può essere necessario impostare a mano la geometria del disco CHS Cilindri - testine - settori per traccia: sui dischi vecchi i dati sono riportati sull'etichetta, mentre in quelli più attuali è riportata solo la dimensione in blocchi: in questo caso il firmware del disco usa una geometria fittizia per mappare l’indirizzo LBA dei blocchi: i settori per traccia sono sempre 63 e le testine 255: il numero di cilindri si calcola dividendo la dimensione in blocchi per 16065.

Dopo la ricostruzione della tavola di partizione, si può estrarre l’immagine solo della partizione che ci interessa: Per sapere dove inizia e dove finisce:

sfdisk -d /mnt/spazio/immagine.img

Ci si annota “start” e “size” della partizione: supponendo che i valori siano rispettivamente 63 e 156296322 posso estrarre l’immagine sovrascrivendo quella completa ottenuta in precedenza:

ddrescue -i (numero_inizio)b -s (numero_size) /dev/sdb /mnt/immagine_partizione.img

Si può così tentare un fsck: supponendo un filesystem di tipo FAT:

fsck -t vfat /mnt/immagine_partizione.img

e montare in loopback l’immagine:

mkdir -p /mnt/chiavetta
mount -o loop,ro /mnt/immagine_partizione.img /mnt/chiavetta

Il lavoro è terminato e si può procedere con l'analisi dei dati. Se, come nel mio caso la FAT è completamente andata, l’ultima possibilità consiste nell’uso di photorec:

mkdir -p /mnt/chiavetta/files
cd /mnt/chiavetta/files
photorec /mnt/immagine_partizione.img

Il supporto di origine può essere inutilizzabile o inaffidabile per memorizzarci altri dati. Se si desidera comunque riutilizzarlo, va formattato con il comando:

dd if=/dev/zero of=/dev/sdb bs=1

A meno di spiacevoli sorprese, in molti casi si riesce a recuperare qualcosa, magari non tutto. Possono però capitare dei comportamenti "strani". Con dd possono comparire errori di I/O che interrompono il processo di recupero. Anche dd_rescue può conteggiare errori di lettura. A volte l'errore di I/O è volatile, nel senso che si verifica saltuariamente ed imprevedibilmente in settori diversi. E' comunque indispensabile riuscire a salvare il maggior numero di blocchi (tutti se possibile) altrimenti il tentativo è inutile. A volte l'errore deriva da una chiavetta "consumata", ovvero utilizzata oltre il numero di cicli di scrittura consentiti. In altri casi può essere un problema hardware del circuito di interfaccia alla porta usb che si manifesta solo in particolari condizioni di temperatura. In questi casi essere un pò maghi e conoscere qualche rito sciamanico può aiutare. Alla prossima

P.S. Invertire il 7 con l'8. Ripeto: Invertire il 7 con l'8.

mercoledì 12 novembre 2008

Stampante seriale (etichette)

Il risultato, a meno di alcuni modesti aggiustamenti, è da ritenersi soddisfacente. La dimensione del riquadro è da aggiustare e le lettere accentate necessitano di un font diverso da quello utilizzato.

Programmare una stampante seriale che utilizza il linguaggio Monarch(R) è stata un esperienza nuova. Dopo aver realizzato il cavo "giusto" (vedi post precedenti) si passa alla codifica delle istruzioni che dovranno essere inviate alla stampante. Nel seguito un breve esempio. Il linguaggio usa dei campi formattati secondo una codifica pre-impostata e con una sequenza fissa di parametri. Un esempio che produce il risultato visibile in foto è questo:

{I,A,0,0,0,1,3 'slash zero cp850'|}
{I,D,7,0,2 'currency symbol italy 2 decimal'|}
{I,B,0,1,1,0,0 'supply type,ribbon_on,feed_mode,sup_pos,cut_pos'|}
{F,25,A,R,M,690,1000,"FMT-6X10" |
C,550,30,0,1,2,1,W,C,0,0," RAGIONE SOCIALE ",0 'mis in decimi di millimetro' |
C,490,30,0,1,1,1,O,L,0,0,"Slogan dell'azienda",0 |
C,450,30,0,1,1,1,O,L,0,0,"Via taldeitali, 99",0 |
C,420,30,0,1,1,1,O,L,0,0,"99999 località (PR) ITALY",0 |
C,360,30,0,1,1,1,O,L,0,0,"Item :Descrizione del contenuto ",0 |
C,310,30,0,1,1,1,O,L,0,0,"Colli: 01 - broken sample",0 |
C,200,30,0,1,1,1,O,L,0,0,"Cod:",0 |
C,200,115,0,1,3,2,O,L,0,0,"ABC-123-XYZ",0 |
L,V,400,10,0,940,10,"" |
L,S,400,650,680,650,10,"" |
Q,10,10,680,950,10,"" |
B,99,12,F,100,115,1,2,80,5,L,0 |}
{B,25,N,1 |
99,"234567891012" |}

Come si può capire, la comprensione non è propriamente di facile assimilazione, ma con il manuale sottomano anche se in inglese, il lavoro è agevolato. Ogni campo è preceduto da una lettera che ne identifica il significato, L per Line, C per Character, B per barcode, F per format ecc... Devo ancora trovare il modo di memorizzare le risposte della stampante, quali ad esempio i codici di errore. Con un minimo di impegno dovrei riuscire a comprendere meglio il funzionamento del processore interno, magari ricavare e de-compilare il firmware per alcune migliorie che ho in mente. E' un vero peccato che questo hardware sia closed source. Infatti, in mancanza di possibilità di apportare migliorie, l'hardware diventa rapidamente rifiuto speciale pericoloso ed è destinato ad ingrossare i canali di smaltimento clandestini. Già, corre voce che alcune associazioni spediscano l'hardware usato in africa con un apparente scopo umanitario. In realtà è un modo per aggirare la legge sui rifiuti speciali e far diventare l'Africa la discarica del mondo. Ma questo è un altro discorso che raramente viene trattato dalla stampa prezzolata per non infastidire i poteri forti.
In mancanza di uno specifico tool di sviluppo, ho proceduto con la scrittura del codice con un semplice editor di testo con successiva prova di stampa. Una volta assimilato il linguaggio, si procede con la pre-codifica dei formati necessari. Per stampare un etichetta alla volta, si fa molto prima ad aprire il sorgente e modificare direttamente il contenuto, a mano, per poi copiarlo sulla porta seriale utilizzata dal sistema (ttyUSB0 nel mio caso). I formati non sono poi molti. La etichette maggiormente utilizzate sono: spedizione materiale con imballo voluminoso, spedizione lettere e buste, mittente e destinatario. Per i più evoluti, etichetta trasparente per il protocollo della posta con codice a barre (che richiede però un ribbon speciale). Per lavori più intensi, che richiedono un elevato livello di personalizzazione e dinamicità ad adattarsi a diversi formati, si sente un pò la mancanza di un programma grafico per linux, che non deve essere poi molto difficile da produrre...Sarà oggetto di studio e ricerca per i momenti di tempo libero. Alla prossima.

P.S. Il punto per punto è solo presunto. Ripeto: Il punto per punto è solo presunto.

domenica 2 novembre 2008

Stampante seriale

Dopo aver messo in funzione una stampante industriale per etichette in poliamyde adatte ai capi di abbigliamento, una Alfa 1300 della General Code, non senza difficoltà visto che ora funziona in ambiente linux e non esistono driver specifici, mi sono messo in testa di rimettere in funzione anche delle stampanti PAXAR modello 9642. Ne ho quattro, rigorosamente salvate dalla distruzione (due le ho minimizzate per capire come erano fatte all'interno). Ho la necessità di far funzionare anche queste in ambiente di rete Unix (linux con CUPS in modalità client server), visto che non uso sistemi proprietari per scelta filosofica di vita e religiosa. Una prima delusione l'ho avuta cercando in rete se c'era qualcosa di già fatto. Nulla ovviamente. Il modello è un pò datato, fuori produzione ovvero discontinued. E' classificata come stampante economica, per cui esiste solo il manuale dell'utente. Per nulla scoraggiato, decido di chiamare la filiale italiana della Paxar per cercare alcune informazioni indispensabili. Con che linguaggio deve essere programmata? Che cavo serve? Devo dialogarci via seriale, visto che le porte parallele stanno scomparendo mentre le porte seriali possono essere emulate da una porta USB. Chiamo la centralinista che, dopo essersi assicurata se ero un cliente facoltoso con diritto di assistenza o un pirla qualsiasi indegno di ricevere informazioni tecniche, mi passa gentilmente "un tecnico". Un punto a favore per la Paxar. La gentilissima signorina, alla quale da buon cafone non ho nemmeno chiesto il nome, ma dalla voce deve essere molto simpatica, mi fornisce il numero di cellulare della persona che secondo le interpretazioni delle mie esigenze tecniche verbalmente comunicate, deve essere la persona adatta. Dopo essermi premurato di non disturbare, dato che prima di chiamare un cellulare destinato alle urgenze mi faccio sempre mille scrupoli, chiamo il tecnico. Anche questa persona, fortunatamente rivelatasi preparatissima (una rarità nel mondo IT), mi fornisce dal modello della stampante una serie di informazioni generiche ma utilissime. Il linguaggio interpretato dalla stampante è il Monarch (R). Il cavo seriale deve essere un null modem incrociato. Ad una richiesta di approfondimento mi comunica che se desidero ulteriore assistenza devo "pagare" (così mi da da intendere con un giro di parole) e dato che ho onestamente dichiarato di non essere un cliente ma un tecnico, termino la comunicazione ringraziando sinceramente per le dritte. Per stampare su porta parallela non c'è problema. Basta creare un semplice file di testo formattato come richiesto dal linguaggio in questione e spararlo con un "cp" direttamente verso la porta seriale. Per chi usa CUPS, basta configurare una RAW printer collegata alla parallela /dev/lpt0. Per la seriale la cosa si complica nella scelta del cavo. Un normale null modem seriale incrociato tx/rx non basta. Di null modem a 9 pin maschio femmina ne esistono di 4 tipi, a seconda del protocollo di handshacking supportato dal dispositivo.
  • Null modem semplice asincrono
  • Null modem a 3 fili con handshacking locale asincrono
  • null modem a 6 fili con handshacking parziale asincrono
  • Null modem a 7 fili con handshacking completo asincrono
Mi manca l'informazione relativa al tipo di cavo e non voglio approfittare della disponibilità del tecnico in quanto me lo immagino sempre di corsa ad intervenire presso i clienti per risolvere problemi (lavoro che o fatto per quasi 10 anni e so cosa significa lavorare e rispondere contemporaneamente al telefono in continuazione). Decido allora di andare per tentativi. Armato di stagnatore, inizio a provare le 4 combinazioni. Quella che si rivela vincente è la quarta. Per stampare basta copiare sulla porta seriale il file di testo predisposto con il linguaggio Monarch. cp ESEMPIO.FMT /dev/ttyUSB0 e la stampante risponde correttamente facendo il suo dovere. Bene. Con Cups nessun problema. Se si usa la porta parallela, basta configurare una stampante RAW collegata alla porta /dev/lp0 o seriale /dev/ttyUSB0 (se si una un convertitore Seriale / USB)
Ho già in mente alcune applicazioni pratiche, che mi evitano di usare una stampante "normale" o gli apparecchietti dedicati che non hanno mai i driver per linux. Questa abitudine di compiacere sempre i sistemi proprietari e snobbare i sistemi aperti, credo stia creando una lieve perdita di clientela che via via si va ingrossando. La prima azienda ha perso una fornitura di quasi 1500 euro senza contare la vendita periodica dei consumabili (ribbon ed etichette in rotolo), oltre a perdere l'occasione per dimostrare il suo livello di attenzione e cura per i potenziali clienti. ...bocciata. Credo che la sconsiglierò a tutti i miei clienti che periodicamente mi chiedono consigli per sapere a chi rivolgersi ed evitare fregature. La seconda azienda ha qualche possibilità, l'aiuto è stato prezioso e ringrazio promettendo futura collaborazione nella segnalazione.
Per quanto riguarda il linguaggio Monarch, esiste in rete un manuale che spiega in dettaglio quali stringhe mandare alla stampante. Manca solo un programmino "grafico" da dare al cliente la possibilità di generare i layout desiderati e stamparli in autonomia senza dover districarsi fra lettere e codici testuali. Al lavoro allora. So che n on esiste nulla di simile, nessun programma di stampa etichette per linux che riconosca quel linguaggio. Ci penso io allora. Chi fa da sè fa per tre. Alla prossima.

P.S. Il merlo ha fatto il nido. Ripeto: Il merlo ha fatto il nido.

venerdì 22 agosto 2008

DELL Inspiron 6000 II

Un intervento "sfortunato". Il tecnico incaricato di effettuare la sostituzione della mother board non ha avuto molta fortuna. Smonta la macchina, tenuta assieme da una miriade di viti di varie misure, rimonta il tutto, preme il pulsante di accensione e.... nulla. La macchina è morta. Ho assistito alle operazioni di montaggio e posso assicurare che le operazioni di collegamento dei cavi e di assemblaggio sono state eseguite a regola d'arte. Resta plausibile che si tratta di un pezzo difettoso... capita. La mother board è arrivata imballata perfettamente, impossibile pensare ad un pezzo "refurbished", riciclato da chissà quale altro intervento. In ogni caso nulla di fatto. Dato che l'operazione di sostituzione aveva valore più "politico" che tecnico (dovuto ad una serie di considerazioni fatte direttamente con la casa produttrice), decido di lasciare perdere ed accettare comunque la sostituzione del masterizzatore. Dopo un paio d'ore dalla fine dell'intervento mi chiama il supporto tecnico DELL, una persona che si premura di informarmi del motivo per cui non sia stato possibile sostituirmi la batteria. Una piacevole conversazione di circa 45 minuti con una persona ben addestrata a trattare con i clienti. La cosa che più si premurava di sapere era il mio giudizio in merito alla persona che mi aveva dato supporto via e-mail. Era preoccupato che dessi un giudizio negativo. Lì mi sono sentito un pò irritato. In caso di inconvenienti di questa natura, non ci si prende mai con i dipendenti del fornitore. C'è una regola non scritta (per chi ha ben chiare le regole etiche della propria professione), "...mai prendersela con i colleghi...", semmai prendersela con la casa madre e lì andare pure giù di brutto. Sono stato dipendente anch'io e so che purtroppo alcune persone grette e meschine insultano i dipendenti quasi fossero loro la causa dei guasti elettronici. Prendersela con i dipendenti è inutile, inefficace, stupido e da stupidi. Preferisco esprimere solidarietà alle persone e prendermela con i capoccioni del marketing, ovvero i bottegai che decidono come presentare i prodotti senza ammettere i limiti e le magagne degli stessi
Ora, so che mi arriverà un questionario dalla casa produttrice. Nella sezione del giudizio all'operato dell'addetto darò un voto eccellente (se lo merita). Nella sezione dei "suggerimenti", consapevole che probabilmente andranno a finire in chissà quale casetto di chissà quale scantinato, scriverò: "Visto che la durata media di una batteria al litio difficilmente supera i 18 mesi e che è quindi garantita per 1 anno, al posto di Winzozz preinstallato preferirei una batteria di ricambio". La batteria è l'elemento che sicuramente occorre sostituire in breve tempo e che viene sempre esclusa dalle estensioni di garanzia. So in anticipo che avrà una durata inferiore alla vita media del prodotto hardware nel suo insieme (che mediamente si aggira dai 3 ai 5 anni per i portatili), mentre il sistema operativo di M$ so in partenza che è già bacato, che necessiterà di continui aggiornamenti, che se mi serve qualche programma devo pagare la licenza d'uso (uso parziale considerati i bachi). Pertanto preferirei una batteria di scorta al posto di un sistema operativo bacato.
Ad ogni modo, non ricordo dove ho trovato le istruzioni per la sostituzione delle celle di alimentazione. Ho letto un articolo (ben documentato) di un pazzo che ha aperto il pacco batteria, ha acquistato le celle su "ebai" e le ha sostituite. Non è impossibile, quindi è possibile. Credo che farò così, non mi sembra difficile. Tanto per tenere fede al principio del "Fai da te" e rispettare lo sciopero della spesa indetto da me (ad oltranza) tempo orsono, per protestare contro la politica dissennata del profitto sfrenato a tutti i costi, praticata dalla maggior parte delle aziende produttrici. Dovrei spendere circa un quarto di quello che chiede il pezzo originale. Alla prossima.

P.S. Sara dice Cinque dopo dodici. Ripeto: Sara dice Cinque dopo dodici.

domenica 1 giugno 2008

Reti resitive

Nel frugare fra i componenti elettronici, deciso a verificare il funzionamento del modulo che ho sviluppato per il kernel linux con la realizzazione di un circuito a led da collegare alla porta parallela che dovrà pilotare lo stepper installato nel fusore progettato per realizzare i circuiti stampati col metodo a trasferimento di toner, mi sono trovato in mano un cassettino etichettato "Resistenze da catalogare". Quale miglior posto per reperire 8 resistenze da 1000 ohm 1/8 di watt?
Ad una più attenta analisi trovo anche dei componenti neri con i piedini tutti in una fila e con una sigla sconosciuta, accantonati in attesa di essere classificati ed ordinati. Sono delle reti di resistenze confezionate in quel modo per risparmiare spazio sui circuiti stampati, generalmente usate come resistenze di pull-up. Dopo averle separate dal resto, inizio un paziente lavoro di raggruppamento per valore... già, ma quale valore? Una rapida e superficiale ricerca in rete non mi è molto di aiuto. Decido di andare ad intuito. Innanzitutto occorre scoprire come sono disposte le resistenze, solitamente con un capo in comune o singolarmente separate le une dalle altre.
Per fare questo infilo il componente in una breadboard sperimentale e con dei ponticelli di filo "porto fuori" i collegamenti per poterli misurare agevolmente con i puntali del tester. Una piccola serie di misurazioni confrontata con le sogle stampigliate sul contenitore della rete resistiva mi permette di classificarle molto rapidamente. Dalle prove sperimentali ci si accorge che ogni produttore adotta un proprio metodo di sigle che però, con un minimo di fantasia è possibile decodificare, fatte salve alcune eccezioni. Facciamo alcuni esempi con alcune sigle...
Una lettera A o B indica nel primo caso un collegamento della rete resistiva con un comune a tutte le resistenze, mentre nel secondo caso (ove può comparire anche la lettera "C") indica che ogni resistenza è isolata dalle altre. In alcune codifiche, la lettera A o B è preceduta da un numero che può indicare o il numero di resistenze presenti nella rete resistiva o il numero di pin che caratterizza la rete. La cifra 9 ad esempio può indicare la presenza di 8 resistenze più un capo in comune (quindi rete resistiva di tipo A).
Poi solitamente esiste un numero a tre cifre, le prime due delle quali indicano il valore a cui va aggiunto un numero di zeri pari alla terza cifra (è il moltiplicatore simile a quello delle resistenze con le bande colorate). Una lettera "finale" J o G dovrebbe indicare, presumo, la tolleranza. In alcuni casi il valore è indicato in chiaro con tanto di unità di misura. Un puntino o una barretta serigrafata, indica il pin comune a tutte le resistenze collegate secondo la disposizione di tipo "A".

Ecco alcuni esempi:
AE10K
9A103J
10KJ
1A103J
10KohmJ
Le sigle qui sopra sono sigle comuni per rete resistiva di tipo A, composta da resistenze del valore di 10 Kohm

A102J rete resistiva di tipo A, da 1 Kohm
B100J rete resistiva di tipo B, da 10 ohm
C10ohm rete resistiva di tipo C (?), da 10 ohm
B472J rete resistiva di tipo B, da 4,7 Kohm
A472J rete resistiva di tipo A, da 4,7 Kohm
A472G rete resistiva di tipo A, da 4,7 Kohm
A8472J rete resistiva di tipo A, da 4,7 Kohm
9A472J rete resistiva di tipo A, da 4,7 Kohm

Di fronte alla sigla 316J, dato che il mio multimetro misura solo sino a 2 mega ohm, suppongo siamo in presenza di resistenze da 31 mega ohm

Esistono anche delle sigle "esotiche", quali:
10X561G rete da 9 resistenze (10 pin) collegate con lo schema A (1 capo in comune), da 560 ohm
L101S104 rete da 10 resistenze collegate con lo schema A (1 capo in comune), da 100 Kohm

E per finire la sigla misteriosa su un contenitore tipo DIL da 16 piedini compatibili con gli zoccoli a passo integrato. Sigla IAM E3318. Le prime tre lettere presumo indichino il produttore, la cifra indica 8 resistenze indipendenti da 330 ohm.
OK. Ora, "finalmente" anche questi componenti sono in ordine nei cassetti. Pian piano, man mano che mi serve qualcosa, ne approfitto per mettere un pò d'ordine. Non penso nemmeno alle sorprese che avrò quando inizierò a catalogare i chip di memoria flash, i processori, le E2prom, le interfacce rs232 che so di avere da qualche parte in attesa che li utilizzi per qualche progetto. Per stasera basta. Mi sono meritato un pò di riposo. alla prossima.


P.S. Attenti al lupo. Ripeto: Attenti al lupo.

mercoledì 21 maggio 2008

PCI Express 1x

E' un progetto ambizioso. Prendere una scheda PCI express (R) 1x e collegarci dei segnali direttamente sul pettine, per utilizzare la scheda senza inserirla nella mother board di un PC. L'idea è venuta ad un collega programmatore, privo di nozioni inerenti l'hardware. Per iniziare, ho bisogno di un socket PCIe 1x da dissaldare da una mother board defunta ma di recente costruzione. Non ne ho a magazzino. L'hardware che recupero è troppo obsoleto e quel tipo di socket si trova nelle mother board che vengono mandate in riparazione in garanzia. Mi sa che dovrò fare un giretto fra i rivenditori di zona e frugare nella "spazzatura" tecnologica che si accumula nel corso dei loro interventi di "riparazione". sperando in un colpo di fortuna. Il pinout di un socket PCI Express comprende l'alimentazione a 3.3 e 12 volts (oltre alla massa), un canale Jtag (interessante per l'accesso diretto al processore), un bus SMB (I2C 1 wire) anche questo interessantissimo per sviluppare una cascata di sensori collegabili direttamente alla mother board ed altri segnali che per ora non mi interessano.
PCI-E è un bus seriale che usa due coppie di segnali differenziali a basso voltaggio (Low-voltage Differential Signal LVDS) con transfer rate da 2.5Gb/s in ciascuna direzione [una coppia in trasmissione ed una coppia in ricezione].
Ho già in mente alcune soluzioni per espandere le possibilità di utilizzo di un paio di PC che giacciono in attesa di modifiche. Stay tuned.

P.S. Ultrasuoni e calore nel camino. Ripeto: Ultrasuoni e calore nel camino.

domenica 18 maggio 2008

Modulo driver per kernel 2.6.x

Dopo un pò di googling in rete, ho trovato alcuni esempi di come programmare i moduli per il kernel 2.4.x
Il nuovo kernel 2.6.x attualmente in distribuzione presenta alcune differenze che hanno reso inutili gli esempi pubblicati sino ad oggi. Vediamo quindi qui alcune considerazioni utili a realizzare un modulo per la porta parallela, che mi servirà a pilotare il motore stepper unipolare già postato in precedenza e che è in fase di sviluppo. Premetto che maggiori info si possono trovare nei repository ufficiali della distribuzione che si utilizza (inutile mettere qui i link che ce ne sono a iosa)
Il kernel di linux fa un largo uso di driver caricabili dinamicamente quando serve, il che ci dà la possibilità di evitare la ricompilazione dello stesso in caso fosse necessario utilizzare delle periferiche nuove. Un altra comodità di linux è che "tutto è un file", ovvero i dispositivi possono essere utilizzati come se fossero dei files. Ci posso scrivere e ci posso leggere. Ciò ci permette di avere accesso ad aree di memoria protette o accedere a basso livello alle periferiche che normalmente equipaggiano i PC. Per fare ciò è necessario "vedere" il dispositivo nella gerarchia /dev. Negli esempi di codice che seguono, si utilizza il linguaggio C. Il codice è preso da vari esempi, cercando di tradurre alcune istruzioni scritte in klingon che si trovano "spezzettate" in vari post di altri programmatori.

Apertura del driver
static int miaporta_open(struct inode *inode, struct file *filep)
{
//ci limitiamo a scrivere un messaggio
printk("Dispositivo aperto\n");
return 0;
}

Chiusura del driver
static int miaporta_release(struct inode *inode, struct file *filep)
{
//anche qui scriviamo solamente un messaggio
printk("Dispositivo chiuso\n");
return 0;
}

La scrittura sul driver
static ssize_t miaporta_write(struct file *filep, const char *buf, size_t count, loff_t *f_pos)
{
outb(0x00,0x37A); // porta parallela 1 in uscita
outb(buf[0],0x37B); // Scrittura sul registro ADDRESS
return 0;
}

La lettura dal driver
static ssize_t miaporta_read(struct file *filep, char *buf, size_t count, loff_t *f_pos)
{
outb(0x20,0x37A); // Porta parallela1 in Input
buf[0]=inb(0x37B); // lettura dal registro ADDRESS
return 0;
}

Occorre ora associare le procedure alle funzioni dei files. Per farlo, quest’ultime devono essere esportate al sistema. Questo lavoro viene svolto riempendo una struttura particolare di tipo ”file operations”, definita nell’header file ”linux/fs.h”.

struct file_operations epp_fops =
{
owner: THIS_MODULE,
open: miaporta_open,
release: miaporta_release,
read: miaporta_read,
write: miaporta_write,
};

Per l'inizializzazione del modulo occorre anche associare, con la funzione "register chardev", un ben definito device al nostro driver. Basta passare come parametri, nell’ordine, il major-char-number (20), una stringa con il nome del driver e la struttura con registrate le funzioni specifiche di accesso.

static int __init init_mod(void)
{
int result;
if ((result = register_chrdev(20, "miaporta", &epp_fops)) < style="color: rgb(51, 204, 0);">Chiusura del driver (deregistrazione9

static void __exit end_mod(void)
{
unregister_chrdev(20, "miaporta");
printk("Driver MIAPORTA unloaded.\n");
}

Per ultimo occorre aggiungere la linea in testa MODULE_LICENSE("GPL"); (o altre opzioni disponibili in base al tipo di licenza prescelto) e in fondo

module_init(init_mod);
module_exit(end_mod);

Per compilare, occorre creare un Makefile come segue:

obj-m:= miaporta_drv.o
KDIR = /lib/modules/$(shell uname -r)/build
PWD = $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
rm -f *.mod.* *.o *.ko

Una volta compilato occorre caricare il modulo con insmod ./miaporta_drv.ko e per poterlo utilizzare basta dare il comando mknod -m 0666 /dev/miaporta c 20 0
Funziona?. non lo so, devo ancora provare.

In attesa che sviluppi il codice e inizi a testarlo vediamo come si prevede di utilizzarlo all'interno del programma che lo utilizza...

#include "fcntl.h"
#include "stdio.h"
int main()
{
char buffer[1];
int fd;
fd=open("/dev/miaporta",O_RDWR);
buffer[0]=0x00;
write(fd,buffer,1,NULL); //scrivo il byte
read(fd,buffer,1,NULL); //leggo i byte
printf("Valore : 0x%02x\n",buffer[0]);
close(fd);
}

Dovrebbe funzionare. Se nei prossimi giorni trovo il tempo di svilupparlo e mi accorgo che qualcosa non va, provvederò alle modifiche. Per ora STOP. Una domenica passata al PC approfittando del maltempo mi pare sufficiente. Ora un pò di relax. un abbraccio

P.S. Mille bit fanno un megabit. Ripeto: Mille bit fanno un megabit.

sabato 17 maggio 2008

Magicrescue per linux

Speravo tanto di non doverlo mai fare. Oggi ho combinato un pasticcio degno del più principiante degli informatici. Accidentalmente, nell'usare incautamente un file manager appena installato, ho cancellato il 90% dei sorgenti di un progetto che sto sviluppando da quasi un mese. Me ne sono accorto solo alla ri-accensione del sistema. Persi i sorgenti, le impostazioni del progetto, le form... una piccola catastrofe. Com'è noto, gli informatici sono i primi a bacchettare i clienti che non salvano i dati con i backup giornalieri, salvo poi non farli mai per se stessi. Ho dovuto quindi procedere con un tentativo di recupero utilizzando magicrescue per linux. Dopo aver ri-montato la partizione da ext3 a ext2 (non journaled), ho proceduto con la programmazione dei "recipes" (le configurazioni). Fortunatamente, fresco di sviluppo, ricordo a memoria i nomi dei files e delle form create. Credo di aver recuperato tutto il minimo per tentare una ri-compilazione. Al massimo avrò perso solo le ultime righe di codice sviluppato. Al limite, proverò con sleuthkit sul dd effettuato sulla partizione interessata, oppure con Autopsy.
Ora è troppo tardi per un tentativo. è dalle 7 di stamattina che programmo e sono un pò stanchino. Vado a riposare e sabato, invece di dedicarmi ai miei hobbies preferiti, proverò a sistemare gli ultimi dettagli. Notte.

Aggiornamento 17.5.2008 - Tutto ok. Files recuperati al 98%. Tre ore di lavoro per lo sviluppo dei sorgenti mancanti e il software è tornato operativo. Utilizzato Magicrescue per linux.

P.S. il ragno non esce dal buco. Ripeto: il ragno non esce dal buco.

martedì 13 maggio 2008

Lazarus per linux - Reports


Lazarus è un IDE (ambiente di sviluppo) del linguaggio di programmazione Free Pascal. E' compatibile con il linguaggio Delphi di Borland. Lo sto utilizzando per sviluppare alcune procedure software in ambiente linux. Il progetto Lazarus è in fase embrionale (versione 0.9.x Beta) e la documentazione davvero scarsa. Per chi ha sviluppato in Delphi per anni come me, la cosa non rappresenta un grosso problema, ma in alcuni casi serve sempre ancora un pò di supporto, specie per quei componenti "nuovi" che in Delphi non ci sono o sono diversi. Allora, per contribuire, visto che non ho trovato indicazioni in rete, voglio pubblicare qui alcuni "tutorial" che possano essere utili a chi inizia o non ha troppo tempo da perdere nel cercare fra i forum in inglese e le varie wiki perennemente under development...
Iniziamo con i componenti per creare i report (le stampe) con un esempio minimale. Vogliamo creare dei report da un database MySQL su un server remoto (host) utilizzando i componenti ZeosDBO per l'accesso alle tabelle.
Passo 1 - Creare un nuovo progetto con la classica form1. Ci mettiamo un Bottone per lanciare l'esecuzione dei componenti
Passo 2 - depositare nella form i seguenti componenti:
  • ZConnection1
  • ZTable1
  • frDBDataset1
  • frReport1
  • Opendialog1
Passo 3 - Colleghiamo i vari componenti e settiamo le proprietà minime per farle funzionare (alcune proprietà le mettiamo "hardcoded" a design time, anche se è semplice farlo a run-time
Proprietà ZConnection1
  • Hostname = 192.168.2.x (dipende dalla tua rete locale) è l'indirizzo del server ove è installato il database. indica "localhost" se apache risponde sulla macchina su cui stai lavorando.
  • User = il nome dell'utente abilitato ad accedere
  • Password = la password di autenticazione abbinata all'utente (senon ce l'aqhi chiedi all'amministratore della rete o al provider se ti sati collegando ad un server su internet)
  • Protocol = mysql-5 in questo esempio. dipende dal tipo di archivio che stai usando.
  • Catalog = nome del database (compare in un menu drop-down dopo aver settato host, user e password)
  • Database = scrivilo a mano uguale al nome del Catalog se si tratta come in questo esempio di un database remoto
  • Active=True

Proprietà ZTable1
  • Connection = Zonnection1
  • Active=True
Al termine con un doppio click sul componente sulla form sei in grado di aggiungere i campi che desideri gestire.

Proprietà frDBDataset1
Va collegato a Table1

Proprietà frReport1
Va collegato a frDBDataset1

Passo 4 - Ora passiamo alla scrittura del codice per attivare il disegnatore dei report, con salvataggio e stampa.
Per lanciare il designer basta chiamare la procedura DesignReport come segue, in concomitanza all'evento OnClick del Bottone:

frReport1.DesignReport;

Una volta creato e salvato il report, per aprirlo ed eseguirlo basta la seguente procedura:
if Opendialog.execute then
begin
frReport.LoadFromfile(Opendialog1.filename);
frReport.Showreport;
end;

Nei prossimi giorni prometto, forse, di ampliare le indicazioni e completarle. Adesso, dopo 15 ore di lavoro, mi prendo una pausa per andare a dormire. Buona notte

P.S. Il pollo è cotto. Ripeto: il pollo è cotto.

mercoledì 5 marzo 2008

Consulenza tecnica

Consulenza tecnica di parte... una interminabile riunione per ribadire a voce quanto già scritto dall'avvocato in quasi mille pagine di ricorsi e memorie.Servono le verifiche tecniche per cui il giudice dispone una Consulenza Tecnica d'ufficio, per verificare attraverso un CTu se la "vessata quaestio" è fondata in diritto o se gli avvocati sono dei pinocchi (come spesso accade). E' uno dei percorsi per far valere dei diritti. Alla riunione a cui ho partecipato in veste di CTP sono presenti il CTU, due consulenti di parte (CTP) e due persone di supporto tecnico. Due parti in lite di fronte all'ausiliario del giudice. Una delle due parti è in evidente difficoltà visti i risultati di una precedente ATP (Accertamento tecnico preventivo). L'ATP ha stabilito che dopo 3 anni l'installazione di un software gestionale non può ancora definirsi utilizzabile, nonostante il fornitore, in evidente ritardo, avesse preventivato lo start-up in tre mesi. Incredibile ascoltare una interminabile sequela di scuse, pretesti, asserzioni fasulle (puntualmente smentite), accuse e quant'altro controparte ritiene di apportare per favorire "la (loro) verità!". L'ausiliario tecnico di controparte è un "uomo marketing", uno di quelli che cambiano il significato alle parole comunemente conosciute per definizione universalmente accettata. Noto immediatamente che "l'ingeniere" CTU si sta facendo abbindolare e manipolare (un punto di demerito alla sua pretesa imparzialità). Devo agire in fretta per porre fine alle menzogne credibili dell'imbonitore. Purtroppo in veste di CTP non ho poteri per imporre l'allontanamento di chi disturba, e visto che il CTU sembra ormai totalmente ipnotizzato, devo correre ai ripari facendo appello ai molti anni di esperienza nel settore. Inizio una serie di legittimi interventi verbali, posturali e mimico-facciali che in soli 5 minuti riescono a far incazzare come una bestia l'uomo marketing, il quale come previsto e privo ovviamente di argomenti validi si alza e si allontana dalla sala. Se non posso farti uscire faccio in modo che esca tu di tua spontanea volontà, coglione! Mi hai preso per un pirla? Ci sei cascato e mi hai permesso nei 15 minuti che sei rimasto fuori di agire e riportare nei binari la percezione dei fatti concreti addotti a bilanciare a mio favore le fanfaluche campate per aria che sino a pochi minuti prima aleggiavano pericolosamente. Nel campo dell'informatica non è raro imbattersi in commerciali travestiti da informatici che con le parole riescono ad incantare i serpenti. Solo che io non sono una serpe ma un camaleonte, con esperienza sufficiente a cambiare strategia, in base a tanta esperienza pratica, adattandomi alle situazioni. Non ti aspettavi un osso duro vero?.

Da buono come sono ho proposto una conciliazione, per dare una dignitosa via di uscita alla controparte e nel rispetto della regola di cortesia nei rapporti di colleganza. L'avvocato di controparte rifiuta, come avevo previsto in quanto evidentemente preso dal sogno ipnotico indotto dall'informatico imbonitore. Seconda vittoria. Il giudice ne terrà debito conto.

Propongo al CTU un documento preparato nei mesi precedenti che evidenzia ritardi, quantifica i tempi (con tanto di riferimenti alle prove documentali) e da precisa risposta ai quesiti assegnati dal giudice... ed il CTU lo accetta volentieri, ho fatto il 70 % del lavoro che doveva fare lui...terza vittoria.

Ora la botta finale. Memoria tecnica che smonterà in base a prove certe il castello accusatorio, agevolato anche dall'irritazione del CTU che forse è riuscito ad intuire la volontà manipolatoria della controparte, e una super sintesi chiarificatoria con tanto di grafici e disegnini d'aiuto al giudice.

Morale del racconto: tutto ciò per far comprendere ad un giudice che nonostante la promessa di consegna in tre mesi non siano bastati tre anni per onorare gli impegni presi e sottoscritti. Se stessimo parlando ad esempio di mattoni nessun problema, ma se l'oggetto è software... allora sono tutti autorizzati a non capirci nulla. Complimentoni.

P.S. i bit sono aggiornati. Ripeto: i bit sono aggiornati.