import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class PopupMenuExamle {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
frame.setSize(100, 100);
final JPopupMenu popup = new JPopupMenu() {{
add(new JMenuItem("aaa"));
add(new JMenuItem("bbb"));
add(new JMenuItem("ccc"));
}};
addPopupMenuTo(popup, frame);
}
private static void addPopupMenuTo(final JPopupMenu popup, Container dest) {
dest.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
maybeShowPopup(e);
}
@Override
public void mouseReleased(MouseEvent e) {
maybeShowPopup(e);
}
private void maybeShowPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
popup.show(e.getComponent(),
e.getX(), e.getY());
}
}
});
}
}
lunedì 12 ottobre 2009
Creare un menu popup
Oggi ho imparato a creare popup menu...
Creare una finestra trascinabile in Java
Oggi ho fatto un po' di esercizio con Swing di Java. Swing è uno dei GUI toolkit di Java ed è utile conoscerlo perché è compreso nella piattaforma Java. Swing non è l'unica scelta, ne esistono altre, sul web ci sono alcune risorse che vi possono aiutare nella scelta.
Pero' io ho provato con Swing. Volevo provare una draggable window, una finestra senza bordi che si può spostare trascinandola con il mouse. Ecco il risultato:
Pero' io ho provato con Swing. Volevo provare una draggable window, una finestra senza bordi che si può spostare trascinandola con il mouse. Ecco il risultato:
import java.awt.Container;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JWindow;
public class DraggableBorderlessWindow {
public static void main(String[] args) {
final JWindow win = new JWindow();
makeDraggable(win);
win.setSize(100, 100);
win.setVisible(true);
win.setLocation(100, 100);
}
private static void makeDraggable(final Container window) {
MouseAdapter dragger = new Dragger(window);
window.addMouseMotionListener(dragger);
window.addMouseListener(dragger);
}
private static class Dragger extends MouseAdapter {
private int offsetX;
private int offsetY;
private final Container window;
public Dragger(Container window) {
this.window = window;
}
@Override
public void mousePressed(MouseEvent e) {
offsetX = window.getX() - e.getXOnScreen();
offsetY = window.getY() - e.getYOnScreen();
}
@Override
public void mouseDragged(MouseEvent e) {
window.setLocation(e.getXOnScreen() + offsetX,
e.getYOnScreen() + offsetY);
}
}
}
martedì 6 ottobre 2009
Fuffa
Sapreste spiegare cosa fa il vostro prodotto in modo conciso e chiaro in modo da invogliare i potenziali clienti? Oppure vi vergognate tanto di dire cosa realmente fa il vostro prodotto da
sembrarvi riduttivo dirlo e ci girate intorno?
Facciamo un esempio preso dalla pagina ufficiale di un prodotto a caso.
Il target di questo prodotto sono sviluppatori Java. Il nome del prodotto è stato nascosto sotto delle anonime XXXXX. (Non voglio problemi e quindi cancellerò qualsiasi commento che dica il nome vero del prodotto)
Ecco l'esempio:
In tutto ci sono 296 caratteri, vediamo quanti di questi sono utili.
I primi sei caratteri (contando lo spazio) sono utili, dicono il nome del prodotto.
Analizziamo il resto.
"is an award-winning productivity tool " .
"for Java EE development. " .
"It enables your team to complete more features, fix more bugs, and release quality software on schedule and under budget " .
by eliminating time-wasting build and redeploy phases. "
"Your whole team can use the free 30-day evaluation. "
Tirando le somme abbiamo:
Caratteri utili: 86
Caratteri fuffa: 159
Percentuale fuffa: 86/159 = 54%
Facciamo una prova:
E' ancora oscuro ma è molto meno rumoroso. Possiamo fare di meglio. Studiamo cosa fa realmente e magari facciamoci aiutare da wikipedia.
Mettiamo tutto assieme:
Conteggio fuffa:
Caratteri utili: 118+56+45 = 219
Caratteri fuffa: 22+18 = 40
Percentuale fuffa: 40/219 = 18%
PS: Se pensate che ho sbagliato qualche conto probabilmente avete ragione
sembrarvi riduttivo dirlo e ci girate intorno?
Facciamo un esempio preso dalla pagina ufficiale di un prodotto a caso.
Il target di questo prodotto sono sviluppatori Java. Il nome del prodotto è stato nascosto sotto delle anonime XXXXX. (Non voglio problemi e quindi cancellerò qualsiasi commento che dica il nome vero del prodotto)
Ecco l'esempio:
XXXXX is an award-winning productivity tool for Java EE development. It enables your team to complete more features, fix more bugs, and release quality software on schedule and under budget by eliminating time-wasting build and redeploy phases. Your whole team can use the free 30-day evaluation.
In tutto ci sono 296 caratteri, vediamo quanti di questi sono utili.
I primi sei caratteri (contando lo spazio) sono utili, dicono il nome del prodotto.
Analizziamo il resto.
Bene. Si tratta un prodotto che ha vinto premi (tipo l'oscar immagino) ed un productivity tool. Probabilmente un tool che "aumenta la produttività" ... di solito i tool si comprano pensando che la produttività aumenti. Insomma 38 caratteri di fuffa.
Ahh sappiamo almeno il campo di applicazione! Caratteri utili: 25.
Totale parziale: 31 utili, 38 fuffa.
Wow! Ma che cosa è una nuova metodologia di sviluppo?
E' una sfera di cristallo che legge nella mente del committente?
E' una sorta di tempo liofilizzato da usare quando si arriva la scadenza?
O sono le solite balle, un po' come quando ci ha detto che è un tool che aumenta la produttività? Insomma: 121 caratteri sprecati.
Totale parziale: 31 utili, 159 fuffa.
Ahh, finalmente. Qualcosa si capisce. Ha a che fare con la fase di build e redeploy.
Non ho ancora capito a cosa serve ma un idea ce l'ho.
Caratteri utili: 55
Totale parziale: 86 utili, 159 fuffa.
Questa è un informazione sul periodo di prova, è utile ma non entra nel conteggio, ne in bene ne in male.
Tirando le somme abbiamo:
Caratteri utili: 86
Caratteri fuffa: 159
Percentuale fuffa: 86/159 = 54%
Adesso miglioriamolo
Le parti utili sono:- XXXXX is a tool
- for Java EE development
- eliminating time-wasting build and redeploy phases.
Facciamo una prova:
XXXXX is a tool that eliminates the build and redeploy phases in Java EE development.
E' ancora oscuro ma è molto meno rumoroso. Possiamo fare di meglio. Studiamo cosa fa realmente e magari facciamoci aiutare da wikipedia.
XXXXX is a plugin for the Java Virtual Machine that enables on-the-fly reloading of changes made to Java class files.
Mettiamo tutto assieme:
XXXXX is a plugin for the Java Virtual Machine that enables on-the-fly reloading of changes made to Java class files. This is great because you can actually change source code when debugging and, more importantly, works also with Java EE applications servers.
Conteggio fuffa:
- "XXXXX is a plugin for the Java Virtual Machine that enables on-the-fly reloading of changes made to Java class files. " -> 118 utili
- "This is great because " -> 22 fuffa
- "you can actually change source code when debugging and, " -> 56 utili
- "more importantly, " -> 18 fuffa
- "works also with Java EE applications servers." -gt; 45 utili
Caratteri utili: 118+56+45 = 219
Caratteri fuffa: 22+18 = 40
Percentuale fuffa: 40/219 = 18%
PS: Se pensate che ho sbagliato qualche conto probabilmente avete ragione
domenica 4 ottobre 2009
Utilities for managing svn:ignore properties
I've just created a few commands for simplifying the usage of svn:ignore property of Subversion from command line. You can download, and see the sources on the project page.
The usage is simple, typing:
The project was written in Bash with TDD.
The xUnit framework used is an modified version of shunit2 that I hacked sometime ago for the trash-cli project.
The usage is simple, typing:
svn-ignore-add path/to/file-to-ignorewill append to the current svn:ignore property of "path/to" the string "file-to-ignore".
The project was written in Bash with TDD.
The xUnit framework used is an modified version of shunit2 that I hacked sometime ago for the trash-cli project.
Etichette:
bash,
subversion,
tdd,
xunit
sabato 3 ottobre 2009
My Small Software Pomodoro Timer
I've just created my own home made software Pomodoro Timer.
Unlike other timers has a very simple interface.
Features/bugs:
- Left time always visible.
- You can drag the window where you want.
- The interface is minimalist (less features, simpler interface)
- The window waste less than 3k pixel of your screen.
- Only three actions: start, stop, close
- No Sounds
- Works on Windows Only
- Sources available.
- Free download
Screenshots:
- Start!
- Running:
lunedì 14 settembre 2009
How Compare Word Documents in TortoiseHG using TortoiseSVN
Introduction
TortoiseSVN is a mature and complete product that provides some useful features like comparison of non text based files like Word, PowerPoint, Excels and images files.
The TortoiseHg hasn't this feature so you can't, for example, visual compare Word files. Nevertheless we can configure TortoiseHg in a way that it can use the comparison features of TortoiseSVN. In this post I will choose you how to do such configuration.
Create an the invoke-tortoisesvn-diff.cmd
First of all we create a command that will invoke TortoiseSVN Diff.
Create a file named invoke-tortoisesvn-diff.cmd with the code:
SET LEFT=%1
SET RIGHT=%2
SET PROC=C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe
"%PROC%" /command:diff /path:%LEFT% /path2:%RIGHT%
Place it when you want, for example in C:\Program Files\TortoiseHg.
Before continuing test the command, for example comparing two word files:
invoke-tortoisesvn-diff.cmd C:\path\to\left\document.doc C:\path\to\right\document.doc
Using absolutes path is essential.
Integrate invoke-tortoisesvn-diff in TortoiseHg
Next we tells to TortoiseHg to use this command editing the mercurial.ini.
Placed in C:\Documents and Settings\<user>\mercurial.ini.
And add the followings::
[extdiff]
cmd.tortoise_svn_diff = C:\Program Files\TortoiseHg\invoke-tortoisesvn-diff.cmd
Now we can test the integration with TortoiseHG. From a mercurial working directory do right click > TortoiseHG... > Visual Diff and the usual "Visual Diffs" window should be displayed.
From the tools dropdown list choose tortoise_svn_diff and then double click the document name and the differences should be shown in a new word document.
giovedì 3 settembre 2009
Duke Nukem Forever
Oggi in rete ho scoperto la storia di un videogioco chiamato Duke Nukem Forever.
Si tratta di un videogioco che potrebbe essere considerato il simbolo dello sviluppo software mal gestito: lo sviluppo è iniziato 12 anni fa e non è ancora terminato!
Si tratta di un videogioco che potrebbe essere considerato il simbolo dello sviluppo software mal gestito: lo sviluppo è iniziato 12 anni fa e non è ancora terminato!
I motivi del ritardo non li conosciamo ma si possono intuire leggendo la storia dello sviluppo su wikipedia (per esempio si legge che hanno cambiato tecnologia più di una volta, che hanno riscritto da zero alcuni componenti al posto di usare quelli già fatti, e che hanno cambiato spesso il personale).
La cosa che mi lascia sconcertato è come fa un progetto a durare così tanto senza morire? Quanti soldi avranno speso? Chi ne ha spesi così tanti e chi ha continuato a spenderli non vedendo risultati?
Incredibile.
Incredibile.
Etichette:
development,
games,
software
martedì 21 luglio 2009
Il protocollo di Subversion si rinnova
Avete presente il protocollo HTTP di Subversion? Lo stanno migliorando e studiare come gestiscono questa miglioria mi aiuta a capire come gestire i progetti software.
Subversion supporta diversi protocolli (svn, http, e svn+ssh). Il protocollo che poggia su HTTP è forse il più comodo da usare come client perché usa solo la porta 80 (buono per i firewall e proxy trasparenti), e permette il browsing del repository con un semplice browser. Lato server il protocollo over HTTP fornisce una serie di goodies ereditate da Apache come la possibilità di usare l'autenticazione LDAP, e le stessi strumenti di logging usati per Apache. Fino ad ora questa comodità si pagava in termini di prestazioni. Come ammette lo stesso manuale di Subversion il protocollo over HTTP è più lento degli altri due.
Oltre alla velocità ci sono questioni di semplicità e di leggibilità che riguardano il protocollo. Se ho capito bene questo post che lo letto il problema sta nel fatto che il protocollo Subversion over HTTP è stato su una specifica over-ingegnerizzata: l'estensione di versioning di WebDAV.
Ora si è deciso di cambiare! La modifica è stata definita in una nuova specifica. In questo nuovo protocollo sono state rimosse tutte le complicazioni non necessarie. La parte interessante (per me) è vedere come la modifica è gestita!
Le specifiche sono scritte in un documento testo semplice messo sotto controllo di versione e automaticamente messe a disposizione su HTTP (grazie all'uso di Subversion over HTTP tra l'altro).
All'inizio c'e' una introduzione che contestualizza le modifiche e di seguito le specifiche sono dettagliate in senso top down. Lo stesso documento funge da report sullo stato del lavoro. Scendendo nel documento si trovano infatti gli elenchi di cose da implementare taggati con la scritta [DONE] o [STARTED]. Scorrendo indietro nella storia si potrebbe addirittura vedere la storia del documento e come si è evoluto il design e lo stato di implementazione.
Molto istruttivo.
Iscriviti a:
Post (Atom)