Showing posts with label java. Show all posts
Showing posts with label java. Show all posts

Tuesday, March 05, 2024

subscribeOn or publishOn? may be both.

neither
[ctor-http-nio-4] ServiceClient : getting
[ctor-http-nio-4] Controller : getting
[ctor-http-nio-4] ServiceClient : got
[ctor-http-nio-4] Controller : got


subscribeOn in service
[ctor-http-nio-4] Controller : getting
[ scheduler-1] ServiceClient : getting
[ctor-http-nio-6] ServiceClient : got
[ctor-http-nio-6] Controller : got


publishOn in service client
[ctor-http-nio-4] ServiceClient : getting
[ctor-http-nio-4] Controller : getting
[ scheduler-1] ServiceClient : got
[ scheduler-1] Controller : got


subscribeOn in service and publishOn in service client
[ctor-http-nio-4] Controller : getting
[ scheduler-1] ServiceClient : getting
[ scheduler-2] ServiceClient : got
[ scheduler-2] Controller : got

Sunday, July 30, 2023

how to transfer oversized string over message system

for text based message system, if there's a limit of x KB, you can still transfer (~5 * x) KB by

  1. compressing the original payload
  2. encoding compressed binary to text
  3. sending it
receiver reverses the process to get original payload by
  1. testing to make sure message is encoded
  2. decoding it to compressed binary
  3. uncompressing decoded binary
import org.apache.commons.codec.binary.Base64;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

String payload = """
        {
        }""";
System.out.printf("original size: %s bytes\n", payload.length());

ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream gos = new GZIPOutputStream(baos);
gos.write(payload.getBytes());
gos.close();
byte[] compressed = baos.toByteArray();
System.out.printf("compressed size: %s bytes\n", compressed.length);

String encoded = Base64.encodeBase64String(compressed);
System.out.printf("encoded size: %s bytes\n", encoded.length());

System.out.println("is message encoded? " + Base64.isBase64(encoded));
byte[] decoded = Base64.decodeBase64(encoded.getBytes());
System.out.printf("decoded size: %s bytes\n", decoded.length);

GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(decoded));
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = gis.read(buffer)) > 0) {
    output.write(buffer, 0, bytesRead);
}
gis.close();
String uncompressed = output.toString();
System.out.printf("uncompressed size: %s bytes\n", uncompressed.length());


original size: 9450 bytes
compressed size: 1235 bytes
encoded size: 1648 bytes
is message encoded? true
decoded size: 1235 bytes
uncompressed size: 9450 bytes


Wednesday, August 24, 2022

mixing spring boot web and webflux

Following how to use reactor scheduler in micro-services, things becomes even more tricky if you mix spring boot web and webflux.

subscribeOn
[nio-8090-exec-1] -----Service : foo
[oundedElastic-1] EmailServiceClient : Sending email notification
[ctor-http-nio-2] EmailServiceClient : Sent email notification

publishOn
[nio-8090-exec-1] EmailServiceClient : Sending email notification
[nio-8090-exec-1] -----Service : foo
[oundedElastic-1] EmailServiceClient : Sent email notification

publishOn + subscribeOn
[nio-8090-exec-1] -----Service : foo
[oundedElastic-1] EmailServiceClient : Sending email notification
[oundedElastic-2] EmailServiceClient : Sent email notification

Mono.just + subscribeOn
[nio-8090-exec-1] EmailServiceClient : Sending email notification
[nio-8090-exec-1] -----Service : foo
[ctor-http-nio-2] EmailServiceClient : Sent email notification

Mono.just + publishOn
[nio-8090-exec-1] EmailServiceClient : Sending email notification
[nio-8090-exec-1] -----Service : foo
[ctor-http-nio-2] EmailServiceClient : Sent email notification

Tuesday, March 01, 2022

failed to insert 1-to-many entities using Spring Data JPA

may related to this, i have to insert header and 2 lines individually to walk around.

spring-boot-starter-data-jpa:2.6.3

select first 1 header_
select header_
insert into header_
insert into line_
select dbinfo('serial8') from informix.systables where tabid=1
insert into line_
select dbinfo('serial8') from informix.systables where tabid=1
A different object with the same identifier value was already associated with the session :
 nested exception is javax.persistence.EntityExistsException:
A different object with the same identifier value was already associated with the session

Tuesday, November 23, 2021

how to use reactor scheduler in micro-services

Depending on how many cores we have for your micro-services, we may have as low as 4 threads (reactor-http-nio- or reactor-http-epoll-) when it comes to listening and talking to outside. If these threads are blocked in a way we didn't expect, the performance could be worse than traditional synchronised paradigm. Here're a few examples to show how it works when offloading blocking operations to a larger thread pool at different places. Logs happen at doOnSubscribe and doOnSuccess.

no scheduler
[ctor-http-nio-4] Controller     : Received request
[ctor-http-nio-4] ServiceClient  : Getting something
[ctor-http-nio-4] ServiceClient  : Got something in 116ms
[ctor-http-nio-4] Controller     : Processed in 120ms

scheduler on subscribeOn WebClient call to 3rd party
[ctor-http-nio-3] Controller     : Received request
[    scheduler-3] ServiceClient  : Getting something
[ctor-http-nio-4] ServiceClient  : Got something in 116ms
[ctor-http-nio-4] Controller     : Processed in 120ms

scheduler on publishOn WebClient call to 3rd party
[ctor-http-nio-5] Controller     : Received request
[ctor-http-nio-5] ServiceClient  : Getting something
[   scheduler-12] ServiceClient  : Got something in 116ms
[   scheduler-12] Controller     : Processed in 120ms

scheduler on subscribeOn and publishOn WebClient call to 3rd party
[ctor-http-nio-3] Controller     : Received request
[    scheduler-3] ServiceClient  : Getting something
[    scheduler-4] ServiceClient  : Got something in 116ms
[    scheduler-4] Controller     : Processed in 120ms

Bonus cases to make things even tricky.

subscribeOn after doOnSubscribe in controller
[undedElastic-21] Controller     : Received request
[undedElastic-21] ServiceClient  : Getting something
[ctor-http-nio-7] ServiceClient  : Got something in 116ms
[ctor-http-nio-7] Controller     : Processed in 120ms

subscribeOn before doOnSubscribe in controller
[ctor-http-nio-3] Controller     : Received request
[undedElastic-21] ServiceClient  : Getting something
[ctor-http-nio-4] ServiceClient  : Got something in 116ms
[ctor-http-nio-4] Controller     : Processed in 120ms

Tuesday, May 11, 2021

Customise IntelliJ IDEA

I'm happy with default behaviour of this IDE overall. Here're the only couple of settings I'd like to change.


Wednesday, April 03, 2013

Enable Full Text Search for MongoDB

If you get this in mongo console
db.coll.ensureIndex({'content':'text'})
{
    "err" : "text search not enabled",
    "code" : 16633,
    "n" : 0,
    "connectionId" : 1,
    "ok" : 1
}

