一切皆可抽象

大而无形 庖丁解牛 厚积薄发 涤虑玄览
   ::  ::  ::  ::  :: 管理

问: 如何设置Java 2(JDK1.2)的环境变量?
答:
Java 2安装后,需要设置PATH和JAVA_HOME环境变量.与JDK1.1不同的是:设置好JAVA_HOME环境变量后,JVM将自动搜索系统类库以及用户的当前路径.
Java 2环境变量的设置如下例所示:
Solaris平台: setenv JAVA_HOME Java2的安装路径
setenv PATH $JAVA_HOME/bin:${PATH}
Windows平台: set JAVA_HOME=Java2的安装路径
set PATH=$JAVA_HOMEbin;%PATH%

问: 哪些Java集成开发工具支持Java 2?
答:
目前流行的Java集成开发环境,如Inprise的JBuilder,Symantec的Visual Cafe, Sybase的PowerJ,都支持Java 2.

问: 如果在Netscape或IE浏览器中运行Java applet时出现了错误,如何确定错误范围?
答:
当java applet在浏览器中运行时,使用的是浏览器本身的缺省JVM.而不同浏览器对JDK的支持程度也不尽相同. 因此,在Netscape或IE浏览器中运行Java applet出现了错误,建议使用JDK提供的工具appletviewer或Sun公司的Hotjava浏览器来测试该applet,以确定错误的产生是与浏览器相关.
如果applet在appletviewer或Hotjava中运行一切正常,则错误的产生是由于浏览 器不完全兼容JDK而引起的. 此时,解决方法可以是使用Hotjava浏览器或者安装 Sun公司的Java Plugin.
如果applet在Hotjava浏览器或appletviewer中运行即发生错误,则应当根据错误 提示检查applet程序.

问: 当用JDBC向数据库中插入数据或从数据库中提取数据时,为何有时中文字符会显示为乱码?
答:
 这个问题的实现通常与各个JDBC driver的实现有关. 目前大多数JDBC driver采用本地编码格式来传输中文字符,例如中文字符"0x4175"会被转成"0x41"和"0x75"进行传输. 因此我们需要对JDBC driver返回的字符以及要发给JDBC driver的字符进行转换.
当用JDBC driver向数据库中插入数据时,需要先将Unicode转成native code; 当 JDBC driver从数据库中查询数据时,则需要将native code转换成Unicode. 下面给出了这两种转换的实现:

String native2Unicode(String s) {
if (s == null || s.length() == 0) {
return null;
}
byte[] buffer = new byte[s.length()];
for (int i = 0; i s.length(); i++) { if (s.charAt(i)>= 0x100) {
c = s.charAt(i);
byte []buf = (""+c).getBytes();
buffer[j++] = (char)buf[0];
buffer[j++] = (char)buf[1];
}
else {
buffer[j++] = s.charAt(i);
}
}
return new String(buffer, 0, j);
}
除使用以上两个方法之外,有些JDBC driver如果对jdbc driver Manager设置了正确 的字符集属性,以上2个方法就不需要了.

问:当用Servlet来处理http请求并产生返回的HTML页面时,如何使HTML页面中的中文字符能够正常显示?
答:
javax.servlet.http.HttpResponse类用于产生返回页面.通过HttpResponse定义的方法getOutputStream()可以获得ServletOutputStream的实例,这样用户就可以利用ServletOutputStream.write方法向输出流中写入返回页面的内容. 但是ServletOutputStream使用的是缺省的编码方式,如果要使返回页面中的中文字 符能够正常显示,最好显示地指定所用的字符编码方式. 通常需要构造一个 OutputStreamWriter , 例程如下:

public void doGet (HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
res.setContentType("text/html");
ServletOutputStream out = res.getOutputStream();
OutputStreamWriter ow = new OutputStreamWriter(out,"GB2312");
ow.write("这是测试");
ow.flush();
ow.close();
}

问:如何设置Java WebServer的CLASSPATH,以包含用户的class文件?
答:
有两种方法可以设置Java WebServer的CLASSPATH环境变量,以使用户编写的Servlet能够调用用户的class文件.
将用户的class文件放到 JavaWebServer_Dir/classes目录下,在Java WebServer 启动时,classes目录被自动加入到CLASSPATH环境变量中了.
修改httpd.nojre文件,将用户class文件所在的路径名加到CLASSPATH环境变量中.

问:为什么在Windows平台上用Naming.lookup来获取远程RMI对象时会很慢?
答:
机器的网络设置不正确很可能会引起该问题的发生.
RMI使用了Java网络类,特别是java.net.InetAddress类,它将查询TCP/IP的主机名, 包括IP地址到主机名的映射和主机名到IP地址的映射.在Windows平台,这种查询功能 是由本地的Windows Socket库来实现的. 因此延时是发生在Windows库中,而非RMI中.
如果你的机器设置成使用DNS,问题通常是DNS服务器查不到主机名,你所发现的延时 是DNS查询的延时. 请尝试将RMI通信中涉及到的所有主机名/IP地址加到本地文件winntsystem32driversetchosts或windowshosts中. 格式如下:

IP地址 主机名

如此设置应当可以明显地减少查询所花的时间.

问: 编写Java application时,如何设置proxy的信息,以便访问外部网站?
答:
若在java application中访问外部网站,首先应设置proxy信息,样例代码如下:

import java.util.properties;

.....

Properties sys = System.getProperties();
sys.put("proxySet","true");
sys.put("proxyHost","myHTTP.proxyserver.com");
sys.put("proxyPort","80");
System.setProperties(sys);
u = new URL(website);
connect = (HttpURLConnection)u.openConnection();
.....


问: Swing组件JList的列表数据修改了,如何通知JList改变显示?
答:
JList组件有一个单独的显示模式ListModel来表示JList的显示数据.
JList创建以后,JList数据元素的值及数据元素的数量可以动态地改变.
JList在它的数据模式ListModel中观察数据的改变.因此,一个ListModel 的正确实现应当在每次数据发生改变时,通知事件的监听者.
当使用构造函数JList(Object[])创建一个JList的实例时,系统将自动 创建一个DefaultListModel的实例来存储JList的显示数据, 可以调用 DefaultListModel中定义的简便方法来动态地修改JList的数据,如 removeElementAt(index),addElement(Object)等. DefaultListModel 在修改数据的同时,将通知JList关于数据的改变.

问:在Java applet中如何实现一个模式对话框?
答:
在Java applet中实现模式对话框的关键就是在创建一个对话框的时候 要为该对话框指定一个正确的父窗口.因为Applet是Panel类的子类,不 可以作为对话框的父窗口,所以首先要获得applet所在的窗口,作为模式 对话框的父窗口. 样例代码如下:
.....
Dialog d = new Dialog( getParentWindow(comp),title);
// comp为applet上的任意一个组件
....
public void getParentWindow(Component compOnApplet,String title){
Container c = compOnApplet.getParent();
while (c != null) {
if (c instanceof Frame)
return (Frame) c;
c = c.getParent();
}
return null;
}

问: 在Java applet中如何显示另外一个HTML页面?
答:
通过java.applet.Applet.getAppletContext()方法可以获得与该applet相关的AppletContext, AppletContext.showDocument(URL)方法就可以使applet所在的浏览器显示另外一个网页.

