This is basically an all-in-one repository for techie developer-related things I've experienced / come-across and from where I can easily look-up later.
From small useful tidbits, code / key shortcuts, tips, to articles /guides on how to do certain complicated tasks, all the way to full mini-programs for daily use.
If it helps anyone else out too great!

Thursday, October 22, 2009

It will be a Forever Updated post, with new additions regularly for Windows - obviously with a slight preference to Java + Open-source versions if competing apps are similar.For Best Developer Utilities, see this earlier post, Must have tools for the Smart Java Professional.

If an app replaces an existing one, or if there are close seconds, the losing app will move to the Best Software Utilities (non-IT) Honour List.

The basic problem was a wrong SQL query formed by Hibernate - the TOLVENUSER table has 3 columns of type BLOB and the query in question was "SELECT DISTINCT...". Whereas "DISTINCT" does not work with blob columns (in Oracle 10g anyway) and hence the oracle error: ORA_00932.

The approach I had was to customise the offending query to simply remove "DISTINCT", especially since TOLVENUSER table already has a primary key on ID column anyway - the "DISTINCT" was hence redundant in the first place.This was done by updating a single Java file, org.tolven.security.bean.LoginBean (under TolvenEJB module). In the findUser( String principal) method, find the following line and remove "DISTINCT":String select = "SELECT DISTINCT u FROM TolvenUser u WHERE u.ldapUID = :principal " +

I then updated this compiled class file direclty into the tolvenEJB.jar file in JBoss's tolven ear file (at "...tolven-jboss-4.2.2.GA\server\tolven\deploy\tolven.ear/tolvenEJB.jar") and restarted Jboss.

And it was smooth running all the way after that (configPhase3 and so on). I'm accessing all Tolven web app pages perfectly now.

"ORA-00932: inconsistent datatypes: expected - got BLOB"This weird single-line error in JBoss's console/log made no sense at all until I added the following snippet in the server's log4j.xml to enable Hibernate logging (thanks to Joe at the Tolven Forum):<category name="org.hibernate.SQL"><priority value="DEBUG"/></category>

(Also of course modified the server logging threshold to DEBUG)

And then came this stacktrace:

2009-07-13 18:27:47,322 DEBUG [org.hibernate.util.JDBCExceptionReporter] could not execute query [select distinct tolvenuser0_.id as id27_, tolvenuser0_.ldapUID as ldapUID27_, tolvenuser0_.lastLogin as lastLogin27_, tolvenuser0_.creation as creation27_, tolvenuser0_.status as status27_, tolvenuser0_.sponsorship_id as sponsor19_27_, tolvenuser0_.timeZone as timeZone27_, tolvenuser0_.locale as locale27_, tolvenuser0_.emailFormat as emailFor8_27_, tolvenuser0_.demoUser as demoUser27_, tolvenuser0_.likeness_id as likeness18_27_, tolvenuser0_.pbeKeyAlgorithm as pbeKeyA10_27_, tolvenuser0_.salt as salt27_, tolvenuser0_.iterationCount as iterati12_27_, tolvenuser0_.encodedEncryptedPrivateKeyInfo as encoded13_27_, tolvenuser0_.PRIVATE_KEY_SIZE as PRIVATE14_27_, tolvenuser0_.PRIVATE_KEY_ALGORITHM as PRIVATE15_27_, tolvenuser0_.x509EncodedKeySpec as x16_27_, tolvenuser0_.PUBLIC_KEY_ALGORITHM as PUBLIC17_27_ from tolven.TolvenUser tolvenuser0_ where tolvenuser0_.ldapUID=? and (tolvenuser0_.status='ACTIVE' or tolvenuser0_.status='active' or tolvenuser0_.status='new' or tolvenuser0_.status='ACTIVATING' or tolvenuser0_.status='')]java.sql.SQLSyntaxErrorException: ORA-00932: inconsistent datatypes: expected - got BLOB

