1 (Page 1 of 1)
添加了一些小功能到机器人中
由于没有java服务器,所以这个机器人工作时间和偶一样,每天8小时,节假日休息

gtalk机器人: oneboy.org [at] gmail.com

上一篇日志写了个简单的rss新闻读取机器人,这几天无聊时对这个机器人做了些小修改:

* 支持一种简单的插件机制
程序本身不处理接收到的消息,由注册的插件来处理。
程序启动时初始化所有插件,在程序接收到消息后转发给这些插件来处理具体实现。
目前实现的插件有(IP查询、手机号码归属地查询、天气查询、RSS新闻读取、公式计算器)

* 添加了几个小插件
IP查询: 输入ip xxx.xxx.xxx.xxx即可返回ip所在地等相关信息

手机号码归属地: 输入simcard 1367893(手机号码前7位)即可返回手机号码所在地等相关信息

天气查询: 输入weather 城市名称或城市名称拼音缩写(如weather gz或weather 广州)即可返回广州近期天气等相关信息

公式计算器: 利用java6执行javascript新特性实现,不用自己去分析表达式了,呵呵

RSS新闻读取: 最先实现,但最不实用,每个用户不可以自定义rss等。

对话功能没有实现,简单的没什么意思,复杂的对话AI方面东西太复杂了,还是交给那些专门研究这方面的朋友去搞吧,hoho

您有什么idea吗? 告诉偶...
写了个类似anothr.com的新闻读取机器人demo

http://www.anothr.comAnothr(哪吒)是基于Skype/Gtalk/MSN的自动订阅投递服务。
用户只需添加Anothr机器人为好友,在机器人对话窗口输入要订阅的博客、新闻、娱乐等网站的RSS地址,就可在Skype/Gtalk/MSN 上第一时间收到最新的网站信息。

偶自己也写了个demo
实现效果:自动定时读取指定rss,判断如果有新的新闻,发送到指定im(gtalk, msn等)上。

有兴趣加gtalk: oneboy.org [at] gmail.com 试试。
每15分钟读取cnbeta上的新闻一次,如果有新的新闻,就会发送到你的gtalk上去。 :)
robot放在自己机器上,如果没反映,可能是没有开机。

借助java丰富的第三方资源,简单的实现了个demo。
用quartz做定时任务,定时N分中读取一次rss。
用roma做rss解析。
用dom4j处理相关配置信息,rss列表、用户(未完成), 最后读取的记录。
用HTMLParser剔除rss中的html代码(未完成)。
用smack向gtalk发送消息。

dreamhost似乎支持java,不知道把这robot放上面会不会有什么限制,有时间试试。
最近公司有任务要做了,估计一段时间不会更新日志了,自己做成demo玩玩还是没有问题。

 

joram使用笔记
joram是objectweb.org的java开源JMS消息中间件产品,支持JMS1.1,自带的文档和例子比较完整。中文文档比较详细的是<>这篇,文中介绍了JMS的基本概念及joram的使用方法。

下面记录我在使用过程中遇到的一些问题。 

连接远程服务器,在joram中文文档中,使用如下方法连接远程服务器
  1. Properties pr = new Properties();    
  2. // 端口,IP   
  3. pr.put("82.0.176.214","16400");    
  4. Context ictx = new InitialContext(pr);   
  5.   
  6. // 在joram 4.3.26中用这种方法死活连接不上JNDI,用下面方法能连接成功   
  7. Hashtable prop = new Hashtable();   
  8. prop.put(Context.INITIAL_CONTEXT_FACTORY,"fr.dyade.aaa.jndi2.client.NamingContextFactory");   
  9. prop.put("java.naming.factory.host", host);   
  10. prop.put("java.naming.factory.port", port);   
  11. Context jndiCtx = new InitialContext(prop);  

以编程方式启动joram服务器,而不使用命令行方式启动

  1. AgentServer.main(new String[] { "0""./s0" });    