问: 用JDK实现的签名applet,可否在Netscape或IE中运行?
答:
用JDK实现的签名applet,不可以在Netscape或IE中运行,但是可以在Hotjava浏览器中运行.
不同的浏览器提供了不同的签名applet机制,如Netscape提供了zigbert工具和 Capability API, 而IE则需要使用CAB文件. 但是,无论是Netscape工具产生的 签名applet,还是用IE产生的签名applet,都不可以在其它的浏览器中运行.
如果要使JDK产生的签名applet能够在Netscape或IE中运行,解决方法是在 Netscape或IE中安装Java Plugin,则用JDK实现的签名applet就可以在这两种 浏览器中运行.

问: 用JNI技术可以从Java应用中调用C程序库,但是如何使该C程序库可以调用另外的C程序库?
答:
如果一个被Java调用的C程序库C1仍需要调用另外一个C程序库C2,那么在编译C1的时候应当联接程序库C2,步骤如下(Solaris平台):
编写调用C库的Java文件,并编译.
javac java文件名

产生C程序头文件
javah -jni java文件名(不带后缀.java)

编写被Java调用的C程序C1.c,以及被C1调用的C2.c,并编译.
cc -G -Iinclude路径名 C2.c -o libC2.so
cc -G -Iinclude路径名 -lC2 C1.c -o libC1.so

设置环境变量
setenv LD_LIBRARY_PATH libC1.so,libC2.so所在路径:${LD_LIBRARY_PATH}

运行java应用

问: 在Java语言中,如何列出PC机文件系统中的所有驱动器名?
答:
在Java 2版本中,java.io包中的File类新增加了方法listRoots()可以实现这一功能.

问: 为什么Runtime.exec("ls")没有任何输出?
答:
调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息. 由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream()方法重定向给它的父进程了.用户需要用这些stream来向 子进程输入数据或获取子进程的输出. 所以正确执行Runtime.exec("ls")的例程如下:
try
{
process = Runtime.getRuntime().exec (command);
InputStreamReader ir=newInputStreamReader(process.getInputStream());
LineNumberReader input = new LineNumberReader (ir);
String line;
while ((line = input.readLine ()) != null)
System.out.println(line);
}
catch (java.io.IOException e){
System.err.println ("IOException " + e.getMessage());
}

问: 如何产生签名applet,以使applet能够访问本地资源?
答:
在jdk1.1中,可以使用javakey命令来产生公钥,私钥,证书和签名的jar文件,详细资料 请参考: http://java.sun.com/security/usingJavakey.html而java 2对签名机制做了比较大的改进,允许用户更灵活地设置安全权限.Java 2提供了三个工具:keytool,policytool和jarsigner来实现签名applet.例如,Joe编写了一个签名applet:SignedApplet.java,那么产生一个简单的签名applet的过程如下:

//产生密钥,密钥别名为joe,口令为sign12,存放在密钥库joestore中
keytool -genkey -alias joe -keypass sign12 -keystore joestore
//将SignedApplet.class及相关文件打包成jar文件
jar cvf SignedAppletDemo.jar
//利用keytool生成的自签名的证书产生签名applet(jar文件)
jarsigner -keystore joestore -signedjar joe.jar SignedAppletDemo.jar joe
//将自签名证书从keystore中输出到文件
keytool -export -keystore joestore -alias joe -file joe.cer
而对于签名applet的接受方Susan,需要通过如下步骤来安全地执行
Joe编写的签名applet:
//得到Joe的证书并将之读入到密钥库中susanstore中
keytool -import -alias joe -file joe.cer -keystore susanstore
//运行policytool产生满足Susan要求的policy文件
policytool
//用appletviewer运行之,或在浏览器中安装java plugin来运行之.
关于签名applet在Java Plugin中的部署请参考以下网页: http://java.sun.com/security/signExample12/

注:以上的例子为简单起见,使用了keytool产生的自签名证书.其实,用户也可以使用keytool -certreq向商业CA中心申请电子证书.

问:若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?
答:
使用缺省的serializetion的实现时,一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应.ObjectOutputStream的构造函数会向输出流中写入一个标识头,而ObjectInputStream会首先读入这个标识头.因此,多次以追加方式向一个文件中写入object时,该文件将会包含多个标识头.所以用ObjectInputStream来deserialize这个ObjectOutputStream时,将产生StreamCorruptedException.一种解决方法是可以构造一个ObjectOutputStream的子类,并覆盖writeStreamHeader()方法.被覆盖后的writeStreamHeader()方法应判断是否为首次向文件中写入object,羰?则调用super.writeStreamHeader();若否,即以追加方式写入object时,则应调用ObjectOutputStream.reset()方法.

问: 对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中? 答:
目前,没有直接的方法可以将对象写入到随机存取文件中,但是可以使用ByteArray输入/输出流作为中介,来向随机存取文件中写入或从随机存取文件中读出字节,并且可以利用字节流来创建对象输入/输出流,以用于读写对象.需要注意的是在字节流中要包含一个完整的对象,否则读写对象时将发生错误. 例如,java.io.ByteArrayOutputStream可用于获取ObjectOutputStream的字节流,从中可得到byte数组并可将之写入到随机存取文件中.相反,我们可以从随机存取文件中读出字节数组,利用它可构造ByteArrayInputStream,进而构造出ObjectInputStream,以读取对象.

问: 运行RMI应用时,可不可以不手工启动名字服务rmiregistry,而是从程序中启动之?
答:
可以. java.rmi包中提供了类java.rmi.registry.LocateRegistry,用于获取名字服务或创建名字服务.调用LocateRegistry.createRegistry(int port)方法可以在某一特定端口创建名字服务,从而用户无需再手工启动rmiregistry.此外,LocateRegistry.getRegistry(String host,int port)方法可用于获取名字服务.

问: 使用类PrintJob进行打印操作时,应如何设置打印机名等打印属性?
答:
使用如下方法可以获得PrintJob的实例用于控制打印操作:
Toolkit.getPrintJob(Frame f, String jobtitle, Properties prop)
那么对于打印属性的设置可以通过对prop的属性设置来实现,打印属性包括:
awt.print.destination: 可以是"printer"或"file"
awt.print.printer: 打印机名
awt.print.fileName: 打印文件名
awt.print.numCopies: 打印份数
awt.print.options: 打印命令的打印选项
awt.print.orientation: 打印方向,可以是"portrait"或"landscape"
awt.print.paperSize: 纸张大小,可以是"letter","legal","executive"或"a4"

问:在JDK1.1中Thread类定义了suspend()和resume()方法,但是在JDK1.2中已经过时,应使用什么方法来替代之?
答:
Thread.suspend本身易于产生死锁.如果一个目标线程对某一关键系统资源进行了加锁操作,然后该线程被suspend,那么除非该线程被resume,否则其它线程都将无法访问该系统资源.如果另外一个线程将调用resume,使该线程继续运行,而在此之前,它也需要访问这一系统资源,则将产生死锁.
因此,在Java 2中,比较流行的方式是定义线程的状态变量,并使目标线程轮询该状态变量,当状态为悬挂状态时,可以使用wait()方法使之处于等待状态.一旦需要该线程继续运行,其它线程会调用notify()方法来通知它.

问: 使用JDBC编程,应如何控制结果集ResultSet的指针,使之能够上下移动,以及移动到结果集的第一行和最后一行?
答:
在JDK1.1中,ResultSet类中只定义了next()方法支持数据指针的下移.但在Java 2中,ResultSet类增加了如下方法支持数据指针的移动,包括:

