Allove Team 致力于移动应用的开发和服务(Android,J2ME,iphone,ophone)

软件开发文档(GB8567)

最近需要给软件写开发文档,虽然以前也写了不少类似文档,但是都不是那么正式,感觉。这次要整得像模像样点,所以Google百度了一番,但是发现资源并不多。但是功夫始终是不负有心人 的。让我找到了,但是不是范例。也就是说我们有软件开发文档案例分享给大家,但是有国标版啊。呵呵,我也是今天才知道软件开发文档竟然还有国标,呵呵,也没见其他方面规定得这么细致,到处都是法律bug,软件开发文档还有国标,太意外了。还是我少见多怪啊?! 呵呵 , 还好不是丑人多作怪。 屁话,真多 … *_*

好了 给文档吧:

—————–

download below :

—————-

1-操作手册(GB8567——88).doc

2-测试分析报告(GB8567——88).doc

3-测试计划(GB8567——88).doc

4-概要设计说明书(GB8567——88).doc

5-开发进度月报(GB8567——88).doc
继续阅读 »

测量程序运行的时间 测量CPU时钟频率

现在的系统基本都是多任务系统,一个时间段内有多个程序在运行。系统通过计时器中断来调
度各任务,一般是10ms调用一次。接下来介绍两种方法来计算单个进程的运行时间。
当进程运行时间相当长时(大于1s),可以直接调用clock()函数(ansi c)。
clock函数返回自进程开始到调用clock所用的clock tick。用clock返回值除以
CLOCKS_PER_SEC 常量,即得到进程所用的秒数。CLOCKS_PER_SEC在Windows是1000,
Linux中是1000 000。clock的实现是:系统在每次计时器中断时判断在执行哪个进程,然
后把那个进程的执行时间记录增加。

clock测量执行时间非常短的程序误差很大。对于测量执行时间非常短的程序的具体运行时
间,可以用INTEL 的RDTSC(Read Time Stamp Counter)指令,它是以时钟周期为单位
(1ns)的,比较精确,它把周期计数寄存器(64位无符号整数,每个时钟周期自动加1)中
的数据赋给edx、eax寄存器,其中edx存高32位,eax存低32位。我们在某段代码前求一次
周期计数器的值spot1,在此代码后面再求一次周期计数器的值spot2,spot2-spot1即得到
运行此代码的时钟周期数,然后转换成秒即可。
下面利用RDTSC测量系统的时钟频率:
#include <stdio.h>
#include <time.h>
#include <windows.h>//为了能调用Sleep()
int main(int argc, char **argv)
{int high0,low0,high1,low1,sleepTime;
 double spot0,spot1;
 sleepTime=10000;//ms,=10seconds
 __asm
//是根据VS反汇编来写的,自己不会Assembly,但是程序运行结果是对的
{rdtsc    mov  dword ptr [high0],edx ;保存高32位到high0    mov
 dword ptr [low0],eax  ;保存低32位到low0 }
//Call Sleep function in Windows
 Sleep(sleepTime);
 __asm {rdtsc    mov  dword ptr [high1],edx ;同上
 mov  dword ptr [low1],eax }
spot0=(double)high0*(1<<30)*4+low0; //把两个32位合成浮点
spot1=(double)high1*(1<<30)*4+low1;
printf("%f4  GHz\r\n",(spot1-spot0)/(1e6*sleepTime)); //即输出时钟频率
return 0;}
结果会有点误差,正常情况下误差很小,我的CPU为1.8xxxGHz,测量也为1.8xxxGHz, 但
是某些运行会出现很奇怪的结果。
要想100%精确的测出一个进程的运行时间应该说是不可能的,不过误差可以很小(0.1%)。
参考:Computer Systems: A Programmer's Perspective,chapter 9

CGI, FASTCGI, XML, XSLT

