Started something new!

Well its been long i have tried something new or learn something new …. Today i started with Google’s AJAX Search API . I started with simple local search using simple search and i learned how to embed samething in my blog see this example : http://madhucm.blogspot.com.

I would have included in this blog but i dont know how to edit <body> tag. And also it doesn’t allow you to do   … well it doesn’t matter however.

The first thing  i did was getting the JAX Search API key  so that it is valid within a single directory on your web server. And after getting the key, i tweaked the my blog template , and finally included the script. Well if you know javascript it damn easy to create you own search.

ex: var localSearch = new google.search.LocalSearch();
searchControl.addSearcher(localSearch); // This is local search
searchControl.addSearcher(new google.search.WebSearch()); // search on web
searchControl.addSearcher(new google.search.VideoSearch()); // video search
searchControl.addSearcher(new google.search.BlogSearch()); // blog search….

You can also customize your view , like :- TABBED, LINEAR .

// create a drawOptions object
var drawOptions = new GdrawOptions();

// tell the searcher to draw itself in linear mode
drawOptions.setDrawMode(GSearchControl.DRAW_MODE_LINEAR);
or
drawOptions.setDrawMode(GSearchControl.DRAW_MODE_TABBED);
searchControl.draw(element, drawOptions);

more info:http://code.google.com/apis/ajaxsearch/

Add comment May 16, 2008

Logging GC activity how to

An easy low cost method to check the activity of the garbage collector in the JVM is to tell the JVM to create an activity log. This is achieved for Sun JVMs using the non-standard command line option “-Xloggc:file_name“. This will tell the JVM to create a log file with a content similar with this:

0.806: [GC 8064K->1211K(30912K), 0.0051670 secs]
1.363: [GC 9275K->1856K(30912K), 0.0061070 secs]
1.944: [GC 9920K->2602K(30912K), 0.0115890 secs]
2.351: [GC 10666K->3289K(38976K), 0.0083440 secs]
3.159: [GC 19417K->4316K(38976K), 0.0325310 secs]
3.948: [GC 20444K->5735K(56192K), 0.0083630 secs]
35.812: [GC 37671K->7896K(56512K), 0.0152040 secs]
525.368: [GC 39832K->8066K(89600K), 0.0082710 secs]

As one can guess the log entries show the time of the garbage collection activity, the memory before and after and the duration of the garbage collection. This can prove very useful when monitoring the activity of a server application for memory leaks and for memory activity.
If the information about the garbage collection activity is only needed at the console the “-XX:+PrintGC” and “-XX:+PrintGCDetails” options can be used. The last one will produce an output with more details lke this one:

[GC [PSYoungGen: 33584K->1312K(33600K)] 36545K->6656K(55104K), 0.0141310 secs]

Heap
PSYoungGen total 33920K, used 8802K [0×00002aaac91c0000, 0×00002aaacd790000, 0×00002aaad39c0000)
eden space 30976K, 19% used [0×00002aaac91c0000,0×00002aaac97840a8,0×00002aaacb000000)
from space 2944K, 98% used [0×00002aaacd4b0000,0×00002aaacd784978,0×00002aaacd790000)
to space 4096K, 0% used [0×00002aaaccf90000,0×00002aaaccf90000,0×00002aaacd390000)
PSOldGen total 21504K, used 5344K [0×00002aaab41c0000, 0×00002aaab56c0000, 0×00002aaac91c0000)
object space 21504K, 24% used [0×00002aaab41c0000,0×00002aaab46f8340,0×00002aaab56c0000)
PSPermGen total 21248K, used 19211K [0×00002aaaaedc0000, 0×00002aaab0280000, 0×00002aaab41c0000)
object space 21248K, 90% used [0×00002aaaaedc0000,0×00002aaab0082d50,0×00002aaab0280000)

The behavior of the logging option seems to produce identical results as “-XX:+PrintGC” even if personally I would’ve expect more details in the log file. Maybe this will change in a future version of Java.

4 comments May 15, 2008

wondering how to enable blocked chat in gmail ??

Block access to web based chat messengers and IM like gtalk , msn or yahoo in your office without blocking the whole site itself using the Hosts file.

imageFor example in iGoogle there is an option to add these messenger modules(gtalk,msn,hotmail & yahoo). And with this trick you can block only these Messengers but not the whole IGOOGLE itself.

