让变化成为计划的一部分

欢迎大家探讨本Blog涉及的所有软件课题。我的Google Talk ID:zhengyun(at)gmail.com。

我最希望软件带给用户的感受是:美好的体验、舒适感、简约、干净...

posts - 32, comments - 8, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2005年12月27日

郑昀@ultrapower

产品名称

产品版本

Keyword: Mobile RSS Bloglines

BloglinesMobileBuddy

1.0.12

 [J2ME] BloglinesMobileBuddy

(Bloglines手机伴侣)

开源说明

 

我的资源:

http://www.cnblogs.com/Files/zhengyun_ustc/BloglinesMobile-src.rar

虽然还有这样那样的问题,但是作为一个Alpha版本的j2me软件,能够在Nokia S60系列手机上运行,这样已经足够了,所以先放出源代码,希望抛砖引玉吸引有志者继续在此基础上修改。

http://www.cnblogs.com/Files/zhengyun_ustc/flickrBuddy.rar

服务器端的web service已经能够发布alpha版本了,请在下载。这是一个tomcat+axis搭建环境下的java web service

提请注意的是,由于本源代码中包含了bluegammon/jmobilecore/henson.midp.Float/Zohar Melamed’s Jbloglines等开放源代码库,所以我也遵循GPL协议,请看后面的“开源版权声明”。

http://www.cnblogs.com/Files/zhengyun_ustc/BloglinesMobile-deployed.rar

Nokia S60系列安装程序,用数据线传BloglinesMobile.jar到您的手机上即可安装。

测试体验

我在Nokia 7610上测试过了,整体视觉效果还是不错的,而且登录和阅读速度还是蛮快的。昨晚上,在手机上竟然踏踏实实把按摩乳的《让小强真正来一次历险》和《正面新闻》共计七千七百余字的网志看完了,呵呵,不得不佩服Nokia7610的内存够大的,竟然还能够流畅地显示。

 bloglinesbuddy.myfeeds bloglinesbuddy.getitems

为什么要为Bloglines制作无线阅读软件呢?

200510月,Web 2.0 Conference最后一天的会议上,Ask Jeeves的一位副董事长公布了旗下Bloglines网站的一些最新数据(PPT格式),这些数据也可以从另一个方面体现出目前RSS的使用状况。

- 有超过135万条Feed至少有一个订阅者。

- 14,363Feed的订阅者超过50人。

- 437Feed的订阅者在1000人以上。

- 60Feed5000人以上订阅。

- Slashdot是唯一订阅者超过50000人的Feed

Bloglines是目前使用最为广泛的在线RSS阅读服务之一,这么多的订阅者,他们也许需要在无线条件下阅读Bloglines提供的服务,所以我制作了这款手机程序。

 

Bloglines 是什么

Bloglines 是一个全球最抢眼的基于Webblog订阅跟踪服务之一,它允许个人对 weblog 和新闻的各种订阅保持跟踪,这些订阅内容以 Really Simple SyndicationRSS)和 Atom 提供的形式交付。

我每天第一件事情就是打开bloglines,看看我订阅的21个资料库有没有更新他们的blog21个资料库,是不是少了点?我也曾经看过其他人有过成千上万个资料库,不过,我感觉其中80%blog其实不值得逐日跟踪。

 bloglines.web.keso

开源版权声明

由于我这个版本的 Bloglines Mobile Buddy手机伴侣 也是基于bluegammon/jmobilecore/henson.midp.Float/Zohar Melamed’s Jbloglines基础上加入我的智慧整合而来的,所以决定遵照GPL协议的大意开放源代码,您可以自由传播和修改,在遵照下面的约束条件的前提下:

 

条件1

只要你在Bloglines Mobile Buddy每一副本上明显和恰当地出版版权声明,保持此许可证的声明和没有担保的声明完整无损,并和程序一起给每个其他的程序接受者一份许可证的副本,你就可以用任何媒体复制和发布你收到的原始的程序的源代码。你可以为转让副本的实际行动收取一定费用,但必须事先得到郑昀的同意。

 