CGI? 太老了吧!是的,一般人都会说是过时的技术。而且它的并发性很低,很难应付高并发的请求。主要是每次请求服务器都要启动进程,然后处理。而其实CGI程序本身运行的时间很少,尤其是用C开发的CGI,其速度是不用怀疑的。要解决服务器启动进程耗时的问题,利用FASTCGI就可以了。它在CGI的基础上,提供了很好的缓存机制,每次请求不需要建立进程,传说其速度可以达到shtml的水平,差不多是纯静态html的一半。也传说百度、Google也是用C/C++写的,虽然不知道它们具体是怎么做的,但是绝对是离不开C的。

然而,不管是CGI还是FASTCGI,还有个问题就是必须一条一条的输出html,不像php、asp那样直接可以在html中嵌入脚本。解决这个问题,就使用到了XML和XSLT。利用CGI/FASTCGI的高速度来处理数据(XML格式),不涉及显示层,也就是不用手动输出html标签,只要处理XML数据就行了,而处理XML数据还是比较简单的。显示的工作交给XSLT,而且现在大部分的浏览器都支持XSLT,也就是不用在服务器端执行XML的转换工作,直接把数据发送到浏览器,让浏览器转换、显示,这样还可以缓解服务器的压力。而且XSLT还可以执行一些逻辑,比如排序,这样可以把更多的工作分配给浏览器端。

这就是CGI/FASTCGI 与XML、XSLT结合的优势。

成为Java高手的25个学习要点

1. 你需要精通面向对象分析与设计(OOA/OOD)、涉及模式(GOF,J2EEDP)以及综合模式。你应该了解UML,尤其是class、object、interaction以及statediagrams.

2. 你需要学习Java语言的基础知识以及它的核心类库(collections、serialization、streams、networking、multithreading、reflection、event、handling、NIO、localization以及其他)。

3. 你应该了解JVM、classloaders、classreflect以及垃圾回收的基本工作机制等。你应该有能力反编译一个类文件并且明白一些基本的汇编指令。

4. 如果你将要写客户端程序,你需要学习Web的小应用程序(applet),必需掌握GUI设计的思想和方法,以及桌面程序的SWING、AWT、SWT.你还应该对UI部件的JavaBEAN组件模式有所了解。JavaBEANS也被应用在JSP中以把业务逻辑从表现层中分离出来。

5. 你需要学习Java数据库技术,并且会使用至少一种persistence/ORM构架,例如Hibernate、JDO、CocoBase、TopLink、InsideLiberator(国产JDO红工厂软件)或者iBatis.
继续阅读 »

Linux系统下的多线程编程

线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期, solaris是这方面的佼佼者。传统的Unix也支持线程的概念,但是在一个进程(process)中只允许有一个线程,这样多线程就意味着多进程。现在,多线程技术已经被许多操作系统所支持,包括Windows/NT,当然,也包括Linux。
为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?什么的系统应该选用多线程?我们首先必须回答这些问题。
使用多线程的理由之一是和进程相比,它是一种非常”节俭”的多任务操作方式。我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种”昂贵”的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。
使用多线程的理由之二是线程间方便的通信机制。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。当然,数据的共享也带来其他一些问题,有的变量不能同时被两个线程所修改,有的子程序中声明为static的数据更有可能给多线程程序带来灾难性的打击,这些正是编写多线程程序时最需要注意的地方。

除了以上所说的优点外,不和进程比较,多线程程序作为一种多任务、并发的工作方式,当然有以下的优点:
1) 提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线程,可以避免这种尴尬的情况。
2) 使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。
3) 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。
继续阅读 »

J2ME 通过HTTP读取网络图片到手机

122

public Image loadImage(String url) throws IOException {
HttpConnection hpc = null;
DataInputStream dis = null;
try {
hpc = (HttpConnection) Connector.open(url);
int length = (int) hpc.getLength();
byte[] data = new byte[length];
dis = new DataInputStream(hpc.openInputStream());
dis.readFully(data);
return Image.createImage(data, 0, data.length);
} finally {
if (hpc != null)
hpc.close();
if (dis != null)
dis.close();
}
}