First of all,Open the hosts file located in C:\windows\system32\drivers\etc with your notepad.Add these following lines in the hosts file and save it.

127.0.0.1 localhost

127.0.0.1 chatenabled.mail.google.com

127.0.0.1 httpcs.msg.yahoo.com

Bang you are done !!!

msn_messenger_blocked More messengers can be blocked by adding the server address of the messengers to this file.With this the Gtalk module in the Gmail page is also blocked.

1 comment May 12, 2008

Cool Virtual Desktop Managers for Windows

If you constantly find your desktop cluttered and overloaded with programs and browser windows then a virtual desktop manager might be for you. Virtual desktops are handy if you want to keep different tasks and programs separated. They are quite common on Mac and Linux computers.  It may take some time but once you get used to using them, they become an essential part of a productive workflow. So if you’re up for it, below are some of the better Windows desktop managers out there:

(1) Dexpot

Dexpot is an easy to use and fast desktop manager that makes managing multiple desktops very easy. It’s my favorite desktop manager and comes with plenty of useful features.

Dexpot- Virtual Desktop for Windows

When it comes to virtual desktops, the most important feature is the ease of switching between desktops. The easier and faster the switching, the better it is. Dexpot offers a number of ways to switch between desktops, including keyboard shortcuts Alt+1/2/3/4 or using the ‘Desktop Manager’ located on top of the Windows taskbar (picture above).

Dexpot - Virtual Desktop Manager

Another cool feature is the ability to quickly move or copy a particular window to one of the other desktops. To access these options, simply right-click on any of the program tabs in the menubar. There is also an option to copy certain windows to all desktops at the same time. Very useful.

Virtual Desktop Settings

You can also customize each of your multiple desktops further with its own wallpaper, desktop entry/exit sounds, screensaver, manager icon and so on.

source:http://www.makeuseof.com/tag/2-cool-virtual-desktop-managers-for-windows

1 comment May 5, 2008

eyeOS: Free Web Desktop For Everyone

eyeOS is a web based desktop which offers some nice features. Web desktops will never be an alternative to real desktops but they come in handy in a few situations. When you are not in front of your system or you don’t have a USB drive to work remotely these can be useful.

eyeOS is a open source we desktop software, you can download it and host it for yourself if you find it useful for you. It offers many features from file hosting, music, videos to RSS feed reader. You can use the free public server by registering at eyeOS or try the demo to see what it has to offer.

Some of the interesting features include a POP3 email client where you can setup email and read. It also supports Gmail. It has most of the features you will expect in a OS including Calendar, spreadsheets, contacts, files, RSS reader, calculator, chess, docs, presentations, ftp, notes etc. All these may not be useful but some like Gmail, ftp, RSS reader are quite useful.

Check out the demo to see it in action. ZImDesk is a related application

More info : http://www.teknobites.com/?s=eyeos

eyeOS

Add comment April 23, 2008

Hack boot screen

Some distros have sexy boot screens, some have basic, boring ones. Here’s what I get from a default installation of ubuntu…

What a yawn! But there’s an easy way to spice them up. Add either or both of the grub-splashimages

o add a new splash image, edit /boot/grub/menu.lst and add the line

splashimage /boot/grub/splashimages/FILENAME.xpm.gz

DIY Splashing

If you find the above selection a bit dull, its a doddle to create your own.

The images used by the grub bootloader must be in X PixMap (.xpm) format and may or may not be compressed with gzip (.gz). What’s more, they have to be sized 640×480 pixels and have no more than 14 colours(!?). Fortunately, if you have ImageMagick installed, this command will do the whole conversion for you…

convert infile.jpg -resize 640×480 -colors 14 -depth 8 outfile.xpm.gz

(Note that you can use pretty much any graphic with convert. You’re not restricted to JPGs.)

Not every image converts nicely. That 14-colour format can turn great images grainy — or worse — so here’s a quick batch file to convert a bunch of randomly named JPGs into .xpm.gz format. To use it, create a new folder, copy in the files you want to try, save the following as xpm_convert.sh, and make it executable by typing chmod +x xpm_convert.sh in a console window.

#!/bin/bash
FILE_NO=”1″
for i in *.jpg
do
echo Converting $i
convert $i -resize 640×480 -colors 14 -depth 8 $FILE_NO.xpm.gz
FILE_NO=`expr $FILE_NO + 1`
done