条件2

你可以修改Bloglines Mobile Buddy程序的一个或几个副本或程序的任何部分,以此形成基于程序的作品。只要你同时满足下面的所有条件,你就可以按前面第一款的要求复制和发布这一经过修改的程序或作品。

 

a

你必须在修改的文件中附有明确的说明:你修改了这一文件及具体的修改日期。

 

b

你必须使你发布或出版的作品(它包含程序的全部或一部分,或包含由程序的全部或部分衍生的作品)允许第三方作为整体按许可证条款免费使用。

 

c

如果修改的程序在运行时以交互方式读取命令,你必须使它在开始进入常规的交互使用方式时打印或显示声明:包括适当的版权声明和没有担保的声明(或者你提供担保的声明);用户可以按此许可证条款重新发布程序的说明;并告诉用户如何看到这一许可证的副本。(例外的情况:如果原始程序以交互方式工作,它并不打印这样的声明,你的基于程序的作品也就不用打印声明)。

 

这样,您就可以自由使用并传播本源代码,当然请您原封不动地保留原作者信息。

 

编写者

日期

关键词

郑昀@ultrapower

2005-12-27

Mobile

RSS READER ONLINE

BLOGLINES

Java J2ME

posted @ 2005-12-27 15:34 让变化成为计划的一部分 阅读(602) | 评论 (2)编辑 收藏

2005年12月26日

