Con l'arrivo di Ubuntu 12.04 sono comparsi problemi nell'installazione della stessa come macchine virtuale in VirtualBox
Tentando il boot dalla Iso questo si interrompe subito con il seguente messaggio
Il kernel e' stato compilato con il supporto obbligatorio a PAE (un sistema per i processori a 32 bit di indirizzare quantita' di memoria superiori ai 2 Gb)
Per risolvere il problema si deve andare nella scheda di configurazione del processore virtuale e spuntare la flag Abilita PAE
PS: mi sono accorto che anche Debian Testing propone di default con kernel con compilato PAE
martedì 11 settembre 2012
lunedì 10 settembre 2012
Esempio GUI con QTCreator (2)
sabato 8 settembre 2012
Download Debian con Jigdo e Wget
In alcuni casi (vedi per esempio alcune versione testing con processori differenti da i386) e' difficile trovare un numero sufficiente di seeders per scaricare in tempi ragionevoli una ISO via Torrent
Per questo motivo puo' essere utile utilizzare il protocollo Http in modo intelligente ovvero senza sovraccaricare i server che mettono a disposizione le immagini
Wget
con questo comando e' sufficiente conoscere l'indirizzo dell'immagine iso
wget -c URL
con lo switch -c e' possibile interrompere il download e riprenderlo in un secondo momento
Jigdo invece di scarica una ISO preleva i singoli file DEB e poi li ricompone in una immagine
Per fare eseguire il programma si deve scaricare il file .jigdo della distribuzione di interesse e poi digitate
jigdo-lite file.jigdo
in automatico il programma prima scarica un file .template. Nel caso in cui non venga scaricato in automatico (puo' succedere con le testing) si devono scaricare nello stesso momento il file .jigo e .template (sono associati l'uno all'altro e vengono generati nuovi ogni settimana)
Per questo motivo puo' essere utile utilizzare il protocollo Http in modo intelligente ovvero senza sovraccaricare i server che mettono a disposizione le immagini
Wget
con questo comando e' sufficiente conoscere l'indirizzo dell'immagine iso
wget -c URL
con lo switch -c e' possibile interrompere il download e riprenderlo in un secondo momento
Jigdo invece di scarica una ISO preleva i singoli file DEB e poi li ricompone in una immagine
Per fare eseguire il programma si deve scaricare il file .jigdo della distribuzione di interesse e poi digitate
jigdo-lite file.jigdo
in automatico il programma prima scarica un file .template. Nel caso in cui non venga scaricato in automatico (puo' succedere con le testing) si devono scaricare nello stesso momento il file .jigo e .template (sono associati l'uno all'altro e vengono generati nuovi ogni settimana)
Esempio GUI con Gtk/Glade(GtkBuilder) in C
Un ennesimo esempio con l'impiego delle GTK associate al Gui Designer denominato Glade
Glade permette la generazione di due formati file (che di fatto sono entrambi xml) ovvero LibGlade e LibGtkBuilder, nell'esempio di seguito e' stato usato il secondo sistema che di fatto e' quello piu' supportato da GTK2
main.c
---------------------------------------------------------
#include <gtk/gtk.h>
GtkBuilder *gtkBuilder;
GtkWidget *mainwin;
GtkProgressBar *progress;
GtkLabel *label;
GtkHScale *scala;
void on_window1_delete_event()
{
gtk_main_quit();
}
void on_hscale1_value_changed(GtkWidget* widget,gpointer user_data) {
gdouble current_value = gtk_range_get_value(GTK_RANGE(scala));
char buffer [14] = { '\0' };
sprintf ( buffer, "%.0f", current_value);
gtk_label_set_text(label,buffer);
gtk_progress_bar_set_fraction(progress,current_value/100);
}
int main (int argc, char **argv) {
gtk_set_locale();
/* Initialize the widget set */
gtk_init (&argc, &argv);
/* Create the main window */
gtkBuilder= gtk_builder_new();
gtk_builder_add_from_file(gtkBuilder,"progressbar.xml",NULL);
gtk_builder_connect_signals ( gtkBuilder, NULL );
mainwin= GTK_WIDGET(gtk_builder_get_object(gtkBuilder,"window1"));
label= GTK_WIDGET(gtk_builder_get_object(gtkBuilder,"label1"));
progress= GTK_WIDGET(gtk_builder_get_object(gtkBuilder,"progressbar1"));
scala= GTK_WIDGET(gtk_builder_get_object(gtkBuilder,"hscale1"));
g_signal_connect (mainwin, "delete-event", G_CALLBACK (gtk_widget_hide_on_delete), NULL);
g_object_unref ( G_OBJECT(gtkBuilder) );
/* Show the application window */
gtk_widget_show_all ( mainwin );
/* Enter the main event loop, and wait for user interaction */
gtk_main ();
/* The user lost interest */
return 0;
}
---------------------------------------------------------
progressbar.xml
---------------------------------------------------------
<?xml version="1.0"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="window1">
<property name="title" translatable="yes">Progress Bar</property>
<property name="default_width">200</property>
<property name="default_height">90</property>
<signal name="delete_event" handler="on_window1_delete_event"/>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkHScale" id="hscale1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="adjustment">adjustment1</property>
<property name="lower_stepper_sensitivity">off</property>
<property name="upper_stepper_sensitivity">off</property>
<property name="digits">0</property>
<property name="draw_value">False</property>
<property name="value_pos">left</property>
<signal name="value_changed" handler="on_hscale1_value_changed"/>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="label" translatable="yes">0
</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkProgressBar" id="progressbar1">
<property name="visible">True</property>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkAdjustment" id="adjustment1">
<property name="upper">110</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
<property name="page_size">10</property>
</object>
</interface>
---------------------------------------------------------
Makefile
--------------------------------------------------------
LIBS=$(shell pkg-config --cflags --libs gtk+-2.0)
CFLAGS=-Wall -g -export-dynamic
hello: main.c
gcc -o progress_bar main.c $(LIBS) $(CFLAGS)
--------------------------------------------------------
A questo link i file di esempio
La caratteristica differente rispetto alle altre librerie viste finora e' la gestione in GTK delle proprieta' dello slider. Per inserire valore massimo, valore minimo e passo dello slider si deve associare un Adjustement,
Si deve quindi cliccare sulla proprieta' del wigdet e creare un nuovo adjustement, a questo punto scorrendo l'albero dei widget compare negli Oggetti un nuovo ramo; cliccando su questo e' possibile modificare le proprieta' dello slider
Schermata di Glade |
Schermata di Glade . Gestione degli Adjustement |
main.c
---------------------------------------------------------
#include <gtk/gtk.h>
GtkBuilder *gtkBuilder;
GtkWidget *mainwin;
GtkProgressBar *progress;
GtkLabel *label;
GtkHScale *scala;
void on_window1_delete_event()
{
gtk_main_quit();
}
void on_hscale1_value_changed(GtkWidget* widget,gpointer user_data) {
gdouble current_value = gtk_range_get_value(GTK_RANGE(scala));
char buffer [14] = { '\0' };
sprintf ( buffer, "%.0f", current_value);
gtk_label_set_text(label,buffer);
gtk_progress_bar_set_fraction(progress,current_value/100);
}
int main (int argc, char **argv) {
gtk_set_locale();
/* Initialize the widget set */
gtk_init (&argc, &argv);
/* Create the main window */
gtkBuilder= gtk_builder_new();
gtk_builder_add_from_file(gtkBuilder,"progressbar.xml",NULL);
gtk_builder_connect_signals ( gtkBuilder, NULL );
mainwin= GTK_WIDGET(gtk_builder_get_object(gtkBuilder,"window1"));
label= GTK_WIDGET(gtk_builder_get_object(gtkBuilder,"label1"));
progress= GTK_WIDGET(gtk_builder_get_object(gtkBuilder,"progressbar1"));
scala= GTK_WIDGET(gtk_builder_get_object(gtkBuilder,"hscale1"));
g_signal_connect (mainwin, "delete-event", G_CALLBACK (gtk_widget_hide_on_delete), NULL);
g_object_unref ( G_OBJECT(gtkBuilder) );
/* Show the application window */
gtk_widget_show_all ( mainwin );
/* Enter the main event loop, and wait for user interaction */
gtk_main ();
/* The user lost interest */
return 0;
}
---------------------------------------------------------
progressbar.xml
---------------------------------------------------------
<?xml version="1.0"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="window1">
<property name="title" translatable="yes">Progress Bar</property>
<property name="default_width">200</property>
<property name="default_height">90</property>
<signal name="delete_event" handler="on_window1_delete_event"/>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkHScale" id="hscale1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="adjustment">adjustment1</property>
<property name="lower_stepper_sensitivity">off</property>
<property name="upper_stepper_sensitivity">off</property>
<property name="digits">0</property>
<property name="draw_value">False</property>
<property name="value_pos">left</property>
<signal name="value_changed" handler="on_hscale1_value_changed"/>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="label" translatable="yes">0
</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkProgressBar" id="progressbar1">
<property name="visible">True</property>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkAdjustment" id="adjustment1">
<property name="upper">110</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
<property name="page_size">10</property>
</object>
</interface>
---------------------------------------------------------
Makefile
--------------------------------------------------------
LIBS=$(shell pkg-config --cflags --libs gtk+-2.0)
CFLAGS=-Wall -g -export-dynamic
hello: main.c
gcc -o progress_bar main.c $(LIBS) $(CFLAGS)
--------------------------------------------------------
A questo link i file di esempio
Esempio GUI con Gtk/Anjuta in C
Per la generazione di questo esempio e' stato impiegato Anjuta, una Ide che integra al suo interno Glade per la generazione dell'interfaccia.
Nella creazione di un progetto GTK vengono gia' creati i file necessari compreso un file.ui per il codice xml dell'interfaccia grafica ed i file main e callbacks per il codice da eseguite
Nota bene: la versione di Glade inserita in Anjuta ha un errore nella gestione dei segnali (almeno nella versione pacchettizzata in Debian stable 6). In pratica il menu a tendina associato ai widget non mostra gli eventi associati ma una lista di valori bianchi (la versione di Glade che si scarica in modo separato invece funziona in modo corretto)..si deve conoscere ed inserire a mano il nome dell'evento da gestire
Al link seguente il progetto completo per la generazione dell'esempio link
Altrimenti il codice puo' essere riscritto separando la parte della gestione degli eventi (callbacks.c) cosi' come Anjuta suggerisce implicitamente
main.c
----------------------------------------------------------------
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
/*
* main.c
* Copyright (C) Luca Innocenti 2012 <lucainnoc@gmail.com>
*
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <config.h>
#include <gtk/gtk.h>
#include "callbacks.h"
#define UI_FILE "src/gtkglade.ui"
GtkWidget* create_window (void)
{
GtkBuilder *builder;
GError* error = NULL;
builder = gtk_builder_new ();
if (!gtk_builder_add_from_file (builder, UI_FILE, &error))
{
g_warning ("Couldn't load builder file: %s", error->message);
g_error_free (error);
}
gtk_builder_connect_signals (builder, NULL);
window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
progress = GTK_WIDGET (gtk_builder_get_object (builder, "progressbar1"));
label = GTK_WIDGET (gtk_builder_get_object (builder, "label1"));
scala = GTK_WIDGET (gtk_builder_get_object (builder, "hscale1"));
g_object_unref (builder);
return window;
}
int main (int argc, char *argv[])
{
GtkWidget *window;
gtk_set_locale ();
gtk_init (&argc, &argv);
window = create_window ();
gtk_widget_show (window);
gtk_main ();
return 0;
}
----------------------------------------------------------------
callbacks.c
----------------------------------------------------------------
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
/*
* callbacks.c
* Copyright (C) Luca Innocenti 2012 <lucainnoc@gmail.com>
*/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include "callbacks.h"
void on_hscale1_value_changed(GtkWidget* widget,gpointer user_data) {
gdouble current_value = gtk_range_get_value(GTK_RANGE(scala));
char buffer [14] = { '\0' };
sprintf ( buffer, "%.0f", current_value);
gtk_label_set_text(label,buffer);
gtk_progress_bar_set_fraction(progress,current_value/100);
}
void
destroy (GtkWidget *widget, gpointer data)
{
gtk_main_quit ();
}
callbacks.h
----------------------------------------------------------------
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
/*
* callbacks.h
* Copyright (C) Luca Innocenti 2012 <lucainnoc@gmail.com>
*/
#include <gtk/gtk.h>
GtkWidget *window;
GtkProgressBar *progress;
GtkLabel *label;
GtkHScale *scala;
void destroy (GtkWidget *widget, gpointer data);
void on_hscale1_value_changed(GtkWidget* widget,gpointer user_data);
----------------------------------------------------------------
Nella creazione di un progetto GTK vengono gia' creati i file necessari compreso un file.ui per il codice xml dell'interfaccia grafica ed i file main e callbacks per il codice da eseguite
Glade all'interno di Anjuta |
Al link seguente il progetto completo per la generazione dell'esempio link
Altrimenti il codice puo' essere riscritto separando la parte della gestione degli eventi (callbacks.c) cosi' come Anjuta suggerisce implicitamente
main.c
----------------------------------------------------------------
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
/*
* main.c
* Copyright (C) Luca Innocenti 2012 <lucainnoc@gmail.com>
*
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <config.h>
#include <gtk/gtk.h>
#include "callbacks.h"
#define UI_FILE "src/gtkglade.ui"
GtkWidget* create_window (void)
{
GtkBuilder *builder;
GError* error = NULL;
builder = gtk_builder_new ();
if (!gtk_builder_add_from_file (builder, UI_FILE, &error))
{
g_warning ("Couldn't load builder file: %s", error->message);
g_error_free (error);
}
gtk_builder_connect_signals (builder, NULL);
window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
progress = GTK_WIDGET (gtk_builder_get_object (builder, "progressbar1"));
label = GTK_WIDGET (gtk_builder_get_object (builder, "label1"));
scala = GTK_WIDGET (gtk_builder_get_object (builder, "hscale1"));
g_object_unref (builder);
return window;
}
int main (int argc, char *argv[])
{
GtkWidget *window;
gtk_set_locale ();
gtk_init (&argc, &argv);
window = create_window ();
gtk_widget_show (window);
gtk_main ();
return 0;
}
----------------------------------------------------------------
callbacks.c
----------------------------------------------------------------
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
/*
* callbacks.c
* Copyright (C) Luca Innocenti 2012 <lucainnoc@gmail.com>
*/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include "callbacks.h"
void on_hscale1_value_changed(GtkWidget* widget,gpointer user_data) {
gdouble current_value = gtk_range_get_value(GTK_RANGE(scala));
char buffer [14] = { '\0' };
sprintf ( buffer, "%.0f", current_value);
gtk_label_set_text(label,buffer);
gtk_progress_bar_set_fraction(progress,current_value/100);
}
void
destroy (GtkWidget *widget, gpointer data)
{
gtk_main_quit ();
}
----------------------------------------------------------------
callbacks.h
----------------------------------------------------------------
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
/*
* callbacks.h
* Copyright (C) Luca Innocenti 2012 <lucainnoc@gmail.com>
*/
#include <gtk/gtk.h>
GtkWidget *window;
GtkProgressBar *progress;
GtkLabel *label;
GtkHScale *scala;
void destroy (GtkWidget *widget, gpointer data);
void on_hscale1_value_changed(GtkWidget* widget,gpointer user_data);
Al link seguente il codice completo del progetto link
giovedì 6 settembre 2012
Esempio GUI con Fltk in C++
La Gui di esempio scritta in Fltk/C++
La compilazione e' estremamente semplice perche' nel pacchetto della libreria e' inserito uno script apposito e la compilazione avviene mediante il comando
fltk-config --compile main.cpp
La compilazione e' estremamente semplice perche' nel pacchetto della libreria e' inserito uno script apposito e la compilazione avviene mediante il comando
fltk-config --compile main.cpp
Da notare che Debian 6 Stable include una versione piuttosto vecchia di Fltk (la 1.1)
--------------------------------------------------
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Slider.H>
#include <FL/Fl_Progress.H>
#include <FL/Fl_Text_Display.H>
#include <FL/Fl_Hor_Nice_Slider.H>
#include <iostream>
#include <stdio.h>
//fltk-config --compile main.cpp
using namespace std;
Fl_Text_Display *disp;
Fl_Text_Buffer *tbuff;
Fl_Progress *prog;
void slider_cb( Fl_Widget* o, void* ) {
char buffer [5];
Fl_Hor_Nice_Slider* b=(Fl_Hor_Nice_Slider*)o;
int valore = b->value();
prog->value(valore);
sprintf(buffer,"%d",valore);
tbuff->text(buffer);
}
int main() {
Fl_Window win(100,100,200,120,"Progress Bar" );
win.begin();
disp = new Fl_Text_Display(80, 40, 40, 21);
tbuff = new Fl_Text_Buffer(); // text buffer
disp->buffer(tbuff);
tbuff->text("0");
prog = new Fl_Progress( 10, 80, 180, 20,"");
prog->value(0);
Fl_Hor_Nice_Slider *slider = new Fl_Hor_Nice_Slider( 10, 10, 180, 20,"");
slider->minimum(0);
slider->maximum(100);
slider->step(1);
slider->callback(slider_cb);
win.end();
win.show();
return Fl::run();
}
--------------------------------------------------
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Slider.H>
#include <FL/Fl_Progress.H>
#include <FL/Fl_Text_Display.H>
#include <FL/Fl_Hor_Nice_Slider.H>
#include <iostream>
#include <stdio.h>
//fltk-config --compile main.cpp
using namespace std;
Fl_Text_Display *disp;
Fl_Text_Buffer *tbuff;
Fl_Progress *prog;
void slider_cb( Fl_Widget* o, void* ) {
char buffer [5];
Fl_Hor_Nice_Slider* b=(Fl_Hor_Nice_Slider*)o;
int valore = b->value();
prog->value(valore);
sprintf(buffer,"%d",valore);
tbuff->text(buffer);
}
int main() {
Fl_Window win(100,100,200,120,"Progress Bar" );
win.begin();
disp = new Fl_Text_Display(80, 40, 40, 21);
tbuff = new Fl_Text_Buffer(); // text buffer
disp->buffer(tbuff);
tbuff->text("0");
prog = new Fl_Progress( 10, 80, 180, 20,"");
prog->value(0);
Fl_Hor_Nice_Slider *slider = new Fl_Hor_Nice_Slider( 10, 10, 180, 20,"");
slider->minimum(0);
slider->maximum(100);
slider->step(1);
slider->callback(slider_cb);
win.end();
win.show();
return Fl::run();
}
Esempio GUI in PyFltk
La libreria Fltk e' conosciuta per la leggerezza e la velocita' (tanto da essere compilata anche staticamente nei programmi)
Il problema e' che non si hanno tutti i widgets di cui sono composte le altre librerie (per esempio non esiste la Label per cui bisogna usare una casella di testo) e non ci sono tutte le proprieta' (per esempio nella casella di testo non esiste un ALIGN_CENTER)
Dall'altra parte la gestione dei widget e' piuttosto strana: per esempio per mettere del testo in una casella di testo bisogna creare un Text Buffer
Per terminare gli eventi sono generici come nel caso dello slider che ha solo un evento associato
Nonostante tutto pero' la cosa funziona bene...
------------------------------------------------
from fltk import *
import sys
def slider_cb(widget):
progress.value(widget.value())
textbuffer.text(str(int(widget.value())))
window = Fl_Window(100,100,200,120)
window.label("Progress Bar")
slider = Fl_Hor_Nice_Slider( 10, 10, 180, 20,"")
slider.minimum(0)
slider.maximum(100)
slider.step(1)
slider.callback(slider_cb)
textbuffer = Fl_Text_Buffer()
textbuffer.text("0")
textdisplay = Fl_Text_Display(80, 40, 40, 21)
textdisplay.buffer(textbuffer)
progress = Fl_Progress( 10, 80, 180, 20,"")
progress.value(0)
progress.label("%")
window.end()
window.show(len(sys.argv), sys.argv)
Fl.run()
Il problema e' che non si hanno tutti i widgets di cui sono composte le altre librerie (per esempio non esiste la Label per cui bisogna usare una casella di testo) e non ci sono tutte le proprieta' (per esempio nella casella di testo non esiste un ALIGN_CENTER)
Dall'altra parte la gestione dei widget e' piuttosto strana: per esempio per mettere del testo in una casella di testo bisogna creare un Text Buffer
Per terminare gli eventi sono generici come nel caso dello slider che ha solo un evento associato
Nonostante tutto pero' la cosa funziona bene...
------------------------------------------------
from fltk import *
import sys
def slider_cb(widget):
progress.value(widget.value())
textbuffer.text(str(int(widget.value())))
window = Fl_Window(100,100,200,120)
window.label("Progress Bar")
slider = Fl_Hor_Nice_Slider( 10, 10, 180, 20,"")
slider.minimum(0)
slider.maximum(100)
slider.step(1)
slider.callback(slider_cb)
textbuffer = Fl_Text_Buffer()
textbuffer.text("0")
textdisplay = Fl_Text_Display(80, 40, 40, 21)
textdisplay.buffer(textbuffer)
progress = Fl_Progress( 10, 80, 180, 20,"")
progress.value(0)
progress.label("%")
window.end()
window.show(len(sys.argv), sys.argv)
Fl.run()
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...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...
-
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...