ResultSet.first():将数据指针移到结果集的第一行
ResultSet.last(): 将数据指针移到结果集的最后一行
ResultSet.previous(): 将数据指针上移一行

以上的方法定义在JDBC2.0的规范中,所有支持JDBC 2.0的JDBC驱动程序都可以支持上述方法.目前Intersolv和OpenLink等JDBC驱动程序厂商均有产品支持JDBC 2.0 .

问: 哪几种Web Server支持Servlet?如何使IIS支持Servlet?
答:
目前,支持Servlet的服务器端产品主要有: Sun公司的Java WebServer,Lotus DominoGo WebServer,BEA weblogic Tengah Server,Jigsaw,NetForge,AcmeServer和Mot Bays Jetty等.
此外,一些第三方厂商也开发了Servlet engine,以使其它WebServer(如Netscape Web Server,IIS等)能够运行Servlet,如LiveSoftware的Jrun(http://www.livesoftware.com/ products/jrun/)等.

问: 如何在Java应用中将图像存储到图像文件中?
答:
Java Advanced Imaging API(包含在Java Media API中)允许在Java应用中执行复杂的,高性能的图像处理.JAI API提供了存储图像的能力.目前,JAI API支持以下几种图像文件格式:BMP,JEPG,PNG,PNM,TIFF.下面给出了将图像存储到BMP文件的一段代码:
OutputStream os = new FileOutputStream(fileToWriteTo);
BMPEncodeParam param = new BMPEncodeParam();
ImageEncoder enc = ImageCodec.createImageEncoder("BMP", os, param);
enc.encode(img);
os.close();
有关存储图像文件的编程指南请参考以下网页:
http://java.sun.com/products/jav ... velopers/jai-guide/

问: 如何用Java语言向串口读写数据?
答:
Sun公司的Java Communication API2.0可用于读写串口,它支持RS232串口和IEEE 1284 并口,提供了一种与平台无关的串/并口通信机制.

posted @ 2005-10-13 09:01 锋出磨砺 阅读(695) | 评论 (0)编辑 收藏

如果你有一千个苹果,有十个箱子,那么现在我要把一千个苹果放进十个箱子里面,
放了完之后,不管谁跟我要多少苹果(包括1000以内的哟),我都可以整箱整箱给
他,这个问题有解吗?

我的思路。
我从1开始推理的。如果你需要1个,必然有1个箱子装一个。
需要两个,要么给一个箱子装2个,要么再装一个的箱子。感觉
还是装2个为一箱比较好。那么需要3个时候,就1+2了,那么你需要4个怎么办。
是装一个4个呢,还是装一个或者2个呢。为了省箱子,我装4个。
此时,我发现了规律,1,2,4。那么下一个是8,再下去就是16了,接着32。
。。。。。。。
如果有100个,到32的时候,下一个就是64了,总数超过100了。思路改为
100-(1+2+4+8+16+32)=37。最后一个箱子装37个。
当要求的苹果数在1+2+4+8+16+32=63 和100之间的时候,将算法推诿
给前面即可。就是先拿37个,剩下的从以前的箱子拼凑。
至此,推理完毕。

java实现代码


/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2005</p>
 * <p>Company: </p>
 * @author not attributable
 * @version 1.0
 */

public class Box {
  private int limit;
  private int code;
  private int applenum;


  public Box(int code,int applenum,int limit) {
     this.limit = limit;
     this.code  = code;
     this.applenum = applenum;

  }
  public int getApplenum() {
    return applenum;
  }
  public int getCode() {
    return code;
  }
  public int getLimit() {
    return limit;
  }
  public void setLimit(int limit) {
    this.limit = limit;
  }
  public void setCode(int code) {
    this.code = code;
  }
  public void setApplenum(int applenum) {
    this.applenum = applenum;
  }

}


/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2005</p>
 * <p>Company: </p>
 * @author not attributable
 * @version 1.0
 */

public class Apple {
  public Apple() {
  }
  final private int max=100;   // 苹果总数
  static int   xqs = 99;       // 你需要的苹果数
  private java.util.Vector Boxvec = new java.util.Vector(); // 箱子和箱子里的苹果
  private int ai =0;
  private int k = 1;
  public static void main(String args[])
  {
    Apple apple = new Apple();
    apple.InBox(1);
    System.out.println("共需装"+apple.GetBoxVec().size()+"箱");
    for (int i=0;i<apple.GetBoxVec().size();i++)
    {
      Box box = (Box)apple.GetBoxVec().get(i);
      System.out.println("第 ‘"+box.getCode()+"’ 箱装'"+box.getApplenum()+"' ");
    }
    apple.GetApple(xqs,apple.GetBoxVec());
  }

  public void GetApple(int x,java.util.Vector vec)
  {
    if (x==1)
    {
     System.out.println("拿第一箱玩去,就1个");
    }
    else
    {
      if (x != 0) {
        int key = 0;
        for (int i = 0; i < vec.size() - 1; i++) {
          Box xbox = (Box) vec.get(i);
          Box ybox = (Box) vec.get(i + 1);
          if (x > xbox.getLimit() && x <= ybox.getLimit()) {
            key = i + 2;
            System.out.println("拿第" + ybox.getCode() + "箱给他,共" +
                               ybox.getApplenum() + "个");
            GetApple(x - ybox.getApplenum(), vec);
          }
        }
      }
      else
        System.out.println("完成");
    }

  }

  public void InBox(int i)
  {
    if ((i+i)>=max)
    {
      Box box = new Box(k,max-ai,max);
      Boxvec.add(box);
    }
    else
    {
      Box box = new Box(k,i,i+ai);
      k++;
      Boxvec.add(box);
      ai = ai + i;
      InBox(i+i);
    }
  }
  public java.util.Vector GetBoxVec()
  {
    return Boxvec;
  }

}

posted @ 2005-10-12 13:52 锋出磨砺 阅读(2115) | 评论 (8)编辑 收藏

最近在做Java Application的项目,对于ui的美观,做了一些尝试。有幸看到了JGoodIdes的LookAndFeel包。
效果大家可以看看如下连接
        http://www.jgoodies.com
经过试验,解决了中文乱码问题,下面将经验和大家共分享。
LookAndFeel如同css一样,具体的概念大家可以参考其他文章,这里不做赘述。

http://www.blogjava.net/Files/itaogo/plastic-1.1.3.zip
1,加载附件plastic-1.1.3.jar到lib path,我用的是jbuilderX
2,创建一个新类AppFont.java
   import java.awt.*;
   import javax.swing.UIManager;
   public class AppFont()
   {
     public static void setFont(Font pFont){
      UIManager.put("Button.font", pFont);
      UIManager.put("ToggleButton.font", pFont);
      UIManager.put("RadioButton.font", pFont);
      UIManager.put("CheckBox.font", pFont);
      UIManager.put("ColorChooser.font", pFont);
      UIManager.put("ToggleButton.font", pFont);
      UIManager.put("ComboBox.font", pFont);
      UIManager.put("ComboBoxItem.font", pFont);
      UIManager.put("InternalFrame.titleFont", pFont);
      UIManager.put("Label.font", pFont);
      UIManager.put("List.font", pFont);
    UIManager.put("MenuBar.font", pFont);
    UIManager.put("Menu.font", pFont);
    UIManager.put("MenuItem.font", pFont);
    UIManager.put("RadioButtonMenuItem.font", pFont);
    UIManager.put("CheckBoxMenuItem.font", pFont);
    UIManager.put("PopupMenu.font", pFont);
    UIManager.put("OptionPane.font", pFont);
    UIManager.put("Panel.font", pFont);
    UIManager.put("ProgressBar.font", pFont);
    UIManager.put("ScrollPane.font", pFont);
    UIManager.put("Viewport", pFont);
    UIManager.put("TabbedPane.font", pFont);
    UIManager.put("TableHeader.font", pFont);
    UIManager.put("Table.font", pFont);
    UIManager.put("TextField.font", pFont);
    UIManager.put("PasswordFiled.font", pFont);
    UIManager.put("TextArea.font", pFont);
    UIManager.put("TextPane.font", pFont);
    UIManager.put("EditorPane.font", pFont);
    UIManager.put("TitledBorder.font", pFont);
    UIManager.put("ToolBar.font", pFont);
    UIManager.put("ToolTip.font", pFont);
    UIManager.put("Tree.font", pFont);
      }
   }
3,寻找您的java application 的主程序 
 
  //引入
  import com.jgoodies.plaf.LookUtils;
  import com.jgoodies.plaf.plastic.PlasticLookAndFeel;
 
  //修改程序如下
  //Main method
   public static void main(String[] args) {
    try {
      //原来的,请注释掉;jbuilder是如此写法。
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
      //修改为
      UIManager.put("ClassLoader", LookUtils.class.getClassLoader());
      UIManager.setLookAndFeel(new PlasticLookAndFeel());
      AppFont.setFont(new java.awt.Font("宋体", 0, 12));
    }
    catch(Exception e) {
      e.printStackTrace();
    }
    new MainApp();
  }
 
 4,附件2 UISample.rar是jbuilder的一个简单效果的项目。下载地址 http://www.blogjava.net/Files/itaogo/UISample.rar

posted @ 2005-10-09 10:50 锋出磨砺 阅读(932) | 评论 (0)编辑 收藏

一人在办公室老是放响屁,同事忍不住说:你能不能不出声?然后便见他坐在那摇来晃去抖个不停,问:干什么?
回答说:我调成振动的了

食人族父子打猎,其子擒一瘦子,其父曰:放,没肉!其子又擒一胖子,其父曰:放,太腻!其子又擒一美女,
其父曰:带回家,晚上把你妈吃了!

某国有一年经济危机,失业率特别高,有一个人找工作找了很久也没有找到。
这天他在街上转悠,经过一个建筑工地时,忽然发现有一个工人从在建的楼上摔了下来。
他急忙跑向工头那儿问:“那个刚掉下来的人的工作我可以接替吗?”
工头说:“不行,他的工作已经有人接替了。”
“谁呀?”
“就是把他推下来的那个人呗!”

一青年做事总是毛手毛脚,所以老是失业。这一次,他又找到一份工作,是替一家古董店干活。
才上班的第一天,他就不小必把店里的一只较昂贵的玻璃瓶给摔碎了。
老板很生气:“这只瓶子的价钱我会在你每个月的工资内扣。”
这青年一听,松了口气说:“谢天谢地,我终于找到了一份比较长的工作。”

某人向朋友倾诉:“有两次我下班回家,看见太太和一个男人搂抱,你说我该怎么办?”
“我不知道,”朋友回答,“但你何不试试加班工作?”

安妮从幼儿园回家,对妈妈说:“妈妈,捷克向我求婚!”
妈妈问:“他有固定的工作吗?” 安妮说:“他是我们班专职擦黑板的!”

有一个小姐到乡去旅行时,看到一个小男孩满身是汗地拉著一头牛。 
小姐:“你要把牛牵到那里去?”
男孩:“到隔壁村去和母牛配种。”
小姐:“难道这工作不能叫你父亲做吗?”
男孩:“不行!一定得公牛才行!”

某单位有专门的制服,但工作人员平时都不大穿。单位领导经过研究,决定工作人员在上班时间必须穿制服。
这可苦了那些爱美的女职员,开始几天还勉强可以,几天过后,牛仔裤、健美裤又风行起来。当然,因为有
所顾忌,上装还是装制服。单位领导见此情况,立即召开大会。会上,领导人气恼地说道:“现在,老毛病
又犯了,有些女同志上班只穿上装,不穿裤子。。。。。”

一天律师和他妻子走在大街上,迎面走来一个打扮十分妖娆的女郎并频频向律师放电,而且在碰面的时候还热情的和律师打招呼。
“你认识她?”妻子问。
“哦,我们只是在工作上的来往。”
“你的工作还是她的工作?”

posted @ 2005-10-06 12:07 锋出磨砺 阅读(302) | 评论 (0)编辑 收藏

自从《设计模式》问世以来,模式就开始流行,有分析模式、设计模式、开发模式等等。在业界比较风靡的是设计模式,就是将以前用到的设计进行抽取公用之后得到的设计方案,称其设计模式,即模子。我们从以前做过得项目中也可以抽取一些比较通用的业务管理,不妨称其为业务模式,比如角色权限管理,机构管理,系统管理(数据库备份,恢复),消息管理,还有电力设备台帐,安全事故(设备,人员,车辆)等等。我将其分为两部分(通用业务模式,电力业务模式),下面将详细的介绍这些业务模式的业务分析和设计(类设计,数据库设计)。

通用业务模式

l         角色权限管理

角色对应权限,两者是多对多的关系。

例如:

人力资源管理角色所拥有的操作权限有

l         机构管理

l         系统管理

l         消息管理

l         生成菜单管理

电力业务模式(电厂,省公司,网公司,电力国、省、地方调度,市局,县局,电管所)

l         电力设备台帐

l         安全事故

l         设备大修检修

posted @ 2005-10-04 17:52 锋出磨砺 阅读(481) | 评论 (0)编辑 收藏

架构设计说明书

参考文件《需求说明书》

 

需要考虑的要素

 

1、需求的符合性:正确性、完整性;功能性需求、非功能性需求

软件项目最主要的目标是满足客户需求。在进行构架设计的时候,大家考虑更多的是使用哪个运行平台、编成语言、开发环境、数据库管理系统等问题,对于和客户需求相关的问题考虑不足、不够系统。如果无论怎么好的构架都无法满足客户明确的某个功能性需求或非功能性需求,就应该与客户协调在项目范围和需求规格说明书中删除这一需求。否则,架构设计应以满足客户所有明确需求为最基本目标,尽量满足其隐含的需求。(客户的非功能性需求可能包括接口、系统安全性、可靠性、移植性、扩展性等等,在其他小节中细述)

一般来说,功能需求决定业务构架、非功能需求决定技术构架,变化案例决定构架的范围。需求方面的知识告诉我们,功能需求定义了软件能够做些什么。我们需要根据业务上的需求来设计业务构架,以使得未来的软件能够满足客户的需要。非功能需求定义了一些性能、效率上的一些约束、规则。而我们的技术构架要能够满足这些约束和规则。变化案例是对未来可能发生的变化的一个估计,结合功能需求和非功能需求,我们就可以确定一个需求的范围,进而确定一个构架的范围。(此段From林星)

这里讲一个前几年因客户某些需求错误造成构架设计问题而引起系统性能和可靠性问题的小小的例子:此系统的需求本身是比较简单的,就是将某城市的某业务的全部历史档案卡片扫描存储起来,以便可以按照姓名进行查询。需求阶段客户说卡片大约有20万张,需求调研者出于对客户的信任没有对数据的总量进行查证。由于是中小型数据量,并且今后数据不会增加,经过计算20万张卡片总体容量之后,决定使用一种可以单机使用也可以联网的中小型数据库管理系统。等到系统完成开始录入数据时,才发现数据至少有60万,这样使用那种中小型数据库管理系统不但会造成系统性能的问题,而且其可靠性是非常脆弱的,不得不对系统进行重新设计。从这个小小的教训可以看出,需求阶段不仅对客户的功能需求要调查清楚,对于一些隐含非功能需求的一些数据也应当调查清楚,并作为构架设计的依据。

对于功能需求的正确性,在构架设计文档中可能不好验证(需要人工、费力)。对于功能需求完整性,就应当使用需求功能与对应模块对照表来跟踪追溯。对于非功能需求正确性和完整性,可以使用需求非功能与对应设计策略对照表来跟踪追溯评估。

软件设计工作只有基于用户需求,立足于可行的技术才有可能成功。

2
、总体性能

性能其实也是客户需求的一部分,当然可能是明确的,也有很多是隐含的,这里把它单独列出来在说明一次。性能是设计方案的重要标准,性能应考虑的不是单台客户端的性能,而是应该考虑系统总的综合性能;

性能设计应从以下几个方面考虑:内存管理、数据库组织和内容、非数据库信息、任务并行性、网络多人操作、关键算法、与网络、硬件和其他系统接口对性能的影响;

几点提示:算法优化及负载均衡是性能优化的方向。经常要调用的模块要特别注意优化。占用内存较多的变量在不用时要及时清理掉。需要下载的网页主题文件过大时应当分解为若干部分,让用户先把主要部分显示出来。

3
、运行可管理性

系统的构架设计应当为了使系统可以预测系统故障,防患于未然。现在的系统正逐步向复杂化、大型化发展,单靠一个人或几个人来管理已显得力不从心,况且对于某些突发事件的响应,人的反应明显不够。因此通过合理的系统构架规划系统运行资源,便于控制系统运行、监视系统状态、进行有效的错误处理;为了实现上述目标,模块间通信应当尽可能简单,同时建立合理详尽的系统运行日志,系统通过自动审计运行日志,了解系统运行状态、进行有效的错误处理;(运行可管理性与可维护性不同)

4
、与其他系统接口兼容性(解释略)

5
、与网络、硬件接口兼容性及性能(解释略)

6
、系统安全性

随着计算机应用的不断深入和扩大,涉及的部门和信息也越来越多,其中有大量保密信息在网络上传输,所以对系统安全性的考虑已经成为系统设计的关键,需要从各个方面和角度加以考虑,来保证数据资料的绝对安全。

7
、系统可靠性

系统的可靠性是现代信息系统应具有的重要特征,由于人们日常的工作对系统依赖程度越来越多,因此系统的必须可靠。系统构架设计可考虑系统的冗余度,尽可能地避免单点故障。系统可靠性是系统在给定的时间间隔及给定的环境条件下,按设计要求,成功地运行程序的概率。成功地运行不仅要保证系统能正确地运行,满足功能需求,还要求当系统出现意外故障时能够尽快恢复正常运行,数据不受破坏。

8
、业务流程的可调整性

应当考虑客户业务流程可能出现的变化,所以在系统构架设计时要尽量排除业务流程的制约,即把流程中的各项业务结点工作作为独立的对象,设计成独立的模块或组件,充分考虑他们与其他各种业务对象模块或组件的接口,在流程之间通过业务对象模块的相互调用实现各种业务,这样,在业务流程发生有限的变化时(每个业务模块本身的业务逻辑没有变的情况下),就能够比较方便地修改系统程序模块或组件间的调用关系而实现新的需求。如果这种调用关系被设计成存储在配置库的数据字典里,则连程序代码都不用修改,只需修改数据字典里的模块或组件调用规则即可。

9
、业务信息的可调整性

应当考虑客户业务信息可能出现的变化,所以在系统构架设计时必须尽可能减少因为业务信息的调整对于代码模块的影响范围。

10
、使用方便性

使用方便性是不须提及的必然的需求,而使用方便性与系统构架是密切相关的。WinCE1.0)的失败和后来改进版本的成功就说明了这个问题。WinCE1.0)有太多层次的视窗和菜单,而用户则更喜欢简单的界面和快捷的操作。失败了应当及时纠正,但最好不要等到失败了再来纠正,这样会浪费巨大的财力物力,所以在系统构架阶段最好能将需要考虑的因素都考虑到。当然使用方便性必须与系统安全性协调平衡统一,使用方便性也必须与业务流程的可调整性和业务信息的可调整性协调平衡统一。满足用户的需求,便于用户使用,同时又使得操作流程尽可能简单。这就是设计之本。