注意:这种方式启动joram服务器,a3servers.xml文件的目录必须在classpath中。
注注意:假如你的a3servers.xml文件不在classpath中,他会读自己jar包中的a3servers.xml,自带的xml文件中没有配置jndi服务器,如果你碰到在程序中启动服务器,却连接不上jndi,看下是不是这个问题。
我就犯了个错误,将a3servers.xml的文件路径放classpath中去了,而不是这个文件的目录路径,joram找不到我的配置文件,就去读自带的配置文件。造成连接不上jndi,最后还是同事帮偶解决的。

 

使用ant操作tomcat
  • 使用ant启动和关闭tomcat,在build.xml中加入下面代码片段
使用这种方法要先设置好环境变量CATALINA_HOME=tomcat的安装路径
如果有时你不想重启整个应用,而只操作tomcat下某一个项目
  1. <property name="tomcat.home" value="you tomcat home directory here."></property>  
  2.   
  3. <TARGET name="start-tomcat" depends="stop-tomcat">  
  4.     <ECHO message="Start Tomcat" />  
  5.     <JAVA dir=/bin/ fork="true" jar="/bin/bootstrap.jar">  
  6.         <ARG value="start" />  
  7.     </JAVA>  
  8. </TARGET>  
  9.   
  10. <TARGET name="stop-tomcat">  
  11.     <ECHO message="Stop Tomcat" />  
  12.     <JAVA dir=/bin/ fork="true" jar="/bin/bootstrap.jar">  
  13.         <ARG value="stop" />  
  14.     </JAVA>  
  15. </TARGET>   
  • 使用ant操作tomcat启动/停止/重新装载(等等)某一项目

(1) 将%TOMCAT_HOME%\server\lib\catalina-ant.jar文件复制到类路径下

(2) 新建tomcatTasks.properties文件
#这些值就是catalina-ant.jar中的类文件,用来扩展ant的功能
start=org.apache.catalina.ant.StartTask
reload=org.apache.catalina.ant.ReloadTask
stop=org.apache.catalina.ant.StopTask

(3) 在build.xml中加入下面代码片段

  1. <TASKDEF file="tomcatTasks.properties">  
  2.     <CLASSPATH>  
  3.         <PATHELEMENT path="/server/lib/catalina-ant.jar" />  
  4.     </CLASSPATH>  
  5. </TASKDEF>  
  6.   
  7. <TARGET name="启动当前项目">  
  8.     <START path="/projectName" password="adminpasswd" username="admin" url="http://localhost:8080/manager" />  
  9. </TARGET>  
  10.   
  11. <TARGET name="重新装载当前项目">  
  12.     <RELOAD path="/projectName" password="adminpasswd" username="admin" url="http://localhost:8080/manager" />  
  13. </TARGET>  
  14.   
  15. <TARGET name="停止当前项目">  
  16.     <STOP path="/projectName" password="adminpasswd" username="admin" url="http://localhost:8080/manager" />  
  17. </TARGET>  

# url就是在默认首页的Tomcat Manager进去的那功能页面
# username/password就是在conf/tomcat-user.xml中配置的用户名密码,注意这个用户要有manager权限
# /projectName就是你是管理的项目的名称

配置好后,就可以使用通过ant脚本来启动,重新装载,停止某一项目了。

将多页tif文件转换为图像文件,并生成缩略图

 转换tif文件为图像文件可以使用JAI,jimi等包来处理

jimi处理一份39页的tif文件生成png并缩小,使用14秒。
JAI处理同一份文件却用了近60秒。(因该是偶技术问题造成的):-)