Running the program with ./xpm_convert.sh will create a bunch of consecutively numbered .xpm.gz files, which should be copied to /boot/grub. Why use numbers instead of names? Because it makes it easier to test the new files.

When you reboot, hit “c” when the boot menu appears. This will take you to the a grub command line. Now type splashimage /boot/grub/1.xpm.gz to try out the first of your new images. Then try splashimage /boot/grub/2.xpm.gz to test the second one, and so forth. There’s no need to do a full reboot and change menu.lst every time!

A couple of other notes:
* The above doesn’t seem to work unless your menu.lst already contains a working splashimage.
* You can use auto-complete on the grub command line, so instead of typing the whole command you can type sp <tab> /bo <tab> g <tab> etc.

1 comment April 4, 2008

Using Dynamic Method Invocation to “Script” Java

Although Java isn’t thought of as a dynamic language now a days, what with Ruby and Groovy being all the rage, Java does have support for dynamic features.

A Use Case for Dynamic Java

Currently I’m wrapping about a hundred EJB 2.1 LocalHome classes in DAO’s, and having them transform local EJB entities into POJO’s. Much of the code is largely boiler plate. Actually it’s mind numbingly boiler plate. Here’s a sample of wrapping a finder:

public Endowment findById ( String id ) {
	try {
		// get the local home
		EndowmentLocalHome endowmentLH = EndowmentUtil.getLocalHome ();
		// lookup the entity
		EndowmentLocal endowmentL = endowmentLH.findByPrimaryKey ( id );
		// return the entity
		return createEndowment ( endowmentL );
	} catch ( Exception e ) { throw new VRRemoteException ( e ); }
}

So, five lines of code just to call a finder, then there’s the createEndowment() method that actually does the transformation into a POJO. Additionally every method is cluttered with try {} catch {} constructs, further blurring the intent of the code.

By using reflection and dynamic method calls I’ve been able to reduce the boilerplate to:

public Member findById ( String id ) {
    return (Member) mixin.find ("findById", new Object[] { id } );
}

If by chance my finder returns a Collection, all I need to do is cast the result to Collection.

Each DAO is specific to a “type.” Not type as in a Class, but type as in a “business type,” ie the snipped deals with the “Endowment” type. For each type there are a number of EJB 2.1 and POJO classes collaborating to make the whole thing work. For the Endowment type the critical classes are:

  • EndowmentUtil: A utility class for looking up local and remote home interfaces using JNDI. This utility class shields us complete from JNDI. :) This class is generated by XDoclet.
  • EndowmentLocalHome: The local home for the Endowment EJB.
  • EndomentLocal: A local EJB entity of an endowment.
  • EndowmentValue: A value bean representing an endowment. This is generated by XDoclet.
  • EndowmentDAO: An interface for a persistence agnostic data access object.
  • EndowmementDAOEjbImpl: An implementation of EndowmentDAO that wraps the EJB 2.1 LocalHome.
  • Endowment: A POJO in a new clean package that has no connection to our old EJB 2.1/XDoclet code.

The other thing we’re doing is making our POJO’s transparently navigable, just like JPA entities are when they are managed by an EntityManager. (ie: We can do contactMechanism.getParty().getMember().)

The major issue is that I had repeating patterns like the findById() example above that are the same except that the “type” differed. The convention is the same, over and over. Reflection and my dynamic method calling to the rescue. (NB: This app needs to run on a Java 1.4 server, otherwise I’d have taken a look at generics to solve some of these issues.)

The Solution

Using the findById sample the pattern is easily identifyable:

public Endowment findById ( String id ) {
	try {
		// get the local home
		EndowmentLocalHome endowmentLH = EndowmentUtil.getLocalHome ();
		// lookup the entity
		EndowmentLocal endowmentL = endowmentLH.findByPrimaryKey ( id );
		// return the entity
		return createEndowment ( endowmentL );
	} catch ( Exception e ) { throw new VRRemoteException ( e ); }
}

Simplifying this to pseudo code can help in seeing the pattern:

public #TYPE# findById ( String id ) {
	try {
		// get the local home
		#TYPE#LocalHome localHome = #TYPE#Util.getLocalHome ();
		// lookup the entity
		#TYPE#Local localEjb = localhome.findByPrimaryKey ( id );
		// return the entity
		return create#TYPE# ( localEjb );
	} catch ( Exception e ) { throw new VRRemoteException ( e ); }
}