源代码:

imageloadermidlet.java

备忘:前辈的经验–软件架构

今天看了一个前辈写的东西 ! 为了防止自己遗忘了将其分享给大家一起学习

 
下面讲到的我可能需要很长的一段路去理解和应用!
路漫漫其修远兮,吾将上下而求索!

 1)您所完成的系统目的是什么?注意不是功能要求,而是目的.也就是为什么要建设、为什么要现代建设。

  2)您所完成的系统有哪些方面参与,各方面的初衷是什么?那些人可能在系统建设中起重要作用,他们会采取什么样的态度?你对他们有多少影响力?

  3)您的系统是否有一个明确的评价标准?最好从参与的各方面都进行考虑。

  4)你的系统设计思想是什么?是否能够得到各方面的认可。

  5)你对参与系统设计开发的人员了解吗?他们的特长在哪里,是否愿意与你合作,为什么?你对他们有足够的影响力吗?

  6)你的系统开发计划是否完善?你的计划表有明确的阶段吗?任何一阶段都应该怎样完成?如何对这一阶段完成的情况进行评价?

  7)你对所采用的系统开发方法以及工具是否熟悉?你的伙伴是否熟悉?

  8)你所完成的系统是否有原型?计算机的或者物理的。

1. 首先要明白设计远比编程重要。

  2. 平时注重训练自己的思维严谨性和从全局考虑问题的能力。建立冷静思考问题的处事态度。

  3. 设计时(尤其是数据库设计时)不要完全被规矩约束,设计好比作诗,懂得韵律是对的,但完全被韵律所束缚,就作不出好诗了。

  4. 多做设计,经常总结自己的不足之处和成功之处,向他人请教。

  5. 专门去找别人设计的漏洞和不足,也是提高自己设计水平的重要手段。

  6. 经验是重要的,但如果观念老化而不善于总结提高,所谓的经验就成为束缚自己进步的枷锁。

  7. 学好数学特别是理论数学如数学分析、运筹学、数学模型等。

  8. 根据项目情况和开发平台工具的特点确定最佳的设计方法。模块化设计方法和面向对象设计。两种设计方法的结合使用。

  9. 将复杂无序的过程用模块化的方法进行分解,但要注重事务间的联系,并且用开放的眼光去设计。

  10. 设计时对严谨性、灵活性、开发效率、客户要求四个方面做衡量取舍。

  11. 设计时还要根据整个工程的进度安排和客户对软件的要求而决定是否设计得足够灵活和严谨。

  12. 复杂而无条理是最糟的设计,简单实用并不一定是最好的,但一定不是最坏的。

  13. 训练自己良好的表达能力,能用清晰明确而且简单的描述表达出自己的基本思路。

  14. 在一个项目中建立统一的系统分析模式和文档模板,这其中包括今后软件变量、字段命名规则等。同时,一个项目中必须至少有一个人对整个系统设计进行检查和进行全局的考虑。

JAVA everywhere 不得不分享

今天在YOUTUBE 上面看到的一个Ad 真的是太强大了

J2ME 突破限制和Symbian交互 !

接触J2ME 也有一段时间了,把JME比作一个太监,过之而不及啊。操作系统对J2ME于 的Security 限制真是太多太多了,

欢迎转载   http://blog.allove.org

1.J2ME 访问用户已读的短信

2. J2ME 非认证Midlet 访问网络 PIM ,MULITIMEDIA 等等的安全警告!

3.J2me Midlet开机启动

4.操作系统IPC 进程 Device 信息 电池信息等访问

痛苦久了就会想办法去解决它了,最开始在上unix课程的时候老师 讲到Socket 标准问题,突然间有个灵感,Symbian和Midlet 能否用Socket 通信呢?Socket 既然所有的都遵循标准那么理论上面就是可行的了!

那么实现了Midlet 和操作系统的通信 那么不就可以利用J2ME 去调用那些我们无法触及的应用呢!那不是一下子让J2ME 的限制又扩展了很多了 呵呵

