venerdì 1 febbraio 2013

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



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

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

; 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

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

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






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

Aggiornamento algoritmi di spectral unmxing

Durante il dottorato avevo provato a fare unmixing di suoli naturali Una discreta serie di campioni di suolo naturale era stato raccolto in ...