We can even simplify this further, because the pattern is really the same with any finder. Look up a #TYPE#Util, call getLocalHome() on it, getting a #TYPE#LocalHome, call the finder method and transform the result into a POJO.

public #TYPE# find (Object[] args ) {
	try {
		// get the local home
		#TYPE#LocalHome localHome = #TYPE#Util.getLocalHome ();
		// lookup the entity
		#TYPE#Local localEjb = localhome.find ( args );
		// return the entity
		return create#TYPE# ( localEjb );
	} catch ( Exception e ) { throw new VRRemoteException ( e ); }
}

We call some find method with some collection of arguments, represented by the Object[], which could also be absent for an no-argument finder.

With the pattern identified let’s “script” it using the dynamic method calling and the fact that the related class names all follow a convention.

Here’s the code that will call any finder using the pattern above:

public Object find (String finder, Object[] args) {
	Object result = sendMessage (finder, getLocalHome(), args);
	if (result instanceof Collection) {
		try {
			Collection originalResultList = (Collection) result;

			// If the result is empty there is nothing to convert. Return the empty collection.
			if (originalResultList.size() == 0) {
				return result;
			}

			Collection resultList = new ArrayList ( originalResultList.size () );
			for (Iterator itr = originalResultList.iterator (); itr.hasNext (); ) {
				Object ejb = itr.next ();
				resultList.add (createPojo (ejb) );
			}
			result = resultList;
		} catch (Exception e) {
			throw new VRUtilityException (”ERROR: Post-processing a collection into POJO’s for type = ‘” + getType() + “‘.”, e);
		}
	} else {
		// Build a POJO from the EJB entity returned by the finder.
		return createPojo (result);
	}

	return result;
}

Most of the code in the method is involved with transforming Collection results into POJO’s.

To access the findById method I’d do:

return (TYPE) find ("findById", new Object[] { id } )

Getting the LocalHome interface is done by convention:

/** Get the local home appropriate to this mixin. */
protected Object getLocalHome () {
	// Determine utility class name.
	Class utilClass = findClass (getType() + "Util");
	if (utilClass == null) {
		throw new VRUtilityException ("ERROR: Could not look up utility class for type = '" + getType () + "' by convention.");
	}
	try {
	       return utilClass.getMethod ("getLocalHome", null).invoke (null, null);
	} catch (Exception e) {
		throw new VRUtilityException ("ERROR: Could isntantiate local home for class of type = '" + getType () + "' by convention using Method object.");
	}
}

Because I know my Util class is #TYPE#Util I can rely on that by convention to get my utility class and instantiate a LocalHome to be used. (In my case the findClass() method looks for the #TYPE#Util class in one of three packages by convention. I could have search the classpath, but that seemed like overkill under the circumstances, when I know it’s in one of those three packages.)

Using the same recognition of patterns and convention allowed the replacement of boilerplate code in our persist method to.

Before:

public void persist ( Endowment endowment ) {
	try {
		// get the local home
		EndowmentLocalHome endowmentLH = EndowmentUtil.getLocalHome ();
		// create the entity
		EndowmentLocal endowmentL = endowmentLH.create ();
		// ensure that the foreign keys are set
		setForeignKeys ( endowment );
		// populate the entity
		endowmentL.setEndowmentValue ( endowment );
		// update the ID
		endowment.setId( endowmentL.getId() );
	} catch ( Exception e ) { throw new VRRemoteException ( e ); }
}

After:

public void persist ( Endowment endowment ) {
	mixin.persist (endowment);
}

The reflection code that does it:

public void persist (Object bean) {

	// Create an entity EJB bean using the localHome.
	Object ejb = sendMessage ("create", getLocalHome (), null);

	// Populate foreign ID's from associated POJO's.
	setForeignKeys (bean);

	// Populate the entity.
	setValueOnEjb (bean, ejb);

	// Get the id from the ejb.
	String id = (String) sendMessage ("getId", ejb, null);

	// Set the id on the bean (POJO).
	sendMessage ("setId", bean, new Object[] { id });
}

The nice thing is I wrote the reflection version of the persist once and I can reuse it with one line of code. Bye bye boiler plate.