, and this in mongod console
[conn1] insert test.system.indexes keyUpdates:0 exception: text search not enabled code:16633 locks(micros) w:336411 336ms

, you need to enable full text search when starting MongoDB.
mongod --setParameter textSearchEnabled=true

Try again.
db.coll.ensureIndex({'content':'text'})

What's happening in background?
[initandlisten] connection accepted from 127.0.0.1:51347 #1 (1 connection now open)
[conn1] build index test.coll { _fts: "text", _ftsx: 1 }
[conn1]     Index: (1/3) External Sort Progress: 3500/6245 56%
[conn1]     Index: (1/3) External Sort Progress: 5400/6245 86%
[conn1]  external sort used : 413 files in 25 secs
[conn1]     Index: (2/3) BTree Bottom Up Progress: 185800/2616966 7%
[conn1]     Index: (2/3) BTree Bottom Up Progress: 401900/2616966 15%
[conn1]     Index: (2/3) BTree Bottom Up Progress: 554200/2616966 21%
[conn1]     Index: (2/3) BTree Bottom Up Progress: 769700/2616966 29%
[conn1]     Index: (2/3) BTree Bottom Up Progress: 973700/2616966 37%
[conn1]     Index: (2/3) BTree Bottom Up Progress: 1175400/2616966 44%
[conn1]     Index: (2/3) BTree Bottom Up Progress: 1380700/2616966 52%
[conn1]     Index: (2/3) BTree Bottom Up Progress: 1588900/2616966 60%
[conn1]     Index: (2/3) BTree Bottom Up Progress: 1794900/2616966 68%
[conn1]     Index: (2/3) BTree Bottom Up Progress: 1936500/2616966 73%
[conn1]     Index: (2/3) BTree Bottom Up Progress: 2125800/2616966 81%
[conn1]     Index: (2/3) BTree Bottom Up Progress: 2315800/2616966 88%
[conn1]     Index: (2/3) BTree Bottom Up Progress: 2528700/2616966 96%
[conn1]  done building bottom layer, going to commit
[conn1] build index done. scanned 6245 total records. 160.617 secs
[conn1] insert test.system.indexes ninserted:1 keyUpdates:0 locks(micros) w:160642416 160645ms

Check indexes.
db.coll.getIndexes()
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "ns" : "test.coll",
        "name" : "_id_"
    },
    {
        "v" : 1,
        "key" : {
            "_fts" : "text",
            "_ftsx" : 1
        },
        "ns" : "test.coll",
        "name" : "content_text",
        "weights" : {
            "content" : 1
        },
        "default_language" : "english",
        "language_override" : "language",
        "textIndexVersion" : 1
    }
]

Check index size. It's about half the text size it indexed.
db.coll.stats()
{
    "ns" : "test.coll",
    "count" : 6245,
    "size" : 69054068,
    "avgObjSize" : 11057.496877502002,
    "storageSize" : 178520064,
    "numExtents" : 12,
    "nindexes" : 4,
    "lastExtentSize" : 49213440,
    "paddingFactor" : 1.0000000000003018,
    "systemFlags" : 0,
    "userFlags" : 1,
    "totalIndexSize" : 86314032,
    "indexSizes" : {
        "_id_" : 212576,
        "content_text" : 85381968
    },
    "ok" : 1
}

Have a test.
db.coll.runCommand("text", {search:'Hello'})
{
    "queryDebugString" : "hello||||||",
    "language" : "english",
    "results" : []
    "stats" : {
        "nscanned" : 4,
        "nscannedObjects" : 0,
        "n" : 4,
        "nfound" : 4,
        "timeMicros" : 157
    },
    "ok" : 1
}

Not bad.

Sunday, December 23, 2012

Spring schema declaration

