Wireless su HP Compaq NX6110 con Ubuntu 12.04

  
Gli avanzamenti di versione delle distribuzioni GNU/Linux portano sempre importanti novità e molte migliorie ma può capitare che portino anche problemi.
È il caso di un HP Compaq NX6110, passatomi sotto mano, che dopo il passaggio dalla versione 11.10 alla 12.04 di Ubuntu ha visto il wireless smettere di funzionare immediatamente. 
La cosa interessante era notare come il gestore di rete indicasse che il wireless risultava disabilitato mediante l’apposito tasto e che lo stesso non sortisse alcun effetto se premuto. A questo punto è stato necessario risalire alla scheda di rete.
Entrando nel terminale e digitando
———-
lspci
———-
si è trovato un output simile al seguente:
———-

00:00.0 Host bridge: Intel Corporation Mobile 915GM/PM/GMS/910GML Express Processor to DRAM Controller (rev 03)
00:02.0 VGA compatible controller: Intel Corporation Mobile 915GM/GMS/910GML Express Graphics Controller (rev 03)
00:02.1 Display controller: Intel Corporation Mobile 915GM/GMS/910GML Express Graphics Controller (rev 03)
00:1d.0 USB controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #1 (rev 03)
00:1d.1 USB controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #2 (rev 03)
00:1d.2 USB controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #3 (rev 03)
00:1d.3 USB controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #4 (rev 03)
00:1d.7 USB controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB2 EHCI Controller (rev 03)
00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev d3)
00:1e.2 Multimedia audio controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC’97 Audio Controller (rev 03)
00:1e.3 Modem: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC’97 Modem Controller (rev 03)
00:1f.0 ISA bridge: Intel Corporation 82801FBM (ICH6M) LPC Interface Bridge (rev 03)
00:1f.1 IDE interface: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) IDE Controller (rev 03)
02:04.0 Network controller: Intel Corporation PRO/Wireless 2200BG [Calexico2] Network Connection (rev 05)
02:06.0 CardBus bridge: Texas Instruments PCIxx21/x515 Cardbus Controller
02:06.2 FireWire (IEEE 1394): Texas Instruments OHCI Compliant IEEE 1394 Host Controller
02:0e.0 Ethernet controller: Broadcom Corporation BCM4401-B0 100Base-TX (rev 02)

———-

Nella riga evidenziata si vede che il portatile in questione monta una scheda di rete wireless Intel modello 2200BG.

Per riabilitare nuovamente questo modello di schede su Ubuntu 12.04, pertanto, basta entrare nel terminale e digitare in successione i seguenti comandi:

———-
sudo rfkill unblock 0
sudo rfkill unblock1
sudo rfkill list all
———-

Riavviate ed avrete nuovamente il wireless attivo.
  

Testython: Controllare ogni parametro del proprio codice Python

  
Sviluppare del buon codice vuol dire sicuramente sottoporre ciò che si scrive ad un continuo controllo di integrità, stabilità ed affidabilità. I software migliori, infatti, oltre a proporre all’utente un elevato numero di features e strumenti, sono veloci nell’eseguire le operazioni e leggeri su ogni tipo di memoria che viene messa loro a disposizione.
Avere degli ottimi strumenti di debug sicuramente aiuta lo sviluppatore che così può vagliare diverse opzioni al fine di garantire ai suoi utenti lo snippet di codice migliore all’interno dei suoi software.
Proprio da quest’idea nasce Testython.
Testython è un semplicissimo modulo per python (attualmente minimale ed in fase di sviluppo) che si pone l’obiettivo di proporre degli strumenti agli sviluppatori che garantiscano il pieno controllo su molte sfaccettature del codice al fine di poter aiutare nella scelta delle migliori alternative vagliate così da poter scrivere ottimi software sia per quanto riguarda il peso (in termini di memoria utilizzata) che la velocità. Lo scopo di questo modulo è quello di essere un coltellino svizzero, semplice da usare e facile da imparare.

Attualmente il modulo si compone di due classi: test_time e test_memory. Come è facilmente intuibile, la prima si occupa di analizzare le tempistiche di esecuzione del codice mentre la seconda l’uso della memoria da parte delle variabili utilizzate.

All’interno della cartella dei sorgenti è possibile trovare un semplice memento che potrà essere utile per una rapida consultazione ed inoltre è presente uno script di esempio completo che permette di analizzare l’uso dei diversi strumenti che il modulo, allo stato attuale, propone.