Conclusion

If you find yourself writing repetitive code, such as in my case when wrapping some API you want to abstract out, find the patterns and factor out that repetitive boilerplate code using reflection. You don’t need to waste your life writing repetitive code.

2 comments February 28, 2008

New features for Hardy Heron

The roadmap for hardy heron has a pretty big list of features, most of them, although very important, are technical and a bit uninteresting. Some of them should have been in Gutsy but couldn’t meet the schedule. Hardy Heron is going to be a Long Term Support release, so there’s also going to be a lot of fixes for existing features. So without further ado, the features which I’m anticipating the most are.Install on an existing filesystem without overwriting /home
When I moved from feisty to gutsy, I decided to do a fresh install. One of the things I had to do was back up my home folder, and when I finished installing gutsy I just copied it back onto my computer. This new feature will allow people to install the new version of Ubuntu without it overwriting their home folder.I’m sure this will come in very handy for people who like trying out different distro’s.

Hardy Hardware Detection
This is more of a bug fix than a new feature. Gutsy already has excellent hardware support and the plan for hardy is even better and more robust detection of hardware. Sounds good to me.

GDM Face Browser
One of the changes I made to my gutsy is the GDM. I replaced the old one with something that allows me to just click on a picture of my username and login. This will hopefully be the default for hardy.

Auto Detection of Monitor Frequency
While I was testing gutsy beta I had to manually configure xorg.conf to get it to the right resolution. It wasn’t fun. This should be a thing of the past with hardy as it will automatically detect everything for you. Huzzah!

Apt Authentication Reliability
Have you ever had an update fail for no reason? Well it actually fails because of ‘transient network failures’. The aim is to make hardy more robust against these errors.

Redesign Restricted-Manager Code
They want to expand the role of the restricted manager and change it so that other distro’s can share the joy.

Handling Full Disks

I’ve never had this problem with Ubuntu, but if your disk gets full, things can get quite ugly. They plan to add a notification and disk clean-up tool when your running low on space.

Desktop Effects
Make compiz fusion more robust and easier to use.

New Theme
Hardy Heron will be getting a shiny new theme, I hope they move away from the brown theme and choose something lighter and more fresh.

Easy File Sharing
To allow people to easily share files over a network. Not more I can say about this.

Dual/Multi Monitor Support
Currently you have to manually tweak Ubuntu if you want to use more than one monitor. They want to fix this for hardy.

Integrate Prefetch into Ubuntu
I noticed a slightly increased start up time in gutsy compared to feisty. Hardy will use file prefetch and other optimisations to speed up boot time.

Automatix-Ubuntu Team Collaboration
Automatix was extremely helpful for me in feisty. Although I don’t use it in gutsy, its good that they are collaborating with the automatix team.

Single Click Install
Installing software is already pretty straightforward in Ubuntu. They want to make it even easier to install third party applications. I’m not complaining.

Apparmor Integration
This is already a part of gutsy, the plan is to increase integration to make Ubuntu even safer.

Firewall
Make it easier for users to configure their firewall.

Third Party Apt
Now when you install third party apps, you have to manually add the software repository to the sources.list. This spec makes it easy for users to install third party software and have it update automatically.

Revamped Logout Screen
They want to streamline the options you have when you click that big red button, to make things less confusing.

Better Integrated Wine
Better Wine will make it easier for Windows users to convert, thus helping to solve bug #1.

Xorg 7.3
This is one of the features that missed the gutsy deadline. This should make manual configuration of xorg.conf obsolete. Another much anticipated feature is Bullet Proof X, which will go into a graphical safe mode if anything goes wrong with X.

Slick Boot
To improve the boot and shutdown process and also make the things look nicer.

1 comment February 11, 2008

Follow me , style that matters for developers

Being a software developer are you following some standards and best practices that has to be followed?? Developing a software or writing small peice of code is just not the big deal. But what matters is , whether your written code make sence or does it adhere to the requirement. Coding is just one part , but there are othere things to follow where your code looks neat and clean . I am not talking about how to write code etc…. indeed i’m talking about how to make your code look clean and neat. There are some basic rules that every developer must adhere to and the disastrous outcomes that can follow if these rules are not followed. Some of the basic rules you might already know , but are you following ??