at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:91) at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:206) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:455) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:413) at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:1034) at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:194) at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:791) at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:866) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1186) at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3387) at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3431) at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1491) at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:236) at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186) at org.hibernate.loader.Loader.getResultSet(Loader.java:1787) at org.hibernate.loader.Loader.doQuery(Loader.java:674) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) at org.hibernate.loader.Loader.doList(Loader.java:2220) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104) at org.hibernate.loader.Loader.list(Loader.java:2099) at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378) at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338) at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172) at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121) at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79) at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:64) at org.tolven.security.bean.LoginBean.findUser(LoginBean.java:73) at org.tolven.security.bean.LoginBean.createOrUpdateUser(LoginBean.java:314) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112) at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166) at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.aspects.tx.TxPolicy.invokeInCallerTx(TxPolicy.java:126) at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:195) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:86) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.aspects.security.RoleBasedAuthorizationInterceptor.invoke(RoleBasedAuthorizationInterceptor.java:166) at org.jboss.ejb3.security.RoleBasedAuthorizationInterceptor.invoke(RoleBasedAuthorizationInterceptor.java:115) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77) at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:110) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:304) at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106) at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82) at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:795) at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:573) at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:373) at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:166)2009-07-13 18:27:47,338 WARN [org.hibernate.util.JDBCExceptionReporter] SQL Error: 932, SQLState: 420002009-07-13 18:27:47,338 ERROR [org.hibernate.util.JDBCExceptionReporter] ORA-00932: inconsistent datatypes: expected - got BLOB

Once the erring query was out in the open (in bold above), I tried executing it in an SQL window and identified that the error was being thrown on those columns of this table that were of type BLOB.And Google quickly told me that Oracle doesn't like using "SELECT DISTINCT..." on any BLOB columns of a table. Voila!

Wednesday, June 24, 2009

There are so many times that one cant help but wonder at how in spite of all the advances in comfort etc etc, life seems a lot harder than ever... sighhh.

For example, all the haphazard shifting around at office over the last 3 years has resulted in me accumulating a mountain of disorganised backups. Most notable are the outlook backups in PST formats (what are .pst files? They are Outlooks default backup file format extension). I was getting fed-up of helplessly grinding my teeth because of all the duplicate emails in different folders and different PSTs.....especially when the solution was right in front of my eyes - A simple VB macro!

Finally I took time out to get it done and with a very polished form too as can be seen below screnshots.To make it easy to carry around, I've stored it as an Excel file.

FunctionalityThe Macro identifies any duplicate items in 2 outlook folders (even those in different PST files) and optionally marks those items.

It does this by simply comparing all the mails (or any Outlook item) in the 2 locations specified and marks the duplicate mails (in both the folders) with a tag of your choice on the Categories attribute of that email. So it only marks duplicate mails and does not do the actual deleting (those who want to automate this step can easily add an extra line in the code to delete instead of mark, but I found it too risky). An option is available to disable even the marking so that you only get the duplicate count in the summary.

InputsThe actual program inputs are the names of the Outlook PST file and the mail folder of the 2 locations. Of course, if you want to compare 2 folders in the same PST, just provide the same PST name in both sets and choose the different folders.The other input is the name of the label you want to apply against the Categories attribute for duplicate e-mails.Finally, there is an option to enable marking of duplicate items.

StepsEnsure Outlook is running before launching the macro or it will not be able to get the PSTs files loaded in Outlook.1) Start the Macro.2) The macro fetches the PST files loaded in your Outlook application and displays the form.3) Select the PST file in set1. The set1 list gets updated with the folders in this PST file. Select the first folder you need to compare.4) Similarly, select the PST file in set2. The set2 folder list gets updated with the selected PST file contents. Select the second folder you need to compare here.5) Next choose whether to Mark the Duplicates or simply show a summary of duplicate sets.6) Ok Button gets enabled when all the right options are selected.7) Click on the OK button to start the process! This indexing step of the process may take time for large number of items... a progress bar displays the progress as well as a status bar with basic updates. When the process is done, the status shows the Completed message (and other statistics if you scroll up).8) Manual step of actual deleting duplicate mails: After running the program, you have to open the Outlook folder that you want to clean up and sort by the Categories column to see those marked in Duplicate like below (the Categories column is hidden by default - this has to be added from the Field Chooser dialog box):

Results showing marked mails under attribute, "Categories"

You can give a quick look to make sure they are really duplicates. Then you simply shift-select those mails and delete! :)

