Effettuare una sessione di debug in QtCreator e' molto simile ad una qualsiasi altra IDE.
Cliccando sulla colonna grigia a sinistra dei numeri di riga si inseriscono i break point
Per iniziare il debug ci clicca F5 ed il programma si blocca sul primo breakpoint
Poi ci sono F10 (Step Over) ed F11 (Step Into)
Non e' necessario aggiungere manualmente le watch dato che il tutte le variabili ed il loro valore istantaneo sono elencate nella colonna a destra
giovedì 31 gennaio 2013
Creare una nuova finestra in Qt
Questo post e' per indicare come creare un progetto in Qt basato su piu' form e come farle apparire
Si parte creando un progetto standard (Qt Gui Application) specificando una QMainWindow
Una volta terminata la fase di creazione si clicca sul ramo Form del progetto e si aggiunge una nuova Q Designer Form class
avremo quindi alla fine due form denominati mainwindow e mainwindow2.
A questo punto si aggiunge un pulsante a mainwindow e si aggiunge uno slot su OnClicke e si inizia a modificare il codice come segue (modifiche evidenziate in giallo)
mainwindow.h
---------------------------------
---------------------------------
mainwindow.cpp
---------------------------------
---------------------------------
Il risultato finale e' quello mostrato in immagine
Alla pressione del pulsante sulla finestra1 si apre la finestra2
Si parte creando un progetto standard (Qt Gui Application) specificando una QMainWindow
Una volta terminata la fase di creazione si clicca sul ramo Form del progetto e si aggiunge una nuova Q Designer Form class
avremo quindi alla fine due form denominati mainwindow e mainwindow2.
A questo punto si aggiunge un pulsante a mainwindow e si aggiunge uno slot su OnClicke e si inizia a modificare il codice come segue (modifiche evidenziate in giallo)
mainwindow.h
---------------------------------
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "mainwindow2.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
---------------------------------
mainwindow.cpp
---------------------------------
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mainwindow2.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
MainWindow2 *j = new MainWindow2();
j->show();
}
---------------------------------
Il risultato finale e' quello mostrato in immagine
Alla pressione del pulsante sulla finestra1 si apre la finestra2
mercoledì 30 gennaio 2013
QtDemo
L'aspetto decisamaente positivo nelle Qt che le differenzia da tutte le altre librerie utilizzabili con licenza GPL e' la documentazione presente a livello decisamente professionale
Per avere un'idea del funzionamento delle varie parti di Qt puo' essere comodo utilizzare il comando
qtdemo
che lancia il programma di esempio dove vengono mostrate le varie funzioni e si ha il link diretto al codice di esempio ed alla documentazione
Tale comando, presente in Linux, non si ritrova nel pacchetto del Qt-SDK di Windows (e' un po' nascosto tra gli esempi da compilare)
Per avere un'idea del funzionamento delle varie parti di Qt puo' essere comodo utilizzare il comando
qtdemo
che lancia il programma di esempio dove vengono mostrate le varie funzioni e si ha il link diretto al codice di esempio ed alla documentazione
Tale comando, presente in Linux, non si ritrova nel pacchetto del Qt-SDK di Windows (e' un po' nascosto tra gli esempi da compilare)
Conky
Era un po' che mi scervellavo come si potessero mettere i parametri del sistema operativo sulla finestra di root di X Windows cosi' come si vede per esempio in CrunchBang
La soluzione e' l'utilizzo di Conky, un software che si installa semplicemente con
apt-get install conky
il programma si configura mediante l'apposito file /etc/conky/conky.conf ed e' talmente complesso che di seguito viene dato solo un esempio
La schermata nell'immagine seguente mostra l'uso di Conky in una Debian Testing
per vedere meglio il dettaglio ho ingrandito la parte alta dello schermo
e' generato dal seguente file di configurazione
/etc/conky/conky.conf
-----------------------------------------------
alignment top_middle
background no
border_width 0
cpu_avg_samples 5
default_color white
default_outline_color white
draw_borders no
draw_graph_borders no
draw_outline no
draw_shades no
use_xft yes
xftfont Terminus:size=7
xftalpha 1
gap_x 0
gap_y 0
minimum_size 20 0
maximum_width 1920
net_avg_samples 2
no_buffers yes
out_to_console no
own_window yes
own_window_class Conky
own_window_type normal
own_window_transparent yes
own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager
update_interval 1
uppercase no
use_spacer left
use_spacer right
double_buffer yes
short_units yes
pad_percents 1
text_buffer_size 512
temperature_unit fahrenheit
TEXT
${font OpenLogos:size=7}Ora ${font}${time %I:%M:%S %p | %B %e, %Y} | Uptime ${uptime} | Temp ${voffset 1}${acpitemp}° F | ${freq_g} GHz | Cpu1
(${cpu cpu1}%) ${voffset -1}| Cpu2 (${cpu cpu2}%)${voffset } | Mem: (${memperc}%) | /: ${fs_free_perc /}% | ${voffset -2} | Batteria ${battery_bar 10,50 BAT0} ${battery_time} | Ip ${addr}
-----------------------------------------------
ps. alcuni parametri sono nulli od errati in quanto lo screenshot e' stato ripreso da una macchina virtuale VirtualBox in cui non funziona l'acpi
La soluzione e' l'utilizzo di Conky, un software che si installa semplicemente con
apt-get install conky
il programma si configura mediante l'apposito file /etc/conky/conky.conf ed e' talmente complesso che di seguito viene dato solo un esempio
La schermata nell'immagine seguente mostra l'uso di Conky in una Debian Testing
per vedere meglio il dettaglio ho ingrandito la parte alta dello schermo
Dettaglio dello schermo |
e' generato dal seguente file di configurazione
/etc/conky/conky.conf
-----------------------------------------------
alignment top_middle
background no
border_width 0
cpu_avg_samples 5
default_color white
default_outline_color white
draw_borders no
draw_graph_borders no
draw_outline no
draw_shades no
use_xft yes
xftfont Terminus:size=7
xftalpha 1
gap_x 0
gap_y 0
minimum_size 20 0
maximum_width 1920
net_avg_samples 2
no_buffers yes
out_to_console no
own_window yes
own_window_class Conky
own_window_type normal
own_window_transparent yes
own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager
update_interval 1
uppercase no
use_spacer left
use_spacer right
double_buffer yes
short_units yes
pad_percents 1
text_buffer_size 512
temperature_unit fahrenheit
TEXT
${font OpenLogos:size=7}Ora ${font}${time %I:%M:%S %p | %B %e, %Y} | Uptime ${uptime} | Temp ${voffset 1}${acpitemp}° F | ${freq_g} GHz | Cpu1
(${cpu cpu1}%) ${voffset -1}| Cpu2 (${cpu cpu2}%)${voffset } | Mem: (${memperc}%) | /: ${fs_free_perc /}% | ${voffset -2} | Batteria ${battery_bar 10,50 BAT0} ${battery_time} | Ip ${addr}
-----------------------------------------------
ps. alcuni parametri sono nulli od errati in quanto lo screenshot e' stato ripreso da una macchina virtuale VirtualBox in cui non funziona l'acpi
Bentornato /etc/rc.local
Magari non e' proprio una novita' ma mi sono accorto solo adesso che su Debian e' tornato il file /etc/rc.local
Questo file e' sempre stato presente su altre distribuzioni storiche (vedi Red Hat) e viene lanciato alla fine di tutta la catena di boot per poter effettuare delle personalizzazioni
Debian ne era sprovvista di default e doveva essere aggiunto a mano con la combinazione dei comandi
echo “#!/bin/sh\n#\n” >> /etc/rc.local
ln -s /etc/rc.local /etc/rcS.d/S99rclocal
cosi' e' decisamente piu' comodo
-------------------------------------------------------------------
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
exit 0
Questo file e' sempre stato presente su altre distribuzioni storiche (vedi Red Hat) e viene lanciato alla fine di tutta la catena di boot per poter effettuare delle personalizzazioni
Debian ne era sprovvista di default e doveva essere aggiunto a mano con la combinazione dei comandi
echo “#!/bin/sh\n#\n” >> /etc/rc.local
ln -s /etc/rc.local /etc/rcS.d/S99rclocal
cosi' e' decisamente piu' comodo
-------------------------------------------------------------------
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
exit 0
I3 Tiling WM
Alla ricerca di un Window Manager per un computer con pochissima memoria mi sono imbattuto in I3 che viene defiinito come un Tiling Window Manager (si vedra' fra poco il perche')
Per installarlo e' sufficiente il comando
apt-get install i3
dopo il login lo schermo e' quanto di piu' desolante si possa immaginare (nemmeno windowmaker e' cosi' fuorviante) e quindi si deve iniziare a leggere il manuale che riporta le seguenti combinazioni di tasti
(e' possibile scegliere come tasto modificatore sia Alt che il tasto Windows...in questo caso ho scelto Alt ma direi che per il futuro e' piu' conveniente usare Windows)
In Debian il file di configurazione si trova in HOME/.config/i3/config
Alt+Enter : apre una shell
Alt+Shift+Q : uccide una finestra
Alt+Shift+E : esce da I3
Per ordinare in modo verticale od in modo orizzontale le finestre si puo' usare
Alt+E
Per mandare in primo piano una finestra
Alt+W (per accedere alle finestre nascoste si usa Alt+freccia)
il focus delle finestre segue immediatamente la posizione del mouse ma si puo' passare da una finestra all'altra anche usando la combinazione Alt+freccia
Le nuove finestre vengono occupate dividendo in modo uguale lo schermo (se ci sono tre finestre di default ognuna occupera' il 30%, se sono 4 il 25% ecc). Per modificare questo comportamento si dive entrare in Resize Mode (Alt + r) e poi si con le frecce si riscalano le finestre
e' presente un menu' che si attiva premendo
Alt+D
appare nella barra in alto una serie di comandi, a questo punto si deve iniziare a scrivere il nome dell'applicazione che si intende lanciare per esempio la sequenza q+t+c+r+e+....e si vedra' comparire qtcreator, si clicca o si preme Enter per lanciare l'applicazione
L'aspetto un po' fuorviante che, essendo un tiling window manager, le varie finestre vengono giustapposte affiancate e non sovrapposte
Nella parte bassa dello schermo e' presente la i3status, una barra in cui sono sintetizzate alcune informazioni come lo stato di occupazione del disco fisso, la rete ed il carico della CPU (puo' essere modificata da i3status.conf)
Per installarlo e' sufficiente il comando
apt-get install i3
dopo il login lo schermo e' quanto di piu' desolante si possa immaginare (nemmeno windowmaker e' cosi' fuorviante) e quindi si deve iniziare a leggere il manuale che riporta le seguenti combinazioni di tasti
(e' possibile scegliere come tasto modificatore sia Alt che il tasto Windows...in questo caso ho scelto Alt ma direi che per il futuro e' piu' conveniente usare Windows)
In Debian il file di configurazione si trova in HOME/.config/i3/config
Alt+Enter : apre una shell
Alt+Shift+Q : uccide una finestra
Alt+Shift+E : esce da I3
Per ordinare in modo verticale od in modo orizzontale le finestre si puo' usare
Alt+E
Per mandare in primo piano una finestra
Alt+W (per accedere alle finestre nascoste si usa Alt+freccia)
il focus delle finestre segue immediatamente la posizione del mouse ma si puo' passare da una finestra all'altra anche usando la combinazione Alt+freccia
Le nuove finestre vengono occupate dividendo in modo uguale lo schermo (se ci sono tre finestre di default ognuna occupera' il 30%, se sono 4 il 25% ecc). Per modificare questo comportamento si dive entrare in Resize Mode (Alt + r) e poi si con le frecce si riscalano le finestre
e' presente un menu' che si attiva premendo
Alt+D
appare nella barra in alto una serie di comandi, a questo punto si deve iniziare a scrivere il nome dell'applicazione che si intende lanciare per esempio la sequenza q+t+c+r+e+....e si vedra' comparire qtcreator, si clicca o si preme Enter per lanciare l'applicazione
Esempio del menu di I3 (Alt+D) |
cio' comporta che quando si lancia una applicazione non di terminale lo spazio dello schermo sara' distribuito in modo poco opportuno
comunque si puo' uscire dalla combinazione a tile usando la combinazione Alt+Shift+Spacebar che fa diventare la finestra selezionata come flottante e ridimensionabile
Nella parte bassa dello schermo e' presente la i3status, una barra in cui sono sintetizzate alcune informazioni come lo stato di occupazione del disco fisso, la rete ed il carico della CPU (puo' essere modificata da i3status.conf)
Optimus ROM per GT-S5570i
A causa dei problemi con la precedente rom JellyBlast descritti in questo post ho deciso di fare un passo indietro e rinunciare ad Android 4.1 per avere un telefono piu' stabile e soprattutto funzionante
Per questo motivo adesso ho montato la rom Optimus Rom 2 (scaricabile da questo link)
Per flashare il telefono sono necessari i seguenti file
CWM_GT-S5570i
OptimusRom2_00(2)
update
come al solito si fa partire il telefono in recovery mode (vedi post precedente9 e si seleziona prima il file CWM, si effettua il wipe di tutti i dati e poi si installa il file Optimus Rom 2
Una volta riavviato completamente il telefono e dopo essersi accertati che tutto sia andato bene e' possibile e' possibile riavviare il telefono, riavviare CWM ed eseguire l'update che corregge un problema sulle impostazioni del provider
Come si vede questa ROM e' un passo indietro verso Android 2.3.6 ed ha anche (giustamente) un numero ridotto di programmi preinstallati
Le prime impressioni di uso sono buone ma come gia' detto i problemi riscontrati con la JellyBlast erano saltuari e non prevedibili quindi solo l'uso dira' se e' il caso di continuare con la Optimus
Per questo motivo adesso ho montato la rom Optimus Rom 2 (scaricabile da questo link)
Per flashare il telefono sono necessari i seguenti file
CWM_GT-S5570i
OptimusRom2_00(2)
update
come al solito si fa partire il telefono in recovery mode (vedi post precedente9 e si seleziona prima il file CWM, si effettua il wipe di tutti i dati e poi si installa il file Optimus Rom 2
Una volta riavviato completamente il telefono e dopo essersi accertati che tutto sia andato bene e' possibile e' possibile riavviare il telefono, riavviare CWM ed eseguire l'update che corregge un problema sulle impostazioni del provider
Come si vede questa ROM e' un passo indietro verso Android 2.3.6 ed ha anche (giustamente) un numero ridotto di programmi preinstallati
Le prime impressioni di uso sono buone ma come gia' detto i problemi riscontrati con la JellyBlast erano saltuari e non prevedibili quindi solo l'uso dira' se e' il caso di continuare con la Optimus
martedì 29 gennaio 2013
Disco SSD ottimizzato su Linux
I dischi SSD come si sa hanno il pregio di essere veloci ma il difetto di avere un numero limitato di cicli scrittura/lettura per cui, se non strettamente necessario, si deve fare di tutto per limitare gli accessi al disco
I consigli che ho seguito derivano da questo link
1) modificare il file /etc/fstab con la seguente riga
/dev/sda / ext4 noatime,nodiratime,discard,errors=remount-ro 0 1
in questo modo non viene aggiornata la data di ultimo accesso ai file
2) modificare il file /etc/default/grub per cambiare lo scheduler come segue
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash elevator=deadline"
subito dopo si deve lanciare update-grub2
non ho modificato invece la gestione del file di swap massimizzando l'uso della Ram perche' con macchine di ristretta memoria il comando ha effetti deleteri sulle prestazioni
Avendo un portatile ad uso personale anche i file di log sono normalmente inutili per cui ho disabilitato il demone rsyslog mediante il comando
update-rc.d -f rsyslog remove (puo' essere riprstinato con update-rc.d rsyslog defaults)
AppInventor
Fino a poco tempo il servizio di AppInventor al MIT era chiuso per ristrutturazione ed avevo potuto provarlo solo per poco tempo senza averne una grandissima impressione
Adesso, complice anche una maggiore esperienza con Android, devo ammettere che e' bel giochino sia per iniziare a programmare sia per creare applicazioni senza troppe pretese
Prima di iniziare e' necessario scaricare il pacchetto AppInventor Setup da questo link
Successivamente si apre il browser e si punta su http://beta.appinventor.mit.edu, ci si logga con un account GMail e si crea una nuova applicazione
La schermata che compare corrisponde all'editor visual del form che si andra' a comporre.
Per questo esempio verra' creato un semplice programma con una Label ed un Button che alla evento di pressione del pulsante cambia il testo della Label
Si trascinano quindi una Label ed un Button, si impostano un po' di proprieta' e la parte di impaginazione e' finita
Per gestire l'evento di pressione del pulsante si deve cliccare su Open Block Editor (viene scaricato un file in Java) che apre una finestra in stile Blockly in cui si possono trascinare i vari componenti per determinare cosa accade quando si genera un evento OnClick
In questo caso semplicemente il contenuto della Label diventa "Luca"
Come testare (od installare l'applicazione)??
Esistono due possibilita': una utilizzare un telefono reale ed una utilizzare l'emulatore integrato. Nel primo caso si deve cliccare Connect to Device e scegliere l'identificativo del telefono, nel secondo caso si deve cliccare New Emulator e quando questo e' partito si clicca su Connect to Device e si sceglie l'emulatore
Scegliendo dal menu a tendina in alto a sinistra dell'editor del form Package for Phonesi puo' anche scaricare il file .apk del programma cosi' generato.
Magari non e' un sistema per uso professionale ma come strumento didattico e' decisamente fantastico
Attenzione: per motivi non meglio chiariti ho avuto problemi ad usare il Block Editor in Chrome mentre in Firefox tutto funziona correttamente
Adesso, complice anche una maggiore esperienza con Android, devo ammettere che e' bel giochino sia per iniziare a programmare sia per creare applicazioni senza troppe pretese
Prima di iniziare e' necessario scaricare il pacchetto AppInventor Setup da questo link
Successivamente si apre il browser e si punta su http://beta.appinventor.mit.edu, ci si logga con un account GMail e si crea una nuova applicazione
La schermata che compare corrisponde all'editor visual del form che si andra' a comporre.
Per questo esempio verra' creato un semplice programma con una Label ed un Button che alla evento di pressione del pulsante cambia il testo della Label
Si trascinano quindi una Label ed un Button, si impostano un po' di proprieta' e la parte di impaginazione e' finita
Per gestire l'evento di pressione del pulsante si deve cliccare su Open Block Editor (viene scaricato un file in Java) che apre una finestra in stile Blockly in cui si possono trascinare i vari componenti per determinare cosa accade quando si genera un evento OnClick
In questo caso semplicemente il contenuto della Label diventa "Luca"
Come testare (od installare l'applicazione)??
Esistono due possibilita': una utilizzare un telefono reale ed una utilizzare l'emulatore integrato. Nel primo caso si deve cliccare Connect to Device e scegliere l'identificativo del telefono, nel secondo caso si deve cliccare New Emulator e quando questo e' partito si clicca su Connect to Device e si sceglie l'emulatore
Scegliendo dal menu a tendina in alto a sinistra dell'editor del form Package for Phonesi puo' anche scaricare il file .apk del programma cosi' generato.
Magari non e' un sistema per uso professionale ma come strumento didattico e' decisamente fantastico
Attenzione: per motivi non meglio chiariti ho avuto problemi ad usare il Block Editor in Chrome mentre in Firefox tutto funziona correttamente
Blocky
Stavo iniziando a cercare un linguaggio di programmazione per istruire mio figlio con le basi dell'informatica (e' un po' presto ma i bimbi sono fenomenali) e mi sono imbattuto in Blocky un metodo grafico di comporre le basi di un programma
L'interfaccia e' composta da "mattoncini" con cicli, assegnazioni, condizioni che si possono unire in modo drag&drop
di seguito dei banali esempi
Si tratta di un metodo rigoroso (richiede addirittura la dichiarazione di una variabile prima di poterla usare) ma intuitivo e decisamente istruttivo.
Per altro tale sistema e' alla base di AppInventor
L'interfaccia e' composta da "mattoncini" con cicli, assegnazioni, condizioni che si possono unire in modo drag&drop
di seguito dei banali esempi
Si tratta di un metodo rigoroso (richiede addirittura la dichiarazione di una variabile prima di poterla usare) ma intuitivo e decisamente istruttivo.
Per altro tale sistema e' alla base di AppInventor
Esempio di QTableView
Un breve esempio su come predisporre una visione tabellare dei dati in Qt
Per prima cosa si deve trascinare una QTableView sul form di interesse
Successivamente, da codice, si possono cambiare le impostazioni.
E' importante comprendere che la vestizione dell'oggetto avviene tramite il sistema model/view per cui e' necessario creare un model, associarlo alla tableview e poi impostare le proprieta' dell'oggetto mediante il model
Di seguito un esempio del codice che produce la finestra sotto riportata
---------------------------------------------
Per prima cosa si deve trascinare una QTableView sul form di interesse
Successivamente, da codice, si possono cambiare le impostazioni.
E' importante comprendere che la vestizione dell'oggetto avviene tramite il sistema model/view per cui e' necessario creare un model, associarlo alla tableview e poi impostare le proprieta' dell'oggetto mediante il model
Di seguito un esempio del codice che produce la finestra sotto riportata
---------------------------------------------
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QStandardItemModel *model = new QStandardItemModel(2,3,this); //2 Rows and 3 Columns
model->setHorizontalHeaderItem(0, new QStandardItem(QString("Titolo Col.1")));
model->setHorizontalHeaderItem(1, new QStandardItem(QString("Titolo Col.2")));
model->setHorizontalHeaderItem(2, new QStandardItem(QString("Titolo Col.3")));
ui->tableView->setModel(model);
QStandardItem *uno = new QStandardItem(QString("uno"));
model->setItem(0,0,uno);
QStandardItem *due = new QStandardItem(QString("due"));
model->setItem(0,1,due);
QStandardItem *tre = new QStandardItem(QString("tre"));
model->setItem(1,0,tre);
}
Widget::~Widget()
{
delete ui;
}
MK808
Finalmente mi e' arrivato dalla Cina l'Mk808, un mediacenter Android dalle dimensioni estremamente ridotte ed una discreta capacita' di calcolo
L'Mk808 ha un processore dual core da 1.6 GHz (processore A9) con 1Gb di Ram e 8 Gb di Rom, Wi-fi, Bluetooth, USB OTG per connettere dischi esterni e connessione HDMI per il televisore
Per interagire con Android, mancando ovviamente il supporto touch, si ha il supporto a mouse e tastiera (meglio wireless da 2.4 GHz come il mouse Logitech in figura)
Le applicazioni installate sono minimali (di cui una in cinese) ma ci sono quelle base di Google
Il tempo di boot e' estremamente veloce e batte di gran lunga il mio Mediacom 810 con cui condivide la versione di sistema operativo
In linea di principio e' possibile montare sul dispositivo anche una versione modificata di Ubuntu come indicato a questo link ma la procedura e' molto complicata (forse e' meglio usare Raspberry se si vuole usare Ubuntu su un ultra compatto Arm)
L'Mk808 ha un processore dual core da 1.6 GHz (processore A9) con 1Gb di Ram e 8 Gb di Rom, Wi-fi, Bluetooth, USB OTG per connettere dischi esterni e connessione HDMI per il televisore
Per interagire con Android, mancando ovviamente il supporto touch, si ha il supporto a mouse e tastiera (meglio wireless da 2.4 GHz come il mouse Logitech in figura)
Le applicazioni installate sono minimali (di cui una in cinese) ma ci sono quelle base di Google
Il tempo di boot e' estremamente veloce e batte di gran lunga il mio Mediacom 810 con cui condivide la versione di sistema operativo
In linea di principio e' possibile montare sul dispositivo anche una versione modificata di Ubuntu come indicato a questo link ma la procedura e' molto complicata (forse e' meglio usare Raspberry se si vuole usare Ubuntu su un ultra compatto Arm)
lunedì 28 gennaio 2013
Compilare librerie esterne in Qt/QtCreator
In questo post verra' mostrato come linkare una libreria esterna al pacchetto Qt mediante l'uso di QtCreator.
La libreria di esempio e' costuita dalle Shapefile C Library, una libreria che serve per leggere i file ESRI .shp
Una volta scaricato il file tgz si spacchetta e si digita
make
make test (per controllare che la compilazione sia andata a buon fine)
make install (per installare la libreria ed i file di sviluppo)
al termine la libreria si chiamera' libshp.a e sara' posta in /usr/local/lib mentre i file di include saranno in /usr/local/include
shape.pro
---------------------------------
#-------------------------------------------------
#
# Project created by QtCreator 2013-01-28T12:49:51
#
#-------------------------------------------------
QT += core
QT -= gui
TARGET = shape
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
LIBS += -L/usr/local/lib -lshp
INCLUDEPATH += -I/usr/local/include
per vedere se il programma funziona si puo' rubare parte del codice al programma shpinfo.c che si trova nella sottodirectory contrib del pacchetto shapelib.tgz
main.cpp
--------------------------------
#include "shapefil.h"
#include <QDebug>
#include <iostream>
............................
SHPHandle hSHP;
int nShapeType, nEntities, nVertices, nParts, *panParts, i, iPart;
double *padVertices, adfBndsMin[4], adfBndsMax[4];
hSHP = SHPOpen("/home/luca/shp/test.shp","rb");
if( hSHP == NULL )
{
}
SHPGetInfo( hSHP, &nEntities, &nShapeType, adfBndsMin, adfBndsMax );
qDebug() << nShapeType;
---------------------------------
La libreria di esempio e' costuita dalle Shapefile C Library, una libreria che serve per leggere i file ESRI .shp
Una volta scaricato il file tgz si spacchetta e si digita
make
make test (per controllare che la compilazione sia andata a buon fine)
make install (per installare la libreria ed i file di sviluppo)
al termine la libreria si chiamera' libshp.a e sara' posta in /usr/local/lib mentre i file di include saranno in /usr/local/include
shape.pro
---------------------------------
#-------------------------------------------------
#
# Project created by QtCreator 2013-01-28T12:49:51
#
#-------------------------------------------------
QT += core
QT -= gui
TARGET = shape
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
LIBS += -L/usr/local/lib -lshp
INCLUDEPATH += -I/usr/local/include
---------------------------------
per vedere se il programma funziona si puo' rubare parte del codice al programma shpinfo.c che si trova nella sottodirectory contrib del pacchetto shapelib.tgz
main.cpp
--------------------------------
#include "shapefil.h"
#include <QDebug>
#include <iostream>
............................
SHPHandle hSHP;
int nShapeType, nEntities, nVertices, nParts, *panParts, i, iPart;
double *padVertices, adfBndsMin[4], adfBndsMax[4];
hSHP = SHPOpen("/home/luca/shp/test.shp","rb");
if( hSHP == NULL )
{
}
SHPGetInfo( hSHP, &nEntities, &nShapeType, adfBndsMin, adfBndsMax );
qDebug() << nShapeType;
---------------------------------
Qt Console Application
Oltre alle applicazioni GUI con Qt e' possibile anche creare delle applicazioni da console (anche usando i template di QtCreator)
Lo scheletro dell'applicazione e' il seguente
-------------------------------
Lo scheletro dell'applicazione e' il seguente
-------------------------------
#include <QtCore/QCoreApplication>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
return a.exec();
}
-------------------------------Se si esegue il codice si ha la sorpresa di aver una finestra di consolle perennemente apertaCio e' dovuto al fatto che l'applicazione per chiudersi deve ricevere un esplicito messaggio di chiusura che puo' essere effettuato mediante una chiamataQCoreApplication::exit(0)
oppure mediante una via piu' complicata
------------------------#include <QtCore/QCoreApplication>
#include <QTimer>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QTimer::singleShot(5000, &a, SLOT(quit()));
return a.exec();
}
Mysql in Qt
In questo post viene mostrata la connessione e l'esecuzione di query da Qt verso un database MysqlS riprendendo le basi gia' poste nel post SQlite
In sostanza deve essere modificata solo la parte relativa alla connessione mentre l'esecuzione delle query e' sostanzialmente identica
(come sempre si deve modificare il file .pro aggiungendo la libreria sql con il comando
QT += core gui sql
)
--------------------------------------------
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setDatabaseName("test");
db.setHostName("localhost");
db.setUserName("root");
db.setPassword("");
if (db.open()) {
QSqlQuery query;
query.exec("create table punteggio (id int primary key, "
"nome varchar(20), "
"punti int)");
query.exec("insert into punteggio values(0, 'Luca', 2)");
query.exec("insert into punteggio values(1, 'Federico', 102)");
query.exec("insert into punteggio values(2, 'Alessio', 15)");
db.close();
}
In sostanza deve essere modificata solo la parte relativa alla connessione mentre l'esecuzione delle query e' sostanzialmente identica
(come sempre si deve modificare il file .pro aggiungendo la libreria sql con il comando
QT += core gui sql
)
--------------------------------------------
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setDatabaseName("test");
db.setHostName("localhost");
db.setUserName("root");
db.setPassword("");
if (db.open()) {
QSqlQuery query;
query.exec("create table punteggio (id int primary key, "
"nome varchar(20), "
"punti int)");
query.exec("insert into punteggio values(0, 'Luca', 2)");
query.exec("insert into punteggio values(1, 'Federico', 102)");
query.exec("insert into punteggio values(2, 'Alessio', 15)");
db.close();
}
domenica 27 gennaio 2013
Root in read only mode in Debian
Per cercare di migliorare le prestazioni del disco SSD mi sono messo a modificare il file fstab
Disgraziatamente ho scritto
/dev/sda / ext4 noatime,nodirtime,discard,errors=remount-ro 0 1
e non (si noti la mancanza di una a nel secondo parametro)
/dev/sda / ext4 noatime,nodiratime,discard,errors=remount-ro 0 1
al successivo riavvio la macchina e' partita andando pero' in schermo nero al momento di far partire la sessione X. Fortunatamente le shell erano ancora attivi quindi da Alt+F2 e' stato possibile vedere che il filesystem era stato montato come in sola lettura
Dopo vari tentativi la soluzione funzionante e' stata di digitare in consolle di shell il comando
mount -n -o remount,defaults /dev/sda1 /
a questo punto il filesystem e' tornato scrivibile, ho corretto fstab e fatto ripartire la macchina
Tutto e' tornato a funzionare perfettamente
Disgraziatamente ho scritto
/dev/sda / ext4 noatime,nodirtime,discard,errors=remount-ro 0 1
e non (si noti la mancanza di una a nel secondo parametro)
/dev/sda / ext4 noatime,nodiratime,discard,errors=remount-ro 0 1
al successivo riavvio la macchina e' partita andando pero' in schermo nero al momento di far partire la sessione X. Fortunatamente le shell erano ancora attivi quindi da Alt+F2 e' stato possibile vedere che il filesystem era stato montato come in sola lettura
Dopo vari tentativi la soluzione funzionante e' stata di digitare in consolle di shell il comando
mount -n -o remount,defaults /dev/sda1 /
a questo punto il filesystem e' tornato scrivibile, ho corretto fstab e fatto ripartire la macchina
Tutto e' tornato a funzionare perfettamente
Apt dietro ad un proxy server
Per effettuare il download dei pacchetti .deb da dietro ad un http proxy server si deve configurare il file /etc/apt/apt.conf con la seguente riga
/etc/apt/apt.conf
-----------------------------------
Acquire::http::Proxy "http://mioproxy:8080/";
/etc/apt/apt.conf
-----------------------------------
Acquire::http::Proxy "http://mioproxy:8080/";
venerdì 25 gennaio 2013
SQLite in Qt
In questo post verra' presentato un esempio di utilizzo di Qt con Sqlite
Le librerie Qr hanno gia' al loro interno il supporto per Sqlite per cui non e' necessaria l'installazione di nessun componente aggiuntivo
Per prima cosa si deve modificare il file .pro per includere il supporto sql (come evidenziato in giallo nel listato sottostante)
sql.pro
--------------------------------------------
--------------------------------------------
L'esempio effettua tre query
Nella prima viene creata una tabella inserendo tre righe
Nella seconda viene effettuata una SELECT senza vincoli
Nella terza viene effettuata una SELECT condizionata da un WHERE
Il codice e' sostanzialmente autoesplicativo.L'unica cosa da sottolineare e' che in QtCreator sotto Windows si dove dichiarare un include <QtSql> mentre in Linux deve essere modificato in <QtSql\QtSql>
main.cpp
--------------------------------------------
--------------------------------------------
asd
Le librerie Qr hanno gia' al loro interno il supporto per Sqlite per cui non e' necessaria l'installazione di nessun componente aggiuntivo
Per prima cosa si deve modificare il file .pro per includere il supporto sql (come evidenziato in giallo nel listato sottostante)
sql.pro
--------------------------------------------
QT += core
QT += sql
QT -= gui
TARGET = sql
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
--------------------------------------------
L'esempio effettua tre query
Nella prima viene creata una tabella inserendo tre righe
Nella seconda viene effettuata una SELECT senza vincoli
Nella terza viene effettuata una SELECT condizionata da un WHERE
Il codice e' sostanzialmente autoesplicativo.L'unica cosa da sottolineare e' che in QtCreator sotto Windows si dove dichiarare un include <QtSql> mentre in Linux deve essere modificato in <QtSql\QtSql>
main.cpp
--------------------------------------------
#include <QtCore/QCoreApplication>
#include <Qtsql>
//per Linux si deve sostituire la riga precedente con
//#include <QtSql/QtSql>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("c:/punteggio.db");
if (!db.open()) {
return false;
}
QSqlQuery query;
query.exec("create table punteggio (id int primary key, "
"nome varchar(20), "
"punti int)");
query.exec("insert into punteggio values(0, 'Luca', 2)");
query.exec("insert into punteggio values(1, 'Federico', 102)");
query.exec("insert into punteggio values(2, 'Alessio', 15)");
QSqlQuery query2;
query2.prepare( "SELECT * FROM punteggio" );
if( !query2.exec() )
{
qDebug() << "Errore sulla query";
}
while( query2.next() )
{
int punti = query2.value(2).toInt();
QString nome = query2.value(1).toString();
qDebug() << nome << " " << punti << endl;
}
// SELECT CONDIZIONATA DA WHERE
QSqlQuery query3;
query3.prepare( "SELECT * FROM punteggio WHERE punti > ?" );
query3.bindValue(":punti",20);
if( !query3.exec() )
{
qDebug() << "Errore sulla query";
}
while( query3.next() )
{
int punti = query3.value(2).toInt();
QString nome = query3.value(1).toString();
qDebug() << nome << " " << punti << endl;
}
return a.exec();
}
--------------------------------------------
asd
Sqliteman in Debian
Al contrario di Ubuntu o di altre distro, non esiste un pacchetto gia' pronto per installare Sqliteman in Debian testing
La soluzione e' scaricare il pacchetto del sorgente del programma da Sourceforge (al momento la versione piu' recente e' sqliteman-1.2.2.tar.bz2)
dopo aver spacchettato l'archivio si entra nella directory e si procede con i seguenti comandi
apt-get install cmake
apt-get install libqscintilla2-8 libqscintilla2-dev
apt-get install sqlite3
La soluzione e' scaricare il pacchetto del sorgente del programma da Sourceforge (al momento la versione piu' recente e' sqliteman-1.2.2.tar.bz2)
dopo aver spacchettato l'archivio si entra nella directory e si procede con i seguenti comandi
apt-get install cmake
apt-get install libqscintilla2-8 libqscintilla2-dev
apt-get install sqlite3
cmake . (notare il punto dopo cmake)
make
make install
Sostituire HD con SSD su IBM X40
Per provare (ed anche perche' il disco fisso tradizionale stava dando segni di cedimento) mi sono comprato su Amazon un disco SSD Kingspec per sostituire il disco tradizionale dell'IBM X40
Lo smontaggio e' banale dato che il disco fisso e' fissato da una sola vite e si sfila mediante un sistema a slitta dopo aver rovesciato il portatile
La dimensione del disco fisso e' da 1.8 pollici. Nella foto sottostante si vede sopra a sinistra il disco originale, in alto a destra un disco derivante da un Ipod sempre in formato 1.8 pollici ma con un diverso sistema di connessione (flat e non PATA) mentre sotto il nuovo disco SSD
L'unico aspetto da considerare e' che il disco SSD ha bisogno della presenza del jumper che lo setti come Master del canale PATA (nel disco fisso originale non era presente nessun jumper e probabilmente era settato come cable select)
Lo smontaggio e' banale dato che il disco fisso e' fissato da una sola vite e si sfila mediante un sistema a slitta dopo aver rovesciato il portatile
Alloggiamento disco fisso su IBM X40 |
La dimensione del disco fisso e' da 1.8 pollici. Nella foto sottostante si vede sopra a sinistra il disco originale, in alto a destra un disco derivante da un Ipod sempre in formato 1.8 pollici ma con un diverso sistema di connessione (flat e non PATA) mentre sotto il nuovo disco SSD
L'unico aspetto da considerare e' che il disco SSD ha bisogno della presenza del jumper che lo setti come Master del canale PATA (nel disco fisso originale non era presente nessun jumper e probabilmente era settato come cable select)
giovedì 24 gennaio 2013
Leggere XML/KML con Qt
Lo scopo di questo programma e' estrarre i valori di latitudine e longitudine da un file kml (Google Earth) popolato di placemarks
Per prima cosa una precisazione: esistono due modi per creare file xml, nella prima il tag contiene l'informazione mentre nella seconda l'informazione e' racchiusa tra i tag
per esempio
caso 1 : <tag id="0"/>
caso 2 : <id>0</tag>
Il secondo caso corriponde a come sono formati i file xml per esempio dei servizi RSS e di Google Earth
Il motivo di questa precisazione risiede nel fatto che il metodo di lettura non e' valido per tutti i formati
Il tutorial di http://www.voidrealms.com (tutorial Qt 95) non interpreta correttamente il formato 2
kml.pro (importante modificare il file di progetto perche' si usa la libreria QtXml che non e' normalmente linkata)
-----------------------------------
#-------------------------------------------------
Per prima cosa una precisazione: esistono due modi per creare file xml, nella prima il tag contiene l'informazione mentre nella seconda l'informazione e' racchiusa tra i tag
per esempio
caso 1 : <tag id="0"/>
caso 2 : <id>0</tag>
Caso 1 |
Caso 2 (KML) |
Il secondo caso corriponde a come sono formati i file xml per esempio dei servizi RSS e di Google Earth
Il motivo di questa precisazione risiede nel fatto che il metodo di lettura non e' valido per tutti i formati
Il tutorial di http://www.voidrealms.com (tutorial Qt 95) non interpreta correttamente il formato 2
kml.pro (importante modificare il file di progetto perche' si usa la libreria QtXml che non e' normalmente linkata)
-----------------------------------
#-------------------------------------------------
#
# Project created by QtCreator 2013-01-23T10:12:21
#
#-------------------------------------------------
QT += core
QT += xml
TARGET = untitled
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
--------------------------
main.cpp
--------------------------
#include <QtCore>
#include <QtXml>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString filename("C:/Casa.kml");
QTextStream cout(stdout);
QFile file(filename);
bool open = file.open(QIODevice::ReadOnly | QIODevice::Text);
if (!open)
{
cout << "Couldn't open file" << endl;
return 1;
}
else
{
cout << "File opened OK" << endl;
}
QXmlStreamReader xml(&file);
qDebug() << "Encoding: " << xml.documentEncoding().toString() << endl;
while (!xml.atEnd() && !xml.hasError())
{
xml.readNext();
if (xml.isStartElement())
{
QString name = xml.name().toString();
if ((name=="longitude") || (name == "latitude"))
{
qDebug() << "element name: '" << xml.name().toString() << "'" << ", text: '" << xml.readElementText() << "'" << endl;
}
}
else if (xml.hasError())
{
qDebug() << "XML error: " << xml.errorString() << endl;
}
else if (xml.atEnd())
{
qDebug() << "Reached end, done" << endl;
}
}
return a.exec();
}
--------------------------
Iscriviti a:
Post (Atom)
Debugger integrato ESP32S3
Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede nell'ID USB della porta Jtag. Nel modulo...
-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...