admin

Jan 252008
 

Dopo un bel po’ di tempo torno su questi schermi. Dovrei prendere l’abitudine di scrivere un po’ più spesso, vabbé.Ad ogni modo, a Natale mi è arrivato il nuovo giocattolo, questo:

F14 Navy

radiocomando specifico per modelli di barche. Il vantaggio di questo modello èdi avere lo stick che controlla le vele (o i motori) giàsdoppiato e controllabile indipendentemente. Come si puo’ vedere, è ampiamente espandibile mediante moduli aggiuntivi che vanno montati al’interno, ho già in programma di comprare lo switch specifico per il genoa, e quindi lo si può utilizzare per diversi tipi di barca, anche non necessariamente a vela.L’idea è di utilizzarlo sulla nuova barca da 1 metro che dovrei contruire, anche se il ovviamente lo userò prima, magari sulla 65 cm se mai la dovessimo mettere in cantiere, visto che il doppio stick si può ovviamente utilizzare come uno stick unico.

Jan 032008
 

Questo è un nuovo software che sto scrivendo come parco giochi per migliorarmi in python e qt4. Il nome cambierà (ho scoperto esserci un altro qtodo in circolazione). La versione 0.1 è quasi pronta, al momento la si trova solo sul repository git , repo.or.cz , dove l’ho registrato, mentre è possibile segnalare un bug su bts.grys.it se a qualcuno saltasse in mente di provarlo.

Dec 172007
 

Chi lavora con i toolkit grafici sa cosa sono dialog modali e non modali. In breve:

  • Un dialogo modale non consente di interagire con l’applicazione che l’ha aperto
  • Un dialog non modale lo consente

Per poter avere più dialoghi non modali, sembra che con le Qt (e PyQt4) si debba usare il seguente codice:
dlg = QtGui.QDialog()
dlggui = Ui_dialog()
dlggui.setupUi(dlg)
dlg.show()
dlg.exec_()

 Posted by at 2:13 pm  Tagged with:
Dec 042007
 

Ultimamente mi è venuto lo schizzo di mettermi a giocare con Git, il Version Control System usato tra l’altro per gestire i sorgenti Linux. Devo dire che dopo le prime incomprensioni (dovute principalmente a Windows a dire la verità ) sembra non essere male. Forse è anche troppo per le dimensioni del progettino con cui lo sto testando, ma così per provare può anche andare bene.Una cosa da ricordare: quando si fa una commit da Windows, i file devono essere in formato Unix, altrimenti git non gradisce molto l’iniziativa. (update: a questo di può ovviare usando lo switch –no-verify) Per la cronaca, il progettino è il software che farò vedere durante la serata introduttiva su python e qt che terrò al Lifos

Nov 232007
 

Anche se in questo caso dovrebbe essere “troppo tempo libero e una bash sono pericolosi”, nel pomeriggio ho deciso che in onore della mente dietro One Liners dovevo creare il “Tiradadi dei Man” ™E così dopo un po’ di sano smanettamento è nato questo comando:

echo `find /usr/share/man/ | awk '{FS=";"}{ print $NF}'` | awk '{FS=" "}{srand();print$ (int(10000*rand()) % NF)}' | awk -F "." '{print $1}' | xargs man

che fa appunto questo: estrae una pagina man a caso tra quelle installate. Funziona solo con bash. Ovviamente l’ho gia’ inserito su One Liners
Update: Elena mi ha fatto notare che in realtà “tiradadi dei man” dovrebbe essere “tiradadi dei Manowar”. La coincidenza è davvero divertente

Nov 202007
 

Se mentre programmi con Python (ma credo valda anche per altri linguaggi) utilizzando OpenGL ottieni questo errore, una della cause può essere che chiami la funzione glBegin() un numero di volte maggiore della funzione glEnd() Questo simpatico errore (avevo messo la glBegin() in un ciclo e la glEnd() fuori) mi ha tenuto bloccato per due giorni…

Nov 192007
 