11
、构架样式的一致性

软件系统的构架样式有些类似于建筑样式(如中国式、哥特式、希腊复古式)。软件构架样式可分为数据流构架样式、调用返回构架样式、独立组件构架样式、以数据为中心的构架样式和虚拟机构架样式,每一种样式还可以分为若干子样式。构架样式的一致性并不是要求一个软件系统只能采用一种样式,就像建筑样式可以是中西结合的,软件系统也可以有异质构架样式(分为局部异质、层次异质、并行异质),即多种样式的综合,但这样的综合应该考虑其某些方面的一致性和协调性。每一种样式都有其使用的时机,应当根据系统最强调的质量属性来选择。

四、源代码的组织结构方面的考虑:

1
、开发可管理性

便于人员分工(模块独立性、开发工作的负载均衡、进度安排优化、预防人员流动对开发的影响:一个好的构架同时应有助于减少项目组的压力和紧张,提高软件开发效率)、利于配置管理、大小的合理性、适度复杂性;

1
)便于人员分工-模块独立性、层次性

模块独立性、层次性是为了保证项目开发成员工作之间的相对独立性,模块联结方式应该是纵向而不是横向, 模块之间应该是树状结构而不是网状结构或交叉结构,这样就可以把开发人员之间的通信、模块开发制约关系减到最少。同时模块独立性也比较利于配置管理工作的进行。现在有越来越多的的软件开发是在异地进行,一个开发组的成员可能在不同城市甚至在不同国家,因此便于异地开发的人员分工与配置管理的源代码组织结构是非常必要的。