ERROR [ContextLoader] Context initialization failed
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Failed to import bean definitions from relative location [Context.xml]
Offending resource: class path resource [Context.xml]; nested exception is org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line xx in XML document from class path resource [Context.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'beans'. One of '{"http://www.springframework.org/schema/beans":import, "http://www.springframework.org/schema/beans":alias, "http://www.springframework.org/schema/beans":bean, WC[##other:"http://www.springframework.org/schema/beans"]}' is expected.

Caused by: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line xx in XML document from class path resource [Context.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'beans'. One of '{"http://www.springframework.org/schema/beans":import, "http://www.springframework.org/schema/beans":alias, "http://www.springframework.org/schema/beans":bean, WC[##other:"http://www.springframework.org/schema/beans"]}' is expected.

Caused by: org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'beans'. One of '{"http://www.springframework.org/schema/beans":import, "http://www.springframework.org/schema/beans":alias, "http://www.springframework.org/schema/beans":bean, WC[##other:"http://www.springframework.org/schema/beans"]}' is expected.

If you got this error, check you xsi:schemaLocation element, make sure schema file has version number in its location, like

http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd

Wednesday, September 07, 2011

Java development using Ubuntu 11.10 and OpenJDK 7


I tried Ubuntu 11.10 Oneiric Ocelot Beta 1. LightDM is lighter and beautiful. Maybe I can keep using Ubuntu on my ThinkPad T42, rather than jumping onto Lubuntu.

Due to the retiring of the "Operating System Distributor License for Java (DLJ)", Sun / Oracle JDKs / JREs cannot be installed by enabling Canonical Partners' repository any more. It's a good news to OpenJDK. With more usage of OpenJDK, we can expect higher priority and fewer bugs.

Since Java 7 is out, the first thing I did is installing OpenJDK 7. From Ubuntu Software Centre, you can only install JRE. I miss Synaptic Package Manager.
sudo apt-get install openjdk-7-jdk

Change default JRE of system from OpenJDK 6 to 7.
sudo update-alternatives --config java

I got following error when installing Subclipse plugin to Eclipse.
An internal error occurred during: "Install download0".
Library /usr/lib/i386-linux-gnu/libsoftokn3.so does not exist

Creating a symbolic link sovled it.
cd /usr/lib/i386-linux-gnu/
sudo ln -s nss/libsoftokn3.so libsoftokn3.so

After Subclipse is installed, I had a small problem in starting Eclipse 3.7 Indigo, but it's a common one.

sudo apt-get install libsvn-java
and
-Djava.library.path=/usr/lib/jni
in eclipse.ini solved it.

m2eclipse and Google plugin for Eclipse work out of box. Maven 3.0.3 works fine with OpenJDK 7.

Apache Tomcat 7.0.21 works fine with OpenJDK 1.7.0 but if you haven't created the above symbolic link, you'll get below error when starting Tomcat.
java.security.ProviderException: Library /usr/lib/i386-linux-gnu/libsoftokn3.so does not exist
at sun.security.pkcs11.SunPKCS11.(SunPKCS11.java:292)
at sun.security.pkcs11.SunPKCS11.(SunPKCS11.java:103)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)

I also tried to install Gnome Shell.
sudo apt-get purge gnome-shell

Installation finished successfully but later when I specified Gnome to login, I got a dialog box saying
failed to load session "gnome"

There are a couple of solutions to the problem but none works for me, so I installed classic Gnome.
sudo apt-get install gnome-session-fallback

A fantastic experience, I'm looking forward to its release next month.

Wednesday, August 10, 2011

Return code 400 when creating a new feature type

I came across a 400 return code when I tried to use REST Configuration API of GeoServer to create a new feature type. The reference doesn't give any explanation to it. From GeoServer's log, I got

ERROR [geoserver.rest] - No such feature type:
ERROR [geoserver.rest] -org.geoserver.rest.RestletException
        at org.geoserver.catalog.rest.FeatureTypeFinder.findTarget(FeatureTypeFinder.java:40)
        at org.restlet.Finder.handle(Finder.java:268)
        at org.geoserver.rest.BeanDelegatingRestlet.handle(BeanDelegatingRestlet.java:37)
        at org.restlet.Filter.doHandle(Filter.java:105)
        at org.restlet.Filter.handle(Filter.java:134)
        at org.restlet.Router.handle(Router.java:444)
        at com.noelios.restlet.ext.servlet.ServletConverter.service(ServletConverter.java:129)
        at org.geoserver.rest.RESTDispatcher.handleRequestInternal(RESTDispatcher.java:77)

INFO [org.geoserver] - Loaded feature type '', enabled

ERROR [geoserver.rest] - Trying to create new feature type inside the store, but no attributes were specified
ERROR [geoserver.rest] -org.geoserver.rest.RestletException
        at org.geoserver.catalog.rest.FeatureTypeResource.buildFeatureType(FeatureTypeResource.java:174)
        at org.geoserver.catalog.rest.FeatureTypeResource.handleObjectPost(FeatureTypeResource.java:124)
        at org.geoserver.rest.ReflectiveResource.handlePost(ReflectiveResource.java:122)
        at org.restlet.Finder.handle(Finder.java:296)
        at org.geoserver.rest.BeanDelegatingRestlet.handle(BeanDelegatingRestlet.java:37)
        at org.restlet.Filter.doHandle(Filter.java:105)
        at org.restlet.Filter.handle(Filter.java:134)
        at org.restlet.Router.handle(Router.java:444)
        at com.noelios.restlet.ext.servlet.ServletConverter.service(ServletConverter.java:129)
        at org.geoserver.rest.RESTDispatcher.handleRequestInternal(RESTDispatcher.java:77)

It shows that I'm trying to publish a feature type that doesn't exist. Problem solved here but I'd like to go the extra mile, check the source of FeatureTypeResource#buildFeatureType.

170  if(fti.getName() == null) {
171     throw new RestletException("Trying to create new feature type inside the store, " +
172              "but no feature type name was specified", Status.CLIENT_ERROR_BAD_REQUEST);
173  } else if(fti.getAttributes() == null || fti.getAttributes() == null) {
174      throw new RestletException("Trying to create new feature type inside the store, " +
175              "but no attributes were specified", Status.CLIENT_ERROR_BAD_REQUEST);
176  }

WTF is line 173 doing?

Thursday, March 24, 2011

How to add another data source in JPA

It's quite easy to create a data source using JPA support of Spring framework. It not so difficult to add another data source to your application as well.

In META-INF/persistence.xml, define another persistence unit.

     <persistence-unit name="anotherUnit" transaction-type="RESOURCE_LOCAL">  
         <class>com.youcompany.YourClass</class>  
         <exclude-unlisted-classes>true</exclude-unlisted-classes>  
         <properties>  
             <property name="hibernate.hbm2ddl.auto" value="update" />  
             <!-- validate | update | create | create-drop -->  
         </properties>  
     </persistence-unit>  

Note that you should define all the domain classes you will be using in the defined persistence unit in <class> elements.

Define another database context xml file.
 <?xml version="1.0" encoding="UTF-8"?>  
 <beans xmlns="http://www.springframework.org/schema/beans"  
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
     xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p"  
     xmlns:aop="http://www.springframework.org/schema/aop"  
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context-3.0.xsd
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
     http://www.springframework.org/schema/aop
     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">  
     <!-- holding properties for database connectivity / -->  
     <context:property-placeholder location="classpath:config.properties" />  
     <bean id="anotherDataSource" class="org.apache.commons.dbcp.BasicDataSource"  
         destroy-method="close">  
         <property name="driverClassName" value="${db.driver}" />  
         <property name="url" value="${db.url}" />  
         <property name="username" value="${db.user}" />  
         <property name="password" value="${db.pass}" />  
         <property name="validationQuery" value="${dbcp.validationQuery}" />  
         <property name="testWhileIdle" value="${dbcp.testWhileIdle}" />  
         <property name="timeBetweenEvictionRunsMillis" value="${dbcp.timeBetweenEvictionRunsMillis}" />  
         <property name="numTestsPerEvictionRun" value="${dbcp.numTestsPerEvictionRun}" />  
         <property name="minEvictableIdleTimeMillis" value="${dbcp.minEvictableIdleTimeMillis}" />  
     </bean>  
     <bean id="anotherJpaAdapter"  
         class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"  
         p:database="${db.database}" p:showSql="${db.showSql}" />  
     <bean id="anotherEntityManagerFactory"  
         class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"  
         p:dataSource-ref="anotherDataSource" p:jpaVendorAdapter-ref="anotherJpaAdapter">  
         <property name="loadTimeWeaver">  
             <bean  
                 class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />  
         </property>  
         <property name="persistenceUnitName" value="anotherUnit"></property>  
     </bean>  
     <bean id="anotherTxManager" class="org.springframework.orm.jpa.JpaTransactionManager"  
         p:entityManagerFactory-ref="anotherEntityManagerFactory" />  
 </beans>  

In the JPA implementation of generic DAO class, annotate the 1st persistence unit in the setter of EntityManager.

     protected EntityManager entityManager;  
     @PersistenceContext(unitName="firstUnit")  
     public void setEntityManager(EntityManager entityManager) {  
         this.entityManager = entityManager;  
     }  

Create another generic DAO class for new persistence unit. All the operations to the new domain objects should be accomplished via this new generic DAO.

If you want to access data source directly, use
     @Autowired  
     @Qualifier("anotherDataSource")  
     private DataSource dataSource;  

Don't forget to getAutoCommit and keep the status of any connection you get from data source if you need to setAutoCommit yourself, and close the connection in finally statement.

That's it.

Tuesday, September 14, 2010

These user agents have accessed myTunes

myTunes is my personal project aggregating popular Chinese podcasts finished in 2006. Its core functions are generating dynamic RSS feeds (such as all the video contents, all the mp3 contents, etc), and providing OPML, which iTunes supports from several years ago. The UI, which is just a consumer of myTunes' API (RSS and OPML), is implemented in JSF.

I promised to publish all the user agents that have accessed myTunes and I think it's the right time now.


Thanks Datong for this pretty logo.


To the iPod mini 1st generation my sister bought me
To Java Studio Creator I used to create the web UI
To Bloglines that will officially shut down on October 1, 2010

1:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1a2) Gecko/20060512 BonEcho/2.0a2  
2:  msnbot/1.0 (+http://search.msn.com/msnbot.htm)  
3:  iTunes/6.0.5 (Windows; N)  
4:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)  
5:  Opera/9.00 (Windows NT 5.1; U; en)  
6:  INTERNET-DOWNLOAD  
7:  Opera/9.00 (Windows NT 5.1; U; zh-cn)  
8:  Maxthon  
9:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4  
10:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; (R1 1.3))  
11:  iTunes/6.0.4 (Windows; N)  
12:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TencentTraveler ; Maxthon; (R1 1.5))  
13:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TencentTraveler ; (R1 1.5))  
14:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; (R1 1.3); eBook)  
15:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)  
16:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1b1) Gecko/20060707 Firefox/2.0b1  
17:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.4) Gecko/20060620 Firefox/1.5.0.4 Flock/0.7.1  
18:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20060709 Minefield/3.0a1  
19:  User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Q312461; .NET CLR 1.1.4322)  
20:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; InfoPath.1)  
21:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)  
22:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060608 Ubuntu/dapper-security Firefox/1.5.0.4  
23:  MagpieRSS/0.7 (+http://magpierss.sf.net)  
24:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)  
25:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)  
26:  J. River Internet Reader/2.0 (compatible; Windows-Media-Player/10)  
27:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; InfoPath.2)  
28:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.7.12) Gecko/20050919 Firefox/1.0.7  
29:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TencentTraveler )  
30:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)  
31:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; Alexa Toolbar)  
32:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4  
33:  iTunes/6.0.2 (Windows; N)  
34:  Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4  
35:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; {F5AD05F1-C763-DDDE-CDC9-FBC473231D46}; .NET CLR 1.1.4322)  
36:  Mozilla/5.0 (X11; U; Linux i686; ja-JP; rv:1.7.13) Gecko/20060414 CentOS/1.0.8-1.4.1.centos4 Firefox/1.0.8  
37:  Mozilla/5.0 (compatible) GM RSS Panel  
38:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GOSURF - BETA; GOSURF; .NET CLR 1.1.4322)  
39:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MyIE2)  
40:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; POTU(RR:26060619:0); .NET CLR 2.0.50727; InfoPath.2)  
41:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)  
42:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Alexa Toolbar; mxie; SV1; POTU(RR:26060619:0); roguecleaner; .NET CLR 1.1.4322)  
43:  iTunes/6.0.5 (Macintosh; N; PPC)  
44:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; KKman3.0; .NET CLR 1.1.4322)  
45:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705)  
46:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Maxthon)  
47:  iTunes/6.0.1 (Windows; N)  
48:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; FunWebProducts)  
49:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon)  
50:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)  
51:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X; zh-cn) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.9.2  
52:  AppleSyndication/51  
53:  Feedfetcher-Google; (+http://www.google.com/feedfetcher.html)  
54:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Maxthon; .NET CLR 1.1.4322)  
55:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Alexa Toolbar)  
56:  Zhuaxia.com 1 Subscribers  
57:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; TencentTraveler )  
58:  Zhuaxia.com 2 Subscribers  
59:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2  
60:  FeedValidator/1.3  
61:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; zh-tw) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3  
62:  AppleSyndication/54  
63:  foobar2000 v0.9.2  
64:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)  
65:  Feedreader 3.05 (Powered by Newsbrain)  
66:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 2.0.50727)  
67:  Mozilla/4.0 (compatible; Google Desktop)  
68:  Java/1.5.0_07  
69:  myTunes/1.0  
70:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Alexa Toolbar)  
71:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.5) Gecko/20060719 Firefox/1.5.0.5  
72:  Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4  
73:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Maxthon)  
74:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; TencentTraveler ; (R1 1.5))  
75:  iPodder/2.2beta1 (Windows) +http://ipodder.sf.net/  
76:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 2.0.50727; .NET CLR 1.1.4322)  
77:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.5) Gecko/20060719 Firefox/1.5.0.5  
78:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060727 Ubuntu/dapper-security Firefox/1.5.0.5  
79:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060731 Ubuntu/dapper-security Firefox/1.5.0.5  
80:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; POTU(1.13); .NET CLR 1.1.4322; .NET CLR 2.0.50727)  
81:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 1.1.4322)  
82:  Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 4.0)  
83:  Mozilla/5.0 (compatible;heritrix-1.8.0 +http://www.business.com)  
84:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6  
85:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; TencentTraveler )  
86:  Opera/9.00 (X11; Linux i686; U; en)  
87:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TencentTraveler ; InfoPath.1)  
88:  iTunes/6.0 (Windows; N)  
89:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)  
90:  potu 0.7 (+http://www.potu.com/)  
91:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; POTU(1.13); .NET CLR 1.1.4322; .NET CLR 2.0.50727)  
92:  Gigabot/2.0; http://www.gigablast.com/spider.html  
93:  ia_archiver  
94:  Mozilla/5.0 (PC; U; Intel; Windows; en) AppleWebKit/420+ (KHTML, like Gecko)  
95:  Live.Com Feed Manager  
96:  Opera/9.01 (Windows NT 5.1; U; zh-cn)  
97:  iTunes/6.0.3 (Windows; N)  
98:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; POTU(RR:26060619:0); TencentTraveler ; InfoPath.1)  
99:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; FunWebProducts; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 2.0.50727)  
100:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 2.0.50727)  
101:  Mozilla/5.0 (compatible; Google Desktop)  
102:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20051111 Firefox/1.5  
103:  Protopage/3.0 (http://www.protopage.com)  
104:  Pageflakes/1.0 (WinNT 5.1.2600.0; http://www.pageflakes.com; 1 subscribers )  
105:  Netvibes (http://www.netvibes.com/; 1 subscriber)  
106:  Netvibes (http://www.netvibes.com/; 1 subscribers)  
107:  Netvibes (http://www.netvibes.com/; 2 subscribers)  
108:  lanshanbot/1.0  
109:  Mozilla/6.0 (MSIE 6.0; Windows NT 5.1;Foxmail/MILOWU)  
110:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; zh-cn) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.3  
111:  AppleSyndication/52  
112:  iTunes/6.0.5 (Macintosh; N; Intel)  
113:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)  
114:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Avant Browser; Avant Browser)  
115:  Mozilla/4.0 (compatible;)  
116:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322; .NET CLR 2.0.50727)  
117:  gnome-vfs/2.14.2 neon/0.25.4  
118:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6  
119:  msnbot-media/1.0 (+http://search.msn.com/msnbot.htm)  
120:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; MyIE2; .NET CLR 1.1.4322)  
121:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)  
122:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3  
123:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; TencentTraveler ; .NET CLR 1.0.3705; .NET CLR 1.1.4322)  
124:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3  
125:  Ensemble/1.0 (http://pyxis-project.net/)  
126:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)  
127:  Exabot/3.0  
128:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MyIE2; Maxthon)  
129:  Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)  
130:  iTunes/7.0 (Macintosh; N; Intel)  
131:  iTunes/7.0 (Macintosh; N; PPC)  
132:  msnbot/0.9 (+http://search.msn.com/msnbot.htm)  
133:  iTunes/7.0 (Windows; N)  
134:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X; zh-cn) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3  
135:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.5) Gecko/20060802 Firefox/1.5.0.5 Flock/0.7.4.1  
136:  Mozilla/5.0 (compatible; Yahoo! Slurp China; http://misc.yahoo.com.cn/help.html)  
137:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.2)  
138:  MSN Feed Manager  
139:  Live (http://www.live.com/)  
140:  Zhuaxia.com 3 Subscribers  
141:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; Alexa Toolbar)  
142:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; zh-CN; rv:1.8.1b2) Gecko/20060821 Firefox/2.0b2  
143:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7  
144:  Grazr/Beta1vX0.2  
145:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; 5460)  
146:  Mozilla/4.0 (compatible; Nokia Podcasting; SymbianOS)  
147:  http://Anonymouse.org/ (Unix)  
148:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.2  
149:  Grazr/v1.0  
150:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; zh-CN; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7  
151:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TencentTraveler ; .NET CLR 1.1.4322)  
152:  Mozilla/5.0 (000000000; 0; 00000 000 00 0; 00000) 00000000000000000 0000000 0000 000000 000000000000  
153:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7  
154:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.7) Gecko/20060921 Ubuntu/dapper-security Firefox/1.5.0.7  
155:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; zh-cn) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3  
156:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X; zh-cn) AppleWebKit/85.8.5 (KHTML, like Gecko) Safari/85.8.1  
157:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7  
158:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Tablet PC 1.7; .NET CLR 1.0.3705; .NET CLR 1.1.4322)  
159:  FeedBurner/1.0 (http://www.FeedBurner.com)  
160:  iTunes/7.0 (000000000; 0; 00000)  
161:  Opera/9.02 (Windows NT 5.0; U; zh-cn)  
162:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Maxthon; SV1)  
163:  Mozilla/5.0 (compatible; Yahoo! DE Slurp; http://help.yahoo.com/help/us/ysearch/slurp)  
164:  Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)  
165:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MyIE2; TencentTraveler ; .NET CLR 1.1.4322)  
166:  iTunes/7.0.1 (Macintosh; N; Intel)  
167:  Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)  
168:  iTunes/7.0.1 (Windows; N)  
169:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1; Maxthon 2.0)  
170:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20050920 Firefox/1.0.7  
171:  Opera/9.02 (Macintosh; PPC Mac OS X; U; zh-cn)  
172:  Bloglines/3.1 (http://www.bloglines.com; 1 subscriber)  
173:  iTunes/7.0.1 (Macintosh; N; PPC)  
174:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; InfoPath.1; .NET CLR 1.1.4322)  
175:  iTunes/7.0.1 (000000000; 0; 00000)  
176:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; Alexa Toolbar; mxie; .NET CLR 1.1.4322)  
177:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322)  
178:  Windows-RSS-Platform/1.0 (MSIE 7.0; Windows NT 5.1)  
179:  NutchCVS/0.7.2 (Nutch; http://lucene.apache.org/nutch/bot.html; nutch-agent@lucene.apache.org)  
180:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3  
181:  OutfoxBot/0.5 (for internet experiments; http://; outfoxbot@gmail.com)  
182:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X; zh-cn) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3  
183:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1)  
184:  FeedValidator/1.21 +http://feeds.archive.org/validator/  
185:  Frontier/9.0.1 (WinNT)  
186:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; zh-tw) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3  
187:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3  
188:  Mozilla/4.76 [en] (PalmOS; U; WebPro/3.0.1a; palm-MT64)  
189:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1) Gecko/20060918 Firefox/2.0  
190:  Mozilla/4.0 (compatible; MSIE 6.0; Bluecoat DRTR)  
191:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; GOSURF; RogueCleaner; .NET CLR 1.1.4322; Creative ZENcast v1.02.12)  
192:  Creative ZENcast v1.02.12  
193:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; GOSURF; .NET CLR 1.1.4322; InfoPath.1; Creative ZENcast v1.02.12)  
194:  Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-TW; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7  
195:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Poco 0.31; .NET CLR 2.0.50727)  
196:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1b2) Gecko/20060821 Firefox/2.0b2  
197:  Zhuaxia.com 0 Subscribers  
198:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TencentTraveler ; InfoPath.1; .NET CLR 1.1.4322)  
199:  gnome-vfs/2.16.1 neon/0.25.4  
200:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0  
201:  ZTE-Me/Mobile  
202:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0  
203:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1) Gecko/20060601 Firefox/2.0 (Ubuntu-edgy)  
204:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Poco 0.31; Maxthon)  
205:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X; zh-tw) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3  
206:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060909 (FoxPlus) Firefox/1.5.0.7  
207:  Mozilla/4.0  
208:  Shim-Crawler(Mozilla-compatible; http://www.logos.ic.i.u-tokyo.ac.jp/crawler/; crawl@logos.ic.i.u-tokyo.ac.jp)  
209:  iTunes/7.0.2 (Macintosh; N; PPC)  
210:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727; Alexa Toolbar; .NET CLR 1.0.3705)  
211:  iTunes/7.0.2 (Macintosh; N; Intel)  
212:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; MyIE2; .NET CLR 1.1.4322; .NET CLR 1.0.3705)  
213:  iTunes/7.0.2 (Windows; N)  
214:  Grazr/v1.1  
215:  iTunes/7.0.2 (000000000; 0; 00000)  
216:  XML-FeedPP/0.16 XML-TreePP/0.18 libwww-perl/5.803  
217:  Mozilla/2.0 (compatible; Ask Jeeves/Teoma; +http://about.ask.com/en/docs/about/webmasters.shtml)  
218:  Juice/2.2 (Windows) +http://juicereceiver.sf.net/  
219:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)  
220:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0  
221:  iTunes/6.0.4 (Macintosh; N; Intel)  
222:  Opera/9.02 (Windows NT 5.1; U; zh-cn)  
223:  Ziepod+ 0.99.1 (www.ziepod.com;MediaAggregator&Player; Windows NT 5.1)  
224:  Opera/9.01 (Windows NT 5.1; U; en)  
225:  <a href='http://www.netforex.org'> Forex Trading Network Organization </a> info@netforex.org  
226:  iTunes/5.0.1 (Windows; N)  
227:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; MyIE2; Maxthon)  
228:  Mozilla/4.0 (Mozilla; http://www.mozilla.org/docs/en/bot.html; master@mozilla.com)  
229:  Ziepod 0.99.1 (www.ziepod.com;PodcastReceiver&Player; Windows NT 5.1)  
230:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; (R1 1.5); .NET CLR 1.1.4322)  
231:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.5) Gecko/20060719 (FoxPlus) Firefox/1.5.0.5  
232:  ichiro/2.0 (http://help.goo.ne.jp/door/crawler.html)  
233:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)  
234:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.03)  
235:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; InfoPath.2; MSOffice 12)  
236:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0  
237:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Poco 0.31; .NET CLR 1.1.4322)  
238:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)  
239:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; Creative ZENcast v1.02.12)  
240:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)  
241:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8  
242:  Quick News by Stand Alone, Inc.  
243:  Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.8.1) Gecko/20060601 Firefox/2.0 (Ubuntu-edgy)  
244:  iPodder-linux/2.1.9 +http://ipodder.sf.net/  
245:  Python-urllib/1.16  
246:  NokiaE61-1/3.0 (2.0618.06.05) SymbianOS/9.1 Series60/3.0 Profile/MIDP-2.0 Configuration/CLDC-1.1  
247:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.2; MSOffice 12)  
248:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Q312461)  
249:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8  
250:  RSSMicro.com RSS/Atom Feed Robot  
251:  Mozilla/4.0(compatible; MSIE 6.0; Windows NT 5.1; SV1)  
252:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-us) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3  
253:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Mister X)  
254:  iTunes/6.0.2 (Macintosh; N; Intel)  
255:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon; .NET CLR 1.1.4322)  
256:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1) Gecko/20061024 BonEcho/2.0  
257:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; InfoPath.1)  
258:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 2.0.50727; InfoPath.1)  
259:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MyIE2; Maxthon; .NET CLR 1.1.4322; .NET CLR 2.0.50727)  
260:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 1.1.4322; InfoPath.1)  
261:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; ja-JP-mac; rv:1.8.1) Gecko/20061010 Firefox/2.0  
262:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8  
263:  sogou spider  
264:  Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8  
265:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1  
266:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20061204 GranParadiso/3.0a1  
267:  iSiloX/4.32 Windows/32  
268:  iTunes/6.0.1 (Macintosh; N; PPC)  
269:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; HbTools 4.7.7)  
270:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9  
271:  Mozilla/4.0 (compatible; MSIE 6.0; ; Linux i686) Opera 7.50 [en]  
272:  Opera/9.10 (Windows NT 5.1; U; zh-cn)  
273:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1  
274:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1  
275:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)  
276:  Mozilla/5.0 (000000000; 0; 00000 000 00 0; 00000; 0000000000) 00000000000000 000000000000000  
277:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en)  
278:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20060601 Firefox/2.0.0.1 (Ubuntu-edgy)  
279:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)  
280:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Hotbar 4.5.1.0; .NET CLR 1.1.4322)  
281:  Mozilla/4.0 (compatible; MSIE 6.0; Symbian OS; Nokia E61/0633.09.04; 9730) Opera 8.65 [zh-CN]  
282:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9  
283:  Mozilla/4.0 (PSP (PlayStation Portable); 2.00)  
284:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322; InfoPath.1)  
285:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1  
286:  Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1  
287:  XML-FeedPP/0.19 XML-TreePP/0.19 libwww-perl/5.76  
288:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; InfoPath.1; .NET CLR 1.1.4322)  
289:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Alexa Toolbar; .NET CLR 2.0.50727; InfoPath.1)  
290:  Mozilla/5.0 (compatible; Exabot/3.0; +http://www.exabot.com/go/robot)  
291:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041215 Firefox/1.0 Red Hat/1.0-12.EL4  
292:  Mozilla/4.0 (compatible; MSIE 6.0; Windows 98)  
293:  Avbrno cuoreyagh tcjrig  
294:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; FunWebProducts; .NET CLR 1.1.4322)  
295:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; FunWebProducts)  
296:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2  
297:  curl/7.13.1 (powerpc-apple-darwin8.0) libcurl/7.13.1 OpenSSL/0.9.7l zlib/1.2.3  
298:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20060601 Firefox/2.0.0.2 (Ubuntu-edgy)  
299:  Grazr/v1.2  
300:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Media Center PC 3.0; .NET CLR 1.0.3705; .NET CLR 1.1.4322)  
301:  iTunes/7.1 (Macintosh; N; Intel)  
302:  iTunes/7.1 (000000000; 0; 00000)  
303:  iTunes/7.1 (Macintosh; N; PPC)  
304:  iTunes/7.1 (Windows; N)  
305:  Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2  
306:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; zh-cn) AppleWebKit/418.9.1 (KHTML, like Gecko) Safari/419.3  
307:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2  
308:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; QihooBot 1.0 qihoobot@qihoo.net)  
309:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; TencentTraveler ; .NET CLR 2.0.50727)  
310:  Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2  
311:  Resco News  
312:  Mozilla/5.0 (compatible; Konqueror/3.4; Linux) KHTML/3.4.3 (like Gecko)  
313:  Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.7.13) Gecko/20050610 K-Meleon/0.9  
314:  Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)  
315:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler ; .NET CLR 1.1.4322)  
316:  Feedfetcher-Google; (+http://www.google.com/feedfetcher.html; 1 subscribers; feed-id=3254972797126430783)  
317:  Feedfetcher-Google; (+http://www.google.com/feedfetcher.html; 1 subscribers; feed-id=10516567267389403425)  
318:  iTunes/7.1.1 (Macintosh; N; PPC)  
319:  iTunes/7.1.1 (Windows; N)  
320:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; KuGooSoft)  
321:  iTunes/7.1.1 (Macintosh; N; Intel)  
322:  NextGenSearchBot 1 (for information visit http://about.zoominfo.com/About/NextGenSearchBot.aspx)  
323:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)  
324:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.9.1 (KHTML, like Gecko) Safari/419.3  
325:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Embedded Web Browser from: http://bsalsa.com/; .NET CLR 1.1.4322; .NET CLR 2.0.50727)  
326:  Creative ZENcast v1.04.06  
327:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3  
328:  iTunes/7.1.1 (000000000; 0; 00000)  
329:  ShopWiki/1.0 ( +http://www.shopwiki.com/wiki/Help:Bot)  
330:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3  
331:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)  
332:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11  
333:  Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)  
334:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11  
335:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; NetCaptor 7.5.4)  
336:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1; .NET CLR 1.1.4322)  
337:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.3) Gecko/20060601 Firefox/2.0.0.3 (Ubuntu-edgy)  
338:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; i-NavFourF; Embedded Web Browser from: http://bsalsa.com/; .NET CLR 1.1.4322)  
339:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; zh-cn) Opera 9.02  
340:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; KuGooSoft)  
341:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; InfoPath.1; Maxthon 2.0)  
342:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; ja-JP-mac; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3  
343:  Feedfetcher-Google; (+http://www.google.com/feedfetcher.html; 1 subscribers; feed-id=18276495934853990384)  
344:  Opera/9.20 (Windows NT 5.1; U; zh-cn)  
345:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0  
346:  Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0  
347:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3  
348:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TencentTraveler ; .NET CLR 2.0.50727)  
349:  Grazr/v2.0  
350:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11  
351:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.3) Gecko/20061201 Firefox/2.0.0.3 (Ubuntu-feisty)  
352:  gnome-vfs/2.18.1 neon/0.25.4  
353:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; POTU(RR:27011715:0); Maxthon; .NET CLR 2.0.50727)  
354:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; MSOffice 12)  
355:  Ziepod 0.99.9b2 (www.ziepod.com;PodcastReceiver&Player; Windows NT 5.1)  
356:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; Maxthon 2.0)  
357:  iTunes/4.9 (Windows; N)  
358:  Sogou Push Spider/3.0(+http://www.sogou.com/docs/help/webmasters.htm#07)  
359:  Feedfetcher-Google; (+http://www.google.com/feedfetcher.html; 1 subscribers; feed-id=15254394928724077235)  
360:  Feedfetcher-Google; (+http://www.google.com/feedfetcher.html; 1 subscribers; feed-id=8177589595128505927)  
361:  Mozilla/4.0 (compatible; MSIE 6.0)  
362:  Mozilla/5.0 (Windows; U; Win98; zh-CN; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3  
363:  iTunes/7.3.1 (Macintosh; N; PPC)  
364:  iTunes/7.3 (Windows; N)  
365:  iTunes/7.3.1 (Windows; N)  
366:  iTunes/7.3.1 (Macintosh; N; Intel)  
367:  iTunes/7.2 (Windows; N)  
368:  iTunes/7.3 (Macintosh; N; Intel)  
369:  iTunes/7.3.1 (000000000; 0; 00000)  
370:  Creative ZENcast v2.00.07  
371:  Opera/9.22 (Windows NT 5.1; U; zh-cn)  
372:  Mozilla/4.0 (compatible; NaverBot/1.0; http://help.naver.com/delete_main.asp)  
373:  Gigabot/3.0 (http://www.gigablast.com/spider.html)  
374:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5  
375:  Opera/9.22 (Macintosh; Intel Mac OS X; U; en)  
376:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/419.2.1 (KHTML, like Gecko) Safari/419.3  
377:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6  
378:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.5) Gecko/20061201 Firefox/2.0.0.5 (Ubuntu-feisty)  
379:  Liferea/1.0.52-2 (Linux; en_US; http://liferea.sf.net/)  
380:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Embedded Web Browser from: http://bsalsa.com/; TheWorld)  
381:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6  
382:  iTunes/7.3.2 (Macintosh; N; Intel)  
383:  iTunes/7.3.2 (Macintosh; N; PPC)  
384:  iTunes/7.3.2 (Windows; N)  
385:  iTunes/7.3.2 (000000000; 0; 00000)  
386:  iTunes/7.2 (Macintosh; N; Intel)  
387:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20061201 Firefox/2.0.0.6 (Ubuntu-feisty)  
388:  Mozilla/4.0 (compatible; MSIE 6.0; ; Linux armv5tejl; U) Opera 8.02 [en_US] Maemo browser 0.4.34 N770/SU-18  
389:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Media Center PC 3.0; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; MAXTHON 2.0)  
390:  Mozilla/5.0 (Twiceler-0.9 http://www.cuill.com/twiceler/robot.html)  
391:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727; MSN 6.1; MSNbMSFT; MSNmsc-cn; MSNc0z; v5m)  
392:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; (R1 1.5))  
393:  Opera/9.23 (Windows NT 5.1; U; zh-cn)  
394:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TheWorld)  
395:  Egress  
396:  Feedfetcher-Google; (+http://www.google.com/feedfetcher.html; 2 subscribers; feed-id=15254394928724077235)  
397:  iTunes/7.4 (Windows; N)  
398:  iTunes/7.4 (Macintosh; N; Intel)  
399:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh) AppleWebKit/522.13.1 (KHTML, like Gecko) Version/3.0.2 Safari/522.13.1  
400:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; Alexa Toolbar)  
401:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Mozilla/4.0(Compatible Mozilla/4.0(Compatible-EmbeddedWB 14.59 http://bsalsa.com/ EmbeddedWB- 14.59 from: http://bsalsa.com/ ; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)  
402:  iTunes/7.4 (Macintosh; N; PPC)  
403:  Sogou web spider/3.0(+http://www.sogou.com/docs/help/webmasters.htm#07)  
404:  iTunes/7.4.1 (Macintosh; N; PPC)  
405:  iTunes/7.4.1 (Macintosh; N; Intel)  
406:  iTunes/7.4.1 (Windows; N)  
407:  iTunes/7.4 (000000000; 0; 00000)  
408:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)  
409:  Mozilla/5.0 (compatible; Exabot Test/3.0; +http://www.exabot.com/go/robot)  
410:  MagpieRSS/0.72 (+http://magpierss.sf.net)  
411:  iTunes/7.4.2 (Windows; N)  
412:  iTunes/7.4.2 (Macintosh; N; Intel)  
413:  Opera/9.23 (Macintosh; Intel Mac OS X; U; zh-cn)  
414:  iTunes/7.4.1 (000000000; 0; 00000)  
415:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7  
416:  iTunes/7.4.2 (Macintosh; N; PPC)  
417:  iTunes/7.4.2 (000000000; 0; 00000)  
418:  Zhuaxia.com 4 Subscribers  
419:  Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.12) Gecko/20070531 Firefox/1.5.0.12 Flock/0.7.14  
420:  iTunes/7.3.1 (Windows; N), DynaWeb http://www.dit-inc.us/disclaimer.php  
421:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MAXTHON 2.0)  
422:  iTunes/7.4.3 (Windows; N)  
423:  Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.7.12) Gecko/20050921 Red Hat/1.0.7-1.4.1 Firefox/1.0.7  
424:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; zh-CN; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6  
425:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20070914 Firefox/2.0.0.6 Flock/0.9.1.0  
426:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 1.1.4322; InfoPath.2)  
427:  Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.8.1.8) Gecko/20071008 Firefox/2.0.0.8  
428:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 1.1.4322)  

