Michela Vittoria Brambilla è un ministro competente

12 Maggio 2009

L’Italia ospita il 70% circa dei beni culturali del mondo, e fino al 2005 l’8.5% circa del Prodotto Interno Lordo Italiano era legato alle attività turistiche.
Per dimostrare l’alto rispetto che il nostro premier Silvio Berlusconi dimostra negli interessi economici della nazione, arriva da pochi giorni la nomina di Vittoria Brambilla come ministro del Turismo.

Penso sia buona cosa che gli italiani abbiano ben noto il background culturale e le competenze tecniche di cui tale soggetto si avvale per amministrare la nostra cosa pubblica.

Questo video ne è un esempio.


Ordeal’s Movie Manager RCP(Part3)

10 Novembre 2008

Come promesso vediamo il metodo FilmListView.printResult

	@SuppressWarnings("deprecation")
	public static void printResult(ResultSet r, Display display)
	{
		table.removeAll();
		if(secThread!=null)
			secThread.stop();
		 secThread=new PrintResult(r,display,table,nextItem);
		 secThread.start();

	     titoloCol.pack();
	     annoCol.pack();
	      numdvdCol.pack();
	      divxCol.pack();
	      vistoCol.pack();
	      registaCol.pack();
	      movieidCol.pack();
	}

In realtà il metodo in se serve solo ad avviare un thread della classe PrintResult, con due particolari accorgimenti:

  1. resettare il contenuto precedentemente visualizzato nella table con
    table.removeAll(); 
  2. stoppare un thread avviato precedentemente se è ancora in runtime, cioè se sta ancora stampando sulla table, con
    secThread.stop();

Esaminiamo dunque il codice del thread di stampa.

class PrintResult extends Thread {
	  private Display display;
	  private ResultSet r;
	  private Table table;
	  private TableItem nextItem;

	  String text="";

	  public PrintResult(ResultSet rs,Display d,Table t,TableItem ni)
	  {
		  display=d;
		  nextItem=ni;
		  r=rs;
		  table=t;
	  }

	  public void run()
	  {  

				try {
					while(r.next())
					{

							display.syncExec(new Runnable() {
								public void run() {
									try
									{
									nextItem = new TableItem(table, SWT.WRAP);
									nextItem.setText(0,r.getString("titolo"));
								     nextItem.setText(1,r.getString("anno"));
								     nextItem.setText(2,r.getString("numdvd"));
								     nextItem.setText(3,r.getString("divx"));
								     nextItem.setText(4,r.getString("giavisto"));
								     nextItem.setText(5,r.getString("regista"));
								     nextItem.setText(6,r.getString("movie_id"));
									}
									 catch (SQLException e) {
											// TODO Auto-generated catch block
											e.printStackTrace();
										}

								}//inner run

						} //runnable

					  );//
					}
					r.getStatement().getConnection().close();

				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}//while

	  }//run
}//thread

Il meccanismo usato nel ciclo while, è lo stesso di cui parlavo qui
Il metodo run() dell’interfaccia Runnable() che stiamo implementando è invocato direttamente dal thread grafico, e poichè scomodiamo quest’ultimo con la chiamata

display.syncExec(Runnable)

il thread secondario verrà sospeso fin quando il thread grafico non completerà la stampa di una riga.

Il membro “r” della classe, di tipo ResultSet, come dice il nome stesso contiene una struttura che alloca in qualche modo le stringhe di risultato della query al server.
Il ciclo ha la sua condizione d’arresto quando r.next() è falso, cioè quando sono terminate le righe estratte una per una dal ResultSet.

Per darvi un’idea del contenuto grafico del Tab “Search by Title”, eccovi una screenshot:

—-
Link ai binari/sorgenti
Win32 e per GNU/Linux@x86.

Vi ricordo che i sorgenti si trovano sotto la directory plugins,all’interno del MyMovieManager_1.0.0.jar, dentro la directory src.


Britney Spears

25 Ottobre 2008

Non so chi ha realizzato questa cosa, ma lo ringrazio di vero cuore.


