Questo post e' un piu' un promemoria per me stesso che altro
Regolarmente (una volta all'anno) mi trovo a dover tirare fuori dal cassetto qualche apparato di rete (in particolare qualche access point..in particolare un ben preciso access point) di cui mi sono scordato l'ip e che devo riconfigurare
Per questo motivo e' necessario effettuare una scansione completa della rete alla ricerca dell'ip dell'access point...in generale la cosa e' ristretta alla classe 192.168.x.x e 10.0.x.x
Per fare cio' e' molto comodo fping (da installare con apt-get install fping) che automatizza il compito
in generale la sintassi e'
fping -g - a 10.0.2.0/24
per scansionare la classe determinata dalla netmask e visualizzare sotto gli host attivi
ovviamente tutto cio' funziona fino a quando non e' impostato il No Ping ma in generale gli apparati di rete non sono cosi' configurati
giovedì 7 febbraio 2013
martedì 5 febbraio 2013
CMake
Guardando un po' a giro mi sono reso conto di quanto sono arretrato ....ero rimasto al fatto che autotools e' una cosa figa mentre e' stata sorpassata da altri concorrenti come CMake ed ho deciso di provarlo con il programma descritto a questo post
Per provare Cmake (che non e' installato di default in Debian) si deve creare il file CMakeLists.txt dove sono contenute le informazioni di compilazione come nel Makefile come il link verso la libreria SDL
CMakeLists.txt
----------------------------------------
cmake_minimum_required(VERSION 2.8)
PROJECT(CMake_TEST)
FIND_PACKAGE(SDL REQUIRED)
ADD_DEFINITIONS(-Wall -O3)
INCLUDE_DIRECTORIES(${SDL_INCLUDE_DIR})
ADD_EXECUTABLE(cmake_test test.cpp)
TARGET_LINK_LIBRARIES(cmake_test ${SDL_LIBRARY})
----------------------------------------
a questo punto, con il solo file sorgente e il CMakeLists.txt nella directory, si lancia
cmake . (attenzione al punto)
vengono generati automaticamente altri file e se non ci sono errori si puo' digitare
make
per compilare l'eseguibile
L'aspetto piu' interessante di CMake e' di essere indipendente dalla piattaforma e dal compilatore e puo' generare file di compilazione di Linux e Windows per i diversi compilatori supportati
Ovviamente non ha senso di usare Cmake per un caso cosi' semplice come quello utilizzato nell'esempio (e' sempre piu' veloce utilizzare la linea di comando per lanciare gcc, anche bypassando make)
Scrivere e leggere file binario in Qt
Ed adesso in confronto il metodo Qt ed il metodo standard C++ per leggere un file binario di interi
Qt
-----------------------------------------------------------
#include <QFile>
#include <QDebug>
QFile f("/home/luca/luca.dat");
f.open(QIODevice::WriteOnly | QIODevice::Append);
QDataStream out(&f);
out<<quint16(270);
f.close();
QFile g("/home/luca/luca.dat");
g.open(QIODevice::ReadOnly);
QDataStream in(&g);
qint16 letto;
in >> letto;
qDebug() << letto;
-----------------------------------------------------------
C++
-----------------------------------------------------------
#include <iostream>
#include <fstream>
using namespace std;
int main(void){
float fnum[4] = {42.22, -42.44, 1.2, 7.8};
int i;
ofstream out("numeri.dat", ios::out | ios::binary);
if(!out){
return 1;
}
out.write((char *) &fnum, sizeof(fnum));
out.close();
for (i=0; i<4; i++)
fnum[i] = 0.0;
ifstream in("numeri.dat", ios::in | ios::binary);
if(!in) {
cout << "Cannot open file.";
return 1;
;
}
in.read((char *) &fnum, sizeof(fnum));
cout << in.gcount() << " bytes read." << endl;
for (i=0; i<4; i++)
cout << fnum[i] << " ";
in.close();
cout << endl;
}
----------------------------------------------------------------
-----
Qt
-----------------------------------------------------------
#include <QFile>
#include <QDebug>
QFile f("/home/luca/luca.dat");
f.open(QIODevice::WriteOnly | QIODevice::Append);
QDataStream out(&f);
out<<quint16(270);
f.close();
QFile g("/home/luca/luca.dat");
g.open(QIODevice::ReadOnly);
QDataStream in(&g);
qint16 letto;
in >> letto;
qDebug() << letto;
-----------------------------------------------------------
C++
-----------------------------------------------------------
#include <iostream>
#include <fstream>
using namespace std;
int main(void){
float fnum[4] = {42.22, -42.44, 1.2, 7.8};
int i;
ofstream out("numeri.dat", ios::out | ios::binary);
if(!out){
return 1;
}
out.write((char *) &fnum, sizeof(fnum));
out.close();
for (i=0; i<4; i++)
fnum[i] = 0.0;
ifstream in("numeri.dat", ios::in | ios::binary);
if(!in) {
cout << "Cannot open file.";
return 1;
;
}
in.read((char *) &fnum, sizeof(fnum));
cout << in.gcount() << " bytes read." << endl;
for (i=0; i<4; i++)
cout << fnum[i] << " ";
in.close();
cout << endl;
}
----------------------------------------------------------------
-----
Debian on Android
Esempio di Linux in Android (Debian small image) su un tablet Mediacom 850i
Come si puo' vedere il sistema e' particolarmente lento ed al limite dell'usabile (sarebbe da provare anche con un puntatore ed una tastiera fisica)
Come si puo' vedere il sistema e' particolarmente lento ed al limite dell'usabile (sarebbe da provare anche con un puntatore ed una tastiera fisica)
Scrivere e leggere file testo in Qt
Un semplice esempio di come scrivere e leggere un file testo in Qt
L'esempio e' ripreso sostanzialmente dall'help in linea per cui non vengono fornite ulteriori spiegazioni
------------------------------------------------
//scrittura
QFile mfile("/home/luca/prova.txt");
if (!mfile.open(QFile::WriteOnly | QFile::Text))
{
return ;
}
QTextStream out(&mfile);
out << "La risposta e': " << 42 << "\n";
out << "Ma la domanda quale e'??";
mfile.flush();
mfile.close();
//lettura
QFile rfile("/home/luca/prova.txt");
if (!rfile.open(QFile::ReadOnly | QFile::Text))
return;
QTextStream in(&rfile);
QString t;
while (!in.atEnd()) {
QString line = in.readLine();
t = t + line + "\n";
}
ui->textEdit->setText(t);
rfile.close();
-------------------------------------------------
altrimenti in C++ classico
--------------------------------------------------
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main () {
string line;
ofstream myfile ("prova.txt");
if (myfile.is_open()){
myfile << "This is a line.\n";
myfile.close();
}
else
cout << "Unable to open file";
ifstream myfile2 ("prova.txt");
if (myfile2.is_open())
{
while (! myfile2.eof() )
{
getline (myfile2,line);
cout << line << endl;
}
myfile2.close();
}else
cout << "Unable to open file";
}
L'esempio e' ripreso sostanzialmente dall'help in linea per cui non vengono fornite ulteriori spiegazioni
------------------------------------------------
//scrittura
QFile mfile("/home/luca/prova.txt");
if (!mfile.open(QFile::WriteOnly | QFile::Text))
{
return ;
}
QTextStream out(&mfile);
out << "La risposta e': " << 42 << "\n";
out << "Ma la domanda quale e'??";
mfile.flush();
mfile.close();
//lettura
QFile rfile("/home/luca/prova.txt");
if (!rfile.open(QFile::ReadOnly | QFile::Text))
return;
QTextStream in(&rfile);
QString t;
while (!in.atEnd()) {
QString line = in.readLine();
t = t + line + "\n";
}
ui->textEdit->setText(t);
rfile.close();
-------------------------------------------------
altrimenti in C++ classico
--------------------------------------------------
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main () {
string line;
ofstream myfile ("prova.txt");
if (myfile.is_open()){
myfile << "This is a line.\n";
myfile.close();
}
else
cout << "Unable to open file";
ifstream myfile2 ("prova.txt");
if (myfile2.is_open())
{
while (! myfile2.eof() )
{
getline (myfile2,line);
cout << line << endl;
}
myfile2.close();
}else
cout << "Unable to open file";
}
--------------------------------------------------
lunedì 4 febbraio 2013
Modalita' scalata in VirtualBox
Una delle cose piu' fastidiose in VirtualBox e' la modalita' scalata che in pratica fa scomparire il menu' di Virtualbox dalla finestra dell'applicazione (impedendo cosi' di ripristinare la modalita' precedente via mouse)
per poter riconquistare il menu si deve premere la combinazione CTRL destro + F
![]() |
| Modalita' a finestra |
![]() |
| Modalita' Scalata |
per poter riconquistare il menu si deve premere la combinazione CTRL destro + F
Debian in Android su Samsung GT-5570i
In questo post verra' descritto come ho installato Linux Complete Installer ed una Debian Testing sul mio telefono Samsung GT-5550i con Rom Optimus
Il programma che effettua questo trucco si chiama Complete Linux Installer ed ha bisogno dei privilegi di root per funzionare. La cosa simpatica e' che il programma sfrutta il chroot per creare un ambiente che funziona in parallelo ad Android senza ad andare ad intaccarne la funzionalita' (non e' un dualboot..diciamo che e' piu' simile ad una macchina virtuale)
Dopo di cio' si deve scaricare l'immagine (per Debian ne esistono di tre tipi core=solo interfaccia testuale, Small e Large con Xwindows e XFCE come DM)
le immagini, una volta scompattate si chiamano tutte debian.img quindi non possono risiedere nella stessa sottodirectory. Di default l'immagine di Debian deve essere contenuta nella SD Card nella directory "debian"
Una volta installato il programma si devono installare anche il terminale e VNCClient per Android
A questo punto si clicca Launch e si seleziona Debian.
Si apre il terminale, viene effettuato il check dell'immagine mediante il file md5 allegato e vengono richieste alcune configurazioni (per esempio la nuova password,le dimensioni della finestra grafica per VNC e se avviare il server SSH)
Se tutto va bene ci si trova in questa condizione
ovvero si leggera' il messaggio X Desktop is localhost:0
Non rimane che minimizzare il terminale e lanciare VncViewer per Android impostando la password come "debian" (attenzione.. quella che e' stata selezionata prima e' relativa all'utente Linux e non a VNC) e la risoluzione a 24 bit
ed ecco il risultato finale
ovviamente piu' il telefono e' veloce migliore sara' il risultato ed altrettanto ovviamente se il telefono e' collegato in rete si potra' usare il VNC client anche su PC od altre piattaforme
PS: una volta terminata la fase di controllo del checksum il file MD5 viene cancellato e viene creato un file di configurazione (file testo) nel quale viene riportata la dimensione del file VNC e quali server (SSH, VNC) sono attivati
Il programma che effettua questo trucco si chiama Complete Linux Installer ed ha bisogno dei privilegi di root per funzionare. La cosa simpatica e' che il programma sfrutta il chroot per creare un ambiente che funziona in parallelo ad Android senza ad andare ad intaccarne la funzionalita' (non e' un dualboot..diciamo che e' piu' simile ad una macchina virtuale)
Dopo di cio' si deve scaricare l'immagine (per Debian ne esistono di tre tipi core=solo interfaccia testuale, Small e Large con Xwindows e XFCE come DM)
le immagini, una volta scompattate si chiamano tutte debian.img quindi non possono risiedere nella stessa sottodirectory. Di default l'immagine di Debian deve essere contenuta nella SD Card nella directory "debian"
Una volta installato il programma si devono installare anche il terminale e VNCClient per Android
A questo punto si clicca Launch e si seleziona Debian.
Si apre il terminale, viene effettuato il check dell'immagine mediante il file md5 allegato e vengono richieste alcune configurazioni (per esempio la nuova password,le dimensioni della finestra grafica per VNC e se avviare il server SSH)
Se tutto va bene ci si trova in questa condizione
ovvero si leggera' il messaggio X Desktop is localhost:0
Non rimane che minimizzare il terminale e lanciare VncViewer per Android impostando la password come "debian" (attenzione.. quella che e' stata selezionata prima e' relativa all'utente Linux e non a VNC) e la risoluzione a 24 bit
ed ecco il risultato finale
ovviamente piu' il telefono e' veloce migliore sara' il risultato ed altrettanto ovviamente se il telefono e' collegato in rete si potra' usare il VNC client anche su PC od altre piattaforme
PS: una volta terminata la fase di controllo del checksum il file MD5 viene cancellato e viene creato un file di configurazione (file testo) nel quale viene riportata la dimensione del file VNC e quali server (SSH, VNC) sono attivati
venerdì 1 febbraio 2013
Loop mktime in configure/make
tentando di compilare Oleo mi sono imbattuto in un loop infinito nella fase di configure quando viene effettuato il controllo di mktime
La cosa, estremamente fastidiosa e che riguarda anche altri programmi, sembra essere relativa ad una versione troppo recente di autoconf...al momento non ho trovato soluzioni
Comandi utili da shell Linux
Settare la data
date -s "31 Jan 2013 13:57:00"
Controllare lo stato delle batteria
acpi
Controllare la memoria
top
puo' essere utile installare atop che fornisce una quantita' maggiore e piu' organizzata di informazioni
puo' essere utile installare atop che fornisce una quantita' maggiore e piu' organizzata di informazioni
Controllare lo stato dei dischi
df -H
Controlla lo stato della rete
iftop
iptraf
Controlla la scheda wireless
Ceni
Calcolatrice
echo $[2+4]
oppure si puo' usare dc (calcolatrice in notazione polacca)
dc
per esempio
dc
10
2
p
20
q
si moltiplica 10*2, si stampa il risultato e si fa quit
altrimenti si puo' usare
che si usa in notazione standard, da notare che e' un calcolatore a precisione arbitraria
10*2 [enter]
20
per usare le funzioni matematiche (vedi per esempio trigonometriche) si deve lanciare con lo switch bc -l mentre per definire la precisione si usa il comando scale (per esempio scale=100 imposta una precisione di 100 numeri decimali)
Gestione Archivi
unp (non e' propriamente un gestore di archivi ma sceglie quale scompattatore usare in base al file selezionato)
Text Editor
nano
fte-terminal (per una interfaccia testuale ma a finestre)
jed
Spreadsheet
sc
oleo (pacchetto da compilare, non esiste un pacchetto Debian ed al momento non si compila su Debian Testing)
teapot
File Manager
mc
Downloader
wget
Calendario
cal
Web
lynx e elinks
alpine
Visualizzatore/Conversione immagini
pacchetto imagemagick con display (visualizzatore), convert (per modificare le immagini)
Music Player
cmus
Torrent
rtorrent
Grafici
gnuplot
Mandelbrot in Assembler
Premettendo che niente del codice che segue e' frutto del mio lavoro ho raccolto (prima che si perdano) un po' di sorgenti per generare l'insieme di Mandelbrot in Assembler x86
Questa era una attivita' tipica del DOS quando si poteva avere accesso diretto in scrittura sulla memoria della VGA...con i nuovi sistemi operativi tale approccio e' sostanzialmente impossibile
i compilatori sono vari (TASM, FASM) e si vede anche la differenza tra la presenza e l'assenza del coprocessore matematico (che nei primi processori x86 era opzionale)
Listato 1
--------------------------------
--------------------------------
Listato 2
--------------------------------
;value: EAX - sentinella (max. TIEFE, min. 0)
PUBLIC rechnePunkt_
rechnePunkt_ PROC NEAR
TIEFE EQU DWORD PTR [EBP + 24]
CI_S EQU QWORD PTR [EBP + 16]
CR_S EQU QWORD PTR [EBP + 8]
push ebp
mov ebp, esp
fld CI_S
fstp ci
fld CR_S
fstp cr
push ecx
mov ecx, TIEFE
; CoProzessorstack einrichten
fldZ ; z.r = 0
fldZ ; z.i = 0
fldZ ; z.r^2 = 0
fldZ ; z.i^2 = 0
l1:
;Jetzt: st(0) - (z.i)^2
; st(1) - (z.r)^2
; st(2) - z.i
; st(3) - z.r
fsubp st(1),st ; z.r^2 - z.i^2
fadd cr ; z.r^2 - z.i^2 + c.r
fstp st(3)
fmulp st(1),st ; z.r * z.i
fadd st,st ; 2 * z.r * z.i
fadd ci ; 2 * z.r * z.i + c.i
;Ora : st(0) - new z.i = z.i
; st(1) - new z.r = z.r
fld st(1) ; z.r
fmul st,st ; z.r^2
fld st(1) ; z.i
fmul st,st ; z.i^2
fld st(1) ; z.r^2
fadd st,st(1) ; z.r^2 + z.i^2
fcomp grenze ; st = zabs2, < 4.0 ?
;Ora : st(0) - (z.i)^2 (confronta con occupazione in l1:)
; st(1) - (z.r)^2
; st(2) - z.i
; st(3) - z.r
fstsw ax
sahf
jae ende ;quanso st >= 4.0 -> vai a ende
dec ecx ;piu' veloce di un ciclo
jnz l1
ende: ffree st(3)
ffree st(2)
ffree st(1)
ffree st
mov eax, TIEFE
sub eax, ecx
pop ecx
mov esp, ebp
pop ebp
ret 20
rechnePunkt_ ENDP
_TEXT ENDS
--------------------------------
Listato 3
--------------------------------
; Mandelbrot found in the FIDO-Net. Very nice.
org 100h
start: mov ax,13h
int 10h ; set 320x200 256 color mode
mov ax,0a000h
mov ds,ax ; load ds with video segment
xor di,di ; zero out screen offset
mov bp,-200 ; load y with -(screen height)
l1: mov si,-320 ; load x with -(screen width)
l2: push di ; save screen offset
xor bx,bx ; val1 = 0
xor di,di ; val2 = 0
l3: push bx
lea ax,[bx+di] ; ax = val1 + val2
sub bx,di ; bx = val1 - val2
imul bx ; ans = val1^2 - val2^2
mov bl,ah
mov bh,dl
lea bx,[bx+si-64] ; val1 = (ans/256) + x - 64
pop ax
imul di ; ans = val1 * val2
mov al,ah
mov ah,dl
add ax,ax
xchg ax,di
lea di,[bp+di-56] ; val2 = (ans/128) + y - 56
cmp bh,4
jg draw ; if val1 > 1024 then draw point
inc cl ; increment color
jne l3
draw: pop di ; restore screen offset
xchg [di],cl ; store color, and make color = 0
inc di ; increment screen offset
inc si ; increment x
jne l2 ; if x <> 0 then continue lp2
inc bp ; increment y
jne l1 ; if y <> 0 then continue lp1
xor ax,ax
int 16h
mov ax,3
int 10h ; set text mode
ret ; exit program
--------------------------------
Questa era una attivita' tipica del DOS quando si poteva avere accesso diretto in scrittura sulla memoria della VGA...con i nuovi sistemi operativi tale approccio e' sostanzialmente impossibile
i compilatori sono vari (TASM, FASM) e si vede anche la differenza tra la presenza e l'assenza del coprocessore matematico (che nei primi processori x86 era opzionale)
Listato 1
--------------------------------
; Mandelbrot Set - fasm example program
; requires FPU
org 100h
mov ax,13h
int 10h
push 0A000h
pop es
mov dx,3C8h
xor al,al
out dx,al
inc dl
mov cx,64
vga_palette:
out dx,al
out dx,al
out dx,al
inc al
loop vga_palette
xor di,di
xor dx,dx
finit
fld [y_top]
fstp [y]
screen:
xor bx,bx
fld [x_left]
fstp [x]
row:
finit
fldz
fldz
mov cx,63
iterate:
fld st0
fmul st0,st0
fxch st1
fmul st0,st2
fadd st0,st0
fxch st2
fmul st0,st0
fsubp st1,st0
fxch st1
fadd [y]
fxch st1
fadd [x]
fld st1
fmul st0,st0
fld st1
fmul st0,st0
faddp st1,st0
fsqrt
fistp [i]
cmp [i],2
ja over
loop iterate
over:
mov al,cl
stosb
fld [x]
fadd [x_step]
fstp [x]
inc bx
cmp bx,320
jb row
fld [y]
fsub [y_step]
fstp [y]
inc dx
cmp dx,200
jb screen
xor ah,ah
int 16h
mov ax,3
int 10h
int 20h
x_left dd -2.2
y_top dd 1.25
x_step dd 0.009375
y_step dd 0.0125
x dd ?
y dd ?
i dw ?
--------------------------------
Listato 2
--------------------------------
;value: EAX - sentinella (max. TIEFE, min. 0)
PUBLIC rechnePunkt_
rechnePunkt_ PROC NEAR
TIEFE EQU DWORD PTR [EBP + 24]
CI_S EQU QWORD PTR [EBP + 16]
CR_S EQU QWORD PTR [EBP + 8]
push ebp
mov ebp, esp
fld CI_S
fstp ci
fld CR_S
fstp cr
push ecx
mov ecx, TIEFE
; CoProzessorstack einrichten
fldZ ; z.r = 0
fldZ ; z.i = 0
fldZ ; z.r^2 = 0
fldZ ; z.i^2 = 0
l1:
;Jetzt: st(0) - (z.i)^2
; st(1) - (z.r)^2
; st(2) - z.i
; st(3) - z.r
fsubp st(1),st ; z.r^2 - z.i^2
fadd cr ; z.r^2 - z.i^2 + c.r
fstp st(3)
fmulp st(1),st ; z.r * z.i
fadd st,st ; 2 * z.r * z.i
fadd ci ; 2 * z.r * z.i + c.i
;Ora : st(0) - new z.i = z.i
; st(1) - new z.r = z.r
fld st(1) ; z.r
fmul st,st ; z.r^2
fld st(1) ; z.i
fmul st,st ; z.i^2
fld st(1) ; z.r^2
fadd st,st(1) ; z.r^2 + z.i^2
fcomp grenze ; st = zabs2, < 4.0 ?
;Ora : st(0) - (z.i)^2 (confronta con occupazione in l1:)
; st(1) - (z.r)^2
; st(2) - z.i
; st(3) - z.r
fstsw ax
sahf
jae ende ;quanso st >= 4.0 -> vai a ende
dec ecx ;piu' veloce di un ciclo
jnz l1
ende: ffree st(3)
ffree st(2)
ffree st(1)
ffree st
mov eax, TIEFE
sub eax, ecx
pop ecx
mov esp, ebp
pop ebp
ret 20
rechnePunkt_ ENDP
_TEXT ENDS
--------------------------------
Listato 3
--------------------------------
; Mandelbrot found in the FIDO-Net. Very nice.
org 100h
start: mov ax,13h
int 10h ; set 320x200 256 color mode
mov ax,0a000h
mov ds,ax ; load ds with video segment
xor di,di ; zero out screen offset
mov bp,-200 ; load y with -(screen height)
l1: mov si,-320 ; load x with -(screen width)
l2: push di ; save screen offset
xor bx,bx ; val1 = 0
xor di,di ; val2 = 0
l3: push bx
lea ax,[bx+di] ; ax = val1 + val2
sub bx,di ; bx = val1 - val2
imul bx ; ans = val1^2 - val2^2
mov bl,ah
mov bh,dl
lea bx,[bx+si-64] ; val1 = (ans/256) + x - 64
pop ax
imul di ; ans = val1 * val2
mov al,ah
mov ah,dl
add ax,ax
xchg ax,di
lea di,[bp+di-56] ; val2 = (ans/128) + y - 56
cmp bh,4
jg draw ; if val1 > 1024 then draw point
inc cl ; increment color
jne l3
draw: pop di ; restore screen offset
xchg [di],cl ; store color, and make color = 0
inc di ; increment screen offset
inc si ; increment x
jne l2 ; if x <> 0 then continue lp2
inc bp ; increment y
jne l1 ; if y <> 0 then continue lp1
xor ax,ax
int 16h
mov ax,3
int 10h ; set text mode
ret ; exit program
--------------------------------
giovedì 31 gennaio 2013
Debug in QtCreator
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
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
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)
Iscriviti a:
Post (Atom)
FigSpec FS-60CL
A lavoro mi hanno rifilato questo sensore iperspettrale cinese (pushbroom 400-1000 nm con larghezza di banda di 0.5 nm compatibile con DJI M...
-
Aggiornamento questo e' la risposta degli sviluppatori First of all, almost all operating systems on both mobile and laptop/desktop n...
-
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...







