解决思路 就是

一个Symbian Native Services 然后 一个Midlet 访问数据  Native Services 监听来自端口的信息 接受之后进行本地处理 然后将结果返回给Midlet .

以利用J2ME 读取用户短信为例

启动 socket 服务— 监听  —- Midlet 通过Socket 向  Native Services 发送请求  —-》处理数据—-》接受数据—》Midlet处理 更多应用

Symbian 代码 片段 监听Socket

blank.Open(socketServ);
listener.Accept(blank, status);
User::WaitForRequest(status);
if(status != KErrNone) User::Leave(KErrGeneral);
gConsole-&gt;Printf(_L("Accepted connection!!n"));
blank.RecvOneOrMore(buffer, 0, status, dummyLength);
User::WaitForRequest(status);
if(status != KErrNone) User::Leave(KErrGeneral);
if( (buffer[0] == 'p') )
{
ProcessList(&amp;buffer);
gConsole-&gt;Printf(_L("Processing process request!!n"));
}
else if( (buffer[0] == 'c') )
{
gConsole-&gt;Printf(_L("Closing server!!n"));
running = EFalse;
buffer.Copy(KClosing);
}
else
{
gConsole-&gt;Printf(_L("Bad command!!n"));
buffer.Copy(KBadCommand);
}

blank.Write(buffer, status);
User::WaitForRequest(status);
if(status != KErrNone) User::Leave(KErrGeneral);
blank.Close();
}//end of while loop
MIDLET 数据处理

import javax.microedition.io.*;
import java.io.*;

public class ClientConnection {

private NATClientMIDlet midlet;
private static String url = “socket://127.0.0.1:8100″;
//http://blog.allove.org/archives/j2me-fuck-symbian
private String request;

public ClientConnection(NATClientMIDlet midlet) {
this.midlet = midlet;
}

public void sendRequest(String message) {
this.request = message;
new Thread(){
public void run() {
if( request.equals(”") ){
midlet.showAlert(”Enter a request!”);
}else {
sendMessage();
}
}
}.start();
}

public void sendMessage() {
try{
StreamConnection conn = (StreamConnection)Connector.open(url);
OutputStream out = conn.openOutputStream();
byte[] buf = request.getBytes();
out.write(buf, 0, buf.length);
out.flush();
out.close();

byte[] data = new byte[256];
InputStream in = conn.openInputStream();
int actualLength = in.read(data);
String response = new String(data, 0, actualLength);
midlet.textBox.setString(response);

in.close();
conn.close();

}catch(IOException ioe){
ioe.printStackTrace();
midlet.showAlert(”Allove 连接失败”);
}
}

}

这里只提供了解决思想和简单的解决方案 实际应用还得与实际情况进行分析和权衡 找到合适的方案

The ABC to JAVA

寒假来了。回家准备写些ABC about java (java 入门的一些东西)也算是对自己学习的一个总结吧!

toolsandresourcesforspellch

这些都是我以前学习的时候学习的内容  不知道能不能写出来  ,写不出来转载去 。。

俺学过的东西

java IDE

JAVA ECLIPSE 常用插件

JAVA 常用代码结构

JAVA 命名规则

JAVA 网络通信   (Socket 可以用来来实现 SYMBIAN C++和J2ME 的通信  ,这个是很不错的应用  一下子 把J2ME 无法访问的东西都搞定了 。SYMBIAN C++写个守护进程 负责和J2ME 的代码通信 就可以访问以前受操作系统保护的内容了! )

JAVA 线程

JAVA 异常的处理 异常捕获和异常灵活应用

JAVA 与模式

JAVA 性能与多线程

SWT 用户界面设计

JAVA 数据库操作

JAVA 程序和操作系统底层通信

利用J2SE 开发快速开发网络数据分析工具

J2ME MIDLET

J2ME Canvas

JEE

常用开源工具包  KXML ,QRCODE,

JAVA 好网站

我读过的关于JAVA 的书

返回顶部