Ordeal’s Movie Manager RCP(Part2)

9 Ottobre 2008

Vediamo come affrontare il problema delle “Viste”.
Secondo l’articolo di Eclipse Corner
In the Eclipse Platform a view is typically used to navigate a hierarchy of information, open an editor, or display properties for the active editor”.
Nel nostro caso ci serve per implementare una struttura a tab, un tab folder, che ci offrirà un tab per la ricerca dei titoli, un altro tab per il loro inserimento e cancellazione.
Per creare la vista dobbiamo usare il file plugin.xml, andare su extensions ed aggiungere un’estensione all’RCP, ovvero un set di plug-ins che estendono la funzionalità dell’applicativo, nel nostro caso org.eclipse.ui.views.
Aggiungete una vista, datele un nome, un id,nel caso mio myMovieManager.view1, e opzionalmente un’icona, cosa importante, ricordatevi di associargli la classe da generare attraverso il form *class, che conterrà tutte le componenti grafiche in essa contenute.
Una volta fatto ciò dovete mettere mano alla classe Perspective.

	layout.setEditorAreaVisible(false);
		layout.addStandaloneView(FilmListView.ID,false, IPageLayout.TOP, 0.90f, layout.getEditorArea());
		layout.addShowViewShortcut(FilmListView.ID);
		IViewLayout filmlist_layout = layout.getViewLayout(FilmListView.ID);
		filmlist_layout.setCloseable(false);
		filmlist_layout.setMoveable(false);

il metodo per aggiungere la vista è addStandaloneView, gli altri servono solo per sistemare il layout e le proprietà della vista.
La nostra vista servirà per contenere un oggetto di tipo Tab folder.

	@Override
	public void createPartControl(Composite parentWindow) {

		tabFolder = new TabFolder(parentWindow, SWT.BORDER);
		TabItem sbttabItem = new TabItem(tabFolder, SWT.NONE);
	      sbttabItem.setText("Search By Title ");
	      sbttabItem.setImage(new Image(parentWindow.getDisplay(), this.getClass().getResourceAsStream("/icons/search_16x16.png")));
	    sbttabItem.setControl(searchByTitleContent(tabFolder));

			      TabItem inmtabItem = new TabItem(tabFolder, SWT.NULL);
			      inmtabItem.setText("Insert/Delete Movie ");
			      inmtabItem.setControl(insertDeleteMovie(tabFolder));
			      inmtabItem.setImage(new Image(parentWindow.getDisplay(), this.getClass().getResourceAsStream("/icons/insert_16x16.gif")));

	}

Il codice in questione è appartenente al metodo createPartControl della vista contenuta nel sorgente FilmListView.java, appartenente al package dell’RCP.
Potete usare tale metodo in ogni vista per “piazzare” i widgets SWT che intendete disporre nella vista.
Nel nostro caso un TabFolder, e due TabItem comprensivi di immagine in esso contenuti.
Il mio consiglio è quello di usare questo sito assiduamente come un vero e proprio catalogo delle componenti grafiche SWT, da poter piazzare come e dove vi pare.
le due chiamate

sbttabItem.setControl(searchByTitleContent(tabFolder));

e

inmtabItem.setControl(insertDeleteMovie(tabFolder));

permettono di creare con le funzioni searchByTitleContent(tabFolder) e insertDeleteMovie(tabFolder) , tutto il contenuto di un TabItem, in modo custom.

All’interno di tali funzioni il procedimento è questo:

public Control searchByTitleContent(TabFolder tabFolder)
	{
	    Composite composite = new Composite(tabFolder, SWT.NONE);
	    composite.setLayout(new GridLayout(6,true));
	    // Create the TableTree and set some attributes on the underlying table
	    table = new Table(composite, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL );
                 ...
                 return composite;

In pratica instanziamo un oggetto Composite,lo aggreghiamo con componenti grafiche di ciascun tipo (nell’esempio table), e alla fine lo ritorniamo alla funzione chiamante.

Oltre all’ogetto table, con tutte le colonne che nel package allegato potete vedere come sono implementate, il tabItem contenuto nella nostra vista, contiene anche un semplice InputDialog

// Create a label to display what the user typed in
			    final Label label = new Label(composite, SWT.NONE);
			    label.setLayoutData(data=new GridData(GridData.FILL_HORIZONTAL));
			    data.horizontalSpan=6;
			    Button show = new Button(composite, SWT.PUSH);
			    final Label dialog_content=new Label(composite,SWT.NONE);
			    dialog_content.setVisible(false);

			    label.setText("Nessun titolo ancora cercato");
			    dialog_content.setText("Inserisci il titolo da cercare");

			    show.setText("Enter Title");
			    show.addSelectionListener(new SelectionAdapter() {
			      public void widgetSelected(SelectionEvent event) {
			        InputDialog dlg = new InputDialog(Display.getCurrent().getActiveShell(),
			            "", "Inserire il titolo o una parola in esso contenuta", dialog_content.getText(), new LengthValidator());
			        if (dlg.open() == Window.OK) {
			          // User clicked OK; update the label with the input
			          label.setText("Risultati per : " + dlg.getValue());
			          label.pack();
			          dialog_content.setText(dlg.getValue());

			        try {
						result=Connector.giveResponse(fix(dlg.getValue()));
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
			          if(result!= null)
			          {
			        	FilmListView.printResult(result, Display.getCurrent());
			          }

			        }
			      }
			    });

Il dialog è dlg, avviato quando viene premuto il pulsante show, attraverso il metodo addSelectionListener.
Quando tale dialog raccoglie il testo, tale testo viene passato al metodo statico

result=Connector.giveResponse(fix(dlg.getValue()));

che esamineremo prossimamente, il metodo fix invece, sostituisce l’apice ‘ con ` (apice inverso), per evitare di passare una variabile dati con un apice ad una query sql,sappiamo che l’apice infatti chiude la query.

Prossimamente vedremo il metodo
FilmListView.printResult(result, Display.getCurrent()); utilizzato da un thread secondario per la stampa asincrona dei risultati sulla tabella.

—-
Link ai binari/sorgenti
Win32 e per GNU/Linux@x86.

Vi ricordo che i sorgenti si trovano sotto la directory plugins,all’interno del MyMovieManager_1.0.0.jar, dentro la directory src.


Ordeal’s Movie Manager RCP(Part1)

7 Ottobre 2008

Per farmi perdonare la lunga assenza da questo blog, ho deciso di implementare e commentare qui un esempio di RCP, ovvero  una Rich Client Platform, un tipo di applicativo sviluppato in Java che fa uso di un set minimale di plug-ins Eclipse.

Innanzitutto dovete avere installato l’IDE Eclipse, che trovate qui.
Una volta installato l’IDE, procedete alla creazione del progetto da File->New->Project->Plug-in Project, cliccando su “Yes” alla domanda “Would you like to create a rich client application ?”.
A questo punto dovete selezionare un template, possibilmente minimale, da cui partire, come Hello RCP.
Quello che a questo punto vi si presenta tra i sorgenti è:

  • La classe Activator, che controlla il ciclo di vita del plug-in (in particolare date un’occhiata ai metodi start() e stop()
  • La classe Application, che sostanzialmente ha due metodi start() e stop(), che riguardano l’istanziazione dell’oggetto Display (un’interfaccia al dispositivo vero e proprio) , e del Workbench, ovvero di quel set di plug-ins che l’applicazione si “porta dietro”, che sono in buona parte un sottoinsieme dei plug-ins che troviamo anche nell’IDE Eclipse.
  • Le classi ApplicationActionBarAdvisor, ApplicationWorkbenchAdvisor, ApplicationWorkbenchWindowAdvisor, necessarie alla creazione della finestra principale, della Prospettiva su cui le nostre Viste andranno situate, delle barre, e all’esecuzione precedente alla creazione della finestra di metodi che devono essere eseguiti allo start-up dell’applicazione.
  • La classe Perspective, in cui viene deciso il layout delle cosidette “Viste” che stiamo per creare.

Adesso parliamo del target dell’applicazione.
L’idea nasce dalla necessità di creare un’interfaccia semplice e custom ad una relazione di un Database, utilizzata per catalogare dei titoli di films.
I campi di questa tabella sono:


create table omm_movies (
  Titolo character(100) not null default 'Titolo',
  Anno numeric(4) not null default '2007',
  NumDVD numeric(4) ,
  DivX boolean,
  GiaVisto boolean,
  Regista char(150) default null,
  MOVIE_ID numeric ,
  primary key(MOVIE_ID)
);

In particolare il campo NumDVD specifica in quale DVD del vostro scaffale/cassetto è collocato il film, il campo MOVIE_ID invece è un ID incrementale associato ad una sequenza che vedremo creata nel codice stesso.
Le funzionalità da implementare sono: ricerca per titolo, inserimento del titolo e cancellazione.
Vedremo nella prossima puntata come implementare la pagina relativa alla ricerca per titolo.

Intanto vi linko da subito eseguibili e sorgenti per Win32 e per GNU/Linux@x86.


MD5 Double Hash crack

19 Giugno 2008

Recentemente mi sono accorto che alcuni servizi di hosting conservano nel database le passwords degli accounts in doppia hash md5.
Per doppia hash intendo

MD5(MD5(password)).

Un tentativo di forzare una password in questo stato facendo uso dei servizi online come Md5Crack o come Gdata,sarebbe totalmente inutile.
Il sistema che ho implementato è banale,prevede la ricerca della password a partire da una hash doppia,facendo uso di un dizionario: di ogni voce del dizionario viene calcolata la hash doppia e viene confrontata con l’input,se vi è un match il programma si arresta e fornisce la voce ottenuta.
Sicuramente una ricerca lineare non è il massimo,l’ideale è implementare un database distribuito come il celebre rainbow tables,ma per le hashes doppie attualmente non sembra esserci altro.
Facendo uso di un buon dizionario di passwords,come questo,il programmino impiega un tempo nell’ordine di 30 secondi per scorrere un tale dizionario,e parliamo di circa 40MB.
Nel codice faccio uso di una funzione molto importante per la gestione dei files da applicativi in C :
la funzione mmap,tale funzione consente di mappare un file sullo spazio di indirizzamento virtuale del processo,in pratica vi muoverete sul file come su un vettore void* ,fate il cast a char*e avrete una vera e propria stringa:potete dimenticarvi quindi delle odiose fseek,fwrite etc…
La funzione MD5,presa dalla libreria libssl, con header in

openssl/md5.h

ha 3 argomenti:stringa da criptare,dimensione in bytes della stringa da criptare,stringa su cui riporre l’hash.
Leggi il seguito di questo post »


Canto Notturno di pastore errante dell’Asia

18 Giugno 2008

Da tempo volevo condividere i pensieri e le emozioni che questa lirica di Leopardi mi ha dato con chiunque passasse da questo blog.
E’ una delle mie preferite in assoluto,concentra nei suoi versi la forza e la disperazione dell’uomo,che nel suo breve viaggio trova il coraggio di porsi La Domanda Essenziale:il significato della sua esistenza.
L’uomo è eroico,perchè continua a vivere nel tedio,pur sapendo che non troverà mai risposta alle sue domande,continua a camminare e non si arrende,come il pastore dell’Asia che per una vita intera sopporta le asperità del terreno che calpesta,fin quando non giunge alla fine dei suoi giorni.


Che fai tu, luna, in ciel? dimmi, che fai,
silenziosa luna?
Sorgi la sera, e vai,
contemplando i deserti; indi ti posi.
Ancor non sei tu paga
di riandare i sempiterni calli?
Ancor non prendi a schivo, ancor sei vaga
di mirar queste valli?
Somiglia alla tua vita
la vita del pastore.
Leggi il seguito di questo post »