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)






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

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

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


Esempio del menu di I3 (Alt+D)
 L'aspetto un po' fuorviante che, essendo un tiling window manager, le varie finestre vengono giustapposte affiancate e non sovrapposte

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










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


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

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


---------------------------------------------

#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)

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;

---------------------------------

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
-------------------------------

#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 aperta
Cio e' dovuto al fatto che l'applicazione per chiudersi deve ricevere un esplicito messaggio di chiusura che puo' essere effettuato mediante una chiamata
QCoreApplication::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();
}




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

LLama3 Anita

A seguito di questo post ho provato a vedere ho provato a vedere cosa accadeva ad utilizzare un modello specifico per la lingua italiana in...