1. Add comments to your code : Everybody knows this, but somehow forgets to follow it. How many times have you “forgotten” to add comments? It is true that the comments do not literally contribute to the functionality of a program. But time and time again you return to the code that you wrote two weeks ago and, for the life of you, you cannot remember what it does! You are lucky if this uncommented code is actually yours. In those cases something may spark your memory. Unfortunately most of the time a third party can scan your code too. Well , i recommend to specify what exaclty your code does.

Example : bad way of coding

public File getFile(String path,String fileName) {
if(path == null && fileName == null) {
throw someException;

}

if(fileName.endswith(”exe”)) {
throw someException;
}
}

In the above code it does not tell about the path or fileName , anybody who navigates this
method will come to conclusion that , this method will check for validations and etc..And he has not idea about the path or fileName
Add comments to your code

/**

This method returns a file for the specified path and filename.The fileName takes the file name that ends with exe only and path should be fully qualified name .

@path refers to path Name , fully qualified
@fileName refers to file name with exe extention file name
@return file
*/

public File getFile(String path,String fileName) {
if(path == null && fileName == null) {
throw someException;

}

if(fileName.endswith(”exe”)) {
throw someException;
}
}

2. Say no to Print lines : Its obivious that many of the developers are tend to write sysouts everywhere in methods. But ofcourse its not a bad idea for debugging purpose .And we say to ourselves that we will delete these later. But we often forget to delete these lines of code or we do not want to delete them. polluting more sysouts in your code looks odd , but instead keep a common method which print your things.

3. Braces and Indentation: Indent style (cf., Raymond, “Indent Style”), or the placement of braces (”{” and “}”) and the associated indentation of code, is another of the religious issues related to writing code. There are several indent styles common to C-style languages like Java, and I am not going to suggest that one of them is superior. But following indentation your code look neat.

4. Blocks and Statements

->Put only one statement per line.
->Always use braces with control statements (e.g., ‘if’).
->Consider marking the end of a block with a comment (e.g., } // end if), particularly with      long or nested blocks.
->Put variable declarations at the beginning of a block.
->Always initialize variables.
->If you want to be a perfectionist, left-align variable names.
->Indent the case clauses in a switch block.
->Put whitespace before and after operators.
->In if, for, or while, put whitespace before the “(”.
->Use whitespace and parentheses in expressions to increase readability.
5. Unit-test. Unit-test. Unit-test.
I am not going to go into any details as to what is the best way to unit-test your code. I am just going to say that that it must be done. This is the most basic rule of programming. This is one rule that, above all, cannot be omitted. It would be great if your fellow developer could create and execute a test plan for your code, but if that is not possible, you must do it yourself. When creating a unit test plan, follow these basic rules:
->Write the unit test before writing code for class it tests.
->Capture code comments in unit tests.
->Test all the public methods that perform an “interesting” function (that is, not getters     and setters, unless they do their getting and setting in some unique way)

6. Always Prepare Document Requirements. Every business requirement must be documented. This could be true in some fairy tale, but it is far from that in the real world. No matter how time-pressed your development is, no matter how tight the deadlines, you must always make sure that every business requirement is documented.

Add comment January 18, 2008

if file.size() > 10 mb

Geeks need to shoot files over to someone all the time - video clips, movies, pictures, games distros, software programs etc. Most of the email providers restict you with a max. 10-20 MB attachments so sending files by email isn’t an option. Additionally, there are so many file sharing tools out there that sending large files as an email attachment became rather outdated.

Drop.io - Secure and Private File Sharing
(1) Drop.io - Anonymous and Private File Sharing

Drop.io is a terrific private file sharing and collaboration service. It is a great way to share video, photos, audio, docs etc. What would make your hearts burst with joy is the no-registration aspect. No email, no personal details or names - nothing! You are free to create as many drops (as they call it) as you want. Then, just shoot a link over to your pal and that’s it!

Additional Features

  • Supports all major file formats (docs, images, videos, music, etc.).
  • Create as many drops as you want (storage boxes).
  • Get a custom email address for each created drop: drop_name@drop.io.
  • Use drop_name@drop.io email address to add files to drops by emailing them.
  • It has a 100MB / drop storage limit.

Add comment January 11, 2008

Previous Posts


Categories

Calendar

May 2008
M T W T F S S
« Apr    
 1234
567891011
12131415161718
19202122232425
262728293031  

Archives

Links

Blog Stats