Dopo un periodo di assestamento dovuto al viaggio di andata e ritorno verso QGraphicView, OpenBoat sta andando avanti. A questo punto, dopo aver accantonato l’idea di avere due stack di codice diversi per le viste 2D e 3D, dopo aver (follemente) pensato di avere un oggetto diverso per ogni vista, sono arrivato ad un risultato quasi decente: allo stato attuale OpenBoat disegna mezzo scafo ed il codice che serve a disegnare lo scafo completo sta arrivando.Questo punto è importante per vari motivi, non ultimo il fatto che è un passo cruciale nello sviluppo. Da qui infatti, una volta finito di implementare il motore di disegno, posso partire per implementare tutte le funzionalità legate al disegno e alla sua modifica. La scaletta dei lavori che attualmente penso di seguire è la seguente:

  1. finire il disegno della matrice di punti del mezzo scafo
  2. implementare il disegno dello scafo completo (abbastanza banale a dire la verità)
  3. implementare la modifica delle opzioni del programma
  4. completare il disegno dello scafo con le spline per avere il profilo corretto

Forse non sarà questo l’ordine, altre cose importanti da fare sono la gestione delle viste, il poter selezionare un oggetto, l’implementazione delle Subdivide Surface, non so a priori cosa mi servirà per andare avanti. Ad ogni modo, quello che era iniziato quasi per scommessa e su cui nessuno ci credeva (io per primo a dire la verità ) sta lentamente andando avanti e forse vedrà la luce.

Nov 142007
 

Dopo un po’ di codice scritto per usare il QGraphicView delle qt, sono tornato al QGLWidget. Il motivo è semplice: il primo, per quanto molto comodo da utilizzare è solo bidimensionale. Questo porterebbe ad avere due stack di codice per fare le cose. Dato che il 3D serve, sono tornato a OpenGL.Il ritorno a OpenGL comporta più codice da scrivere per la gestione della selezione degli oggetti e cose simili, ma mi evita la scrittura del codice per la visualizzazione in 3D del modello, cosa che evito volentieri, visto che di casini ne ho già parecchi così. Al momento, dopo essere tornato indietro a OpenGL, ho iniziato delle leggere modifiche alla GUI (soprattutto delle finestre figlie) e sono riuscito a tornare a dove ero arrivato con il QGraphicView, quindi disegno i punti dello scafo in 3 viste su 4, anzi, ora ho pure lo zoom che funziona :-)

Nov 092007
 

Finalmente OpenBoat disegna i primi punti dello scafo. Per il momento sono appunto solo punti, ma almeno si inizia la parte interessante dopo tutta una serie di lavori abbastanza noiosi. A questo punto, disegnare le linee corrette dovrebbe essere abbastanza facile e poi si comincia con la parte 3D vera e propria.Se il widget che sto usando (QGraphicsView) non mi farà qualche brutta sorpresa, come avevo pensato/sperato probabilmente entro fine anno OpenBoat riuscirà almeno a disegnare le linee di default dello scafo, con relative modifiche e salvataggi alle linee dello stesso. Se va spettacolarmente bene invece, entro fine anno potrei essere anche un po’ più avanti.Di sicuro è una bella iniezione di fiducia sulla possibilità di arrivare in fondo a questo progetto.

Oct 252007
 

OpenBoat è di nuovo in lavorazione. Sto lentamente andando avanti e spero di ottenere qualche risultato da qui a fine anno. La conclusione è ancora lontana e si sta facendo sempre più strada l’idea di non fare un porting brutale di FREE!Ship ma di scrivere un qualcosa che gli si avvicini e che faccia le stesse cose. Il passatempo attuale è la sistemazione delle finestre per il progetto. Sono passato da OpenGL a QGraphicView, vediamo dove andiamo a finire.

 Posted by at 12:15 pm
Oct 242007
 

Allora usate questo: Laptop Cooler L’ho provato giusto ieri sera, veramente funzionale. Il mio portatile, che normalmente fa partire le ventole in modalità  aereo da caccia al decollo appena comincio a fare qualcosa di serio, ieri sera non ha più avuto problemi di raffreddamento. Le ventole sono partite solo alcune volte e per pochi secondi a basso regime di giri. Uno spettacolo.L’unico problema è che porta via una porta USB

 Posted by at 12:17 pm
Oct 232007
 