Wednesday, August 11, 2010

Good practice in using java.util.concurrent

Concurrent package was introduced from Java 5 and still doesn't get reasonable acceptance. Traditional thread programming is just too strong for us to unlearn it. Several years ago, I created a task framework to solve commonly used scenario, a modified version (most changes are generic related) is used in a product I participated in 2008.

In my current project, I have a requirement of setting timeout for serials of web service operations, which is very suitable for concurrent package. I learned a good lesson from this simple task. I reckon I need to revise my framework one day.

The 1st lesson I learned is it's harder and not safe to set thread name to a Callable thread. One workaround is calling Thread.currentThread().setName() at the beginning of call(). But thread is not owned by Callable but by ExecutorService, so this might have some side-effects. Use it at your own risk.

The 2nd one is the overhead of creating and removing threads is much heavier than I imaged before. In debug mode you can see the process of creation and removal of threads, especially when you submit the thread in loops. Try your best to minimize the operations in call() and only call call() when necessary.

Third tip is by using Future.get(1L, TimeUnit.MILLISECONDS) and ignoring TimeoutException you get an asynchronized thread.

Last but not least is always cancel future and shutdown service. If you fail to do so, the callable will be in running status forever and eventually you'll have no memory to create any new thread. Although I don't see any difference between Future.cancel(true) and Future.cancel(false), ExecutorService.shutdown() and ExecutorService.shutdownNow() in my case.