PerformanceEfficiency was increased by indexing the 2 folders before identifying duplicates- for 3000 + 1000 emails in the 2 folders, without indexing it took a few hours and still didnt finish (because there would be 3000 * 1000 reading of outlook items)! Now it runs in 5 mins.

CustomisationThe current macro only compares the Subject and Creation Date of 2 emails to identify if they are the same (which is actually fairly safe). If you want, you can have more precision by editing the code to check more mail attributes.Also as mentioned before it is simple to change the code to delete duplicate mails instead of just marking them.

I made the macro portable by embedding it in an Excel document with a launcher button (what you see in the background of the first 2 screens above). The Excel document containing all the code is available here. Of course, you can also create the macro right into your Outlook client itself (you'll have to copy the code manually from the Excel-macro code page to your Outlook-macro code page).

Update [25-Jun-09]:New features- Option to only count duplicates instead of Marking.- Now displays even sub-folders recursively- 2 new status views available to display number of items in selected folder.- Other performance enhancementsSee screenshot below:Update [03-Jul-09]:New features-support for choosing same folder in set1 and set2. This will mark/count duplicate sets of mails in the same folder.

Update [15-Feb-12]:New features-Support for identifying Missing mails - choose source and destination folders, and all mails missing in destination will be identified.-Support for marking labels as well as just counting Duplicates or Missing mails

Note: This was tested on Outlook 2003 but should work on any outlook...

Thursday, June 18, 2009

Here's an age-old problem perhaps much before the time Pythogaras stated to a non-mathematical audence: "The square of the hypotinuse..."

See most of us techies are really proud of the way we can rattle of so many tech terms and especially acronyms. Unfortunately, a sentence like that would just go right over a non-techie client or a new team member. What makes things worse is that requirement and document acronyms often vary from company to company.

Of course there are people who use them a lot to show off... and its the general opinion of the other crows that lots of jargon/acronyms implies you are loud-mouthed and/or not really knowledgeable. I absolutely agree when I hear Sales people at Mutual Funds talking about CAMS (of course I do catch them red handed if its a computer shop salesperson!).

Unfortunately a lot of the times, we techies are simply unaware when we're doing it! Perhaps what we could do is distribute a common acronym list before a client meeting? Something like below... of course the list would grow (or shrink?) based on client feedback after every meeting.

I would keep updating as the list would be obviously too large to put up at one go!The Little Guide of IT Acronyms:Tech AcronymsBPM - Business Process MangementEDI - Electronic Data InterchangeETL - Extract, Transform, LoadJSeam - JBoss SeamRIA - Rich Internet ApplicationSaaS - Software as a ServiceSOA - Service Oriented ArchiectureSOBA - Service Oriented Business ApplicationXSD - Xml Schema DefinitionWSDL - Web Service Definition Language

Monday, May 11, 2009

One thing I missed in my "new" old linux system is a hardware monitor tool to pick up the temperature, fan speed and any other statistics available directly from my hardware... in windows, there were so many to pick from and plenty of reviews and articles. I was surprised such a tool was not bundled with the Kubuntu Installation and nor did any turn up in the Add/Remove App.

The good news is that it is available for linux but is not as simple as install and run as in most stuff in linux. In fact, the hardware monitoring is actually present in the default installation of Kubuntu 8.04 through the lm-sensors package (verify this is already installed from Adept or Synaptic manager and install this if not present).

However lm-sensors has no UI. Presenting a choice of 2 UI tools, K-Sensors and Kima, to fill in this gap.

Note: lm-sensors is not a driver package - it will simply use drivers already installed by Kububtu. This works fine for most desktops but in the case of laptops, chances are slim that kubuntu drivers will be present for hardware monitoring. So lm-sensors wont help.

But before you use these UI tools, you need to setup your system by doing the following:1) Open a terminal (simply open Konsole in Kubuntu).

2) Next, you need to run a program from lm-sensors package to detect and list all your hardware that has sensors.Run the following command and hit Enter (yes) to all the subsequent prompts except the last one, "Do you want to add these lines automatically?" (unless you really want to)sudo sensors-detect

This program will show at the end a summary of all the hardware modules that needs to be added for monitoringSomething like:#----cut here----# Chip driversit87coretemp#----cut here----