jimi处理的主要源码:

  1. JimiCanvas jCanvas = new JimiCanvas();   
  2. jCanvas.setImagePath(filepath);   
  3. // 这里得到的就是tiff文件中第一页普通的Image对象了   
  4. Image image = jCanvas.getImage();   
  5. // 在这个文件中生成缩略图   
  6.   
  7. process(image);   
  8. // 如果多于一页,循环取出   
  9. while (jCanvas.hasNextImage()) {   
  10.     jCanvas.nextImage();   
  11.     image = jCanvas.getImage();   
  12.     process(image);   
  13. }   
  14.   
  15. public static void process(Image image) {   
  16.     double width = (double) image.getWidth(null);   
  17.     double height = (double) image.getHeight(null);   
  18.     // 宽,高各缩小一半   
  19.     int iWidth = (int) (width * 0.5);   
  20.     int iHeight = (int) (height * 0.5);   
  21.     // 用像生成其它图像文件一样的方式生成缩略图   
  22.     BufferedImage bi = new BufferedImage(iWidth, iHeight, BufferedImage.TYPE_INT_RGB);   
  23.     bi.getGraphics().drawImage(image, 00, iWidth, iHeight, null);   
  24.     // 输出BufferedImage   
  25. }  
JIRA安装批南

JIRAAtlassian 公司开发的一款商业问题跟踪工具(开源项目经过申请可以免费使用,须提交源代码),可以对各种类型的问题进行跟踪管理,包括缺陷、需求变更、评审记录等。

安装及破解过程(MYSQL):

  • 下载atlassian-jira-enterprise-3.6.3-standalone.zip版本,其中已经包括tomcat5.x服务器
  • 下载mysql,偶使用的是mysql-5.0.22-win32解压版
  • 下载mysql jdbc驱动,JIRA默认使用的是hsql。网上有教程说要使用mysql-connector-java-3.1.12-bin.jar版本,偶本机正好有这个版本,没去试别的版本的jdbc驱动会不会出问题
  • 下载jira-jars-tomcat5.zip
  • 确保JDK1.5环境看安成功,在CMD下java -version试试 :)
  • 打开atlassian-jira-enterprise-3.6.3-standalone\atlassian-jira\WEB- INF\classes\entityengine.xml,搜索field-type-name,修改为field-type-name="mysql"
  • 将mysql-connector-java-3.1.12-bin.jar拷贝到atlassian-jira-enterprise-3.6.3-standalone\common\lib
  • 将jira-jars-tomcat5.zip拷贝到atlassian-jira-enterprise-3.6.3-standalone\common\lib
  • 修改atlassian-jira-enterprise-3.6.3-standalone\conf\server.xml,将下面大段修改为:
  1. <RESOURCE name="jdbc/JiraDS" type="javax.sql.DataSource" password="" username="root" 
  2. url="jdbc:mysql://localhost/jiradbautoReconnect=true&useUnicode=true&characterEncoding=UTF8&mysqlEncoding=utf8"
  3. maxActive="20" timeBetweenEvictionRunsMillis="5000" minEvictableIdleTimeMillis="4000"
  4. driverClassName="com.mysql.jdbc.Driver" auth="Container" />  
  • 运行安装,打开 http://localhost:8080 进行安装