Friday, July 30, 2010

createRecordComponent is not called for the first record created

I'm using Smart GWT 2.2 and facing a strange bug. The com.smartgwt.client.widgets.grid.ListGrid#createRecordComponent(ListGridRecord record, Integer colNum) is not called for the very first record. Thanks to smartgwt's popularity, I found some complaints and workarounds.

In Issue 450 - smartgwt - createRecordComponent(final ListGridRecord record, Integer colNum) {} never executed, someone suggested create a function that does all the job createRecordComponent is supposed to do and call this function explicitly. If this works, the event model needs also to be hacked, because nothing wrong in createRecordComponent. Hope he/she will contribute the solution to the product.

In createRecordComponent not called for changed record when refreshing ListGrid, another one suggested showRecordComponent must be implemented as well, if not all the columns' component are created in create/updateRecordComponent. Sounds simple but no matter showRecordComponent returns true or false, createRecordComponent still fails to be called.

What helped me is ListGrid.createRecordComponent not called unless a column is sorted. I don't call setSortField because I have no field to sort. I call ListGrid#sort after a new record is added and problem solved.

Tuesday, June 22, 2010

soapUI 3.5.1 on Ubuntu 10.04

Update: soapUI 3.6.1 on Ubuntu 10.10 doesn't have the following problem.