Note: If you get a message like "no sensors detected", this most probably means none of your hardware have sensors or your kubuntu drivers are not able to detect them

3) Next you need to include the linux kernel modules detected by running the modprobe command for each of the modules between "cut here"So for the example above, type and run each of the following (normally you need to prepend with "sudo" to run in admin mode):sudo modprobe it87sudo modprobe coretemp

That's it. Now you can install (do it from Adept or Synaptic of course) and run your selected UI tool.

Ksensors can be started normally from the KDE start menu. You'll need to go to it's options menu and add the neccessary sensors you want to monitor.

Kima will not be present in the start menu as it is actually a Kicker applet. To start Kima, right click your bottom panel, select add Applet to panel and select Kima from the list. Kima will run as an applet in Kicker. Again you would need to go to it's conigure menu and add the sensors you want to monitor.

Finally, verify that the values you see in the sensor are accurate as they may be garbled by a factor or 2 sometimes (actual Sensor readings are usually accessible in your system bios).

Monday, April 27, 2009

Was in the code review phase last week... time for checkstyle, findbugs n PMD to come out!

Since it was a new project, with a little tinkering of a half-working Hudson ant script someone was working on, I could generate my Review reports. My checkstyle task was like below:<target name = "checkstyle"><mkdir dir="${checkstyle.report}"/><taskdef resource="checkstyletask.properties" classpath ="${checkstyle.home}/checkstyle-all-4.4.jar;${checkstyle.home}/checkstyle-optional-4.4.jar" /><checkstyle config="${basedir}\..\settings\CheckstyleSettings.xml" failonviolation="false"> <fileset dir="${src.java.dir}" includes="**/*.java"/> <formatter type="xml" toFile="${checkstyle.report}\checkstyle_errors.xml"/></checkstyle>

Unfortunately, the Checkstyle Reports kept giving a strange Error in some classes:"Got an exception - java.lang.RuntimeException: Unable to get class information for @throws tag 'DUSException'." at Line 0.Classes which had this error would have no other Errors although the Warnings were not affected.

However, in my Eclipse editor with Checksyle Plugin and the same Checkstyle settings, I would get normal Checkstyle Errors and Warnings without thie Error.

Clearly, this was some Checkstyle runtime error and not an error in my class which resulted in Checkstyle failing to process that class for Errors.

Searched the net and came up with lots of explanations / bug accusations that made a lot of sense but no easy solution... Checkstyle was somehow missing out the DUSException class when it was encountered in a throws tag of a methods Javadoc.

Unfortunately, the Checkstyle report started showing the real CS Errors and they doubled! :) But the team could finally tackle 'em bugs before they slipped to the next phase...

Strange thing was that most of the (new) team was also getting the same Checkstyle Bug in Eclipse... which was what made me assume that it really was a CS Bug.Until I had a look at their CS preferences and found that they were applying CS on .java files only. Once it was changed to apply to all files, the issue was resolved in their Eclipse as well

Thursday, February 26, 2009

Was stuck for a while trying to upload my google app from the latest Google App Engine 1.1.9 - what should have been an instant upload turned out to be an all-day adventure because of the complication of behind a proxy that required user/password authentication...

But finally got it to work with the following steps (from a Win XP machine using Python v2.6.1)!

1) Install the Python patch 1424152 from http://bugs.python.org/issue1424152. They only have diff files there - so for those who don't know how to apply diff patches, I have attached the 2 PATCHED files (urllib2.py & httplib.py) for Python 2.6.1. Just replace your corresponding files in your Python26\Lib folder with these (WARNING - these files were patched specifically for Python 2.6.1. For any other Python version, you have to patch your appropriate file from the patch link above).

2) Download the latest ntlmaps proxy (v0.9.9?) from http://ntlmaps.sourceforge.net/(its only 71kb!).Change the following attributes in server.cfg: PARENT_PROXY, NT_DOMAIN, USER, PASSWORD.You can leave the password empty and it will prompt you when you start ntlmaps.

3) Set the following environment values:set HTTP_PROXY=localhost:5865set HTTPS_PROXY=localhost:5865(5685 is the default port used by ntlsmaps which can be changed in server.cfg)