Come sempre sono ben accette tutte le forme di sostegno ed aiuto. Ogni suggerimento che può aiutare il software a crescere sarà vagliato e sviluppato.

Buon uso…
   

Sql: Aggiornamento o inserimento in una sola query

  
Quando si scrivono applicazioni che utilizzano un database per il salvataggio dei dati, è sempre importante tenere presente che la velocità è uno dei fattori più influenti per la buona riuscita del nostro lavoro. Bisogna infatti pensare che in ogni banca dati possono essere memorizzati milioni di record che, se analizzati e trattati, possono richiedere tempo e risorse che vengono sottratti ad altre attività che nello stesso momento girano sulla macchina in uso. Proprio per questo motivo quando si lavora su db sql è sempre preferibile demandare ogni tipo di attività al database stesso poiché la sua struttura ed i suoi strumenti sono programmati affinché le operazioni siano il meno dispendiose possibile.
Una delle attività più ricorrenti da effettuare su una serie di dati è il loro aggiornamento (se i dati sono presenti) o il loro inserimento (qualora essi non esistano ancora) all’interno del database in base ad una serie di variabili campione (ad esempio l’imput di un utente in una form). Questo lavoro richiede sicuramente un’estrazione di dati per effettuare un confronto ed un’analisi al fine di capire se eseguire un aggiornamento o un inserimento. Se volessimo analizzare le operazioni da eseguire con una serie di step, rappresentanti un algoritmo, essi si presenterebbero così:
APRO LA CONNESSIONE AL DB
CERCO I DATI NEL DB
SE I DATI SONO PRESENTI:
    AGGIORNA I DATI CON I NUOVI VALORI
ALTRIMENTI:
    INSERISCI I DATI NEL DB
CHIUDO LA CONNESSIONE AL DB
Come si può vedere, nonostante il codice sia il più minimale possibile, esso richiede una serie di passaggi che portano via una notevole quantità di tempo. Basti pensare che se il database in questione contiene 1 milione di record esso verrà (nella migliore delle ipotesi) “percorso” 2 volte (non necessariamente nella sua interezza) e ciò significa analizzare una grande mole di dati. Se a ciò aggiungiamo la complessità dei vari moduli dei diversi linguaggi di programmazione che dovrebbero aiutarci in questo lavoro allora capiamo quanto risparmiare secondi preziosi diventi fondamentale. 
A giungerci in aiuto in questo contesto arriva uno strumento sql davvero molto potente: ON DUPLICATE KEY. Esso ci permette di eseguire le operazioni appena viste sopra (aggiornamento o inserimento) in una sola query senza preoccuparci di estrazioni e confronti. Il suo funzionamento è molto semplice. Esso si prende in carico il compito di analizzare la presenza di una determinata chiave e nel caso essa sia presente aggiornarla altrimenti inserirla. La sintassi si presenta come segue (l’esempio è riferito ad un db MySql):
INSERT INTO tabella (chiave, campo1, campo2, …, campoN) VALUES (valchiave, val1, val2, …, valN) ON DUPLICATE KEY UPDATE campo1=val1, campo2=val2, …, campoN = valN
In pratica la query si occupa di cercare all’interno del db il record in base al valore della chiave primaria (nel nostro caso chiave) qualora esso sia presente verrà aggiornato con i valori della tupla che segue VALUES altrimenti verrà creata una nuova voce con i valori definiti dopo UPDATE. Si noti che nell’esempio che il valore di chiave nel caso di inserimento non è definito poiché il database conterrà una chiave con autoincremento ma qualora (per nostre scelte strutturali) la chiave deve essere definita manualmente la si potrà passare come un qualsiasi altro parametro. La query diventerebbe così:
INSERT INTO tabella (chiave, campo1, campo2, …, campoN) VALUES (valchiave, val1, val2, …, valN) ON DUPLICATE KEY UPDATE chiave=valchiave, campo1=val1, campo2=val2, …, campoN = valN
Grazie all’uso di ON DUPLICATE KEY i vecchi step dell’algoritmo diventano:
APRO LA CONNESSIONE AL DB

ESEGUO QUERY

CHIUDO LA CONNESSIONE AL DB
La scelta di questo strumento si è dimostrata appropriata in un test eseguito di persona. Si è visto, infatti, che confrontando i tempi di esecuzione di uno script python non ottimizzato con db mysql in locale popolato da 96000 record di prova, i due diversi algoritmi (con e senza ON DUPLICATE KEY) hanno portato una differenza di tempo di circa il 15%.