I got following error in my console when I tried to run soapUI on Ubuntu. It was started, after a blank splash screen, but cannot create a project.

Exception in thread "XpcMessageLoop" java.lang.NoSuchMethodError: com.jniwrapper.gtk.GTK.initialize([Ljava/lang/String;)V
    at com.teamdev.xpcom.impl.awt.linux.AwtLinuxPlatform.a(SourceFile:166)
    at com.teamdev.xpcom.impl.E.initialize(SourceFile:69)
    at com.teamdev.xpcom.c.run(SourceFile:150)

The solution is to uncomment the following line in soapui.sh
# JAVA_OPTS="$JAVA_OPTS -Dsoapui.jxbrowser.disable=true"

To set authentication information for a web service, use this dialog box.

Saturday, May 22, 2010

How to connect an InputStream to an OutputStream

In the FTP Proxy product, one basic requirement is to intercept upstream authentication commands (USER and PASS commands sent from FTP client to FTP server), finish customized authentication and then let FTP client and FTP server work together with following tasks.

For upstream commands, the proxy has an inputstream from client and an output stream to server; for downstream commands, it has an inputstream from server and an inputstream to client. An easy way to deal with it is StreamConnector.

Don't mix up with similar solutions like Convert a Java OutputStream to an InputStream and Java utilities for stream wiring and file format detection.

Saturday, May 08, 2010

Where is Sun Java?

Trust yourself should be 1st law in open source world.

I installed Ubuntu 10.04 and noticed Sun Java in not in default repository any more. I checked Ubuntu 10.04 LTS Release Notes and found

Sun Java moved to the Partner repository


For Ubuntu 10.04 LTS, the sun-java6 packages have been dropped from the Multiverse section of the Ubuntu archive. It is recommended that you use openjdk-6 instead.
If you can not switch from the proprietary Sun JDK/JRE to OpenJDK, you can install sun-java6 packages from the Canonical Partner Repository. You can configure your system to use this repository via command-line:
add-apt-repository "deb http://archive.canonical.com/ lucid partner"
Easy, but it's wrong. Here is how to enable partner's repository.
 
You can see the leftover of the wrong command. What a(nother) shame.

Friday, January 29, 2010

Submitted another bug to Eclipse

It's unavoidable to have ambiguous types in single Java file. The way to solve the problem is very easy, using fully qualified class name. Unfortunately, the Content Assist of Eclipse 3.6M4 is not that smart to generate correct code.

I submitted this bug to Eclipse today and let's see what will happen.

Monday, January 04, 2010

Schema of iTunes podcast feed

In 2006, in order to aggregate my favourite podcasts and share them with other iPod owners, I did a podcast aggregation service named myTunes.

I chose JAXB to map XML documents to Java objects and vice versa, so I need a schema or DTD file of iTunes podcast feed. Unfortunately I couldn't find one. I had to generate one myself.

I got an example feed from Apple. I removed a few elements that I think of no use at the moment and generated its schema.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" elementFormDefault="qualified">
    <xs:complexType name="channelType">
        <xs:sequence>
            <xs:element ref="title"/>
            <xs:element ref="link"/>
            <xs:element ref="language"/>
            <xs:element ref="description"/>
            <xs:element ref="pubDate"/>
            <xs:element name="image" type="imageType"/>
            <xs:element ref="copyright"/>
            <xs:element ref="subtitle"/>
            <xs:element ref="summary"/>
            <xs:element name="item" type="itemType" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="copyright">
        <xs:simpleType>
            <xs:restriction base="xs:string">
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
        <xs:element name="subtitle">
        <xs:simpleType>
            <xs:restriction base="xs:string">
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
        <xs:element name="summary">
        <xs:simpleType>
            <xs:restriction base="xs:string">
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="description">
        <xs:simpleType>
            <xs:restriction base="xs:string">
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:complexType name="enclosureType">
        <xs:attribute name="url" use="required">
            <xs:simpleType>
                <xs:restriction base="xs:anyURI">
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="length" use="required">
            <xs:simpleType>
                <xs:restriction base="xs:int">
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="type" use="required">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:element name="guid">
        <xs:simpleType>
            <xs:restriction base="xs:anyURI">
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:complexType name="imageType">
        <xs:sequence>
            <xs:element ref="url"/>
            <xs:element ref="title"/>
            <xs:element ref="link"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="itemType">
        <xs:sequence>
            <xs:element ref="title"/>
            <xs:element ref="link"/>
            <xs:element ref="description"/>
            <xs:element ref="subtitle"/>
            <xs:element ref="summary"/>
            <xs:element name="enclosure" type="enclosureType"/>
            <xs:element ref="guid"/>
            <xs:element ref="pubDate"/>
            <xs:element ref="duration"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="language">
        <xs:simpleType>
            <xs:restriction base="xs:string">
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="link">
        <xs:simpleType>
            <xs:restriction base="xs:anyURI">
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="pubDate">
        <xs:simpleType>
            <xs:restriction base="xs:string">
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="duration">
        <xs:simpleType>
            <xs:restriction base="xs:string">
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="rss">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="channel" type="channelType"/>
            </xs:sequence>
            <xs:attribute name="version" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:decimal">
                        <xs:enumeration value="2.0"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="title">
        <xs:simpleType>
            <xs:restriction base="xs:string">
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="url">
        <xs:simpleType>
            <xs:restriction base="xs:anyURI">
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
</xs:schema>

Then I created Java classes (ObjectFactory.java, Rss.java, ChannelType.java, ImageType.java, ItemType.java and EnclosureType.java) using xjc. Now we're ready to output iTunes compatible podcast feed.

I had closed myTunes before I moved to Melbourne in 2008. In less than 2 years, myTunes collected several hundreds of user agent (it only collects user agent, nothing else). I think it'll be a good idea to publish them one day.