我的个人观点,不知道对不对(http://community.csdn.net/Expert/topic/4477/4477765.xml?temp=.6836969):
你所说的KEY_SOFTKEY1,KEY_SOFTKEY2,KEY_SOFTKEY3这几个定义,应该是Nokia UI API中的FullCanvas定义的吧?
而MIDP2.0的Canvas规范并没有定义这几个。

请看:
《Series 60 Developer Platform 2.0: Specification v1.0》,
Page 77:
Left soft key, -6, "Left soft key" or left soft-key symbol
Right soft key, -7, "Right soft key" or right soft-key symbol
Middle soft key, -5, "Select", "Middle soft key" or similar symbol
所以我们的Nokia、Samsung和SonyEricsson专有程序中会这么定义:
    /**
     * Key code for the FIRE game action.
     */
    public static final int KEY_FIRE = -5;

    /**
     * Key code for left soft key
     */
    public static final int KEY_SOFT_LEFT = -6;

    /**
     * Key code for right soft key
     */
    public static final int KEY_SOFT_RIGHT = -7;
在摩托罗拉专有的程序中则这么定义:
    /**
     * Key code for the FIRE game action.
     */
    public static final int KEY_FIRE = 20;

    /**
     * Key code for left soft key
     */
    public static final int KEY_SOFT_LEFT = 21;

    /**
     * Key code for right soft key
     */
    public static final int KEY_SOFT_RIGHT = 22;
在西门子程序中则这么定义:
    /**
     * Key code for the FIRE game action.
     */
    public static final int KEY_FIRE = -26;

    /**
     * Key code for left soft key
     */
    public static final int KEY_SOFT_LEFT = -1;

    /**
     * Key code for right soft key
     */
    public static final int KEY_SOFT_RIGHT = -4;

Softkeys并没有被包含在MIDP2.0的规范中,所以,
如果你非要在手机上使用这几个Softkeys,那么请注意手机的差异,你可能需要针对不同款手机分别定义了。

以下对拨打电话的手机按键的定义是在nokia、三星和Motorola(v80/220/300/400/500/600, e398, c650):

以下内容为程序代码:

/**
     * Key code for PHONE_ON key (green button)
     */
    public static final int KEY_PHONE_ON = -10;

以下这种定义是在西门子:

以下内容为程序代码:

/**
     * Key code for PHONE_ON key (green button)
     */
    public static final int KEY_PHONE_ON = -11;

以下这种定义是在Motorola platform phones iDEN, T280, T72x, v6x

以下内容为程序代码:

/**
     * Key code for PHONE_ON key (green button)
     */
    public static final int KEY_PHONE_ON = -14;

posted @ 2005-12-26 15:16 让变化成为计划的一部分 阅读(656) | 评论 (0)编辑 收藏

2005年12月25日

源代码下载:服务器端的web service已经能够发布alpha版本了,请在http://www.cnblogs.com/Files/zhengyun_ustc/flickrBuddy.rar下载。这是一个tomcat+axis搭建环境下的java web service。

2005年12月25日晚上:
今日完成的开发,是点击前面列出的blog订阅源标题,则请求bloglines检索这个特定订阅的博客登录条目。
以弹出式对话框展示文章内容。
下面演示此j2me软件:

第一步,输入你的bloglines登录电子邮件地址:

bloglines.inputusermail ,

然后输入你的登录密码:

bloglines.inputpassword 

然后手机将去bloglines站点检索你所订阅的blog源,并将标题和未读blog条目数显示在界面上,如下所示:

bloglinesbuddy.myfeeds

点击其中一个blog标题,你可以看到该blog的你尚未读过的blog文章集合,如下所示:
bloglinesbuddy.getitems 

与之对照的blog文章如下所示:
bloglines.web.solidot 

更多图片:
BloglinesBuddy.mainmenu   
BloglinesBuddy.about  

posted @ 2005-12-25 22:55 让变化成为计划的一部分 阅读(383) | 评论 (0)编辑 收藏

2005年12月25日:
制作完成了flickrBuddy web service,可以完成对bloglines api的方便调用。手机客户端则使用kSoap来访
问这个flickrBuddy web service来获得用户的bloglines订阅源。
首先,可以看到你的“my feeds”中列出的blog订阅源标题以及未读条目的数目。比如:
Engadget Simplified Chinese[16]
旁观者的奇妙冒险[0]
未完成 - Incomplete[0]
王建硕[0]
车东[Blog^2][0]

bloglinesbuddy.myfeeds 

它是利用了http://www.bloglines.com/myblogs这个世界上最大的blog订阅源服务提供的服务,请看它的界面:

bloglines.webinterface 

下面是我的“关于”,呵呵,
BloglinesBuddy.about

下一步完成:
点击“Engadget Simplified Chinese[16]”的标题菜单,就可以看到未读的条目全文。

posted @ 2005-12-25 16:56 让变化成为计划的一部分 阅读(375) | 评论 (0)编辑 收藏

2005年12月16日

第一,
下面的代码在索爱机型上可以运行,在nokia s60模拟器上也可以运行,唯独不能在nokia 7610上运行,程序会自动退出:

new Thread(this, "Menu thread").start();


必须改写为

Thread thread;
(thread = new Thread(this)).start();

方能在真机上运行。

这种程序自动退出的问题,有时候是因为你根本猜想不到的代码导致的,这时候只能通过二分排除法(不断地注释代码来缩小代码范围)来判定了。

第二,再譬如说,
你的代码中有对double的使用,比如这种代码:

double alpha = (double)Math.abs(i - m_canvasWidth / 2) /
                           (double)m_canvasWidth;


但是,注意一点,CLDC1.1才开始支持Math,“Math functions in java.lang package is available only since CLDC-1.1”。所以,如果你一旦在CLDC1.0的nokia手机上使用,那么,即使你用了try/catch捕获异常,程序也会自动退出。

这时候你也不要惊诧。

第三,
Thread thread;
      (thread = new Thread(this)).start();代码可以运行。
但是Thread thread;
      (thread = new Thread(this, "Menu thread")).start();
就会导致Nokia真机立即退出。
同样,
Thread thread;
          (thread = new Thread(new Runnable()
          {
            public void run()
            {
              m_inputHandler.handleStringInput(input);
            }
          }, "inputHandler")).start();
也会导致立即退出。
以上虽然模拟器可以运行,但是真机是不允许的。

posted @ 2005-12-16 14:34 让变化成为计划的一部分 阅读(814) | 评论 (0)编辑 收藏

2005年12月7日

Midletinfo

探索手机

javaME系统信息的实用工具

摘要:

本文档帮你了解实用工具midletinfo,简单地说,它发掘了javaME所能得到的大多数系统信息,对试图将自己的程序在不同款手机上运行的开发者会很有帮助的。

1背景

 

1.1. 下载

下载链接:http://jmobilecore.sourceforge.net/midletinfo/index.html

官方介绍:

Midletinfo展示以下信息:

u       系统信息:内存以及j2me属性;

u       屏幕信息:分辨率、色彩支持、绘制属性和按键属性;

u       字体;

u       画布上按键对应的值(很有用!)

u       所支持的连接协议类型;

 

这些信息对于开发者而言,都非常有用。比如说很多开发者遇到的问题是,按键对应的数值,每款手机都不太一致,用midletinfo就很容易帮你确定了。

源代码在此:http://jmobilecore.sourceforge.net/midletinfo/src

 

1.2. 系统信息

如图所示:
 systeminfo

看,编码类型、cldc类型、midp类型都知道了。

 

1.3. 屏幕信息

如图所示:
screeninfo 

是否支持双缓冲、屏幕大小都知道了。

 

1.4. 按键信息

如图所示:

keyinfo 
按下哪个键,屏幕上就绘制出这个键对应的值。

 

1.5. 连接协议信息

如图所示:

connectioninfo 
看,手机当前是否支持
http/tcp/udp/file/sms/cbs/ssl都可以立即知道。

 

郑昀@ultrapower

名称

版本

Keyword: midlet information j2me tool

midletinfo

0.9.1

 

posted @ 2005-12-07 15:30 让变化成为计划的一部分 阅读(597) | 评论 (2)编辑 收藏

2005年12月1日

     摘要: 另外,还有一篇必读的文章《Debugging MIDP HTTP Requests,http://developers.sun.com/techtopics/mobility/midp/articles/httpdebug/》,也给出了一份源代码,http://developers.sun.com/techtopics/mobility/midp/articles/httpdebug/src/ht...  阅读全文

posted @ 2005-12-01 18:19 让变化成为计划的一部分 阅读(804) | 评论 (0)编辑 收藏

2005年11月25日

不知道大家有否看过“反编译的西伯利亚攻击源代码”的代码,okay,不知道它的权威性有多大,不过西伯利亚攻击这个游戏还是有名气的,也许值得一看。
它的主引擎就是声明一个静态的图片数组:
class MainEngine extends FullCanvas
    
implements Runnable
{
。。。。
    
static Image imgs[];
    
public static void initImage() {
      
if (!isLoadImg) {
        
if(imgs == null)
            imgs 
= new Image[GameData.imgName.length];
        
for (int i = 0; i < GameData.imgName.length - 1; i++{
          
if (imgs[i] == null{
            
try {
              imgs[i] 
= Image.createImage("/" + GameData.imgName[i]);
            }

            
catch (Exception ex) {
              System.out.println(
"i:"+i);
              ex.printStackTrace();
            }

          }

          percent 
= (i * 100/ (GameData.imgName.length - 1);
          Sib.engine.flushGraphic();
        }

        isLoadImg 
= true;
      }

    }

而且我搜索了它的5个java文件,它在什么情况下调用System.gc()呢?
下面三种情况:
用户返回游戏时(可能之前去接听电话了?或者去设置里改参数了?);
用户选完飞机后,这可能是一个选项菜单,选飞机时所用到的资源可能以后在游戏中没必要用,所以及时回收一下;
显示过关界面时,这时候有卡的现象,欢喜的用户也不会在意的。

除此之外就没有了。

Nokia 的文档Known Issues In The Nokia 6600 MIDP 2.0 Implementation v1.7说:
2.15.1 Garbage collecting
Description
Calling the System.gc() method results in extreme slowness and jamming. In Monty 1.0 VM, garbage
collection is different and every time System.gc is called, the entire memory is really cleared.
This is an extremely slow process!
Solution
Do not call the System.gc method at all, or call the System.gc() garbage collecting method only
in non-time-critical situations, such as screen transitions, state transitions, pause states,
etc. If the System.gc() method is used, it is recommended to add a short delay (~20-50 ms) after
the method call to ensure the sufficient time for the garbage collection, as in the following

example
System.gc();
Thread.sleep(delay); delay = 20-50 ms

posted @ 2005-11-25 16:40 让变化成为计划的一部分 阅读(1108) | 评论 (1)编辑 收藏

2005年11月23日

[JavaME]手机上如何绘制半透明图片

windcao提供了一个CreateAlphaImage方法

Windcao提供的CreateAlphaImage的意思是这样的“如果需要半透明可以先在image上画,然后把这个Image弄成半透明的。最后将Image绘到Canvas上就OK了”。

 他的处理函数如下所示:

public static Image CreateAlphaImage(int Alphalike 0x88000000,Image src) {
        
int w,h;
        w
=src.getWidth();
        h
=src.getHeight();        
        
int len=wh;
        
int srcRgb[]=new int[len];
        
int dscRgb[]=new int[len];

        
try{
            src.getRGB(srcRgb,
0,w,0,0,w,h);
        }

        
catch(Exception ex){
            ex.printStackTrace();
        }


        
for (int i = 0; i  len; i++{
         
                dscRgb[i] 
= srcRgb[i]+Alpha;
        }

        Image result
=Image.createRGBImage(dscRgb,w,h,true);
        
return result;
    }

 

我在工程中用了,有效果,好像也不需要对原始的Image src有什么特殊要求。

translucenceCustomItem 
 

可以与

directlypaintCustomItem  

做一下对比。

后者没有将图片作CreateAlphaImage处理。所以绘制的图片覆盖了原来的文字。

我是在一个CustomItem扩展类中使用这个半透明图片的,代码如下所示:



public class StringKeyItem extends CustomItem{
。。。
      
private static Image m_imageCommand =
    CommandResources.getImage(CommandResources.IMG_COMMAND);
。。。
      
public StringKeyItem( 
       GUIController control,
       
int inIndent, String inText )
       
{
。。。
    m_imageCommand 
= CreateAlphaImage(0x88000000,m_imageCommand);
       }


。。。
    
public void paint( Graphics g, int w, int h )
        
{
。。。
           
// draw the text: word-wrap is an exercise for the reader
            g.drawString( text, 
                indent 
* INDENT_MARGIN + FONT_HEIGHT, 0, g.TOP | g.LEFT );
            
    
/*
     * 绘制一个半透明的前景图片,刚好就贴在StringKeyItem的文字上,还可以显示底色以及文字
     
*/

    g.drawImage(m_imageCommand, 
            indent 
* INDENT_MARGIN + FONT_HEIGHT, 0, g.TOP | g.LEFT);
        }

 

实践效果还是不错的。

感谢windcao的代码共享和思路提供!

posted @ 2005-11-23 16:46 让变化成为计划的一部分 阅读(1101) | 评论 (0)编辑 收藏

为什么会在HttpConnection访问远端服务器时,得到了ArrayIndexOutofBoundException异常呢?
有这么一种可能:
远端服务器虽然完整地响应了数据,但是却存在两种隐患:服务器没有正确地设置HTTP_CONTENT_LENGTH头域,
或者设置了但是在传输过程中,可能远端服务器和手机之间的某一代理服务器人为修改,导致
在手机端,代码仍试图按照HTTP_CONTENT_LENGTH的错误数值-1去检索数据,所以得到了这个异常。

解决办法:
一是确定服务器端正确地改写了HTTP_CONTENT_LENGTH头域;
二是针对手机端拿到了HTTP_CONTENT_LENGTH的错误数值-1,作相应处理。

posted @ 2005-11-23 15:32 让变化成为计划的一部分 阅读(693) | 评论 (0)编辑 收藏