2
)便于人员分工-开发工作的负载均衡

不仅仅是开发出来的软件系统需要负载均衡,在开发过程中开发小组各成员之间工作任务的负载均衡也是非重要的。所谓工作任务的负载均衡就是通过合理的任务划分按照开发人员特点进行分配任务,尽量让项目组中的每个人每段时间都有用武之地。这就需要在构架设计时应当充分考虑项目组手头的人力资源,在实现客户需求的基础上实现开发工作的负载均衡,以提高整体开发效率。

3
)便于人员分工-进度安排优化;

进度安排优化的前提是模块独立性并搞清楚模块开发的先后制约关系。利用工作分解结构对所有程序编码工作进行分解,得到每一项工作的输入、输出、所需资源、持续时间、前期应完成的工作、完成后可以进行的工作。然后预估各模块需要时间,分析各模块的并行与串行(顺序制约),绘制出网络图,找出影响整体进度的关键模块,算出关键路径,最后对网络图进行调整,以使进度安排最优化。

有个家喻户晓的智力题叫烤肉片策略:约翰逊家户外有一个可以同时烤两块肉片的烤肉架,烤每块肉片的每一面需要10分钟,现要烤三块肉片给饥肠辘辘急不可耐的一家三口。问题是怎样才能在最短的时间内烤完三片肉。一般的做法花20分钟先烤完前两片,再花20分钟烤完第三片。有一种更好的方法可以节省10分钟,大家想想。