Questo breve documento spiega (o almeno ci prova) i passi necessari per far funzionare questa scheda PCMCIA wireless sotto Linux, più precisamente sotto una Debian Etch.Situazione di partenza:

  • laptop Dell Inspirion 8100
  • Debian Etch (testing) installata e funzionante
  • Access Point della Netgear (che fa anche da modem ADSL, router e quant’altro)

Una prova che ho fatto subito è stata quella di installare la scheda sotto WinXP. Anche se sembra un controsenso, si ha il vantaggio di verificare che la scheda funzioni correttamente. Sulla confezione infatti c’è un bel logo “Designed for WinXP” e di sicuro se dite al rivenditore che non funziona sotto Linux, vi fa storie. La prova ovviamente la si può fare su qualsiasi laptop che abbia su WinXP, mica necessariamente il nostro. E ora si comincia. La scheda, come mostra il comando

lspci -v

risponde a questi dati:


07:00.0 Ethernet controller:
Atheros Communications, Inc. AR5212 802.11abg NIC (rev 01)
Subsystem: D-Link System Inc D-Link AirPlus DWL-G650 Wireless Cardbus Adapter(rev.C)
Flags: bus master, medium devsel, latency 168, IRQ 10 Memory at f6000000 (32-bit, non-prefetchable) [size=64K]
Capabilities: [44] Power Management version 2

che significa che bisogna lanciarsi nel fantastico mondo di MadWifi, progetto che sta implementando il supporto per i chipset Atheros. Vi rimando al loro sito per l’elenco delle schede supportate.Dal loro sito ci sono da scaricare i sorgenti, io ho preso l’ultima stabile, la 0.9.2.Una volta scaricati i sorgenti, possiamo cominciare a sporcarci le mani ;-)

Compilare il kernel

La prima cosa in assoluto da fare, anche prima di scaricare i sorgenti di MadWifi, è ricompilare il kernel per includere il supporto Wireless, il supporto alla crittografia e alla sysctl. Le opzioni sono queste:CONFIG_CRYPTOCONFIG_SYSCTLCONFIG_NET_RADIOCONFIG_NET_WIRELESSPer il resto dei requisiti necessari, vedete alla pagina dei requisiti del progetto. Personalmente uso un 2.6.15.3 compilato dai sorgenti presi da www.kernel.org Se preferite usare il sistema Debian per compilare il kernel non c’è problema, la Etch fornisce anche il pacchetto madwifi-source, ma non ho provato. Una volta ricompilato il kernel, lo installiamo e riavviamo il sistema. La ricompilazione del kernel è necessaria solo se quelle opzioni non sono attive, se le avete già potete evitare questo passo.

Compilare MadWifi

Questo passo è molto semplice. Una volta scompattati i sorgenti, si entra nella directory e si lancia il comando make.Dato che MadWifi usa l’infrastruttura di configurazione del kernel per compilarsi, vi conviene usare il comando make KERNELPATH=[path per i sorgenti del kernel]in questo modo siete sicuri che troverà tutto quello che gli serve. Se la compilazione finisce bene, basta dare un belmake installe tutto il necessario verrà installato. A questo punto il documento per i Newbe sul sito di MadWifi, fa eseguire un po’ di test, che dovete eseguire se non conoscete i dati della rete Wireless (SSID e crittografia). Tra parentesi, la prova sotto XP serve anche a questo: a recuperare i dati che ci servono.

Configurare l’interfaccia

Una volta caricato il modulo ath_pci (più tutti quelli che si porta dietro lui) possiamo cominciare a configurare l’interfaccia. Sulla Debian, tutte a quanto ne so, il file che definisce le interfacce di rete è /etc/network/interfaces Dopo aver fatto una copia di backup, lo possiamo aprire con il nostro editor preferito per inserire i dati di questa nuova interfaccia.Nel mio caso, il blocco da inserire è stato questo:

iface ath0 inet dhcp
wireless-essid [mio ssid]
wireless-key [mia pwd in hex]

dove ath0 è l’interfaccia che crea il modulo ath_pci, e la stiamo impostando come interfaccia di rete (inet) e in dhcp. Con man interfaces ottenete una spiegazione dettagliata di tutte le opzioni possibili nel file.Nota: io ho usato il DHCP perchè il mio Access Point fa anche da server DHCP, è ovvio che se non avete un server DHCP sulla rete, la configurazione sopra va modificata in qualcosa del genere:

iface ath0 inet static
address [ip che deve prendere la macchina]
netmask [vostra netmask]
wireless-essid [mio ssid]
wireless-key [mia pwd in hex]

Se la volete attivare automaticamente ad ogni avvio, non dimenticatevi di aggiungere l’ath0 sulla riga “auto”, normalmente la prima. Due parole sulle opzioni wireless* che ho usato.Dato che uso una connessione crittografata, l’opzione wireless-key serve a specificare la password per la connessione. Per sapere come ottenerla, dovete consultare la documentazione del vostro Access Point.L’opzione wireless-essid specifica l’SSID della rete (un po’ come il gruppo nella rete M$) e conviene impostarlo sempre. Anche qui, per sapere come fare, dovete consultare l’interfaccia del vostro Access Point.Queste due opzioni sono necessarie per evitare di dover usare il comando
iwconfig ath0 key [mia pwd in hex]

ad ogni riavvio della macchina.A questo punto, se tutto va bene, riavviando la rete, dovreste avere attiva la scheda, con tutti e due i led verdi che lampeggiano insieme, indicando che la scheda sta lavorando.In caso di problemi, potete fare riferimento alla guida ai problemi del progetto MadWifi. L’unico problema che ho avuto io è stato quello dell’autenticazione, per il resto è filato tutto liscio.

Oct 232007
 

Con la versione 4 delle Qt, non è più possibile avere le toolbar flottanti. Per ovviare al problema si può usare un altro widget, il QDockWidget, che fa proprio questo. Inoltre consente di inserire anche dei widget custom direttamente da Qt-Designer, cosa che non è possibile con le Toolbar. C’è però un problema: le toolbar, quando venivano spostate (es, dall’alto a sinistra) si ridimensionavano da sole e rimettevano a posto il layout. Il QDockWidget no. Però a tutto si può ovviare, quindi con un po’ di codice si supera anche questo problema. Prima di tutto bisogna creare nel QDockWidget un layout di tipo grid in cui vengono posizionati i controlli.Per un baco nel Pyuic 4, si deve aggiungere il QDockWidget alla mainwindow dell’applicazione manualmente, con questa riga di codice

window.addDockWidget(QtCore.Qt.RightDockWidgetArea, ui.dockWidget)

Una volta che tutto è pronto si può cominciare a risolvere il problema del layout.Per prima cosa bisogna connette il QDockWidget al segnale TopLevelChanged, in questo modo:

QtCore.QObject.connect(ui.dockWidget,QtCore.SIGNAL(“topLevelChanged(bool)”),ui.select)

Questo fa in modo che quando cambiate posizione al QDockWidget, venga chiamata il metodo select (o come decidete di chiamarla, magari qualcosa del tipo relayout). Il metodo in questione semplicemente ridispone i controlli a seconda del fatto che il QDockWidget sia da impaginare in verticale (quindi è “dockato” sul lato destro o sinistro) o in orizzontale (quindi sia “dockato” in alto o in basso).Il codice è banale:

def select(self):
ui.gridlayout.removeWidget(ui.comboBox)
ui.gridlayout.removeWidget(ui.toolButton)
ui.gridlayout.removeWidget(ui.toolButton_2)
ui.gridlayout.removeWidget(ui.toolButton_3)

area = window.dockWidgetArea(ui.dockWidget)

if area == QtCore.Qt.BottomDockWidgetArea or area == QtCore.Qt.TopDockWidgetArea:
ui.gridlayout.addWidget(ui.comboBox, 0, 0)
ui.gridlayout.addWidget(ui.toolButton, 0, 1)
ui.gridlayout.addWidget(ui.toolButton_2, 0, 2)
ui.gridlayout.addWidget(ui.toolButton_3, 0, 3)
if area == QtCore.Qt.LeftDockWidgetArea or area == QtCore.Qt.RightDockWidgetArea:
ui.gridlayout.addWidget(ui.comboBox, 0, 0)
ui.gridlayout.addWidget(ui.toolButton, 1, 0)
ui.gridlayout.addWidget(ui.toolButton_2, 2, 0)
ui.gridlayout.addWidget(ui.toolButton_3, 3, 0)