4) Start up the ntlsmaps proxy by running runserver.bat (you might have to edit thebat file to point to your actual python executable).

5) Test whether ntlsmaps is working by changing your browser proxy to point tolocalhost:5865, and try to access some sites. If this fails, your proxy is probablynot understood by ntlsmaps or vice versa - try to finetune ntlsmaps some more.

6) Finally run your upload command:appcfg.py update xyz/Hopefully you should get something like this:...\appcfg.py:40: DeprecationWarning: the shamodule is deprecated; use the hashlib module insteadDIR_PATH,Scanning files on local disk.Initiating update.Email: xyz@gmail.comPassword for xyz@gmail.com:Cloning 2 static files.Cloning 5 application files.Deploying new version.Checking if new version is ready to serve.Will check again in 1 seconds.Checking if new version is ready to serve.Closing update: new version is ready to start serving.Uploading index definitions.

Tuesday, February 24, 2009

Got a confounding error that occurred when trying to install an msi file on windows XP:

(Error reading from file ... .msiVerify that the file exists and that you can access it.)

After quite a bit of hair-pulling, I realised this was happening because I had removed Security rights to all users except myself for this folder... including the System group!I suppose since the System is what performs actions on msi to unpack it, etc, it needs rights here.So all I had to do was to put the msi file in a folder that has System rights.

In this case, I simply enabled access for System group to the directory and the problem was solved.

Friday, February 20, 2009

Was looking for a label cloud widget for the blog but was surprised to see no one had come up with any dynamic cloud generator... was a matter of merging a little unused math with simple javascript and the Dynamic Cloud Generator gadget was born.

If you're happy with the gadget (or even particularly upset!), for any feedback, queries or bugs do make a post in Google's gadget directory for this gadget here.When posting problems, provide as much information like the Gadget properties, what browser the problem is seen, etc.

Cloud Background Coloureg: red, #aabbddChange this from the default value of '#FFFFFF' (white) if you want another background colour.

Cloud Link ColourThis is for choosing the colour of the cloud links.

Base Url For Label link (change this)eg: http://devsac.blogspot.com/search/labelThis is the URL for creating the links that appear on each of the labels in the label cloud - the URL is simply prepended to the Label tag. If the user clicks on the tag "Cool", the URL in this case would be http://devsac.blogspot.com/search/label/Cool

Feed URL to retrieve Labels from (change this)eg: http://devsac.blogspot.com/feeds/posts/defaultYou can simply give your blog's Blogger RSS Atom feed (in this case, you can skip the below Label Element and Attribute properties). If you don't have a Blogger atom feed or have a non-standard xml file containing your labels, then provide that URL.

Name of Label Element in Feed URLeg: categoryLeave this with default value as "category", if you provided a Blogger Atom RSS feed for above Feed URL property.Otherwise, provide the name of the element that contains the labels in your xml.

Name of Label Attribute in Feed URLeg: termLeave this with default value as "term", if you provided a Blogger Atom feed for above Feed URL property.Otherwise, provide the name of the attribute containing the labels in your xml.

Ignore Label Attribute in Feed URLLeave this as default unchecked if you provided a Blogger RSS Atom feed for above Feed URL property.Enable this if you are provided a Feed URL that stores the the Label as a value in the Label Element and not in an attribute (such as the RSS feed from Feedster).

Minimum Label OccurencesThis is an optional property which will be skipped if it has default value of 0.This can be used when only those labels that occur more than a minimum count need to be displayed in the cloud.For e.g.:, if you want to consider only labels that have occurred more than once, then give 2 for this property.

Maximum Label OccurencesThis is an optional property which will be skipped if it has default value of 0.This can be used when only those labels that occur less than a maximum count need to be displayed in the cloud.For e.g.:, if you want to consider only labels that have occurred less than 100 times, then give 99 for this property.

Updates:v0.008 [25-May-09]:Added new properties, min and max label occurrences for feature request from Randi Helene Tillung.v0.007Fixed bug that left out border of gadget when setting background colour, Raised by Eemil.v0.006Fix for bug in "Ignore Label Attribute" option.v0.005Added "Ignore Label Attribute" option for those who have non-Blogger rss feeds like Feedster RSS.