4
)便于人员分工-预防员工人员流动对开发的影响

人员流动在软件行业是司空见惯的事情,已经是一个常见的风险。作为对这一风险的有效的防范对策之一,可以在构架设计中考虑到并预防员工人员流动对开发的影响。主要的思路还是在模块的独立性上追求高内聚低耦合),组件化是目前流行的趋势。

5
)利于配置管理(独立性、层次性)

利于配置管理与利于人员分工有一定的联系。除了逻辑上的模块组件要利于人员分工外,物理上的源代码层次结构、目录结构、各模块所处源代码文件的部署也应当利于人员分工和配置管理。(尽管现在配置管理工具有较强大的功能,但一个清楚的源码分割和模块分割是非常有好处的)。

6
)大小的合理性与适度复杂性

大小的合理性与适度复杂性可以使开发工作的负载均衡,便于进度的安排,也可以使系统在运行时减少不必要的内存资源浪费。对于代码的可阅读性和系统的可维护性也有一定的好处。另外,过大的模块常常是系统分解不充分,而过小的模块有可能降低模块的独立性,造成系统接口的复杂。

2
、可维护性

便于在系统出现故障时及时方便地找到产生故障的原因和源代码位置,并能方便地进行局部修改、切割;(可维护性与运行可管理性不同)

3
、可扩充性:系统方案的升级、扩容、扩充性能

系统在建成后会有一段很长的运行周期,在该周期内,应用在不断增加,应用的层次在不断升级,因此采用的构架设计等方案因充分考虑升级、扩容、扩充的可行性和便利

4
、可移植性

不同客户端、应用服务器、数据库管理系统:如果潜在的客户使用的客户端可能使用不同的操作系统或浏览器,其可移植性必须考虑客户端程序的可移植性,或尽量不使业务逻辑放在客户端;数据处理的业务逻辑放在数据库管理系统中会有较好的性能,但如果客户群中不能确定使用的是同一种数据库管理系统,则业务逻辑就不能数据库管理系统中;

达到可移植性一定要注重标准化和开放性:只有广泛采用遵循国际标准,开发出开放性强的产品,才可以保证各种类型的系统的充分互联,从而使产品更具有市场竞争力,也为未来的系统移植和升级扩展提供了基础。

5
、需求的符合性

从源代码的组织结构看需求的符合型主要考虑针对用户需求可能的变化的软件代码及构架的最小冗余(同时又要使得系统具有一定的可扩展性)。

构架工作应该在需求开发完成约80%的时候开始进行,不必等到需求开发全部完成,需要项目经理以具体的判断来评估此时是否足以开始构建软件构架。

给出一致的轮廓:系统概述。一个系统构架需要现有概括的描述,开发人员才能从上千个细节甚至数十个模块或对象类中建立一致的轮廓。

构架的目标应该能够清楚说明系统概念,构架应尽可能简化,最好的构架文件应该简单、简短,清晰而不杂乱,解决方案自然。

构架应单先定义上层的主要子系统,应该描述各子系统的任务,并提供每个子系统中各模块或对象类的的初步列表。

构架应该描述不同子系统间相互通信的方式,而一个良好的构架应该将子系统间的通信关系降到最低。

成功构架的一个重要特色,在于标明最可能变更的领域,应当列出程序中最可能变更的部分,说明构架的其他部分如何应变。

复用分析、外购:缩短软件开发周期、降低成本的有效方案未必是自行开发软件,可以对现有软件进行复用或进行外购。应考虑其对构架的影响。

除了系统组织的问题,构架应重点考虑对于细节全面影响的设计决策,深入这些决策领域:外部软件接口(兼容性、通信方式、传递数据结构)、用户接口(用户接口和系统层次划分)、数据库组织和内容、非数据库信息、关键算法、内存管理(配置策略)、并行性、安全性、可移植性、网络多人操作、错误处理。

要保证需求的可追踪性,即保证每个需求功能都有相应模块去实现。

构架不能只依据静态的系统目标来设计,也应当考虑动态的开发过程,如人力资源的情况,进度要求的情况,开发环境的满足情况。构架必须支持阶段性规划,应该能够提供阶段性规划中如何开发与完成的方式。不应该依赖无法独立运行的子系统构架。将系统各部分的、依赖关系找出来,形成一套开发计划。

 

系统概述

 

名词解释

 

 

业务构架

    模块定义   模块独立性、层次性  

稳定的需求

不稳定需求

不稳定需求造成的后果

应对方案

使用方便性

技术构架

     运行平台、接口、系统安全性、可靠性、移植性、扩展性

人力组织计划

      人力资源分析

      进度安排优化

     开发工作的负载均衡

      预防员工人员流动对开发的影响应对

     

posted @ 2005-10-04 17:49 锋出磨砺 阅读(1928) | 评论 (0)编辑 收藏

    05国庆,阴雨连连,待到雨停。因办了旅游年卡,长假唯有青龙寺可去,陪内人去览。
    记忆深刻的是《乐游园》一诗。

    乐游园.
     李商隐.
     向晚意不适,. 驱车登古原。 夕阳无限好,只是近黄昏。

     如今四处高楼林立,虽登高此处,始终无前人的感怀。始终让人感了没有了我中华大文化,在倭国的小文化
     笼罩下,处处樱花,这里那里都是日文。看了相关介绍,明明是日本人是徒弟来学我中华。怎么就让倭国人
     用金钱改变了味道呢。失败。
    

posted @ 2005-10-04 17:44 锋出磨砺 阅读(460) | 评论 (2)编辑 收藏

svg背景

svg描述

什么是SVG

SVG,是可任意放缩矢量图像格式(Scalable Vector Graphics)的简称。它基于XML(可扩展标识语言),是一个全新的标准开放的矢量图像和动画格式。SVG不同于传统的二元(平面)图像和动画制作,它使用简单的一元(文本)语句,完成矢量图像,以及诸如色彩变化,对象运动,滤镜和遮照,音效添加等各式动画效果。SVG创造一个利用纯文本完成网络多媒体的神话。

SVG的特点

    矢量图像

  图像通常分为矢量图像和位图图像。
  矢量图像利用点和线等矢量化的数据描述图像,并在图形中包含色彩和位置信息。矢量图像的最大优点是"分辨率独立"。当显示或输出图像时,图像的品质不受设备的分辨率影响,能够提供高清晰的画面。矢量图相对位图而言,更适合用于直接打印、印刷或输出到一些小型设备如手提装置上。放大和缩小矢量图不会影响图像品质。
而位图图像则使用我们称为像素的一格一格的小点来描述图像。计算机的屏幕其实就是一张包含大量像素点的网格。位图图像受到分辨率的影响。因此常常出现图像边缘锯齿和放大后"马赛克"现象。相对而言,位图需要的存储空间要比矢量图更多。
  SVG作为矢量图像格式,同样具备了矢量图的诸多优点,更适合在网络中传输和应用。SVG除了矢量图的优势,也同样保持了对位图图像的正确表达功能。使用XML中的XLINK(扩展链接)标签,SVG也可以在图像中调用位图图像。

  矢量滤镜

  虽然SVG图像做为矢量图格式,具有很多优点。但我们也看到,仍然有很多的图像设计师倾向于使用位图创作。这是因为位图常常可以使用大量的滤镜效果、纹理贴图和空间幻影等,加强图像的视觉效果。
但因为位图的创作是直接针对像素操作,所以,一旦完成效果的添加,设计师几乎无法再进行修改。例如,输出一幅雾化效果的位图图像,您已经无法再恢复原来清晰的图像。

  而如果使用SVG支持的矢量滤镜,设计师同样可以创作出大量流行的和普遍的滤镜效果。并且,这样的滤镜效果是可调整的。因为SVG的矢量滤镜并不直接针对像素进行操作,而是作为某一个对象的独立属性保存在文件中。修改图像效果只需要重新调整这些属性,就可以完成对滤镜的修改、替换和删除,非常的便捷。SVG的矢量滤镜对于远程协作和二次编辑,提供了极大的自由度。

  关于滤镜的实例,请参看<<SVG中文教程>>

  基于
XML

  SVG的语法和结构基于XML(可扩展标识语言)。XML是下一代的网络开发语言,它提供的功能远远超过了目前使用的HTML(超文本链接语言)。当一个网站变得越来越复杂的同时,为了获得更好的管理和交互,网站开发者同样需要一个比HTML更优秀的网络开发语言和工具。这就是XML

  与HTML不同,XML完全分离了网站内容和网站构架。通过定义结构数据类型,用户端应用程序能够显示和处理,而不仅仅像HTML那样仅仅能显示,网页或数据。例如,一个利用XML标签定义的电话号码,可以根据需要,由浏览器进行拨号。XML所具有优秀的扩展性,使得它在网络工业应用上,比HTML有着更大的空间和前景。
SVG
的开发和创作是基于XML的,因此,我们也能在SVG中开发出更多新的功能以提供更多的网络服务。例如,制作智能化的数据图像。图像中的数据可以根据需要,由应用程序读取、修改和统计并最终在图像中显示。这些应用是目前HTML及相关图像技术远不可及的。

  文本格式

  SVG文件是一元(文本)格式的。SVG图像和动画具有了以下文本格式所具备的特点:
  1、作为基于文本的格式,SVG图像中的文字也是文本格式。这不同于现在图像和动画中的文字。目前图像和动画中的文字实质上都是图像。因此,SVG中的文字可以被网络搜索引擎做为关键词搜寻。利用这一性质,通过SVG中定义的文字,就可以制作出非常高效的图像搜索引擎。图像中的文字也可以被用户浏览器查找。
  2SVG图像可以方便的由程序语言来动态的生成。例如使用JavaScript,perl,Java等语言,开发自动图像和动画生成系统。这对于一些数据库制表是非常实用的。在线图像还可以根据后台数据库中的关系量实时的进行动态改变。
  3SVG完全支持DOM(文档物件模型)。因而SVG以及SVG中的对象可以通过脚本语言接受外部事件的驱动,例如鼠标动作、键盘动作等,实现对自身或对其他物件、图像的控制,制作交互式的图像和动画。

  4、因为是文本格式,SVG可以很好的跨平台工作,同时,还可以解决相关的外部输出、色彩模式、网络带宽等问题。

  简言之,文本格式使得SVG获得了与其它技术标准更大的交互和融合的特点。


  与GIFJPEG比较

  GIFJPEG都是目前网络普遍使用的位图格式。SVGGIFJPEG有很多独特的优势:
  1、具有很高的图像品质。因为是矢量图像,分辨率独立,用户可以自由的放缩图像而不会破坏图像的清晰度。这对于查看某些图像细节例如数据图像中的数字,非常的有用。
  2、图像中的文字独立。如上一小节所述,SVG图像中的文字独立于图像,可以进行文本编辑和查询。
  3、较小文件尺寸。因为基于矢量格式,由语句完成图像的保存,SVG图像相比较GIFJPEG具有更小的文件大小,下载更加迅速。
  4、色彩适应性更强。SVG图像具有一个1600万色彩的调色板,支持ICC(国际色彩协会)色彩标准,支持RGB色彩模式。

  5、可交互性。SVG基于XML,因而能轻易的制作强大的动态交互。SVG图像能对用户动作做出不同响应,例如高亮,声效,特效,动画等,体现了网络互动的本质。而GIFJPEG都不可以产生交互。


  与SWF比较

  SWF文件格式是Flash的输出文件格式。从某种意义上,SWFSVG有很多惊人的相似之处。但是,尽管Flash凭借其优越的表现形式和便利的创作工具成为目前网络动画设计的首选,SWF日益在网络中普及,但我们也应该看到,与SVG相比较,SWF存在着以下的不足:
  1SWF是一个非开放标准。这就意味着该技术掌握在个体手中,技术的发展受到方方面面的限制。同时,SWF与其他的开放标准也没有完整的融合方案。尽管SWF目前已经提供了对XML的支持,但这种支持是单方面的。随着XML及其他开放标准的发展,SWF的不协调性将日益显著。
  2SWF的可编辑性不如SVGSWF做为最终的动画生成格式,其创作过程封装在SWF文件中,几乎无法再进行二次编辑。同时,SWF也不提供对文本格式的支持,因此,无法获得类似SVG的查询图像中文字的功能。

 

svg工具分析

SVG创作工具

    目前的SVG创作工具还处于开发和研制阶段,仍然没有一款非常成熟的包含静态,动态,交互功能创作的软件.这里介绍几个目前可以进行一些研究和测试的SVG创作软件.

  Adobe Illustator

  AdobeSVG的开发中扮演了重要角色.Adobe Illustrator 9.0是较早的一款结合SVG功能的矢量创作软件.目前可以进行静态图形的创作和部分交互功能的实现.其交互功能需要手写javascript脚本.

  创作AI图像后,选择File->Export(文件->输出),选择文件类型SVG,SVG Option面板中设置相关属性,可以输出SVG文件,关于属性设置,请参看<<SVG中文教程>>.

  Web Draw

    WebDrawJasc Software按照W3C组织制定的SVG规范书开发的矢量图像和动画制作工具,专业应用于SVG创作.WebDraw通过直接画布拖拽绘图以及滤镜效果模块化组合,可以避免手写源代码.同时提供源代码视图窗口,支持后续源代码编辑和修改.
  软件的整体布局类似于目前许多的图形创作软件.与职业的矢量创作软件Adobe IllustratorCorel Draw相比较,Web Draw在功能上还不足以抗衡,但作为专业开发SVG的创作工具,也许可以预想,经过一段时间的积累,它将成为下一个成功的Fireworks.(Fireworks成功的开发了PNG格式
.)
  最新版本是Preview Release 4.目前还不支持动态SVG效果.另外, 应用滤镜效果并不能在画布真实表达输出后的SVG图像
.
  下载
(4.45M):
  http://www.jasc.com/webdraw.asp (国外
)
  http://www.2svg.com/ (国内)


Web Engine

IMS Web Engine (Interactive Multimedia System)Virtural Mechanics开发的一款网页创作软件,主要应用于创作静态和动态的HTML,DHTMLSVG页面.Web Engine是目前极少数不需要通过手写代码即可完成SVG动态交互创作的工具.它的精灵向导可以很快的定义简单的交互动作.
  Web Engine的界面比较粗旷,或者说不是很精细,很多操作是双击对象弹出面板,调整选项,这有点像当时的Flash3.04.0.Web Engine有一个比较不足的地方,给设计者带来很大的限制,就是没有提供源代码视图,无法直接进行源代码的修改和编辑
.
  目前的版本是
Version 2 Beta.
  下载
(3.86M):
  http://www.virtualmechanics.com/(国外
)
  http://www.2svg.com/ (国内)

 

市场分析

SVG的应用价值

    网络发展的需要,与其他开放标准兼容

  如同PNG作为W3C的位图图像工业标准,SVG是网络中解决矢量图像的工业标准.SVG以前,除了Macromedia开发了SWF作为矢量的网络文件格式,还没有其他的矢量文件在网络中应用.因为位图文件受到本身的很多局限,在图形印刷和传输中,矢量文件有很大的应用价值,所以,必定会有相应的矢量标准得到开发和应用,这就是SVG.
  作为W3C的推荐格式,SVG与现有的其他开放标准有很好的兼容性.这些标准包括DOM1DOM2CSSXMLXPointerXSLTXSLSMILHTMLXHTML.SVG与其他组织的标准化技术也能很好的协调一致,如ICCURIUNICODEsRGBECMAScript/JavaScript
Java.
  使用SVG并不意味着我们将从此放弃现在的网络图像技术如GIFJPEGSWF.相比较这些目前有普遍应用的文件格式,SVG更适合网络发展的需求,开发和应用SVG意味着获得一个更优秀的工具和方法
.

  数据表格,图像地图


  在应用领域,SVG可以非常适宜的应用在数据表格和图像地图中.SVG的源文件中,通过变量可以很方便的控制需要的图形生成.这就为网络图像数据表格提供了很大的应用前景.一个简单的例子,现有的asp可以方便的构建动态数据网页,利用SVG,则可以同样方便的绘制动态数据图像,例如数据分析中的柱状图和饼状图.
  制作图像地图同样是SVG的一大优势.由于SVG是矢量格式,图像可以在任何显示分辨率下获得同样的图像效果,文件放大观看时也不会有任何的品质损失,因而可以完全可以制作这样的图像地图,其中包含了一个城市所有的地理信息,文件可以根据观看这不同的需要,对不同的地区进行放大显示,同时,每一个地理名词又可以独立的包含一段文字说明,或者包含相应的地理数据,但用户需要时,可以通过点击地理名词获得解释说明.这样的图像地图文件的文件大小也仅仅是K字节级别
.

  无线设备的需求


  SVG另一个非常诱人的应用前景就是开发无线设备的图形和动画.例如目前使用的手机产品,其图像主要是WBMP.这种格式因为是位图文件,受到传输大小的限制,同时不提供彩色的色彩模式,所以显得很呆板.而如果利用SVG,只要在无线设备中安装一个文本解析器,就可以实现对SVG文件的识别和显示,同时,因为是矢量的文本文件,文件的尺寸不会很大,非常适合无线产品的网络传输.SVG还提供动画和多媒体编辑功能,所以可以支持二维的平面动画,支持声音文件和视频文件的播放.结合一些其他的技术,例如SMIL(多媒体同步整合语言),就可以实现创建一个非常理想的多媒体无线终端解决方案.


  图像搜索引擎


  不同于现在的二维图像,SVG是一个可实现交互和查询的文件格式.SVG图像中,信息是一元代码形式的,是开放形式的.文字独立于图形信息.这就为图像搜索和查询提供了可能.例如,在一个SVG动画中,通过搜索某一个关键字,就可以在图像中查询到对应的信息.而这对于同样是矢量图像和动画格式的SWF就不可能实现.依据SVG的这种交互性,可以创建大型的图像搜索引擎.

  网页设计思想的改变


  采用SVG进行网页设计,是下一代的网页设计思想.现在的网页设计,通常是在位图图像软件中绘制好整体页面图像,然后进行图像切割,最后完成页面的文字编辑.通常这样的工作是很繁琐的,进行二次修改也很不简便.而利用SVG,则可以实现页面图形设计和文字编辑的一步完成.如果要进行远程协作完成网页设计,也只需要传输创作后的页面文件,而不必将所有的图像源文件和页面文件都传输.
  因为SVG能够很好的与HTMLXML兼容,所以,下一代的网页编辑软件将开始结合图像创作功能.许多现在需要通过外部图像或动画软件创作的效果,将可以直接在网页编辑软件中完成
.
  结合SVG创作网页,将使网页设计师真正可以""出页面
.

   另外,有一些专业的计算机软件公司开发基于web的图形化软件,看到了svg的优势和前景。但是苦于没有一个好的创作工具而放弃。这是一个大的市场,笔者一直想开发一个用于软件公司的产品。

   这个工具一旦诞生,将是世界首家。市场非常广阔。

总体目标

产品目标定义

产品的目标除了吸收目前市场上产品的优点

可以用简单的图元进行静态svg的设计创建,同步源码和展现预览以外

增加新的目标是。

1,  java开发,跨平台

2,  工具可以和数据库交互

3,  可以定义事件

4,  增加组件库

5,  提供api供其它java软件项目调用

市场目标定位

第一步:面向专业的计算机公司

第二步:面向广告公司及更大的客户群

产品范围

组件设计工具

可以通过简单的图元和已有组件进行新的组件设计,但不涉及事件定义,只是简单的静态图形文件的创建。

总体设计工具

可以通过简单的图元和已有组件进行总体图形的设计。可以进行事件脚本设计,可以和后台数据库关联。图形属性更加丰富。

java解析展现工具

可以在java appJpanel上解析展现svg文件。

posted @ 2005-10-04 17:27 锋出磨砺 阅读(1795) | 评论 (2)编辑 收藏

喝下苦酒
品味美茗
静听绕梁
细弹绿绮
人生美不过如此

进入责任的年代
纷乱的时候
不知前途
忙活着找个苦力干
目标框进狭小的目光里

心不甘
别人都忙着跳龙门
当然也想
拼了 实现了
却有跳入另一个桎梏

亲情 恋情
怦然心动已过
心不死
结婚生子
离离合合

在圈内的桎梏里挣扎
为了好的生活
思想不是自己的思想
个性更没有自己的个性

到处都有责任的年龄
忍辱负重

posted @ 2005-10-02 18:15 锋出磨砺 阅读(303) | 评论 (1)编辑 收藏

生命之舟起航了
喝母乳的时候
开始涂抹自己人生的画卷

碎碎幼童
横不横 竖不竖
力道不够 心胸却大
听不懂绕梁音
记的住绿绮弦

长到冠礼
富贫异 教不同
体格各异 千篇思想
任创造发挥
奠日后根本

太阳青年
论不论 师不道
应试教育 各方压力
重压下题海
轻松里颓废

象牙塔
玩就玩 学就学
考试过关 天下太平
无顶梁本事
却大言不惭

社会熔炉
常奈何 心郁闷
谈婚论家 养家糊口
苦苦挣扎中
努力拼争里

到中年
上有老 下有小
教育孩子 重蹈覆辙
奈何在那里
梦婆也不知

朽木朽木
贫与贱 乐与悲
一捧黄土 半尺方堂
一辈子过了
下辈子重来

posted @ 2005-10-02 18:05 锋出磨砺 阅读(258) | 评论 (1)编辑 收藏

仅列出标题
共14页: First 上一页 6 7 8 9 10 11 12 13 14 下一页