注册机源代码

  1. import com.atlassian.license.LicensePair;   
  2.   
  3. import java.io.*;   
  4. import java.security.KeyFactory;   
  5. import java.security.Signature;   
  6. import java.security.spec.PKCS8EncodedKeySpec;   
  7.   
  8. public class keygen {   
  9.   
  10.     public keygen() {   
  11.     }   
  12.   
  13.     public static void main(String args[])   
  14.             throws IOException {   
  15.         try {   
  16.             long l = 267L;   
  17.             long l1 = System.currentTimeMillis();   
  18.             long l2 = System.currentTimeMillis();   
  19.             String s = "";   
  20.             System.out.println("Keygen for JIRA Enterprise Edition.");   
  21.             System.out.print("created by mydaj[ROR].");   
  22.             do {   
  23.                 System.out.print("\nEnter your organization name: ");   
  24.                 for (int i = System.in.read(); i != 10 && i != 13; i = System.in.read())   
  25.                     s = s + (char) i;   
  26.   
  27.             } while (s == "");   
  28.             try {   
  29.                 PKCS8EncodedKeySpec pkcs8encodedkeyspec = new PKCS8EncodedKeySpec(EncodedPrvKey);   
  30.                 KeyFactory keyfactory = KeyFactory.getInstance("DSA""SUN");   
  31.                 java.security.PrivateKey privatekey = keyfactory.generatePrivate(pkcs8encodedkeyspec);   
  32.                 String s1 = Long.toString(l, 10);   
  33.                 s1 = s1 + "^^";   
  34.                 s1 = s1 + Long.toString(l1, 10);   
  35.                 s1 = s1 + "^^";   
  36.                 s1 = s1 + Long.toString(l2, 10);   
  37.                 s1 = s1 + "^^";   
  38.                 s1 = s1 + s;   
  39.                 byte abyte0[] = s1.getBytes();   
  40.                 Signature signature = Signature.getInstance("SHA1withDSA");   
  41.                 signature.initSign(privatekey);   
  42.                 signature.update(abyte0);   
  43.                 byte abyte1[] = signature.sign();   
  44.                 LicensePair licensepair = null;   
  45.                 try {   
  46.                     licensepair = new LicensePair(abyte0, abyte1);   
  47.                 }   
  48.                 catch (Exception exception1) {   
  49.                     exception1.printStackTrace();   
  50.                 }   
  51.                 System.out.println(s1);   
  52.                 System.out.println("Your license key is: ");   
  53.                 System.out.println(licensepair.toString());   
  54.             }   
  55.             catch (Exception exception) {   
  56.                 exception.printStackTrace();   
  57.             }   
  58.         }   
  59.         catch (IOException ioexception) {   
  60.         }   
  61.     }   
  62.   
  63.     static byte EncodedPrvKey[] = {   
  64.             48, -12617521048, -1261,   
  65.             446742, -12272, -505641,   
  66.             48, -1261312, -127, -1270, -3127,   
  67.             83, -12729117184182, -3374, -100,   
  68.             46, -20, -28, -25, -1017, -738260, -17,   
  69.             680, -613063, -128, -748138105,   
  70.             6993643481, -58961, -11588,   
  71.             -6, -65, -59, -11, -7048, -10, -53, -10185,   
  72.             108, -41, -12759, -1282952111, -14102,   
  73.             96, -73107, -10380, -91, -92, -97, -97, -24,   
  74.             41231634, -6279, -69, -87, -41, -2,   
  75.             -73, -5827, -85987, -25, -58, -88, -90,   
  76.             21154, -5, -125, -10, -45, -5930, -61,   
  77.             25384199022, -11150, -10117,   
  78.             -13, -824397, -4142, -17, -14343,   
  79.             25, -99, -47721, -572210, -105,   
  80.             9680, -113213511, -52, -78, -110, -71,   
  81.             -126, -94, -21, -12411, -168828, -112,   
  82.             -127, -1270, -9, -31, -96, -123, -42, -10161,   
  83.             -34, -53, -68, -859254, -7287, -71121,   
  84.             -108, -81, -69, -658, -22, -126, -78776,   
  85.             11617, -126103818987, -114, -70,   
  86.             -448979, -26113716, -127, -128, -76,   
  87.             732211335, -2476402219, -73,   
  88.             -49950, -116, -56, -90, -316022122,   
  89.             -11784124, -11540, -32, -93, -823043,   
  90.             -77, -90117, -111110, -9312711, -633,   
  91.             5398, -15, -59812213659, -52,   
  92.             -92, -15, -66, -8881, -112, -119, -88, -125, -33,   
  93.             -3190, -27, -976, -110, -11710294, -128,   
  94.             123853710017659, -2, -4973,   
  95.             424222204250, -8830125,   
  96.             -37118, -5020, -82, -6308, -36106,   
  97.             -9, -11012410768  
  98.     };   
  99.   
  100. }   
1 (Page 1 of 1)