Semplicemente in caso di cambio tra verticale/orizzontare, tutti i controlli vengono riarrangiati (in questo caso) su una riga o su una colonna. In caso di più colonne e/o righe il codice non diventa più complicato, a meno che non si decida di fare qualcosa di dinamico.Rimangono fuori alcuni aspetti tipo ridimensionare correttamente il QDockWidget una volta ridisposti i controlli o eliminare le righe/colonne non utilizzate, ma la logica è questa.Un possibile miglioramento sarebbe quello di usare un layout verticale o orizzontale al posto della griglia

 Posted by at 12:20 pm  Tagged with:
Oct 232007
 

Se si vuole fare in modo che una grid (QTableWidget o simili) sia attiva ma non editabile o editabile solo in seguito a certi eventi, basta impostare la proprietà editTriggers al valore appropriato.I valori elencati sono i valori che possono essere selezionati, anche in combinazione tra di loro:

QAbstractItemView::NoEditTriggers Nessun edit
QAbstractItemView::CurrentChanged L’editing inizia quando l’item corrente è¨ cambiato
QAbstractItemView::DoubleClicked L’editing inizia quando si esegue un doppio click sull’item selezionato
QAbstractItemView::SelectedClicked L’editing inizia quando si esegue un singolo click sull’item selezionato
QAbstractItemView::EditKeyPressed L’editing inizia quando il tasto di editing predefinito èpremuto sull’item corrente
QAbstractItemView::AnyKeyPressed L’editing inizia quando viene premuto un tasto sull’item corrente
QAbstractItemView::AllEditTriggers L’editing inizia per tutti i valori sopra riportati
 Posted by at 12:12 pm  Tagged with:
Oct 232007
 

Come ogni programma che si rispetti, anche quelli scritti in PyQt4 hanno la possibilità di essere localizzati.Per poter fare la traduzione delle varie stringhe bisogna seguire vari passi:

1 – Preparare il file delle traduzioni

Il file delle traduzioni è un file che contiene le stringhe in una lingua base (esempio inglese) e le corrispondenti traduzioni nella lingua in cui si vuole localizzare il programma.La struttura del file è la seguente:<!DOCTYPE TS><TS><context> <name>D_MainWin</name> <message> <source>Skipper</source> <translation>Skipper</translation> </message> </context></TS>dove name indica la sezione di cui si parla (ne parliamo dopo), source indica la stringa di default e translation indica la stringa tradotta. Il resto è del formato del file.Una precisazione name indica il nome dell’oggetto che vogliamo localizzare, semplicemente il valore della proprieta objectName Una volta preparato il file (che deve avere estensione .ts) si lancia il programma Qt Linguist e dal menù file si seleziona la voce Release, questo creerà un file .qm cheè il file compilato, il modello ricorda il giro file.po/file.gmo di gettext in effetti. QT Linguist ha un buon help in linea, fate riferimento a questo per tutti i problemi.

2 – Usare i file delle traduzioniUna volta creato il file .qm, il più è¨ fatto. La localizzazione dei programmi è gestita dalla classe QTranslator. Il codice necessario per inizializzare il tutto sono queste 3 righe:translator =QtCore.QTranslator()translator.load(QtCore.QString(‘i18n_it’))QtGui.qApp.installTranslator(translator)Dove il file (i18n_it in questo caso) puòessere completo di un path (relativo o assoluto)

3 – Preparare il codiceUna volta preparato il necessario e istanziata la classe, per avere la traduzione effettiva basta usare la funzione tr(“ciao”) per ogni stringa che si vuole tradurre.La funzione tr si preoccupa di recuperare la stringa tradotta in base al file della lingua caricato.Ci possono essere due risultati:

  1. la funzione trova la traduzione : viene usata
  2. la funzione non trova la traduzione: non succede nulla e viene usata la stringa passata come argomento

Piccola nota: se usate QtDesigner per creare l’interfaccia, il programma inserirà da solo tutte le chiamate alla funzione tr all’atto della generazione dei file necessari. A questo punto basta aggiungerli al file .ts e rilasciarlo.

 Posted by at 12:01 pm  Tagged with: