binfalse
Validating XML files
September 12th, 2012In the scope of different projects I often have to validate XML files. Here is my solution to verify XML files using a schema.
First of all to validate XML files in Java you need create a SchemaFactory
of the W3C XML schema language and you have to compile the schema (let’s assume it’s located in /path/to/schema.xsd
):
Now you’re able to create a validator from the schema.
In order to validate a XML file you have to read it (let’s assume it’s located in /path/to/file.xml
):
Last but not least you can validate the file:
HowTo Debug Bash Scripts
September 8th, 2012Even shell scripts may get very complex, so it is helpful to know how to debug them.
Lets explain it on a small example:
Executing it you’ll get an output like this:
To debug the execution of scripts the bash provides a debugging mode. There is one option -x
to trace the execution
So you see, every line that is executed at the runtime will be printed with a leading +
, comments are ignored. There is another option -v
to enable verbose mode. In this mode each line that is read by the bash will be printed before it is executed:
Of course you can combine both modes, so the script is sequentially printed and the commands are traced:
These modes will help you to find some errors.
To modify the output of the tracing mode you may configure the PS4
:
This will also print the file name of the executing script, the line number of the current command that is executed and the respective function name:
if You don’t want to trace a whole script you can enable/disable tracing from within a script:
This will result in something like:
It is of course also possible to enable/disable verbose mode inside the script with set -v
and set +v
, respectively.
Absolute Path of a Servlet Installation
September 7th, 2012I’m currently developing some Java Servlets and one of the tasks is to create images dynamically. But where to store them accessible for users?
If you want to show the user for example a graph of some stuff that changes frequently you need to generate the image dynamically. The rendering of the graphic is one thing, but where to store the picture so that the visitor can access it from the web?
There were many options to try, and I found that getServletContext().getRealPath (".")
from ServletRequest
› was the result I’ve been looking for. So to spare you the tests I’ll provide the different options (download):
Let’s assume your webapps-directory is /var/lib/tomcat6/webapps/
, your servlet context is project
and the user asks for the servlet test
the output probably looks like:
That’s it for the moment ;-)
MFC-9120CN Setup
September 1st, 2012I just bought a new printer, the Brother MFC-9120CN. It’s also able to scan and to copy documents and to send them by fax. Since the installation instructions are win/mac-only I’ll shortly explain how to setup the device in a Linux environment.
Decision for this printer
First of all I was searching for a printer that is in any case compatible to Linux systems. You might also have experiences with this driver f$ckup, or at least have heard about it. The manufactures often only provide drivers for Win or Mac, so you generally get bugged if you want to integrate those peripherals in your environment. The MFC-9120CN scores at this point. It is able to print and scan via network. Drivers for the printer are available and the the scanned documents can be sent at any FTP server. So you don’t need to have special drivers for scanning, just setup a small FTP server. This model is also a very cheap one compared to other color-laser MFP’s, and with the ADF it completely matches my criteria.
Disadvantages
I already noticed some disadvantages. One is the speed, the printer is somewhat slow. Since I’m not printing thousands of pages it’s more or less minor to me, but you should be aware of that. Another issue is the fact, that the device always forgets the date if it is turned of for a time.. And the printer is a bit too noisy.
Setup
The printer comes with a large user manual (>200 pages). It well explains setup the fax functionality, but the installation of the network printer and scanner is only described for win/mac, so I’ll give you a small how-to for your Linux systems.
Network Setup
To use this device via network you have to connect it to a router. It should be able to request an IP via DHCP, but if you don’t provide a DHCP server you need to configure the network manually (my values are in parenthesis):
- IP:
menu->5->1->2
(192.168.9.9
) - Netmask:
menu->5->1->3
(255.255.255.0
) - Gateway:
menu->5->1->4
(192.168.9.1
)
If this is done you should be able to ping the printer:
If you browse to this IP using your web browser you’ll find a web interface for the printer. We’ll need this website later on.
Printer Setup
Big thanks to the CUPS project, it’s very easy to setup the network-printer! If you haven’t installed cups yet, do it now:
Just browse to your CUPS server (e.g. http://localhost:631 if it is installed on your current machine) and install a new printer via Administration->add Printer (you need to be root). Recent CUPS versions will detect the new printer automatically and you’ll find it in the list of Discovered Network Printers. Just give it a name and some description, select a driver (I’m using Brother MFC-9120CN BR-Script3 (color, 2-sided printing)) and you’re done! Easy, isn’t it!? ;-)
For those of you that have an older version of CUPS: The URI of my printer is dnssd://Brother%20MFC-9120CN._printer._tcp.local/
.
Scanner Setup
As explained above, the printer is able to send scanned documents to a FTP location. That is, there is no need for a scanner driver! Just install a small FTP server, I decided for ProFTPd:
Make sure, that the /etc/proftpd/proftpd.conf
contains the following lines:
and create a new virtual FTP user:
You will be asked for a password. The scanned documents will be stored in /PATH/TO/FILES
. This command creates a file ftpd.passwd
. Move this file to /etc/proftpd/
, if you didn’t execute the command in that directory.
Restart ProFTPd:
You should be able to connect to your FTP server:
If that was successful, let’s configure the scanner to use this FTP account. Use your web browser to open the interface of the printer (e.g. http://192.168.9.9/) and go to Administrator Settings->FTP/Network Scan Profile (you have to authenticate, default login is admin and the password is access). Here you’ll find 10 different profiles that can be configured. Click for example on Profile Name 1 and modify the profile:
- Host Address: The IP of the FTP server (e.g.
192.168.9.10
) - Username: The username of the virtual FTP user you’ve created (e.g.
YourPrinter
) - Password and Retype Password: The password of the virtual FTP
- Store Directory:
/
If you submit these values you’ll be able to scan to your FTP server. Just give it a try! ;-)
Additional Notes
I recommend to configure your firewall to drop all packets of your printer that try to leave your own network.
Conditionally autoscroll a JScrollPane
April 10th, 2012I’m currently developing some GUI stuff and was wondering how to let a JScrollPane scroll automatically if it’s already on the bottom and the size of it’s content increases.
For example if you use a JTextArea to display some log or whatever, than it would be nice if the scroll bars move down while there are messages produced, but it shouldn’t scroll down when the user just scrolled up to read a specific line. To scroll down to the end of a JTextArea can be done with just setting the carret to the end of the text:
But we first want to check whether the scroll bar is already at the bottom, and only if that’s the case it should automatically scroll down to the new bottom if another message is inserted. To obtain the position data of the vertical scroll bar on can use the following code:
Unfortunately log.append ("some msg")
won’t append the text in place, so the size of the text area will not necessarily change before we ask for the new maximum position. To avoid a wrong max value one can also schedule the scroll event:
As you can see, here a new event is put in the EventQueue, and this event is told to put another event in the queue that will do the scroll event. Correct, that’s a bit strange, but the swing stuff is very lazy and it might take a while until the new maximum position of the scroll bar is calculated after the whole GUI stuff is re-validated. So let’s be sure that our event definitely happens when all dependent swing events are processed.