<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5785493252397810252</id><updated>2011-07-08T08:36:04.216+08:00</updated><category term='C#'/><category term='Network'/><category term='Software Technology'/><category term='Data Structure'/><category term='Algorithm'/><category term='Economy'/><category term='RobotX'/><category term='Collections'/><category term='Microsoft'/><category term='World View'/><category term='SQL'/><category term='Hack'/><category term='Linux'/><category term='C/C++'/><category term='Delphi'/><category term='Work'/><category term='Hot Java'/><category term='Growing'/><category term='Oracle'/><category term='Tuxedo'/><category term='Pascal'/><category term='Google'/><category term='OS'/><title type='text'>Swetter is on the way</title><subtitle type='html'>黑色曼陀罗和绝望的爱</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default?start-index=101&amp;max-results=100'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>125</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-9179274699509950303</id><published>2009-05-08T21:34:00.001+08:00</published><updated>2009-05-08T21:35:53.835+08:00</updated><title type='text'>推荐一个不错的学习网站：启航</title><content type='html'>这是我的推广链接 &lt;br /&gt;http://www.myqihang.com/bbs/?fromuser=swetter&lt;br /&gt;经常在这里的Delphi板块逛的，不再奔跑老大发的视频都挺不错&lt;br /&gt;大家可以去下来看看&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-9179274699509950303?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/9179274699509950303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=9179274699509950303' title='36 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/9179274699509950303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/9179274699509950303'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/05/blog-post.html' title='推荐一个不错的学习网站：启航'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>36</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-5109775056207194764</id><published>2009-05-02T20:44:00.000+08:00</published><updated>2009-05-02T20:45:08.131+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>ProC</title><content type='html'>这个ProC就是简单的将一段范例代码做了很小很小的修改&lt;br /&gt;makefile文件也要相应的增加&lt;br /&gt;&lt;br /&gt;/* -------------------------------------------------------&lt;br /&gt; *      myproc.pc&lt;br /&gt; * Author: Youbin Wang&lt;br /&gt; * Rem  : 2009.04.28  create the file&lt;br /&gt; * ------------------------------------------------------- */&lt;br /&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;#include &lt;string.h&gt;&lt;br /&gt;#include &lt;stdlib.h&gt;&lt;br /&gt;#include &lt;sqlda.h&gt;&lt;br /&gt;#include &lt;sqlcpr.h&gt;&lt;br /&gt;#include &lt;oraca.h&gt;&lt;br /&gt;#include &lt;sqlca.h&gt;&lt;br /&gt;#include &lt;myproc.h&gt;&lt;br /&gt;#include "mystructs.h"&lt;br /&gt;&lt;br /&gt;EXEC SQL BEGIN DECLARE SECTION;&lt;br /&gt;#define UNAME_LEN  20&lt;br /&gt;#define PWD_LEN    40&lt;br /&gt;&lt;br /&gt;VARCHAR username[UNAME_LEN];&lt;br /&gt;VARCHAR password[PWD_LEN];&lt;br /&gt;&lt;br /&gt;/* host structure for output value */&lt;br /&gt;struct&lt;br /&gt;{&lt;br /&gt; VARCHAR emp_name[UNAME_LEN];&lt;br /&gt; float   salary;&lt;br /&gt; float   commission;&lt;br /&gt;}emprec;&lt;br /&gt;&lt;br /&gt;/* indicator structure to correspond to host output struct */&lt;br /&gt;struct&lt;br /&gt;{&lt;br /&gt; short emp_name_ind;&lt;br /&gt; short sal_ind;&lt;br /&gt; short comm_ind;&lt;br /&gt;}emprec_ind;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int emp_number;&lt;br /&gt;int total_queried;&lt;br /&gt;int i_num;&lt;br /&gt;&lt;br /&gt;EXEC SQL END DECLARE SECTION;&lt;br /&gt;&lt;br /&gt;/* Sql communications area.&lt;br /&gt;   you car user #include or EXEC SQL INCLUDE.*/&lt;br /&gt;#include &lt;sqlca.h&gt;&lt;br /&gt;&lt;br /&gt;int sql_error(msg)&lt;br /&gt; char *msg;&lt;br /&gt;{&lt;br /&gt; char err_msg[128];&lt;br /&gt; size_t buf_len, msg_len;&lt;br /&gt; EXEC SQL WHENEVER SQLERROR CONTINUE;&lt;br /&gt;&lt;br /&gt; printf("\n%s\n", msg);&lt;br /&gt; buf_len = sizeof(err_msg);&lt;br /&gt; sqlglm(err_msg, &amp;buf_len, &amp;msg_len);&lt;br /&gt; printf("%.*s\n", msg_len, err_msg);&lt;br /&gt;&lt;br /&gt; EXEC SQL ROLLBACK RELEASE;&lt;br /&gt; exit(EXIT_FAILURE);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int srv_to_proc(int input,int s_socket)&lt;br /&gt;{&lt;br /&gt; char temp_char[32];&lt;br /&gt; /* connect to ORACLE  */&lt;br /&gt; strncpy((char*)username.arr,"SCOTT",UNAME_LEN);&lt;br /&gt; username.len = &lt;br /&gt;  (unsigned short)strlen((char*)username.arr);&lt;br /&gt; strncpy((char*)password.arr,"TIGER",PWD_LEN);&lt;br /&gt; password.len =&lt;br /&gt;  (unsigned short)strlen((char*)password.arr);&lt;br /&gt;&lt;br /&gt; EXEC SQL CONNECT :username IDENTIFIED BY :password;&lt;br /&gt;&lt;br /&gt; printf("\nConnected to ORACLE as user:%s \n",username.arr);&lt;br /&gt;&lt;br /&gt; &lt;br /&gt; total_queried  = 0;&lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    EXEC SQL WHENEVER NOT FOUND GOTO notfound;&lt;br /&gt;&lt;br /&gt; printf("\n\nemployee   Salary   Commission\n");&lt;br /&gt;  printf("--------   -------   ----------\n");&lt;br /&gt; &lt;br /&gt;  &lt;br /&gt; i_num=input;  &lt;br /&gt; EXEC SQL SELECT ename, sal, comm &lt;br /&gt;     INTO :emprec INDICATOR :emprec_ind&lt;br /&gt;        FROM EMP WHERE rownum = :i_num ;&lt;br /&gt;&lt;br /&gt; emprec.emp_name.arr[emprec.emp_name.len] = '\0';&lt;br /&gt;  printf("%s      %7.2f     ",&lt;br /&gt; emprec.emp_name.arr, emprec.salary);&lt;br /&gt;  if (-1 == emprec_ind.comm_ind)&lt;br /&gt;   printf("NULL\n");&lt;br /&gt;  else&lt;br /&gt;   printf("%7.2f\n", emprec.commission);&lt;br /&gt;&lt;br /&gt; send(s_socket,(char *)&amp;emprec, sizeof(emprec), 0);&lt;br /&gt;notfound:&lt;br /&gt; printf("\nNot data left - try again.\n");&lt;br /&gt;&lt;br /&gt; printf("\n\nTotal rows returned was %d.\n", total_queried);&lt;br /&gt; printf("\n bye bye. \n\n\n");&lt;br /&gt;&lt;br /&gt; //Disconnect from ORACLE&lt;br /&gt; EXEC SQL ROLLBACK WORK RELEASE;&lt;br /&gt; exit(EXIT_SUCCESS);&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-5109775056207194764?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/5109775056207194764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=5109775056207194764' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/5109775056207194764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/5109775056207194764'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/05/proc.html' title='ProC'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-2842103061668141605</id><published>2009-04-25T13:05:00.002+08:00</published><updated>2009-04-25T13:12:05.613+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>改写为C/S模式</title><content type='html'>上次贴的C代码有不少不规范的地方&lt;br /&gt;随着学习的深入我把代码改写了下，写成C/S模式，但是运行时客户端只能连上一次服务器然后就断开。正在DEBUG&lt;br /&gt;&lt;br /&gt;----------------------------makefile-------------------------------------------&lt;br /&gt;# This makefile will generate "filetool" with fileoperator.c and fileoperator.h&lt;br /&gt;# Author: Youbin Wang&lt;br /&gt;# Date: 2009.04.17&lt;br /&gt;&lt;br /&gt;OBJECTS=menu.o puberr.o simplecli.o&lt;br /&gt;INCLUDE=-I/home/user01/NO05/include&lt;br /&gt;MYPATH=/home/user01/NO05/bin&lt;br /&gt;SERVEROBJ=simplesrv.o&lt;br /&gt;&lt;br /&gt;all:filetool server&lt;br /&gt;&lt;br /&gt;filetool: $(OBJECTS)&lt;br /&gt; gcc -o filetool $(OBJECTS)&lt;br /&gt; mv filetool $(MYPATH)&lt;br /&gt;&lt;br /&gt;menu.o:menu.c&lt;br /&gt; gcc $(INCLUDE) -c menu.c&lt;br /&gt; `&lt;br /&gt;puberr.o:puberr.c&lt;br /&gt; gcc $(INCLUDE) -c puberr.c&lt;br /&gt;&lt;br /&gt;simplecli.o:simplecli.c&lt;br /&gt; gcc $(INCLUDE) -c simplecli.c&lt;br /&gt;&lt;br /&gt;server : $(SERVEROBJ) puberr.o&lt;br /&gt; gcc -o server $(SERVEROBJ) puberr.o&lt;br /&gt; mv server $(MYPATH)&lt;br /&gt;&lt;br /&gt;simplesrv.o:simplesrv.c&lt;br /&gt; gcc $(INCLUDE) -c simplesrv.c&lt;br /&gt;&lt;br /&gt;clean:&lt;br /&gt; rm $(OBJECTS) $(SERVEROBJ)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;------------------------------------menu.c-----------------------------------&lt;br /&gt;/* -------------------------------------------------------&lt;br /&gt; * $Source : menu.c 16-apr-2009.17:00:00 Youbin Wang $&lt;br /&gt; * Function: Provide main menu and invoke client socket function&lt;br /&gt; * Author  : Youbin Wang&lt;br /&gt; * Record  :&lt;br /&gt;   2009.04.24 Change programme to c/s structure.&lt;br /&gt; *   2009.04.22 Add errlog.&lt;br /&gt; *   2009.04.16 Add the Version commentary. &lt;br /&gt; *   2009.04.15 Create the main programme.&lt;br /&gt; * ------------------------------------------------------- */&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;#include &lt;stdlib.h&gt;&lt;br /&gt;#include &lt;menu.h&gt;&lt;br /&gt;#include &lt;puberr.h&gt;&lt;br /&gt;#include &lt;simplecli.h&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/* -------------------------------------------------------&lt;br /&gt; *                global values&lt;br /&gt; * ------------------------------------------------------- */&lt;br /&gt;char * g_syslog="mytest";&lt;br /&gt;char * g_print_str="testfile";&lt;br /&gt;&lt;br /&gt;/* -------------------------------------------------------&lt;br /&gt; * Show main menu if user haven't decided to exit the system&lt;br /&gt; * or they just finish one operation&lt;br /&gt; * Input parameter: none&lt;br /&gt; * Output Parameter: return 0 while execute successfully&lt;br /&gt; * ------------------------------------------------------- */&lt;br /&gt;int show_menu()&lt;br /&gt;{&lt;br /&gt; printf(" --------------------------------------------\n");&lt;br /&gt; printf("        Welcome TO This  Programme           \n");&lt;br /&gt; printf("           This is the Main Menu             \n");&lt;br /&gt; printf(" --------------------------------------------\n");&lt;br /&gt; printf("\n");&lt;br /&gt; printf("Please Make your selection\n");&lt;br /&gt; printf(" 1: Create a new file and write;\n");&lt;br /&gt; printf(" 2: Open a file and write;\n");&lt;br /&gt; printf(" 3: Open a file with read-only mode;\n");&lt;br /&gt; printf(" 4: Exit;\n");&lt;br /&gt; printf("\n");&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/* -------------------------------------------------------&lt;br /&gt; * if the user choose to exit the system then invoke this function&lt;br /&gt; * InputParameter:None&lt;br /&gt; * OutputParameter: retrun 0 while execute successfully&lt;br /&gt; * ------------------------------------------------------- */&lt;br /&gt;int exit_system()&lt;br /&gt;{ &lt;br /&gt; printf("\n");&lt;br /&gt; printf("Exiting.........\n");&lt;br /&gt; printf("\n");&lt;br /&gt; printf("  Thank you for using this system.\n");&lt;br /&gt; printf("\n");&lt;br /&gt; printf("  If you have any problems or advices,contract the author at qisi1986@gmail.com\n");&lt;br /&gt; printf("\n");&lt;br /&gt; printf("  Wish you a good day. Bye Bye.\n");&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* -------------------------------------------------------&lt;br /&gt; * invoke if the user input the selection&lt;br /&gt; * InputParamete r: the selection of user&lt;br /&gt; * OutputParameter: return 0 while successfully&lt;br /&gt; * Hint           : if the user put the wrong key then it will provide hints&lt;br /&gt; * ------------------------------------------------------- */&lt;br /&gt;int selection(int Index)&lt;br /&gt;{&lt;br /&gt; int i_return=1;&lt;br /&gt; printf("Your Selection is %d \n", Index);&lt;br /&gt; printf("Now will invoke corresponding function,please wait.");&lt;br /&gt; printf("\n");&lt;br /&gt; sleep(1);&lt;br /&gt; switch(Index)&lt;br /&gt; {&lt;br /&gt;  case 1:&lt;br /&gt;   i_return = use_socket("127.0.0.1",1);&lt;br /&gt;   break;&lt;br /&gt;  case 2:&lt;br /&gt;   i_return = use_socket("127.0.0.1",2);&lt;br /&gt;   break;&lt;br /&gt;  case 3:&lt;br /&gt;   i_return = use_socket("127.0.0.1",3);&lt;br /&gt;   break;&lt;br /&gt;  case 4:&lt;br /&gt;   exit_system();&lt;br /&gt;   break;&lt;br /&gt;  default:&lt;br /&gt;   printf("Error!Please Enter a correct number!\n");&lt;br /&gt;   pub_err(2,__FILE__,__LINE__,g_syslog,"Enter an error number %s\n",g_print_str);&lt;br /&gt;   sleep(1);&lt;br /&gt; }&lt;br /&gt; if(0 == i_return)&lt;br /&gt;  printf("Operation successfully!!\n");&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  printf("Opeartion failed, please retry!\n");&lt;br /&gt;  i_return = 1;&lt;br /&gt;  return 1; &lt;br /&gt; }&lt;br /&gt; i_return = 1;&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{   &lt;br /&gt; int inputInt;&lt;br /&gt; system("clear");&lt;br /&gt; while(inputInt != 4)&lt;br /&gt; {&lt;br /&gt;  system("clear");&lt;br /&gt;  show_menu();&lt;br /&gt;  printf("Enter your selection here: ");&lt;br /&gt;  scanf("%d", &amp;inputInt);&lt;br /&gt;  selection(inputInt);&lt;br /&gt; }&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-------------------------------puberr.c----------------------------------&lt;br /&gt;#include &lt;stdarg.h&gt;&lt;br /&gt;#include &lt;string.h&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;#include &lt;sys/types.h&gt;&lt;br /&gt;#include &lt;time.h&gt;&lt;br /&gt;#include &lt;errno.h&gt;&lt;br /&gt;&lt;br /&gt;#define FNAME_LEN 128&lt;br /&gt;void pub_time(long *plHostDate, long *plHostTime)&lt;br /&gt;{&lt;br /&gt;    struct tm *p;&lt;br /&gt;    time_t tmp;&lt;br /&gt;&lt;br /&gt;    time(&amp;(tmp));&lt;br /&gt;    p = localtime(&amp;tmp);&lt;br /&gt;    p-&gt;tm_year += 1899;&lt;br /&gt;&lt;br /&gt;    if (plHostDate != NULL)&lt;br /&gt;        *plHostDate =&lt;br /&gt;            (p-&gt;tm_year + 1) * 10000 + (p-&gt;tm_mon + 1) * 100 + p-&gt;tm_mday;&lt;br /&gt;    if (plHostTime != NULL)&lt;br /&gt;        *plHostTime = p-&gt;tm_hour * 10000 + p-&gt;tm_min * 100 + p-&gt;tm_sec;&lt;br /&gt;    return;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int _p_log(char *tmp_buf)&lt;br /&gt;{&lt;br /&gt; char logname[FNAME_LEN];&lt;br /&gt; FILE *fp_log;&lt;br /&gt; long l_date, l_time;&lt;br /&gt;&lt;br /&gt; /*错误日志 */&lt;br /&gt; pub_time(&amp;l_date, &amp;l_time);&lt;br /&gt; sprintf(logname, "%s/log/pub_err%ld.log", getenv("HOME"),l_date);&lt;br /&gt;// sprintf(logname, "../log/pub_err%ld.log", l_date);&lt;br /&gt; &lt;br /&gt; if ((fp_log = fopen(logname, "a")) != NULL) {&lt;br /&gt;  fprintf(fp_log, "[%06ld/%06ld] %s\n", l_date % 1000000, l_time, tmp_buf);&lt;br /&gt;&lt;br /&gt;  fclose(fp_log);  &lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  fprintf(stderr, "[%06ld/%06ld] %s\n", l_date % 1000000, l_time, tmp_buf);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;int pub_err(ret_code, file, line, recode, ...)&lt;br /&gt;int ret_code;&lt;br /&gt;char *file;&lt;br /&gt;long line;&lt;br /&gt;char *recode&lt;br /&gt;*/&lt;br /&gt;int pub_err(int ret_code, char *file, long line, char *recode, ...)&lt;br /&gt;{&lt;br /&gt; short i;&lt;br /&gt; char *fmt, tmp_buf[2048], log[2048];&lt;br /&gt; va_list args;&lt;br /&gt;&lt;br /&gt; memset(tmp_buf, 0, 2048);&lt;br /&gt; va_start(args,recode);&lt;br /&gt; fmt = va_arg(args, char *);&lt;br /&gt; vsprintf(tmp_buf, fmt, args);&lt;br /&gt; va_end(args);&lt;br /&gt; if (ret_code &gt;= 0) &lt;br /&gt; {&lt;br /&gt;  sprintf(log, "run message [%s][%ld][%s]", file, line,tmp_buf);&lt;br /&gt;  _p_log(log);&lt;br /&gt; }&lt;br /&gt; return ret_code;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;------------------------------simplecli.c--------------------------------&lt;br /&gt;/* ----------------------------------------------------------------&lt;br /&gt; *       simplecli.c&lt;br /&gt; * Function:provide use_socket to set up a client socket&lt;br /&gt; *   and send the selection of user to server&lt;br /&gt; * Record of Modification:&lt;br /&gt; *    2009.04.24:Create function user_socket and test main&lt;br /&gt; * ---------------------------------------------------------------- */&lt;br /&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;#include &lt;sys/socket.h&gt;&lt;br /&gt;#include &lt;unistd.h&gt;&lt;br /&gt;#include &lt;sys/types.h&gt;&lt;br /&gt;#include &lt;netinet/in.h&gt;&lt;br /&gt;#include &lt;stdlib.h&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// define the defualt connect port id&lt;br /&gt;#define SERVER_PORT 20130 &lt;br /&gt;// define the defualt client port as a random port&lt;br /&gt;#define CLIENT_PORT ((20001+rand())%65536)&lt;br /&gt;#define BUFFER_SIZE 255&lt;br /&gt;#define REUQEST_MESSAGE "welcome to connect the server.\n"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int use_socket(char* ip, int i_select)&lt;br /&gt;{&lt;br /&gt; int servfd,clifd,length = 0;&lt;br /&gt; int recvbyte;&lt;br /&gt; struct sockaddr_in servaddr,cliaddr;&lt;br /&gt; socklen_t socklen = sizeof(servaddr);&lt;br /&gt; char buf[BUFFER_SIZE];&lt;br /&gt;&lt;br /&gt; if ((clifd = socket(AF_INET,SOCK_STREAM,0)) &lt; 0)&lt;br /&gt; {&lt;br /&gt;  printf("create socket error!\n");&lt;br /&gt;  exit(1);&lt;br /&gt; }&lt;br /&gt; srand(time(NULL));//initialize random generator&lt;br /&gt;&lt;br /&gt; bzero(&amp;cliaddr,sizeof(cliaddr));&lt;br /&gt; cliaddr.sin_family = AF_INET;&lt;br /&gt; cliaddr.sin_port = htons(CLIENT_PORT);&lt;br /&gt; cliaddr.sin_addr.s_addr = htons(INADDR_ANY);&lt;br /&gt;&lt;br /&gt; bzero(&amp;servaddr,sizeof(servaddr));&lt;br /&gt; servaddr.sin_family = AF_INET;&lt;br /&gt; //inet_aton(argv[1],&amp;servaddr.sin_addr);&lt;br /&gt; //servaddr.sin_addr.s_addr=inet_addr(ip); &lt;br /&gt; inet_aton(ip,&amp;servaddr.sin_addr);&lt;br /&gt; servaddr.sin_port = htons(SERVER_PORT);&lt;br /&gt; //servaddr.sin_addr.s_addr = htons(INADDR_ANY);&lt;br /&gt;&lt;br /&gt; if (bind(clifd,(struct sockaddr*)&amp;cliaddr,sizeof(cliaddr))&lt;0)&lt;br /&gt; {&lt;br /&gt;  printf("bind to port %d failure!\n",CLIENT_PORT);&lt;br /&gt;  exit(1);&lt;br /&gt; }&lt;br /&gt; if (connect(clifd,(struct sockaddr*)&amp;servaddr, socklen) &lt; 0)&lt;br /&gt; {&lt;br /&gt;  printf("can't connect to %s!\n",ip);&lt;br /&gt;  exit(1);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; send(servfd,(char *)&amp;i_select,sizeof(i_select),0);&lt;br /&gt; length = recv(clifd,(char *)&amp;recvbyte,sizeof(recvbyte),0);&lt;br /&gt; if(length &lt; 0)&lt;br /&gt; {&lt;br /&gt;  printf("error comes when recieve data from server %s!", ip);&lt;br /&gt;  exit(1);&lt;br /&gt; }&lt;br /&gt; if(recvbyte == 0)&lt;br /&gt; {&lt;br /&gt;  close(clifd);&lt;br /&gt;  return 0;&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  close(clifd);&lt;br /&gt;  exit(1);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*-----------this is the test main function of use_socket-----------&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt; int i=3;&lt;br /&gt; if(use_socket("127.0.0.1", i))&lt;br /&gt;  printf("successful");&lt;br /&gt; else&lt;br /&gt;  printf("failed");&lt;br /&gt; return 0;&lt;br /&gt; &lt;br /&gt;}-------------------------------------------------------------------*/&lt;br /&gt;&lt;br /&gt;--------------------------simplesrv.c-------------------------------------&lt;br /&gt;/* -------------------------------------------------------&lt;br /&gt; *      simplesrv.c&lt;br /&gt; * Function:Start the server and listen a port&lt;br /&gt; *    When client send data, it recieve data&lt;br /&gt; *    deal with the data and send feedback info&lt;br /&gt; * Record of Modification:&lt;br /&gt; *   2009.04.23: Create it.&lt;br /&gt; * -------------------------------------------------------*/&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;#include &lt;sys/socket.h&gt;&lt;br /&gt;#include &lt;unistd.h&gt;&lt;br /&gt;#include &lt;sys/types.h&gt;&lt;br /&gt;#include &lt;netinet/in.h&gt;&lt;br /&gt;#include &lt;stdlib.h&gt;&lt;br /&gt;#include &lt;time.h&gt;&lt;br /&gt;#include "puberr.h"&lt;br /&gt;&lt;br /&gt;#define SERVER_PORT 20130 // define the defualt connect port id&lt;br /&gt;#define LENGTH_OF_LISTEN_QUEUE 10 //length of listen queue in server&lt;br /&gt;#define BUFFER_SIZE 255&lt;br /&gt;#define WELCOME_MESSAGE "welcome to connect the server. "&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/* -------------------------------------------------------&lt;br /&gt; *                global values&lt;br /&gt; * ------------------------------------------------------- */&lt;br /&gt;char * g_syslog="mytest";&lt;br /&gt;char * g_print_str="testfile";&lt;br /&gt;&lt;br /&gt;/* ------------------------------------------------------- &lt;br /&gt; * invoke when the user choose to open a file with readonly mode(3)&lt;br /&gt; * InputParameter:None&lt;br /&gt; * OutputParameter: return 0 if execute successfully, 1 if error occured &lt;br /&gt; * ------------------------------------------------------- */&lt;br /&gt;int open_file_readonly()&lt;br /&gt;{&lt;br /&gt; char c_output;&lt;br /&gt; FILE *fl_p_readonly;&lt;br /&gt; fl_p_readonly = fopen("mytext.txt","rt");&lt;br /&gt; &lt;br /&gt; printf("Reading mytext.txt ...\n");&lt;br /&gt; if(NULL==fl_p_readonly)&lt;br /&gt; {&lt;br /&gt;  pub_err(2, __FILE__, __LINE__, g_syslog, "Cannot open file mytext.txt in read-only mode %s\n", g_print_str);&lt;br /&gt;  getchar();&lt;br /&gt;  return 1;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; printf("Open file successfully! \n");&lt;br /&gt; sleep(1);&lt;br /&gt; c_output=fgetc(fl_p_readonly);&lt;br /&gt; while(c_output!=EOF)&lt;br /&gt; {&lt;br /&gt;  printf("Reading the text...\n");&lt;br /&gt;  sleep(1);&lt;br /&gt;  putchar(c_output);&lt;br /&gt;  c_output=fgetc(fl_p_readonly);&lt;br /&gt; }&lt;br /&gt; fclose(fl_p_readonly);&lt;br /&gt; pub_err(2, __FILE__, __LINE__, g_syslog,"Close the file %s\n", g_print_str);&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* -------------------------------------------------------&lt;br /&gt; * invoke when the user choose to create a new file(1) &lt;br /&gt; * InputParameter: None&lt;br /&gt; * OutputParameter: return 0 if execute successfully, 1 if error accured&lt;br /&gt; * -------------------------------------------------------*/&lt;br /&gt;int create_file()&lt;br /&gt;{&lt;br /&gt; printf("Creating a file ..\n");&lt;br /&gt; FILE *fl_createfile;&lt;br /&gt; fl_createfile = fopen("new.txt","wt+");&lt;br /&gt; if(NULL==fl_createfile)&lt;br /&gt; {&lt;br /&gt;  pub_err(2, __FILE__, __LINE__, g_syslog, "Cannot create a file %s\n",g_print_str);&lt;br /&gt;  getchar();&lt;br /&gt;  return 1;&lt;br /&gt; } &lt;br /&gt; char c_inputchar;&lt;br /&gt; printf("Successfully create a file...\n");&lt;br /&gt; sleep(1);&lt;br /&gt; printf("Please input your text: \n");&lt;br /&gt; while (c_inputchar!='\n')&lt;br /&gt; {   &lt;br /&gt;  printf("I'm reading your input\n");&lt;br /&gt;  fputc(c_inputchar,fl_createfile);&lt;br /&gt;  c_inputchar=getchar();&lt;br /&gt; }&lt;br /&gt; /* rewind the position of file pointer to the top of file */&lt;br /&gt; rewind(fl_createfile);&lt;br /&gt; printf("Your inputment is: ");&lt;br /&gt; c_inputchar=fgetc(fl_createfile);&lt;br /&gt; while(c_inputchar!=EOF)&lt;br /&gt; {&lt;br /&gt;  printf("I'm writing your input\n");&lt;br /&gt;  putchar(c_inputchar);&lt;br /&gt;  c_inputchar=fgetc(fl_createfile);&lt;br /&gt; }&lt;br /&gt; printf("\n");     &lt;br /&gt; fclose(fl_createfile);&lt;br /&gt; printf("Done!!\n");&lt;br /&gt; sleep(1);&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* -------------------------------------------------------&lt;br /&gt; * if the user choose to open a exist file(2) and write then invoke this function&lt;br /&gt; * InputParameter:None&lt;br /&gt; * OutputParameter: return 0 if execute successfully, 1 if an error occured&lt;br /&gt; * ------------------------------------------------------- */&lt;br /&gt;int open_file()&lt;br /&gt;{&lt;br /&gt; printf("Opening a file...\n");&lt;br /&gt; FILE *fl_openfile;&lt;br /&gt; fl_openfile = fopen("mytext.txt","wt+");&lt;br /&gt; if(NULL==fl_openfile)&lt;br /&gt; {&lt;br /&gt;  pub_err(2,__FILE__,__LINE__,g_syslog,"Cannot open a file %s\n",g_print_str);&lt;br /&gt;  getchar();&lt;br /&gt;  return 1;  &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; char c_inputchar;&lt;br /&gt; printf("Successfully open a file");&lt;br /&gt; printf("Please input your text: \n");&lt;br /&gt; while (c_inputchar!='\n')&lt;br /&gt; {&lt;br /&gt;  fputc(c_inputchar,fl_openfile);&lt;br /&gt;  c_inputchar=getchar();&lt;br /&gt; }&lt;br /&gt; /* rewind the position of file pointer to the top of file */&lt;br /&gt; rewind(fl_openfile);&lt;br /&gt; printf("Your inputment is: ");&lt;br /&gt; c_inputchar=fgetc(fl_openfile);&lt;br /&gt; while(c_inputchar!=EOF)&lt;br /&gt; {&lt;br /&gt;  putchar(c_inputchar);&lt;br /&gt;  c_inputchar=fgetc(fl_openfile);&lt;br /&gt; }&lt;br /&gt; printf("\n");     &lt;br /&gt; fclose(fl_openfile);&lt;br /&gt; printf("Done!!\n");&lt;br /&gt; sleep(1);&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* -------------------------------------------------------&lt;br /&gt; * invoke if the user input the selection&lt;br /&gt; * InputParamete r: the selection of user&lt;br /&gt; * OutputParameter: return 0 while successfully&lt;br /&gt; * Hint           : if the user put the wrong key then it will provide hints&lt;br /&gt; * ------------------------------------------------------- */&lt;br /&gt;int selection(int i_input)&lt;br /&gt;{&lt;br /&gt; switch(i_input)&lt;br /&gt; {&lt;br /&gt;  case 1:&lt;br /&gt;   create_file();&lt;br /&gt;   break;&lt;br /&gt;  case 2:&lt;br /&gt;   open_file();&lt;br /&gt;   break;&lt;br /&gt;  case 3:&lt;br /&gt;   open_file_readonly();&lt;br /&gt;   break;&lt;br /&gt;  default:&lt;br /&gt;   pub_err(2,__FILE__,__LINE__,g_syslog,"Enter an error number %s\n",g_print_str);&lt;br /&gt;   return 1;&lt;br /&gt; }&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int main(int argc, char **argv)&lt;br /&gt;{&lt;br /&gt; int servfd,clifd,recvbyte;&lt;br /&gt; int length=0;&lt;br /&gt; int sel_feedback=1;&lt;br /&gt; struct sockaddr_in servaddr,cliaddr;&lt;br /&gt; if ((servfd = socket(AF_INET,SOCK_STREAM,0)) &lt; 0)&lt;br /&gt; {&lt;br /&gt;  printf("create socket error!\n");&lt;br /&gt;  exit(1);&lt;br /&gt; }&lt;br /&gt; bzero(&amp;servaddr,sizeof(servaddr));&lt;br /&gt; servaddr.sin_family = AF_INET;&lt;br /&gt; servaddr.sin_port = htons(SERVER_PORT);&lt;br /&gt; servaddr.sin_addr.s_addr = htons(INADDR_ANY);&lt;br /&gt; if (bind(servfd,(struct sockaddr*)&amp;servaddr,sizeof(servaddr))&lt;0)&lt;br /&gt; {&lt;br /&gt;  printf("bind to port %d failure!\n",SERVER_PORT);&lt;br /&gt;  exit(1);&lt;br /&gt; }&lt;br /&gt; if (listen(servfd,LENGTH_OF_LISTEN_QUEUE) &lt; 0)&lt;br /&gt; {&lt;br /&gt;  printf("call listen failure!\n");&lt;br /&gt;  exit(1);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; while (1)&lt;br /&gt; {//server loop will nerver exit unless any body kill the process&lt;br /&gt;  char buf[BUFFER_SIZE];&lt;br /&gt;  long timestamp;&lt;br /&gt;  socklen_t length = sizeof(cliaddr);&lt;br /&gt;  clifd = accept(servfd,(struct sockaddr*)&amp;cliaddr,&amp;length);&lt;br /&gt;  if (clifd &lt; 0)&lt;br /&gt;  {&lt;br /&gt;   printf("error comes when call accept!\n");&lt;br /&gt;   break;&lt;br /&gt;  }&lt;br /&gt;  strcpy(buf,WELCOME_MESSAGE);&lt;br /&gt;  //inet_ntop(INET_ADDRSTRLEN,cliaddr.sin_addr,buf,BUFFER_SIZE);&lt;br /&gt;  printf("from client,IP:%s,Port:%d\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));&lt;br /&gt;  timestamp = time(NULL);&lt;br /&gt;  strcat(buf,"timestamp in server:");&lt;br /&gt;  strcat(buf,ctime(&amp;timestamp));&lt;br /&gt;  //send(clifd,buf,BUFFER_SIZE,0);&lt;br /&gt;  length=recv(servfd,(char *)&amp;recvbyte,sizeof(recvbyte),0);&lt;br /&gt;  if(length&lt;0)&lt;br /&gt;  {&lt;br /&gt;   printf("error comes when recieve data from client");&lt;br /&gt;   close(clifd);&lt;br /&gt;   exit(1);&lt;br /&gt;  }&lt;br /&gt;  sel_feedback = selection(recvbyte);&lt;br /&gt;  send(clifd,(char *)sel_feedback,sizeof(sel_feedback),0);&lt;br /&gt;  close(clifd);&lt;br /&gt;  sel_feedback = 1;&lt;br /&gt; }//exit&lt;br /&gt; close(servfd);&lt;br /&gt; return 0;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-2842103061668141605?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/2842103061668141605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=2842103061668141605' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/2842103061668141605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/2842103061668141605'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/04/cs.html' title='改写为C/S模式'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-2360163579288691199</id><published>2009-04-22T12:30:00.000+08:00</published><updated>2009-04-22T12:31:03.964+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>vi常用命令</title><content type='html'>进入vi的命令&lt;br /&gt;　　vi filename :打开或新建文件，并将光标置于第一行首&lt;br /&gt;　　vi +n filename ：打开文件，并将光标置于第n行首&lt;br /&gt;　　vi + filename ：打开文件，并将光标置于最后一行首&lt;br /&gt;　　vi +/pattern filename：打开文件，并将光标置于第一个与pattern匹配的串处&lt;br /&gt;　　vi -r filename ：在上次正用vi编辑时发生系统崩溃，恢复filename&lt;br /&gt;　　vi filename....filename ：打开多个文件，依次进行编辑&lt;br /&gt;　　&lt;br /&gt;　　移动光标类命令[/b]&lt;br /&gt;　　h ：光标左移一个字符&lt;br /&gt;　　l ：光标右移一个字符&lt;br /&gt;　　space：光标右移一个字符&lt;br /&gt;　　Backspace：光标左移一个字符&lt;br /&gt;　　k或Ctrl+p：光标上移一行&lt;br /&gt;　　j或Ctrl+n ：光标下移一行&lt;br /&gt;　　Enter ：光标下移一行&lt;br /&gt;　　w或W ：光标右移一个字至字首&lt;br /&gt;　　b或B ：光标左移一个字至字首&lt;br /&gt;　　e或E ：光标右移一个字至字尾&lt;br /&gt;　　) ：光标移至句尾&lt;br /&gt;　　( ：光标移至句首&lt;br /&gt;　　}：光标移至段落开头&lt;br /&gt;　　{：光标移至段落结尾&lt;br /&gt;　　nG：光标移至第n行首&lt;br /&gt;　　n+：光标下移n行&lt;br /&gt;　　n-：光标上移n行&lt;br /&gt;　　n$：光标移至第n行尾&lt;br /&gt;　　H ：光标移至屏幕顶行&lt;br /&gt;　　M ：光标移至屏幕中间行&lt;br /&gt;　　L ：光标移至屏幕最后行&lt;br /&gt;　　0：（注意是数字零）光标移至当前行首&lt;br /&gt;　　$：光标移至当前行尾&lt;br /&gt;　　&lt;br /&gt;　　屏幕翻滚类命令&lt;br /&gt;　　Ctrl+u：向文件首翻半屏&lt;br /&gt;　　Ctrl+d：向文件尾翻半屏&lt;br /&gt;　　Ctrl+f：向文件尾翻一屏&lt;br /&gt;　　Ctrl＋b；向文件首翻一屏&lt;br /&gt;　　nz：将第n行滚至屏幕顶部，不指定n时将当前行滚至屏幕顶部。&lt;br /&gt;　　&lt;br /&gt;　　插入文本类命令&lt;br /&gt;　　i ：在光标前&lt;br /&gt;　　I ：在当前行首&lt;br /&gt;　　a：光标后&lt;br /&gt;　　A：在当前行尾&lt;br /&gt;　　o：在当前行之下新开一行&lt;br /&gt;　　O：在当前行之上新开一行&lt;br /&gt;　　r：替换当前字符&lt;br /&gt;　　R：替换当前字符及其后的字符，直至按ESC键&lt;br /&gt;　　s：从当前光标位置处开始，以输入的文本替代指定数目的字符&lt;br /&gt;　　S：删除指定数目的行，并以所输入文本代替之&lt;br /&gt;　　ncw或nCW：修改指定数目的字&lt;br /&gt;　　nCC：修改指定数目的行&lt;br /&gt;　　&lt;br /&gt;　　删除命令&lt;br /&gt;　　ndw或ndW：删除光标处开始及其后的n-1个字&lt;br /&gt;　　do：删至行首&lt;br /&gt;　　d$：删至行尾&lt;br /&gt;　　ndd：删除当前行及其后n-1行&lt;br /&gt;　　x或X：删除一个字符，x删除光标后的，而X删除光标前的&lt;br /&gt;　　Ctrl+u：删除输入方式下所输入的文本&lt;br /&gt;　　&lt;br /&gt;　　搜索及替换命令&lt;br /&gt;　　/pattern：从光标开始处向文件尾搜索pattern&lt;br /&gt;　　?pattern：从光标开始处向文件首搜索pattern&lt;br /&gt;　　n：在同一方向重复上一次搜索命令&lt;br /&gt;　　N：在反方向上重复上一次搜索命令&lt;br /&gt;　　：s/p1/p2/g：将当前行中所有p1均用p2替代&lt;br /&gt;　　：n1,n2s/p1/p2/g：将第n1至n2行中所有p1均用p2替代&lt;br /&gt;　　：g/p1/s//p2/g：将文件中所有p1均用p2替换&lt;br /&gt;　　&lt;br /&gt;　　选项设置&lt;br /&gt;　　all：列出所有选项设置情况&lt;br /&gt;　　term：设置终端类型&lt;br /&gt;　　ignorance：在搜索中忽略大小写&lt;br /&gt;　　list：显示制表位(Ctrl+I)和行尾标志（$)&lt;br /&gt;　　number：显示行号&lt;br /&gt;　　report：显示由面向行的命令修改过的数目&lt;br /&gt;　　terse：显示简短的警告信息&lt;br /&gt;　　warn：在转到别的文件时若没保存当前文件则显示NO write信息&lt;br /&gt;　　nomagic：允许在搜索模式中，使用前面不带“\”的特殊字符&lt;br /&gt;　　nowrapscan：禁止vi在搜索到达文件两端时，又从另一端开始&lt;br /&gt;　　mesg：允许vi显示其他用户用write写到自己终端上的信息&lt;br /&gt;　　&lt;br /&gt;　　最后行方式命令&lt;br /&gt;　　：n1,n2 co n3：将n1行到n2行之间的内容拷贝到第n3行下&lt;br /&gt;　　：n1,n2 m n3：将n1行到n2行之间的内容移至到第n3行下&lt;br /&gt;　　：n1,n2 d ：将n1行到n2行之间的内容删除&lt;br /&gt;　　：w ：保存当前文件&lt;br /&gt;　　：e filename：打开文件filename进行编辑&lt;br /&gt;　　：x：保存当前文件并退出&lt;br /&gt;　　：q：退出vi&lt;br /&gt;　　：q!：不保存文件并退出vi&lt;br /&gt;　　：!command：执行shell命令command&lt;br /&gt;　　：n1,n2 w!command：将文件中n1行至n2行的内容作为command的输入并执行之，若不指定n1，n2，则表示将整个文件内容作为command的输入&lt;br /&gt;　　：r!command：将命令command的输出结果放到当前行&lt;br /&gt;　　&lt;br /&gt;　　寄存器操作&lt;br /&gt;　　"?nyy：将当前行及其下n行的内容保存到寄存器？中，其中?为一个字母，n为一个数字&lt;br /&gt;　　"?nyw：将当前行及其下n个字保存到寄存器？中，其中?为一个字母，n为一个数字&lt;br /&gt;　　"?nyl：将当前行及其下n个字符保存到寄存器？中，其中?为一个字母，n为一个数字&lt;br /&gt;　　"?p：取出寄存器？中的内容并将其放到光标位置处。这里？可以是一个字母，也可以是一个数字&lt;br /&gt;　　ndd：将当前行及其下共n行文本删除，并将所删内容放到1号删除寄存器中。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-2360163579288691199?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/2360163579288691199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=2360163579288691199' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/2360163579288691199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/2360163579288691199'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/04/vi.html' title='vi常用命令'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-7105645719697082982</id><published>2009-04-21T16:33:00.000+08:00</published><updated>2009-04-21T16:34:40.654+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Technology'/><title type='text'>写软件的需求分析全方位攻略</title><content type='html'>原文：http://blog.csdn.net/broadview2006/archive/2009/04/21/4096395.aspx&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-7105645719697082982?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/7105645719697082982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=7105645719697082982' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/7105645719697082982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/7105645719697082982'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/04/blog-post_21.html' title='写软件的需求分析全方位攻略'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-1674389071577386165</id><published>2009-04-20T10:44:00.001+08:00</published><updated>2009-04-20T10:44:34.735+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Oracle Test05</title><content type='html'>其它数据库对象&lt;br /&gt;1. 创建序列empno_seq，开始值为8000，每次增长2，最大值为9000，其他参数自选&lt;br /&gt;2. 使用数据字典视图user_sequences查询序列的信息&lt;br /&gt;3. 使用empno_seq向emp表中插入数据,要求empno的值为empno_seq的递增值,其他字段的值任意.&lt;br /&gt;4. 为emp表中的员工姓名(ename)定义索引&lt;br /&gt;5. 使用数据字典user_indexs查看索引的信息&lt;br /&gt;6. 使用sys/sys身份登录,为scott.emp建立同义词emp_synm&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-1674389071577386165?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/1674389071577386165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=1674389071577386165' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/1674389071577386165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/1674389071577386165'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/04/oracle-test05.html' title='Oracle Test05'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-3140734048581107382</id><published>2009-04-20T10:43:00.002+08:00</published><updated>2009-04-20T10:44:01.480+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Oracle Test04</title><content type='html'>视 图&lt;br /&gt;1. 使用表emp创建视图emp_view，其中包括姓名(ename)，员工号(empno，工资(sal),部门号(deptno).&lt;br /&gt;2. 显示视图的结构&lt;br /&gt;3. 查询数据字典视图user_views，检查视图的定义&lt;br /&gt;4. 查询emp_view视图中的全部数据&lt;br /&gt;5. 从emp_view中查询工资最高的三位员工信息&lt;br /&gt;6. 修改视图emp_view,将视图中的数据限定在部门号是30的范围内&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-3140734048581107382?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/3140734048581107382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=3140734048581107382' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/3140734048581107382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/3140734048581107382'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/04/oracle-test04.html' title='Oracle Test04'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-5074236742268737082</id><published>2009-04-20T10:43:00.001+08:00</published><updated>2009-04-20T10:43:28.817+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Oracle Test03</title><content type='html'>约 束&lt;br /&gt;1. 向表emp的id列中添加PRIMARY KEY约束（my_emp_id_pk）&lt;br /&gt;2. 向表dept的id列中添加PRIMARY KEY约束（my_dept_id_pk）&lt;br /&gt;3. 查询数据字典，获取约束的信息&lt;br /&gt;4. 向表emp中添加列dept_id，并在其中定义FOREIGN KEY约束，与之相关联的列是dept表中的id列。&lt;br /&gt;5. 查询数据字典，获取约束的信息&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-5074236742268737082?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/5074236742268737082/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=5074236742268737082' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/5074236742268737082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/5074236742268737082'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/04/oracle-test03.html' title='Oracle Test03'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-5813121974106990832</id><published>2009-04-20T10:42:00.001+08:00</published><updated>2009-04-20T10:42:59.007+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Oracle Test02</title><content type='html'>创建和管理表&lt;br /&gt;1. 创建表departments&lt;br /&gt;name type&lt;br /&gt;id Number(4)&lt;br /&gt;name Varchar2(25)&lt;br /&gt;Hiredate Date&lt;br /&gt;2. 将表dept中的数据插入表departments中&lt;br /&gt;3. 创建表employees&lt;br /&gt;name type&lt;br /&gt;id Number(4)&lt;br /&gt;name Varchar2(25)&lt;br /&gt;deptno Number(2)&lt;br /&gt;4. 将列name的长度增加到50&lt;br /&gt;5. 查询数据字典视图user_tables检查刚才的操作&lt;br /&gt;6. 根据表employees创建his_employees&lt;br /&gt;7. 删除表employees&lt;br /&gt;8. 将表his_employees重命名为employees&lt;br /&gt;9. 在表departments和employees中添加新列test_column，并在数据字典中检查所作的操作&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-5813121974106990832?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/5813121974106990832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=5813121974106990832' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/5813121974106990832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/5813121974106990832'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/04/oracle-test02.html' title='Oracle Test02'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-2734803070179959811</id><published>2009-04-20T10:41:00.000+08:00</published><updated>2009-04-20T10:42:17.605+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Oracle Test01</title><content type='html'>&lt;meta equiv="Content-Type" content="text/html; charset=utf-8"&gt;&lt;meta name="ProgId" content="Word.Document"&gt;&lt;meta name="Generator" content="Microsoft Word 11"&gt;&lt;meta name="Originator" content="Microsoft Word 11"&gt;&lt;link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cwybin%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"&gt;&lt;o:smarttagtype namespaceuri="urn:schemas-microsoft-com:office:smarttags" name="country-region"&gt;&lt;/o:smarttagtype&gt;&lt;o:smarttagtype namespaceuri="urn:schemas-microsoft-com:office:smarttags" name="place"&gt;&lt;/o:smarttagtype&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:drawinggridverticalspacing&gt;7.8 磅&lt;/w:DrawingGridVerticalSpacing&gt;   &lt;w:displayhorizontaldrawinggridevery&gt;0&lt;/w:DisplayHorizontalDrawingGridEvery&gt;   &lt;w:displayverticaldrawinggridevery&gt;2&lt;/w:DisplayVerticalDrawingGridEvery&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:compatibility&gt;    &lt;w:spaceforul/&gt;    &lt;w:balancesinglebytedoublebytewidth/&gt;    &lt;w:donotleavebackslashalone/&gt;    &lt;w:ultrailspace/&gt;    &lt;w:donotexpandshiftreturn/&gt;    &lt;w:adjustlineheightintable/&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;    &lt;w:usefelayout/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" latentstylecount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if !mso]&gt;&lt;object classid="clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D" id="ieooui"&gt;&lt;/object&gt; &lt;style&gt; st1\:*{behavior:url(#ieooui) } &lt;/style&gt; &lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Font Definitions */  @font-face 	{font-family:宋体; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-alt:SimSun; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 135135232 16 0 262145 0;} @font-face 	{font-family:"\@宋体"; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 135135232 16 0 262145 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	text-align:justify; 	text-justify:inter-ideograph; 	mso-pagination:none; 	font-size:10.5pt; 	mso-bidi-font-size:12.0pt; 	font-family:"Times New Roman"; 	mso-fareast-font-family:宋体; 	mso-font-kerning:1.0pt;}  /* Page Definitions */  @page 	{mso-page-border-surround-header:no; 	mso-page-border-surround-footer:no;} @page Section1 	{size:595.3pt 841.9pt; 	margin:72.0pt 90.0pt 72.0pt 90.0pt; 	mso-header-margin:42.55pt; 	mso-footer-margin:49.6pt; 	mso-paper-source:0; 	layout-grid:15.6pt;} div.Section1 	{page:Section1;}  /* List Definitions */  @list l0 	{mso-list-id:1892568570; 	mso-list-type:hybrid; 	mso-list-template-ids:1554517066 67698703 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l0:level1 	{mso-level-tab-stop:21.0pt; 	mso-level-number-position:left; 	margin-left:21.0pt; 	text-indent:-21.0pt;} ol 	{margin-bottom:0cm;} ul 	{margin-bottom:0cm;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:普通表格; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:"Times New Roman"; 	mso-ansi-language:#0400; 	mso-fareast-language:#0400; 	mso-bidi-language:#0400;} table.MsoTableGrid 	{mso-style-name:网格型; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	border:solid windowtext 1.0pt; 	mso-border-alt:solid windowtext .5pt; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-border-insideh:.5pt solid windowtext; 	mso-border-insidev:.5pt solid windowtext; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	text-align:justify; 	text-justify:inter-ideograph; 	mso-pagination:none; 	font-size:10.0pt; 	font-family:"Times New Roman"; 	mso-ansi-language:#0400; 	mso-fareast-language:#0400; 	mso-bidi-language:#0400;} &lt;/style&gt; &lt;![endif]--&gt;  &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b style=""&gt;&lt;span style="font-size: 22pt; font-family: 宋体;"&gt;测&lt;/span&gt;&lt;/b&gt;&lt;b style=""&gt;&lt;span style="font-size: 22pt;"&gt; &lt;/span&gt;&lt;/b&gt;&lt;b style=""&gt;&lt;span style="font-size: 22pt; font-family: 宋体;"&gt;试&lt;/span&gt;&lt;/b&gt;&lt;b style=""&gt;&lt;span style="font-size: 22pt;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;&lt;span style=""&gt;1.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;使用&lt;/span&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;PL/SQL Developer&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;创建表&lt;/span&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;my_employee,&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;字段见第三题表头显示&lt;/span&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;,&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;字段统一定义为&lt;/span&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;Varchar2(20).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;&lt;span style=""&gt;2.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;显示表&lt;/span&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;my_employee&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;的结构&lt;/span&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;&lt;span style=""&gt;3.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;向表中插入下列数据&lt;/span&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;,&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;并提交&lt;/span&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;table class="MsoTableGrid" style="border: medium none ; width: 426.1pt; margin-left: 14.4pt; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0" width="568"&gt;  &lt;tbody&gt;&lt;tr style=""&gt;   &lt;td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;ID&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;FIRST_NAME&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;LAST_NAME&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; width: 85.25pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;USERID&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; width: 85.25pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;SALARY&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style=""&gt;   &lt;td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;patel&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;Ralph&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 85.25pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;Rpatel&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 85.25pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;895&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style=""&gt;   &lt;td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;2&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;Dancs&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;Betty&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 85.25pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;Bdancs&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 85.25pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;860&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style=""&gt;   &lt;td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;3&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;Biri&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;Ben&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 85.25pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;Bbiri&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 85.25pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;1100&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style=""&gt;   &lt;td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;4&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;Newman&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;st1:place st="on"&gt;&lt;st1:country-region st="on"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;Chad&lt;/span&gt;&lt;/st1:country-region&gt;&lt;/st1:place&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 85.25pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;Cnewman&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 85.25pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;750&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style=""&gt;   &lt;td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;5&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;Ropeburn&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;Audrey&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 85.25pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;Aropebur&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 85.25pt;" valign="top" width="114"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;1550&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;&lt;span style=""&gt;4.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;将&lt;/span&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;3&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;号员工的&lt;/span&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;last_name&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;修改为“&lt;/span&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;drelxer&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;”&lt;/span&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;,&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;并提交&lt;/span&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;&lt;span style=""&gt;5.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;将所有工资少于&lt;/span&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;1000&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;的员工的工资修改为&lt;/span&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;1000,(&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;不提交&lt;/span&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;),&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;并设置回滚点&lt;/span&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;&lt;span style=""&gt;6.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;删除&lt;/span&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;my_employee&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;表中所有数据&lt;/span&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;(&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;不提交&lt;/span&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;&lt;span style=""&gt;7.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;回滚到第五题中的设置的回滚点&lt;/span&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;&lt;span style=""&gt;8.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;删除表&lt;/span&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;my_employee&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;中所有数据&lt;/span&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;,&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;并提交&lt;/span&gt;&lt;span style="font-size: 14pt;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-2734803070179959811?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/2734803070179959811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=2734803070179959811' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/2734803070179959811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/2734803070179959811'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/04/oracle-test01.html' title='Oracle Test01'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-7810406767210846094</id><published>2009-04-16T16:25:00.004+08:00</published><updated>2009-04-16T16:33:50.575+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>c写的小玩意</title><content type='html'>最近在上ProC的培训课程，感觉这门课不是一般的杂，刚开始是unix，接下来是unix下c编程，接下来是proc，接下来是tux，unix下c编程还推荐用vi，理由是某些公司里是禁止用ue的。呵呵，今天还是用ue登陆到老师开的虚拟机服务器ftp上面将c文件载下来写。最近写到这里了&lt;br /&gt; 用C写果然最有成就感。。。不像用delphi,大部分是开发环境生成的，成就感少了一点。&lt;br /&gt;     &lt;span style="color: rgb(255, 0, 0);"&gt;   c语言博大精深&lt;/span&gt;，千万不要觉得c++/Java更洋气一些。James Gosling现在就后悔当初Java引入了类，现在有多少人正在将Java当成OOP语言真正的在用呢？&lt;br /&gt;       &lt;span style="color: rgb(255, 0, 0);"&gt; c是除了汇编外最让人尊重的语言，老前辈，一定要牢牢掌握&lt;/span&gt;&lt;br /&gt;         用c写的是控制台下应用的一个小软件，提供主菜单，根据选择调用相应函数。命名规则采用unix环境下推荐的命名规则。只不过缩进我还是用空格敲，不喜欢用tab，虽然可能每次要敲4个或8个空格我还是敲，呵呵&lt;br /&gt;&lt;br /&gt;------------------------------------------.c文件------------------------------------------------------&lt;br /&gt;/*&lt;br /&gt;* fileoperator.c&lt;br /&gt;* Programme Name：Exercise&lt;br /&gt;* Copyright@ Hundun   Version: V 1.0&lt;br /&gt;* Function：Provide main menu under console, invoke certain function according to user's choice&lt;br /&gt;* Author：Youbin Wang&lt;br /&gt;* Record of Modification:&lt;br /&gt;* 2009.04.16 Add the Version commentary. Separate the .c file and .h file, add a function&lt;br /&gt;*   open_file_readonly() by Youbin Wang&lt;br /&gt;* 2009.04.15 Create the main programme，&lt;br /&gt;*   declare and define Selection,ShowMenu,CreateFile,OpenFile,ExitSystem by Youbin Wang&lt;br /&gt;*/&lt;br /&gt;#include&lt;stdio.h&gt;&lt;br /&gt;#include&lt;stdlib.h&gt;&lt;br /&gt;#include"user01_20090416.h"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* Show main menu if user haven't decided to exit the system&lt;br /&gt;* or they just finish one operation&lt;br /&gt;* Input parameter: none&lt;br /&gt;* Output Parameter: return 1 while execute successfully&lt;br /&gt;*/&lt;br /&gt;int show_menu()&lt;br /&gt;{&lt;br /&gt;  printf("/*--------------------------------------------\n");&lt;br /&gt;  printf(" *       Welcome TO This  Programme           \n");&lt;br /&gt;  printf(" *          This is the Main Menu             \n");&lt;br /&gt;  printf(" *--------------------------------------------*/\n");&lt;br /&gt;  printf("\n");&lt;br /&gt;  printf("Please Make your selection\n");&lt;br /&gt;  printf(" 1: Create a new file and write;\n");&lt;br /&gt;  printf(" 2: Open a file and write;\n");&lt;br /&gt;  printf(" 3: Open a file with read-only mode;\n");&lt;br /&gt;  printf(" 4: Exit;\n");&lt;br /&gt;  printf("\n");&lt;br /&gt;  return 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* if the user choose to open a file with readonly mode(3) then invoke this function&lt;br /&gt;* InputParameter:None&lt;br /&gt;* OutputParameter: return 1 if execute successfully, return 0 if a error occured while open a file&lt;br /&gt;*/&lt;br /&gt;int open_file_readonly()&lt;br /&gt;{&lt;br /&gt;  char c_output;&lt;br /&gt;  FILE *fl_p_readonly;&lt;br /&gt;  fl_p_readonly = fopen("mytext.txt","rt");&lt;br /&gt;  if(NULL==fl_p_readonly)&lt;br /&gt;  {&lt;br /&gt;      printf("\nCannot open file readonly, press any key to continue!\n");&lt;br /&gt;      getchar();&lt;br /&gt;      return 0;&lt;br /&gt;  }&lt;br /&gt;  printf("Successfully read a file\n");&lt;br /&gt;  sleep(1);&lt;br /&gt;  c_output=fgetc(fl_p_readonly);&lt;br /&gt;  while(c_output!=EOF)&lt;br /&gt;  {&lt;br /&gt;      printf("I'm reading the text\n");&lt;br /&gt;      sleep(1);&lt;br /&gt;      putchar(c_output);&lt;br /&gt;      c_output=fgetc(fl_p_readonly);&lt;br /&gt;  }&lt;br /&gt;  fclose(fl_p_readonly);&lt;br /&gt;  return 1;&lt;br /&gt;}&lt;br /&gt;/*&lt;br /&gt;* if the user choose to create a new file(1) then invoke this function&lt;br /&gt;* InputParameter: None&lt;br /&gt;* OutputParameter: return 1 while execute successfully, o while error accured in creating file&lt;br /&gt;*/&lt;br /&gt;int create_file()&lt;br /&gt;{&lt;br /&gt;  printf("Creating a file...\n");&lt;br /&gt;  FILE *fl_createfile;&lt;br /&gt;  fl_createfile = fopen("new.txt","wt+");&lt;br /&gt;  if(NULL==fl_createfile)&lt;br /&gt;  {&lt;br /&gt;      printf("\nCannot create file, press any key to continue!\n");&lt;br /&gt;      getchar();&lt;br /&gt;      return 0;&lt;br /&gt;  }&lt;br /&gt;  char c_inputchar;&lt;br /&gt;  printf("Successfully create a file!\n");&lt;br /&gt;  sleep(1);&lt;br /&gt;  printf("Please input your text: \n");&lt;br /&gt;  while (c_inputchar!='\n')&lt;br /&gt;  {&lt;br /&gt;      printf("I'm reading your input\n");&lt;br /&gt;      fputc(c_inputchar,fl_createfile);&lt;br /&gt;      c_inputchar=getchar();&lt;br /&gt;  }&lt;br /&gt;  /* rewind the position of file pointer to the top of file */&lt;br /&gt;  rewind(fl_createfile);&lt;br /&gt;  printf("Your inputment is: ");&lt;br /&gt;  c_inputchar=fgetc(fl_createfile);&lt;br /&gt;  while(c_inputchar!=EOF)&lt;br /&gt;  {&lt;br /&gt;      printf("I'm writing your input\n");&lt;br /&gt;      putchar(c_inputchar);&lt;br /&gt;      c_inputchar=fgetc(fl_createfile);&lt;br /&gt;  }&lt;br /&gt;  printf("\n");  &lt;br /&gt;  fclose(fl_createfile);&lt;br /&gt;  printf("Done!!\n");&lt;br /&gt;  return 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* if the user choose to open a exist file(2) and write then invoke this function&lt;br /&gt;* InputParameter:None&lt;br /&gt;* OutputParameter: return 1 while execute successfully, 0 when a error occured in creating or read file&lt;br /&gt;*/&lt;br /&gt;int open_file()&lt;br /&gt;{&lt;br /&gt;  printf("Opening a file...\n");&lt;br /&gt;  FILE *fl_openfile;&lt;br /&gt;  fl_openfile = fopen("mytext.txt","wt+");&lt;br /&gt;  if(NULL==fl_openfile)&lt;br /&gt;  {&lt;br /&gt;      printf("\nCannot open file, press any key to continue!\n");&lt;br /&gt;      getchar();&lt;br /&gt;      return 0;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  char c_inputchar;&lt;br /&gt;  printf("Successfully open a file");&lt;br /&gt;  printf("Please input your text: \n");&lt;br /&gt;  while (c_inputchar!='\n')&lt;br /&gt;  {&lt;br /&gt;      fputc(c_inputchar,fl_openfile);&lt;br /&gt;      c_inputchar=getchar();&lt;br /&gt;  }&lt;br /&gt;  /* rewind the position of file pointer to the top of file */&lt;br /&gt;  rewind(fl_openfile);&lt;br /&gt;  printf("Your inputment is: ");&lt;br /&gt;  c_inputchar=fgetc(fl_openfile);&lt;br /&gt;  while(c_inputchar!=EOF)&lt;br /&gt;  {&lt;br /&gt;      putchar(c_inputchar);&lt;br /&gt;      c_inputchar=fgetc(fl_openfile);&lt;br /&gt;  }&lt;br /&gt;  printf("\n");  &lt;br /&gt;  fclose(fl_openfile);&lt;br /&gt;  printf("Done!!\n");&lt;br /&gt;  return 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* if the user choose to exit the system then invoke this function&lt;br /&gt;* InputParameter:None&lt;br /&gt;* OutputParameter: retrun 1 while execute successfully&lt;br /&gt;*/&lt;br /&gt;int exit_system()&lt;br /&gt;{&lt;br /&gt;  printf("\n");&lt;br /&gt;  printf("Exiting.........\n");&lt;br /&gt;  printf("\n");&lt;br /&gt;  printf("  Thank you for using this system.\n");&lt;br /&gt;  printf("\n");&lt;br /&gt;  printf("  If you have any problems or advices,contract the author at qisi1986@gmail.com\n");&lt;br /&gt;  printf("\n");&lt;br /&gt;  printf("  Wish you a good day. Bye Bye.\n");&lt;br /&gt;  return 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* if the user input the selection, then the function 'main' will invoke this function&lt;br /&gt;* InputParameter: the selection of user&lt;br /&gt;* OutputParameter: return 1 while successfully&lt;br /&gt;*   if the user put the wrong key then it will provide hints&lt;br /&gt;*/&lt;br /&gt;int Selection(int Index)&lt;br /&gt;{&lt;br /&gt;  printf("Your Selection is %d \n", Index);&lt;br /&gt;  printf("Now will invoke corresponding function,please wait.");&lt;br /&gt;  printf("\n");&lt;br /&gt;  sleep(1);&lt;br /&gt;  switch(Index)&lt;br /&gt;  {&lt;br /&gt;      case 1:&lt;br /&gt;          create_file();&lt;br /&gt;          break;&lt;br /&gt;      case 2:&lt;br /&gt;          open_file();&lt;br /&gt;          break;&lt;br /&gt;      case 3:&lt;br /&gt;          open_file_readonly();&lt;br /&gt;          break;&lt;br /&gt;      case 4:&lt;br /&gt;          exit_system();&lt;br /&gt;          break;&lt;br /&gt;      default:&lt;br /&gt;          printf("Error!Please Enter a correct number!\n");&lt;br /&gt;          sleep(1);&lt;br /&gt;  }&lt;br /&gt;  return 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;  char inputInt;&lt;br /&gt;  system("clear");&lt;br /&gt;  while(inputInt != 4)&lt;br /&gt;  {&lt;br /&gt;      system("clear");&lt;br /&gt;      show_menu();&lt;br /&gt;      printf("Enter your selection here: ");&lt;br /&gt;      scanf("%d", &amp;amp;inputInt);&lt;br /&gt;      Selection(inputInt);&lt;br /&gt;  }&lt;br /&gt;  return 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;------------------------------------------------.h文件------------------------------------------&lt;br /&gt;/*&lt;br /&gt;* fileoperator.h&lt;br /&gt;* Copyright@ Hundun   Version: V 1.0&lt;br /&gt;* Function:contains all the declaration of functions in fileoperator.c&lt;br /&gt;* Author: Youbin Wang&lt;br /&gt;* Record of Modification:&lt;br /&gt;* 2009.04.16 Create the .h File, add open_file_readonly by Youbin Wang&lt;br /&gt;*/&lt;br /&gt;#include&lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* The declaration of functions&lt;br /&gt;* CreateFile,OpenFile, ExitSystem are invoked by Selection&lt;br /&gt;*/&lt;br /&gt;int show_menu();&lt;br /&gt;int create_file();&lt;br /&gt;int open_file();&lt;br /&gt;int exit_system();&lt;br /&gt;int selection(int index);&lt;br /&gt;int open_file_readonly();&lt;/stdio.h&gt;&lt;/stdlib.h&gt;&lt;/stdio.h&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-7810406767210846094?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/7810406767210846094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=7810406767210846094' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/7810406767210846094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/7810406767210846094'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/04/c.html' title='c写的小玩意'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-5695897057887748777</id><published>2009-04-15T22:51:00.003+08:00</published><updated>2009-04-15T23:08:45.125+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Algorithm'/><category scheme='http://www.blogger.com/atom/ns#' term='Work'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>毕业设计（新增加密解密工具）</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NQUr3ozUHrQ/SeX1SwC8lGI/AAAAAAAAAGA/jgHSloSyJGA/s1600-h/%E5%AF%86%E6%96%87.jpg"&gt;&lt;span style="font-weight: bold;"&gt;又&lt;/span&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NQUr3ozUHrQ/SeX1SwC8lGI/AAAAAAAAAGA/jgHSloSyJGA/s1600-h/%E5%AF%86%E6%96%87.jpg"&gt;有新的东西啦。&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NQUr3ozUHrQ/SeX1SwC8lGI/AAAAAAAAAGA/jgHSloSyJGA/s1600-h/%E5%AF%86%E6%96%87.jpg"&gt;给我的毕业设计专门做了一个加密解密工具。先上PP。老规矩，图片在上，解说在下&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NQUr3ozUHrQ/SeX1SwC8lGI/AAAAAAAAAGA/jgHSloSyJGA/s1600-h/%E5%AF%86%E6%96%87.jpg"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;/span&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NQUr3ozUHrQ/SeX1TEUN_jI/AAAAAAAAAGQ/7-KkwfMxdMg/s1600-h/%E9%85%8D%E7%BD%AE.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://1.bp.blogspot.com/_NQUr3ozUHrQ/SeX1TEUN_jI/AAAAAAAAAGQ/7-KkwfMxdMg/s400/%E9%85%8D%E7%BD%AE.jpg" alt="" id="BLOGGER_PHOTO_ID_5324931842360344114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;      1：配置文件里新增了加密的相关配置信息。主要就是两个，一个是加密的关键字符串key，另外一个是一个0~1之间的小数（最好只到小数点后两位）。它们共同构成了加密的算法。算法是我从网上搜刮来的，我改了一下。原先我将算法直接用来加密memo里的所有内容，结果发现会发生一些小概率的加密未完成便中止的现象。后来我把它改成逐行读取逐行加密就没有问题了。这个BUG真的很奇怪，我已经发给老大了，希望他有时间帮我看一下。我数学不行啊。哎~~~~~&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NQUr3ozUHrQ/SeX1S63mBkI/AAAAAAAAAGI/DbrbrxTxadQ/s1600-h/%E6%98%8E%E6%96%87.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://1.bp.blogspot.com/_NQUr3ozUHrQ/SeX1S63mBkI/AAAAAAAAAGI/DbrbrxTxadQ/s400/%E6%98%8E%E6%96%87.jpg" alt="" id="BLOGGER_PHOTO_ID_5324931839824365122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;      2：该图是输入明文后的效果。这个加密工具可以独立使用也可以嵌入到任何一个工具里。只要包含了加密工具的单元，调用它的一个hasIniOriginalText或者hasIniDecodedText将其设置为true，就可以讲你要加密的内容从你的工具里导入到加密工具的明文或密文输入栏了。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NQUr3ozUHrQ/SeX1SwC8lGI/AAAAAAAAAGA/jgHSloSyJGA/s1600-h/%E5%AF%86%E6%96%87.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://3.bp.blogspot.com/_NQUr3ozUHrQ/SeX1SwC8lGI/AAAAAAAAAGA/jgHSloSyJGA/s400/%E5%AF%86%E6%96%87.jpg" alt="" id="BLOGGER_PHOTO_ID_5324931836919190626" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;      3：上图为加密后的脚本内容，看不懂吧，呵呵。这个密文可以放到明文显示栏里再加密，每次加密可以更换不同的key和percent，只要记住顺序，一次次的用正确的key和percent解密就行了，很方便很强大吧。。。真是要感谢贴了这个加密算法的蝈蝈。之前上网搜了，论坛问了，有人让我用MD5加密，这个加密虽然破解还是有一定难度，可是解密也很麻烦的。当然，我对MD5甚至对密码学根本是门外汉，上述完全是凭直觉哈。&lt;br /&gt;     &lt;br /&gt;      下边贴出我稍微改动后的加密算法代码：&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  frmCryptograph: TfrmCryptograph;&lt;br /&gt;&lt;br /&gt;  key: string;&lt;br /&gt;  percent1: Double;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;{$R *.dfm}&lt;br /&gt;&lt;br /&gt;function TfrmCryptograph.DeCode(aCryptograph, aKey: string): string;&lt;br /&gt;var&lt;br /&gt;  i,keylen,codelen:integer;&lt;br /&gt;begin&lt;br /&gt;  keylen :=Length(akey);&lt;br /&gt;  codelen:=Length(aCryptograph);&lt;br /&gt;  SetLength(Result, Length(aCryptograph));&lt;br /&gt;  for i:=1 to codelen do&lt;br /&gt;  begin&lt;br /&gt;    Result[i]:=Chr(Ord(aCryptograph[i])-Ord(aKey[(i mod KeyLen)+1]));&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function TfrmCryptograph.EnCode(aCryptograph, aKey: string): string;&lt;br /&gt;var&lt;br /&gt;  i,keylen,codelen:integer;&lt;br /&gt;begin&lt;br /&gt;  keylen:=Length(akey);&lt;br /&gt;  codelen:=Length(aCryptograph);&lt;br /&gt;  SetLength(Result, Length(aCryptograph));&lt;br /&gt;  for i:=1 to codelen do&lt;br /&gt;  begin&lt;br /&gt;    Result[i]:=Chr(Ord(aCryptograph[i])+Ord(aKey[(i mod KeyLen)+1]));&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TfrmCryptograph.GetKey(aKey: string; aPercent: Double): string;&lt;br /&gt;var&lt;br /&gt;  i:integer;&lt;br /&gt;begin&lt;br /&gt;  SetLength(Result,Length(aKey));&lt;br /&gt;  for i:=1 to Length(aKey) do&lt;br /&gt;  begin&lt;br /&gt;    Result[i]:=Chr(Round(Ord(aKey[i])*aPercent));&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmCryptograph.btnEncodeClick(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;  i: Integer;&lt;br /&gt;  str: string;&lt;br /&gt;begin&lt;br /&gt;  mmoOutput.Clear;&lt;br /&gt;  pgcCryptograph.ActivePageIndex := 1;&lt;br /&gt;  for i := 0 to mmoInput.Lines.Count do&lt;br /&gt;  begin&lt;br /&gt;    str := EnCode(mmoInput.Lines.Strings[i],GetKey(Key,Percent1));&lt;br /&gt;    mmoOutput.Lines.Append(str);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmCryptograph.btnDecodeClick(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;  i: Integer;&lt;br /&gt;  str: string;&lt;br /&gt;begin&lt;br /&gt;  mmoInput.Clear;&lt;br /&gt;  pgcCryptograph.ActivePageIndex := 0;&lt;br /&gt;  for i := 0 to mmoOutput.Lines.Count do&lt;br /&gt;  begin&lt;br /&gt;    str := DeCode(mmoOutput.Lines.Strings[i],GetKey(Key,Percent1)) ;&lt;br /&gt;    mmoInput.Lines.Append(str)&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmCryptograph.FormCreate(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  initEnDeCodeForm(Sender);&lt;br /&gt;  pgcCryptograph.ActivePageIndex := 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmCryptograph.initEnDeCodeForm(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;  iniFileName: string;&lt;br /&gt;begin&lt;br /&gt;  {如果没有初始化的明文输入，则清空}&lt;br /&gt;  if not withIniOriginalText then&lt;br /&gt;    mmoInput.Clear;&lt;br /&gt;  if not withIniDecodedText then&lt;br /&gt;    mmoOutput.Clear;&lt;br /&gt;  iniFileName := 'config\config.ini';&lt;br /&gt;  with TInifile.Create(iniFileName) do&lt;br /&gt;  begin&lt;br /&gt;    percent1 := ReadFloat('CRYPTOGRAPHY','PERCENT',0);&lt;br /&gt;    key := ReadString('CRYPTOGRAPHY','KEY','');&lt;br /&gt;    Free;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmCryptograph.FormShow(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  initEnDeCodeForm(Sender);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmCryptograph.btnImportEncodeClick(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  dlgOpenCryptograph.Execute;&lt;br /&gt;  mmoInput.Clear;&lt;br /&gt;  try&lt;br /&gt;    mmoInput.Lines.LoadFromFile(dlgOpenCryptograph.FileName);&lt;br /&gt;  except&lt;br /&gt;    Exit;&lt;br /&gt;//    MessageBox(Handle, '读取文件出错，请重试', '提示', MB_OK);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmCryptograph.btnExportEncodeClick(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  dlgSaveCryptograph.Execute;&lt;br /&gt;  try&lt;br /&gt;    mmoInput.Lines.SaveToFile(dlgSaveCryptograph.FileName + '.sql');&lt;br /&gt;  except&lt;br /&gt;    Exit;&lt;br /&gt;//    MessageBox(Handle, '保存文件出错，请重试', '提示', MB_OK);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmCryptograph.btnImportDecodeClick(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  dlgOpenCryptograph.Execute;&lt;br /&gt;  mmoInput.Clear;&lt;br /&gt;  try&lt;br /&gt;    mmoInput.Lines.LoadFromFile(dlgOpenCryptograph.FileName);&lt;br /&gt;  except&lt;br /&gt;    Exit;&lt;br /&gt;//    MessageBox(Handle, '读取文件出错，请重试', '提示', MB_OK);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmCryptograph.btnExportDecodeClick(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  dlgSaveCryptograph.Execute;&lt;br /&gt;  try&lt;br /&gt;    mmoOutput.Lines.SaveToFile(dlgSaveCryptograph.FileName + '.sql');&lt;br /&gt;  except&lt;br /&gt;    Exit;&lt;br /&gt;//    MessageBox(Handle, '保存文件出错，请重试', '提示', MB_OK);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmCryptograph.FormClose(Sender: TObject;&lt;br /&gt;  var Action: TCloseAction);&lt;br /&gt;begin&lt;br /&gt;  mmoInput.Clear;&lt;br /&gt;  mmoOutput.Clear;&lt;br /&gt;  withIniOriginalText := False;&lt;br /&gt;  withIniDecodedText := False;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;      总结：这个小工具花了我一天多的时间。其中大部分用来找加密未完成却中断的原因了，结果还是没有找到，可见要成为IT中的牛人，数学是多么重要。虽然实际开发中未必用得了算法，未必要那么考虑效率，可是，对于一个程序员来说，追求完美是一种天性，应该坚持下去。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-5695897057887748777?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/5695897057887748777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=5695897057887748777' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/5695897057887748777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/5695897057887748777'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/04/blog-post_15.html' title='毕业设计（新增加密解密工具）'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_NQUr3ozUHrQ/SeX1TEUN_jI/AAAAAAAAAGQ/7-KkwfMxdMg/s72-c/%E9%85%8D%E7%BD%AE.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-4219585266960619290</id><published>2009-04-14T21:11:00.000+08:00</published><updated>2009-04-14T21:12:53.265+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>查看SQL SERVER 加密存储过程,函数,触发器,视图</title><content type='html'>原作出处：http://dev.csdn.net/develop/article/23/23218.shtm&lt;br /&gt;作者：CSDN某大虾&lt;br /&gt;读后感：目前难以理解透&lt;br /&gt;&lt;br /&gt;create  PROCEDURE sp_decrypt(@objectname varchar(50))&lt;br /&gt;AS&lt;br /&gt;begin&lt;br /&gt;set nocount on&lt;br /&gt;--CSDN：j9988 copyright:2004.07.15&lt;br /&gt;--V3.2&lt;br /&gt;--破解字节不受限制，适用于SQLSERVER2000存储过程，函数，视图，触发器&lt;br /&gt;--修正上一版"视图触发器"不能正确解密错误&lt;br /&gt;--发现有错，请E_MAIL：CSDNj9988@tom.com&lt;br /&gt;begin tran&lt;br /&gt;declare @objectname1 varchar(100),@orgvarbin varbinary(8000)&lt;br /&gt;declare @sql1 nvarchar(4000),@sql2 varchar(8000),@sql3 nvarchar(4000),@sql4 nvarchar(4000)&lt;br /&gt;DECLARE  @OrigSpText1 nvarchar(4000),  @OrigSpText2 nvarchar(4000) , @OrigSpText3 nvarchar(4000), @resultsp nvarchar(4000)&lt;br /&gt;declare  @i int,@status int,@type varchar(10),@parentid int&lt;br /&gt;declare @colid int,@n int,@q int,@j int,@k int,@encrypted int,@number int&lt;br /&gt;select @type=xtype,@parentid=parent_obj from sysobjects where id=object_id(@objectname)&lt;br /&gt;&lt;br /&gt;create table  #temp(number int,colid int,ctext varbinary(8000),encrypted int,status int)&lt;br /&gt;insert #temp SELECT number,colid,ctext,encrypted,status FROM syscomments  WHERE id = object_id(@objectname)&lt;br /&gt;select @number=max(number) from #temp&lt;br /&gt;set @k=0&lt;br /&gt;&lt;br /&gt;while @k&lt;=@number begin if exists(select 1 from syscomments where id=object_id(@objectname) and number=@k) begin if @type='P' set @sql1=(case when @number&gt;1 then 'ALTER PROCEDURE '+ @objectname +';'+rtrim(@k)+' WITH ENCRYPTION AS '&lt;br /&gt;                         else 'ALTER PROCEDURE '+ @objectname+' WITH ENCRYPTION AS '&lt;br /&gt;                         end)&lt;br /&gt;&lt;br /&gt;if @type='TR'&lt;br /&gt;begin&lt;br /&gt;declare @parent_obj varchar(255),@tr_parent_xtype varchar(10)&lt;br /&gt;select @parent_obj=parent_obj from sysobjects where id=object_id(@objectname)&lt;br /&gt;select @tr_parent_xtype=xtype from sysobjects where id=@parent_obj&lt;br /&gt;if @tr_parent_xtype='V'&lt;br /&gt;begin&lt;br /&gt;set @sql1='ALTER TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION INSTERD OF INSERT AS PRINT 1 '&lt;br /&gt;end&lt;br /&gt;else&lt;br /&gt;begin&lt;br /&gt;set @sql1='ALTER TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION FOR INSERT AS PRINT 1 '&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;if @type='FN' or @type='TF' or @type='IF'&lt;br /&gt;set @sql1=(case @type when 'TF' then&lt;br /&gt;'ALTER FUNCTION '+ @objectname+'(@a char(1)) returns @b table(a varchar(10)) with encryption as begin insert @b select @a return end '&lt;br /&gt;when 'FN' then&lt;br /&gt;'ALTER FUNCTION '+ @objectname+'(@a char(1)) returns char(1) with encryption as begin return @a end'&lt;br /&gt;when 'IF' then&lt;br /&gt;'ALTER FUNCTION '+ @objectname+'(@a char(1)) returns table with encryption as return select @a as a'&lt;br /&gt;end)&lt;br /&gt;&lt;br /&gt;if @type='V'&lt;br /&gt;set @sql1='ALTER VIEW '+@objectname+' WITH ENCRYPTION AS SELECT 1 as f'&lt;br /&gt;&lt;br /&gt;set @q=len(@sql1)&lt;br /&gt;set @sql1=@sql1+REPLICATE('-',4000-@q)&lt;br /&gt;select @sql2=REPLICATE('-',8000)&lt;br /&gt;set @sql3='exec(@sql1'&lt;br /&gt;select @colid=max(colid) from #temp where number=@k&lt;br /&gt;set @n=1&lt;br /&gt;while @n&lt;=CEILING(1.0*(@colid-1)/2) and len(@sql3)&lt;=3996 begin set @sql3=@sql3+'+@' set @n=@n+1 end set @sql3=@sql3+')' exec sp_executesql @sql3,N'@sql1 nvarchar(4000),@ varchar(8000)',@sql1=@sql1,@=@sql2  end set @k=@k+1 end  set @k=0 while @k&lt;=@number begin  if exists(select 1 from syscomments where id=object_id(@objectname) and number=@k) begin select @colid=max(colid) from #temp where number=@k set @n=1  while @n&lt;=@colid begin select @OrigSpText1=ctext,@encrypted=encrypted,@status=status FROM #temp  WHERE colid=@n and number=@k  SET @OrigSpText3=(SELECT ctext FROM syscomments WHERE id=object_id(@objectname) and colid=@n and number=@k) if @n=1 begin if @type='P' SET @OrigSpText2=(case when @number&gt;1 then 'CREATE PROCEDURE '+ @objectname +';'+rtrim(@k)+' WITH ENCRYPTION AS '&lt;br /&gt;                      else 'CREATE PROCEDURE '+ @objectname +' WITH ENCRYPTION AS '&lt;br /&gt;                      end)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if @type='FN' or @type='TF' or @type='IF'&lt;br /&gt;SET @OrigSpText2=(case @type when 'TF' then&lt;br /&gt;'CREATE FUNCTION '+ @objectname+'(@a char(1)) returns @b table(a varchar(10)) with encryption as begin insert @b select @a return end '&lt;br /&gt;when 'FN' then&lt;br /&gt;'CREATE FUNCTION '+ @objectname+'(@a char(1)) returns char(1) with encryption as begin return @a end'&lt;br /&gt;when 'IF' then&lt;br /&gt;'CREATE FUNCTION '+ @objectname+'(@a char(1)) returns table with encryption as return select @a as a'&lt;br /&gt;end)&lt;br /&gt;&lt;br /&gt;if @type='TR'&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;if @tr_parent_xtype='V'&lt;br /&gt;begin&lt;br /&gt;set @OrigSpText2='CREATE TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION INSTEAD OF INSERT AS PRINT 1 '&lt;br /&gt;end&lt;br /&gt;else&lt;br /&gt;begin&lt;br /&gt;set @OrigSpText2='CREATE TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION FOR INSERT AS PRINT 1 '&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;if @type='V'&lt;br /&gt;set @OrigSpText2='CREATE VIEW '+@objectname+' WITH ENCRYPTION AS SELECT 1 as f'&lt;br /&gt;&lt;br /&gt;set @q=4000-len(@OrigSpText2)&lt;br /&gt;set @OrigSpText2=@OrigSpText2+REPLICATE('-',@q)&lt;br /&gt;end&lt;br /&gt;else&lt;br /&gt;begin&lt;br /&gt;SET @OrigSpText2=REPLICATE('-', 4000)&lt;br /&gt;end&lt;br /&gt;SET @i=1&lt;br /&gt;&lt;br /&gt;SET @resultsp = replicate(N'A', (datalength(@OrigSpText1) / 2))&lt;br /&gt;&lt;br /&gt;WHILE @i&lt;=datalength(@OrigSpText1)/2&lt;br /&gt;BEGIN&lt;br /&gt;&lt;br /&gt;SET @resultsp = stuff(@resultsp, @i, 1, NCHAR(UNICODE(substring(@OrigSpText1, @i, 1)) ^&lt;br /&gt;                               (UNICODE(substring(@OrigSpText2, @i, 1)) ^&lt;br /&gt;                               UNICODE(substring(@OrigSpText3, @i, 1)))))&lt;br /&gt;SET @i=@i+1&lt;br /&gt;END&lt;br /&gt;set @orgvarbin=cast(@OrigSpText1 as varbinary(8000))&lt;br /&gt;set @resultsp=(case when @encrypted=1&lt;br /&gt;                   then @resultsp&lt;br /&gt;                   else convert(nvarchar(4000),case when @status&amp;amp;2=2 then uncompress(@orgvarbin) else @orgvarbin end)&lt;br /&gt;              end)&lt;br /&gt;print @resultsp&lt;br /&gt;&lt;br /&gt;set @n=@n+1&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;set @k=@k+1&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;drop table #temp&lt;br /&gt;rollback tran&lt;br /&gt;end&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-4219585266960619290?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/4219585266960619290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=4219585266960619290' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/4219585266960619290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/4219585266960619290'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/04/sql-server.html' title='查看SQL SERVER 加密存储过程,函数,触发器,视图'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-3325866166634511175</id><published>2009-04-13T18:58:00.007+08:00</published><updated>2009-04-13T19:38:52.576+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Work'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>毕业设计(未完工)</title><content type='html'>&lt;div style="text-align: left;"&gt;        前言： 上周的时间几乎都花在搞毕设上了。感觉做的这个毕业设计很奇怪，没有参考代码就算了，连需求文档，软件架构分析，模块划分等都没有，直接就是开了几个小会，说了些功能要求就让我们自己写。没法，TA的老大们最近忙着推出4.0版本的TA系统，没空理我们。我们10F这些实习生闲的心慌慌，以为毕设没法完成了。谁知道Delphi这么强大。。开发进度很快，已经差不多要完工了。贴几张图上来记录一下成果&lt;br /&gt;       &lt;span style="color: rgb(255, 0, 0);"&gt;格式： 图在上，解说在下.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NQUr3ozUHrQ/SeMbZAKwxhI/AAAAAAAAAF4/o6h4XUy-8eM/s1600-h/%E9%85%8D%E7%BD%AE.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://2.bp.blogspot.com/_NQUr3ozUHrQ/SeMbZAKwxhI/AAAAAAAAAF4/o6h4XUy-8eM/s400/%E9%85%8D%E7%BD%AE.jpg" alt="" id="BLOGGER_PHOTO_ID_5324129300837877266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;1 ：这是框架的配置文件，主要用于配置登录数据库的方案名，用户名（暂时没把密码考虑进去，不然还要考虑加密，况且数据库目前只支持Oracle）。登录窗口直接从这里读取这两个配置文件从而进行初始化&lt;span style="font-weight: bold;"&gt;。&lt;/span&gt;这里使用了Delphi中的TIniFile类进行配置文件的读取和写入。确实是非常好用的一个类。&lt;br /&gt;    可以在配置文件上直接更改。若检测到改动会提示保存与否。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NQUr3ozUHrQ/SeMbZGFTVHI/AAAAAAAAAFw/Q--SSwLGJmU/s1600-h/page1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://1.bp.blogspot.com/_NQUr3ozUHrQ/SeMbZGFTVHI/AAAAAAAAAFw/Q--SSwLGJmU/s400/page1.jpg" alt="" id="BLOGGER_PHOTO_ID_5324129302425588850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;2：这是登录成功后从系统工具菜单里打开的新报表生成工具的第一页。主要用于查询现有可用报表，从一个专门的数据库表单中读取数据并显示在DBGrid中。这一页使用的是DBGrid，确实没有DBGridEh方便，为了写一个随鼠标滚轮而移动TDataSource的游标，并且实现在移动到表格边界时自动翻页，我得另外写个窗口过程，将DBGrid原先的窗口过程保存为一个TWndMethod的变量，将新的窗口过程赋给它。在新的窗口过程中要捕获WM_MOUSEWHEEL消息并做如下处理&lt;br /&gt;if Message.WParam &gt;0 then&lt;br /&gt; ADBGrid.DataSource.DataSet.MoveBy(-1)&lt;br /&gt;else&lt;br /&gt; ADBGrid.DataSource.DataSet.MoveBy(1);&lt;br /&gt;   对于非鼠标滚轮消息则调用保存的原DBGrid窗口过程处理。同时，如果要在不同页里其他DBGrid里实现相同效果，我得做类似的处理。还要小心非鼠标滚轮的消息不会被忘记处理，不然马上会报错。&lt;br /&gt;   而如果使用DBGridEh，它是自带的属性 -_-##&lt;br /&gt;   上边蓝色部分两个Edit组件是用来跟踪当前选中报表信息，可以随顺表滚轮滚动动态更新为当前所在记录行&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NQUr3ozUHrQ/SeMbYxjAj-I/AAAAAAAAAFo/G052iAAm7Fw/s1600-h/page2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://1.bp.blogspot.com/_NQUr3ozUHrQ/SeMbYxjAj-I/AAAAAAAAAFo/G052iAAm7Fw/s400/page2.jpg" alt="" id="BLOGGER_PHOTO_ID_5324129296913043426" border="0" /&gt;&lt;/a&gt;3：这是第2个页面。主要功能是绿色部分的SQL语句查询功能并在下边的表格里显示。在SQL语句输入框上有几个功能键：可以从外部带入一个SQL脚本，可以将输入的SQL脚本导出到硬盘，清空SQL输入框内容，执行SQL语句，另外带了一个拼写帮助。如右上角对话框所示。&lt;br /&gt;   可以在显示结果的DBGridEh中直接修改记录数据，并且修改将会被自动保存（暂时不支持回滚）。令人感动的DBGridEh自带了even和odd行颜色不同的功能，如果用普通的DBGrid又得自己写属性。&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_NQUr3ozUHrQ/SeMbYoXwZuI/AAAAAAAAAFg/tFPQ4Rhofp8/s1600-h/page3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://4.bp.blogspot.com/_NQUr3ozUHrQ/SeMbYoXwZuI/AAAAAAAAAFg/tFPQ4Rhofp8/s400/page3.jpg" alt="" id="BLOGGER_PHOTO_ID_5324129294449927906" border="0" /&gt;&lt;/a&gt;3：这是第三个字段设置页。主要用来勾选新报表要采用的字段，grid里的checkbox还没有加上去，因为要修改原表结构，添加至少三个字段进去，所以要问下导师要不要加。可以查询所有可用字段，可以添加和删除字段。&lt;br /&gt;    这一页可以从第一页双击GRID中某行数据跳转过来，如果是这样的话左边的新报表信息栏会已从第一页选中的报表配置为模版导入。图中左边显示的就是导入报表模版的结果&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_NQUr3ozUHrQ/SeMbYmAs9bI/AAAAAAAAAFY/uiXnhiiXxjs/s1600-h/page4.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://4.bp.blogspot.com/_NQUr3ozUHrQ/SeMbYmAs9bI/AAAAAAAAAFY/uiXnhiiXxjs/s400/page4.jpg" alt="" id="BLOGGER_PHOTO_ID_5324129293816362418" border="0" /&gt;&lt;/a&gt;4：最后一个是SQL脚本生成。将生成新报表的操作全部翻译为SQL语句，导出成为脚本，如果某台计算机上装了相应的数据库导入了相应的表，那只要运行这个脚本，就可以在任意计算机上生成根据配置结果生成的新报表。&lt;br /&gt;&lt;br /&gt;总结：一切都只草草带过。具体技术细节有时间我会陆续发上来，不过其实也没什么难的，是Delphi这把刀太好使了。如果是用MFC，这框架就得累死我。&lt;br /&gt;       这个框架写的还是不错的，可扩展性很强。有新的功能可以独立编写一个功能模块然后把相应的FORM做一些格式上更改就可以直接加入现有的框架了。但我觉得还不够，如果所有的功能模块都可以写成DLL文件形式的那就跟方便了，主程序也不会越写越大。&lt;br /&gt;&lt;br /&gt;       同时我有个想法，因为DLL文件调试很不方便（一旦生成了就没法跟进文件调了），而调试DLL的方法除了专门建个测试工程，还剩一个使用系统日志调试的。我想写个这样的DLL调试工具，liangpei2008在CSDN里回复说建议我用COM+写. GOSH，我还不清楚COM+是什么呢！慢慢来。总是会懂的，我要加油&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-3325866166634511175?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/3325866166634511175/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=3325866166634511175' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/3325866166634511175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/3325866166634511175'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/04/blog-post_13.html' title='毕业设计(未完工)'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_NQUr3ozUHrQ/SeMbZAKwxhI/AAAAAAAAAF4/o6h4XUy-8eM/s72-c/%E9%85%8D%E7%BD%AE.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-8781726497901424331</id><published>2009-04-13T12:49:00.000+08:00</published><updated>2009-04-13T12:50:10.230+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Collections'/><category scheme='http://www.blogger.com/atom/ns#' term='Growing'/><title type='text'>咖啡全集</title><content type='html'>&lt;p&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;拿铁咖啡&lt;/span&gt;&lt;/p&gt;&lt;p&gt;拿铁咖啡是意大利浓缩咖啡与牛 奶的经典混合，意大利人也很喜欢把拿铁作为早餐的饮料。意大利人早晨的厨房里，照得到阳光的炉子上通常会同时煮着咖啡和牛奶。喝拿铁的意大利人，与其说他 们喜欢意大利浓缩咖啡，不如说他们喜欢牛奶，也只有espresso才能给普普通通的牛奶带来让人难以忘怀的味道。&lt;/p&gt;&lt;p&gt;意大利式拿铁咖啡 (Caffe Latte)需要一小杯Espresso和一杯牛奶(150～200毫升)，拿铁咖啡中牛奶多而咖啡少，这与Cappuccino有很大不同。拿铁咖啡做 法极其简单，就是在刚刚做好的意大利浓缩咖啡中倒入接近沸腾的牛奶。事实上，加入多少牛奶没有一定之规，可依个人口味自由调配。&lt;/p&gt;&lt;p&gt;如果在热牛奶上再加上一些打成泡沫的冷牛奶，就成了一杯美式拿铁咖啡。&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;星巴克&lt;/span&gt;的美式拿铁就是用这种方法制成的，底部是意大利浓缩咖啡，中间是加热到65～75℃的牛奶，最后是一层不超过半厘米的冷的牛奶泡沫。&lt;/p&gt;&lt;p&gt;如果不放热牛奶，而直接在意大利浓缩咖啡上装饰两大勺牛奶泡沫，就成了被意大利人叫做&lt;span style="color: rgb(0, 128, 0);"&gt;Espresso Macchiato的玛奇哈朵咖啡。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;欧蕾咖啡(Café Au Lait)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;欧 蕾咖啡可以被看成是欧式的拿铁咖啡，与美式拿铁和F拿铁都不太相同。 欧蕾咖啡的做法也很简单，就是把一杯意大利浓缩咖啡和一大杯热热的牛奶同时倒入一个大杯子，最后在液体表面放两勺打成泡沫的奶油。 欧蕾咖啡区别于美式拿铁和意式拿铁最大的特点就是它要求牛奶和浓缩咖啡一同注入杯中，牛奶和咖啡在第一时间相遇，碰撞出的是一种闲适自由的心情。 法国人是欧蕾咖啡最热情的拥护者，你在法国入的早餐桌上会看到肚子圆圆的欧蕾杯，里面盛的是他们一天好心情的源泉。 有趣的是，比较所有的咖啡杯，可能法国人用来盛欧蕾咖啡的杯子是最大号的。&lt;/p&gt;&lt;p&gt;拿铁是最为国人熟悉的意式咖啡品项.它是在沉厚浓郁的 ESPRESSO中,加进等比例,甚至更多牛奶的花式咖啡.有了牛奶的温润调味,让原本甘苦的咖啡变得柔滑香甜\甘美浓郁,就连不习惯喝咖啡的人,也难敌 拿铁芳美的滋味.和卡布奇诺一样,拿铁因为含有多量的牛奶而适合在早晨饮用.意大利人也喜欢拿它来暖胃,搭配早餐用.很多人搞不清楚拿铁,欧蕾之间的关 系,其实拿铁是意大利式的年奶咖啡,以机器蒸汽的方式来蒸热牛奶,而欧蕾则是法式咖啡,他们用火将牛奶煮热,口感都是一泒的温润滑美. 作法:使用器具与材料. 深烘焙的咖啡豆适量. 牛奶适量(咖啡\鲜奶的比例为:1:1) 1.以热水浸泡杯子(温杯),使其温度上升后,再倒掉多余的水分使用. 2.将深烘焙的咖啡豆研磨后,将咖啡粉倒进填压器内,用压棒将咖啡粉压平,再将填压器扣住意式咖啡机萃取口,萃取出ESPRESSO(咖啡\鲜奶的比例为 1:1). 3.取适量牛奶,将其置于意式浓缩咖啡机的蒸汽喷嘴下,使其蒸成热牛奶. 4.将蒸热的牛奶倒进杯中. 5.将杯子上下摇晃,使奶泡上升 6.最后将ESPRESSO缓缓地倒进杯中即可.&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;卡布奇诺（Gappuccino/Cappuccino Coffee）&lt;/span&gt; 20世纪初期，意大利人阿奇布夏发明蒸汽压力咖啡机的同时，也发展出了卡布奇诺咖啡。卡布奇诺是一种加入以同量的意大利特浓咖啡和蒸汽泡沫牛奶相混合的意 大利咖啡。此时咖啡的颜色，就象卡布奇诺教会的修士在深褐色的外衣上覆上一条头巾一样，咖啡因此得名。传统的卡布奇诺咖啡是三分之一浓缩咖啡，三分之一蒸 汽牛奶和三分之一泡沫牛奶。 特浓咖啡的浓郁口味，配以润滑的奶泡；颇有一些汲精敛露的意味。撒上了肉桂粉的起沫牛奶，混以自下而上的意大利咖啡的香气，新一代咖啡族为此而心动不已。 它有一种让人无法抗拒的独特魅力，起初闻起来时味道很香，第一口喝下去时，可以感觉到大量奶泡的香甜和酥软，第二口可以真正品尝到咖啡豆原有的苦涩和浓 郁，最后当味道停留在口中，你又会觉得多了一份香醇和隽永……一种咖啡可以喝出多种不同的独特味道，不觉得很神奇吗？第一口总让人觉得苦涩中带着酸味，大 量的泡沫就像年轻人轻挑的生活，而泡沫的破灭和那一点点的苦涩又像是梦想与现实的冲突。最后品尝过生活的悲喜后，生命的香醇回甘却又让人陶醉…… 这就好像正值青春期的青少年一般，在享受过童稚、美好的时光后，便要开始面对踏入成人世界的冲击，真正尝到人生的原味——除了甘甜之外，还有一份苦涩。&lt;/p&gt;&lt;p&gt;卡 布奇诺的由来 维也纳人柯奇斯基（Fanz George Kolschitsky）是牛奶加咖啡的Cafe Latte创始人。 这两种饮料均是咖啡和牛奶洐生出来，但卡布奇诺的来历却更有学问，一直是欧美研究文字变迁的最佳体材。 Cappuccino此字的历史： 创设于1525五年以后的圣芳济教会（Capuchin）的修士都穿著褐色道袍，头戴一顶尖尖帽子，圣芳济教会传到意大利时，当地人觉得修士服饰很特殊， 就给他们取个Cappuccino的名字，此字的意大利文是指僧侣所穿宽松长袍和小尖帽，源自意大利文“头巾”即Cappuccio。 然而，老意爱喝咖啡，发觉浓缩咖啡、牛奶和奶泡混合后，颜色就像是修士所穿的深褐色道袍，于是灵机一动，就给牛奶加咖啡又有尖尖奶泡的饮料，取名为卡布奇 诺（Cappuccino）。英文最早使用此字的时间在1948年，当时旧金山一篇报导率先介绍卡布奇诺饮料，一直到一九九0年以后，才成为世人耳熟能详 的咖啡饮料。应该可以这么说Cappuccino咖啡这个字，源自圣芳济教会(Capuchin)和意大利文头巾（Cappucio），相信 Cappuccino的原始造字者，做梦也没料到僧侣的道袍最后会变成一种咖啡饮料名称。 卡布奇诺也和一种猴名有关。非洲有一种小猴子，头顶上有一撮黑色的锥状毛发，很像圣芳济教会道袍上的小尖帽，这种小猴子也因此被取名为Capuchin， 此一猴名最早被英国人使用的时间在1785年。Capuchin此字数百年后洐生成咖啡饮料名和猴子名称，一直是文字学者津津乐道的趣闻。 干卡布奇诺与湿卡布奇诺 你知道卡布奇诺可以干喝也可以湿喝吗？所谓干卡布奇诺（Dry Cappuccino）是指奶泡较多，牛奶较少的调理法，喝起来咖啡味浓过奶香，适合重口味者饮用。到于湿卡布奇诺（Wet Cappuccino）则指奶泡较少，牛奶量较多的做法，奶香盖过浓呛的咖啡味，适合口味清淡者。 湿卡布奇诺的风味和时下流行的拿铁差不多。一般而言，卡布奇诺的口味比拿铁来得重，如果您是重口味不妨点卡布奇诺或干卡布奇诺，您如果不习惯浓呛的咖啡 味，可以点拿铁或湿卡布奇诺。 卡布奇诺咖啡的制作 在意大利特浓咖啡的基础上，加一层厚厚的起沫的牛奶，就成了卡布奇诺。特浓咖啡的质量在牛奶和泡沫下会看不太出来，但它仍然是决定卡布奇诺口味的重要因 素。把经过部分脱脂的牛奶倒入一只壶中，然后用起沫器让牛奶起沫、冲气，并且让牛奶不经过燃烧就可以象掼奶油一样均匀。盛卡布奇诺的咖啡杯应该是温热的不 然倒入的牛奶泡沫会散开。平时可以将这些杯子放在咖啡机的顶部保温。将牛奶和泡沫倒在特浓咖啡上面，自然形成了一层，就好像把下面的咖啡包了起来。注意倒 入冲泡好的意大利咖啡约五分满，打过奶泡的热牛奶倒至八分满。最后可随个人喜好，洒上少许再切成细丁的肉桂粉或巧克力粉，剩余的牛奶也可以一起倒进去，这 样，一杯美味的卡布奇诺就制成了。&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;蓝山咖啡(BLUEMOUNTAIN)&lt;/span&gt; 　　是生产于牙买加蓝山海拔2500尺以上的咖啡豆，是一种微酸、柔顺、带甘、风味细腻的咖啡；纯蓝山咖啡口感、香味较淡，但喝起来却非常香醇精致；具有贵族的品味，乃咖啡中之极品。 　　&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;摩卡咖啡(MOCHA)&lt;/span&gt; 　　目前以也门所生产的咖啡为最佳，其次为依索比亚的摩卡；摩卡咖啡带润滑中之中酸至强酸、甘性特佳、风味独特，含有巧克力的味道；具有贵妇人的气质，是极具特色的一种纯品咖啡。 　　&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;哥伦比亚咖啡(COLOMBIA）&lt;/span&gt;　　哥伦比亚咖啡中以SUPREMO最具特色，其咖啡柔软香醇；带微酸至中酸，其品质及香味稳定，属中度咖啡，是用以调配综合咖啡的上品。 　　&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;曼特宁咖啡(MANDELING) 　　&lt;/span&gt;是生产于印度尼西亚，苏门答腊中最具代表性的咖啡；风味香、浓、苦，口味相当强，但柔顺不带酸，是印度尼西亚生产的咖啡中品质最好的一种咖啡。 　　 &lt;span style="color: rgb(0, 128, 0);"&gt;碳烧咖啡(CHARCALFIRE&lt;/span&gt;） 　　是一种重度烘焙的咖啡，味道焦、苦不带酸，咖啡豆有出油的现象，极适合用于蒸气加压咖啡。 　　&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;巴西咖啡(SANTOS)&lt;/span&gt; 　　巴西乃世界第一的咖啡生产国，所产之咖啡，香味温和、微酸、微苦，为中性咖啡之代表，是调配温和咖啡不可或缺的品种。 　　 肯亚咖啡(KENYAAA) 　　是非洲高地栽培的代表性咖啡。AA代表其级数也就是最高级品，其咖啡豆肉质厚呈圆形，味浓质佳，通常采用浅焙。清晨起来喝一杯肯亚，具有醒脑的效用。 　　&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;夏威夷咖啡(KONAFANCY) 　&lt;/span&gt;　属于夏威夷西部火山所栽培的咖啡，也是美国唯一生产的咖啡品种，口感较强，香味浓，带强酸，风味特殊。品质相当稳定，是前往夏威夷的观光客必购土产之一。&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;維也納咖啡  &lt;span style="color: rgb(0, 0, 0);"&gt;（Viennese）乃&lt;/span&gt;&lt;a target="_blank"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;奥地利&lt;/span&gt;&lt;/a&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;最著名的&lt;/span&gt;&lt;a target="_blank"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;咖啡&lt;/span&gt;&lt;/a&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;， 是一个名叫爱因·舒伯纳的马车夫发明的，也许是由于这个原因，今天，人们偶尔也会称维也纳咖啡为“单头马车”。以浓浓的鲜奶油和巧克力的甜美风味迷倒全球 人士。雪白的鲜奶油上，洒落五色缤纷七彩米，扮相非常漂亮；隔着甜甜的巧克力糖浆、冰凉的鲜奶油啜饮滚烫的热咖啡，更是别有风味！&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;　　维也纳咖啡是慵懒的周末或是闲适的午后最好的伴侣，喝上一杯维也纳咖啡就是为自己创造了一个绝好的放松身心的机会。但是，由于含有太多糖分和脂肪，维也纳咖啡并不适合于减肥者。&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;hazelnut咖啡   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Hazelnut就是指榛果咖啡&lt;br /&gt;French Vanilla就是法式香草.你没必要把中文一起打上来的.懂的人一看就懂.不懂的就会根据这些去找地方复制答案了.这两种都是拿铁.只是里面放了不同的糖浆.底子都是&lt;br /&gt;Espresso Ristretto 1杯 (15-20ml) +蒸汽奶泡 约200ml   &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;白咖啡 &lt;/span&gt;&lt;/p&gt;&lt;p&gt;Malaysia是唯一出产正统白咖啡的地方哦~&lt;br /&gt;现在市面上存在的咖啡都属于黑咖啡，黑咖啡是咖啡豆加焦糖经过高温炭烤而成，这一做工使得做出的咖啡有焦苦、酸、焦糖和炭化的味道。在健康上它会伤胃，上火，造成黑色素的沉淀等不利之处。&lt;br /&gt;　　白咖啡是咖啡豆不加焦糖直接低温烘焙,去除了一般高温热炒及炭烤的焦枯、酸涩味,而且保留了原始咖啡的自然风味及浓郁的香气,香浓顺口而心动。不伤肠胃，不上火,低咖啡因,口感滑顺,甘醇芬芳。  &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;几种咖啡的调制&lt;/span&gt; 　　 　　综合热咖啡：巴西3.5、曼特宁1、爪哇2、哥伦比亚2、摩卡1.5（调配式）香、甘、苦、酸。 　　 　　综合热咖啡：巴西2、曼特宁1、爪哇3.5、哥伦比亚2、摩卡1.5（调配式）香、甘、苦、酸。 　　 　　综合冰咖啡：曼特宁2、哥伦比亚2、爪哇2.5、荷兰一号2、摩卡1.5（调配式）香、醇、苦 　　 　　碳烧咖 啡：独特的烘培方式，产于苏门答腊，哥伦比亚2、巴西2、曼特宁1.5、爪哇4.5。苦、醇。 　　意大利咖啡 ： 一般在家中冲泡意大利咖啡，是利用意大利发明的摩卡壶冲泡成的，这种咖啡壶也是利用蒸气压力的原理来淬取咖啡（又一个瓦特的徒弟）。摩卡壶可以使受压的蒸 气直接通过咖啡粉，让蒸气瞬间穿过咖啡粉的细胞壁（还是虎克的徒弟），将咖啡的内在精华淬取出来，故而冲泡出来的咖啡具有浓郁的香味及强烈的苦味，咖啡的 表面并浮现一层薄薄的咖啡油，这层油正是意大利咖啡诱人香味的来源。 康宝蓝 马琪雅朵咖啡： 意大利咖啡真是“百花齐放”，又开出康宝蓝与马琪雅朵两朵花来。只要在意大利浓缩咖啡中加入适量的鲜奶油，即轻松地完成一杯康宝蓝。嫩白的鲜奶油轻轻漂浮 在深沉的咖啡上，宛若一朵出淤泥而不染的白莲花，令人不忍一口喝下。 在意大利浓缩咖啡中，不加鲜奶油、牛奶，只加上两大勺绵密细软的奶泡就是一杯马琪雅朵。不象康宝蓝，要想享受马琪雅朵的美味，就要一口喝下。 法国牛奶咖啡： 咖啡和牛奶的比例为1：1，正统的法国牛奶咖啡冲泡时，要牛奶壶和咖啡壶从两旁同时注入咖啡杯，这种冲配方法延续了几百年。今天，它仍是法国人早餐桌上不 可或缺的饮品。法国baby，奶味十足！ 土耳其咖啡： 至今仍采用原始煮法，复杂的工艺带着几许异国情调的神秘色彩。从中，我们可以窥视到奥斯曼帝国盛极一时的风采。 爱尔兰咖啡： 名字里就带着一阵威士忌浓烈的熏香，爱尔兰人视威士忌如生命，也少不了在咖啡中做些手脚！以威士忌调成的爱尔兰咖啡，更能将咖啡的酸甜味道衬托出来。一丝 成熟的忧郁…… 小心，咖啡喝多了也会醉！ 皇家咖啡： 这一道极品可是由一位能征贯战的皇帝发明的，对了，他就是法兰西帝国的皇帝拿破仑！他可不喜欢奶味，他喜欢的是法国的骄傲——白兰地！（又一个在咖啡中掺 烈酒的家伙！）蓝色的火焰舞起白兰地的芳醇与方糖的焦香，再合上浓浓的咖啡香，苦涩中略带甘甜……法国的高傲，法国的浪漫。 绿茶咖啡： 绿茶的清香将我们的视线从遥远的国度拉了回来，日本是一个善于吸收与融合的民族，这一次，他们又在西方的咖啡与东方的绿茶之间找到了平衡点，也为爱喝茶的 朋友们提供了新宠。这是一道纯东洋风味的咖啡，绿茶的幽雅清香、咖啡的浓郁厚重交流激荡。 冰拿铁咖啡： 我们不得不再一次提到拿铁咖啡。（是它太诱人，还是它风花雪月太过头？）利用果糖与牛奶混合增加牛奶的比重，使它与比重较轻的咖啡不会混合，成为黑白分明 的两层，形成如鸡尾酒般曼妙的视觉效果，再加上冰块，给人一种高雅而浪漫的温馨感觉。 魔力冰淇淋咖啡： 这一道充满创意与富有变化的神奇口味只属于年轻的你！在冰凉的香草冰淇淋上倒入意大利浓缩咖啡，再用巧克力酱在鲜奶油和冰淇淋上自由构图，魔力般水乳交融 的冰品咖啡，只留芳香与清爽在你口中。 摩卡霜冻咖啡： 喜爱巧克力的伙计们，还有没有胃口试试“霜冻”了的巧克力摩卡咖啡？用果汁机将冰块与冰淇淋打碎调和，创造出一种绵密的视觉效果，再加入摩卡冰咖啡，就大 功告成了！入口溜滑，沁爽香醇，夏日炎炎中给你一个清凉的下午。&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;　　这种维也纳咖啡有着独特的喝法。品尝维也纳咖啡最大的技巧在于不去搅拌咖啡，而是享受杯中三段式的快乐：首先是冰凉的奶油，柔和爽口；然后是浓香的咖啡，润滑却微苦；最后是甜蜜的糖浆，即溶未溶的关键时刻，带给人们发现宝藏般的惊喜。&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;　　维也纳咖啡的制作有点像美式摩卡咖啡。首先在湿热的咖啡杯底部撒上薄薄一层砂糖或细冰糖，接着向杯中倒入滚烫而且偏浓的黑咖啡，最后在咖啡表面装饰两勺冷的新鲜奶油，一杯经典的维也纳咖啡就做好了。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-8781726497901424331?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/8781726497901424331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=8781726497901424331' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/8781726497901424331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/8781726497901424331'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/04/blog-post.html' title='咖啡全集'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-7466016775345966251</id><published>2009-04-13T11:09:00.000+08:00</published><updated>2009-04-13T11:10:19.007+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>【又是一个偷懒的转载】Returning语句的几个小问题</title><content type='html'>ORACLE的DML语句中可以指定RETURNING语句。RETURNING语句的使用在很多情况下可以简化PL/SQL编程。&lt;br /&gt;&lt;br /&gt;这里不打算说明RETURNING语句的使用（其实使用起来也很简单，和SELECT INTO语句没有多大区别。），主要打算说明RETURNING语句的几个特点。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;其实这篇文章源于同事问我的一个问题：&lt;br /&gt;&lt;br /&gt;使用UPDATE语句的时候，RETURNING得到的结果是UPDATE之前的结果还是UPDATE之后的结果？&lt;br /&gt;&lt;br /&gt;这个问题把我问住了。考虑DELETE的情况，RETURNING返回的肯定是DELETE之前的结果，而考虑INSERT的情况，RETURNING返回的一定是INSERT之后的结果。但是UPDATE到底返回那种情况，就无法推断出来了。而且，由于一般在使用UPDATE的RETURNING语句时，都会返回主键列，而主键列一般都是不会修改的，因此确实不清楚Oracle返回的是UPDATE之前的结果还是之后的结果。&lt;br /&gt;&lt;br /&gt;当然，一个简单的例子就可以测试出来：&lt;br /&gt;&lt;br /&gt;SQL&gt; CREATE TABLE T (ID NUMBER, NAME VARCHAR2(30));&lt;br /&gt;&lt;br /&gt;表已创建。&lt;br /&gt;&lt;br /&gt;SQL&gt; SET SERVEROUT ON&lt;br /&gt;SQL&gt; DECLARE&lt;br /&gt;2 V_NAME VARCHAR2(30);&lt;br /&gt;3 BEGIN&lt;br /&gt;4 INSERT INTO T VALUES (1, 'YANGTK') RETURNING NAME INTO V_NAME;&lt;br /&gt;5 DBMS_OUTPUT.PUT_LINE('INSERT: ' || V_NAME);&lt;br /&gt;6 V_NAME := NULL;&lt;br /&gt;7 UPDATE T SET NAME = 'YTK' RETURNING NAME INTO V_NAME;&lt;br /&gt;8 DBMS_OUTPUT.PUT_LINE('UPDATE: ' || V_NAME);&lt;br /&gt;9 V_NAME := NULL;&lt;br /&gt;10 DELETE T RETURNING NAME INTO V_NAME;&lt;br /&gt;11 DBMS_OUTPUT.PUT_LINE('DELETE: ' || V_NAME);&lt;br /&gt;12 END;&lt;br /&gt;13 /&lt;br /&gt;INSERT: YANGTK&lt;br /&gt;UPDATE: YTK&lt;br /&gt;DELETE: YTK&lt;br /&gt;&lt;br /&gt;PL/SQL 过程已成功完成。&lt;br /&gt;&lt;br /&gt;显然，UPDATE操作的RETURNING语句是返回UPDATE操作之后的结果。&lt;br /&gt;&lt;br /&gt;顺便总结几个RETURNING操作相关的问题：&lt;br /&gt;&lt;br /&gt;1．RETURNING语句似乎和RETURN通用。&lt;br /&gt;&lt;br /&gt;SQL&gt; SET SERVEROUT ON&lt;br /&gt;SQL&gt; DECLARE&lt;br /&gt;2 V_NAME VARCHAR2(30);&lt;br /&gt;3 BEGIN&lt;br /&gt;4 INSERT INTO T VALUES (1, 'YANGTK') RETURN NAME INTO V_NAME;&lt;br /&gt;5 DBMS_OUTPUT.PUT_LINE('INSERT: ' || V_NAME);&lt;br /&gt;6 V_NAME := NULL;&lt;br /&gt;7 UPDATE T SET NAME = 'YTK' RETURN NAME INTO V_NAME;&lt;br /&gt;8 DBMS_OUTPUT.PUT_LINE('UPDATE: ' || V_NAME);&lt;br /&gt;9 V_NAME := NULL;&lt;br /&gt;10 DELETE T RETURN NAME INTO V_NAME;&lt;br /&gt;11 DBMS_OUTPUT.PUT_LINE('DELETE: ' || V_NAME);&lt;br /&gt;IXDBA.NET技术社区&lt;br /&gt;12 END;&lt;br /&gt;13 /&lt;br /&gt;INSERT: YANGTK&lt;br /&gt;UPDATE: YTK&lt;br /&gt;DELETE: YTK&lt;br /&gt;&lt;br /&gt;PL/SQL 过程已成功完成。&lt;br /&gt;&lt;br /&gt;2．RETURNING语句也可以使用SQLPLUS的变量，这样，RETURNING语句不一定非要用在PL/SQL语句中。&lt;br /&gt;&lt;br /&gt;SQL&gt; VAR V_NAME VARCHAR2(30)&lt;br /&gt;SQL&gt; INSERT INTO T VALUES (1, 'YANGTK') RETURNING NAME INTO :V_NAME;&lt;br /&gt;&lt;br /&gt;已创建 1 行。&lt;br /&gt;&lt;br /&gt;SQL&gt; PRINT V_NAME&lt;br /&gt;&lt;br /&gt;V_NAME&lt;br /&gt;--------------------------------&lt;br /&gt;YANGTK&lt;br /&gt;&lt;br /&gt;SQL&gt; UPDATE T SET NAME = 'YTK' RETURNING NAME INTO :V_NAME;&lt;br /&gt;&lt;br /&gt;已更新 1 行。&lt;br /&gt;&lt;br /&gt;SQL&gt; PRINT V_NAME&lt;br /&gt;&lt;br /&gt;V_NAME&lt;br /&gt;--------------------------------&lt;br /&gt;YTK&lt;br /&gt;&lt;br /&gt;SQL&gt; DELETE T RETURNING NAME INTO :V_NAME;&lt;br /&gt;&lt;br /&gt;已删除 1 行。&lt;br /&gt;&lt;br /&gt;SQL&gt; PRINT V_NAME&lt;br /&gt;&lt;br /&gt;V_NAME&lt;br /&gt;--------------------------------&lt;br /&gt;YTK&lt;br /&gt;&lt;br /&gt;3．INSERT INTO VALUES语句支持RETURNING语句，而INSERT INTO SELECT语句不支持。MERGE语句不支持RETURNING语句。&lt;br /&gt;&lt;br /&gt;SQL&gt; MERGE INTO T USING (SELECT * FROM T) T1&lt;br /&gt;2 ON (T.ID = T1.ID)&lt;br /&gt;3 WHEN MATCHED THEN UPDATE SET NAME = T1.NAME&lt;br /&gt;4 WHEN NOT MATCHED THEN INSERT VALUES (T1.ID, T1.NAME)&lt;br /&gt;5 RETURNING NAME INTO :V_NAME;&lt;br /&gt;RETURNING NAME INTO :V_NAME&lt;br /&gt;*第 5 行出现错误:&lt;br /&gt;ORA-00933: SQL 命令未正确结束&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQL&gt; INSERT INTO T SELECT * FROM T RETURNING NAME INTO :V_NAME;&lt;br /&gt;INSERT INTO T SELECT * FROM T RETURNING NAME INTO :V_NAME&lt;br /&gt;*第 1 行出现错误:&lt;br /&gt;ORA-00933: SQL 命令未正确结束&lt;br /&gt;&lt;br /&gt;这两个限制确实不大方便。不知道Oracle在以后版本中是否会放开。 &lt;br /&gt;个人感觉RETURNING语句和BULK COLLECT INTO语句配合使用的机会更多一些。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-7466016775345966251?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/7466016775345966251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=7466016775345966251' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/7466016775345966251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/7466016775345966251'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/04/returning.html' title='【又是一个偷懒的转载】Returning语句的几个小问题'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-4059666891287788183</id><published>2009-04-09T09:29:00.000+08:00</published><updated>2009-04-09T09:31:20.615+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><title type='text'>Delphi中调试DLL文件（感谢liangpei2008的回答）</title><content type='html'>可以调试！&lt;br /&gt;&lt;br /&gt;完整的调试 DLL方法如下：&lt;br /&gt;&lt;br /&gt;1）新建一个 DLL 工程，名字就叫 MyDll 吧，编译后生成 MyDll.dll，我们要调试的就是它了。&lt;br /&gt;&lt;br /&gt;2）新建一个用来调试 MyDll 的 Application 工程，名字就叫 MyDllTest 吧，编译后生成的可执行性文件为 MyDllTest.exe，这就是我们用来调试 MyDll.dll 的宿主程序&lt;br /&gt;&lt;br /&gt;3）MyDllTest.exe 所在目录中不能有 MyDll.dll（重要！）&lt;br /&gt;&lt;br /&gt;4）MyDllTest 采用静态调用的方法调用 MyDll.dll 的导出函数（重要！）&lt;br /&gt;&lt;br /&gt;5）进入 MyDll 工程，执行菜单“Run”-&gt;“Parameters”，将弹出的对话框的 Local 页中的“Host Application”设置为上面的 MyDllTest.exe（含路径）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;还要注意的是，调试 dll 的时候，被调试的 dll 和宿主程序不能在同一个 Project Group中，也就是说，你不要把 dll 和宿主程序放在同一个 Project Group中再进行调试，一定要单独打开 dll 工程进行调试。否则，调试也会不成功。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;不过能调试DLL是省了一些时间，但不太规范！&lt;br /&gt;创建一个日志输出模块(最好写成COM+)，声明几个接口，这样整个项目的日志记录均输出于此(同时在WIndows下的各种开发环境均可调用)！而且还可以复用！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-4059666891287788183?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/4059666891287788183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=4059666891287788183' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/4059666891287788183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/4059666891287788183'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/04/delphidllliangpei2008.html' title='Delphi中调试DLL文件（感谢liangpei2008的回答）'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-7367004116136798898</id><published>2009-04-06T22:21:00.004+08:00</published><updated>2009-04-06T22:28:08.378+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><title type='text'>Delphi做的百叶窗小程序</title><content type='html'>做了一个百叶窗小程序&lt;br /&gt;碰到了几个问题，比如说两个用到LoadFromFile函数的地方第一次可以识别相对路径&lt;br /&gt;而如果我更改了其中一个的路径使其变为硬盘上某个绝对路径&lt;br /&gt;那另外一个LoadFromFile就不能识别原先的相对路径了，很奇怪&lt;br /&gt;我采取了加判断绕过这个问题的方法&lt;br /&gt;先上代码，主要的是shutter单元，是作为一个组件来编写的&lt;br /&gt;另外还写了个测试单元。主要针对Shutter的某些属性进行设置从而测试Shutter&lt;br /&gt;&lt;br /&gt;unit Shutter;&lt;br /&gt;{ CopyRight@ Swetter }&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;SysUtils, Windows, Classes, Forms, Controls, Graphics,&lt;br /&gt;Messages, ExtCtrls, Dialogs;&lt;br /&gt;&lt;br /&gt;const&lt;br /&gt;{位图344*500,沿Y轴等分成10块&lt;br /&gt; yInc存储了每块的高度&lt;br /&gt; BitMapWid存储了位图的宽度&lt;br /&gt; BitMapHei存储了位图的高度&lt;br /&gt; ShowPixels为随Timer每次递增的行宽度&lt;br /&gt; TimerInterval为Timer的时间间隔}&lt;br /&gt;YInc = 50;&lt;br /&gt;//  ShowPixels = 1;&lt;br /&gt;BitMapWid = 344;&lt;br /&gt;BitMapHei = 500;&lt;br /&gt;//  TimerInterval = 50;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;EShutterError = class(Exception);&lt;br /&gt;&lt;br /&gt;TShutter = class(TCustomPanel)&lt;br /&gt;private&lt;br /&gt;  FMemBitMap: TBitmap;&lt;br /&gt;  FMemMskBtMp: TBitmap;&lt;br /&gt;  FTimer: TTimer;&lt;br /&gt;  FActive: Boolean;&lt;br /&gt;  FCurrHei: Integer;&lt;br /&gt;  FVRect: TRect;&lt;br /&gt; {FOpen指示百叶窗打开与关闭效果,true则百叶窗打开，false则百叶窗关闭&lt;br /&gt;  FDone指示位图是否显示完毕&lt;br /&gt;  FViewPic指示是否要查看原图&lt;br /&gt;    true为查看原图，此时FCurrHei值直接为yInc而不置0&lt;br /&gt;    false为不查看原图，此时在SetActive为false后FCurrHei置0&lt;br /&gt;  FNFrstm指示在百叶窗打开模式下（即清空图像）是否已贴上原图&lt;br /&gt;    false为未贴上原图，需重新贴一次；true为已贴上原图，可以开始贴屏蔽图}&lt;br /&gt;  FOpen: Boolean;&lt;br /&gt;  FDone: Boolean;&lt;br /&gt;  FViewPic: Boolean;&lt;br /&gt;  FOnDone: TNotifyEvent;&lt;br /&gt;  FNFrstm: Boolean;&lt;br /&gt;  FBkFileName: string;&lt;br /&gt;  FFgFileName: string;&lt;br /&gt;  ShowPixels: Integer;&lt;br /&gt;  TimerInterval: Integer;&lt;br /&gt;  procedure IncWid;&lt;br /&gt;  procedure SetActive(AValue: Boolean);&lt;br /&gt;  procedure ActOnTimer(Sender: TObject);&lt;br /&gt;  procedure DoTimer;&lt;br /&gt;protected&lt;br /&gt;  procedure Paint; override;&lt;br /&gt;  procedure FillBitmap; virtual;&lt;br /&gt;public&lt;br /&gt;  procedure CoordinateTimer;&lt;br /&gt;  procedure ImageChanged;&lt;br /&gt;  property  Pixel: Integer read ShowPixels write ShowPixels;&lt;br /&gt;  property  Interval: Integer read TimerInterval write TimerInterval;&lt;br /&gt;  property  BkFileName: string read FBkFileName write FBkFileName;&lt;br /&gt;  property  FgFileName: string read FFgFileName write FFgFileName;&lt;br /&gt;  property  NFrstm: Boolean read FNFrstm write FNFrstm;&lt;br /&gt;  property  Open: Boolean read FOpen write FOpen;&lt;br /&gt;  property  ViewPic: Boolean read FViewPic write FViewPic;&lt;br /&gt;  property  Active: Boolean read FActive write SetActive;&lt;br /&gt;  property  Done: Boolean read FDone write FDone;&lt;br /&gt;  constructor Create(AOwner: TComponent); override;&lt;br /&gt;  destructor Destroy; override;&lt;br /&gt;published&lt;br /&gt;  { Publish inherited properties: }&lt;br /&gt;  property OnDone: TNotifyEvent read FOnDone write FOnDone;&lt;br /&gt;  property Align;&lt;br /&gt;  property Alignment;&lt;br /&gt;  property BevelInner;&lt;br /&gt;  property BevelOuter;&lt;br /&gt;  property BevelWidth;&lt;br /&gt;  property BorderWidth;&lt;br /&gt;  property BorderStyle;&lt;br /&gt;  property Color;&lt;br /&gt;  property Ctl3D;&lt;br /&gt;  property Font;&lt;br /&gt;  property Locked;&lt;br /&gt;  property ParentColor;&lt;br /&gt;  property ParentCtl3D;&lt;br /&gt;  property ParentFont;&lt;br /&gt;  property Visible;&lt;br /&gt;  property OnClick;&lt;br /&gt;  property OnDblClick;&lt;br /&gt;  property OnMouseDown;&lt;br /&gt;  property OnMouseMove;&lt;br /&gt;  property OnMouseUp;&lt;br /&gt;  property OnResize;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;{ TShutter }&lt;br /&gt;&lt;br /&gt;procedure TShutter.DoTimer;&lt;br /&gt;begin&lt;br /&gt;with FTimer do&lt;br /&gt;begin&lt;br /&gt;  Enabled := False;&lt;br /&gt;  Interval := TimerInterval;&lt;br /&gt;  OnTimer := ActOnTimer;&lt;br /&gt;end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;constructor TShutter.Create(AOwner: TComponent);&lt;br /&gt;begin&lt;br /&gt;inherited Create(AOwner);&lt;br /&gt;TimerInterval := 50;&lt;br /&gt;ShowPixels := 1;&lt;br /&gt;FTimer := TTimer.Create(Self);&lt;br /&gt;DoTimer;&lt;br /&gt;{ 实例初始化的值 }&lt;br /&gt;Width := 344;&lt;br /&gt;Height := 500;&lt;br /&gt;FActive := False;&lt;br /&gt;BevelWidth := 3;&lt;br /&gt;FFgFileName := '.\pics\pic.bmp';&lt;br /&gt;FBkFileName := '.\pics\view.bmp';&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;destructor TShutter.Destroy;&lt;br /&gt;begin&lt;br /&gt;SetActive(False);&lt;br /&gt;FTimer.Free;&lt;br /&gt;inherited Destroy;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TShutter.ActOnTimer(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;IncWid;&lt;br /&gt;InvalidateRect(Handle, @FVRect, false);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TShutter.FillBitmap;&lt;br /&gt;begin&lt;br /&gt;//FVRect存储了整张内存位图的区域大小&lt;br /&gt;FVRect := Rect(0, 0, BitMapWid, BitMapHei);&lt;br /&gt;//初始化FMemBitMap的宽度和高度&lt;br /&gt;FMemMskBtMp:= TBitmap.Create;&lt;br /&gt;FMemBitMap := TBitmap.Create;&lt;br /&gt;FMemMskBtMp.Width := BitMapWid;&lt;br /&gt;FMemMskBtMp.Height:= BitMapHei;&lt;br /&gt;FMemBitMap.Width  := BitMapWid;&lt;br /&gt;FMemBitMap.Height := BitMapHei;&lt;br /&gt;try&lt;br /&gt;if FBkFileName &lt;&gt; '.\pics\view.bmp' then&lt;br /&gt;   FMemMskBtMp.LoadFromFile(FBkFileName);&lt;br /&gt;if FFgFileName &lt;&gt; '.\pics\pic.bmp' then&lt;br /&gt;   FMemBitMap.LoadFromFile(FFgFileName);&lt;br /&gt;except&lt;br /&gt;  on EFOpenError DO&lt;br /&gt;    MessageBox(Handle,'打开文件出错，请重试','提示',MB_OK);&lt;br /&gt;end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TShutter.IncWid;&lt;br /&gt;begin&lt;br /&gt;if not FOpen and (not FDone) then&lt;br /&gt;begin&lt;br /&gt;  if FCurrHei + ShowPixels &lt;= yInc then       Inc(FCurrHei, ShowPixels)     //为保存位图，不要SetActive(False)     else       FDone := True;   end   else if FOpen and(not FDone) then   begin     if FCurrHei - ShowPixels &gt;= 0 then&lt;br /&gt;    Dec(FCurrHei, ShowPixels)&lt;br /&gt;  else&lt;br /&gt;    FDone := True;&lt;br /&gt;end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TShutter.Paint;&lt;br /&gt;var&lt;br /&gt;i: Integer;&lt;br /&gt;begin&lt;br /&gt;//如果要查看背景图，直接贴上去&lt;br /&gt;if FViewPic then&lt;br /&gt;  BitBlt(Canvas.Handle, 0, 0, BitMapWid, BitMapHei,&lt;br /&gt;    FMemBitMap.Canvas.Handle, 0, 0, srcCopy);&lt;br /&gt;&lt;br /&gt;if FActive and not FOpen then&lt;br /&gt;for i := 0 to 9 do&lt;br /&gt;  BitBlt(Canvas.Handle, 0, i*YInc, BitMapWid, FCurrHei,&lt;br /&gt;    FMemBitMap.Canvas.Handle, 0, i*YInc, srcCopy)&lt;br /&gt;else if FActive and FOpen then&lt;br /&gt;begin&lt;br /&gt;  if not NFrstm then&lt;br /&gt;    begin&lt;br /&gt;      for i := 0 to 9 do&lt;br /&gt;      BitBlt(Canvas.Handle, 0, i*YInc, BitMapWid, YInc,&lt;br /&gt;        FMemBitMap.Canvas.Handle, 0, i*YInc, SRCCOPY);&lt;br /&gt;      NFrstm := True;&lt;br /&gt;    end&lt;br /&gt;  else&lt;br /&gt;    for i := 0 to 9 do&lt;br /&gt;      BitBlt(Canvas.Handle, 0, i*YInc , BitMapWid, YInc - FCurrHei,&lt;br /&gt;        FMemMskBtMp.Canvas.Handle, 0, i*YInc, SRCCOPY);&lt;br /&gt;end&lt;br /&gt;else inherited Paint;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TShutter.SetActive(AValue: Boolean);&lt;br /&gt;begin&lt;br /&gt;if AValue and (not FActive) then&lt;br /&gt;begin&lt;br /&gt;  FActive := True;&lt;br /&gt;  FillBitmap;&lt;br /&gt;  {FViewPic,true则查看位图&lt;br /&gt;   FOpen,True则为百叶窗打开模式}&lt;br /&gt;  if not FOpen then&lt;br /&gt;    FCurrHei := 0&lt;br /&gt;  else&lt;br /&gt;    FCurrHei := YInc;&lt;br /&gt;&lt;br /&gt;  try&lt;br /&gt;    FTimer.Enabled := True;     &lt;br /&gt;  except&lt;br /&gt;    EShutterError.Create('Timer初始化出错');&lt;br /&gt;  end;&lt;br /&gt;end&lt;br /&gt;else if (not AValue) and FActive then&lt;br /&gt;begin&lt;br /&gt;  FTimer.Enabled := False;   //停止计时&lt;br /&gt;  if Assigned(FOnDone)       // fire OnDone event,&lt;br /&gt;    then FOnDone(Self);&lt;br /&gt;  FActive := False;          //停止组件&lt;br /&gt;  FMemBitMap.Free;           //释放内存位图&lt;br /&gt;  FMemMskBtMp.Free;          //释放屏蔽位图&lt;br /&gt;  Invalidate;                //清空组件窗口内容&lt;br /&gt;end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TShutter.ImageChanged;&lt;br /&gt;begin&lt;br /&gt;if (FMemMskBtMp &lt;&gt; nil) and (FMemBitMap &lt;&gt; nil) then&lt;br /&gt;begin&lt;br /&gt;  FMemMskBtMp.FreeImage;  //释放所占用的位图资源免得重新加载错误&lt;br /&gt;  FMemBitMap.FreeImage;&lt;br /&gt;end;&lt;br /&gt;FillBitmap;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TShutter.CoordinateTimer;&lt;br /&gt;begin&lt;br /&gt;DoTimer;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;br /&gt;基本上运行效果还是可以的&lt;br /&gt;但是从代码中可以看到很多的boolean值的参数&lt;br /&gt;它们是用来判断功能从而有选择的调用BitBlt函数&lt;br /&gt;设计还是不够好，其实可以用case语句来区分不同功能&lt;br /&gt;我用了太多的boolean来判断导致扩展起来很不方便，容易出BUG&lt;br /&gt;先放这里，慢慢再改&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-7367004116136798898?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/7367004116136798898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=7367004116136798898' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/7367004116136798898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/7367004116136798898'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/04/delphi.html' title='Delphi做的百叶窗小程序'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-6547033542229088943</id><published>2009-04-05T22:28:00.000+08:00</published><updated>2009-04-06T22:38:51.222+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><title type='text'>仿Windows的画图程序</title><content type='html'>仅贴出关键的代码部分&lt;br /&gt;&lt;br /&gt;unit MainFrm;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt; SysUtils, Windows, Messages, Classes, Graphics, Controls,&lt;br /&gt; Forms, Dialogs, Buttons, ExtCtrls, ColorGrd, StdCtrls, Menus, ComCtrls;&lt;br /&gt;&lt;br /&gt;const&lt;br /&gt; crMove = 1;&lt;br /&gt; rate1 = 0.38;&lt;br /&gt; rate2 = 0.19;&lt;br /&gt;type&lt;br /&gt;&lt;br /&gt; TDrawType = (dtLineDraw, dtRectangle, dtEllipse, dtRoundRect,&lt;br /&gt;              dtClipRect, dtCrooked, dtPolyLine, dtPolygon,&lt;br /&gt;              dtTriangle, dtFan);&lt;br /&gt; {用于画三角形的record}&lt;br /&gt; TTriangle = record&lt;br /&gt;   FStrtDot: TPoint;&lt;br /&gt;   FEndDot : TPoint;&lt;br /&gt;   FFrstDot: TPoint;&lt;br /&gt;   FScndDot: TPoint;&lt;br /&gt;   FThrdDot: TPoint;&lt;br /&gt;   FScndVal: Boolean;&lt;br /&gt; end;&lt;br /&gt; {用于画扇形的record}&lt;br /&gt; TFan = record&lt;br /&gt;   FStrtDot: TPoint;&lt;br /&gt;   FOrgDot : TPoint;&lt;br /&gt;   FLstDot : TPoint;&lt;br /&gt;   FNFrst   : Boolean;&lt;br /&gt; end;&lt;br /&gt; {用于画五角星的record，记录五个端点}&lt;br /&gt; TStar = record&lt;br /&gt;   FTL: TPoint;&lt;br /&gt;   FBR: TPoint;&lt;br /&gt;   FFrstDot: TPoint;&lt;br /&gt;   FScndDot: TPoint;&lt;br /&gt;   FThrdDot: TPoint;&lt;br /&gt;   FFrthDot: TPoint;&lt;br /&gt;   FFfthDot: TPoint;&lt;br /&gt; end;&lt;br /&gt;&lt;br /&gt; TMainForm = class(TForm)&lt;br /&gt;   sbxMain: TScrollBox;&lt;br /&gt;   imgDrawingPad: TImage;&lt;br /&gt;   pnlToolBar: TPanel;&lt;br /&gt;   sbLine: TSpeedButton;&lt;br /&gt;   sbRectangle: TSpeedButton;&lt;br /&gt;   sbEllipse: TSpeedButton;&lt;br /&gt;   sbRoundRect: TSpeedButton;&lt;br /&gt;   pnlColors: TPanel;&lt;br /&gt;   cgDrawingColors: TColorGrid;&lt;br /&gt;   pnlFgBgBorder: TPanel;&lt;br /&gt;   pnlFgBgInner: TPanel;&lt;br /&gt;   Bevel1: TBevel;&lt;br /&gt;   mmMain: TMainMenu;&lt;br /&gt;   mmiFile: TMenuItem;&lt;br /&gt;   mmiExit: TMenuItem;&lt;br /&gt;   N2: TMenuItem;&lt;br /&gt;   mmiSaveAs: TMenuItem;&lt;br /&gt;   mmiSaveFile: TMenuItem;&lt;br /&gt;   mmiOpenFile: TMenuItem;&lt;br /&gt;   mmiNewFile: TMenuItem;&lt;br /&gt;   mmiEdit: TMenuItem;&lt;br /&gt;   mmiPaste: TMenuItem;&lt;br /&gt;   mmiCopy: TMenuItem;&lt;br /&gt;   mmiCut: TMenuItem;&lt;br /&gt;   sbRectSelect: TSpeedButton;&lt;br /&gt;   SaveDialog: TSaveDialog;&lt;br /&gt;   OpenDialog: TOpenDialog;&lt;br /&gt;   stbMain: TStatusBar;&lt;br /&gt;   pbPasteBox: TPaintBox;&lt;br /&gt;   sbFreeForm: TSpeedButton;&lt;br /&gt;   RgGrpFillOptions: TRadioGroup;&lt;br /&gt;   cbxBorder: TCheckBox;&lt;br /&gt;   sbPolyline: TSpeedButton;&lt;br /&gt;   sbPolygon: TSpeedButton;&lt;br /&gt;   sbTriangle: TSpeedButton;&lt;br /&gt;   sbFan: TSpeedButton;&lt;br /&gt;   dlgColor: TColorDialog;&lt;br /&gt;   btnBorder: TButton;&lt;br /&gt;   btnFill: TButton;&lt;br /&gt;   procedure FormCreate(Sender: TObject);&lt;br /&gt;   procedure sbLineClick(Sender: TObject);&lt;br /&gt;   procedure imgDrawingPadMouseDown(Sender: TObject; Button: TMouseButton;&lt;br /&gt;     Shift: TShiftState; X, Y: Integer);&lt;br /&gt;   procedure imgDrawingPadMouseMove(Sender: TObject; Shift: TShiftState; X,&lt;br /&gt;     Y: Integer);&lt;br /&gt;   procedure imgDrawingPadMouseUp(Sender: TObject; Button: TMouseButton;&lt;br /&gt;     Shift: TShiftState; X, Y: Integer);&lt;br /&gt;   procedure cgDrawingColorsChange(Sender: TObject);&lt;br /&gt;   procedure mmiExitClick(Sender: TObject);&lt;br /&gt;   procedure mmiSaveFileClick(Sender: TObject);&lt;br /&gt;   procedure mmiSaveAsClick(Sender: TObject);&lt;br /&gt;   procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);&lt;br /&gt;   procedure mmiNewFileClick(Sender: TObject);&lt;br /&gt;   procedure mmiOpenFileClick(Sender: TObject);&lt;br /&gt;   procedure mmiEditClick(Sender: TObject);&lt;br /&gt;   procedure mmiCutClick(Sender: TObject);&lt;br /&gt;   procedure mmiCopyClick(Sender: TObject);&lt;br /&gt;   procedure mmiPasteClick(Sender: TObject);&lt;br /&gt;   procedure pbPasteBoxMouseDown(Sender: TObject; Button: TMouseButton;&lt;br /&gt;     Shift: TShiftState; X, Y: Integer);&lt;br /&gt;   procedure pbPasteBoxMouseMove(Sender: TObject; Shift: TShiftState; X,&lt;br /&gt;     Y: Integer);&lt;br /&gt;   procedure pbPasteBoxMouseUp(Sender: TObject; Button: TMouseButton;&lt;br /&gt;     Shift: TShiftState; X, Y: Integer);&lt;br /&gt;   procedure pbPasteBoxPaint(Sender: TObject);&lt;br /&gt;   procedure FormDestroy(Sender: TObject);&lt;br /&gt;   procedure RgGrpFillOptionsClick(Sender: TObject);&lt;br /&gt;   procedure btnBorderClick(Sender: TObject);&lt;br /&gt;   procedure btnFillClick(Sender: TObject);&lt;br /&gt; public&lt;br /&gt;   { Public declarations }&lt;br /&gt;   MouseOrg: TPoint;    // Stores mouse information&lt;br /&gt;   NextPoint: TPoint;   // Stores mouse information&lt;br /&gt;   Drawing: Boolean;    // Drawing is being performed flag&lt;br /&gt;   DrawType: TDrawType; // Holds the draw type information: TDrawType&lt;br /&gt;   FillSelected,        // Fill shapes flag&lt;br /&gt;   BorderSelected: Boolean;  // Draw Shapes with no border flag&lt;br /&gt;   EraseClipRect: Boolean;     // Specifies whether or not to erase the&lt;br /&gt;                               // clipping rectangle&lt;br /&gt;   Modified: Boolean;     // Image modified flag&lt;br /&gt;   FileName: String;      // Holds the filename of the image&lt;br /&gt;   OldClipViewHwnd: Hwnd; // Holds the old clipboard view window&lt;br /&gt;   { Paste Image variables }&lt;br /&gt;   PBoxMoving: Boolean;   // PasteBox is moving flag&lt;br /&gt;   PBoxMouseOrg: TPoint;  // Stores mouse coordinates for moving PasteBox&lt;br /&gt;   PasteBitMap: TBitmap;  // Stores a bitmap image of the pasted data&lt;br /&gt;   Pasted: Boolean;       // Data pasted flag&lt;br /&gt;   LastDot: TPoint;       // Hold the TPoint coordinate for performing&lt;br /&gt;                          // free line drawing&lt;br /&gt;   procedure DrawToImage(TL, BR: TPoint; PenMode: TPenMode);&lt;br /&gt;   { This procedure paints the image specified by the DrawType field&lt;br /&gt;     to imgDrawingPad }&lt;br /&gt;   procedure SetDrawingStyle;&lt;br /&gt;   { This procedure sets various Pen/Brush styles based on values&lt;br /&gt;     specified by the form's controls. The Panels and color grid is&lt;br /&gt;     used to set these values }&lt;br /&gt;   procedure CopyPasteBoxToImage;&lt;br /&gt;   { This procedure copies the data pasted from the Windows clipboard&lt;br /&gt;     onto the main image component imgDrawingPad }&lt;br /&gt;   procedure WMDrawClipBoard(var Msg: TWMDrawClipBoard);&lt;br /&gt;      message WM_DRAWCLIPBOARD;&lt;br /&gt;   { This message handler captures the WM_DRAWCLIPBOARD messages&lt;br /&gt;     which is sent to all windows that have been added to the clipboard&lt;br /&gt;     viewer chain. An application can add itself to the clipboard viewer&lt;br /&gt;     chain by using the SetClipBoardViewer() Win32 API function as&lt;br /&gt;     is done in FormCreate() }&lt;br /&gt;   procedure CopyCut(Cut: Boolean);&lt;br /&gt;   { This method copies a portion of the main image, imgDrawingPad, to the&lt;br /&gt;     Window's clipboard. }&lt;br /&gt; end;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt; MainForm: TMainForm;&lt;br /&gt;&lt;br /&gt;{用于画PolyLine的专用全局变量，Polyline随鼠标滑动而动态绘制&lt;br /&gt; PLStart: TPoint，用于保存Polyline的起点，随着每次鼠标UP而动态更新&lt;br /&gt; PLLast: TPoint，用于保存鼠标每滑动一次的终止点&lt;br /&gt; PLDrawed: Boolean，用于鼠标滑动时检查是否已画了折线&lt;br /&gt;                    true 则XOR掉起点到Move当前点上一点所绘制的折线并重画&lt;br /&gt;                    false则直接重画&lt;br /&gt; }&lt;br /&gt; PLStart, PLLast: TPoint;&lt;br /&gt; PLDrawed: Boolean;&lt;br /&gt;&lt;br /&gt; {用于画Triangle的量，为TTriangle类型}&lt;br /&gt; Trngl: TTriangle;&lt;br /&gt; {用于画Fan的量，为TFan类型}&lt;br /&gt; Fn: TFan;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;uses ClipBrd, Math;&lt;br /&gt;&lt;br /&gt;{$R *.DFM}&lt;br /&gt;&lt;br /&gt;procedure TMainForm.FormCreate(Sender: TObject);&lt;br /&gt;{ This method sets the form's field to their default values. It then&lt;br /&gt; creates a bitmap for the imgDrawingPad.  This is the image on which&lt;br /&gt; drawing is done. Finally, it adds this application as part of the&lt;br /&gt; Windows clipboard viewer chain by using the SetClipBoardViewer()&lt;br /&gt; function. This makes enables the form to get WM_DRAWCLIPBOARD messages&lt;br /&gt; which are sent to all windows in the clipboard viewer chain whenever&lt;br /&gt; the clipboard data is modified. }&lt;br /&gt;begin&lt;br /&gt; Screen.Cursors[crMove] := LoadCursor(hInstance, 'MOVE');&lt;br /&gt;&lt;br /&gt; FillSelected   := False;&lt;br /&gt; BorderSelected := True;&lt;br /&gt;&lt;br /&gt; Modified := False;&lt;br /&gt; FileName := '';&lt;br /&gt; Pasted := False;&lt;br /&gt; pbPasteBox.Enabled := False;&lt;br /&gt;&lt;br /&gt; // Create a bitmap for imgDrawingPad and set its boundaries&lt;br /&gt; with imgDrawingPad do&lt;br /&gt; begin&lt;br /&gt;   SetBounds(0, 0, 600, 400);&lt;br /&gt;   Picture.Graphic := TBitMap.Create;&lt;br /&gt;   Picture.Graphic.Width := 600;&lt;br /&gt;   Picture.Graphic.Height := 400;&lt;br /&gt; end;&lt;br /&gt; // Now create a bitmap image to hold pasted data&lt;br /&gt; PasteBitmap := TBitmap.Create;&lt;br /&gt; pbPasteBox.BringToFront;&lt;br /&gt; { Add the form to the Windows clipboard viewer chain. Save the handle&lt;br /&gt;   of the next window in the chain so that it may be restored by the&lt;br /&gt;   ChangeClipboardChange() Win32 API function in this form's&lt;br /&gt;   FormDestroy() method. }&lt;br /&gt; OldClipViewHwnd := SetClipBoardViewer(Handle);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.WMDrawClipBoard(var Msg: TWMDrawClipBoard);&lt;br /&gt;begin&lt;br /&gt; { This method will be called whenever the clipboard data&lt;br /&gt;   has changed. Because the main form was added to the clipboard&lt;br /&gt;   viewer chain, it will receive the WM_DRAWCLIPBOARD message&lt;br /&gt;   indicating that the clipboard's data was changed. }&lt;br /&gt; inherited;&lt;br /&gt; { Make sure that the data contained on the clipboard is actually&lt;br /&gt;   bitmap data. }&lt;br /&gt; if ClipBoard.HasFormat(CF_BITMAP) then&lt;br /&gt;   mmiPaste.Enabled := True&lt;br /&gt; else&lt;br /&gt;   mmiPaste.Enabled := False;&lt;br /&gt; Msg.Result := 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.DrawToImage(TL, BR: TPoint; PenMode: TPenMode);&lt;br /&gt;{ This method performs the specified drawing operation. The&lt;br /&gt; drawing operation is specified by the DrawType field }&lt;br /&gt;var&lt;br /&gt; //用于画五角星的点&lt;br /&gt; x1,y1,x2,x3: Integer;&lt;br /&gt;begin&lt;br /&gt; with imgDrawingPad.Canvas do&lt;br /&gt; begin&lt;br /&gt;   Pen.Mode := PenMode;&lt;br /&gt;&lt;br /&gt;   case DrawType of&lt;br /&gt;     dtLineDraw, dtPolyLine, dtTriangle, dtFan:&lt;br /&gt;       begin&lt;br /&gt;         MoveTo(TL.X, TL.Y);&lt;br /&gt;         LineTo(BR.X, BR.Y);&lt;br /&gt;       end;&lt;br /&gt;     dtPolygon:&lt;br /&gt;       begin&lt;br /&gt;         //x1这一点前边别忘记加上TL.X，否则画出奇怪的图形啊！！！&lt;br /&gt;         x1 := TL.X + (BR.X - TL.X) div 2;&lt;br /&gt;         y1 := trunc(TL.Y+(BR.Y-TL.Y)*rate1);&lt;br /&gt;         x2 := trunc(TL.X+(BR.X-TL.X)*rate2);&lt;br /&gt;         x3 := trunc(BR.X-(BR.X-TL.X)*rate2);&lt;br /&gt;         MoveTo(x1, TL.Y);&lt;br /&gt;         LineTo(x2, BR.y);&lt;br /&gt;         LineTo(BR.X, y1);&lt;br /&gt;         LineTo(TL.X, y1);&lt;br /&gt;         LineTo(x3, BR.Y);&lt;br /&gt;         LineTo(x1, TL.Y);&lt;br /&gt;         x1 := 0;&lt;br /&gt;         y1 := 0;&lt;br /&gt;         x2 := 0;&lt;br /&gt;         x3 := 0;&lt;br /&gt;       end;&lt;br /&gt;     dtRectangle:&lt;br /&gt;       Rectangle(TL.X, TL.Y, BR.X, BR.Y);&lt;br /&gt;     dtEllipse:&lt;br /&gt;       Ellipse(TL.X, TL.Y, BR.X, BR.Y);&lt;br /&gt;     dtRoundRect:&lt;br /&gt;       RoundRect(TL.X, TL.Y, BR.X, BR.Y,&lt;br /&gt;         (TL.X - BR.X) div 2, (TL.Y - BR.Y) div 2);&lt;br /&gt;     dtClipRect:&lt;br /&gt;       Rectangle(TL.X, TL.Y, BR.X, BR.Y);&lt;br /&gt;&lt;br /&gt;   end;&lt;br /&gt; end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.CopyPasteBoxToImage;&lt;br /&gt;{ This method copies the image pasted from the Windows clipboard onto&lt;br /&gt; imgDrawingPad. It first erases any bounding rectangle drawn by PaintBox&lt;br /&gt; component, pbPasteBox. It then copies the data from pbPasteBox onto&lt;br /&gt; imgDrawingPad at the location where pbPasteBox has been dragged&lt;br /&gt; over imgDrawingPad. The reason we don't copy the contents of&lt;br /&gt; pbPasteBox's canvas and use PasteBitmap's canvas instead, is because&lt;br /&gt; when a portion of pbPasteBox is dragged out of the viewable area,&lt;br /&gt; Windows does not paint the portion pbPasteBox not visible. Therefore,&lt;br /&gt; it is necessary to the pasted bitmap from the off-screen bitmap }&lt;br /&gt;var&lt;br /&gt; SrcRect, DestRect: TRect;&lt;br /&gt;begin&lt;br /&gt; // First, erase the rectangle drawn by pbPasteBox&lt;br /&gt; with pbPasteBox do&lt;br /&gt; begin&lt;br /&gt;   Canvas.Pen.Mode := pmNotXOR;&lt;br /&gt;   Canvas.Pen.Style := psDot;&lt;br /&gt;   Canvas.Brush.Style := bsClear;&lt;br /&gt;   Canvas.Rectangle(0, 0, Width, Height);&lt;br /&gt;   DestRect := Rect(Left, Top, Left+Width, Top+Height);&lt;br /&gt;   SrcRect := Rect(0, 0, Width, Height);&lt;br /&gt; end;&lt;br /&gt; { Here we must use the PasteBitmap instead of the pbPasteBox because&lt;br /&gt;   pbPasteBox will clip anything outside if the viewable area. }&lt;br /&gt; imgDrawingPad.Canvas.CopyRect(DestRect, PasteBitmap.Canvas, SrcRect);&lt;br /&gt; pbPasteBox.Visible := false;&lt;br /&gt; pbPasteBox.Enabled := false;&lt;br /&gt; Pasted := False;  // Pasting operation is complete&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.imgDrawingPadMouseDown(Sender: TObject; Button: TMouseButton;&lt;br /&gt; Shift: TShiftState; X, Y: Integer);&lt;br /&gt;begin&lt;br /&gt; Modified := True;&lt;br /&gt; // Erase the clipping rectangle if one has been drawn&lt;br /&gt; if (DrawType = dtClipRect) and EraseClipRect then&lt;br /&gt;   DrawToImage(MouseOrg, NextPoint, pmNotXOR)&lt;br /&gt; else if (DrawType = dtClipRect) then&lt;br /&gt;   EraseClipRect := True; // Re-enable cliprect erasing&lt;br /&gt; if Pasted then&lt;br /&gt;   CopyPasteBoxToImage;&lt;br /&gt;&lt;br /&gt; Drawing := True;&lt;br /&gt; // Save the mouse information&lt;br /&gt; if (DrawType = dtPolyline) and (not PLDrawed) then&lt;br /&gt; begin&lt;br /&gt;   PLStart := Point(X,Y);&lt;br /&gt;   PLLast := PLStart;&lt;br /&gt; end ;&lt;br /&gt; if (DrawType = dtTriangle) and (not Trngl.FScndVal) then&lt;br /&gt; begin&lt;br /&gt;   Trngl.FFrstDot := Point(X,Y);&lt;br /&gt;   Trngl.FStrtDot := Point(X,Y);&lt;br /&gt;   Trngl.FEndDot  := Trngl.FStrtDot;&lt;br /&gt; end;&lt;br /&gt; if (DrawType = dtFan) and (not Fn.FNFrst) then&lt;br /&gt; begin&lt;br /&gt;   Fn.FStrtDot := Point(X,Y);&lt;br /&gt;   Fn.FOrgDot  := Point(X,Y);&lt;br /&gt;   Fn.FLstDot  := Point(X,Y);&lt;br /&gt; end;&lt;br /&gt; MouseOrg := Point(X, Y);&lt;br /&gt; NextPoint := MouseOrg;&lt;br /&gt; LastDot := NextPoint;   // Lastdot is updated as the mouse moves&lt;br /&gt; //将线的起点移动到鼠标按下的点&lt;br /&gt; imgDrawingPad.Canvas.MoveTo(X, Y);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.imgDrawingPadMouseMove(Sender: TObject; Shift: TShiftState;&lt;br /&gt; X, Y: Integer);&lt;br /&gt;{ This method determines the drawing operation to be performed and&lt;br /&gt; either performs free form line drawing, or calls the&lt;br /&gt; DrawToImage method which draws the specified shape }&lt;br /&gt;begin&lt;br /&gt; if Drawing then&lt;br /&gt; begin&lt;br /&gt;   case DrawType of&lt;br /&gt;     dtCrooked:&lt;br /&gt;       begin&lt;br /&gt;         imgDrawingPad.Canvas.MoveTo(LastDot.X, LastDot.Y);&lt;br /&gt;         imgDrawingPad.Canvas.LineTo(X, Y);&lt;br /&gt;         LastDot := Point(X,Y);&lt;br /&gt;       end;&lt;br /&gt;     dtPolyLine:&lt;br /&gt;       begin&lt;br /&gt;         DrawToImage(PLStart, PLLast, pmNotXor);&lt;br /&gt;         PLLast := Point(X,Y);&lt;br /&gt;         DrawToImage(PLStart, PLLast, pmNotXor);&lt;br /&gt;         PLDrawed := True;&lt;br /&gt;       end;&lt;br /&gt;     dtTriangle:&lt;br /&gt;       begin&lt;br /&gt;         DrawToImage(Trngl.FStrtDot, Trngl.FEndDot, pmNotXor);&lt;br /&gt;         Trngl.FEndDot := Point(X,Y);&lt;br /&gt;         DrawToImage(Trngl.FStrtDot, Trngl.FEndDot, pmNotXor);&lt;br /&gt;       end;&lt;br /&gt;     dtFan:&lt;br /&gt;       if not Fn.FNFrst then&lt;br /&gt;       begin&lt;br /&gt;         DrawToImage(Fn.FStrtDot, Fn.FOrgDot, pmNotXor);&lt;br /&gt;         Fn.FOrgDot := Point(X, Y);&lt;br /&gt;         DrawToImage(Fn.FStrtDot, Fn.FOrgDot, pmNotXor);&lt;br /&gt;       end&lt;br /&gt;       else begin&lt;br /&gt;       ///:~@@@@@@@使用了pmCopy后扇形的前一条边就不会消失，为什么？？&lt;br /&gt;        DrawToImage(Fn.FStrtDot, Fn.FOrgDot, pmCopy);&lt;br /&gt;        DrawToImage(Fn.FOrgDot, Fn.FLstDot, pmNotXor);&lt;br /&gt;        DrawToImage(Fn.FStrtDot, Fn.FLstDot, pmNotXor);&lt;br /&gt;        Fn.FLstDot := Point(X,Y);&lt;br /&gt;        DrawToImage(Fn.FOrgDot, Fn.FLstDot, pmNotXor);&lt;br /&gt;        DrawToImage(Fn.FStrtDot, Fn.FLstDot, pmNotXor);&lt;br /&gt;       end&lt;br /&gt;     else begin&lt;br /&gt;         DrawToImage(MouseOrg, NextPoint, pmNotXor);&lt;br /&gt;         NextPoint := Point(X, Y);&lt;br /&gt;         DrawToImage(MouseOrg, NextPoint, pmNotXor)&lt;br /&gt;     end;&lt;br /&gt;   end;&lt;br /&gt; end;&lt;br /&gt; // Update the status bar with the current mouse location&lt;br /&gt; stbMain.Panels[1].Text := Format('X: %d, Y: %D', [X, Y]);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.imgDrawingPadMouseUp(Sender: TObject; Button: TMouseButton;&lt;br /&gt; Shift: TShiftState; X, Y: Integer);&lt;br /&gt;begin&lt;br /&gt; if Drawing then&lt;br /&gt; { Prevent the clipping rectangle from destroying the images already&lt;br /&gt;   on the image }&lt;br /&gt;   case DrawType of&lt;br /&gt;     dtPolyLine:&lt;br /&gt;       begin&lt;br /&gt;         DrawToImage(PLStart, Point(X,Y), pmCopy);&lt;br /&gt;         PLStart := Point(X,Y);&lt;br /&gt;       end;&lt;br /&gt;     dtTriangle:&lt;br /&gt;       begin&lt;br /&gt;         if not Trngl.FScndVal then&lt;br /&gt;           begin&lt;br /&gt;             Trngl.FScndDot := Point(X,Y);&lt;br /&gt;             DrawToImage(Trngl.FStrtDot, Trngl.FEndDot, pmCopy);&lt;br /&gt;             Trngl.FStrtDot := Trngl.FScndDot;&lt;br /&gt;             Trngl.FScndVal := True;&lt;br /&gt;           end&lt;br /&gt;         else begin&lt;br /&gt;           Trngl.FThrdDot := Point(X,Y);&lt;br /&gt;           DrawToImage(Trngl.FStrtDot, Trngl.FEndDot, pmCopy);&lt;br /&gt;           DrawToImage(Trngl.FThrdDot, Trngl.FFrstDot, pmNotXor);&lt;br /&gt;           Trngl.FScndVal := False;&lt;br /&gt;         end;&lt;br /&gt;       end;&lt;br /&gt;     dtFan:&lt;br /&gt;       if not Fn.FNFrst then&lt;br /&gt;       begin&lt;br /&gt;         DrawToImage(Fn.FStrtDot, Fn.FLstDot, pmCopy);&lt;br /&gt;         Fn.FNFrst := True;&lt;br /&gt;       end&lt;br /&gt;       else begin&lt;br /&gt;         DrawToImage(Fn.FStrtDot, Fn.FOrgDot, pmCopy);&lt;br /&gt;         DrawToImage(Fn.FStrtDot, Fn.FLstDot, pmCopy);&lt;br /&gt;         DrawToImage(Fn.FOrgDot, Fn.FLstDot, pmCopy);&lt;br /&gt;         Fn.FOrgDot := Point(X,Y);&lt;br /&gt;       end;&lt;br /&gt;     dtLineDraw, dtRectangle, dtEllipse, dtRoundRect, dtCrooked:&lt;br /&gt;       DrawToImage(MouseOrg, Point(X, Y), pmCopy);&lt;br /&gt;   end;&lt;br /&gt; Drawing := False;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.sbLineClick(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt; // First erase the cliprect if current drawing type&lt;br /&gt; if DrawType = dtClipRect then&lt;br /&gt;    DrawToImage(MouseOrg, NextPoint, pmNotXOR);&lt;br /&gt;&lt;br /&gt; { Now set the DrawType field to that specified by the TSpeedButton&lt;br /&gt;   invoking this method. The TSpeedButton's Tag values match a&lt;br /&gt;   specific TDrawType value which is why the typecasting below&lt;br /&gt;   successfully assigns a valid TDrawType value to the DrawType field. }&lt;br /&gt; if Sender is TSpeedButton then&lt;br /&gt;   DrawType := TDrawType(TSpeedButton(Sender).Tag);&lt;br /&gt;&lt;br /&gt; // Now make sure the dtClipRect style doesn't erase previous drawings&lt;br /&gt; if DrawType = dtClipRect then begin&lt;br /&gt;   EraseClipRect := False;&lt;br /&gt; end;&lt;br /&gt; // Set the drawing style&lt;br /&gt; SetDrawingStyle;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.cgDrawingColorsChange(Sender: TObject);&lt;br /&gt;{ This method draws the rectangle representing fill and border colors&lt;br /&gt; to indicate the users selection of both colors. pnlFgBgInner and&lt;br /&gt; pnlFgBgBorder are TPanels arranged one on to of the other for the&lt;br /&gt; desired effect }&lt;br /&gt;begin&lt;br /&gt; pnlFgBgBorder.Color := cgDrawingColors.ForeGroundColor;&lt;br /&gt; pnlFgBgInner.Color := cgDrawingColors.BackGroundColor;&lt;br /&gt; SetDrawingStyle;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.SetDrawingStyle;&lt;br /&gt;{  This method sets the various drawing styles based on the selections&lt;br /&gt;  on the pnlFillStyle TPanel for Fill and Border styles }&lt;br /&gt;begin&lt;br /&gt; with imgDrawingPad do&lt;br /&gt; begin&lt;br /&gt;   if DrawType = dtClipRect then&lt;br /&gt;   begin&lt;br /&gt;     Canvas.Pen.Style := psDot;&lt;br /&gt;     Canvas.Brush.Style := bsClear;&lt;br /&gt;     Canvas.Pen.Color := clBlack;&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   else if FillSelected then&lt;br /&gt;     Canvas.Brush.Style := bsSolid&lt;br /&gt;   else&lt;br /&gt;     Canvas.Brush.Style := bsClear;&lt;br /&gt;&lt;br /&gt;   if BorderSelected then&lt;br /&gt;     Canvas.Pen.Style := psSolid&lt;br /&gt;   else&lt;br /&gt;     Canvas.Pen.Style := psClear;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   if FillSelected and (DrawType &lt;&gt; dtClipRect) then&lt;br /&gt;    Canvas.Brush.Color := pnlFgBgInner.Color;&lt;br /&gt;&lt;br /&gt;   if DrawType &lt;&gt; dtClipRect then&lt;br /&gt;     Canvas.Pen.Color := pnlFgBgBorder.Color;&lt;br /&gt; end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.mmiExitClick(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt; Close; // Terminate application&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.mmiSaveFileClick(Sender: TObject);&lt;br /&gt;{ This method saves the image to the file specified by FileName. If&lt;br /&gt; FileName is blank, however, SaveAs1Click is called to get a filename.}&lt;br /&gt;begin&lt;br /&gt; if FileName = '' then&lt;br /&gt;   mmiSaveAsClick(nil)&lt;br /&gt; else begin&lt;br /&gt;   imgDrawingPad.Picture.SaveToFile(FileName);&lt;br /&gt;   stbMain.Panels[0].Text := FileName;&lt;br /&gt;   Modified := False;&lt;br /&gt; end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.mmiSaveAsClick(Sender: TObject);&lt;br /&gt;{ This method launches SaveDialog to get a file name to which&lt;br /&gt; the image's contents will be saved. }&lt;br /&gt;begin&lt;br /&gt; if SaveDialog.Execute then&lt;br /&gt; begin&lt;br /&gt;   FileName := SaveDialog.FileName;  // Store the filename&lt;br /&gt;   mmiSaveFileClick(nil)&lt;br /&gt; end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);&lt;br /&gt;{ If the user attempts to close the form before saving the image, they&lt;br /&gt; are prompted to do so in this method. }&lt;br /&gt;var&lt;br /&gt; Rslt: Word;&lt;br /&gt;begin&lt;br /&gt; CanClose := False; // Assume fail.&lt;br /&gt; if Modified then begin&lt;br /&gt;   Rslt := MessageDlg('File has changed, save?', mtConfirmation, mbYesNOCancel, 0);&lt;br /&gt;   case Rslt of&lt;br /&gt;     mrYes: mmiSaveFileClick(nil);&lt;br /&gt;     mrNo: ;  // no need to do anything.&lt;br /&gt;     mrCancel: Exit;&lt;br /&gt;   end&lt;br /&gt; end;&lt;br /&gt; CanClose := True;    // Allow use to close application&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.mmiNewFileClick(Sender: TObject);&lt;br /&gt;{ This method erases any drawing on the main image after prompting the&lt;br /&gt; user to save it to a file in which case the mmiSaveFileClick event handler&lt;br /&gt; is called. }&lt;br /&gt;var&lt;br /&gt; Rslt: Word;&lt;br /&gt;begin&lt;br /&gt; if Modified then begin&lt;br /&gt;   Rslt := MessageDlg('File has changed, save?', mtConfirmation, mbYesNOCancel, 0);&lt;br /&gt;   case Rslt of&lt;br /&gt;     mrYes: mmiSaveFileClick(nil);&lt;br /&gt;     mrNo: ;  // no need to do anything.&lt;br /&gt;     mrCancel: Exit;&lt;br /&gt;   end&lt;br /&gt; end;&lt;br /&gt;&lt;br /&gt;  with imgDrawingPad.Canvas do begin&lt;br /&gt;    Brush.Style := bsSolid;&lt;br /&gt;    Brush.Color := clWhite;  // clWhite erases the image&lt;br /&gt;    FillRect(ClipRect);      // Erase the image&lt;br /&gt;    FileName := '';&lt;br /&gt;    stbMain.Panels[0].Text := FileName;&lt;br /&gt;  end;&lt;br /&gt;  SetDrawingStyle;   // Restore the previous drawing style&lt;br /&gt;  Modified := False;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.mmiOpenFileClick(Sender: TObject);&lt;br /&gt;{ This method opens a bitmap file specified by OpenDialog.FileName. If&lt;br /&gt; a file was already created, the user is prompted to save&lt;br /&gt; the file in which case the mmiSaveFileClick event is called. }&lt;br /&gt;var&lt;br /&gt; Rslt: Word;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt; if OpenDialog.Execute then&lt;br /&gt; begin&lt;br /&gt;&lt;br /&gt;   if Modified then begin&lt;br /&gt;     Rslt := MessageDlg('File has changed, save?', mtConfirmation, mbYesNOCancel, 0);&lt;br /&gt;     case Rslt of&lt;br /&gt;       mrYes: mmiSaveFileClick(nil);&lt;br /&gt;       mrNo: ;  // no need to do anything.&lt;br /&gt;       mrCancel: Exit;&lt;br /&gt;     end&lt;br /&gt;   end;&lt;br /&gt;&lt;br /&gt;   imgDrawingPad.Picture.LoadFromFile(OpenDialog.FileName);&lt;br /&gt;   FileName := OpenDialog.FileName;&lt;br /&gt;   stbMain.Panels[0].Text := FileName;&lt;br /&gt;   Modified := false;&lt;br /&gt; end;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.mmiEditClick(Sender: TObject);&lt;br /&gt;{ The timer is used to determine if an area on the main image is&lt;br /&gt; surrounded by a bounding rectangle. If so, then the Copy and Cut&lt;br /&gt; menu items are enabled. Otherwise, they are disabled. }&lt;br /&gt;var&lt;br /&gt; IsRect: Boolean;&lt;br /&gt;begin&lt;br /&gt; IsRect := (MouseOrg.X &lt;&gt; NextPoint.X) and (MouseOrg.Y &lt;&gt; NextPoint.Y);&lt;br /&gt; if (DrawType = dtClipRect) and IsRect then&lt;br /&gt; begin&lt;br /&gt;   mmiCut.Enabled := True;&lt;br /&gt;   mmiCopy.Enabled := True;&lt;br /&gt; end&lt;br /&gt; else begin&lt;br /&gt;   mmiCut.Enabled := False;&lt;br /&gt;   mmiCopy.Enabled := False;&lt;br /&gt; end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.CopyCut(Cut: Boolean);&lt;br /&gt;{ This method copies a portion of the main image to the clipboard.&lt;br /&gt; The portion copied is specified by a bounding rectangle&lt;br /&gt; on the main image. If Cut is true, the area in the bounding rectandle&lt;br /&gt; is erased. }&lt;br /&gt;var&lt;br /&gt;  CopyBitMap: TBitmap;&lt;br /&gt;  DestRect, SrcRect: TRect;&lt;br /&gt;  OldBrushColor: TColor;&lt;br /&gt;begin&lt;br /&gt; CopyBitMap := TBitMap.Create;&lt;br /&gt; try&lt;br /&gt;   { Set CopyBitmap's size based on the coordinates of the&lt;br /&gt;     bounding rectangle }&lt;br /&gt;   CopyBitMap.Width := Abs(NextPoint.X - MouseOrg.X);&lt;br /&gt;   CopyBitMap.Height := Abs(NextPoint.Y - MouseOrg.Y);&lt;br /&gt;   DestRect := Rect(0, 0, CopyBitMap.Width, CopyBitmap.Height);&lt;br /&gt;   SrcRect := Rect(Min(MouseOrg.X, NextPoint.X)+1,&lt;br /&gt;                   Min(MouseOrg.Y, NextPoint.Y)+1,&lt;br /&gt;                   Max(MouseOrg.X, NextPoint.X)-1,&lt;br /&gt;                   Max(MouseOrg.Y, NextPoint.Y)-1);&lt;br /&gt;   { Copy the portion of the main image surrounded by the bounding&lt;br /&gt;     rectangle to the Windows clipboard }&lt;br /&gt;   CopyBitMap.Canvas.CopyRect(DestRect, imgDrawingPad.Canvas, SrcRect);&lt;br /&gt;   { Previous versions of Delphi required the bitmap's Handle property&lt;br /&gt;     to be touched for the bitmap to be made available. This was due to&lt;br /&gt;     Delphi's caching of bitmapped images. The step below may not be&lt;br /&gt;     required. }&lt;br /&gt;   CopyBitMap.Handle;&lt;br /&gt;   // Assign the image to the clipboard.&lt;br /&gt;   ClipBoard.Assign(CopyBitMap);&lt;br /&gt;   { If cut was specified the erase the portion of the main image&lt;br /&gt;     surrounded by the bounding Rectangle }&lt;br /&gt;   if Cut then&lt;br /&gt;     with imgDrawingPad.Canvas do&lt;br /&gt;     begin&lt;br /&gt;       OldBrushColor := Brush.Color;&lt;br /&gt;       Brush.Color := clWhite;&lt;br /&gt;       try&lt;br /&gt;         FillRect(SrcRect);&lt;br /&gt;       finally&lt;br /&gt;         Brush.Color := OldBrushColor;&lt;br /&gt;       end;&lt;br /&gt;     end;&lt;br /&gt; finally&lt;br /&gt;   CopyBitMap.Free;&lt;br /&gt; end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.mmiCutClick(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt; CopyCut(True);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.mmiCopyClick(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt; CopyCut(False);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.mmiPasteClick(Sender: TObject);&lt;br /&gt;{ This method pastes the data contained in the clipboard to the&lt;br /&gt; paste bitmap. The reason it is pasted to the PasteBitmap, an off-&lt;br /&gt; screen bitmap, is so that the user can relocate the pasted image&lt;br /&gt; elsewhere on to the main image. This is done by having the pbPasteBox,&lt;br /&gt; a TPaintBox component, draw the contents of PasteImage. When the&lt;br /&gt; user if done positioning the pbPasteBox, the contents of TPasteBitmap&lt;br /&gt; is drawn to imgDrawingPad at the location specified by pbPasteBox's location.}&lt;br /&gt;begin&lt;br /&gt; { Clear the bounding rectangle }&lt;br /&gt;&lt;br /&gt; pbPasteBox.Enabled := True;&lt;br /&gt; if DrawType = dtClipRect then&lt;br /&gt; begin&lt;br /&gt;   DrawToImage(MouseOrg, NextPoint, pmNotXOR);&lt;br /&gt;   EraseClipRect := False;&lt;br /&gt; end;&lt;br /&gt;&lt;br /&gt; PasteBitmap.Assign(ClipBoard);   // Grab the data from the clipboard&lt;br /&gt; Pasted := True;&lt;br /&gt; // Set position of pasted image to top left&lt;br /&gt; pbPasteBox.Left := 0;&lt;br /&gt; pbPasteBox.Top := 0;&lt;br /&gt; // Set the size of pbPasteBox to match the size of PasteBitmap&lt;br /&gt; pbPasteBox.Width := PasteBitmap.Width;&lt;br /&gt; pbPasteBox.Height := PasteBitmap.Height;&lt;br /&gt;&lt;br /&gt; pbPasteBox.Visible := True;&lt;br /&gt; pbPasteBox.Invalidate;         &lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.pbPasteBoxMouseDown(Sender: TObject;&lt;br /&gt; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);&lt;br /&gt;{ This method set's up pbPasteBox, a TPaintBox for being moved by the&lt;br /&gt; user when the left mouse button is held down }&lt;br /&gt;begin&lt;br /&gt; if Button = mbLeft then&lt;br /&gt; begin&lt;br /&gt;   PBoxMoving := True;&lt;br /&gt;   Screen.Cursor := crMove;&lt;br /&gt;   PBoxMouseOrg := Point(X, Y);&lt;br /&gt; end&lt;br /&gt; else&lt;br /&gt;   PBoxMoving := False;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.pbPasteBoxMouseMove(Sender: TObject; Shift: TShiftState;&lt;br /&gt; X, Y: Integer);&lt;br /&gt;{ This method moves pbPasteBox if the PBoxMoving flag is true indicating&lt;br /&gt; that the user is holding down the left mouse button and is dragging&lt;br /&gt; PaintBox }&lt;br /&gt;begin&lt;br /&gt; if PBoxMoving then&lt;br /&gt; begin&lt;br /&gt;   pbPasteBox.Left := pbPasteBox.Left + (X - PBoxMouseOrg.X);&lt;br /&gt;   pbPasteBox.Top := pbPasteBox.Top + (Y - PBoxMouseOrg.Y);&lt;br /&gt; end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.pbPasteBoxMouseUp(Sender: TObject; Button: TMouseButton;&lt;br /&gt; Shift: TShiftState; X, Y: Integer);&lt;br /&gt;begin&lt;br /&gt;{ This method disables moving of pbPasteBox when the user lifts the left&lt;br /&gt; mouse button }&lt;br /&gt; if PBoxMoving then&lt;br /&gt; begin&lt;br /&gt;    PBoxMoving := False;&lt;br /&gt;    Screen.Cursor := crDefault;&lt;br /&gt; end;&lt;br /&gt; pbPasteBox.Refresh; // Redraw the pbPasteBox.&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.pbPasteBoxPaint(Sender: TObject);&lt;br /&gt;{ The paintbox is drawn whenever the user selects the Paste option&lt;br /&gt; form the menu. pbPasteBox draws the contents of PasteBitmap which&lt;br /&gt; holds the image gotten from the clipboard. The reason for drawing&lt;br /&gt; PasteBitmap's contents in pbPasteBox, a TPaintBox class, is so that&lt;br /&gt; the user can also move the object around on top of the main image.&lt;br /&gt; In other words, pbPasteBox can be moved, and hidden when necessary. }&lt;br /&gt;var&lt;br /&gt; DestRect, SrcRect: TRect;&lt;br /&gt;begin&lt;br /&gt; // Display the paintbox only if a pasting operation occurred.&lt;br /&gt; if Pasted then&lt;br /&gt; begin&lt;br /&gt;   { First paint the contents of PasteBitmap using canvas's CopyRect&lt;br /&gt;     but only if the paintbox is not being moved. This reduces&lt;br /&gt;     flicker }&lt;br /&gt;   if not PBoxMoving then&lt;br /&gt;   begin&lt;br /&gt;     DestRect := Rect(0, 0, pbPasteBox.Width, pbPasteBox.Height);&lt;br /&gt;     SrcRect := Rect(0, 0, PasteBitmap.Width, PasteBitmap.Height);&lt;br /&gt;     pbPasteBox.Canvas.CopyRect(DestRect, PasteBitmap.Canvas, SrcRect);&lt;br /&gt;   end;&lt;br /&gt;   { Now copy a bounding rectangle to indicate that pbPasteBox is&lt;br /&gt;     a moveable object. We use a pen mode of pmNotXOR because we&lt;br /&gt;     must erase this rectangle when the user copies PaintBox's&lt;br /&gt;     contents to the main image and we must preserve the original&lt;br /&gt;     contents. }&lt;br /&gt;   pbPasteBox.Canvas.Pen.Mode := pmNotXOR;&lt;br /&gt;   pbPasteBox.Canvas.Pen.Style := psDot;&lt;br /&gt;   pbPasteBox.Canvas.Brush.Style := bsClear;&lt;br /&gt;   pbPasteBox.Canvas.Rectangle(0, 0, pbPasteBox.Width, pbPasteBox.Height);&lt;br /&gt; end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.FormDestroy(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt; // Remove the form from the clipboard chain&lt;br /&gt; ChangeClipBoardChain(Handle, OldClipViewHwnd);&lt;br /&gt; PasteBitmap.Free; // Free the PasteBitmap instance&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.RgGrpFillOptionsClick(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt; FillSelected   := RgGrpFillOptions.ItemIndex = 0;&lt;br /&gt; BorderSelected := cbxBorder.Checked;&lt;br /&gt; SetDrawingStyle;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.btnBorderClick(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt; dlgColor.Execute;&lt;br /&gt; pnlFgBgBorder.Color := dlgColor.Color;&lt;br /&gt; SetDrawingStyle;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMainForm.btnFillClick(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt; dlgColor.Execute;&lt;br /&gt; pnlFgBgInner.Color  := dlgColor.Color;&lt;br /&gt; SetDrawingStyle;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;关键的几个函数是DrawToImage, 还有&lt;br /&gt;  procedure imgDrawingPadMouseDown(Sender: TObject; Button: TMouseButton;&lt;br /&gt;     Shift: TShiftState; X, Y: Integer);&lt;br /&gt;   procedure imgDrawingPadMouseMove(Sender: TObject; Shift: TShiftState; X,&lt;br /&gt;     Y: Integer);&lt;br /&gt;   procedure imgDrawingPadMouseUp(Sender: TObject; Button: TMouseButton;&lt;br /&gt;     Shift: TShiftState; X, Y: Integer);&lt;br /&gt;这三个函数用来跟踪画图面板上的鼠标消息&lt;br /&gt;在其中加入处理函数可以实现与画图程序一样的绘图效果&lt;br /&gt;注意，procedure TMainForm.DrawToImage(TL, BR: TPoint; PenMode: TPenMode);&lt;br /&gt;最后一个PenMode如果要实现动态绘制（即鼠标移到哪线就画到哪）&lt;br /&gt;就必须用pmNotXor用来动态擦除再动态画上新的&lt;br /&gt;而如果鼠标左键点下（代表确定要画在那），则要使用pmCopy把最终一条线画上去&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-6547033542229088943?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/6547033542229088943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=6547033542229088943' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/6547033542229088943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/6547033542229088943'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/04/windows.html' title='仿Windows的画图程序'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-7980268031312573492</id><published>2009-04-03T21:39:00.000+08:00</published><updated>2009-04-03T21:40:42.857+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><title type='text'>UltraEdit中加入Delphi的语法高亮显示</title><content type='html'>&lt;p&gt;很多人非常喜欢用UltraEdit写代码，其功能强大相信很多人都是有目共睹的&lt;/p&gt; &lt;p&gt;然而ultra edit本身没有提供delphi的关键字语法高亮&lt;/p&gt; &lt;p&gt;（pascal就这样悲剧的被忽略了）&lt;/p&gt; &lt;p&gt;只找到c/c++/java/vb/jsp/mysql/python/ruby等等等等&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;没关系，可以配置的&lt;/p&gt; &lt;p&gt;依次打开 高级--配置--编辑器显示--语法高亮&lt;/p&gt; &lt;p&gt;在‘词语列表完整路径’里默认指向UltraEdit的语法高亮配置文件&lt;/p&gt; &lt;p&gt;比如我的电脑上为&lt;/p&gt; &lt;p&gt;C:\Documents and Settings\wybin\Application Data\IDMComp\UltraEdit\WORDFILE.UEW&lt;/p&gt; &lt;p&gt;&lt;strong&gt;注意，某些版本中可能是txt格式&lt;/strong&gt;&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;点击打开，打开该文件&lt;/p&gt; &lt;p&gt;在末尾加入以下代码。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;注意，开头的/L14数字是可以改的，取决于你的UE上已经配置了多少个语法高亮文件&lt;/strong&gt;&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;{--------------------Beginning of the codes, do not copy this line------------------------------ }&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;/L14"Delphi" Nocase Line Comment = // Block Comment On = { Block Comment On Alt = (* Block Comment Off = } Block Comment Off Alt = *) Escape Char = ?String Chars = ' File Extensions = pas dpr&lt;br /&gt;/Delimiters = #$&amp;amp;'()*+,-./;&lt;&gt;@[]^{}&lt;br /&gt;/Function String = "%^{procedure^}^{function^}"&lt;br /&gt;/Indent Strings = "begin" "repeat" "asm"&lt;br /&gt;/Unindent Strings = "end" "until"&lt;br /&gt;/C1"Reserved words"&lt;br /&gt;array asm&lt;br /&gt;begin&lt;br /&gt;case class const constructor&lt;br /&gt;destructor dispinterface do downto&lt;br /&gt;else end except exports&lt;br /&gt;file finalization finally for function&lt;br /&gt;goto&lt;br /&gt;if implementation inherited initialization inline interface&lt;br /&gt;label library&lt;br /&gt;nil&lt;br /&gt;object of out&lt;br /&gt;packed procedure program property&lt;br /&gt;raise record repeat resourcestring&lt;br /&gt;set string&lt;br /&gt;then threadvar to try type&lt;br /&gt;unit until&lt;br /&gt;uses&lt;br /&gt;var&lt;br /&gt;while with&lt;br /&gt;/C2"Directives"&lt;br /&gt;absolute abstract assembler automated&lt;br /&gt;cdecl contains&lt;br /&gt;default dispid dynamic&lt;br /&gt;export external&lt;br /&gt;far forward&lt;br /&gt;implements index&lt;br /&gt;message&lt;br /&gt;name near nodefault&lt;br /&gt;overload override&lt;br /&gt;package pascal private protected public published&lt;br /&gt;read readonly register reintroduce requires resident&lt;br /&gt;safecall stdcall stored&lt;br /&gt;virtual&lt;br /&gt;write writeonly&lt;br /&gt;/C3"Operators"&lt;br /&gt;*&lt;br /&gt;+&lt;br /&gt;-&lt;br /&gt;// /&lt;br /&gt;&lt; &lt;= &lt;&gt;&lt;br /&gt;=&lt;br /&gt;&gt; &gt;=&lt;br /&gt;@&lt;br /&gt;and as&lt;br /&gt;div&lt;br /&gt;in is&lt;br /&gt;mod&lt;br /&gt;not&lt;br /&gt;or&lt;br /&gt;shl shr&lt;br /&gt;xor&lt;br /&gt;/C4"Special symbols"&lt;br /&gt;#&lt;br /&gt;$&lt;br /&gt;&amp;amp;&lt;br /&gt;(&lt;br /&gt;(.&lt;br /&gt;)&lt;br /&gt;,&lt;br /&gt;.&lt;br /&gt;.)&lt;br /&gt;..&lt;br /&gt;:&lt;br /&gt;:=&lt;br /&gt;;&lt;br /&gt;[&lt;br /&gt;]&lt;br /&gt;^&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;{------------------------End of the codes, do not copy this line------------------------------ }&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;保存，就可以高亮DELPHI的关键字了&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-7980268031312573492?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/7980268031312573492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=7980268031312573492' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/7980268031312573492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/7980268031312573492'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/04/ultraeditdelphi.html' title='UltraEdit中加入Delphi的语法高亮显示'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-8274185519867191537</id><published>2009-04-01T12:45:00.002+08:00</published><updated>2009-04-01T12:50:15.735+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OS'/><title type='text'>右键菜单中加入当前文件目录的CMD快捷通道</title><content type='html'>好久没写东西了&lt;br /&gt;最近一直在忙着公司的培训(Delphi, Oracle, ProC等)。还有一门是我一直想学的JAVA，但是算了，哎，没缘分，只好等把目前的东西学透了再抽空自学了。还好可以找人问&lt;br /&gt;&lt;br /&gt;最近在使用公司提供的软件时发现了一个好东西，贴出来共享下&lt;br /&gt;由于软件有两种模式，一种是菜单管理模式，是完整版的可动态修改菜单的&lt;br /&gt;但是需要在CMD窗口下调用系统EXE文件并修改些参数&lt;br /&gt;老打开CMD然后复制路径接着右键粘贴挺麻烦的&lt;br /&gt;想到以前有的OS右键菜单有DOS快速通道，可以打开CMD.EXE&lt;br /&gt;上网找到了这个，可以直接右键进入当前目录的CMD窗口&lt;br /&gt;说明完毕，贴关键的东西&lt;br /&gt;&lt;br /&gt;在文件夹的右键菜单中添加“命令提示符cmd”快捷通道选项。&lt;br /&gt;运行regedit打开注册表，在注册表 HKEY_CLASSES_ROOT\Directory\shell分支下新建一项命名为“CommandPrompt”，修改右侧窗口中的“默认”键 值为“命令提示符（你想要在右键菜单里看到的文字）”，并在该项下级再建一个新项“Command”，将右侧窗口中“默认”键值设为“cmd.exe /k cd %1”。至此OK，你可以很快速的定位到指定的目录。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-8274185519867191537?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/8274185519867191537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=8274185519867191537' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/8274185519867191537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/8274185519867191537'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/04/cmd.html' title='右键菜单中加入当前文件目录的CMD快捷通道'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-3592403880929499611</id><published>2009-03-14T00:05:00.000+08:00</published><updated>2009-03-14T00:06:17.296+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tuxedo'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>终于搭建起TA系统了！！</title><content type='html'>&lt;p&gt;真的是呕心沥血啊，哎&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;客户端程序是写好的，一堆DDL加个EXE文件&lt;/p&gt;&lt;p&gt;服务器端，数据库是ORC 10g&lt;/p&gt;&lt;p&gt;由于TA系统采用的是三层架构，中间层用的是Tuxedo8.1&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;首先是今天我把系统重装了&lt;/p&gt;&lt;p&gt;因为昨天装VC6编译器时系统卡住了，我很郁闷&lt;/p&gt;&lt;p&gt;别人装的系统已经让我郁闷很久了，从系统到硬盘到域都让我纠结&lt;/p&gt;&lt;p&gt;花了3个小时重装了系统和软件（很高效吧，嘿嘿，不是GHOST哦，装的是原版的）&lt;/p&gt;&lt;p&gt;然后接下来的四个小时就在搭建TA系统&lt;/p&gt;&lt;p&gt;——摸着石头过河啊&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;新装了ORC数据库，果然用起来很顺手，10g的你想装多少次它只会在&lt;/p&gt;&lt;p&gt;*:\oracle\product\10.2.0下多建几个db_*路径而已，这点比9i要好很多&lt;/p&gt;&lt;p&gt;顺利的导入了数据库，然后，艰辛的过程就开始了&lt;img src="http://xnimg.cn/img/emoticons/emot-04.gif" mce_src="http://xnimg.cn/img/emoticons/emot-04.gif" alt="流泪" class="mceItem emotion" border="0" /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;首先建了个TA文件夹，里边有常用的一些目录&lt;/p&gt;&lt;p&gt;如src,temp,log,bin,etc等等&lt;/p&gt;&lt;p&gt;然后把服务器的一堆.pc和.c文件拷到src文件夹下，再加上用于配置VC编译器的makefile文件，接着启动cmd切换到src目录执行&gt;make&lt;/p&gt;&lt;p&gt;热，报错。。。&lt;/p&gt;&lt;p&gt;找到问题所在——makefile配置文件里没有修改好&lt;/p&gt;&lt;p&gt;而且有两处错误，一点一点改，一点一点调&lt;/p&gt;&lt;p&gt;编译成功了！！然后再将ubb文件(tux配置)和编译好的可执行文件（自动放在bin目录）一起放到bin目录里，执行&lt;/p&gt;&lt;p&gt;tmloadcf -y ubb&lt;/p&gt;&lt;p&gt;what??tmloadcf can not run on a non-master mode&lt;/p&gt;&lt;p&gt;晕~~~是不是刚装系统时用的没有加入公司域的管理员账号装的TUX&lt;/p&gt;&lt;p&gt;加入域后我用域内用户名登陆，虽然我已经给它赋了管理员权限让它可以安装文件&lt;/p&gt;&lt;p&gt;但是在TUX这还是卡住了&lt;/p&gt;&lt;p&gt;没办法，重装TUX，重装的时候安装目录和先前不同（埋下了悲剧的伏笔&lt;img src="http://xnimg.cn/img/emoticons/emot-04.gif" mce_src="http://xnimg.cn/img/emoticons/emot-04.gif" alt="流泪" class="mceItem emotion" border="0" /&gt;）&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;重装TUX后再起，这回得退到make这一步了&lt;/p&gt;&lt;p&gt;&gt;make&lt;/p&gt;&lt;p&gt;晕，buildserver不是一个内部或外部命令，也不是一个可执行的文件&amp;amp;*（&amp;amp;*&lt;/p&gt;&lt;p&gt;怎么回事，buildserver是tux\bin目录下的一个exe文件，建立服务器的&lt;/p&gt;&lt;p&gt;怎么会找不到？&lt;/p&gt;&lt;p&gt;看makefile和ubb文件，没有错啊。。。&lt;/p&gt;&lt;p&gt;困扰了很久，猛然想起：两次安装目录不同，环境变量！！！！&lt;/p&gt;&lt;p&gt;我只改了TUXDIR，而真正指向bin目录的是系统path变量下的tuxedo8.1\bin路径&lt;/p&gt;&lt;p&gt;改之再&lt;/p&gt;&lt;p&gt;&gt;make&lt;/p&gt;&lt;p&gt;晕，CMDTUX_CAT you do not have a valid SDK license&lt;/p&gt;&lt;p&gt;靠，我装的时候明明把lic.txt文件导入了啊，它提示成功了&lt;/p&gt;&lt;p&gt;怎么可以。。。怎么可以酱紫。。。&lt;/p&gt;&lt;p&gt;再困扰了很久，又猛然想起，我瓜皮了，TUX识别lic的时候时去翻找TUXDIR变量&lt;/p&gt;&lt;p&gt;问题在这里！！改之，再&lt;/p&gt;&lt;p&gt;&gt;make 哇卡卡卡卡，好顺利啊，酣畅淋漓&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;接下来又到了tmloadcf -y ubb这条命令&lt;/p&gt;&lt;p&gt;这回执行时候不会不承认我是它的master了&lt;/p&gt;&lt;p&gt;可是，又跳出来说TUXCONFIG未配置？？&lt;/p&gt;&lt;p&gt;咦。ubb文件里明明配了的嘛，怎么回事？&lt;/p&gt;&lt;p&gt;随便set TUXCONFIG=$APPDIR\bin&lt;/p&gt;&lt;p&gt;再敲入命令，不对，说TUXCONFIG应该要和ubb中的匹配&lt;/p&gt;&lt;p&gt;明白了，set回来，再敲入命令&lt;/p&gt;&lt;p&gt;哇卡卡卡卡，酣畅淋漓啊&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;接着tmboot，很听话的启动了&lt;/p&gt;&lt;p&gt;再启动客户端，跳出数据库配置窗口&lt;/p&gt;&lt;p&gt;由于前边抓狂了很久，已经不记得要怎么填WSNADDR了，本机似乎不用填&lt;/p&gt;&lt;p&gt;可是服务器名忘记了&lt;/p&gt;&lt;p&gt;OK，够了，今天已经被摧残够了&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;想对兄弟们说，我们这群小年轻&lt;/p&gt;&lt;p&gt;面对生活&lt;br /&gt;&lt;/p&gt;&lt;p&gt;一定要学习小强的精神&lt;/p&gt;&lt;p&gt;那就是&lt;/p&gt;&lt;p&gt;“你TM的就是踩不死我！！”&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;收工，刷卡下班&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-3592403880929499611?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/3592403880929499611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=3592403880929499611' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/3592403880929499611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/3592403880929499611'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/03/ta.html' title='终于搭建起TA系统了！！'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-289365118162804344</id><published>2009-03-09T22:48:00.000+08:00</published><updated>2009-03-09T19:48:59.655+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Technology'/><title type='text'>【转】09年3月编程语言排行榜：VB江河日下，JavaScript稳步上升</title><content type='html'>2009年3月Tiobe编程语言排行榜出炉，前十位的排名基本没有变化，JavaScript前进2名，同比增长1.27%，(Visual) Basic下降1位，同比减少3.32%。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2009年3月榜单&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt="" src="http://info-database.csdn.net/Upload/2009-03-09/tiobe090301.JPG" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;前十名长期趋势&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt="" src="http://info-database.csdn.net/Upload/2009-03-09/tiobe090302.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;以下是排名21到50的语言&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt="" src="http://info-database.csdn.net/Upload/2009-03-09/tiobe090303.JPG" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-289365118162804344?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/289365118162804344/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=289365118162804344' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/289365118162804344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/289365118162804344'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/03/093vbjavascript.html' title='【转】09年3月编程语言排行榜：VB江河日下，JavaScript稳步上升'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-2994697550479054175</id><published>2009-03-09T19:45:00.001+08:00</published><updated>2009-03-09T19:45:44.539+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>【CSDN新闻】专家称微软网络品牌混乱陷入web 2.0困局</title><content type='html'>&lt;p&gt;&lt;span style="font-family:Arial;"&gt;导读：业界分析人士伊安·加里森(Ian Garrison)今天载文称，微软正在公司内部测试Kumo搜索引擎，但仅靠杰出的技术，微软无法挑战谷歌。微软还需要整合旗下不同的服务品牌，让普通用户理解其服务产品。以下为其全文：&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;微软新的“谷歌杀手”——Kumo搜索引擎似乎非常棒，但仅靠杰出的技术，微软无法成为互联网搜索市场上的领头羊。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;消息称，微软正在公司内部对Kumo进行测试。Kumo不仅能够理解搜索关键词，还能够理解复杂的句子，返回的搜索结果的相关度也高得多。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;如果其表现能够与微软的宣传相符，Kumo将标志着搜索技术的一大进步。因为当前的搜索技术还很“基本”， 尽管能够在不足1秒钟的时间内返回数以千计的搜索结果，但有多少搜索结果是用户真正感兴趣的？如果能够提供相关度更高的搜索结果，微软就可能成为搜索市场 上的赢家，但这还取决于另外一个因素——有效整合其品牌。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;目前，微软的“Live”服务可谓是一团乱麻。谷歌提供了简洁的服务，而微软则陷入了web 2.0困局。没有多少人真正理解Windows Live、Office Online、Office Live是什么。尽管每种服务可能都很棒，但普通用户却很难搞清楚它们各自的用途。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;部分业界观察人士认为，微软在计划将各种服务整合到Kumo品牌下。考虑到微软目前服务产品的混乱局面，这可谓是一项英明的决策。如果微软希望挑战谷歌，就需要重新考虑其销售互联网服务的方式。(志翔)&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-2994697550479054175?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/2994697550479054175/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=2994697550479054175' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/2994697550479054175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/2994697550479054175'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/03/csdnweb-20.html' title='【CSDN新闻】专家称微软网络品牌混乱陷入web 2.0困局'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-8697384660705548171</id><published>2009-03-09T19:19:00.000+08:00</published><updated>2009-03-09T19:20:21.668+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>【转】Oracle重新配置EM简化版教程</title><content type='html'>Oracle 10G重建EM DB Control.&lt;br /&gt;　　1.drop configuration files and repository run :&lt;br /&gt;　　emca -deconfig dbcontrol db -repos drop&lt;br /&gt;　　2. Logon SQLPLUS as user SYS or SYSTEM, and drop the sysman account and mangement objects:&lt;br /&gt;　　a. drop user sysman cascade;&lt;br /&gt;　　b. drop role MGMT_USER;&lt;br /&gt;　　c. drop user MGMT_VIEW cascade;&lt;br /&gt;　　d. drop public synonym MGMT_TARGET_BLACKOUTS;&lt;br /&gt;　　e. drop public synonym SETEMVIEWUSERCONTEXT;&lt;br /&gt;　　3.Create configuration files and repository run&lt;br /&gt;　　emca -config dbcontrol db -repos create&lt;br /&gt;　　创建EM时,提示的&lt;zmkey style="border-bottom: 2px dotted rgb(255, 108, 0); font-weight: bold; margin-right: 3px; cursor: pointer; float: none;" class="zoomino-searchword"&gt;端口号&lt;img src="http://www.zoomino.cn/static-ox/images/z-keyword.gif" style="border: medium none ; margin: 0pt; background: transparent none repeat scroll 0% 0%; float: none; height: 14px; width: 12px; display: inline; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" class="zoominoBgImage" /&gt;&lt;/zmkey&gt;,应为实例的断口号,比如1521,不是EM的端口号(比如1158)&lt;br /&gt;　　EM的端口号在这个文件中可以查到10.2.0\db_1\sysman\config\emca.properties&lt;br /&gt;　　然后,进行em后,&lt;zmkey style="border-bottom: 2px dotted rgb(255, 108, 0); font-weight: bold; margin-right: 3px; cursor: pointer; float: none;" class="zoomino-searchword"&gt;界面&lt;img src="http://www.zoomino.cn/static-ox/images/z-keyword.gif" style="border: medium none ; margin: 0pt; background: transparent none repeat scroll 0% 0%; float: none; height: 14px; width: 12px; display: inline; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" class="zoominoBgImage" /&gt;&lt;/zmkey&gt;出来了,但报了一个错:&lt;br /&gt;　　Java.lang.Exception: Exception in sending Request :: null&lt;br /&gt;　　很多功能不能用,提示重新登录.&lt;br /&gt;　　在Oracle论坛上查到了解决办法:&lt;br /&gt;　　http://forums.oracle.com/forums/thread.jspa?threadID=320574&amp;amp;tstart=0&amp;amp;messageID=1374397&lt;br /&gt;　　找到下面的文件&lt;br /&gt;　　10.2.0\db_1\ZYKNET_ORC2\sysman\config\emd.properties&lt;br /&gt;　　其中的agentTZRegion&lt;zmkey style="border-bottom: 2px dotted rgb(255, 108, 0); font-weight: bold; margin-right: 3px; cursor: pointer; float: none;" class="zoomino-searchword"&gt;缺省&lt;img src="http://www.zoomino.cn/static-ox/images/z-keyword.gif" style="border: medium none ; margin: 0pt; background: transparent none repeat scroll 0% 0%; float: none; height: 14px; width: 12px; display: inline; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" class="zoominoBgImage" /&gt;&lt;/zmkey&gt;是GMT,改为你所在的&lt;zmkey style="border-bottom: 2px dotted rgb(255, 108, 0); font-weight: bold; margin-right: 3px; cursor: pointer; float: none;" class="zoomino-searchword"&gt;时区&lt;img src="http://www.zoomino.cn/static-ox/images/z-keyword.gif" style="border: medium none ; margin: 0pt; background: transparent none repeat scroll 0% 0%; float: none; height: 14px; width: 12px; display: inline; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" class="zoominoBgImage" /&gt;&lt;/zmkey&gt;即可,例如:&lt;br /&gt;　　agentTZRegion=Asia/Chungking&lt;br /&gt;　　关于时区的列表参考：10.2.0\db_1\sysman\admin\supportedtzs.lst&lt;br /&gt;　　然后，&lt;zmkey style="border-bottom: 2px dotted rgb(255, 108, 0); font-weight: bold; margin-right: 3px; cursor: pointer; float: none;" class="zoomino-searchword"&gt;重启&lt;img src="http://www.zoomino.cn/static-ox/images/z-keyword.gif" style="border: medium none ; margin: 0pt; background: transparent none repeat scroll 0% 0%; float: none; height: 14px; width: 12px; display: inline; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" class="zoominoBgImage" /&gt;&lt;/zmkey&gt;OracleDBConsole&lt;sid&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-8697384660705548171?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/8697384660705548171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=8697384660705548171' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/8697384660705548171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/8697384660705548171'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/03/oracleem.html' title='【转】Oracle重新配置EM简化版教程'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-5297047249883154602</id><published>2009-03-09T19:14:00.002+08:00</published><updated>2009-03-09T19:18:35.316+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Network'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>【转】你的系统有多脆弱</title><content type='html'>&lt;!--START RESERVED FOR FUTURE USE INCLUDE FILES--&gt;&lt;!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --&gt;  &lt;!--END RESERVED FOR FUTURE USE INCLUDE FILES--&gt;             &lt;p&gt;                     &lt;i&gt;软件安全性依然是热点话题。每个人，从老祖母到全球 500 强公司都听说过由互联网上的病毒和攻击者所引起的盗窃身份、丢失数据，及一般性的伤害的事。在 2008 年第一季度，所有报告的 1,474 个不同的软件脆弱点只有 64 个被解决。&lt;a href="http://www.ibm.com/developerworks/cn/rational/edge/08/may08/breznak/?S_TACT=105AGX52&amp;amp;S_CMP=tec-csdn#notes"&gt;                         &lt;sup&gt;1&lt;/sup&gt;                     &lt;/a&gt;分辨率大约为 4%。伴随所有关于软件和系统安全的议论，计算机世界似乎处于一片混乱中，这会让许多人不禁问道：“我有多脆弱？”&lt;/i&gt;             &lt;/p&gt;             &lt;p&gt;                 &lt;i&gt;在本文中，我将介绍一些伍斯特工业学院（Worcester Polytechnic Institute，WPI）近期的安全项目的成果，以及额外的研究。我的目的是通过阐明公共术语并且提供一些典型的安全性使用的现实实例来说明什么是软件安全性。&lt;/i&gt;             &lt;/p&gt;             &lt;p&gt;                 &lt;i&gt;本文不打算提供全面的计算机安全教育，而是介绍一些辽阔且扩展的信息安全领域中的关键主题。如果您想要进一步讨论，那么请通过 rbreznak@wpi.edu 联系我。&lt;/i&gt;             &lt;/p&gt;             &lt;p&gt;&lt;a name="1.1 Background"&gt;&lt;span class="atitle"&gt;背景&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;             &lt;p&gt;我 早期对计算机安全的兴趣实际上激发了我对计算机科学的最初兴趣，并且从那时起就一直是我关注的焦点。所以不用说，我有一点失望的是 WPI 没有提供大学软件或系统安全课程。在没有任何正式的安全课程的情况下，我和其他两个计算机科学的学生决定进行独立研究，了解更多关于软件安全的知识。今年 的早些日子，我们和 WPI 计算机科学的教授 Kathryn Fisler 谈论关于开始一个涉及软件安全的独立研究项目的事。我们计划开设一门首先在 08-09 学年度进行的安全软件工程的课程。众所周知，CS4400x 将成为 WPI 提供的第一门大学计算机科学安全课程。&lt;/p&gt;             &lt;p&gt;在开设该课程的过程中，我们发现许多关于没有在标准课 程中提到的软件脆弱性和预防的事实。我们发现大部分脆弱点通常由小的逻辑错误或软件开发人员没发现或解决的情况所引起。一些脆弱点不太复杂，因而很容易被 黑客利用。可以通过一些简单的资源就能找到它们，像 Web 浏览器和文本编辑器。在软件开发团队&lt;i&gt;没&lt;/i&gt;出错的其他情况下，安全性的破坏可能由最终用户不恰当地配置或使用软件所致。&lt;/p&gt;             &lt;p&gt;我们的结论是，最大的安全缺陷源于开发人员错误地假设安全问题将在系统的其他地方处理 —— 举例来说，他们假设可以相信输入的数据。经验教训：我们不得不认识到安全是每个人的职责，不是其他人的。&lt;/p&gt;         &lt;br /&gt;&lt;p&gt;&lt;a name="2.2 Vulnerability 101"&gt;&lt;span class="atitle"&gt;脆弱性 101&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;              &lt;p&gt;脆 弱性是什么？“利用”、“攻击”、“脆弱点”，和其它术语一般用于描述什么适当的软件安全目的在于纠正：系统中允许黑客特权访问信息或破坏系统的缺陷。 Mitre Corporation 将脆弱性定义为“系统或网络中允许黑客以另一个用户的身份执行命令，访问他们不应该访问的数据，冒充某人，及/或执行拒绝服务的状态”。 &lt;a href="http://www.ibm.com/developerworks/cn/rational/edge/08/may08/breznak/?S_TACT=105AGX52&amp;amp;S_CMP=tec-csdn#notes"&gt;                     &lt;sup&gt;2&lt;/sup&gt;                 &lt;/a&gt;根据此定义，脆弱就意味着处于一种状态，在这种状态下，黑客（人或恶意程序，像病毒或间谍软件）可以访问到比他们应该可以访问的要多的系统的部分。&lt;/p&gt;             &lt;p&gt;脆弱点出现的范围很广，从明显的 —— 像使用不健壮的密码或存储无保护的私有数据 —— 到更有细微差异的 —— 像未检查的输入。&lt;/p&gt;             &lt;p&gt;&lt;a name="2.1.2.1 Overflow attacks"&gt;&lt;span class="smalltitle"&gt;溢出攻击&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;              &lt;p&gt;最 早遭受破坏的，且仍旧普遍的攻击来源于开发人员对最终用户输入的数据可以信任的假设。大部分程序设计人员未预料在用户名框中得到 40,000 行文本，或者从密码框中获得甚至非键盘输入的模糊字符，因此，所输入的数据从不会被验证无误。这种假设增加了溢出攻击。举例来说，使用本文编辑器并了解一 些 Microsoft PowerPoint 文件格式的知识，&lt;a href="http://www.ibm.com/developerworks/cn/rational/edge/08/may08/breznak/?S_TACT=105AGX52&amp;amp;S_CMP=tec-csdn#notes"&gt;                     &lt;sup&gt;3&lt;/sup&gt;                 &lt;/a&gt; 人们就可以手工编写 PowerPoint 文件。编辑 PowerPoint 文件&lt;a href="http://www.ibm.com/developerworks/cn/rational/edge/08/may08/breznak/?S_TACT=105AGX52&amp;amp;S_CMP=tec-csdn#notes"&gt;                     &lt;sup&gt;4&lt;/sup&gt;                 &lt;/a&gt;， 让内部字段中拥有比格式允许的更多的数据会导致 Microsoft PowerPoint XP 崩溃，然后执行任何黑客想要执行的程序。在一个这种脆弱性的熟悉的实例中，内嵌的 Windows 计算器程序被执行，然而，被执行的程序很容易是更恶意的。这只是无数的这类利用中的一个实例。&lt;/p&gt;              &lt;p&gt;实质上，溢 出类攻击是由于将太多的数据放入原始程序设计人员认为足够的空间中导致的。额外的数据溢出到预期存储区附近的内存中，并且覆盖与该区域的原始用途无关的数 据。当执行余下的程序时，它使用新被覆盖的数据。如果黑客能够用伪数据（也就是，NOP）填充足够的空间，然后添加一点恶意代码或值，那么程序将执行恶意 代码或使用新值。这可能导致许多不同的后果。黑客可能能够越过登录&lt;a href="http://www.ibm.com/developerworks/cn/rational/edge/08/may08/breznak/?S_TACT=105AGX52&amp;amp;S_CMP=tec-csdn#notes"&gt;                     &lt;sup&gt;5&lt;/sup&gt;                  &lt;/a&gt;，获得程序的管理员特权。如果受攻击的程序是由系统管理员启动的，那么恶意代码将作为原始程序的一部分进行执行，给黑客系统中的管理员特权。溢出脆弱点，尽管不总是出现，但在一些情况下，可能很容易被补救，当开发应用程序时利用“安全”库&lt;a href="http://www.ibm.com/developerworks/cn/rational/edge/08/may08/breznak/?S_TACT=105AGX52&amp;amp;S_CMP=tec-csdn#notes"&gt;                     &lt;sup&gt;6&lt;/sup&gt;                 &lt;/a&gt;，使用堆栈保护&lt;a href="http://www.ibm.com/developerworks/cn/rational/edge/08/may08/breznak/?S_TACT=105AGX52&amp;amp;S_CMP=tec-csdn#notes"&gt;                     &lt;sup&gt;7&lt;/sup&gt;                 &lt;/a&gt;（也就是，StackGuard&lt;a href="http://www.ibm.com/developerworks/cn/rational/edge/08/may08/breznak/?S_TACT=105AGX52&amp;amp;S_CMP=tec-csdn#notes"&gt;                     &lt;sup&gt;8&lt;/sup&gt;                 &lt;/a&gt;）或对输入数据进行检查，从而确保其是适当的大小或类型。这一类的利用总是以类似的方式进行，但会根据受影响的内存类型和预期效果而不同。&lt;/p&gt;             &lt;p&gt;&lt;a name="2.2.2.2 Buffer overflow attacks"&gt;&lt;span class="smalltitle"&gt;缓冲区溢出攻击&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;             &lt;p&gt;在缓冲区溢出攻击的实例中，程序的内部值溢出，从而改变程序的运行方式。&lt;a href="http://www.ibm.com/developerworks/cn/rational/edge/08/may08/breznak/?S_TACT=105AGX52&amp;amp;S_CMP=tec-csdn#notes"&gt;                     &lt;sup&gt;9&lt;/sup&gt;                  &lt;/a&gt;在 程序的正常操作过程中，当调用一个函数时，被调用函数的所有参数以及返回位置的指针都放在栈中。当完成该函数之后，使用返回指针回到原来的位置并继续程 序。利用缓冲区溢出进行攻击可以改变这个过程，并且允许黑客执行任何他们期望的函数。 这是通过输入足够的数据来用伪数据覆盖参数，及输入到不同函数的新返回指针来实现的，现在就执行新的函数了。&lt;a href="http://www.ibm.com/developerworks/cn/rational/edge/08/may08/breznak/?S_TACT=105AGX52&amp;amp;S_CMP=tec-csdn#notes"&gt;                     &lt;sup&gt;10&lt;/sup&gt;                 &lt;/a&gt;             &lt;/p&gt;             &lt;p&gt;&lt;a name="2.3.2.3 SQL injection"&gt;&lt;span class="smalltitle"&gt;SQL 注入&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;             &lt;p&gt;除 了溢出的利用以外，SQL 注入是另一类依赖于开发人员没测试输入数据的疏漏的攻击。大多数人拥有字母数字式密码，或者有安全意识的人，拥有附带其他键盘符号的字母数字式密码。由于 这种想法，开发人员可能允许输入任何字符作为密码。这通常是没问题的，除非他们忘记清洁或检查输入数据。这种情况比应该的要发生的频繁得多。使用 SQL 数据库的密码系统（在许多网站上非常普遍的场景）可能运行这样的查询：&lt;br /&gt;         &lt;/p&gt;             &lt;table border="0" cellpadding="0" cellspacing="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="code-outline"&gt;&lt;pre class="displaycode"&gt;SELECT * FROM users WHERE 'username' = '$USER' AND 'password'='$PASS';&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;         &lt;p&gt;$USER 和 $PASS 会用用户提供的用户名和密码来代替。那么如果用户输入‘bob’和‘1234’，那么结果的查询是：&lt;/p&gt;             &lt;table border="0" cellpadding="0" cellspacing="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="code-outline"&gt;&lt;pre class="displaycode"&gt;SELECT * FROM users WHERE 'username' = 'bob' AND 'password' = '1234';&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;         &lt;p&gt;，而来自数据库的返回值会是所有用 bob 作为用户名且用 1234 作为密码的数据元组。如果黑客输入 admin 和 &lt;&lt;'hi' 或 1=1&gt;&gt;--，那么查询是：&lt;/p&gt;             &lt;table border="0" cellpadding="0" cellspacing="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="code-outline"&gt;&lt;pre class="displaycode"&gt;SELECT * FROM users WHERE 'username' = 'admin' and `password` = 'hi' OR 1=1--'&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;          &lt;p&gt;注 意用户输入的引号如何与原始查询中的第三个引号匹配。数据库现在会返回用户名为 admin 的所有元组，并且会取消对密码的检查，因为 'password' = 'hi' OR 1=1 命令数据库寻找密码是 hi 的元组或 1=1 的元组，而由于 1 总是 1，所以每行都是候选。-- 是 SQL 注释标志，取消查询中原始的其他引号，并且还将取消任何额外的检查，因此如果有额外的凭证（也就是，keyfob&lt;a href="http://www.ibm.com/developerworks/cn/rational/edge/08/may08/breznak/?S_TACT=105AGX52&amp;amp;S_CMP=tec-csdn#notes"&gt;                     &lt;sup&gt;11&lt;/sup&gt;                 &lt;/a&gt; 或 captcha&lt;a href="http://www.ibm.com/developerworks/cn/rational/edge/08/may08/breznak/?S_TACT=105AGX52&amp;amp;S_CMP=tec-csdn#notes"&gt;                     &lt;sup&gt;12&lt;/sup&gt;                  &lt;/a&gt;）也会被忽略。现在黑客可以以管理员的身份进入系统并且不用不得不给出合法的密码。通过利用越来越复杂的查询，黑客可以变更、添加，或查询数据。&lt;a href="http://www.ibm.com/developerworks/cn/rational/edge/08/may08/breznak/?S_TACT=105AGX52&amp;amp;S_CMP=tec-csdn#notes"&gt;                     &lt;sup&gt;13&lt;/sup&gt;                 &lt;/a&gt; 对于数据库，这令黑客具有同应用程序相同的特权。&lt;/p&gt;             &lt;p&gt;这 种类型的脆弱点被证实是对 Web 应用程序最有效的攻击类型之一，并且随着对 Web 应用程序的信任的增加，这种利用的力量甚至将更令人畏缩。幸运的消息是，像溢出类型的攻击一样，可以通过清洁输入数据，并且从不立即相信用户输入（至少对 于输入的数据）来防止大部分这种脆弱点。&lt;/p&gt;         &lt;br /&gt;&lt;p&gt;&lt;a name="3.3 Hash hacking"&gt;&lt;span class="atitle"&gt;散列攻击&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;              &lt;p&gt;任何处理在数据库中存储用户凭证的人都会告诉您，首要的规则之一是从不直接存储没有首先加密的密码或其它私有数据。如果数据库暴露了，那么使用加密方案将防止暴露用户的密码。为了更多的利益，利用单向加密算法或散列，像 MD5&lt;a href="http://www.ibm.com/developerworks/cn/rational/edge/08/may08/breznak/?S_TACT=105AGX52&amp;amp;S_CMP=tec-csdn#notes"&gt;                     &lt;sup&gt;14&lt;/sup&gt;                 &lt;/a&gt; 或 Blowfish，&lt;a href="http://www.ibm.com/developerworks/cn/rational/edge/08/may08/breznak/?S_TACT=105AGX52&amp;amp;S_CMP=tec-csdn#notes"&gt;                     &lt;sup&gt;15&lt;/sup&gt;                 &lt;/a&gt; 将使密码的解密成为不可能。这是因为散列可以将输入值转化为新的值，而这些新值不能从数学上逆向生成原始值。传统上，攻击以这种方式存储的密码的方式涉及 用尽可能多的不同的密码进行尝试直到最终有效，这被称之为“蛮干”技术。虽然这种类型的攻击十分简单，但通常是无效的，因为需要绝对的时间来尝试足够的组 合，有时候要上千年，统计上是成功的，一般是理论的。&lt;/p&gt;             &lt;p&gt;每天您可能都在使用散列攻击工具，而甚至不知道它。Google 真的非常擅长它所做的：在信息之间找到链接。举例来说，Googling “Bob Breznak”将取出所有关于我的信息：我为 &lt;i&gt;The Rational Edge&lt;/i&gt; 写的最近的书评，我的个人站点（及废弃的）等等。现在，如果您从这里借鉴一下，那么您将得到快速返回结果的许多想法。应用该想法来寻找散列。举例来说，利 用“foobar”的 MD5 散列：3858f62230ac3c915f300c664312c63f。现在将其输入 Google，瞧！0.21 秒内，第一个结果是“Google Hash: md5(foobar) = 3858f62230ac3c915f300c664312c63f”。您将找到的大部分结果都是哈希索引站点 —— 有意地连接散列值和其相应关键字的站点。尝试更复杂的字符串（举例来说，“bobby”、“crayon”、“rational”）将生成混合的结果。如 果您尝试复杂的密码（或者最好是传递阶段），您可能没有收获。&lt;/p&gt;              &lt;p&gt;这可能不是您需要担心的最大安全漏洞，但令其危险的是，这种利用不太知名，并且没有简单的补救办法。随着越来越复杂的关键字被匹配到散列上，匹配到已知密码上的可能性增加了。变更为更复杂的算法，比方说从 MD5 变更为 SHA-2，&lt;a href="http://www.ibm.com/developerworks/cn/rational/edge/08/may08/breznak/?S_TACT=105AGX52&amp;amp;S_CMP=tec-csdn#notes"&gt;                     &lt;sup&gt;16&lt;/sup&gt;                 &lt;/a&gt; 对恢复秘密的完整性没什么作用。这是因为尽管从不同的散列中获得同一个字符串的返回值，但是将关键字链接到散列上也只是时间的问题。虽然加密法总是将利用时间来蛮干作为安全网，搜索减少所需的时间，从而成功地从几千年到几年，甚至几个月。&lt;/p&gt;             &lt;p&gt;现 在，存在着两种主要的争论，它们将散列查找从年度最大的安全缺陷的竞争列表中去掉了。这种类型的攻击只可能在数据库或密码存储已经暴露的情况下进行。需要 读取数据库、影子文件（UNIX 或 LINUX 系统保存用户密码的地方），或 I/O 流。在某些情况下，这可能和达到正确的 URL 或执行 SQL 注入一样简单，而在其他情况下，它可能需要比黑客多得多的工作。减小这种攻击的潜在严重性的另一个争论实际上源于散列的使用。由于许多字符串可以生成相同 的散列，所以不能必然地确定原始的字符串（用户的真实密码）。然而，找到任何散列到相同值得字符串能够再次生成相同的散列值。这意味着尽管黑客可能没有获 得实际的密码，但是由于系统使用存储的散列，而黑客拥有能生成同等散列的字符串，所以系统会像黑客拥有原始密码那样响应。&lt;/p&gt;         &lt;br /&gt;&lt;p&gt;&lt;a name="4.4 End-user issues "&gt;&lt;span class="atitle"&gt;最终用户问题&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;             &lt;p&gt;即使有了最彻底地测试过的且安全的软件，一旦打包并交给最终用户，全部的赌都输了。软件如何配置和实现，像其他步骤那样扮演者关键的安全性角色。&lt;/p&gt;             &lt;p&gt;&lt;a name="4.1.4.1 The fallacy of defaults "&gt;&lt;span class="smalltitle"&gt;默认值的谬论&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;             &lt;p&gt;用 户犯的最大错误之一是当所使用的软件没有默认值时。许多软件为各种选项定义默认值，以便用户可以尽可能快地运行。虽然有时候这可能非常有益，像 Web 服务器默认为标准的 Web 服务器通信端口，这也会导致许多安全问题。举例来说，许多路由器和其它网络设备都有默认的登录用户名和密码。当用户不将这些默认值改为独特的值时就会出现 问题。搜索“默认的路由器密码”将得到许多列出市场上大部分路由器的默认用户名和密码的站点。如果黑客打算进入网络，那么还未接触的用户名、密码、IP 地址，和其它默认值都是现成的钥匙。&lt;/p&gt;             &lt;p&gt;&lt;a name="4.2.4.2 Unsecured systems"&gt;&lt;span class="smalltitle"&gt;不可靠的系统&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;              &lt;p&gt;当 最终用户不确定他们添加的软件如何符合系统的其他部分，并且需要采取什么额外的安全量度时，会产生另一个问题。再次拿 Web 搜索举例。搜索“view/index.shtml axis”将返回未保护的网络摄像机的列表。在一些情况下，最终用户成功地设置了他们想让全世界都可见的网络摄像机。在其他情况下，网络摄像机被添加到某 个网络，并且没有配置为不公开。这种未保护的摄像机可以被互联网上的每个人见到，并且可能快速地成为侵犯隐私罪。一些书籍和网站致力于提供返回所有者没犹 豫过安全性并且现在公开了的数据搜索查询。&lt;a href="http://www.ibm.com/developerworks/cn/rational/edge/08/may08/breznak/?S_TACT=105AGX52&amp;amp;S_CMP=tec-csdn#notes"&gt;                     &lt;sup&gt;17&lt;/sup&gt;                 &lt;/a&gt;             &lt;/p&gt;              &lt;p&gt;我 们从这些新的搜索中得到一些经验。第一，默认值到处都是，因此当不修改默认值时，考虑如果黑客知道此信息会有多有害。第二，您应该了解如何访问系统的各个 部分并且考虑这种访问级别是否合适。第三，记住通过模糊的安全没有用。不论多么不重要或未公开的信息公开了，如果有人感兴趣，不管通过自动的搜索或一些人 力，都可以找到该数据。&lt;a href="http://www.ibm.com/developerworks/cn/rational/edge/08/may08/breznak/?S_TACT=105AGX52&amp;amp;S_CMP=tec-csdn#notes"&gt;                     &lt;sup&gt;18&lt;/sup&gt;                 &lt;/a&gt;             &lt;/p&gt;         &lt;br /&gt;&lt;p&gt;&lt;a name="5.5 Conclusion"&gt;&lt;span class="atitle"&gt;结束语&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;             &lt;p&gt;随 着越来越多的脆弱点日益被发现，这些威胁只是沧海一粟 。如同这些实例一样，大部分脆弱点源于疏忽：忽略了实现安全实践的开发人员，或者忽略改变配置的最 终用户。即使我提供的实例可能肤浅，并且似乎十分容易避免，但随着项目的增长，对于简单的未检查的情况就有机会了。黑客可能只需要小小的机会就对系统进行 攻击并且引起永久性的损害。开发人员应该充分了解他们假设的影响，并且越过正常使用之外进行测试。通过充分地了解系统的工作方式，并且假定为对于产品的黑 客角色，开发人员应该定期审查他们的工作，并且在必要时发布补丁。&lt;/p&gt;             &lt;p&gt;个人可能说不出软件有多大缺陷，并且虽然没 有那么完全的安全系统，但是人们可以通过利用多层次的安全性将脆弱性最小化。健壮的密码，让软件保持更新及适当地修补，并且当添加了每个软件困扰时了解它 的影响，是最终用户添加保护层的小方法。最后，与软件相关的每个人都有责任关注安全性，并试图减少脆弱点。&lt;/p&gt;             &lt;a name="notes"&gt;           &lt;/a&gt;&lt;a name="notes"&gt;&lt;br /&gt;&lt;/a&gt;&lt;p&gt;&lt;a name="N101B4"&gt;&lt;span class="atitle"&gt;注释&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;             &lt;ol&gt;&lt;li&gt;                     &lt;a href="http://www.cert.org/stats/vulnerability_remediation.html" target="_blank"&gt;http://www.cert.org/stats/vulnerability_remediation.html&lt;/a&gt;                 &lt;/li&gt;&lt;li&gt;                     &lt;a href="http://cve.mitre.org/about/terminology.html#vulnerability" target="_blank"&gt;http://cve.mitre.org/about/terminology.html#vulnerability&lt;/a&gt;                 &lt;/li&gt;&lt;li&gt;                     &lt;a href="http://poi.apache.org/hslf/ppt-file-format.html" target="_blank"&gt;http://poi.apache.org/hslf/ppt-file-format.html&lt;/a&gt;                 &lt;/li&gt;&lt;li&gt;                     &lt;a href="http://www.astalavista.com/index.php?section=exploits&amp;amp;cmd=details&amp;amp;id=4818" target="_blank"&gt;http://www.astalavista.com/index.php?section=exploits&amp;amp;cmd=details&amp;amp;id=4818&lt;/a&gt;                 &lt;/li&gt;&lt;li&gt;                     &lt;a href="http://nsfsecurity.pr.erau.edu/bom/Spock.html" target="_blank"&gt;http://nsfsecurity.pr.erau.edu/bom/Spock.html&lt;/a&gt;                 &lt;/li&gt;&lt;li&gt;                     &lt;a href="http://www.openbsd.org/cgi-bin/man.cgi?query=strlcpy&amp;amp;sektion=3" target="_blank"&gt;http://www.openbsd.org/cgi-bin/man.cgi?query=strlcpy&amp;amp;sektion=3&lt;/a&gt;                 &lt;/li&gt;&lt;li&gt;                     &lt;a href="http://nsfsecurity.pr.erau.edu/bom/StackGuard.html" target="_blank"&gt;http://nsfsecurity.pr.erau.edu/bom/StackGuard.html&lt;/a&gt;                 &lt;/li&gt;&lt;li&gt;                     &lt;a href="http://www.usenix.org/publications/library/proceedings/sec98/full_papers/cowan/cowan_html/cowan.html" target="_blank"&gt;http://www.usenix.org/publications/library/proceedings/sec98/full_papers/cowan/cowan_html/cowan.html&lt;/a&gt;                 &lt;/li&gt;&lt;li&gt;                     &lt;a href="http://nsfsecurity.pr.erau.edu/bom/Smasher.html" target="_blank"&gt;http://nsfsecurity.pr.erau.edu/bom/Smasher.html&lt;/a&gt;                 &lt;/li&gt;&lt;li&gt;                     &lt;a href="http://insecure.org/stf/smashstack.html" target="_blank"&gt;http://insecure.org/stf/smashstack.html&lt;/a&gt;                 &lt;/li&gt;&lt;li&gt;                     &lt;a href="http://en.wikipedia.org/wiki/SecurID" target="_blank"&gt;http://en.wikipedia.org/wiki/SecurID&lt;/a&gt;                 &lt;/li&gt;&lt;li&gt;                     &lt;a href="http://captcha.net/" target="_blank"&gt;http://captcha.net/&lt;/a&gt;                 &lt;/li&gt;&lt;li&gt;                     &lt;a href="http://www.youtube.com/watch?v=MJNJjh4jORY" target="_blank"&gt;http://www.youtube.com/watch?v=MJNJjh4jORY&lt;/a&gt;                 &lt;/li&gt;&lt;li&gt;                     &lt;a href="http://userpages.umbc.edu/%7Emabzug1/cs/md5/md5.html" target="_blank"&gt;http://userpages.umbc.edu/~mabzug1/cs/md5/md5.html&lt;/a&gt;                 &lt;/li&gt;&lt;li&gt;                     &lt;a href="http://en.wikipedia.org/wiki/Blowfish_%28cipher%29" target="_blank"&gt;http://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;/a&gt;                 &lt;/li&gt;&lt;li&gt;                     &lt;a href="http://en.wikipedia.org/wiki/SHA-1" target="_blank"&gt;http://en.wikipedia.org/wiki/SHA-1&lt;/a&gt;                 &lt;/li&gt;&lt;li&gt;                     &lt;a href="http://www.oreilly.com/catalog/googlehks" target="_blank"&gt;http://www.oreilly.com/catalog/googlehks&lt;/a&gt;                 &lt;/li&gt;&lt;li&gt;                     &lt;a href="http://www.linux.com/articles/23313" target="_blank"&gt;http://www.linux.com/articles/23313&lt;/a&gt;                 &lt;/li&gt;&lt;/ol&gt;       关于作者&lt;br /&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan="3"&gt;&lt;img alt="" src="http://www.ibm.com/i/c.gif" width="100%" height="5" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr align="left" valign="top"&gt;&lt;td&gt;&lt;p&gt;&lt;img alt="author photo" name="author photo" src="http://www.ibm.com/developerworks/rational/library/content/Authors/A-F/breznak_bob.jpg" valign="top" align="left" vspace="3" width="64" height="80" hspace="3" /&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;img alt="" src="http://www.ibm.com/i/c.gif" width="4" height="5" /&gt;&lt;/td&gt;&lt;td width="100%"&gt;&lt;p&gt;Bob Breznak 在马萨诸塞州，伍斯特的伍斯特工业学院研究计算机科学，专攻软件工程和机器人技术。目前，他作为高级助理，受雇于计算机科学系，并且受雇于 Sun Microsystems。在学校里，他频繁参与 Association for Computer Machinery（ACM）、IEEE、和最近刚把他选为主席的计算机科学的荣誉团体（Upsilon Pi Epsilon，或 UPE）。他通常在计算机科学楼的下层地下室中进行从系统安全到机器人技术的项目。&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-5297047249883154602?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/5297047249883154602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=5297047249883154602' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/5297047249883154602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/5297047249883154602'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/03/blog-post_09.html' title='【转】你的系统有多脆弱'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-8841904686045657158</id><published>2009-03-09T13:35:00.000+08:00</published><updated>2009-03-09T13:36:15.701+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>【转】EM 无法启动&amp;&amp;重新完全配置EM</title><content type='html'>&lt;p&gt;公司的电脑改了IP ,于是EM无法启动了&lt;/p&gt; &lt;p&gt;环境:ORACLE 10G &lt;/p&gt; &lt;p&gt;OS:WINXP SP2&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;D:\Documents and Settings\guanhao&gt;emctl start dbconsole&lt;br /&gt;OC4J Configuration issue. E:\oracle\product\10.2.0\db_1/oc4j/j2ee/OC4J_DBConsole&lt;br /&gt;_server_tuosi not found. &lt;/p&gt; &lt;hr /&gt;EMCA的一些命令参数  &lt;p&gt;D:\Documents and Settings\guanhao&gt;emca&lt;br /&gt;E:\oracle\product\10.2.0\db_1\bin\emca.bat [操作] [模式] [数据库类型] [标记] [参数]-h | --h | -help | --help: 打印此帮助消息-version: 打印版本-config dbcontrol db [-repos (create | recreate)] [-cluster] [-silent] [-backup]&lt;/p&gt; &lt;p&gt;[参数]: 配置数据库的 Database Control&lt;br /&gt;-config centralAgent (db | asm) [-cluster] [-silent] [参数]: 配置中心代理管理&lt;br /&gt;-config all db [-repos (create | recreate)] [-cluster] [-silent] [-backup] [参数]: 配置 Database Control 和中心代理管理&lt;/p&gt; &lt;p&gt;-deconfig dbcontrol db [-repos drop] [-cluster] [-silent] [参数]: 取消配置 Database Control&lt;br /&gt;-deconfig centralAgent (db | asm) [-cluster] [ -silent] [参数]: 取消配置中心代理管理&lt;br /&gt;-deconfig all db [-repos drop] [-cluster] [-silent] [参数]: 取消配置 Database Control 和中心代理管理&lt;/p&gt; &lt;p&gt;-addInst (db | asm) [-silent] [参数]: 为新的 RAC 实例配置 EM&lt;br /&gt;-deleteInst (db | asm) [-silent] [参数]: 取消为指定的 RAC 实例配置 EM&lt;/p&gt; &lt;p&gt;-reconfig ports [-cluster] [参数]: 重新明确分配 Database Control 端口&lt;br /&gt;-reconfig dbcontrol -cluster [-silent] [参数]: 重新配置 RAC Database Control 部署&lt;/p&gt; &lt;p&gt;-displayConfig dbcontrol -cluster [-silent] [参数]: 显示有关 RAC Database Control 配置的信息&lt;/p&gt; &lt;p&gt;-upgrade (db | asm | db_asm) [-cluster] [-silent] [参数]: 将较低版本的 EM 配置升级到当前版本&lt;/p&gt; &lt;p&gt;-restore (db | asm | db_asm) [-cluster] [-silent] [参数]: 将当前版本的 EM 配置复原到较低版本&lt;/p&gt; &lt;p&gt;参数和选项:&lt;br /&gt;[参数]: [ -respFile 文件名 ] [ -paramName paramValue ]*&lt;br /&gt;db: 对数据库 (包括使用 ASM 的数据库) 执行配置操作&lt;br /&gt;asm: 仅对 ASM 实例执行配置操作&lt;br /&gt;db_asm: 对数据库和 ASM 实例执行升级/复原操作&lt;br /&gt;-repos create: 创建新的 Database Control 资料档案库&lt;br /&gt;-repos drop: 删除当前的 Database Control 资料档案库&lt;br /&gt;-repos recreate: 删除当前的 Database Control 资料档案库并重新创建一个&lt;br /&gt;-cluster: 对 RAC 数据库执行配置操作&lt;br /&gt;-silent: 在不提示参数的情况下执行配置操作&lt;br /&gt;-backup: 配置数据库的自动备份&lt;/p&gt; &lt;p&gt;单实例数据库的参数&lt;br /&gt;        HOST: 数据库主机名&lt;br /&gt;        SID: 数据库 SID&lt;br /&gt;        PORT: 监听程序端口号&lt;br /&gt;        ORACLE_HOME: 数据库 ORACLE_HOME&lt;br /&gt;        HOST_USER: 自动备份的主机用户名&lt;br /&gt;        HOST_USER_PWD: 自动备份的主机用户口令&lt;br /&gt;        BACKUP_SCHEDULE: 自动备份调度 (HH:MM)&lt;br /&gt;        EMAIL_ADDRESS: 通知的电子邮件地址&lt;br /&gt;        MAIL_SERVER_NAME: 通知的发件 (SMTP) 服务器&lt;br /&gt;        ASM_OH: ASM ORACLE_HOME&lt;br /&gt;        ASM_SID: ASM SID&lt;br /&gt;        ASM_PORT: ASM 端口&lt;br /&gt;        ASM_USER_ROLE: ASM 用户角色&lt;br /&gt;        ASM_USER_NAME: ASM 用户名&lt;br /&gt;        ASM_USER_PWD: ASM 用户口令&lt;br /&gt;        SRC_OH: 要升级的数据库的 ORACLE_HOME&lt;br /&gt;        DBSNMP_PWD: DBSNMP 用户的口令&lt;br /&gt;        SYSMAN_PWD: SYSMAN 用户的口令&lt;br /&gt;        SYS_PWD: SYS 用户的口令&lt;br /&gt;        DBCONTROL_HTTP_PORT: Database Control HTTP 端口&lt;br /&gt;        AGENT_PORT: EM 代理端口&lt;br /&gt;        RMI_PORT: Database Control 的 RMI 端口&lt;br /&gt;        JMS_PORT: Database Control 的 JMS 端口&lt;/p&gt; &lt;p&gt;集群数据库的其它参数&lt;br /&gt;        CLUSTER_NAME: 集群名&lt;br /&gt;        DB_UNIQUE_NAME: 数据库的唯一名称&lt;br /&gt;        SERVICE_NAME: 服务名&lt;br /&gt;        EM_NODE: Database Control 节点名&lt;br /&gt;        EM_SID_LIST: 代理 SID 列表 [以逗号分隔] &lt;/p&gt; &lt;hr /&gt;于是先删除原来的配置:&lt;br /&gt;D:\Documents and Settings\guanhao&gt;emca -repos drop &lt;p&gt;EMCA 开始于 2007-11-19 14:45:06&lt;br /&gt;EM Configuration Assistant 10.2.0.1.0 正式版&lt;br /&gt;版权所有 (c) 2003, 2005, Oracle。保留所有权利。&lt;/p&gt; &lt;p&gt;输入以下信息:&lt;br /&gt;数据库 SID: tuosi&lt;br /&gt;监听程序端口号: 1521&lt;br /&gt;SYS 用户的口令:&lt;br /&gt;SYSMAN 用户的口令:&lt;br /&gt;SYSMAN 用户的口令:&lt;br /&gt;是否继续? [yes(Y)/no(N)]: y&lt;br /&gt;2007-11-19 14:45:20 oracle.sysman.emcp.EMConfig perform&lt;br /&gt;信息: 正在将此操作记录到 E:\oracle\product\10.2.0\db_1\cfgtoollogs\emca\tuosi\em&lt;br /&gt;ca_2007-11-19_02-45-06-下午.log。&lt;br /&gt;2007-11-19 14:45:21 oracle.sysman.emcp.EMReposConfig dropRepository&lt;br /&gt;信息: 正在删除 EM 资料档案库 (此操作可能需要一段时间)...&lt;br /&gt;2007-11-19 14:48:13 oracle.sysman.emcp.EMReposConfig invoke&lt;br /&gt;信息: 已成功删除资料档案库&lt;br /&gt;已成功完成 Enterprise Manager 的配置&lt;br /&gt;EMCA 结束于 2007-11-19 14:48:13 &lt;/p&gt; &lt;hr /&gt;创建新的配置:&lt;br /&gt;D:\Documents and Settings\guanhao&gt;emca -repos create &lt;p&gt;EMCA 开始于 2007-11-19 14:53:35&lt;br /&gt;EM Configuration Assistant 10.2.0.1.0 正式版&lt;br /&gt;版权所有 (c) 2003, 2005, Oracle。保留所有权利。&lt;/p&gt; &lt;p&gt;输入以下信息:&lt;br /&gt;数据库 SID: tuosi&lt;br /&gt;监听程序端口号: 1521&lt;br /&gt;SYS 用户的口令:&lt;br /&gt;SYSMAN 用户的口令:&lt;/p&gt; &lt;p&gt;是否继续? [yes(Y)/no(N)]: y&lt;br /&gt;2007-11-19 14:53:50 oracle.sysman.emcp.EMConfig perform&lt;br /&gt;信息: 正在将此操作记录到 E:\oracle\product\10.2.0\db_1\cfgtoollogs\emca\tuosi\em&lt;br /&gt;ca_2007-11-19_02-53-35-下午.log。&lt;br /&gt;2007-11-19 14:53:50 oracle.sysman.emcp.EMReposConfig createRepository&lt;br /&gt;信息: 正在创建 EM 资料档案库 (此操作可能需要一段时间)...&lt;br /&gt;2007-11-19 14:57:40 oracle.sysman.emcp.EMReposConfig invoke&lt;br /&gt;信息: 已成功创建资料档案库&lt;br /&gt;已成功完成 Enterprise Manager 的配置&lt;br /&gt;EMCA 结束于 2007-11-19 14:57:40 &lt;/p&gt; &lt;hr /&gt;D:\Documents and Settings\guanhao&gt;emca -config dbcontrol db  &lt;p&gt;EMCA 开始于 2007-11-19 15:02:45&lt;br /&gt;EM Configuration Assistant 10.2.0.1.0 正式版&lt;br /&gt;版权所有 (c) 2003, 2005, Oracle。保留所有权利。&lt;/p&gt; &lt;p&gt;输入以下信息:&lt;br /&gt;数据库 SID: tuosi&lt;br /&gt;已为数据库 tuosi 配置了 Database Control&lt;br /&gt;您已选择配置 Database Control, 以便管理数据库 tuosi&lt;br /&gt;此操作将移去现有配置和默认设置, 并重新执行配置&lt;br /&gt;是否继续? [yes(Y)/no(N)]: y&lt;br /&gt;监听程序端口号: 1521&lt;br /&gt;SYS 用户的口令:&lt;br /&gt;DBSNMP 用户的口令:&lt;br /&gt;用户名/口令无效。&lt;br /&gt;DBSNMP 用户的口令:&lt;br /&gt;SYSMAN 用户的口令:&lt;br /&gt;通知的电子邮件地址 (可选):&lt;br /&gt;通知的发件 (SMTP) 服务器 (可选):&lt;br /&gt;-----------------------------------------------------------------&lt;/p&gt; &lt;p&gt;已指定以下设置&lt;/p&gt; &lt;p&gt;数据库 ORACLE_HOME ................ E:\oracle\product\10.2.0\db_1&lt;/p&gt; &lt;p&gt;数据库主机名 ................ server&lt;br /&gt;监听程序端口号 ................ 1521&lt;br /&gt;数据库 SID ................ tuosi&lt;br /&gt;通知的电子邮件地址 ...............&lt;br /&gt;通知的发件 (SMTP) 服务器 ...............&lt;/p&gt; &lt;p&gt;-----------------------------------------------------------------&lt;br /&gt;是否继续? [yes(Y)/no(N)]: y&lt;br /&gt;2007-11-19 15:03:25 oracle.sysman.emcp.EMConfig perform&lt;br /&gt;信息: 正在将此操作记录到 E:\oracle\product\10.2.0\db_1\cfgtoollogs\emca\tuosi\em&lt;br /&gt;ca_2007-11-19_03-02-45-下午.log。&lt;br /&gt;2007-11-19 15:03:27 oracle.sysman.emcp.util.DBControlUtil stopOMS&lt;br /&gt;信息: 正在停止 Database Control (此操作可能需要一段时间)...&lt;br /&gt;2007-11-19 15:03:39 oracle.sysman.emcp.util.DBControlUtil startOMS&lt;br /&gt;信息: 正在启动 Database Control (此操作可能需要一段时间)...&lt;br /&gt;2007-11-19 15:04:29 oracle.sysman.emcp.EMDBPostConfig performConfiguration&lt;br /&gt;信息: 已成功启动 Database Control&lt;br /&gt;2007-11-19 15:04:29 oracle.sysman.emcp.EMDBPostConfig performConfiguration&lt;br /&gt;警告: 无法创建 Database Control 快捷方式&lt;br /&gt;2007-11-19 15:04:29 oracle.sysman.emcp.EMDBPostConfig performConfiguration&lt;br /&gt;信息: &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; Database Control URL 为 &lt;a href="http://server:5500/em"&gt;http://server:5500/em&lt;/a&gt; &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;br /&gt;已成功完成 Enterprise Manager 的配置&lt;br /&gt;EMCA 结束于 2007-11-19 15:04:29 &lt;/p&gt; &lt;hr /&gt;原来的还没停止,于是 &lt;p&gt;D:\Documents and Settings\guanhao&gt;emctl start dbconsole&lt;br /&gt;Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0&lt;br /&gt;Copyright (c) 1996, 2005 Oracle Corporation.  All rights reserved.&lt;br /&gt;&lt;a href="http://server:5500/em/console/aboutApplication"&gt;http://server:5500/em/console/aboutApplication&lt;/a&gt;&lt;br /&gt;Agent Version     : 10.1.0.4.1&lt;br /&gt;OMS Version       : 10.1.0.4.0&lt;br /&gt;Protocol Version  : 10.1.0.2.0&lt;br /&gt;Agent Home        : E:\oracle\product\10.2.0\db_1\server_tuosi&lt;br /&gt;Agent binaries    : E:\oracle\product\10.2.0\db_1&lt;br /&gt;Agent Process ID  : 1160&lt;br /&gt;Agent Process ID  : 1160&lt;br /&gt;Agent is already started. Will restart the agent&lt;br /&gt;This will stop the Oracle Enterprise Manager 10g Database Control process. Conti&lt;br /&gt;nue [y/n] :y&lt;br /&gt;OracleDBConsoletuosi 服务正在停止................&lt;br /&gt;OracleDBConsoletuosi 服务已成功停止。&lt;br /&gt;D:\Documents and Settings\guanhao&gt;emctl start dbconsole&lt;br /&gt;Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0&lt;br /&gt;Copyright (c) 1996, 2005 Oracle Corporation.  All rights reserved.&lt;br /&gt;&lt;a href="http://server:5500/em/console/aboutApplication"&gt;http://server:5500/em/console/aboutApplication&lt;/a&gt;&lt;br /&gt;Starting Oracle Enterprise Manager 10g Database Control ...OracleDBConsoletuosi&lt;br /&gt;服务正在启动 ................&lt;br /&gt;OracleDBConsoletuosi 服务已经启动成功。 &lt;/p&gt; &lt;hr /&gt; &lt;p&gt; 这样就重新配置了EM,当然可以从第3部直接来配置,但如果你考虑重新配置的话,就进行3步吧!&lt;/p&gt; &lt;p&gt;^(Oo)^&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-8841904686045657158?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/8841904686045657158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=8841904686045657158' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/8841904686045657158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/8841904686045657158'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/03/em.html' title='【转】EM 无法启动&amp;&amp;重新完全配置EM'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-302469837080311366</id><published>2009-03-08T08:09:00.001+08:00</published><updated>2009-03-08T08:09:00.630+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='Growing'/><title type='text'>【《程序员》2008年4月刊】做人、做事，做架构师——架构师能力模型解析</title><content type='html'>&lt;h5 align="left"&gt;&lt;strong&gt;&lt;strong&gt;文 / 周爱民&lt;/strong&gt;&lt;/strong&gt;&lt;/h5&gt;&lt;h5 align="left"&gt;&lt;strong&gt;引子&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;究竟是什么让你在同一个位置上——例如程序员或技术负责人——工作了三年、五年或者更久，而仍然得不到任何的发展空间？你觉得自己已成为技术圈中 的大牛，并信心满满地去拿明天就要颁发的某某大奖，然而却仍然停留在同样的技术职位上，去年到今年涨的薪水甚至填不平物价升幅？于是，你开始对老板不满， 对员工不满，对昨天升职的那个同事不满……你开始计划明天就要跑单，或者准备考虑提出加薪却又心怀忐忑。&lt;br /&gt;&lt;br /&gt;如果技术人员有发展的轨迹，那么他要么“看透工具的本质，把关注点转移到‘团队’的圈子里去”，要么“顺着代码铺就的道路，亦步亦趋地成为良匠大 师”。仅以技术方向而言，你大概可以做到架构师、总架构师甚至首席架构师；但问题是：你现在还只是一个程序员。那要如何才能踏上通往架构师之路呢？本文为 你解析一个架构师的能力模型。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;你能不能做一个好的架构师？&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;架构师不是界定一个技术高下的职位名称，而是一个职务。所谓职务，包括职——职位，务——工作。前者决定了你具备哪些资源，可以影响到怎样的范围，以及面向的机构，后者则简单地是你需要完成的工作列表。&lt;br /&gt;&lt;br /&gt;所以我说“架构师”不是指“一个能做架构的人”。前者是把架构师当职能，后者是当工人。能做一份工作列表中的事，并不等于就成为相应职位上的人。 在管理体系里面，你的个人特性决定了你在哪个位置，而技术技能只是做事实施的必需。架构师这个职务，同时要求较高的个人素质和技术能力，因此它的进取之路 总结起来就是：做人、做事，做架构师。&lt;br /&gt;&lt;br /&gt;因此“模型”由“个人特性”和“技术技能”两个方面构成，在第一张图中，我特别说明“个人特性”既包括人际关系的能力，也包括（具体）业务能力；“技术技能”也是如此。所以个人特性主要与“做人”有关，部分地也包含“做事”的要素。&lt;br /&gt;&lt;br /&gt;&lt;img alt="" src="http://images.csdn.net/20080530/123.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;                                            图1 架构师能力模型&lt;br /&gt;&lt;br /&gt;“有效沟通”以及“学会谈判”与做具体的事无关，是个人能力特性的公共方面。前者是过程，后者是知道如何定目标与求结果。而“风险与防备”是做事 过程控制的关键，与前面两项正好构成了一个做事基本能力的完整体系。基本上，这三项个人特性都是一个“普通程序员”所不具备的，甚至在大多数情况下，普通 程序员并不愿意去具备这样的个人特性，因为在许多陷于技术泥淖的开发人员看来：沟通总是会使事情变得更加麻烦，谈判则徒耗时间而无济于事。然而事实上，在 整个的架构决策过程中，架构师需要不停地沟通与谈判。将“架构”变成“决策”的过程，其实就是对各个技术角色（及其思想）兼容并包的过程，你需要不断地协 调需求、实现之间的各种问题，也需要面对各种投资者（时间、资金、人才等方面的决策者）进行谈判，以确定项目的规模——没有规模也就没有范围，没有范围如 何展开设计呢？&lt;br /&gt;&lt;br /&gt;一部分开发人员会认为上述过程是“项目经理”的事情，但真的如此吗？当你作为一个更高级别的架构师，以至于要影响到多个项目的决策时，你就全然不会有这种感受了。因为这种情况下，你的决策将先于项目的启动，或者说你已经不单单是一个技术角色了。&lt;br /&gt;&lt;br /&gt;设计是架构能力的一部分，但架构师不是设计师——看清楚二者之间的不同，你才真正迈出了架构师职业生涯的第一步。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;抽象是思维能力、模型化是表达能力&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;个人特性中另一个非常重要的方面是“抽象思维”，而这是与架构师角色直接相关的一种能力。这种能力既有职业技能特征，又是普遍性的能力。&lt;br /&gt;&lt;br /&gt;所谓普遍性的能力，是指“抽象”在我们——作为人这种个体的——生活中无处不在。例如我们说花、草，说桌、椅……我们用语言去指称任何一个既已存 在的（可以脱离我们的语言而自然存在的）事物时，就用到了抽象。说“桌子”的时候，既没有描述桌子的具体形式，也没有说明它的规格，但我们用这个名词时， 所有人都知道“桌子是什么”。所以，名词概念是整个抽象逻辑系统中的主体。如果失去了这些名词定义，我们基本上不能说话，也不能描述任何东西——那便到了 “只可意会不可言传”的境地。&lt;br /&gt;&lt;br /&gt;用现有的成熟语汇去描述你的系统时，大多数人会理解你所表达的含义，例如我们说“这个系统设计为一个三层结构”。然而架构师面临的系统在许多细节 上并不见得能够用成熟的语汇去描述，因此必须自已构建一个抽象系统，这就需要概念抽象能力、概念表达能力和基于概念的逻辑表达能力。&lt;br /&gt;&lt;br /&gt;概念抽象能力是一种思维能力。简单地说，就是“把目标分解或概括清楚”：你要么概而言之“它是什么”，要么详细地说明“它包括什么”。必须使用大 量的语汇来陈述这个“什么”，这不单单是表达为文字，也表达为你在思想过程中的一个完整系统。通常用的方法是“映射系统”。例如你可以用数学中的“数轴” 来映射“实数域”。将目标系统形式化为一个概念化的、可讨论的结构系统后，你的抽象过程就基本结束了。&lt;br /&gt;&lt;br /&gt;&lt;img alt="" src="http://images.csdn.net/20080530/%E6%9E%B6%E6%9E%842.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;                                            图2 能力模型中的个人特性&lt;br /&gt;&lt;br /&gt;然而这个“抽象系统”可能只构建在你的思维意识里，还必须把它描绘出来。因为不能只是你自己思考清楚，系统就能设计完成。这个“描绘”就依赖于后面两种表达能力，一种是描绘概念实体，一种是描绘实体上的逻辑——有趣的是，这似乎又回到了“程序＝结构＋算法”。&lt;br /&gt;&lt;br /&gt;现在大家回过头来看看UML，或者更多种类的ML（建模语言），他们就用于表达这两个方面的东西：要么是概念实体（例如用一个框表明系统边界），要么是实体上的逻辑（例如用箭头表明逻辑时序）。&lt;br /&gt;&lt;br /&gt;所以大家应该清楚，我们再如何称赞UML，它也只是一种对模型化系统的“表达能力”，你只能把它当一种辅助表达的工具去使用，它本身既不能帮助思考，也不见得能作为抽象过程中的或抽象思维环境中的参考。&lt;br /&gt;&lt;br /&gt;任何一个优秀的架构师都有自己独特的思考方式，这决定了他如何抽象系统，以及如何“创造性地”设计与构画这个系统。这种“独特的思考方式”贯彻他 从孩童开始的整个成长过程，直至他形成独立的社会观、人生观与世界观。他认识世界的方式和接受世界的能力决定于他如何思考，也反映了他这种思考方式的“独 特性”。但这并不表明他有特立独行的行为特性（我们这里只说他的思考方式），我们不应介意他是否用某种语言（例如UML或者形式化编程语言）来表达他的思 考结果。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;推动：设计做大，实施做小&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;架构师首先是把问题的真正目标确定下来，然后变成系统设计、平台设计或架构设计。而在此之后设计输出将会有两个方向的发展，一是被忠实地贯彻下 来，二是被变形地发展下去。两个方向都存在致命的危险：架构最终能否被完整实现。对前者来说，可能是架构设计过度，或设计本身出现了错误；后者则是对架构 直接的伤害。&lt;br /&gt;&lt;br /&gt;所以架构师必须参与实施的全程——尤其是在架构被映射为目标系统的前期。在这个阶段中，架构师的任务就是推动架构实施，以保证在项目全程的设计／ 架构／体系的一致性。除了直接跟设计师或设计团队沟通，以保证他们的设计在你可以控制的范围之内以外，架构师还必须有阶段化设计的能力。这种能力用于将一 个原本规模宏大的架构设计，变成较小的、易于实施的、对开发团队来说可控的关键点。例如在体系层次的规划上，设计可能是独立、异质的、可迁移的存储框架来 实现数据层，但在（前期的）实施上，这里可能被表达为本地数据库，并要求前端开发人员必须通过一个清晰的数据交互层来访问——例如一组数据存取接口，或一 个独立数据服务组件。开发人员可能在这里遇到障碍：因为要通过这些中间层来访问本地数据库，纯粹是多余的。然而，正是这“多余的工作”提供了系统弹性，为 并行团队开发公共存储服务争取了周期，也为将来的灵活部署与数据迁移提供了可能。&lt;br /&gt;&lt;br /&gt;这里的关键就在于，无论原始系统设定有多大，实施时总是在“做小”。每一个局部的实施块都是可控的，并为它在整个体系空间中留下了位置和接口，这 样才可能由“小的部分”做大。一个大系统的架构师可能同时在考虑许多个项目中的、不同位置的架构，并且清楚这些项目最终的总体规模。而这，就是平台架构师 和体系架构师所涉的领域。&lt;br /&gt;&lt;br /&gt;&lt;img alt="" src="http://images.csdn.net/20080530/%E6%9E%B6%E6%9E%843.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;                                            图3 架构师模型图中的“实现能力”&lt;br /&gt;&lt;br /&gt;架构真的是“好不好”的问题吗？如同我对工程的理解一样，架构问题的根本，也并不在于它是否完美或漂亮，而是在于是否合用。因此架构师必须对实施 架构的团队以及实施过程有充分了解，知道他们的能力缺陷，知道实现过程要消耗的资源，清楚每个环节可能的故障以及先兆。只有这样，架构师才能设计一个让这 个团队能实现，而且在实现过程中能受控的架构。&lt;br /&gt;&lt;br /&gt;要知道，你作为架构师被请来，不是画几张图纸交给项目经理，说：你们去做吧，做不出来是你们不会做。即使你可以身体力行，在这个团队中教大家、培 养大家，那么公司的开销呢？风险呢？这些东西难道就不考虑了？项目的周期因为实现的复杂程度而无法控制时，项目就死掉了。那么，追根究底来说，是不是架构 师的问题？是啊，你为什么会做了一份“不合用”的架构呢？——你都不知道项目如何开发、由谁实施、如何管理等等，又如何能面对这些实际环境去设计架构呢？&lt;br /&gt;&lt;br /&gt;所以这一部分能力，是要在你的开发经验、团队经验以及用人识人的经验中去找的。参考模型图的“实现能力”下的“设计能力→了解你的主要沟通对象”和“架构推行”等分支，对你或有一些可用的提示。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;局部与全局&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;架构是一个从全局到局部的过程，而实施正好反过来，是从局部到全局。这也正是“设计做大，实施做小”的另一个层面的含义。设计大才可以见到全局，才知道此全局对彼全局的影响；实施小才可能关注细节，才谈得上品质与控制。&lt;br /&gt;&lt;br /&gt;事实上，大多数情况下架构是在为“当前项目之外”去考虑，这可以看成全局关注的一个组成部分。因此我们需要界定所谓“全局”的范围：超出公司或整个产品系列、产品线或规划的范围才是多余的。&lt;br /&gt;&lt;br /&gt;所以当架构决策谈及“全局”时，其目标并不见得是“保障当前项目”，而又必须由当前项目去完成。&lt;br /&gt;&lt;br /&gt;一个经常被用到的例子是：如果仅为当前项目考虑，那么只需要做成DLL模块；如果为产品线考虑，可能会是“管道＋插件”的结构形式。而“管道＋插件”的形式显然比做成DLL模块更费时，这个时间成本（以及其它成本）就变成了当前项目的无谓开销。&lt;br /&gt;&lt;br /&gt;这种全局策略对局部计划的影响是大多数公司不能忍受的，也被很多团队所垢病。然而这却是架构师角色对体系的“近乎必然”的影响——如果你试图在体 系中引用架构师这个角色的话。一些情况下，体系能够容纳这种影响，例如“技术架构师”试图推动某种插件框架，而正好开发人员对这项技术感兴趣，那就顺其自 然地花点工夫去实现了。但如果不是这样，实施者或实施团队看不到“多余的部分”对他们的价值时，来自局部的抵触就产生了。&lt;br /&gt;&lt;br /&gt;这种情况下，平衡这些抵触就成了架构推行的实务之一。在我看来，“平衡”是全局的艺术和局部的技术。也就是说，一方面架构师要学会游说，另一方面 也要寻求更为简洁的、成本更小的实现技术。只有当整个体系都意识到（你所推行的）架构的重要性，而且实施成本在他们可以接受的范围之内时，他们才会积极行 动起来。&lt;br /&gt;&lt;br /&gt;所以所谓平衡，其实也是折衷的过程。构架师只有眼中见大，才知道哪些折衷可以做，而哪些不能。所谓设计评估（模型图中的实现能力-&gt;设计能 力-&gt;设计评估分支）并不是去分析一个设计结果好或不好，而是从中看到原始的需求，看到体系全局的意图，然后知道在将设计变得更为“适当”时可以做 哪些折衷。同样的原因，架构师也必须知道自己的决策会产生的影响，才能控制它们，以防它们变成团队的灾难。有些时候，架构师甚至需要抛弃一些特性，以使得 项目能够持续下去。因为产品的阶段性产出只是整个战略中的一个环节，而不是全部。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;其它&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;“怎么做一个架构师”这个问题得分成两个部分来看，一个是“做到”，一个是“做好”。由于架构师本身不过是一个技术职位，所以时机成熟了自然会做得到。但问题是，真有一天你被放在这个位置上了，你能做得好吗？&lt;br /&gt;&lt;br /&gt;我浏览过几套所谓培训机构的有关架构师的教程，也翻阅过一些讲架构的书。我发现他们普遍地是将架构作为一种“职业技术”来讲，就像培养程序员或者 缝纫工一样来教育。但就我的经验来说，架构并不是一件纯粹表现技术能力的工作，所以并不是翻几本书学几种方法就可以投入“实战”的。更深层的问题是，架构 师其实不是“战”出来的。昨天跟同事讨论这个话题，他把我们这几年来的一些思考用了三句话来概括，非常精彩：从无到有的，是架构；从表到里的，是抽象；从 粗到细的，是设计。&lt;br /&gt;&lt;br /&gt;那么到底什么是架构呢？从上面的概括中你是看不到答案的。到底如何做架构呢？从本文中你也是看不到答案的。然而我说，“你看不到答案”的根源其实 是在于你的眼光与心性——后面这个词换成现代白话，就是“思想”。真正阻碍了你成为优秀架构师的，也许正是你既有的知识与思想方法，扔掉它们，接受一些全 然有别的信息，也许正是良好的开端。&lt;br /&gt;&lt;br /&gt;或许你现在正愤愤然：这篇文章怎么空洞无物？——我甚至能想象到一些读者的表情。然而请在问题面前停下来，不要急于给出答案。正如你将“?”稍微变下形，它就成为了“!”一样，问题的本身，就是答案。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;作者简介&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;周爱民（aimingoo），具有十余年的软件开发、项目管理和团队建设的经验，现担任盛大网络的平台架构师，著有《大道至简》、《Delphi源代码分析》等。&lt;/h5&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-302469837080311366?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/302469837080311366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=302469837080311366' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/302469837080311366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/302469837080311366'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/03/20084.html' title='【《程序员》2008年4月刊】做人、做事，做架构师——架构师能力模型解析'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-6706256501463465313</id><published>2009-03-07T19:47:00.000+08:00</published><updated>2009-03-07T19:48:42.236+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='Pascal'/><title type='text'>【转】Delphi中常用VCL函数说明</title><content type='html'>&lt;pre id="prestr"&gt;BCB/Delphi中常用的VCL函数说明&lt;br /&gt;说明,BCB,Delphi,C++Builder,内存分配,文件操作,磁盘目录管理,字符串操作，时间日期管理，类型转换&lt;br /&gt;&lt;br /&gt;--------------------&lt;br /&gt;内存分配&lt;br /&gt;--------------------&lt;br /&gt;函数名称：AllocMem&lt;br /&gt;函数说明：在队中分配指定字节的内存块,并将分配的每一个字节初始化为 0.函数原型如下:&lt;br /&gt;void * __fastcall AllocMem(Cardinal Size);&lt;br /&gt;&lt;br /&gt;函数名称：SysFreeMem&lt;br /&gt;函数说明：释放所指定的内存块.函数原型如下:&lt;br /&gt;int __fastcall SysFreeMem(void * P);&lt;br /&gt;&lt;br /&gt;函数名称：SysReallocMem&lt;br /&gt;函数说明：要求重新分配参数Size所指定的内存.函数原型如下:&lt;br /&gt;void * __fastcall SysReallocMem(void * P , int Size);&lt;br /&gt;&lt;br /&gt;--------------------&lt;br /&gt;文件操作&lt;br /&gt;--------------------&lt;br /&gt;函数名称：ChangeFileExt&lt;br /&gt;函数说明：更改指定文件的扩展名,函数原型如下:&lt;br /&gt;AnsiString __fastcall ChangeFileExt(const AnsiString FileName,const AnsiString Extension);&lt;br /&gt;&lt;br /&gt;函数名称：DeleteFile&lt;br /&gt;函数说明：在计算机磁盘中删除指定的文件,如果操作成功,则函数返回真,函数原型如下:&lt;br /&gt;bool __fastcall DeleteFile(const AnsiString FileName);&lt;br /&gt;&lt;br /&gt;函数名称：ExtractFileDir&lt;br /&gt;函数说明：返回指定文件的工作目录,函数原型如下:&lt;br /&gt;AnsiString __fastcall ExtractFileDir(const AnsiString FileName);&lt;br /&gt;&lt;br /&gt;函数名称：ExtractFileDrive&lt;br /&gt;函数说明：返回指定文件的驱动器,函数原型如下:&lt;br /&gt;AnsiString __fastcall ExtractFileDrive(const AnsiString FileName);&lt;br /&gt;&lt;br /&gt;函数名称：ExtractFileExt&lt;br /&gt;函数说明：返回指定文件的扩展名,函数原型如下:&lt;br /&gt;AnsiString __fastcall ExtractFileExt(const AnsiString FileName);&lt;br /&gt;&lt;br /&gt;函数名称：ExtractFileName&lt;br /&gt;函数说明：返回指定文件的文件名及扩展名,函数原型如下:&lt;br /&gt;AnsiString __fastcall ExtractFileName(const AnsiString FileName);&lt;br /&gt;&lt;br /&gt;函数名称：ExtractFilePath&lt;br /&gt;函数说明：返回指定文件的工作路径,函数原型如下:&lt;br /&gt;AnsiString __fastcall ExtractFilePath(const AnsiString FileName);&lt;br /&gt;&lt;br /&gt;函数名称：FileAge&lt;br /&gt;函数说明：返回指定文件的时间标签,如果操作失败,则返回-1,函数原型如下:&lt;br /&gt;int __fastcall FileAge(const System::AnsiString FileName);&lt;br /&gt;&lt;br /&gt;函数名称：FileClose&lt;br /&gt;函数说明：关闭指定的文件,函数原型如下:&lt;br /&gt;void __fastcall FileClose(int Handle);&lt;br /&gt;&lt;br /&gt;函数名称：FileCreate&lt;br /&gt;函数说明：以指定的文件名称创建一个新的文件,如果返回为正数,表示操作成功,返回值为文件句柄,如果返回值为-1,表示操作失败.函数原型如下:&lt;br /&gt;int __fastcall FileCreate(const System ::AnsiString FileName);&lt;br /&gt;&lt;br /&gt;函数名称：FileExists&lt;br /&gt;函数说明：用于测试指定的文件是否存在,如果存在返回真,否则返回假,函数原型如下:&lt;br /&gt;bool __fastcall FileExists(const System::AnsiString FileName);&lt;br /&gt;&lt;br /&gt;函数名称：FileGetAttr&lt;br /&gt;函数说明：返回指定文件的属性,如果操作失败,则函数返回-1,函数原型如下;&lt;br /&gt;int __fastcall FileGetAttr(const System::AnsiString FileName);&lt;br /&gt;&lt;br /&gt;函数名称：FileGetDate&lt;br /&gt;函数说明：返回指定文件的DOS时间标签,如果操作失败,则近回-1,函数原型如下:&lt;br /&gt;int __fastcall FileGetDate(int Handle);&lt;br /&gt;&lt;br /&gt;函数名称：FileOpen&lt;br /&gt;函数说明：打开指定的文件,如果返回为正数,表示操作成功,返回值为文件句柄:如果返回值为-1,表示操作失败,函数原型如下:&lt;br /&gt;int __fastcall FileOpen(const System::AnsiString FileName,int Mode);&lt;br /&gt;&lt;br /&gt;函数名称：FileRead&lt;br /&gt;函数说明：从文件中读取指定字节的数据到缓冲区中,函数返回实际读取的字节数,函数原型如下;&lt;br /&gt;int __fastcall FileRead(int Handle,void *Buffer,int Count);&lt;br /&gt;&lt;br /&gt;函数名称：FileSeek&lt;br /&gt;函数说明：调整文件指针到新的位置,如果操作成功,则返回新的文件位置,如果操作失败,则函数返回-1,函数原型如下:&lt;br /&gt;int __fastcall FileSeek(int Handle,int Offset,int Origin);&lt;br /&gt;&lt;br /&gt;函数名称：FileSetAttr&lt;br /&gt;函数说明：更改指定文件的属性参数,如果操作成功,则返回0,函数原型如下;&lt;br /&gt;int __fastcall FileSetAttr(const System::AnsiString FileName,int Attr);&lt;br /&gt;&lt;br /&gt;函数名称：FileSetDate&lt;br /&gt;函数说明：更改指定文件的DOS时间标签,如果操作成功,返回0,否则返回错误代码,函数原型如下:&lt;br /&gt;int __fastcall FileSetDate(int Handle,int Age);&lt;br /&gt;&lt;br /&gt;函数名称：FileWrite&lt;br /&gt;函数说明：将缓冲区的数据写入到指定的文件的当前位置中去如果操作成功,函数返回实际写入的字节数,如果返回为-1,则表示操作产生错误,函数原型如下:&lt;br /&gt;int __fastcall FileWrite(int Handle,const void *Buffer,int Count);&lt;br /&gt;&lt;br /&gt;函数名称：FindClose&lt;br /&gt;函数说明：释放FindFirst操作所申请的内存资源,函数原型如下:&lt;br /&gt;void __fastcall FindClose(TSearchRec &amp;amp;F);&lt;br /&gt;&lt;br /&gt;函数名称：FindFirst&lt;br /&gt;函数说明：在指定的文件目录内,搜寻符合特定属性参数的文件,如果成功地查找到符合条件的文件,则函数返回0,否则函数返回一个错误代码,函数原型如下:&lt;br /&gt;int __fastcall FindFirst(const System::AnsiString Path,int Attr,TSearchRec &amp;amp;F);&lt;br /&gt;&lt;br /&gt;函数名称：FindNext&lt;br /&gt;函数说明：继续搜寻FindFirst所指定属性参数的文件,如果成功地查找到符合条件的文件,则函数返回0,否则函数返回一个错误代码,函数原型如下:&lt;br /&gt;int __fastcall FindNext(TSearchRec &amp;amp;F);&lt;br /&gt;// 本文转自 C++Builder 研究 - http://www.ccrun.com/article.asp?i=983&amp;amp;d=22l01d&lt;br /&gt;&lt;br /&gt;函数名称：RenameFile&lt;br /&gt;函数说明：更改指定文件的名称,如果操作成功,则函数返回真,函数原型如下:&lt;br /&gt;bool __fastcall RenameFile(const AnsiString OldName, const AnsiString NewName);&lt;br /&gt;&lt;br /&gt;--------------------&lt;br /&gt;磁盘目录管理&lt;br /&gt;--------------------&lt;br /&gt;函数名称：CreateDir&lt;br /&gt;函数说明：创建新的目录,如果操作成功,返回真,否则返回假,函数原型如下:&lt;br /&gt;bool __fastcall CreateDir(const AnsiString Dir);&lt;br /&gt;&lt;br /&gt;函数名称：DiskFree&lt;br /&gt;函数说明：返回指定磁盘的剩余空间,如果操作成功,返回剩余磁盘空间,如果操作失败,则返回-1,函数原型如下:&lt;br /&gt;int __fastcall DiskFree(Byte Drive);&lt;br /&gt;&lt;br /&gt;函数名称：DiskSize&lt;br /&gt;函数说明：返回指定磁盘的空间,如果操作成功,返回磁盘空间,如果操作失败,则返回-1,函数原型如下:&lt;br /&gt;int __fastcall DiskSize(Byte Drive);&lt;br /&gt;&lt;br /&gt;函数名称：GetCurrentDir&lt;br /&gt;函数说明：返回当前工作目录,函数原型如下:&lt;br /&gt;AnsiString __fastcall GetCurrentDir();&lt;br /&gt;&lt;br /&gt;函数名称：RemoveDir&lt;br /&gt;函数说明：删除指定的目录,如果操作成功,返回真,否则返回假,函数原型如下:&lt;br /&gt;bool __fastcall RemoveDir(const AnsiString Dir);&lt;br /&gt;&lt;br /&gt;函数名称：SetCurrentDir&lt;br /&gt;函数说明：设置当前工作目录,如果操作成功,则返回真,函数原型如下:&lt;br /&gt;bool __fastcall SetCurrentDir(const AnsiString Dir);&lt;br /&gt;&lt;br /&gt;--------------------&lt;br /&gt;字符串操作&lt;br /&gt;--------------------&lt;br /&gt;函数名称：CompareStr&lt;br /&gt;函数说明：比较两个AnsiString字符串,函数原型如下:&lt;br /&gt;int __fastcall CompareStr(const AnsiString S1, const AnsiString S2);&lt;br /&gt;&lt;br /&gt;函数名称：CompareText&lt;br /&gt;函数说明：比较两个AnsiString字符串,函数原型如下:&lt;br /&gt;int __fastcall CompareText(const AnsiString S1, const AnsiString S2);&lt;br /&gt;&lt;br /&gt;函数名称：LowerCase&lt;br /&gt;函数说明：将指定的AnsiString字符串转换为小写形式,函数原型如下:&lt;br /&gt;AnsiString __fastcall LowerCase(const AnsiString S);&lt;br /&gt;&lt;br /&gt;函数名称：StrAlloc&lt;br /&gt;函数说明：为字符串分配指定字节的内存,并返回内存指针,函数原型如下:&lt;br /&gt;char * __fastcall StrAlloc(Cardinal Size);&lt;br /&gt;&lt;br /&gt;函数名称：StrBufSize&lt;br /&gt;函数说明：返回*Str所指向内存的大小,函数原型如下:&lt;br /&gt;Cardinal __fastcall StrBufSize(const char * Str);&lt;br /&gt;&lt;br /&gt;函数名称：StrCat&lt;br /&gt;函数说明：连接两个字符串,并返回目的字符串指针,函数原型如下:&lt;br /&gt;char * __fastcall StrCat(char * Dest, const char * Source);&lt;br /&gt;&lt;br /&gt;函数名称：StrComp&lt;br /&gt;函数说明：两个字符串相到比较,返回比较的结果,函数原型如下:&lt;br /&gt;int __fastcall StrComp(const char * Str1, const char * Str2);&lt;br /&gt;&lt;br /&gt;函数名称：StrCopy&lt;br /&gt;函数说明：将源字符串拷贝到目的字符串中,函数原型如下:&lt;br /&gt;char * __fastcall StrCopy(char * Dest, const char * Source);&lt;br /&gt;&lt;br /&gt;函数名称：StrECopy&lt;br /&gt;函数说明：将源字符串拷贝到目的字符串中,并返回目的字符串结尾指针,函数原型如下:&lt;br /&gt;&lt;br /&gt;char * __fastcall StrECopy(char * Dest, const char * Source);&lt;br /&gt;&lt;br /&gt;函数名称：StrEnd&lt;br /&gt;函数说明：返回字符串结尾指针,函数原型如下:&lt;br /&gt;char * __fastcall StrEnd(const char * Str);&lt;br /&gt;&lt;br /&gt;函数名称：StrIComp&lt;br /&gt;函数说明：两个字符串相互比较(不论大小写),返回比较的结果,函数原型如下:&lt;br /&gt;int __fastcall StrIComp(const char * Str1, const char * Str2);&lt;br /&gt;&lt;br /&gt;函数名称：StrLCat&lt;br /&gt;函数说明：将指定数目的源字符串连接到目的字符串,并返回目的字符串指针,函数原型如下:&lt;br /&gt;char * __fastcall StrLCat(char * Dest, const char * Source, Cardinal MaxLen);&lt;br /&gt;&lt;br /&gt;函数名称：StrLComp&lt;br /&gt;函数说明：对两个字符串指定数目的字符进行比较操作,函数原型如下:&lt;br /&gt;int __fastcall StrLComp(const char * Str1, const char * Str2, Cardinal MaxLen);&lt;br /&gt;&lt;br /&gt;函数名称：StrLCopy&lt;br /&gt;函数说明：将源字符串指定数目的字符拷贝到目的字符串中,并返回目的字符串指针,函数原型如下:&lt;br /&gt;char * __fastcall StrLCopy(char * Dest, const char * Source, Cardinal MaxLen);&lt;br /&gt;&lt;br /&gt;函数名称：StrLen&lt;br /&gt;函数说明：返回字符串的长度,函数原型如下:&lt;br /&gt;Cardinal __fastcall StrLen(const char * Str);&lt;br /&gt;&lt;br /&gt;函数名称：StrLower&lt;br /&gt;函数说明：将字符串转换为小写形式,函数原型如下:&lt;br /&gt;char * __fastcall StrLower(char * Str);&lt;br /&gt;&lt;br /&gt;函数名称：StrMove&lt;br /&gt;函数说明：从源字符串向目的字符串拷贝指定数目的字符,函数原型如下:&lt;br /&gt;char * __fastcall StrMove(char * Dest, const char * Source, Cardinal Count);&lt;br /&gt;&lt;br /&gt;函数名称：StrNew&lt;br /&gt;函数说明：在堆中为指定字符串分配空间,并将字符串拷贝到此空间中,函数原型如下:&lt;br /&gt;char * __fastcall StrNew(const char * Str);&lt;br /&gt;&lt;br /&gt;函数名称：StrPas&lt;br /&gt;函数说明：将指定的字符串转换为AnsiString类型字符串对象,函数原型如下:&lt;br /&gt;AnsiString __fastcall StrPas(const char * Str);&lt;br /&gt;&lt;br /&gt;函数名称：StrPCopy&lt;br /&gt;函数说明：将AnsiString类型的源字符串拷贝到目的字符串中,并返回目的字符串指针,函数原型如下:&lt;br /&gt;char * __fastcall StrPCopy(char * Dest, const AnsiString Source);&lt;br /&gt;&lt;br /&gt;函数名称：StrPLCopy&lt;br /&gt;函数说明：将源字符串(AnsiString类型)指定数目的字符拷贝到目的字符串中,并返回目的字符串指针,函数原型如下:&lt;br /&gt;char * __fastcall StrPLCopy(char * Dest, const AnsiString Source, Cardinal MaxLen);&lt;br /&gt;&lt;br /&gt;函数名称：StrPos&lt;br /&gt;函数说明：在Strl所指定的字符串中寻找Str2所指定的子字符串,并返回Str2在Str2中第一个子字符的指针,函数原型如下:&lt;br /&gt;char * __fastcall StrPos(const char * Str1, const char * Str2);&lt;br /&gt;&lt;br /&gt;函数名称：StrRScan&lt;br /&gt;函数说明：在指定的字符串中寻找特定的字符,并返回字符串中最后一个特定字符的指针,函数原型如下:&lt;br /&gt;char * __fastcall StrRScan(const char * Str, char Chr);&lt;br /&gt;&lt;br /&gt;函数名称：StrScan&lt;br /&gt;函数说明：在指定的字符串中寻找特定的字符,并返回字符串中第一个特定字符的指针,函数原型如下:&lt;br /&gt;char * __fastcall StrScan(const char * Str, char Chr);&lt;br /&gt;&lt;br /&gt;函数名称：StrUpper&lt;br /&gt;函数说明：将字符串转换为大写形式,函数原型如下:&lt;br /&gt;char * __fastcall StrUpper(char * Str);&lt;br /&gt;&lt;br /&gt;函数名称：UpperCase&lt;br /&gt;函数说明：将指定的AnsiString字符串转换为大写形式,函数原型如下:&lt;br /&gt;AnsiString __fastcall UpperCase(const AnsiString S);&lt;br /&gt;&lt;br /&gt;--------------------&lt;br /&gt;类型转换&lt;br /&gt;--------------------&lt;br /&gt;函数名称：FloatToStr&lt;br /&gt;函数说明：将浮点数转换为AnsiString字符串,函数原型如下:&lt;br /&gt;AnsiString __fastcall FloatToStr(Extended Value);&lt;br /&gt;&lt;br /&gt;函数名称：FloatToStrF&lt;br /&gt;函数说明：将浮点数转换为指定格式的AnsiString字符串,函数原型如下:&lt;br /&gt;AnsiString __fastcall FloatToStrF(Extended Value, TFloatFormat Format,int Precision, int Digits);&lt;br /&gt;&lt;br /&gt;函数名称：IntToHex&lt;br /&gt;函数说明：将整数转换为十六进制字符串,函数原型如下:&lt;br /&gt;AnsiString __fastcall IntToHex(int Value, int Digits);&lt;br /&gt;&lt;br /&gt;函数名称：IntToStr&lt;br /&gt;函数说明：将整数转换为AnsiString字符串,函数原型如下:&lt;br /&gt;AnsiString __fastcall IntToStr(int Value);&lt;br /&gt;&lt;br /&gt;函数名称：StrToFloat&lt;br /&gt;函数说明：将AnsiString字符串转换为一个浮点数值,函数原型如下:&lt;br /&gt;Extended __fastcall StrToFloat(const AnsiString S);&lt;br /&gt;&lt;br /&gt;函数名称：StrToInt&lt;br /&gt;函数说明：将AnsiString字符串转换为整数值,如果不能进行转换,则产生EConvertError异常,函数原型如下:&lt;br /&gt;int __fastcall StrToInt(const AnsiString S);&lt;br /&gt;&lt;br /&gt;函数名称：StrToIntDef&lt;br /&gt;函数说明：将AnsiString字符串转换为一个数值,函数原型如下:&lt;br /&gt;int __fastcall StrToIntDef(const System::AnsiString S,int Default);&lt;br /&gt;&lt;br /&gt;--------------------&lt;br /&gt;时间日期管理&lt;br /&gt;--------------------&lt;br /&gt;函数名称：Date&lt;br /&gt;函数说明：返回TDateTime对象,包含当前的年月日信息,函数原型如下:&lt;br /&gt;System::TDateTime __fastcall Date(void);&lt;br /&gt;&lt;br /&gt;函数名称：DateTimetoStr&lt;br /&gt;函数说明：将TDateTime对象转换为字符串对象,函数原型如下:&lt;br /&gt;AnsiString __fastcall DateTimeToStr(System::TDateTime DateTime);&lt;br /&gt;&lt;br /&gt;函数名称：DatetimeToString&lt;br /&gt;函数说明：将TDateTime对象转换为指定格式的字符串对象,函数原型如下:&lt;br /&gt;void __fastcall DateTimeToString(AnsiString &amp;amp;Result, const AnsiString Format,System::TDateTime DateTime);&lt;br /&gt;&lt;br /&gt;函数名称：DateTimeToSystemTime&lt;br /&gt;函数说明：将TDateTime对象转换为操作系统时间,函数原型如下:&lt;br /&gt;void __fastcall DateTimeToSystemTime( System::TDateTime DateTime, _SYSTEMTIME &amp;amp;SystemTime);&lt;br /&gt;&lt;br /&gt;函数名称：DateToStr&lt;br /&gt;函数说明：将TDateTime对象(包含当前年月日信息)转换为字符串对象,函数原型如下:&lt;br /&gt;AnsiString __fastcall DateToStr(System::TDateTime Date);&lt;br /&gt;&lt;br /&gt;函数名称：Now&lt;br /&gt;函数说明：返回TDateTime对象,获取当前的日期和时间信息,函数原型如下:&lt;br /&gt;System::TDateTime __fastcall Now(void);&lt;br /&gt;&lt;br /&gt;函数名称：StrToDate&lt;br /&gt;函数说明：将字符串对象转换为年月日对象,函数原型如下:&lt;br /&gt;System::TDateTime __fastcall StrToDate(const AnsiString S);&lt;br /&gt;&lt;br /&gt;函数名称：StrToDateTime&lt;br /&gt;函数说明：将字符串对象转换为年月日时间对象,函数原型如下:&lt;br /&gt;System::TDateTime __fastcall StrToDateTime(const AnsiString S);&lt;br /&gt;&lt;br /&gt;函数名称：StrToTime&lt;br /&gt;函数说明：将字符串对象转换时间对象,函数原型如下:&lt;br /&gt;System::TDateTime __fastcall StrToTime(const AnsiString S);&lt;br /&gt;&lt;br /&gt;函数名称：SystemTimeToDateTime&lt;br /&gt;函数说明：将操作系统时间转换为TDateTime对象,函数原型如下:&lt;br /&gt;System::TDateTime __fastcall SystemTimeToDateTime(const _SYSTEMTIME &amp;amp;SystemTime);&lt;br /&gt;&lt;br /&gt;函数名称：Time&lt;br /&gt;函数说明：返回TDateTime对象,包含当前的时间信息,函数原型如下:&lt;br /&gt;System::TDateTime __fastcall Time(void);&lt;br /&gt;&lt;br /&gt;函数名称：TimeToStr&lt;br /&gt;函数说明：将当前日期转换为字符串对象,函数原型如下:&lt;br /&gt;AnsiString __fastcall TimeToStr(System::TDateTime Time);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;本文档是ccrun(老妖)根据网上资料整理而成。&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-6706256501463465313?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/6706256501463465313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=6706256501463465313' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/6706256501463465313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/6706256501463465313'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/03/delphivcl.html' title='【转】Delphi中常用VCL函数说明'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-2721154996764226203</id><published>2009-03-07T16:25:00.001+08:00</published><updated>2009-03-07T16:25:35.906+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='Pascal'/><title type='text'>Delphi中属性的使用（unit2）</title><content type='html'>unit Unit2;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  Windows, Messages, SysUtils, Variants, Classes;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;// 基类employee&lt;br /&gt;employee=class&lt;br /&gt;protected&lt;br /&gt;  name:string;  // 姓名&lt;br /&gt;  empno:string; // 雇员号&lt;br /&gt;  accumpay:real;// 月薪&lt;br /&gt;public&lt;br /&gt;  constructor create();// 构造函数&lt;br /&gt;  Procedure  pay(); Virtual;  // 计算月薪函数（虚拟方法）&lt;br /&gt;  Procedure  displaystatus(); Virtual;// 显示信息函数（虚拟方法）&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;//技术员类technician&lt;br /&gt;technician=class(employee)&lt;br /&gt;private&lt;br /&gt;  hrRate:string;//每小时酬金&lt;br /&gt;  hr:string; //当月工作时数&lt;br /&gt;  function GetHourlyRate():string;&lt;br /&gt;  procedure SetHourlyRate(Value: string);&lt;br /&gt;  function GetWorkHours():string;&lt;br /&gt;  procedure SetWorkHours(Value: string);&lt;br /&gt;&lt;br /&gt;public&lt;br /&gt;  property MyHourlyRate: string read GetHourlyRate write SetHourlyRate;&lt;br /&gt;  property MyWorkHours: string read GetWorkHours write SetWorkHours;&lt;br /&gt;  Procedure pay(); override;   //计算月薪函数（覆盖基类中同名方法）&lt;br /&gt;  Procedure displaystatus();override;  //显示信息函数（覆盖基类中同名方法）&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;//销售员类（派生于employee）&lt;br /&gt;salesman=class(employee)&lt;br /&gt;private&lt;br /&gt;  comm:string;//提取销售额的百分比&lt;br /&gt;  sale:string;//销售额&lt;br /&gt;  function GetCommrateRate():string;&lt;br /&gt;  procedure SetCommrateRate(Value: string);&lt;br /&gt;  function GetSales():string;&lt;br /&gt;  procedure SetSales(Value: string);&lt;br /&gt;public&lt;br /&gt;  property MyCommRate: string read GetCommrateRate write SetCommrateRate;&lt;br /&gt;  property MySales: string read GetSales write SetSales;&lt;br /&gt;  Procedure pay(); override; //计算月薪函数（覆盖基类中同名方法）&lt;br /&gt;  Procedure displaystatus(); override; //显示信息函数（覆盖基类中同名方法）&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  tech: technician;&lt;br /&gt;  sales: salesman;&lt;br /&gt;  name1,number,result1: string;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;//employee类的函数实现&lt;br /&gt;constructor employee.create();&lt;br /&gt;begin&lt;br /&gt;  name:=name1;    // name1为存放雇员姓名的全局变量&lt;br /&gt;  empno:=number;  // number为存放雇员号的全局变量&lt;br /&gt;  accumpay:=0.0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;Procedure employee.pay();&lt;br /&gt;  begin&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;Procedure employee.displaystatus();&lt;br /&gt;  begin&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;//技术员类的函数实现&lt;br /&gt;Procedure technician.pay();&lt;br /&gt;  begin&lt;br /&gt;    accumpay:=strtofloat(GetHourlyRate)*strtofloat(GetWorkHours);&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;Procedure technician.displaystatus();&lt;br /&gt;  begin&lt;br /&gt;    result1:=empno+'号技术员'+name+'的本月工资为    '+floattostr(accumpay);&lt;br /&gt;  end;&lt;br /&gt;//技术员工资结算&lt;br /&gt;function technician.GetHourlyRate(): string;&lt;br /&gt;  begin&lt;br /&gt;    GetHourlyRate:=hrRate;&lt;br /&gt;  end;&lt;br /&gt;procedure technician.SetHourlyRate(Value: string);&lt;br /&gt;  begin&lt;br /&gt;    hrRate:=Value;&lt;br /&gt;  end;&lt;br /&gt;function technician.GetWorkHours(): string;&lt;br /&gt;  begin&lt;br /&gt;    GetWorkHours:=hr;&lt;br /&gt;  end;&lt;br /&gt;procedure technician.SetWorkHours(Value: string);&lt;br /&gt;  begin&lt;br /&gt;    hr:=value;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;//销售员类的函数实现&lt;br /&gt;Procedure salesman.pay();&lt;br /&gt;  begin&lt;br /&gt;    accumpay:=strtofloat(GetCommrateRate)*strtofloat(GetSales);&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;Procedure salesman.displaystatus();&lt;br /&gt;  begin&lt;br /&gt;    result1:=empno+'号销售员'+name+'的本月工资为    '+floattostr(accumpay);&lt;br /&gt;  end;&lt;br /&gt;//销售人员工资结算&lt;br /&gt;function salesman.GetCommrateRate(): string;&lt;br /&gt;  begin&lt;br /&gt;    GetCommrateRate:=comm;&lt;br /&gt;  end;&lt;br /&gt;procedure salesman.SetCommrateRate(Value: string);&lt;br /&gt;  begin&lt;br /&gt;    comm:=value;&lt;br /&gt;  end;&lt;br /&gt;function salesman.GetSales(): string;&lt;br /&gt;  begin&lt;br /&gt;    GetSales:=sale;&lt;br /&gt;  end;&lt;br /&gt;procedure salesman.SetSales(Value: string);&lt;br /&gt;  begin&lt;br /&gt;    sale:=value;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;end.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-2721154996764226203?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/2721154996764226203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=2721154996764226203' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/2721154996764226203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/2721154996764226203'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/03/delphiunit2.html' title='Delphi中属性的使用（unit2）'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-2862129753045925344</id><published>2009-03-07T16:23:00.000+08:00</published><updated>2009-03-07T16:24:33.362+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='Pascal'/><title type='text'>Delphi中属性的使用（unit1）</title><content type='html'>unit Unit1;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,&lt;br /&gt;  Dialogs, StdCtrls, Buttons;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  TForm1 = class(TForm)&lt;br /&gt;    Label1: TLabel;&lt;br /&gt;    RadioButton1: TRadioButton;&lt;br /&gt;    RadioButton2: TRadioButton;&lt;br /&gt;    tch: TGroupBox;&lt;br /&gt;    sls: TGroupBox;&lt;br /&gt;    Label2: TLabel;&lt;br /&gt;    Label3: TLabel;&lt;br /&gt;    Label4: TLabel;&lt;br /&gt;    jsyno: TEdit;&lt;br /&gt;    jsyxm: TEdit;&lt;br /&gt;    hours: TEdit;&lt;br /&gt;    Label5: TLabel;&lt;br /&gt;    xsyno: TEdit;&lt;br /&gt;    Label6: TLabel;&lt;br /&gt;    xsyxm: TEdit;&lt;br /&gt;    xsl: TEdit;&lt;br /&gt;    Label7: TLabel;&lt;br /&gt;    Label8: TLabel;&lt;br /&gt;    result: TEdit;&lt;br /&gt;    BitBtn1: TBitBtn;&lt;br /&gt;    BitBtn2: TBitBtn;&lt;br /&gt;    lblHrRate: TLabel;&lt;br /&gt;    edtHrRate: TEdit;&lt;br /&gt;    lblComm: TLabel;&lt;br /&gt;    edtComm: TEdit;&lt;br /&gt;    GroupBox3: TGroupBox;&lt;br /&gt;    procedure BitBtn1Click(Sender: TObject);&lt;br /&gt;    procedure BitBtn2Click(Sender: TObject);&lt;br /&gt;    procedure FormCreate(Sender: TObject);&lt;br /&gt;    procedure ResetTech(flag: boolean); //设置只读属性&lt;br /&gt;    procedure ResetSale(flag: boolean);&lt;br /&gt;    procedure RadioButton1Click(Sender: TObject);&lt;br /&gt;    procedure RadioButton2Click(Sender: TObject); //flag标志着只读属性，true则只读，false则可修改&lt;br /&gt;    procedure SetEmptyTech();&lt;br /&gt;    procedure SetEmptySale();&lt;br /&gt;  private&lt;br /&gt;    { Private declarations }&lt;br /&gt;  public&lt;br /&gt;    { Public declarations }&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  Form1: TForm1;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;uses Unit2;&lt;br /&gt;{$R *.dfm}&lt;br /&gt;&lt;br /&gt;procedure TForm1.BitBtn1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;  t1: technician;&lt;br /&gt;  s1: salesman;&lt;br /&gt;begin&lt;br /&gt;  if RadioButton1.Checked =true then&lt;br /&gt;  begin&lt;br /&gt;  // 计算技术员的月薪&lt;br /&gt;    number:=jsyno.Text ;&lt;br /&gt;    name1:= jsyxm.Text ;&lt;br /&gt;    t1:=technician.create ();&lt;br /&gt;    t1.MyHourlyRate := edtHrRate.Text;&lt;br /&gt;    t1.MyWorkHours := hours.Text;&lt;br /&gt;    t1.pay ();&lt;br /&gt;    t1.displaystatus ();&lt;br /&gt;  end&lt;br /&gt;  else begin&lt;br /&gt;  // 计算销售员的月薪&lt;br /&gt;    number:= xsyno.Text ;&lt;br /&gt;    name1:= xsyxm.Text ;&lt;br /&gt;    s1:=salesman.create ();&lt;br /&gt;    s1.MySales := xsl.Text;&lt;br /&gt;    s1.MyCommRate := edtComm.Text;&lt;br /&gt;    s1.pay ();&lt;br /&gt;    s1.displaystatus ();&lt;br /&gt;  end;&lt;br /&gt;  // 将信息显示在result文本框中&lt;br /&gt;  SetEmptyTech();&lt;br /&gt;  SetEmptySale();&lt;br /&gt;  result.Text :=result1;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.BitBtn2Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;   form1.Close;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.ResetTech(flag: boolean); //根据radio button选择情况设置各输入组的只读情况&lt;br /&gt;begin&lt;br /&gt;  if flag = true then&lt;br /&gt;  begin&lt;br /&gt;    jsyno.ReadOnly := true;&lt;br /&gt;    jsyxm.ReadOnly := true;&lt;br /&gt;    hours.ReadOnly := true;&lt;br /&gt;    edtHrRate.ReadOnly := true;&lt;br /&gt;    jsyno.Enabled := false;&lt;br /&gt;    jsyxm.Enabled := false;&lt;br /&gt;    hours.Enabled := false;&lt;br /&gt;    edtHrRate.Enabled := false;&lt;br /&gt;  end&lt;br /&gt;  else begin&lt;br /&gt;    jsyno.ReadOnly := false;&lt;br /&gt;    jsyxm.ReadOnly := false;&lt;br /&gt;    hours.ReadOnly := false;&lt;br /&gt;    edtHrRate.ReadOnly := false;&lt;br /&gt;    jsyno.Enabled := true;&lt;br /&gt;    jsyxm.Enabled := true;&lt;br /&gt;    hours.Enabled := true;&lt;br /&gt;    edtHrRate.Enabled := true;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.ResetSale(flag: boolean);&lt;br /&gt;begin&lt;br /&gt;  if flag = true then&lt;br /&gt;  begin&lt;br /&gt;    xsyno.ReadOnly := true;&lt;br /&gt;    xsyxm.ReadOnly := true;&lt;br /&gt;    xsl.ReadOnly := true;&lt;br /&gt;    edtComm.ReadOnly := true;&lt;br /&gt;    xsyno.Enabled := false;&lt;br /&gt;    xsyxm.Enabled := false;&lt;br /&gt;    xsl.Enabled := false;&lt;br /&gt;    edtComm.Enabled := false;&lt;br /&gt;  end&lt;br /&gt;  else begin&lt;br /&gt;    xsyno.ReadOnly := false;&lt;br /&gt;    xsyxm.ReadOnly := false;&lt;br /&gt;    xsl.ReadOnly := false;&lt;br /&gt;    edtComm.ReadOnly := false;&lt;br /&gt;    xsyno.Enabled := true;&lt;br /&gt;    xsyxm.Enabled := true;&lt;br /&gt;    xsl.Enabled := true;&lt;br /&gt;    edtComm.Enabled := true;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  if RadioButton1.Checked =true then//选中了技术员&lt;br /&gt;  begin&lt;br /&gt;    ResetTech(false); //将技术员的只读属性设置为false&lt;br /&gt;    ResetSale(true);//将销售员的只读属性设置为true&lt;br /&gt;  end&lt;br /&gt;  else begin&lt;br /&gt;    ResetTech(true); //将技术员的只读属性设置为true&lt;br /&gt;    ResetSale(false);//将销售员的只读属性设置为false&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.RadioButton1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  ResetTech(false); //将技术员的只读属性设置为false&lt;br /&gt;  ResetSale(true);//将销售员的只读属性设置为true&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.RadioButton2Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  ResetTech(true); //将技术员的只读属性设置为true&lt;br /&gt;  ResetSale(false);//将销售员的只读属性设置为false&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.SetEmptySale;&lt;br /&gt;begin&lt;br /&gt;  xsyno.Text := '';&lt;br /&gt;  xsyxm.Text := '';&lt;br /&gt;  xsl.Text := '';&lt;br /&gt;  edtComm.Text := '';&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.SetEmptyTech;&lt;br /&gt;begin&lt;br /&gt;  jsyno.Text := '';&lt;br /&gt;  jsyxm.Text := '';&lt;br /&gt;  hours.Text := '';&lt;br /&gt;  edtHrRate.Text := '';&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-2862129753045925344?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/2862129753045925344/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=2862129753045925344' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/2862129753045925344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/2862129753045925344'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/03/delphiunit1.html' title='Delphi中属性的使用（unit1）'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-48399425127617036</id><published>2009-03-07T10:22:00.001+08:00</published><updated>2009-03-07T10:38:29.235+08:00</updated><title type='text'>僵尸网络</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NQUr3ozUHrQ/SbHdoxe0h-I/AAAAAAAAAEo/A6pQ39mqQYQ/s1600-h/507c3897be2a0a7e54fb967d.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 215px;" src="http://3.bp.blogspot.com/_NQUr3ozUHrQ/SbHdoxe0h-I/AAAAAAAAAEo/A6pQ39mqQYQ/s320/507c3897be2a0a7e54fb967d.jpg" alt="" id="BLOGGER_PHOTO_ID_5310269128193640418" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;              僵尸网络指采用一种或多种传播手段，将大量主机感染bot程序（僵尸程序），从而在控制者和被感染主机之间所形成的一个可一对多控制的网络。&lt;br /&gt;　　攻击者通过各种途径传播僵尸程序感染互联网上的大量主机，而被感染的主机将通过一个控制信道接 收攻击者的指令，组成一个僵尸网络。之所以用僵尸网络这个名字，是为了更形象的让人们认识到这类危害的特点：众多的计算机在不知不觉中如同中国古老传说中 的僵尸群一样被人驱赶和指挥着，成为被人利用的一种工具。&lt;br /&gt;　　在Botnet的概念中有这样几个关键词。“bot程序”是robot的缩写，是指实现恶意控 制功能的程序代码；“僵尸计算机”就是被植入bot的计算机；“控制服务器（Control Server）”是指控制和通信的中心服务器，在基于IRC（因特网中继聊天）协议进行控制的Botnet中，就是指提供IRC聊天服务的网络&lt;a target="_blank" href="http://baike.baidu.com/view/899.htm"&gt;&lt;/a&gt;。&lt;br /&gt;　　&lt;b&gt;Botnet&lt;/b&gt;&lt;br /&gt;　　首先是一个可控制的网络，这个网络并不是指物理意义上具&lt;span style="text-decoration: underline;"&gt;有拓扑结构&lt;/span&gt;&lt;a target="_blank" href="http://baike.baidu.com/view/82343.htm"&gt;&lt;/a&gt;的网络，它具有一定的分布性，随着bot程序的不断传播而不断有新位置的僵尸计算机添加到这个网络中来。&lt;br /&gt;　　其次，这个网络是采用了一定的恶意传播手段形成的，例如主动漏洞攻击，邮件病毒等各种病毒与蠕虫的传播手段，都可以用来进行Botnet的传播，从这个意义上讲，恶意程序bot也是一种病毒或蠕虫。&lt;br /&gt;　　最后一点，也是Botnet的最主要的特点，就是可以一对多地执行相同的恶意行为，比如可以同 时对某目标网站进行分布式拒绝服务（DDos）攻击，同时发送大量的垃圾邮件等，而正是这种一对多的控制关系，使得攻击者能够以极低的代价高效地控制大量 的资源为其服务，这也是Botnet攻击模式近年来受到黑客青睐的根本原因。在执行恶意行为的时候，Botnet充当了一个攻击平台的角色，这也就使得 Botnet不同于简单的病毒和蠕虫，也与通常意义的木马有所不同。&lt;br /&gt;　　僵尸网络是互联网上受到黑客集中控制的一群计算机，往往被黑客用来发起大规模的网络攻击，如分 布式拒绝服务攻击(DDoS)、海量垃圾邮件等，同时黑客控制的这些计算机所保存的信息，譬如银行帐户的密码与社会安全号码等也都可被黑客随意“取用”。 因此，不论是对网络安全运行还是用户数据安全的保护来说，僵尸网络都是极具威胁的隐患。僵尸网络的威胁也因此成为目前一个国际上十分关注的问题。然而，发 现一个僵尸网络是非常困难的，因为黑客通常远程、隐蔽地控制分散在网络上的“僵尸主机”，这些主机的用户往往并不知情。因此，僵尸网络是目前互联网上黑客 最青睐的作案工具。&lt;br /&gt;　　对网友而言，感染上“僵尸病毒”却十分容易。网络上搔首弄姿的美女、各种各样有趣的小游戏，都 在吸引着网友轻轻一点鼠标。但事实上，点击之后毫无动静，原来一切只是骗局，意在诱惑网友下载有问题的软件。一旦这种有毒的软件进入到网友电脑，远端主机 就可以发号施令，对电脑进行操控。&lt;br /&gt;　　专家表示，每周平均新增数十万台任人遥控的僵尸电脑，任凭远端主机指挥，进行各种不法活动。多数时候，僵尸电脑的根本不晓得自己已被选中，任人摆布。&lt;br /&gt;　　僵尸网络之所以出现，在家高速上网越来越普遍也是原因。高速上网可以处理(或制造)更多的流量，但高速上网家庭习惯将电脑长时间开机，唯有电脑开机，远端主机才可以对僵尸电脑发号施令。&lt;br /&gt;　　网络专家称：“重要的硬件设施虽然非常重视杀毒、防黑客，但网络真正的安全漏洞来自于住家用户，这些个体户欠缺自我保护的知识，让网络充满地雷，进而对其他用户构成威胁。”&lt;br /&gt;　　Botnet的发展过程&lt;br /&gt;　　Botnet是随着自动智能程序的应用而逐渐发展起来的。在早期的IRC聊天网络中，有一些服 务是重复出现的，如防止频道被滥用、管理权限、记录频道事件等一系列功能都可以由管理者编写的智能程序所完成。于是在1993 年，在IRC 聊天网络中出现了Bot 工具——Eggdrop，这是第一个bot程序，能够帮助用户方便地使用IRC 聊天网络。这种bot的功能是良性的，是出于服务的目的，然而这个设计思路却为黑客所利用，他们编写出了带有恶意的Bot 工具，开始对大量的受害主机进行控制，利用他们的资源以达到恶意目标。&lt;br /&gt;　　20世纪90年代末，随着分布式拒绝服务攻击概念的成熟，出现了大量分布式拒绝服务攻击工具如TFN、TFN2K和Trinoo，攻击者利用这些工具控制大量的被感染主机，发动分布式拒绝服务攻击。而这些被控主机从一定意义上来说已经具有了Botnet的雏形。&lt;br /&gt;　　1999 年，在第八届DEFCON 年会上发布的SubSeven 2.1 版开始使用IRC 协议构建攻击者对僵尸主机的控制信道，也成为第一个真正意义上的bot程序。随后基于IRC协议的bot程序的大量出现，如GTBot、Sdbot 等，使得基于IRC协议的Botnet成为主流。&lt;br /&gt;　　2003 年之后，随着蠕虫技术的不断成熟，bot的传播开始使用蠕虫的主动传播技术，从而能够快速构建大规模的Botnet。著名的有2004年爆发的 Agobot/Gaobot 和rBot/Spybot。同年出现的Phatbot 则在Agobot 的基础上，开始独立使用P2P 结构构建控制信道。&lt;br /&gt;　　从良性bot的出现到恶意bot的实现，从被动传播到利用蠕虫技术主动传播，从使用简单的IRC协议构成控制信道到构建复杂多变P2P结构的控制模式，Botnet逐渐发展成规模庞大、功能多样、不易检测的恶意网络，给当前的网络安全带来了不容忽视的威胁。&lt;br /&gt;　　Botnet的工作过程&lt;br /&gt;　　Botnet的工作过程包括传播、加入和控制三个阶段。&lt;br /&gt;　　一个Botnet首先需要的是具有一定规模的被控计算机，而这个规模是逐渐地随着采用某种或某几种传播手段的bot程序的扩散而形成的，在这个传播过程中有如下几种手段：&lt;br /&gt;　　（1）主动攻击漏洞。其原理是通过攻击系统所存在的漏洞获得访问权，并在Shellcode 执行bot程序注入代码，将被攻击系统感染成为僵尸主机。属于此类的最基本的感染途径是攻击者手动地利用一系列黑客工具和脚本进行攻击，获得权限后下载 bot程序执行。攻击者还会将僵尸程序和蠕虫技术进行结合，从而使bot程序能够进行自动传播，著名的bot样本AgoBot，就是实现了将bot程序的 自动传播。&lt;br /&gt;　　（2）邮件病毒。bot程序还会通过发送大量的邮件病毒传播自身，通常表现为在邮件附件中携带 僵尸程序以及在邮件内容中包含下载执行bot程序的链接，并通过一系列社会工程学的技巧诱使接收者执行附件或点击链接，或是通过利用邮件客户端的漏洞自动 执行，从而使得接收者主机被感染成为僵尸主机。&lt;br /&gt;　　（3）即时通信软件。利用即时通信软件向好友列表发送执行僵尸程序的链接，并通过社会工程学技巧诱骗其点击，从而进行感染，如2005年年初爆发的MSN性感鸡（Worm.MSNLoveme）采用的就是这种方式。&lt;br /&gt;　　（4）恶意网站脚本。攻击者在提供Web服务的网站中在HTML页面上绑定恶意的脚本，当访问者访问这些网站时就会执行恶意脚本，使得bot程序下载到主机上，并被自动执行。&lt;br /&gt;　　（5）特洛伊木马。伪装成有用的软件，在网站、FTP 服务器、P2P 网络中提供，诱骗用户下载并执行。&lt;br /&gt;　　通过以上几种传播手段可以看出，在Botnet的形成中传播方式与蠕虫和病毒以及功能复杂的间谍软件很相近。&lt;br /&gt;　　在加入阶段，每一个被感染主机都会随着隐藏在自身上的bot程序的发作而加入到Botnet中 去，加入的方式根据控制方式和通信协议的不同而有所不同。在基于IRC协议的Botnet中，感染bot程序的主机会登录到指定的服务器和频道中去，在登 录成功后，在频道中等待控制者发来的恶意指令。图2为在实际的Botnet中看到的不断有新的bot加入到Botnet中的行为。&lt;br /&gt;　　在控制阶段，攻击者通过中心服务器发送预先定义好的控制指令，让被感染主机执行恶意行为，如发起DDos攻击、窃取主机敏感信息、更新升级恶意程序等。图3为观测到的在控制阶段向内网传播恶意程序的Botnet行为。&lt;br /&gt;　　Botnet的分类&lt;br /&gt;　　Botnet根据分类标准的不同，可以有许多种分类。&lt;br /&gt;　　按bot程序的种类分类&lt;br /&gt;　　（1）Agobot/Phatbot/Forbot/XtremBot。这可能是最出名的僵尸 工具。防病毒厂商Spphos 列出了超过500种已知的不同版本的Agobot(Sophos 病毒分析)，这个数目也在稳步增长。僵尸工具本身使用跨平台的C++写成。Agobot 最新可获得的版本代码清晰并且有很好的抽象设计，以模块化的方式组合，添加命令或者其他漏洞的扫描器及攻击功能非常简单，并提供像文件和进程隐藏的 Rootkit 能力在攻陷主机中隐藏自己。在获取该样本后对它进行逆向工程是比较困难的，因为它包含了监测调试器(Softice 和O11Dbg)和虚拟机（VMware 和Virtual PC)的功能。&lt;br /&gt;　　（2）SDBot/RBot/UrBot/SpyBot/。这个家族的恶意软件目前是最活跃的bot程序软件，SDBot 由C语言写成。它提供了和Agobot 一样的功能特征，但是命令集没那么大，实现也没那么复杂。它是基于IRC协议的一类bot程序。&lt;br /&gt;　　（3）GT-Bots。GT-Bots是基于当前比较流行的IRC客户端程序mIRC编写 的，GT是（Global Threat）的缩写。这类僵尸工具用脚本和其他二进制文件开启一个mIRC聊天客户端, 但会隐藏原mIRC窗口。通过执行mIRC 脚本连接到指定的服务器频道上，等待恶意命令。这类bot程序由于捆绑了mIRC程序，所以体积会比较大，往往会大于1MB。&lt;br /&gt;　　按Botnet的控制方式分类&lt;br /&gt;　　（1）IRC Botnet。是指控制和通信方式为利用IRC协议的Botnet，形成这类Botnet的主要bot程序有spybot、GTbot和SDbot，目前绝大多数Botnet属于这一类别。&lt;br /&gt;　　（2）AOL Botnet。与IRC Bot类似，AOL为美国在线提供的一种即时通信服务，这类Botnet是依托这种即时通信服务形成的网络而建立的，被感染主机登录到固定的服务器上接收 控制命令。AIM-Canbot和Fizzer就采用了AOL Instant Messager实现对Bot的控制。&lt;br /&gt;　　（3）P2P Botnet。这类Botnet中使用的bot程序本身包含了P2P的客户端，可以连入采用了Gnutella技术（一种开放源码的文件共享技术）的服务 器，利用WASTE文件共享协议进行相互通信。由于这种协议分布式地进行连接，就使得每一个僵尸主机可以很方便地找到其他的僵尸主机并进行通信，而当有一 些bot被查杀时，并不会影响到Botnet的生存，所以这类的Botnet具有不存在单点失效但实现相对复杂的特点。Agobot和Phatbot采用 了P2P的方式。&lt;br /&gt;　　Botnet的危害&lt;br /&gt;　　Botnet构成了一个攻击平台，利用这个平台可以有效地发起各种各样的攻击行为，可以导致整 个基础信息网络或者重要应用系统瘫痪，也可以导致大量机密或个人隐私泄漏，还可以用来从事网络欺诈等其他违法犯罪活动。下面是已经发现的利用Botnet 发动的攻击行为。随着将来出现各种新的攻击类型，Botnet还可能被用来发起新的未知攻击。&lt;br /&gt;　　（1）拒绝服务攻击。使用Botnet发动DDos攻击是当前最主要的威胁之一，攻击者可以向 自己控制的所有bots发送指令，让它们在特定的时间同时开始连续访问特定的网络目标，从而达到DDos的目的。由于Botnet可以形成庞大规模，而且 利用其进行DDos攻击可以做到更好地同步，所以在发布控制指令时，能够使得DDos的危害更大，防范更难。&lt;br /&gt;　　（2）发送垃圾邮件。一些bots会设立sockv4、v5 代理，这样就可以利用Botnet发送大量的垃圾邮件，而且发送者可以很好地隐藏自身的IP信息。&lt;br /&gt;　　（3）窃取秘密。Botnet的控制者可以从僵尸主机中窃取用户的各种敏感信息和其他秘密，例如个人帐号、机密数据等。同时bot程序能够使用sniffer观测感兴趣的网络数据，从而获得网络流量中的秘密。&lt;br /&gt;　　（4）滥用资源。攻击者利用Botnet从事各种需要耗费网络资源的活动，从而使用户的网络性能受到影响，甚至带来经济损失。例如：种植广告软件，点击指定的网站；利用僵尸主机的资源存储大型数据和违法数据等，利用僵尸主机搭建假冒的银行网站从事网络钓鱼的非法活动。&lt;br /&gt;　　可以看出，Botnet无论是对整个网络还是对用户自身，都造成了比较严重的危害，我们要采取有效的方法减少Botnet的危害。&lt;br /&gt;　　&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-48399425127617036?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/48399425127617036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=48399425127617036' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/48399425127617036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/48399425127617036'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/03/blog-post_07.html' title='僵尸网络'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_NQUr3ozUHrQ/SbHdoxe0h-I/AAAAAAAAAEo/A6pQ39mqQYQ/s72-c/507c3897be2a0a7e54fb967d.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-5799086638863934167</id><published>2009-03-07T10:15:00.001+08:00</published><updated>2009-03-07T10:17:15.988+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Network'/><category scheme='http://www.blogger.com/atom/ns#' term='Hack'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='World View'/><title type='text'>【CSDN新闻】Websense 2009六大安全预测　黑客也玩“云安全”</title><content type='html'>&lt;span style="font-family:Arial;"&gt;近日，Websense 发布2009年6大安全预测。其中“云安全”技术的被滥用、Web应用和Web2.0应用等被恶意利用的几率将大幅增加。 &lt;/span&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;“云安全”被恶意利用的频率将越来越高&lt;/strong&gt; &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;以云计算技术为基础的服务如亚马逊的Web服务(AWS)、微软的Azure 以及GoGrid等为企业和用户提供了简单易用的基础运算、可按需租用的存储空间和大幅度的成本节省。但这些服务也引起了网络犯罪者和黑客们的高度关注， 他们将利用这些技术和服务来达成其恶意目的。Websense预测：2009年，云计算技术被滥用的现象将会越来越多。该技术既可被用于简单的垃圾邮件发 送，也可用来发起针对下载、数据上传统计、恶意代码监测更为高级的恶意程序攻击。 &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;富互联网应用系统（RIAs）如Flash、Google Gears等被恶意利用的几率增大&lt;/strong&gt; &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;利用基于浏览器的Web应用如基于Web的CRM系统、Google文档和其他基于Web的办公工具等越来 越多的取代了传统的桌面应用程序。运用基于浏览器的Web应用来丰富互联网使用体验的程序是富互联网应用系统（RIAs）。伴随这些应用需求的爆炸式增 长，使用RIA技术的Google Gears、Air、Flash和Silverlight构建了一个大型的Web2.0网络应用体系，而安全问题却是最后被考虑的，这就如同敞开大门让网 络犯罪分子肆意攻击。由于RIA的迅速流行，我们可以预见在2009年将会有大规模的利用RIA核心组件和用户创建的服务来发起的攻击，这些攻击将使黑客 们能够远程操控用户的电脑。 &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;黑客们将充分利用可编写Web发动攻击&lt;/strong&gt; &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;Web2.0应用是一个开放了网络应用程序接口、mashups、小工具的开放世界，允许共享、使用来自其 他网站的功能。搜索引擎Web API服务的发行以破纪录的速度发布而几乎没有什么时间来进行测试，而这种应用需要用户间达到一定的信赖水平方可。因此Websense认为在2009 年，利用Web API服务来获得信任、窃取用户的资格证书或机密信息的恶意攻击将会增加。 &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;Web垃圾和向blog、论坛和社交性网站发送的恶意内容将会大幅度增加&lt;/strong&gt; &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;那些允许用户进行内容编辑的网站越来越流行，数量也将出现飞跃增长，而这些网站很有可能导致Web垃圾和和 向blog、论坛和社交性网站发送的恶意内容的大幅度增加，这些内容包括搜索引擎麻痹、恶意引诱传播和网络欺诈等。此外，这些威胁和攻击将被数种新的 Web攻击工具所整合，使黑客们可以发现那些存在漏洞或者允许发布恶意代码的网站。越来越多的基础设施特许承包商会在其提供的功能中增加HTTP发布功 能。 &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;黑客们将转向分布式僵尸网络控制和恶意代码托管模式&lt;/strong&gt; &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;2008年&lt;span style="font-family:Arial;"&gt;Websense&lt;/span&gt;发现两家总部位于加利福尼亚州的托管公司McCololo和Intercage/Atrivo就由于发布僵尸网络和恶意代码被上游供应商关闭。Mcolor倒闭的当天垃圾邮件减少了50%，而Intercage/Atrivo倒闭的当天大大减轻了“风暴”僵尸网络的蔓延。&lt;span style="font-family:Arial;"&gt;Websense&lt;/span&gt;预测：由于这些僵尸集团仅拥有少数几家供应商来托管其C&amp;amp;C服务，他们会将其服务器分布到各处，同时转移至国外服务器供应商，使其更难被上游供应商、网络监管部门和执法部门所发现和关闭。 &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;对于具有“良好声誉”网站的攻击将会持续&lt;/strong&gt; &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;2009年，我们将看到有80%以上的恶意内容会以那些拥有“良好声誉”的网站为载体。会有更多的著名网站 和Alexa排名前10万的网站遭受恶意攻击。这些攻击既包括对于当地著名网站某些特定频道的攻击，也包括对流行的体育网站、新闻网的攻击以及向这些网站 中持续植入IFRAME、恶意重定向代码。 &lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-5799086638863934167?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/5799086638863934167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=5799086638863934167' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/5799086638863934167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/5799086638863934167'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/03/csdnwebsense-2009.html' title='【CSDN新闻】Websense 2009六大安全预测　黑客也玩“云安全”'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-1547794107436563406</id><published>2009-03-05T19:11:00.001+08:00</published><updated>2009-03-05T19:14:09.406+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Growing'/><title type='text'>大唐软件技术经理陈建慧《如何做好开发团队负责人---管别人先管好自已，请从做一名合格程序员开始》</title><content type='html'>        开发经理(开发组长)开发经理是团队中的大师那就该是整个团队工作中的榜样，无论是工作效率、态度、分析设计水平、业务知识、技术能力各方面都要努力让自己成为团队成员榜样。 &lt;br /&gt;&lt;br /&gt;        开发经理除了安排好目前工作之外还需要主动学习，不断提高自己的业务和技术水平。很多人会说很忙没有时间，那就要求开发经理要比别人付出更多的努力，因为开发经理拿的工资比别人高，就应该付出更多，为公司创造更高的价值。如果我是老板的话，我给你涨了工资，不仅仅是对你以前工作的肯定，但更重要的是期待你以后能有更高的产出，所以从开发人员变为开发经理之后就得更加努力有更高产出。 &lt;br /&gt;        关键问题和核心代码一定要尽可能亲自动手。通过解决关键问题，可以在团队成员心中树立自已的形象和权威，减少经后工作量估算的误差，同时也减少团队成员变动引起的风险，开发经理要能够随时胜任为团队中任何人的替补。具统计优秀的开源软件代码的开发人员70%以上是30多岁的人，我们的开发经理大多数都比这个年纪要小，一个优秀的程序员至少需要十年以上才可能练成。如果现在就不动手，就只会管几个人，我觉得对公司来说都是一种资源的浪费，对个人来说是失去成长的机会。现在整行业的人都很浮躁的重要原因是大多数程序员都高估了自已的能力水平，降低了对自已的要求标准，很多人工作多年，连一个合格的程序员都算不上，更不要说优秀程序员。千万不能认为编码是一种低级劳动，一定要纠正这种错误思想，很多大师级的人物都在写代码，更何况自已只是一个不合格的程序员。 &lt;br /&gt;         安排工作方面，先紧后松原则，做事情一定要先紧，安排工作也要先紧，要给自已和团队成员犯错误和解决风险的时间，留充分的余量。安排任务要给团队成员压力，要以自已完成任务的标准去要求下属。 &lt;br /&gt;        总结自已和优秀成员的胜任特征，并复制给其它团队成员。复制的是胜任工作所需要的能力，做事情和思考问题的方法，不是只告诉他如何做某件具体事情。 &lt;br /&gt;及时检查团队成员的输出成果，通过对成员输出的检查及时了解成员的特点和能力水平，及时指出不足。以便经后能够按人员能力特点给其安排工作任务。指出成员的不足，是对他个人负责。 &lt;br /&gt;&lt;p&gt;        积极思想往下传，消极思想往上传，消极的思想和问题只能向上级领导反映，不要在下级面前表露出来，带给下级的永远是正面积极的思想。 给团队成员灌输正面思想多抓住平常的机会，不能只等到面对面谈话时再来谈大道理，这个时侯讲的大道理大多数人都很难接受。多站在为对方着想的角度去灌输正面思想，不要总像个领导在下达命令。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;         swetter点评：不少经典部分。我相信所有优秀的人才都是以自己的努力钻研为背景的，而不是靠着某些别人称之为天赋的东西。&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-1547794107436563406?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/1547794107436563406/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=1547794107436563406' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/1547794107436563406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/1547794107436563406'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/03/blog-post_5262.html' title='大唐软件技术经理陈建慧《如何做好开发团队负责人---管别人先管好自已，请从做一名合格程序员开始》'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-5607657522767586739</id><published>2009-03-05T19:06:00.002+08:00</published><updated>2009-03-05T19:08:40.188+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Growing'/><title type='text'>【转】如何修炼成技术专家</title><content type='html'>1、选择适合自己的发展通道，走对路（附图） &lt;br /&gt;-技术专家 &lt;br /&gt;-架构师 &lt;br /&gt;-技术经理 &lt;br /&gt;&lt;br /&gt;2、勤用外功，成长更快、更高（附图） &lt;br /&gt;-再往前走走：更多一点点、更好一点点 &lt;br /&gt;-来倒立想想：换角度思考 &lt;br /&gt;-常回头看看：总结、对比 &lt;br /&gt;&lt;br /&gt;3、修炼内功，保持向上发展的内在动力（附图） &lt;br /&gt;-初级阶段：Stay Hungry &lt;br /&gt;&lt;p&gt;-高级阶段：Stay Foolish&lt;/p&gt;&lt;p&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 298px;" src="http://2.bp.blogspot.com/_NQUr3ozUHrQ/Sa-ym1AFA6I/AAAAAAAAAEg/kM_dDsK4jwo/s400/QQ截图未命名.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5309658865825285026" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-5607657522767586739?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/5607657522767586739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=5607657522767586739' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/5607657522767586739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/5607657522767586739'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/03/blog-post_05.html' title='【转】如何修炼成技术专家'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_NQUr3ozUHrQ/Sa-ym1AFA6I/AAAAAAAAAEg/kM_dDsK4jwo/s72-c/QQ截图未命名.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-240704421745193170</id><published>2009-03-05T15:10:00.001+08:00</published><updated>2009-03-05T15:10:58.809+08:00</updated><title type='text'>算法</title><content type='html'>&lt;p&gt;对非计算机专业的程序员来说&lt;/p&gt;&lt;p&gt;算法是一道硬伤&lt;/p&gt;&lt;p&gt;还有某些细节问题。。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-240704421745193170?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/240704421745193170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=240704421745193170' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/240704421745193170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/240704421745193170'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/03/blog-post.html' title='算法'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-1558216023549088076</id><published>2009-03-04T19:57:00.001+08:00</published><updated>2009-03-04T19:59:16.648+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Growing'/><title type='text'>【转自CSDN】软件开发10大经典致命错误</title><content type='html'>【CSDN 3月2日编译】在Steve McConnell（McConnell是Construx软件公司的CEO和首席软件工程师。）的新书《快速开发：驯服疯狂的软件进度》中，作者将很多人经常会犯的错误命名为“经典错误”，这些错误本可以避免并提早预见由这些错误所产生的后果。&lt;br /&gt;&lt;br /&gt;为了确定常见的软件开发错误出现的频率和严重程度，Construx软件开发白皮书的作者调查了500个软件从业人员。认定了42个经典的软件开发错误，下面的10个被认为是最有破坏性、最致命的：&lt;br /&gt;&lt;br /&gt;1.    不切实际的期望；&lt;br /&gt;2.    过于乐观的进度表；&lt;br /&gt;3.    违背质量保证；&lt;br /&gt;4.    一厢情愿；&lt;br /&gt;5.    目标不清；&lt;br /&gt;6.    过多的并发任务；&lt;br /&gt;7.    特征发生变化；&lt;br /&gt;8.    吵闹纷杂的办公室；&lt;br /&gt;9.    在压力下放弃计划；&lt;br /&gt;10.    风险管理不足&lt;br /&gt;&lt;br /&gt;&lt;p&gt; 其它32个经典错误涉及：在项目进行中转换开发工具，开发人员外出镀金，开发人员和客户之间有摩擦等。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;原文：&lt;/p&gt;&lt;p&gt;                          10 most damaging classic software development mistakes  &lt;/p&gt;&lt;p&gt;In Steve McConnell’s book Rapid Development: Taming Wild Software Schedules, he defines “classic mistakes” as mistakes that have been made so often, by so many people, that the consequences of making these mistakes should be predictable and the mistakes should be avoidable. McConnell is CEO and Chief Software Engineer at Construx Software.&lt;br /&gt;&lt;br /&gt;To determine the frequency and severity of common software development mistakes, the authors of this Construx Software Builders white paper surveyed 500 software practitioners. Of the 42 classic software development mistakes identified, these 10 mistakes are reported to be the most damaging:&lt;br /&gt;Unrealistic expectations&lt;br /&gt;Overly optimistic schedules&lt;br /&gt;Shortchanged quality assurance&lt;br /&gt;Wishful thinking&lt;br /&gt;Confusing estimates with targets&lt;br /&gt;Excessive multi-tasking&lt;br /&gt;Feature creep&lt;br /&gt;Noisy, crowded offices&lt;br /&gt;Abandoning planning under pressure&lt;br /&gt;Insufficient risk management&lt;br /&gt;&lt;br /&gt;Several of the other 32 classic mistakes identified are: switching development tools in the middle of a project, developer gold plating, and friction between developers and customers.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-1558216023549088076?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/1558216023549088076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=1558216023549088076' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/1558216023549088076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/1558216023549088076'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/03/csdn10.html' title='【转自CSDN】软件开发10大经典致命错误'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-8132753748247379997</id><published>2009-02-20T18:06:00.003+08:00</published><updated>2009-02-20T18:16:43.728+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hot Java'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>完美程序（JDBC示范程序）</title><content type='html'>&lt;div&gt;/** 注意：良好的编程习惯是尽量的写try-catch-finally&lt;/div&gt;&lt;div&gt;    * 而不是一味的throws Exception&lt;/div&gt;&lt;div&gt;    * 否则如果在一个大的方法体上写throws Exception，内部出现Exception时&lt;/div&gt;&lt;div&gt;    * 有可能导致程序停滞直到耗尽内存。&lt;/div&gt;&lt;div&gt;    */&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;import java.sql.*;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;public class TestJDBC {&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;  public static void main(String[] args) {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;    &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;ResultSet rs = null;&lt;/div&gt;&lt;div&gt;    &lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;Statement stmt = null;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;    &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Connection conn = null;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;    &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;try {//良好的编程习惯是尽量写try-catch-finally&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;      &lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;Class.forName("oracle.jdbc.driver.OracleDriver");&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;      //new oracle.jdbc.driver.OracleDriver();&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;      conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.1:1521:SXT", "scott", "tiger");&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;      &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;stmt = conn.createStatement();&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;      &lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;rs = stmt.executeQuery("select * from dept");&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;      while(rs.next()) {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;     &lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;System.out.println(rs.getString("deptno"));&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;     &lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;System.out.println(rs.getInt("deptno"));&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;      &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;}&lt;/div&gt;&lt;div&gt;    &lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;} catch (ClassNotFoundException e) {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;         &lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;e.printStackTrace();&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;    &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;} catch (SQLException e) {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;         e.printStackTrace();&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;    } finally {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;         try {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;            &lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;if(rs != null) {//在JDBC关闭过程中仍然有关闭异常需要捕捉&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;           &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;    &lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;rs.close(); //首先判断某对象已被成功初始化，即!=null，然后关闭&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;           &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;    &lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;rs = null;  //关闭后还需要将其设置回初始化的null值&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;            }&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;            &lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;if(stmt != null) {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;                stmt.close();&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;     &lt;/span&gt;               stmt = null;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;        &lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;    }&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;            if(conn != null) {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;            &lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;   conn.close();&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;               &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;conn = null;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;            }&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;         } catch (SQLException e) {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;                &lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;e.printStackTrace();&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;          &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;}&lt;/div&gt;&lt;div&gt;     &lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;   }&lt;/div&gt;&lt;div&gt;}&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-8132753748247379997?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/8132753748247379997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=8132753748247379997' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/8132753748247379997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/8132753748247379997'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/02/jdbc.html' title='完美程序（JDBC示范程序）'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-4444215843170462158</id><published>2009-02-17T14:50:00.002+08:00</published><updated>2009-02-20T18:18:52.800+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='Hot Java'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Data Structure'/><title type='text'>正则表达式(Regular Expression)测试程序【续】</title><content type='html'>/**正则表达式的分组&lt;br /&gt;    * group&lt;br /&gt;    */&lt;br /&gt; /*&lt;br /&gt;    Pattern p = Pattern.compile("(\\d{3,5})([a-z]{2})");//分组，使用()，此处把数字和字母分组。一共有3组，正则表达式本身就是一组&lt;br /&gt;    String s = "123aa-34345bb-234cc-00";&lt;br /&gt;    Matcher m = p.matcher(s);&lt;br /&gt;    while(m.find()) {&lt;br /&gt;       p(m.group(1));//group,内容为正则表达式所匹配的字符串，组号即第n个左小括号,输入第几组就打印选中的那个组的内容&lt;br /&gt;   //m.group()则直接打印所有组内容&lt;br /&gt;    }&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt; /** Reluctant quantifiers限定词 勉强限定词&lt;br /&gt;    *  ?? 一个或没有&lt;br /&gt;    *? 零个或更多&lt;br /&gt;    *  +? 一个或更多&lt;br /&gt;    *  {n}? 正好n个&lt;br /&gt;    *  {n,}? 至少n个&lt;br /&gt;    *  {n,m}? 至少n最多m&lt;br /&gt;*/&lt;br /&gt; /**Possesive quantifiers独占性限定词&lt;br /&gt;    *  ?+ 意义同上&lt;br /&gt;    *+ Greedy,Reluctant,Possessive这三种quantifiers区别：它们都是匹配到了就停止&lt;br /&gt;    *  ++ Greedy，看到{n,m}就直接吞入m个字符，再与正则表达式匹配，匹配不上则往外吐一个再匹配&lt;br /&gt;    *  {n}+ Reluctant，看到{n,m}就吞入n个字符，再匹配，匹配不上则再吞一个字符&lt;br /&gt;    *  {n,}+ Possesive，独占的，与Greedy类似，一次吞m个，只是不往外吐&lt;br /&gt;    *  {n,m}+&lt;br /&gt;*/&lt;br /&gt; /*&lt;br /&gt;    Pattern p = Pattern.compile(".{3,10}+[0-9]");&lt;br /&gt;    String s = "aaaa5bbbb68";&lt;br /&gt;    Matcher m = p.matcher(s);&lt;br /&gt;    if(m.find())&lt;br /&gt;       p(m.start() + "-" + m.end());&lt;br /&gt;    else&lt;br /&gt;       p("not match!");&lt;br /&gt; */&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-4444215843170462158?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/4444215843170462158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=4444215843170462158' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/4444215843170462158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/4444215843170462158'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/02/regular-expression_17.html' title='正则表达式(Regular Expression)测试程序【续】'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-2855762470935192813</id><published>2009-02-17T03:19:00.003+08:00</published><updated>2009-02-25T19:28:53.589+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='Hot Java'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Data Structure'/><title type='text'>正则表达式(Regular Expression)测试程序</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Simsun; "&gt;&lt;div style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; width: auto; font: normal normal normal 100%/normal Georgia, serif; text-align: left; "&gt;import java.util.regex.Matcher;&lt;br /&gt;import java.util.regex.Pattern;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public class RegExp {&lt;br /&gt;  public static void main(String[] args) {&lt;br /&gt;  /* p("abc".matches("..."));//可以匹配，一个点代表一个字符&lt;br /&gt;    p("a8729a".replaceAll("\\d", "-"));//把数字全替换为横线,\\d代表一位数字&lt;br /&gt;    Pattern p = Pattern.compile("[a-z]{3}");//匹配三个字符，每个都是a-z&lt;br /&gt;    Matcher m = p.matcher("fgh");&lt;br /&gt;    p(m.matches());*/&lt;br /&gt;    // p("fgh".matches("[a-z]{3}"));//上边三句可合并为这一句&lt;br /&gt;&lt;br /&gt;  /**Greedy quantifiers 贪婪限定符，默认&lt;br /&gt;    * 初步认识 . * + ?即meta characters&lt;br /&gt;    * . 一个字符&lt;br /&gt;    * ? 一个或零个&lt;br /&gt;    * * 零个或多个&lt;br /&gt;    * + 一个或多个&lt;br /&gt;    * [n] 正好n个&lt;br /&gt;    * [n,]最少n个&lt;br /&gt;    * [n,m]至少n个最多m个&lt;br /&gt;    */&lt;br /&gt;    /* p("a".matches("."));&lt;br /&gt;    p("aaaa".matches("a*"));&lt;br /&gt;    p("aaaa".matches("a+"));&lt;br /&gt;    p("aaaa".matches("a?"));&lt;br /&gt;    p("".matches("a*"));//零宽度匹配 zero length matches。空串匹配&lt;br /&gt;    p("".matches("a?"));&lt;br /&gt;    p("".matches("a+"));&lt;br /&gt;    p("1231231425346234".matches("\\d{3,100}"));//至少3个之多100个，且都是数字&lt;br /&gt;    p("192.168.0.aaa".matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"));&lt;br /&gt;    p("192".matches("[0-2][0-9][0-9]"));//一个中括号内是匹配一个字符&lt;br /&gt;    */&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;      * ^取反&lt;br /&gt;      * -代表范围&lt;br /&gt;      * |代表或者&lt;br /&gt;      * &amp;amp;&amp;amp;代表并且&lt;br /&gt;      */&lt;br /&gt;    /* p("a".matches("[abc]"));&lt;br /&gt;    p("a".matches("[^abc]"));&lt;br /&gt;    p("A".matches("[a-zA-Z]"));&lt;br /&gt;    p("A".matches("[a-z]|[A-Z]"));&lt;br /&gt;    p("A".matches("[a-z[A-Z]]"));//或的另一个写法&lt;br /&gt;    p("R".matches("[A-Z&amp;amp;&amp;amp;[RFG]]"));//交集，取A-Z与RFG集合交集的部分，其实就是RFG&lt;br /&gt;    */&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;      *\d digit&lt;br /&gt;      *\D non-digit&lt;br /&gt;      *\s a whitespace character:如[ \t\n\x0B\f\r] 不可见的符号&lt;br /&gt;      *\S a non-whitespace character&lt;br /&gt;      *\w a word character: [a-zA-Z_0-9]包括下划线&lt;br /&gt;      *\W a non-word character&lt;br /&gt;      */&lt;br /&gt;    /*p(" \n\r\t".matches("\\s{4}"));&lt;br /&gt;    p(" ".matches("\\S"));&lt;br /&gt;    p("a_8".matches("\\w{3}"));&lt;br /&gt;    p("abc888&amp;amp;^%".matches("[a-z]{1,3}\\d+[&amp;amp;^#%]+"));&lt;br /&gt;    p("\\".matches("\\\\"));//匹配一个\必须用两个\\&lt;br /&gt;    */&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;      * POSIX Style&lt;br /&gt;      * POSIX (Portable Operating System Interface based on uniX)&lt;br /&gt;      * 以 unix 操作系统为基础的可携带操作系统界面&lt;br /&gt;      * 以 unix 操作系统为基础的操作系统标准&lt;br /&gt;      */&lt;br /&gt;    /*p("a".matches("\\p{Lower}"));//很少这样写，不推荐&lt;br /&gt;      */&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;      * boundary 边界匹配&lt;br /&gt;      * ^位于中括号里代表取反，在中括号外代表一行的起始位置&lt;br /&gt;      * $结尾&lt;br /&gt;      * \b word boundary&lt;br /&gt;      * \B non-word boundary&lt;br /&gt;      */&lt;br /&gt;    /*p("hello sir".matches("^h.*"));&lt;br /&gt;    p("hello sir".matches(".*ir$"));&lt;br /&gt;    p("hello sir".matches("^h[a-z]{1,3}o\\b.*"));&lt;br /&gt;    p("hellosir".matches("^h[a-z]{1,3}o\\b.*"));&lt;div&gt;    */&lt;br /&gt;&lt;br /&gt;    /**whilte lines 空白行&lt;br /&gt;      * 此处空白行代表有空格的行。行开头就是换行符的不算作本例的空白行&lt;br /&gt;      */&lt;br /&gt;&lt;br /&gt;    /*p(" \n".matches("^[\\s【开头是空白字符】&amp;amp;&amp;amp;[^\\n]]【并且不是换行符】*\\n$【末尾跟着换行符】"));&lt;br /&gt;    // " \n"即一个空白行&lt;br /&gt;      */&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;  public static void p(Object o) {&lt;br /&gt;    System.out.println(o);&lt;br /&gt;  }&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-2855762470935192813?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/2855762470935192813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=2855762470935192813' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/2855762470935192813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/2855762470935192813'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/02/regular-expression.html' title='正则表达式(Regular Expression)测试程序'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-7825647999020582106</id><published>2009-02-16T10:19:00.001+08:00</published><updated>2009-02-16T20:08:42.665+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Growing'/><title type='text'>25则爱情语录</title><content type='html'>1.一个人总要走陌生的路，看陌生的风景，听陌生的歌，然后在某个不经意的瞬间，你会发现，原本是费尽心机想要忘记的事情真的就那么忘记了。&lt;br /&gt;1.One is always on a strange road, watching strange scenery and listeningto strange music. Then one day, you will find that the things you tryhard to forget are already gone. 　　&lt;br /&gt;2.幸福，不是长生不老，不是大鱼大肉，不是权倾朝野。幸福是每一个微小的生活愿望达成。当你想吃的时候有得吃，想被爱的时候有人来爱你。&lt;br /&gt;2.Happiness is not about being immortal nor having food or rights inone's hand. It’s about having each tiny wish come true, or havingsomething to eat when you are hungry or having someone's love when youneed love. 　　&lt;br /&gt;3.爱情是灯，友情是影子，当灯灭了，你会发现你的周围都是影子。朋友，是在最后可以给你力量的人。&lt;br /&gt;3.Love is a lamp, while friendship is the shadow. When the lamp is off,you will find the shadow everywhere. Friend is who can give youstrength at last. 　　&lt;br /&gt;4.我爱你不是因为你是谁，而是我在你面前可以是谁。&lt;br /&gt;4.I love you not for who you are, but for who I am before you.&lt;br /&gt;5.爱情，要么让人成熟，要么让人堕落。&lt;br /&gt;5.Love makes man grow up or sink down. 　　&lt;br /&gt;6.举得起放得下的叫举重，举得起放不下的叫负重。可惜，大多数人的爱情，都是负重的。&lt;br /&gt;6.If you can hold something up and put it down, it is calledweight-lifting; if you can hold something up but can never put it down,it's called burden-bearing. Pitifully, most of people are bearing heavyburdens when they are in love. 　&lt;br /&gt;7．我们每个人都生活在各自的过去中，人们会用一分钟的时间去认识一个人，用一小时的时间去喜欢一个人，再用一天的时间去爱上一个人，到最后呢，却要用一辈子的时间去忘记一个人。&lt;br /&gt;7.We all live in the past. We take a minute to know someone, one hour tolike someone, and one day to love someone, but the whole life to forgetsomeone.&lt;br /&gt;8．一个人一生可以爱上很多的人，等你获得真正属于你的幸福之后，你就会明白一起的伤痛其实是一种财富，它让你学会更好地去把握和珍惜你爱的人。&lt;br /&gt;8.One may fall in love with many people during the lifetime. When youfinally get your own happiness, you will understand the previoussadness is kind of treasure, which makes you better to hold and cherishthe people you love. 　　&lt;br /&gt;9．年轻的时候会想要谈很多次恋爱，但是随着年龄的增长，终于领悟到爱一个人，就算用一辈子的时间，还是会嫌不够。慢慢地去了解这个人，体谅这个人，直到爱上为止，是需要有非常宽大的胸襟才行。&lt;br /&gt;9.When you are young, you may want several love experiences. But as timegoes on, you will realize that if you really love someone, the wholelife will not be enough. You need time to know, to forgive and to love.All this needs a very big mind.&lt;br /&gt;10．当明天变成了今天成为了昨天，最后成为记忆里不再重要的某一天，我们突然发现自己在不知不觉中已被时间推着向前走，这不是静止火车里，与相邻列车交错时，仿佛自己在前进的错觉，而是我们真实的在成长，在这件事里成了另一个自己。&lt;br /&gt;10.When tomorrow turns in today, yesterday, and someday that no moreimportant in your memory, we suddenly realize that we r pushed forwardby time. This is not a train in still in which you may feel forwardwhen another train goes by. It is the truth that we've all grown up.And we become different. 　&lt;br /&gt;11．离开我就别安慰我，要知道每一次缝补也会遭遇穿刺的痛。&lt;br /&gt;11.If you leave me, please don't comfort me because each sewing has to meet stinging pain. 　　&lt;br /&gt;12．曾经拥有的，不要忘记。不能得到的，更要珍惜。属于自己的，不要放弃。已经失去的，留作回忆。&lt;br /&gt;12.Don’t forget the things you once you owned. Treasure the things youcan’t get. Don't give up the things that belong to you and keep thoselost things in memory. 　　&lt;br /&gt;13．我喜欢并习惯了对变化的东西保持着距离，这样才会知道什么是最不会被时间抛弃的准则。比如爱一个人，充满变数，我于是后退一步，静静的看着，直到看见真诚的感情。&lt;br /&gt;13.I love and am used to keeping a distance with those changed things.Only in this way can I know what will not be abandoned by time. Forexample, when you love someone, changes are all around. Then I stepbackward and watching it silently, then I see the true feelings.&lt;br /&gt;14．男人的爱是俯视而生，而女人的爱是仰视而生。如果爱情像座山，那么男人越往上走可以俯视的女人就越多，而女人越往上走可以仰视的男人就越少。&lt;br /&gt;14.Men love from overlooking while women love from looking up. If love isa mountain, then if men go up, more women they will see while womenwill see fewer men.　　&lt;br /&gt;15．好的爱情是你通过一个人看到整个世界，坏的爱情是你为了一个人舍弃世界。&lt;br /&gt;15.Good love makes you see the whole world from one person while bad love makes you abandon the whole world for one person.　&lt;br /&gt;16．在自己面前，应该一直留有一个地方，独自留在那里。然后去爱。不知道是什么，不知道是谁，不知道如何去爱，也不知道可以爱多久。只是等待一次爱情，也许永远都没有人。可是，这种等待，就是爱情本身。&lt;br /&gt;16.We shall always save a place for ourselves, only for ourselves. Andthen begin to love. Have no idea of what it is, who he is, how to loveor how long it will be. Just wait for one love. Maybe no one will comeout, but this kind of waiting is the love itself.　　&lt;br /&gt;17．有谁不曾为那暗恋而痛苦？我们总以为那份痴情很重，很重，是世上最重的重量。有一天，暮然回首，我们才发现，它一直都是很轻，很轻的。我们以为爱的很深，很深，来日岁月，会让你知道，它不过很浅，很浅。最深和最重的爱，必须和时日一起成长。&lt;br /&gt;17.Is there anyone who hasn't suffered for the secret love? We alwaysthink that love is very heavy, heavy and could be the heaviest thing inthe world. But one day, when you look back, you suddenly realize thatit's always light, light. We all thought love was very deep, but infact it's very thin. The deepest and heaviest love must grow up withthe time. 　　&lt;br /&gt;18．在这个世界上，只有真正快乐的男人，才能带给女人真正的快乐。&lt;br /&gt;18.In this world, only those men who really feel happy can give women happiness&lt;br /&gt;19．女人如果不性感，就要感性；如果没有感性，就要理性；如果没有理性，就要有自知之明；如果连这个都没有了，她只有不幸。&lt;br /&gt;19.If a woman is not sexy, she needs emotion; if she is not emotional, sheneeds reason; if she is not reasonable, she has to know herselfclearly. coz only she has is misfortune.&lt;br /&gt;20．一段不被接受的爱情，需要的不是伤心，而是时间，一段可以用来遗忘的时间。一颗被深深伤了的心，需要的不是同情，而是明白。&lt;br /&gt;21.An unacceptable love needs no sorrow but time- sometime for forgetting.A badly-hurt heart needs no sympathy but understanding.　　&lt;br /&gt;22．我知道这世上有人在等我，但我不知道我在等谁，为了这个，我每天都非常快乐。&lt;br /&gt;22. I know someone in the world is waiting for me, although I've no idea of who he is. But I feel happy every day for this. 　&lt;br /&gt;23．一生至少该有一次，为了某个人而忘了自己，不求有结果，不求同行，不求曾经拥有，甚至不求你爱我。只求在我最美的年华里，遇到你。&lt;br /&gt;23.In your life, there will at least one time that you forget yourself forsomeone, asking for no result, no company, no ownership nor love. Justask for meeting you in my most beautiful years. 　&lt;br /&gt;24．我不觉得人的心智成熟是越来越宽容涵盖，什么都可以接受。相反，我觉得那应该是一个逐渐剔除的过程，知道自己最重要的是什么，知道不重要的东西是什么。而后，做一个纯简的人。&lt;br /&gt;24.Idon't think that when people grow up, they will become morebroad-minded and can accept everything. Conversely, I think it's aselecting process, knowing what's the most important and what's theleast. And then be a simple man.　　&lt;br /&gt;25．当你的心真的在痛，眼泪快要流下来的时候，那就赶快抬头看看，这片曾经属于我们的天空；当天依旧是那么的广阔，云依旧那么的潇洒，那就不应该哭，因为我的离去，并没有带走你的世界。&lt;br /&gt;25.When you feel hurt and your tears are gonna to drop. Please look up andhave a look at the sky once belongs to us. If the sky is still vast,clouds are still clear, you shall not cry because my leave doesn't takeaway the world that belongs to you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-7825647999020582106?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/7825647999020582106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=7825647999020582106' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/7825647999020582106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/7825647999020582106'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/02/35.html' title='25则爱情语录'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-3730279395763738007</id><published>2009-01-05T23:07:00.000+08:00</published><updated>2009-01-07T23:08:06.779+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>嵌入式SQL编程的编译过程</title><content type='html'>嵌入式SQL程序中包含SQL语句和编程语言语句，所以它不能直接提交给编程语言的编译程序，而是要通过多级的代理&lt;br /&gt;所有支持嵌入式SQL的产品都有以下类似的处理过程&lt;br /&gt;1：嵌入式SQL源程序提交给SQL预编译程序。它扫描整个程序，找到嵌入的SQL语句并处理他们&lt;br /&gt;2：预编译程序输出两个文件，第一个是玻璃了嵌入的SQL语句的源程序。在嵌入的SQL语句的位置由预编译程序替换成对专用DBMS程序段的调用。这些程序段提供了程序和DBMS之间运行时的连接。第二个文件是程序中所有嵌入SQL语句的复制品，即数据库存取模块DBRM(database request module)&lt;br /&gt;3：从预编译程序输出的源文件交给宿主编程语言的标准编译程序，处理后生成对象代码作为输出结果。注意这一部并没有利用DBMS或SQL做什么&lt;br /&gt;4：连接器linker接收编译程序生成的目标模块，将模块与各种库程序段连接在一起，并生成一个可执行程序。参与生成可执行程序的库程序段包括在第2步中描述的专用DBMS程序段&lt;br /&gt;5:预编译程序对所生成的数据库存取模块提交给一个特殊的BIND程序。这个程序检查SQL语句，对他们进行解析，验证和优化。并为每条语句生成一个应用计划。这样的结果是得到整个程序的组合应用计划，他是嵌入式SQL语句的DBMS可执行版本。BIND程序在数据库中存储该计划，通常以创建计划的应用程序名字为它命名&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-3730279395763738007?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/3730279395763738007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=3730279395763738007' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/3730279395763738007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/3730279395763738007'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/01/sql_05.html' title='嵌入式SQL编程的编译过程'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-6634201037437078268</id><published>2009-01-04T22:56:00.000+08:00</published><updated>2009-01-07T22:56:52.493+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>嵌入式SQL技术原理</title><content type='html'>&lt;span style="font-weight:bold;"&gt;嵌入式SQL技术使用下列技术嵌入SQL语句&lt;/span&gt;&lt;br /&gt;1:SQL语句与宿主语言的语句在源程序中混合，这种嵌入式SQL源程序提交给SQL预编译程序，这个程序可以处理SQL语句&lt;br /&gt;2：宿主编程语言的变量可以引用到嵌入式SQL语句中，这样允许SQL语句使用由程序计算得到的树枝&lt;br /&gt;3：嵌入式SQL语句使用程序语言变量得到SQL查询结果。这样允许程序处理检索的树枝&lt;br /&gt;4：有些特殊的程序标量用于为数据库字段分配NULL值，并支持对数据库中NULL值的检索&lt;br /&gt;5：集中嵌入式SQL独有的SQL语句被添加到交互式SQL语言中，它们可以对擦和讯结果按记录进行处理&lt;br /&gt;&lt;br /&gt;缺点：&lt;br /&gt;1：程序源代码变为两种不同语言的混合物。&lt;br /&gt;2：它是偶那个不再交互SQL中使用的SQL语言，如WHENEVER和INTO等&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-6634201037437078268?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/6634201037437078268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=6634201037437078268' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/6634201037437078268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/6634201037437078268'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/01/sql_07.html' title='嵌入式SQL技术原理'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-5340062998611367399</id><published>2009-01-04T22:51:00.000+08:00</published><updated>2009-01-07T22:53:40.808+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>使用SQL编程</title><content type='html'>&lt;span style="font-weight:bold;"&gt;SQL数据库提供商为在应用程序中使用SQL提供了两项基本技术&lt;/span&gt;&lt;br /&gt;1：嵌入式SQL SQL语句直接嵌入在程序源代码中，与其他编程语句混合使用&lt;br /&gt; 一个特殊的SQL预编译程序接收组合在一起的源代码然后借助于其他编程工&lt;br /&gt;&lt;br /&gt;具，将其转化为可执行程序&lt;br /&gt;2：应用程序接口 程序与DBMS进行通信，通过一系列的应用程序接口或API&lt;br /&gt;&lt;br /&gt;函数调用进行通信。程序通过API调用传递SQL语句给DBMS，并使用API调用&lt;br /&gt;&lt;br /&gt;检索查询结果。这种方法不需要特殊的预编译程序&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;DBMS语句处理&lt;/span&gt;&lt;br /&gt;为了处理一条SQL语句，DBMS必须按5个步骤执行&lt;br /&gt;1：DBMS从解析SQL语句开始。它将语句分解为单独的词，并确认该语句包含有效的动词，合法的子句等成分。在这一步中可以检测出语句中的语法错误和拼写错误&lt;br /&gt;2：DBMS验证语句。用于和系统目录相反的顺序检查语句，可以检测出予以错误&lt;br /&gt;3：DBMS优化语句。它用各种方法执行语句。研究了所有可选方案后，DBMS将选择合适的答案。&lt;br /&gt;4：DBMS为语句生成应用计划，这个应用计划是一个二进制数，它代表执行计划所需步骤，它是DBMS可执行代码的等价物&lt;br /&gt;5：最后DBMS执行应用计划实现语句&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-5340062998611367399?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/5340062998611367399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=5340062998611367399' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/5340062998611367399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/5340062998611367399'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2009/01/sql.html' title='使用SQL编程'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-2283622112535255840</id><published>2008-12-19T19:17:00.000+08:00</published><updated>2008-12-19T19:18:25.716+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hot Java'/><title type='text'>【典藏】Java学习之路</title><content type='html'>Java学习之路：不走弯路，就是捷径&lt;br /&gt;&lt;br /&gt;   在ChinaITLAB导师制辅导中，笔者发现问得最多的问题莫过于"如何学习编程？Java该如何学习？"。类似的问题回答多了，难免会感觉厌烦，就萌生了写下本文的想法。到时候再有人问起类似的问题，我可以告诉他（她），请你去看看《Java学习之路》。拜读过台湾蔡学镛先生的《Java夜未眠》，有些文章如《Java学习之道》等让我们确实有共鸣，本文题目也由此而来。 软件开发之路是充满荆棘与挑战之路,也是充满希望之路。Java学习也是如此，没有捷径可走。梦想像《天龙八部》中虚竹一样被无崖子醍醐灌顶而轻松获得一甲子功力，是很不现实的。每天仰天大叫"天神啊，请赐给我一本葵花宝典吧"，殊不知即使你获得了葵花宝典，除了受自宫其身之苦外，你也不一定成得了"东方不败"，倒是成"西方失败"的几率高一点。 "不走弯路，就是捷径"，佛经说的不无道理。 &lt;br /&gt;&lt;br /&gt;   1．如何学习程序设计？ Java是一种平台，也是一种程序设计语言，如何学好程序设计不仅仅适用于Java，对C++等其他程序设计语言也一样管用。有编程高手认为，Java也好C也好没什么分别，拿来就用。为什么他们能达到如此境界？我想是因为编程语言之间有共通之处，领会了编程的精髓，自然能够做到一通百通。如何学习程序设计理所当然也有许多共通的地方。 &lt;br /&gt;&lt;br /&gt;   1.1　培养兴趣 兴趣是能够让你坚持下去的动力。如果只是把写程序作为谋生的手段的话，你会活的很累，也太对不起自己了。多关心一些行业趣事，多想想盖茨。不是提倡天天做白日梦，但人要是没有了梦想，你觉得有味道吗？可能像许多深圳本地农民一样，打打麻将，喝喝功夫茶，拜拜财神爷；每个月就有几万十几万甚至更多的进帐，凭空多出个"食利阶层"。你认为，这样有味道吗？有空多到一些程序员论坛转转，你会发现，他们其实很乐观幽默，时不时会冒出智慧的火花。&lt;br /&gt;&lt;br /&gt;   1.2　慎选程序设计语言 男怕入错行，女怕嫁错郎。初学者选择程序设计语言需要谨慎对待。软件开发不仅仅是掌握一门编程语言了事，它还需要其他很多方面的背景知识。软件开发也不仅仅局限于某几个领域，而是已经渗透到了各行各业几乎每一个角落。 如果你对硬件比较感兴趣，你可以学习C语言/汇编语言，进入硬件开发领域。如果你对电信的行业知识及网络比较熟悉，你可以在C/C++等之上多花时间，以期进入电信软件开发领域。如果你对操作系统比较熟悉，你可以学习C/Linux等等,为Linux内核开发/驱动程序开发/嵌入式开发打基础。 如果你想介入到应用范围最广泛的应用软件开发（包括电子商务电子政务系统）的话，你可以选择J2EE或.NET，甚至LAMP组合。每个领域要求的背景知识不一样。做应用软件需要对数据库等很熟悉。总之，你需要根据自己的特点来选择合适你的编程语言。 &lt;br /&gt;&lt;br /&gt;   1.3　要脚踏实地,快餐式的学习不可取 先分享一个故事。 有一个小朋友，他很喜欢研究生物学，很想知道那些蝴蝶如何从蛹壳里出来，变成蝴蝶便会飞。有一次，他走到草原上面看见一个蛹，便取了回家，然后看着，过了几天以后，这个蛹出了一条裂痕，看见里面的蝴蝶开始挣扎，想抓破蛹壳飞出来。 这个过程达数小时之久，蝴蝶在蛹里面很辛苦地拼命挣扎，怎么也没法子走出来。这个小孩看着看着不忍心，就想不如让我帮帮它吧，便随手拿起剪刀在蛹上剪开，使蝴蝶破蛹而出。 但蝴蝶出来以后，因为翅膀不够力，变得很臃肿，飞不起来。 这个故事给我们的启示是：欲速则不达。 浮躁是现代人最普遍的心态，能怪谁？也许是贫穷落后了这么多年的缘故，就像当年的大跃进一样，都想大步跨入共产主义社会。现在的软件公司、客户、政府、学校、培训机构等等到处弥漫着浮躁之气。就拿笔者比较熟悉的深圳IT培训行业来说吧，居然有的打广告宣称"参加培训，100%就业"，居然报名的学生不少，简直是藐视天下程序员。社会环境如是，我们不能改变，只能改变自己,闹市中的安宁，弥足珍贵。许多初学者C++/Java没开始学，立马使用VC/JBuilder,会使用VC/JBuilder开发一个Hello World程序，就忙不迭的向世界宣告，"我会软件开发了"，简历上也大言不惭地写上"精通VC/Java"。结果到软件公司面试时要么被三两下打发走了，要么被驳的体无完肤，无地自容。到处碰壁之后才知道捧起《C++编程思想》《Java编程思想》仔细钻研，早知如此何必当初呀。 "你现在讲究简单方便，你以后的路就长了"，好象也是佛经中的劝戒。 &lt;br /&gt;&lt;br /&gt;   1.4　多实践,快实践 彭端淑的《为学一首示子侄》中有穷和尚与富和尚的故事。 从前，四川边境有两个和尚，一个贫穷，一个有钱。一天，穷和尚对富和尚说："我打算去南海朝圣，你看怎么样？"富和尚说："这里离南海有几千里远，你靠什么去呢？"穷和尚说："我只要一个水钵，一个饭碗就够了。"富和尚为难地说："几年前我就打算买条船去南海，可至今没去成，你还是别去吧！" 一年以后，富和尚还在为租赁船只筹钱，穷和尚却已经从南海朝圣回来了。 这个故事可解读为：任何事情，一旦考虑好了，就要马上上路，不要等到准备周全之后，再去干事情。假如事情准备考虑周全了再上路的话，别人恐怕捷足先登了。软件开发是一门工程学科，注重的就是实践，"君子动口不动手"对软件开发人员来讲根本就是错误的，他们提倡"动手至上"，但别害怕，他们大多温文尔雅，没有暴力倾向，虽然有时候蓬头垢面的一副"比尔盖茨"样。有前辈高人认为，学习编程的秘诀是：编程、编程、再编程，笔者深表赞同。不仅要多实践，而且要快实践。我们在看书的时候，不要等到你完全理解了才动手敲代码，而是应该在看书的同时敲代码，程序运行的各种情况可以让你更快更牢固的掌握知识点。 &lt;br /&gt;&lt;br /&gt;    1.5　多参考程序代码 程序代码是软件开发最重要的成果之一，其中渗透了程序员的思想与灵魂。许多人被《仙剑奇侠传》中凄美的爱情故事感动,悲剧的结局更有一种缺憾美。为什么要以悲剧结尾？据说是因为写《仙剑奇侠传》的程序员失恋而安排了这样的结局，他把自己的感觉融入到游戏中，却让众多的仙剑迷扼腕叹息。 多多参考代码例子，对Java而言有参考文献[4.3],有API类的源代码(JDK安装目录下的src.zip文件)，也可以研究一些开源的软件或框架。 &lt;br /&gt;&lt;br /&gt;    1.6　加强英文阅读能力 对学习编程来说，不要求英语, 但不能一点不会,。最起码像Java API文档(参考文献[4.4])这些东西还是要能看懂的,连猜带懵都可以；旁边再开启一个"金山词霸"。看多了就会越来越熟练。在学Java的同时学习英文，一箭双雕多好。另外好多软件需要到英文网站下载，你要能够找到它们，这些是最基本的要求。英语好对你学习有很大的帮助。口语好的话更有机会进入管理层，进而可以成为剥削程序员的"周扒皮"。&lt;br /&gt;&lt;br /&gt;    1.7　万不得已才请教别人 笔者在ChinaITLab网校的在线辅导系统中解决学生问题时发现，大部分的问题学生稍做思考就可以解决。请教别人之前，你应该先回答如下几个问题。 你是否在google中搜索了问题的解决办法？ 你是否查看了Java API文档？ 你是否查找过相关书籍？ 你是否写代码测试过？ 如果回答都是"是"的话，而且还没有找到解决办法，再问别人不迟。要知道独立思考的能力对你很重要。要知道程序员的时间是很宝贵的。 &lt;br /&gt;&lt;br /&gt;    1.8　多读好书 书中自有颜如玉。比尔?盖茨是一个饱读群书的人。虽然没有读完大学，但九岁的时候比尔?盖茨就已经读完了所有的百科全书，所以他精通天文、历史、地理等等各类学科，可以说比尔?盖茨不仅是当今世界上金钱的首富，而且也可以称得上是知识的巨富。 笔者在给学生上课的时候经常会给他们推荐书籍，到后来学生实在忍无可忍开始抱怨，"天呐，这么多书到什么时候才能看完了"，"学软件开发，感觉上了贼船"。这时候，我的回答一般是，"别着急，什么时候带你们去看看我的书房，到现在每月花在技术书籍上的钱400元，这在软件开发人员之中还只能够算是中等的"，学生当场晕倒。（注：这一部分学生是刚学软件开发的） 对于在Java开发领域的好书在笔者另外一篇文章中会专门点评。该文章可作为本文的姊妹篇。 .9　使用合适的工具 工欲善其事必先利其器。软件开发包含各种各样的活动，需求收集分析、建立用例模型、建立分析设计模型、编程实现、调试程序、自动化测试、持续集成等等，没有工具帮忙可以说是寸步难行。工具可以提高开发效率，使软件的质量更高BUG更少。组合称手的武器。到飞花摘叶皆可伤人的境界就很高了，无招胜有招，手中无剑心中有剑这样的境界几乎不可企及。在笔者另外一篇文章中会专门阐述如何选择合适的工具（该文章也可作为本文的姊妹篇）。 &lt;br /&gt;&lt;br /&gt;    2．软件开发学习路线 两千多年的儒家思想孔孟之道，中庸的思想透入骨髓，既不冒进也不保守并非中庸之道，而是找寻学习软件开发的正确路线与规律。 从软件开发人员的生涯规划来讲，我们可以大致分为三个阶段，软件工程师→软件设计师→架构设计师或项目管理师。不想当元帅的士兵不是好士兵，不想当架构设计师或项目管理师的程序员也不是好的程序员。我们应该努力往上走。让我们先整理一下开发应用软件需要学习的主要技术。 &lt;br /&gt;    A．基础理论知识，如操作系统、编译原理、数据结构与算法、计算机原理等，它们并非不重要。如不想成为计算机科学家的话，可以采取"用到的时候再来学"的原则。 &lt;br /&gt;    B．一门编程语言，现在基本上都是面向对象的语言，Java/C++/C#等等。如果做WEB开发的话还要学习HTML/JavaScript等等。 &lt;br /&gt;    C．一种方法学或者说思想，现在基本都是面向对象思想（OOA/OOD/设计模式）。由此而衍生的基于组件开发CBD/面向方面编程AOP等等。 &lt;br /&gt;    D．一种关系型数据库，ORACLE/SqlServer/DB2/MySQL等等 &lt;br /&gt;    E．一种提高生产率的IDE集成开发环境JBuilder/Eclipse/VS.NET等。 &lt;br /&gt;    F．一种UML建模工具，用ROSE/VISIO/钢笔进行建模。 &lt;br /&gt;    G．一种软件过程，RUP/XP/CMM等等，通过软件过程来组织软件开发的众多活动，使开发流程专业化规范化。当然还有其他的一些软件工程知识。 &lt;br /&gt;    H．项目管理、体系结构、框架知识。 正确的路线应该是：B→C→E→F→G→H。 &lt;br /&gt;    还需要补充几点： &lt;br /&gt;    1）．对于A与C要补充的是，我们应该在实践中逐步领悟编程理论与编程思想。新技术虽然不断涌现，更新速度令人眼花燎乱雾里看花；但万变不离其宗，编程理论与编程思想的变化却很慢。掌握了编程理论与编程思想你就会有拨云见日之感。面向对象的思想在目前来讲是相当关键的，是强势技术之一，在上面需要多投入时间，给你的回报也会让你惊喜。 &lt;br /&gt;    2）．对于数据库来说是独立学习的，这个时机就由你来决定吧。 &lt;br /&gt;    3）．编程语言作为学习软件开发的主线，而其余的作为辅线。 &lt;br /&gt;    4）．软件工程师着重于B、C、E、D；软件设计师着重于B、C、E、D、F；架构设计师着重于C、F、H。&lt;br /&gt; &lt;br /&gt;    3．如何学习Java? &lt;br /&gt;    3.1 Java学习路线 &lt;br /&gt;    3.1.1 基础语法及Java原理 基础语法和Java原理是地基，地基不牢靠，犹如沙地上建摩天大厦，是相当危险的。学习Java也是如此，必须要有扎实的基础，你才能在J2EE、J2ME领域游刃有余。参加SCJP（SUN公司认证的Java程序员）考试不失为一个好方法，原因之一是为了对得起你交的1200大洋考试费，你会更努力学习，原因之二是SCJP考试能够让你把基础打得很牢靠，它要求你跟JDK一样熟悉Java基础知识；但是你千万不要认为考过了SCJP就有多了不起，就能够获得软件公司的青睐，就能够获取高薪，这样的想法也是很危险的。获得"真正"的SCJP只能证明你的基础还过得去，但离实际开发还有很长的一段路要走 &lt;br /&gt;&lt;br /&gt;    3.1.2 OO思想的领悟 掌握了基础语法和Java程序运行原理后，我们就可以用Java语言实现面向对象的思想了。面向对象，是一种方法学;是独立于语言之外的编程思想;是CBD基于组件开发的基础;属于强势技术之一。当以后因工作需要转到别的面向对象语言的时候，你会感到特别的熟悉亲切，学起来像喝凉水这么简单。 使用面向对象的思想进行开发的基本过程是： ●调查收集需求。 ●建立用例模型。 ●从用例模型中识别分析类及类与类之间的静态动态关系，从而建立分析模型。 ●细化分析模型到设计模型。 ●用具体的技术去实现。 ●测试、部署、总结。 &lt;br /&gt;&lt;br /&gt;    3.1.3 基本API的学习 进行软件开发的时候，并不是什么功能都需要我们去实现，也就是经典名言所说的"不需要重新发明轮子"。我们可以利用现成的类、组件、框架来搭建我们的应用，如SUN公司编写好了众多类实现一些底层功能，以及我们下载过来的JAR文件中包含的类,我们可以调用类中的方法来完成某些功能或继承它。那么这些类中究竟提供了哪些方法给我们使用？方法的参数个数及类型是？类的构造器需不需要参数？总不可能SUN公司的工程师打国际长途甚至飘洋过海来告诉你他编写的类该如何使用吧。他们只能提供文档给我们查看，Java DOC文档（参考文献4.4）就是这样的文档，它可以说是程序员与程序员交流的文档。 基本API指的是实现了一些底层功能的类，通用性较强的API，如字符串处理/输入输出等等。我们又把它成为类库。熟悉API的方法一是多查Java DOC文档（参考文献4.4），二是使用JBuilder/Eclipse等IDE的代码提示功能。&lt;br /&gt; &lt;br /&gt;    3.1.4 特定API的学习 Java介入的领域很广泛，不同的领域有不同的API，没有人熟悉所有的API，对一般人而言只是熟悉工作中要用到的API。如果你做界面开发，那么你需要学习Swing/AWT/SWT等API；如果你进行网络游戏开发，你需要深入了解网络API/多媒体API/2D3D等；如果你做WEB开发，就需要熟悉Servlet等API啦。总之，需要根据工作的需要或你的兴趣发展方向去选择学习特定的API。 &lt;br /&gt;&lt;br /&gt;    3.1.5 开发工具的用法 在学习基础语法与基本的面向对象概念时，从锻炼语言熟练程度的角度考虑，我们推荐使用的工具是Editplus/JCreator+JDK,这时候不要急于上手JBuilder/Eclipse等集成开发环境，以免过于关注IDE的强大功能而分散对Java技术本身的注意力。过了这一阶段你就可以开始熟悉IDE了。 程序员日常工作包括很多活动，编辑、编译及构建、调试、单元测试、版本控制、维持模型与代码同步、文档的更新等等，几乎每一项活动都有专门的工具，如果独立使用这些工具的话，你将会很痛苦，你需要在堆满工具的任务栏上不断的切换，效率很低下，也很容易出错。在JBuilder、Eclipse等IDE中已经自动集成编辑器、编译器、调试器、单元测试工具JUnit、自动构建工具ANT、版本控制工具CVS、DOC文档生成与更新等等，甚至可以把UML建模工具也集成进去，又提供了丰富的向导帮助生成框架代码，让我们的开发变得更轻松。应该说IDE发展的趋势就是集成软件开发中要用到的几乎所有工具。 从开发效率的角度考虑，使用IDE是必经之路，也是从一个学生到一个职业程序员转变的里程碑。 Java开发使用的IDE主要有Eclipse、JBuilder、JDeveloper、NetBeans等几种；而Eclipse、JBuilder占有的市场份额是最大的。JBuilder在近几年来一直是Java集成开发环境中的霸主，它是由备受程序员尊敬的Borland公司开发，在硝烟弥漫的Java IDE大战中,以其快速的版本更新击败IBM的Visual Age for Java等而成就一番伟业。IBM在Visual Age for Java上已经无利可图之下，干脆将之贡献给开源社区，成为Eclipse的前身，真所谓"柳暗花明又一村"。浴火重生的Eclipse以其开放式的插件扩展机制、免费开源获得广大程序员（包括几乎所有的骨灰级程序员）的青睐，极具发展潜力。 &lt;br /&gt;&lt;br /&gt;    3.1.6 学习软件工程 对小型项目而言，你可能认为软件工程没太大的必要。随着项目的复杂性越来越高，软件工程的必要性才会体现出来。参见"软件开发学习路线"小节。 &lt;br /&gt;&lt;br /&gt;    3.2学习要点 确立的学习路线之后，我们还需要总结一下Java的学习要点，这些要点在前文多多少少提到过，只是笔者觉得这些地方特别要注意才对它们进行汇总，不要嫌我婆婆妈妈啊。 当程序员编写好某些类，觉得很有成就感,想把它贡献给各位苦难的同行。这时候你要使用"Javadoc"工具（包含在JDK中）生成标准的Java DOC文档,供同行使用。J2SE/J2EE/J2ME的DOC文档是程序员与程序员交流的工具，几乎人手一份，除了菜鸟之外。J2SE DOC文档官方下载地址：http://Java.sun.com/j2se/1.5.0/download.jsp，你可以到google搜索CHM版本下载。也可以在线查看：http://Java.sun.com/j2se/1.5.0/docs/api/index.html。 对待DOC文档要像毛主席语录，早上起床念一遍，吃饭睡觉前念一遍。 当需要某项功能的时候，你应该先查相应的DOC文档看看有没有现成的实现，有的话就不必劳神费心了直接用就可以了，找不到的时候才考虑自己实现。使用步骤一般如下： ●找特定的包，包一般根据功能组织。 ●找需要使用类，类命名规范的话我们由类的名字可猜出一二。 ●选择构造器，大多数使用类的方式是创建对象。 ●选择你需要的方法。 &lt;br /&gt;&lt;br /&gt;    3.2.2 查书/google-&gt;写代码测试-&gt;查看源代码-&gt;请教别人 当我们遇到问题的时候该如何解决？ 这时候不要急着问别人，太简单的问题，没经过思考的问题，别人会因此而瞧不起你。可以先找找书，到google中搜一下看看，绝大部分问题基本就解决了。而像"某些类/方法如何使用的问题"，DOC文档就是答案。对某些知识点有疑惑是，写代码测试一下，会给你留下深刻的印象。而有的问题，你可能需要直接看API的源代码验证你的想法。万不得已才去请教别人。 &lt;br /&gt;&lt;br /&gt;    3.2.3学习开源软件的设计思想 Java领域有许多源代码开放的工具、组件、框架，JUnit、ANT、Tomcat、Struts、Spring、Jive论坛、PetStore宠物店等等多如牛毛。这些可是前辈给我们留下的瑰宝呀。入宝山而空手归，你心甘吗？对这些工具、框架进行分析，领会其中的设计思想，有朝一日说不定你也能写一个XXX框架什么的，风光一把。分析开源软件其实是你提高技术、提高实战能力的便捷方法。 &lt;br /&gt;&lt;br /&gt;    3.2.4 规范的重要性 没有规矩，不成方圆。这里的规范有两层含义。第一层含义是技术规范，多到http://www.jcp.org下载JSRXXX规范，多读规范，这是最权威准确最新的教材。第二层含义是编程规范，如果你使用了大量的独特算法，富有个性的变量及方法的命名方式；同时，没给程序作注释，以显示你的编程功底是多么的深厚。这样的代码别人看起来像天书，要理解谈何容易，更不用说维护了，必然会被无情地扫入垃圾堆。Java编码规范到此查看或下载http://Java.sun.com/docs/codeconv/，中文的也有，啊，还要问我在哪，请参考3.2.2节。 &lt;br /&gt;&lt;br /&gt;    3.2.5 不局限于Java 很不幸，很幸运，要学习的东西还有很多。不幸的是因为要学的东西太多且多变，没时间陪老婆家人或女朋友，导致身心疲惫，严重者甚至导致抑郁症。幸运的是别人要抢你饭碗绝非易事，他们或她们需要付出很多才能达成心愿。 Java不要孤立地去学习，需要综合学习数据结构、OOP、软件工程、UML、网络编程、数据库技术等知识，用横向纵向的比较联想的方式去学习会更有效。如学习Java集合的时候找数据结构的书看看；学JDBC的时候复习数据库技术；采取的依然是"需要的时候再学"的原则。 &lt;br /&gt;&lt;br /&gt;    4．结束语 需要强调的是，学习软件开发确实有一定的难度，也很辛苦，需要付出很多努力，但千万不要半途而废。本文如果能对一直徘徊在Java神殿之外的朋友有所帮助的话，笔者也欣慰了。哈哈，怎么听起来老气横秋呀？没办法，在电脑的长期辐射之下，都快变成小老头了。最后奉劝各位程序员尤其是MM程序员，完成工作后赶快远离电脑，据《胡播乱报》报道，电脑辐射会在白皙的皮肤上面点缀一些小黑点，看起来鲜艳无比……&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-2283622112535255840?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/2283622112535255840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=2283622112535255840' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/2283622112535255840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/2283622112535255840'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2008/12/java.html' title='【典藏】Java学习之路'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-1608096249067938971</id><published>2008-12-18T16:18:00.004+08:00</published><updated>2008-12-18T16:36:32.831+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>答华为笔试的最后一道题</title><content type='html'>好久以前曾经笔了次华为的C/C++&lt;br /&gt;前边做得都不错，最后一道题由于时间不够没做出来（60min）&lt;br /&gt;题目是：一张单链表，只允许你遍历一次，要求找出其中间节点的位置&lt;br /&gt;&lt;br /&gt;今天突然有了想法：&lt;br /&gt;定义两个指针*pa与*pb，中间结点指针*pMid==NULL&lt;br /&gt;pa=pb=head;&lt;br /&gt;while(1)&lt;br /&gt;{  &lt;br /&gt;   pa=pa-&gt;next;&lt;br /&gt;   if(pb-&gt;next!=NULL)  &lt;br /&gt;       { &lt;br /&gt;          pb=pb-&gt;next;&lt;br /&gt;          if(pb-&gt;nex!=NULL)&lt;br /&gt;             pb=pb-&gt;next;&lt;br /&gt;          else&lt;br /&gt;             {&lt;br /&gt;               //偶数节点链表无中间节点&lt;br /&gt;               cout&lt;&lt;"无中间节点";&lt;br /&gt;               break;&lt;br /&gt;              }&lt;br /&gt;        }&lt;br /&gt;    else&lt;br /&gt;        {&lt;br /&gt;           pMid=pa;&lt;br /&gt;           break;&lt;br /&gt;         }&lt;br /&gt;}&lt;br /&gt;这样子的话输出pa指针指向的当前节点，就是中间节点的位置了&lt;br /&gt;&lt;br /&gt;啊啊啊。我真是太瓜了当时怎么不聪明一下呢&lt;br /&gt;用两个指针就搞定了嘛&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-1608096249067938971?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/1608096249067938971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=1608096249067938971' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/1608096249067938971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/1608096249067938971'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2008/12/blog-post_18.html' title='答华为笔试的最后一道题'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-8466882345458830005</id><published>2008-12-15T23:53:00.001+08:00</published><updated>2008-12-15T23:53:55.306+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>开源网站</title><content type='html'>===程序员事业的50个源码网站奉献给大家===&lt;br /&gt;&lt;br /&gt;优秀网站源码、编程源码下载网站大集中 &lt;br /&gt;1.51源码：http://www.51aspx.com/ &lt;br /&gt;2.源码之家：http://www.codejia.com/ &lt;br /&gt;3.源码网：http://www.codepub.com/ &lt;br /&gt;4.虾客源码：http://www.xkxz.com/ &lt;br /&gt;5.多多源码：http://www.morecode.net/ &lt;br /&gt;6.洪越源代码：http://www.softhy.net/ &lt;br /&gt;7.锋网源码：http://www.fwvv.net/ &lt;br /&gt;8.代码爱好者：http://www.codefans.com/ &lt;br /&gt;9.爱源码：http://www.aiyuanma.com/ &lt;br /&gt;10.酷源码：http://www.kyuanma.com/ &lt;br /&gt;11.搜源码：http://www.soucode.com/ &lt;br /&gt;12.拉基源码：http://www.lajicode.com/ &lt;br /&gt;13.源码开发网：http://www.codedn.com/ &lt;br /&gt;14.源码天空：http://www.codesky.net/ &lt;br /&gt;15.源码吧：http://www.asp88.net/ &lt;br /&gt;16.绿色源码：http://code888.cn/ &lt;br /&gt;17.9号源码中心：http://www.9code.com/ &lt;br /&gt;18.网馨源码：http://www.asppsa.com/ &lt;br /&gt;20.源码天下：http://www.pccode.net/ &lt;br /&gt;21.需要源码：http://www.needcode.cn/ &lt;br /&gt;22.华夏源码：http://www.haocpu.com/ &lt;br /&gt;23.天新网：http://codes.21tx.com/ &lt;br /&gt;24.源码网：http://www.yuanma5.com/ &lt;br /&gt;25.无忧源码：http://www.5uym.com/ &lt;br /&gt;26.中国下载站：http://www.cnz.cc/ &lt;br /&gt;27.资源吧：http://www.ziyuan8.com/ &lt;br /&gt;28.启明星源码：http://www.codewww.com/ &lt;br /&gt;29.我要源码：http://www.xia51.com/ &lt;br /&gt;30.清秋源码：http://www.asp678.com/ &lt;br /&gt;31.站长下载:http://down.chinaz.com/ &lt;br /&gt;32.CSDN下载：http://download.csdn.net &lt;br /&gt;33.站长源码：http://down.cnzz.cn/ &lt;br /&gt;34.51源码：http://www.51aspx.com/ &lt;br /&gt;35.源码之家：http://www.mycodes.com/ &lt;br /&gt;36.源码网：http://www.codepub.com/ &lt;br /&gt;37.多多源码：http://www.morecode.net/ &lt;br /&gt;38.洪越源代码：http://www.softhy.net/ &lt;br /&gt;39.锋网源码：http://www.fwvv.net/ &lt;br /&gt;40.代码爱好者：http://www.codefans.net/ &lt;br /&gt;41.中国源码下载站：http://www.downcode.com/ &lt;br /&gt;42.源码开发网：http://www.bncms.com/ &lt;br /&gt;43.源码天空：http://www.codesky.net/ &lt;br /&gt;44.ASP300：http://www.asp300.com/ &lt;br /&gt;45:中国源码中心：http://www.cncode.com/ &lt;br /&gt;46：源码天下：http://www.pccode.net/ &lt;br /&gt;47.酷源码：http://www.kyuanma.com/ &lt;br /&gt;48.天新网：http://codes.21tx.com/ &lt;br /&gt;49.无忧源码：http://www.5uym.com/ &lt;br /&gt;50.资源吧：http://www.ziyuan8.com/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-8466882345458830005?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/8466882345458830005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=8466882345458830005' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/8466882345458830005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/8466882345458830005'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2008/12/blog-post_15.html' title='开源网站'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-638779957155159889</id><published>2008-12-07T21:11:00.000+08:00</published><updated>2008-12-07T21:12:13.043+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>GNU通用公共许可证(GPL)</title><content type='html'>　　有关复制，发布和修改的条款和条件&lt;br /&gt;　　0. 此许可证适用于任何包含版权所有者声明的程序和其他作品，版权所有者在声明中明确说明程序和作品可以在GPL条款的约束下发布。下面提到的“程序”指的是任何这样的程序或作品。而“基于程序的作品”指的是程序或者任何受版权法约束的衍生作品。也就是说包含程序或程序的一部分的作品。可以是原封不动的，或经过修改的和／或翻译成其他语言的（程序）。在下文中，翻译包含在修改的条款中。每个许可证接受人（licensee）用你来称呼。许可证条款不适用于复制，发布和修改以外的活动。这些活动超出这些条款的范围。运行程序的活动不受条款的限止。仅当程序的输出构成基于程序作品的内容时，这一条款才适用（如果只运行程序就无关）。是否普遍适用取决于程序具体用来做什么。&lt;br /&gt;　　1. 只要你在每一副本上明显和恰当地出版版权声明和不承担担保声明，保持此许可证的声明和没有担保的声明完整无损，并和程序一起给每个其他的程序接受者一份许可证的副本，你就可以用任何媒体复制和发布你收到的原始的程序的源代码。你可以为转让副本的实际行动收取一定费用。你也有权选择提供担保以换取一定的费用。&lt;br /&gt;　　2. 你可以修改程序的一个或几个副本或程序的任何部分，以此形成基于程序的作品。只要你同时满足下面的所有条件，你就可以按前面第一款的要求复制和发布这一经过修改的程序或作品。&lt;br /&gt;　　a） 你必须在修改的文件中附有明确的说明：你修改了这一文件及具体的修改日期。&lt;br /&gt;　　b） 你必须使你发布或出版的作品（它包含程序的全部或一部分，或包含由程序的全部或部分衍生的作品）允许第三方作为整体按许可证条款免费使用。&lt;br /&gt;　　c） 如果修改的程序在运行时以交互方式读取命令，你必须使它在开始进入常规的交互使用方式时打印或显示声明：包括适当的版权声明和没有担保的声明（或者你提供担保的声明）；用户可以按此许可证条款重新发布程序的说明；并告诉用户如何看到这一许可证的副本。（例外的情况：如果原始程序以交互方式工作，它并不打印这样的声明，你的基于程序的作品也就不用打印声明）。&lt;br /&gt;　　这些要求适用于修改了的作品的整体。如果能够确定作品的一部分并非程序的衍生产品，可以合理地认为这部分是独立的，是不同的作品。当你将它作为独立作品发布时，它不受此许可证和它的条款的约束。但是当你将这部分作为基于程序的作品的一部分发布时，作为整体它将受到许可证条款约束。准予其他许可证持有人的使用范围扩大到整个产品。也就是每个部分，不管它是谁写的。因此，本条款的意图不在于索取权利；或剥夺全部由你写成的作品的权利。而是履行权利来控制基于程序的集体作品或衍生作品的发布。此外，将与程序无关的作品和该程序或基于程序的作品一起放在存贮体或发布媒体的同一卷上，并不导致将其他作品置于此许可证的约束范围之内。&lt;br /&gt;　　3. 你可以以目标码或可执行形式复制或发布程序（或符合第2款的基于程序的作品)，只要你遵守前面的第1，2款，并同时满足下列3条中的1条。&lt;br /&gt;　　a）在通常用作软件交换的媒体上，和目标码一起附有机器可读的完整的源码。这些源码的发布应符合上面第1，2款的要求。或者&lt;br /&gt;　　b）在通常用作软件交换的媒体上，和目标码一起，附有给第三方提供相应的机器可读的源码的书面报价。有效期不少于3年，费用不超过实际完成源程序发布的实际成本。源码的发布应符合上面的第1，2款的要求。或者&lt;br /&gt;　　c）和目标码一起，附有你收到的发布源码的报价信息。（这一条款只适用于非商业性发布，而且你只收到程序的目标码或可执行代码和按b）款要求提供的报价）。作品的源码指的是对作品进行修改最优先择取的形式。对可执行的作品讲，完整的源码包括：所有模块的所有源程序，加上有关的接口的定义，加上控制可执行作品的安装和编译的script。作为特殊例外，发布的源码不必包含任何常规发布的供可执行代码在上面运行的操作系统的主要组成部分（如编译程序，内核等）。除非这些组成部分和可执行作品结合在一起。如果采用提供对指定地点的访问和复制的方式发布可执行码或目标码，那么，提供对同一地点的访问和复制源码可以算作源码的发布，即使第三方不强求与目标码一起复制源码。&lt;br /&gt;　　4. 除非你明确按许可证提出的要求去做，否则你不能复制，修改，转发许可证和发布程序。任何试图用其他方式复制，修改，转发许可证和发布程序是无效的。而且将自动结束许可证赋予你的权利。然而，对那些从你那里按许可证条款得到副本和权利的人们，只要他们继续全面履行条款，许可证赋予他们的权利仍然有效。&lt;br /&gt;　　5. 你没有在许可证上签字，因而你没有必要一定接受这一许可证。然而，没有任何其他东西赋予你修改和发布程序及其衍生作品的权利。如果你不接受许可证，这些行为是法律禁止的。因此，如果你修改或发布程序（或任何基于程序的作品），你就表明你接受这一许可证以及它的所有有关复制，发布和修改程序或基&lt;br /&gt;　　于程序的作品的条款和条件。&lt;br /&gt;　　6. 每当你重新发布程序（或任何基于程序的作品）时，接受者自动从原始许可证颁发者那里接到受这些条款和条件支配的复制，发布或修改程序的许可证。你不可以对接受者履行这里赋予他们的权利强加其他限制。你也没有强求第三方履行许可证条款的义务。&lt;br /&gt;　　7. 如果由于法院判决或违反专利的指控或任何其他原因（不限于专利问题）的结果，强加于你的条件（不管是法院判决，协议或其他）和许可证的条件有冲突。他们也不能用许可证条款为你开脱。在你不能同时满足本许可证规定的义务及其他相关的义务时，作为结果，你可以根本不发布程序。例如，如果某一专利许可证不允许所有那些直接或间接从你那里接受副本的人们在不付专利费的情况下重新发布程序，唯一能同时满足两方面要求的办法是停止发布程序。&lt;br /&gt;　　如果本条款的任何部分在特定的环境下无效或无法实施，就使用条款的其余部分。并将条款作为整体用于其他环境。本条款的目的不在于引诱你侵犯专利或其他财产权的要求，或争论这种要求的有效性。本条款的主要目的在于保护自由软件发布系统的完整性。它是通过通用公共许可证的应用来实现的。许多人坚持应用这一系统，已经为通过这一系统发布大量自由软件作出慷慨的供献。作者／捐献者有权决定他／她是否通过任何其他系统发布软件。许可证持有人不能强制这种选择。&lt;br /&gt;　　本节的目的在于明确说明许可证其余部分可能产生的结果。&lt;br /&gt;　　8. 如果由于专利或者由于有版权的接口问题使程序在某些国家的发布和使用受到限止，将此程序置于许可证约束下的原始版权拥有者可以增加限止发布地区的条款，将这些国家明确排除在外。并在这些国家以外的地区发布程序。在这种情况下，许可证包含的限止条款和许可证正文一样有效。&lt;br /&gt;　　9. 自由软件基金会可能随时出版通用公共许可证的修改版或新版。新版和当前的版本在原则上保持一致，但在提到新问题时或有关事项时，在细节上可能出现差别。&lt;br /&gt;　　每一版本都有不同的版本号。如果程序指定适用于它的许可证版本号以及“任何更新的版本”。你有权选择遵循指定的版本或自由软件基金会以后出版的新版本，如果程序未指定许可证版本，你可选择自由软件基金会已经出版的任何版本。&lt;br /&gt;　　10. 如果你愿意将程序的一部分结合到其他自由程序中，而它们的发布条件不同。写信给作者，要求准予使用。如果是自由软件基金会加以版权保护的软件，写信给自由软件基金会。我们有时会作为例外的情况处理。我们的决定受两个主要目标的指导。这两个主要目标是：我们的自由软件的衍生作品继续保持自由状态。以及从整体上促进软件的共享和重复利用。&lt;br /&gt;　　没有担保&lt;br /&gt;　　11. 由于程序准予免费使用，在适用法准许的范围内，对程序没有担保。除非另有书面说明，版权所有者和／或其他提供程序的人们“一样”不提供任何类型的担保。不论是明确的，还是隐含的。包括但不限于隐含的适销和适合特定用途的保证。全部的风险，如程序的质量和性能问题都由你来承担。如果程序出现缺陷，你承担所有必要的服务，修复和改正的费用。&lt;br /&gt;　　12. 除非适用法或书面协议的要求，在任何情况下，任何版权所有者或任何按许可证条款修改和发布程序的人们都不对你的损失负有任何责任。包括由于使用或不能使用程序引起的任何一般的，特殊的，偶然发生的或重大的损失（包括但不限于数据的损失，或者数据变得不精确，或者你或第三方的持续的损失，或者程序不能和其他程序协调运行等）。即使版权所有者和其他人提到这种损失的可能性也不例外。&lt;br /&gt;　　最后的条款和条件&lt;br /&gt;　　如何将这些条款用到你的新程序&lt;br /&gt;　　如果你开发了新程序，而且你需要它得到公众最大限度的利用。要做到这一点的最好办法是将它变为自由软件。使得每个人都能在遵守条款的基础上对它进行修改和重新发布。&lt;br /&gt;　　为了做到这一点，给程序附上下列声明。最安全的方式是将它放在每个源程序的开头，以便最有效地传递拒绝担保的信息。每个文件至少应有“版权所有”行以及在什么地方能看到声明全文的说明。&lt;br /&gt;　　&lt;用一行空间给出程序的名称和它用来做什么的简单说明&gt;&lt;br /&gt;　　版权所有（C） 19XX &lt;作者姓名&gt;&lt;br /&gt;　　这一程序是自由软件，你可以遵照自由软件基金会出版的GNU通用公共许可证条款来修改和重新发布这一程序。或者用许可证的第二版，或者（根据你的选择）用任何更新的版本。&lt;br /&gt;　　发布这一程序的目的是希望它有用，但没有任何担保。甚至没有适合特定目的的隐含的担保。更详细的情况请参阅GNU通用公共许可证。&lt;br /&gt;　　你应该已经和程序一起收到一份GNU通用公共许可证的副本。如果还没有，&lt;br /&gt;　　写信给：&lt;br /&gt;　　The Free Software Foundation, Inc., 675 Mass Ave, Cambridge,&lt;br /&gt;　　MA02139, USA&lt;br /&gt;　　还应加上如何和你保持联系的信息。&lt;br /&gt;　　如果程序以交互方式进行工作，当它开始进入交互方式工作时，使它输出类似下面的简短声明：&lt;br /&gt;　　Gnomovision 第69版， 版权所有（C） 19XX， 作者姓名，&lt;br /&gt;　　Gnomovision绝对没有担保。 要知道详细情况，请输入‘show w’。&lt;br /&gt;　　这是自由软件，欢迎你遵守一定的条件重新发布它，要知道详细情况，&lt;br /&gt;　　请输入‘show c’。&lt;br /&gt;　　假设的命令‘show w’和‘show c’应显示通用公共许可证的相应条款。当然，你使用的命令名称可以不同于‘show w’和‘show c’。根据你的程序的具体情况，也可以用菜单或鼠标选项来显示这些条款。&lt;br /&gt;　　如果需要，你应该取得你的上司（如果你是程序员）或你的学校签署放弃程序版权的声明。下面只是一个例子，你应该改变相应的名称：&lt;br /&gt;　　Yoyodyne公司以此方式放弃James Harker&lt;br /&gt;　　所写的 Gnomovision程序的全部版权利益。&lt;br /&gt;　　，1989.4.1&lt;br /&gt;　　Ty coon副总裁&lt;br /&gt;　　这一许可证不允许你将程序并入专用程序。如果你的程序是一个子程序库。&lt;br /&gt;　　你可能会认为用库的方式和专用应用程序连接更有用。如果这是你想做的事，使用GNU库通用公共许可证代替本许可证。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-638779957155159889?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/638779957155159889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=638779957155159889' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/638779957155159889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/638779957155159889'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2008/12/gnugpl.html' title='GNU通用公共许可证(GPL)'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-8547240209402478197</id><published>2008-12-05T22:58:00.002+08:00</published><updated>2008-12-05T22:58:52.250+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hack'/><title type='text'>如何创建别人进不去也删不掉的文件</title><content type='html'>建立一个别人既不能进入又不能删除的文件夹&lt;br /&gt;2008-01-05 09:03&lt;br /&gt;相信大家都遇到过自己的一些隐私文件不愿意让别人看到的情况吧，怎么解决呢？隐藏起来？换个名字？或者加密？这些办法都可以办到，其实还有一种方法，就是建立一个别人既不能进入又不能删除的文件夹，把自己的隐私文件放进去，别人就看不到啦，下面讲讲如何实现，很简单的。^_^&lt;br /&gt;&lt;br /&gt;第一步：在运行中输入cmd，回车，打开命令行窗口&lt;br /&gt;&lt;br /&gt;第二步：在命令行窗口中切换到想要建立文件夹的硬盘分区，如D盘&lt;br /&gt;&lt;br /&gt;第三步：输入MD 123..\ 回车，注意文件夹名后有2个小数点&lt;br /&gt;&lt;br /&gt;OK，搞定，看看你的D盘下面是不是多了一个名为123.的文件夹了？它是既不能进入又不能被删除的！不信你就试试看吧^_^&lt;br /&gt;&lt;br /&gt;那么，如果自己想删除或者进入这个文件夹，又应该如何操作呢？同样也很简单。 &lt;br /&gt;如果想删除，在命令行窗口中输入 rd 123..\ 回车，即可删除，当然删除前请确认里面的文件都是不需要的，不要删错了，呵呵。&lt;br /&gt;&lt;br /&gt;如果想进入，在命令行窗口中输入 start d:\123..\ (注意这里一定要是文件夹的绝对路径，否则无法打开即可打开此文件夹，你就可以随心所欲的把不想让别人看到的资料放进去啦！&lt;br /&gt;&lt;br /&gt;原文来源：http://bbs.360safe.com/viewthread.php?tid=352718&amp;extra=page%3D2&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-8547240209402478197?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/8547240209402478197/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=8547240209402478197' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/8547240209402478197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/8547240209402478197'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2008/12/blog-post.html' title='如何创建别人进不去也删不掉的文件'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-1483327964286470160</id><published>2008-11-15T23:51:00.000+08:00</published><updated>2008-11-15T23:53:05.286+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Economy'/><title type='text'>【财富论坛】郎咸平： 未来和下一代很悲惨  其二</title><content type='html'>主持人：今天上半场的演讲就到这里，感谢朗教授。首先朗教授以我为例，举个例子非常容幸，而且告诉我说，今天我犯了一个大错误，在这里我也指出朗教授最大的错误就是来烟台来晚了，大家说对不对？让我们一起期待朗教授下半场的演出，休息15分钟。&lt;br /&gt;&lt;br /&gt;主持人：对于期盼，朗教授的下半场的演讲而言，这个时间感觉更短，我们确实非常认真在听我们朗教授的演讲，不过我个人觉得还是稍微有一点点的遗憾，哪呢？整个演讲的过程中我们还是非常遗憾地听到了手机的铃声，所以我真的希望下半场的演讲过程中，亲爱的朋友能够将自己的手机打成静音或者是震动的状态，这是对朗教授最好的尊重，在朗教授走之后我说了一句话，朗教授可能没有听到，现在朗教授已经坐在了自己的座位上，朗教授说他从来没有犯过错此外，但是我说他只犯过一个错误，就是你来烟台太晚了，如果你早来烟台一年的话，至少我估计我的两个月辛辛苦苦攒下来的钱，还是两年的钱不会变成两个月，指出来我的错误，但是朗教授知道各位都套牢，但是各位和我一样，都找到了继续下去的信心，到底朗教授会让我们的信心百倍增强，我们让我们彻底的绝望，让我们一起来聆听。再次掌声有请朗教授！&lt;br /&gt;&lt;br /&gt;朗教授：其实这也不是我的错，是阳光100的错，你们怎不早点叫我过来，我们两个人都没有错，搞了半天，刚才主持人给了我很大的压力，他说下半场的演讲，能不能为各位指出一条解套的方案，我不知道怎么解套，我的水平不够，说不定我越讲越绝望都可能，你们还敢听吗？&lt;br /&gt;&lt;br /&gt;我前面讲到现在，还没有谈到次贷危机，也就是说告诉各位，就算没有次贷危机，我们中国经济发展也是这样的结果，所以，我们的问题比欧洲、比英国要严重得多得多。我们不但有二元经济所导致的民营经济的全面箫条，我们还有不可知的未来金融海啸的冲击。那么当然这个所谓的美国的次贷危机已经造成了很大的影响，可是我相信很多来宾，对于次贷危机为什么会发生以及它的冲击有多大？如何在我前面演讲的基础上更进一步阐述我的观点。那么最近我看了很多媒体的报道讲的不太正确，也想透过这个场合告诉大家到底资本主义出了什么问题？&lt;br /&gt;&lt;br /&gt;以前在美国做房屋贷款是这样做的，这帮人在做，这些人并不是信用卓著，通过一些中介，负责帮银行收集资料做第一关的审核，那么中介把资料交给银行。银行在做第二次的审核，通过以后，银行把钱直接放贷给借款人，银行比如说借出一百万，银行就少了一百万，为了让资金充裕，就把一百万的债权卖给你，你们说熟悉的房地美跟房利美，就把一百万切成一千块，一千块一张的债券卖给全世界包括中国政府，卖的三千七百亿，总共差不多5万亿，这个过程本来是非常好的，信用卓著的借款人把资料给银行，银行通过把钱借给借款人，再把债券转给房利美，再切给1000块的债券卖给大众，所以银行不缺资金，房利美拿回一百万，最后的债权全部由社会所承担，这个社会是广义的社会，包括中国政府包括欧洲社会包括美国的大众，这是一条非常完美的链条。&lt;br /&gt;&lt;br /&gt;可是，这么多年来，美国华尔街的贪婪，让这条链条彻底的变质，怎么变质？第一发明的次贷，次级贷就是允许财务报表不好的人，收入所得不够的人，信用不够的人依然可以买房子，如何透过第一道中介呢，就开始很像我们的银行，开始造假，学坏很快，学好不容易，拿一些假资料，我们做的很多了，骗银行我们骗多了，造一些假的资料，拿去忽悠你，银行所有的分析根据假的资料，所以通过审核把钱借给了借款人，银行拿这些有问题的次级债卖给房利美，他们根据这些一百万的次级债，切给一千块的债券卖给大众，中介为什么会造价，就是资本主义赖以为生的信托责任，在华尔街的贪婪下荡然无存。信托责任才是资本主义的灵魂，当中介机构一旦缺乏信托责任的下场就是整个链条被污染，只要借款人还不起债，银行债券就是差了，银行把差的债权卖给房利美，他们又发行债券卖给大众，会使得房利美还不起债。因此，造成破产现象。&lt;br /&gt;&lt;br /&gt;现在美国政府在做什么呢，直接进来救助房利美的银行，他们基本上都是受害者，直接拿钱帮他们付利息，否则后果不堪设想，各位听懂了吗？所以次贷危机的真正原因来自信托责任的破产。你们千万不要小看这次危机，因为除了次贷危机以外我发现美国还有万亿的次次债，比如说卖热狗的、毒品的，这些人他们也可以买房子，这些人叫做次次贷也可以透过无聊的中介机构伪造一大堆的财务报表卖给银行，银行卖给房利美，这个是做爆炸呢？两年以后，所以美国政府透过7千亿的目的就是修补这个次次贷带来的污染，解救房利美。&lt;br /&gt;&lt;br /&gt;但是各位请注意，这个影响太大了因为几万亿出去的，包括美国的AIG就是美国的国际保险公司，这个影响已经是危及全世界，而且更可怕的是这么多年来，为什么中国的经济成长这么健康？为什么中国这么严重的产能过剩，虽然是牺牲了环境、资源、劳动者的情况下，大量的产能过剩为什么还能存在，为什么经济不崩溃，原因是以美国为首的西方经济他们负债消化这些产品，也就是高度的负债，所有的美国人都在借钱，美国公司美国政府都在借钱，然后大量印发钞票，购买我们中国出口制造业的产品。只要美国这链条一断裂，美国人不再购买产品以后，中国过剩的产能危机立刻爆炸，为什么没有爆炸呢？就是美国人不断借款，购买我们的产品。&lt;br /&gt;&lt;br /&gt;但是，不断地借款不断借款没有关系，只要你的借款的品质是好的就没有问题，比如像以前信用良好的借款者借款没有问题，问题是今天链条被污染了，所以高负债的情况下，一个被污染的链条，立刻产生重大危机，你们听我讲到这里，就应该要干什么？如果这个负债的链条，防火墙挡不住的话，下一步结果是什么？你想想，也就是美国赖以生存的、以负债为主的大量购买中国产品的做法将立刻破产。好了，如果美国人不再购买我们的产品，我们这么多的产能过剩怎么办？请你们在座的各位来宾你们来回答我一下，我们的消费只有30%，我们根本买不起，我们买不了这么多的产品，只要美国人因为经济危机不买的话，我们生产过剩的现象立刻爆炸。&lt;br /&gt; &lt;br /&gt;我在这个时刻我根本就不想讲粉饰太平，我也不想取悦领导，因为我是真正爱国的，只有把这句话讲清楚。（掌声）只有尽早告诉政府它才能有英明对策，来宾们，你们都听懂了吗？中国产能过剩的问题，因为全球的高负债得到的缓解，他们买了我们的产品。只要我前面讲的防火墙一旦破裂，老百姓的信心一旦丧失，不再以负债的方式购买了，那么我们所面临的是企业的大量倒闭，我都不敢想。这一刻我比谁都紧张，我一直观察美国政府能不能成功救市，因为美国政府一旦失败你可不要做地上官，你可不要嘲笑美国政府部门，我们中国将付出惨重的代价。由于我看得比谁都早，看得比谁都明白，我到两点才睡，不断打电话到美国询问最新的情况是怎样？我得到的都是最新的讯息。不过告诉各位，我已经有了一些最新的讯息。我今天发现，美国的援助力不够，七千亿可能不够，你知道七千亿是什么概念吗？美国老百姓每一个人为此付出了接近3千美元。可是我认为，还是不够的。所以上周，美国股市跌了20%多，这是从包括1929年那次股灾，同样大的跌幅。你知道这意味着什么意义吗？可能大家没有这样的敏感度，我担心的是 1929年之后的经济大风波。&lt;br /&gt;&lt;br /&gt;我现在希望，英国政府也开始救市，你知道发生什么事吗？为什么救市不成功？而且上个礼拜全世界几大国家联合行动救市，同时注资，同时降低利率，各位记得吗，可是最后结果是失败的，你知道为什么失败吗？因为，每一家金融机构拿到救助款之后，而且是利息非常低的救助款之后，他把钱压在手里，都在怕，借给你不还给我怎么办？我对银行没有什么信心，所以也不借给银行，所以政府给我的流动资金，我压在银行里，既不给企业短期融资也不给银行，我全部压在手上，如果银行都不拆借的话，我们全世界的短期融资怎么办？你怎么买原材料怎么发工资，你要靠短期融资，银行如果缺短期债的话，是无法生存的，否则资金会陷入周转不灵。&lt;br /&gt;&lt;br /&gt;目前的现状是怎样的？银行系统虽然接收了政府的救助，但是由于根本的问题解决不了，大家不敢从事短期借贷，下一步就是美国的制造业、美国的企业、美国的服务业拿不到短期融资而全线崩溃。美国银行业会由于银行之间不准拆借、周转不灵，造成更多的现状。为什么这些银行不借？虽然拿到这么多钱的救助为什么不借？因为信心丧失，什么信心丧失？对于资本主义的信心丧失，我讲这句话有点可笑，你千万不要笑。&lt;br /&gt;&lt;br /&gt;最近欧洲政府包括冰岛，已经开始把金融机构国有化，为什么？因为银行信用已经破产，大家都不相信银行，甚至连银行也不相信银行，银行拿到钱也不拆借企业，免得你们拿钱跑了。所以银行信用本身已经没有办法让系统运作了，因为银行信用不够了到最后逼迫英国政府、欧洲政府以国家力量收购银行变成我们痛恨的国有企业。你知道为什么这样做吗？因为以国家的信用担保，我保证还你钱，你只要以国家的信用担保，这家金融机构一定还钱，别的银行就会借钱给他，各位听懂了没有？在我们民营化的时候，你发现全世界国有化，为什么国有化，就是重新利用政府的信用，给这个经济体系打下长期定数，你们放心的去借吧？政府为你们撑腰，不但为银行撑腰，把银行收归国有，同时由政府印钞票向企业融资，你把你的票据卖给政府，政府拿钱买你的短期融资的票据，让你发行，购买原材料，因此今天整个信用体系，破产的是各国政府出面实行全球的国有化，什么目的？重新向这个腐败不堪的金融机构注入最后一股政府信用。透过政府信用，透过政府的钱直接拆借给银行，透过政府的钱直接购买企业的短期票据，让企业拿到短期融资发薪水、买原材料。美国政府还没有这样做。他们看在眼里，心很急。因为如果你不学习欧洲政府的话，没有政府信用在里面，整个金融体系会因信息不足而全面崩溃。&lt;br /&gt;&lt;br /&gt;这是今天上午得到的最新消息，我一直在想这个事怎么讲，我讲的是最前沿的，美国政府也在考虑要不要把美国金融机构变成国营企业呢，这和美国政府的民营理念有悖不太愿意这样做，但是如果不这样做的，你的七千亿美救市计划很难成功，因为大家的信心丧失，我相信你们想问我一句话，你们问我说，朗教授政府信用是不是最后一步？你们想不想问这句话？对的，这是最后一步了。如果问我下面一句话，如果政府信用也不行呢，完了。那完了，没有别的办法了。我都不想演讲下去了。&lt;br /&gt;&lt;br /&gt;走到这一步，整个金融体系的问题，会使得各国无力再以负债的方式成长，因此，就不会再以负债的方式购买我们产能过剩所制造的产品，听懂了吗？下一步就是什么呢？所以说中国不可能幸免于难，我也请各位来宾密切注意这几天的发展，你们要随时随地按照我今天告诉你们的思路注意观察一下，你会发现今天两点开始，欧洲各国政府甚至我怀疑美国政府要大量实行全面国有化。否则，无法注入最后一道强心剂。因为资本主义的信心完全崩溃，信用体系完全崩溃。&lt;br /&gt;&lt;br /&gt;你看我讲到这里，大家鸦雀无声了，你们才知道事态的严重。竟然还有无聊学者胡说八道说明天会更好，大家放心。是看不懂呢，还是怎么回事儿？刚才主持人问我如何解套，我不知道，我没有这个能力解套，因为我发现美国政府也解不了套，郎咸平什么东西，还问我：朗教授，我们该做什么投资，你疯了，我昨天早上到今天中午很多企业家问我，我们应该投资什么行业，我一开始告诉你，你疯了，我当时讲你疯了，你可能觉得我在开玩笑，我讲到现在这样说你该理解了吧？&lt;br /&gt;&lt;br /&gt;你晓不晓得什么危机在你面前，全世界各国的政府现在已经拟定了三个方针：第一个方针，就是政府出面协助各个金融机构的负债问题渡过难关。第二个问题，充足各个金融的资本，如果还不行，第三个，充足国有化，如果还不行有没有第四个，到这一天，防火墙会正式爆破，如果国有化解决不了问题，防火墙宣告爆破，我讲的工商链条多米诺骨牌效应将一发而不可收拾，中国经济发展靠出口创汇，基本是依靠过剩的产能发展。都听懂了吗？&lt;br /&gt;&lt;br /&gt;当然了这个事件，未来是怎么走势我也无法预测。其实他们也是走一步算一步，以美国为首的西方国家作梦也没有想到连政府注入几千亿资金的结果还是无法救市。因为，源自于企业的信念还是过窄，逼迫政府出来用政府力量帮助银行完成短期拆借，帮助企业完成短期拆借，帮助他们继续生存下去。现在各国政府正在用政府的力量协助银行进行短期拆借，利用政府的力量协助企业进行短期融资，以维持一个正常的营运，而不要说发展。&lt;br /&gt;&lt;br /&gt;你们听完我的演讲之后，以后再听到学者有任何乐观的呼吁你不要听了，你心里要做准备，没有人希望最坏的情况发生，我告诉各位来宾，我第一个做的演讲是跟次贷危机完全无关的中国经济问题。如果你们已经觉得日子很难过了，那么我第二个阶段的演讲将带来海啸般的冲击，我现在随时随地密切观察欧美各国能否有效斩断工商链条，中国的出口制造业就是工商链条的重要环节。&lt;br /&gt;&lt;br /&gt;这也是为什么在第一场演讲完成以后，我告诉你们少投资，最少不要投资，减少负债，准备过冬。而且，像美国的财政部长鲍尔森以及美国的中央银行行长波兰克这些都是赫赫有名的人物，像波兰克这个人是1970年代的博士学者，我是1980年代毕业的经济学家，那个时代毕业的学者跟我们这个时代不一样，哪个时代的学者对于经济大恐慌本身研究得非常到位，不像我们80年代的学者是非常单纯的一批人，迷信市场的人基本上都是这批人，70年代的学家有非常强的政府道德责任感，当时波兰克也就是美国中央银行的主席，他的博士论文就是 1929年经济大恐慌，他说当时美国之所以发生经济大恐慌就是因为没有设立防火墙。&lt;br /&gt;&lt;br /&gt;中国的企业、中国的制造业，在大海啸没有冲击之前为什么这样的不抗压，各位想想？所以我前面说了，第一，汇率的上升，第二成本的上升，第三劳动合同法，第四宏观调控，这四件事情和我现在讲的第五件事情相比它们的力量是非常小的，也就是在汇率、成本、劳合同法以及宏观调控的冲击下，我国制造业如此不抗压，为什么？这四项冲击远远比不上我刚才讲的大海啸。就算这四项小冲击，我们的制造业也抗不住，30%的企业倒闭，甚至到了年底有可能超过50%，我希望不会，政府应该出来救企业，我诚恳地希望不会到50%，但是请问这四项冲击为什么我们企业抗不住？因为，我们和欧美各国的企业相比，我们有一个天生的缺陷，那就是我们引以为傲的制造业大国误导了我们的政府部门，你真的以为我们是制造业大国吗？你在媒体上所看到的都是什么样的？都是错的，你真的这样认为吗？真正的制造业大国是美国，才不是中国呢，我们是自己感觉良好。那么我们中国制造业目前在什么环境之下呢？我给你讲一句最形象的话，中国经济发展到最后中国取得了 GDP，美国取得了利润，也就是说我们制造业的格局就是创造的GDP，最后的利润全部被美国席卷，这句话什么意思，为什么我们这么不抗压，因为我们的制造业不但破坏环境、浪费资源，而且是整条产业链中价值最低的过程。&lt;br /&gt; &lt;br /&gt;我以芭比娃娃为例，我们广东东莞所生产的芭比娃娃卖到美国是9.9美元一个，接近10美元，请问10美元减掉1美元的9美元是如何创造出来的？那就是美国企业的灵魂，它透过6大块所创造出来，包括产品设计、原料采购、仓储运输、定单处理、批发经营、终端零售，创造出了9美元的产值，6大块加上中国一块的制造，叫做六加一的整个流程就是产业链，我们这么多年的经济成长，我们取得了整条产业链的“一”，而欧美各国掌控了整条产业链的“六”，这个价值是怎么回事儿？我们的制造业者在破坏环境、浪费资源、剥削劳工的基础上，我们每创造出一百万美元的产值，我们同时替美国创造出九百万美元的产值，我们辛辛苦苦创造出一亿美国的产值，我们同时替美国创造出9亿美元的产值。因此，中国越制造，美国越富裕，美国席卷了90%的价值。&lt;br /&gt;&lt;br /&gt;那么这一种生产模式叫做国际分工。而中国被分到了最差的一项，破坏环境、浪费资源、剥削劳工。我们现在常常以1.8万亿感到扬扬得意，你晓不晓得我们怎样创造出这样的成绩？我们掌控着10%的价值，我们创造出1.8万亿美元的外汇，也就是1.8万亿除以10%等于18万亿，也就是我们出口制造业替全世界创造出18万亿的产值，我们只分到了1.8，其他的都是欧美的，你知道18万亿是什么概念呢？那就是在座的各位来宾和全中国的工人80年所加起来的工资的总和，这就是18万亿被国际分工席卷。&lt;br /&gt;&lt;br /&gt;所以我常讲，今天西方帝国主义对中国的掠夺和19世纪免费掠夺非洲差不多，当时非洲是0%，现在中国拿10%，在我看来没有什么差别，至少非洲没有环境污染等的问题，我们的10%伴随着污染环境，浪费的资源以及被剥削的劳工，由于你是处在产业链的最底端。因此你特别抗压，因为真正掌控定价权的是整个产业链的六，一是不掌控定价权，所以你能不能想象，欧美各国尤其是以美国为首的欧美国家，不但席卷的90%的利益，而且掌控着我们的定价权，我们不掌控。这就是为什么，创造了汇率，成本、劳动合同法以及宏观调控之后我们的企业必须全力承担这些成本，因为我们不掌控定价权，我们无法提升售价，各位都懂了吗？这就是为什么我说的投资营销环境急速恶化，因为你不掌控定价权。&lt;br /&gt;&lt;br /&gt;到最后的结果，大家不想干了，不想干的结果就像你们一样炒股去了，还被套牢了，想想这都是错的，你看，美国，掌控着定价权，透过6+1的6席卷了90%的产值，这种情况，他们竟然发生了次贷危机，你能不能想象他们的防火墙一旦破裂以后，洪水将席卷90%的产值，想到了没有？我前面跟大家讲的就是说防火墙破裂之后会影响到这个行业、这个行业，现在我把这个数字告诉你，美国防火墙破裂的结果冲击到以美国为首的90%的产值。然后再冲击到中国的10%的产值。&lt;br /&gt;&lt;br /&gt;我就是把第二段演讲的前半段全部给你量化。因此，美国、欧洲的做法三步骤：第一保护银行的债权，第二保护银行资本金，第三全部国有化，如果能够斩断工商链条的话，美国所创造的90%才能保存住。如果抗不住的话，全部席卷90%，只要冲击90%，就同时冲击我们的10%。所以现在已经不是一个金融危机的问题了。各位来宾都听懂了吗？&lt;br /&gt;&lt;br /&gt;那你可能问我了。那样我们这么多年的产业政策没有想到这个吗？我告诉你没有。我们这么多年的产业政策呼吁企业利用我们的廉价劳动力、呼吁企业品牌升级、呼吁企业产业升级，没错吧？我告诉你，都是错的，因为真正的竞争力来源于6+1的高效整合，我们应该用政府的力量让我们的企业做成6+1的高效整合才能掌控定价权。只有掌控定价权我们才有生存的机会。&lt;br /&gt;&lt;br /&gt;可是目前我们的制造业是大量的倒闭。那么请各位来宾想&lt;br /&gt;&lt;br /&gt;一想。像郎咸平这种水平都会看得明白的事，你们认为美国政府看不明白吗？你相不相信，美国政府的要员比我聪明得多得多，我已经够聪明得了，他们比我还聪明，当然你不一定相信，你说朗教授谦虚了，今天这个年头还能自认为自己不足的人太少了，中国人牛人太多，不知道还不行了，连我这种水平的人我都看得这么清楚，何况美国。&lt;br /&gt;&lt;br /&gt;这位女士说对了大量热钱进入中国，大量收购中国的制造业，为什么？中国的制造业1，美国的产业链是6，6不能没有“1”啊，听懂了没有？如果1崩溃的话，“6”也一定会崩溃，“6”一定有“1”做基础，才能发展，如果我们不生产芭比娃娃卖给美国，它怎么能创造出6的产值呢？我再一次告诉我们的地方政府你们必须救自己。“1”最重要了。因为我们的“1”正在被大量的收购，我觉得这位来宾比我聪明，他已经把我结论讲的差不多了。&lt;br /&gt;&lt;br /&gt;中国进出口总额的55%都是外资，中国高科技出口的87%是外资，中国的汽车高端零配件90%是外资，中国你们吃的粮油85%是外资，中国山东、河北的几个粮食局已经被外资收购了，知道吗？中国的养猪的产业链某条产业链被收购了。这就是今天你所面临的格局，你知道这些数据吗？你可能都不知道，为什么不知道，因为你们从来不介意，我今天演讲的时间特别长，我已经把这些全部讲了，我们就算保有6+1的“1”，而且产值这么低的而且还是大量被收购的情况下，次贷危机的冲击还没有开始。&lt;br /&gt;&lt;br /&gt;可是这些现象的原因就是中国的经济成长是靠着推动GDP所拉动，就是30%的部门透过钢筋水泥拉动的成长，70%都是过冷的制造业，这种特殊的二元经济 30%过热，70%过冷。经过了汇率、成本、劳动合同法以及宏观调控的冲击之下，过冷的制造业更冷，所面临的投资环境更加恶化。而过热的地方政府过热，我记得上一次去山西，有的人说你看我们的山西最近发展很好，我说中国的哪个地方发展不好，哪个官员一上任也是搞建设，推动GDP的工程建设，透过30%拉动 GDP这就是各级政府做的事。越这样做，越多的资源流入过热的部门，过冷的制造业为什么这么不抗压？原因就是我们已经进入到了一个前所未有的产业链的暂停时代。以美国为首的欧美国家控制着整条产业链的“6”的，我们在破坏环境、浪费资源、剥削劳动的基础上我们创造的“1”，更严重的是这样使得我国的制造业产生严重的生产过剩现象，而这个生产过剩现象透过美国这么多年的负债增长的形势全部被它吸收了，所以我们看起来是表面的繁荣，我们这么多的产品好像是更富裕了，那个制造，你已经跟次贷危机牢牢挂钩了，因为购买你产品的原因就是负债，我们是靠美国的负债支撑起我们的出口制造业使得我们过剩的产能透过美国消化掉，&lt;br /&gt;&lt;br /&gt;但是美国的次贷危机使得美国高负债的时代即将终结，你可以相信我。未来一定是负债比例大幅降低，因此对于中国产品的需求必定大幅降低，所以中国产能过剩的现实情况将会曝露无疑，这个时刻就是次贷危机防火墙爆炸的时候，不但冲击了美国所能够掌控的90%的产值，同时冲击到中国只有10%的产值的过剩的出口制造业，产能过剩的制造业。&lt;br /&gt;&lt;br /&gt;下一步是什么呢？我也不想讲了，因为你已经听懂了多米诺骨牌效应，下一步是什么呢？再下一步是什么呢？会形成一个恶性循环。大家怎么都不吭气了，其实你们今天不应该来听我的演讲，不听的时候，模模糊糊过得挺好的，国家有吃有喝的，过得挺好的，一旦听懂以后再也睡不着了，相不相信我，你们每天晚上今天晚上都会看凤凰卫视，看美国的次贷危机，国有化会不会成功，一旦失败，朗教授告诉我们的最后一招，一旦国有化失败全盘崩溃，回去不要老是看《汉武大帝》什么的连续剧了，回去看看美国的国有化会不会成功。&lt;br /&gt;&lt;br /&gt;主持人：朗教授的演讲到这里就结束了，接下来的时间就是我们在场的来宾向我们朗教授提问的时间，首先有请我们舞台左侧的朋友提问。&lt;br /&gt;&lt;br /&gt;搜房网：朗教授你好，我是搜房网的网友提问一个非常实际的问题，就说在当前的情况下，如何能让自己日子保持得好一点，甚至过得更好一点。&lt;br /&gt;&lt;br /&gt;朗教授：过得更好一点不可能的，不要过得更坏就不错了，我建议各位网友各位来宾，注意在这个时刻千万不要想赚多少钱，能够少赔多少钱是真的。这是我告诉你们的，如果你们想买外币保值的话，一定要买最保守外币，什么目的呢？不赚钱，也就是你买欧元一定要买等量的美元，保证不赚钱，也保证不亏钱，这是我给网友的建议。&lt;br /&gt;&lt;br /&gt;提问：我是烟台日报的传媒记者，我问一下，今天总体感觉世界一片黑暗，我们改革开放30年，次贷危机来了以后，会不会是辛辛苦苦30年，会不会一夜回到改革前。&lt;br /&gt;&lt;br /&gt;朗教授：这个问题问得太好了，这个不是我造成的该黑暗就是黑暗，该乐观就是乐观，为什么你们来听我的演讲，为什么大家欢迎听我的演讲，我是讲实话的，有良知的学者我不想骗你们，如果你认为是悲观就是悲观，但是事实只有一个，我今天给你讲的是事实，只要你要怎么做，千万不要问我，该不该炒股，这个我是不回答的，你只要了解了我讲的所有故事，该有的事你自己做判断。&lt;br /&gt;&lt;br /&gt;提问：我记得第一次听您的课是在北京，当时给我印象最深的是在北京，出了三个，你错了，你错了，你还是错了，今天听得比较多的是你疯了，包括今天的主题，当时不是说您，我想说的是，因为在座可能更多的是我们的民营企业，包括房地产的一些行业，如果您是生在烟台，在这个企业之中，根据你的大的形势恩，我觉得还是有机会，你刚才也提到乱世出英豪，我想提两个比较简单的，企业能否自救，下一步问题是如何自救。谢谢。&lt;br /&gt;&lt;br /&gt;朗教授：你的问题问得非常好，我想这样回答你，烟台，所受到的冲击远远小于广东、江浙。尤其是你们房地产价格是这个价位之下的话，你们所受到冲击也会远远小于温州等地，如果冲击不这么大的的话，制造业本身需要烟台市政府的大力救助。那么，我这个时刻，我认为一个比较有效的短期的办法，是我们的制造业目前千万谨慎小心，不要随意扩张产能，维持现状，继续改进你的效率，降低成本，同时更重要的是烟台的民营企业需要政府大力的救助，因为一切财富的基本来源来源于企业，一定是企业赚钱了，才会给员工更多的薪水，只有员工拿到更多的薪水，烟台才会更繁荣，大家不要只看GDP，如果烟台只是少数几个城市，首先放弃 GDP 的理念，着重企业的利润的话，你就能排在名列前茅，就能更容易渡过难关，不要只看GDP，GDP不重要，政府能够把资源移到对企业的直接救助方面，这就是对企业最大的帮助，也就是对烟台市最好的建设，这个需要一个思维的转变，什么转变呢？你不要认为救助制造业是违反市场化行为，你想想我今天的演讲，国有化是目前全世界的潮流，我们如果能够未雨绸缪，透过政府的力量援助制造业渡过难关，将来烟台市一定能够更快上一个台阶。各位理解我意思吧？&lt;br /&gt; &lt;br /&gt;提问：最近我们注意到十七届三中全会正在召开，好象是经过这样一个磨难以后，我们才认识到以前所谓的出口消费三辆马车的次序应该改改，改成拉动内需在前面，我们想听听朗教授对十七届三中全会的精神，怎样可以走出困境。谢谢。&lt;br /&gt;&lt;br /&gt;朗教授：大方向我们肯定是赞同的，但是你是提的什么内需？千万不要把国家的有限资源又拉到以GDP为主的资源，我们资源的是有限的，不要为了提升我们的 GDP又去大量建公路、桥梁又搞这个，最后是什么下场呢？就是把制造业的谨慎的资金投入到过热的部门，使得我们制造业更难，提升内需就是我们政府要学习欧美各国的做法，将大量资源投入到与民生相关的制造业跟服务业上，这才是我们未来该走的路，我认为最迫切的做法是利用政府的力量协助制造业从过热的部门转入过冷的部门，帮助制造业渡过难关。因为山东讲的是原则性的问题，我建议一个原则性的方法来回答你，我认为这是解决目前难题的方法，至于次贷危机的危机，我们没有办法，我们只能是坐以待毙。&lt;br /&gt;&lt;br /&gt;提问：目前很多的专家学者都在讲目前的经济状况下中国经济转型的很好的机会。&lt;br /&gt;&lt;br /&gt;朗教授：这是胡说八道。这些家伙站着说话不腰疼，不懂中国的经济，中国90%的制造业根本不可能转型，要转型就是破产，做陶瓷做肉干什么的的怎么可能转型，不在于转型而再在六加一，如果高价收购养猪行业有没有让养猪转型，那么多的外资收购我们粮油有没有改成高科技，他们收购粮油、都在做六加一的产业链的高效整合，我们传统行业没有错，升级是错的。你忘了养猪往哪里升？你讲，粮油怎么升级？要做什么呢？就在做这些公司收购我们传统制造业之后做的就是六加一高效整合而不是产业升级，理解我的意思吗？&lt;br /&gt;&lt;br /&gt;提问：中央在十七届三中全会提出经济有些扭转，如果将来有失去土地的农民会不会造成严重的社会问题。&lt;br /&gt;&lt;br /&gt;朗教授：我知道你要问的是什么，我不想说的，你要想到，一句话，如果我国的制造业产能过剩的制造业一旦受到金融海啸的冲击之后你想到下一步是什么？大量的失业，你只能是吸收农村人口，别的话我不讲了。&lt;br /&gt;&lt;br /&gt;提问：你一再强调国有化，我想问一下国有化和私有化的问题。&lt;br /&gt;&lt;br /&gt;朗教授：她问的问题是我们这么多年的改革是反潮流的，别人忙着退市我们忙着上市，这是一个学习的过程，并不是说四年来都在国有化，全世界的金融机构都是私营的多，上市的多，这是为什么我们国家也走上这条路，只是今年的这两个礼拜开始变成国有化，我也相信这次演讲以后我们政府会有深刻的认识，重新做一个思考私有化不是目的，目的是如何保护金融体系的问题，私有化也好，国有化也好都不是问题，只要保持稳定才是最大的前提，我们过去的私有化是有问题，我们是以私有化而私有化，我们未来要为了维持金融稳定而实行国有化或者是私有化。欧美国家为什么要国有化并不是变成社会主义，他们注入最后一剂强心剂，就是提升信心，国有化不是目的，所以大家不要搞错了不要认为欧美在国有化。我们就呼吁政府国有化，我们今天呼吁政府一定要在维持金融稳定的前提下，产生各种有益的方案，达成金融稳定，维护老百姓的信心，目前欧美是国有化，中国最重要的是维持老百姓的信心，我们中国也要做这样的事，维持老百姓的信心，至于怎样做也是更要考虑的问题，理解我的问题吗？&lt;br /&gt;&lt;br /&gt;提问：在现在的经济环境作为经济学家与我们普通老百姓提一点建议，现在的情况下，投资房产还是比较保值的吗？&lt;br /&gt;&lt;br /&gt;朗教授：房地产我这样讲好了，以亚洲各国为例，包括香港台湾韩国为例，房地产在足够长的时间下，包括十年到二十年以上，相对而言比股票市场更能够保值，这样波动是有的。我们现在会走上低谷也会，只要经济持续增长，情况会有所转换。你这样问的话，我相信回答是比较简单的，以台湾为例，台湾很富裕，原因和台湾老百姓都喜欢购买房屋有关系。举个例子，我们观察到广东的倒闭的企业会不会到台北，130亿美金，投入到台北干什么？买房子。陈水扁住的特区有一半是广东的台商买，有这种习惯，为什么这样的习惯呢？是台湾人致富的方法就是靠房地产。&lt;br /&gt; &lt;br /&gt;提问：你好，朗教授，我只是一个高二的学生，所以我的问题可能过于浅显，请您多多包涵，我想问的第一个问题，你很有自信，而且你也很高的预见性，你今天分析的是我们现在所处的环境是多么灰暗，我想你为什么不分析为什么会这样分析，为什么不从美国的整个经济体系的建立过程中，从一战开始整个资本主义的经济体系是怎样建立的，为什么不从根源上探讨？&lt;br /&gt;&lt;br /&gt;朗教授：应该从资本主义的本质开始，但是今天的时间不够。&lt;br /&gt;&lt;br /&gt;提问：第二个问题我想问一下，前一段有学者说我们当下是处在人口红利期，我们今天知道这个说法是错误的，当我们大学毕业以后，我们面临的问题将会更多，我们将面临我们的爸爸妈妈爷爷奶奶将要全部靠我们养活，以及到时候考大学将会更难，研究生会更多，以及就业问题，我们现在应该做怎样的准备，才能在将来更好解决我们的人生，更好渡过我们的人生坎坷。&lt;br /&gt;&lt;br /&gt;朗教授：你请坐，非常好，这位女同学，你高二是不是？你能问这么深刻的问题，我们对我们的下一代感到骄傲，我非常重视年轻人的问题，我才站起来回答你。因为她问的问题很深刻，我也希望我今天给你的回答能够改变你的一生，改变你的子女的一生，我非常严肃地站在这里，把你的两个问题做一个仔细的回答。我告诉各位我们的民族，我们这么多的年轻人都在学什么？讲一句难听的话，我们大学教育本身就是在摧残创造力。我们在干什么，我们在培养解题高手，像你有这种思路的女孩，甚至老师不会喜欢你，我必须以对你的重视表达我对教育的立场。我们中国的教育目的是在干什么，目的就是在训练你成为解题高手，我告诉你A我期待你讲 B，我告诉你C我期待你讲D，这么多年来，不要说朗教授的答案争议性很大，可是我们的大学教育没有培养学生这种能力，没有学生认为说这一切搞的都是错的，为什么今天一开始我们告诉你我们的媒体做的都是错的，我告诉你我们要否定A，你问的问题都是错的，我凭什么按照你的意愿回答B，到最后大家认为我可能是一个低端，偏激，甚至是争议性大，到最后发现原来思考的问题本身就是错误的，也就是说这种错误并不是一个学者专家的错误而是整个教育体系出了严重的错误，你们的子女只要在读完本科的结果就会是这样的结果，你告诉他A就是A，不会怀疑A是错的或者是C的错的，各位理解我的意思吗？我希望每位父母把我的话带回去给你的子女，怀疑告诉你的一切都是错的，只有这样才会培养你独立思考的创造力理解我意思吗？你问的我的第一个问题为什么这样重要，为什么按照我的思路讲，为什么不从y来讲，比如谈谈的原则，起源说不定这些才跟我们讲的有关，我可以讲，我在别的场合也说过，我讲了一句话，这是整个欧美国家对于整个资本主义的失望，这个话回答了你的问题，我从19世纪开始讲，我开玩笑说没有时间，但是我鼓励你这种说法，你高二学生没有听周杰伦的演唱会，你跑来听朗教授的演讲，这点我给里最高的崇敬。&lt;br /&gt;&lt;br /&gt;看到高中生一追逐明星我就不舒服，我可能是嫉妒吧，这句话我也送给各位家长，为什么中国科技大的少年班是失败的，因为他们选拔的尖子学生根本不是天才是解题高手，这就是为什么他们培养不出真正的天才，真正的天才要像你这样问问题才能成为天才，永远怀疑A。第二个问题问得非常好，我把她的问题重复一遍等她长大以后，等她毕业以后，她的曾祖父增父母搞不好没有死，曾祖母、爸爸妈妈，结婚以后对方的一家人他们两口子养这么多的老前辈，哪个时候怎么办？最糟糕的是什么你辛辛苦苦考完了大学以后，大学一毕业保证失业，养也养不起，如果这样发展的话，中国十年二十年会成为最贫穷的国家，像我们这样的老人很多了，像他这样的也是，万一她找不到事怎么办？各位来宾有没有想到这个的严重性？她找不到事怎么办？我告诉你，为什么我要站起来回答你的问题，你已经帮我们所有的大学生问了朗教授一句话，我们为什么找不到事，我们连奉养父母的能力没有，我们为什么找不到事，因为产业政策都是错的，美国大学生比例这么高，我们如何搞教改，我们搞教改的原因是我们看到的美国的大学生这么多，我们误认为如果我们同样生产这么多的大学生就可以透过人力资本扩张像美国那样富裕，因为我们到处都是大学，最后发现今年培养出580万大专生，大部分找不到事。为什么？我有孙子了，我很关心这个事，我告诉你原因，那就是因为，真正需要大学生的是整条产业链中的“六 ”制造业这个“一”是不需要大学生的。理解了吗？那么你们问我了，难道搞教改的人不知道吗？我告诉你他就是不知道。他完全不知道美国多学生比例这么高的原因，是因为他们掌控着整个产业链的“六”，而我们掌控的是“一”，制造业本身不太需要大学生，因此烟台很多的工厂从董事长到保安没有一个大学生，有些工厂不是所有的啊，因为制造业不需要大学生，产品设计、零售规划、仓储物流这个需要大学生，可是我们都不掌控。都由谁掌控呢？由欧美各国掌控着。&lt;br /&gt;&lt;br /&gt;这样一来的话，你会知道为什么中国长此下去会成为最贫穷的国家，因为我们掌控了价值链中最不重要的一个环节，因为掌控了6+1之后的“1”之后，带来的必然结果就是给你们一个最差的自然资源，挖光、用光的自然环境以及剥削的劳工给你们了，我们这一代是最对不起下一代了。这是我为什么站起来回答你的问题。&lt;br /&gt;&lt;br /&gt;主持人：我相信今天朗教授精彩的演讲给留下了深刻的印象，接下来，让我们站起来以最热烈的掌声欢送朗教授、感谢朗教授！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5785493252397810252-1483327964286470160?l=swetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swetter.blogspot.com/feeds/1483327964286470160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5785493252397810252&amp;postID=1483327964286470160' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/1483327964286470160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5785493252397810252/posts/default/1483327964286470160'/><link rel='alternate' type='text/html' href='http://swetter.blogspot.com/2008/11/blog-post_5448.html' title='【财富论坛】郎咸平： 未来和下一代很悲惨  其二'/><author><name>乱云飞渡</name><uri>http://www.blogger.com/profile/04984253997424587667</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_NQUr3ozUHrQ/SgF8i1dhQ5I/AAAAAAAAAGY/1irSTxBy_WE/S220/u%3D3339348889,2335713353%26fm%3D3%26gp%3D21.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5785493252397810252.post-3682751425031390074</id><published>2008-11-15T23:48:00.001+08:00</published><updated>2008-11-15T23:50:51.051+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Economy'/><title type='text'>【财富论坛】郎咸平： 未来和下一代很悲惨  其一</title><content type='html'>财富论坛&lt;br /&gt;&lt;br /&gt;主持人：尊敬的各位领导、各位来宾，欢迎大家来到阳光100财富中国系列活动 财富论坛烟台站的活动现场，非常容幸今天能够和大家一起在这样一个暖暖的午后一起聆听世界顶级的经济学家给我们带来的全新思维盛宴。。。。。。&lt;br /&gt;&lt;br /&gt;朗教授：今天很高兴，能够来到烟台谈谈让人沮丧的题目，当前经济热点透视，你只要谈到当前经济热点，都是坏消息。那么，请各位来宾想想，你面临的最大的危机是什么？我可以这样告诉你，我们中国改革开放30年，基本是成功，尤其是10余年来，我们经济高度发展的结果孕育出了在座各位一大批企业家。可是你知道吗？由于你所处的环境太顺了，我国经济增长太成功，因此你们这批企业家，只有个人的艰辛的奋斗历程，全中国的政府官员，全体企业家没有一个人经历过马上要发生的经济危机。昨天晚上到现在，竟然有几个企业家问我一句话，朗教授你看看现在还有什么有潜力的行业我想投资的，我只想三个字我说你疯了，你什么也不懂。你把人生看得太简单，你过去怎么成功的？你过去是顺着改革的潮流成功的，我告诉你在今天这刻是每位在座的企业家反思的事。我们的未来是什么？请各位来宾看看今天提供的数据，美国股市从年初到现在，跌了？蒸发了多少亿资金？8.5万亿美元是什么概念？这就是我们中国05、06、07三年GDP的总和全部白干了，一个国家的股市跌了这么多，它所象征的后续是极其可怕的，那就是一个持续的大萧条即将来临。&lt;br /&gt;&lt;br /&gt;而中国的股市，虽然过去有所谓的泡沫现象，但是在这里我得很遗憾地告诉各位中国股市已经跌了超过70%，这和美国1929年股市崩盘差不多，这种股市大跌是什么意义？为什么我在去年年底的时候，我敢预言中国股市大跌，就在今年五月份我在凤凰卫视《铿锵三人行》我呼吁全国股民不要对奥运有幻想，股价一定会持续下跌，讲这句话不是一个简单的我有没有胆识、敢不敢讲的问题，我为什么这样讲，当然你们知道我这样讲是对的，中国股价一反世界潮流，什么叫做世界潮流呢？那就是任何奥运主办国的国家都在奥运前大幅攀升，奥运后大幅下跌，我为了讲中国股价会下跌呢，因为我已经看到了经济危机，很多人说朗教授你的争议性比较大，我说你们是错的，我从来没有，因为我讲的到最后都会实现的。&lt;br /&gt;&lt;br /&gt;请各位想想，世界经济的次贷危机会对你造成什么冲击？在这刻我姑且把这个话题束之高阁，我先不告诉你，我可以告诉你更可怕的是危机没有来之前，我国已经产生了危机，那就是从前年到去年的股市泡沫和楼市泡沫现象，这种泡沫现象，各位来宾你们以为是我们中国经济发展更成功了吗？你认为是我们中国老百姓更富裕了吗？因此有更多的闲钱炒股吗？不是吧？我在去年年初又讲了一句话争议性的话，很多学者不高兴，我说股市泡沫跟楼市泡沫的本质不是经济更好了，不是我们更富裕了，而是制造业的回光返照，这是什么意思？我国制造业企业家所面临的投资环境已经开始急速恶化，因此，很多企业家把应该投资在制造业的钱不投资的，拿出来去干吗呢？炒楼炒股了因此大量的企业资金进入股市、楼市才是楼市泡沫和股市泡沫的真正原因。&lt;br /&gt;&lt;br /&gt;按照我的说法，下一步应该是制造业的大量倒闭，为了把我当时的观点记录在案，我绝对不放马后炮，我写了一篇文章叫做《八大危机》，出来以后，点击率超过一个亿，虽然很轰动，但是像我的人生一样从来不得到重视，因为大家都喜欢专家、学者谈一万点、八千点，不喜欢听我讲实话，不幸的是今年的经济按照我去年所说的八大危机一步一步发生。&lt;br /&gt;&lt;br /&gt;就在这个时刻，广东的媒体叫《南方人物周刊》对我做了一个专访，尤其是我写了八大危机之后，他们觉得不可思议，到现在我也记得，他说当全中国专家学者说股市泡沫、楼市泡沫、多膨胀是由于流动性过剩的时候，郎咸平不同意，郎咸平说应该是制造业的回光返照，如果郎咸平是对的，那么全国的专家、学者都是错的。因此，政府推行的宏观调控，不但不能解决问题，反而是一个落井下石的毒药，那是10年之前。我今天我有点羞答答，不好意思告诉你们，最后证明我是全国唯一对的学者，其他的都错了。（掌声）&lt;br /&gt;&lt;br /&gt;否则你们这么忙，干吗听我在这里演讲呢？那么各位想想，什么叫做流动性过剩？我们的学者竟然认为，楼市泡沫、股市泡沫，还有通货膨胀，就是简单的流动性过剩，什么是流动性过剩？那就是我们手上的钱太多，买股票，股市泡沫；买楼房，楼市泡沫；买产品，通货膨胀，因此用一个所谓的流动性过剩的学术名词都可以简单解释07年发生的一切现象。那么，我们政府所推行的宏观调控政策，竟然是以收回流动性为目的。其方法是提高利率跟提高银行利率和存款准备金率，到了年底经济工作会议更进一步加大力度，实行宏观调控。那么我请各位来宾想一想，有没有可能全中国的学者都是错的？有没有可能流动性过剩就是错的？有没有可能因为流动性过剩所推行的宏观调控也是错的？在这里，很不幸的告诉各位，这都是错的。因此，我们的制造业才如此的被动。中国经济根本就不是流动性过剩，胡说八道。由此产生的政策误导让我们的政府、让我们的企业付出了沉重的代价。而且我们的学者特别喜欢粉饰太平、取悦领导，这种方法更是让我们的经济雪上加霜。&lt;br /&gt;&lt;br /&gt;今天我针对这一切的前提，跟各位从国内一直谈到国外，让各位清清楚楚知道我国经济出了什么问题，为什么会产生泡沫现象，其实泡沫现象只是一个表面现象，真正的原因是我们整个经济发展出现了重大危机。请各位想想，我们每年10%的经济增长是怎么来的？很多股民这么问我，朗教授你看我们经济增长这么成功，每年 10%，我们的股票市场没有反映我们的经济增长的乐观现象嘛，我说你是错的，中国的股票市场是真真实实反映着我国经济的本质问题，你每年看到的10%的经济增长本身都是有问题的。什么问题呢？那就是我们整个经济增长的模式是错的。我们是以什么方式拉动经济增长啊？我们是钢筋、水泥所拉动的，也就是说你们到各地区看，各地政府搞的绿化也好，桥梁也好，这些东西拉动了中国的经济增长。那么这些部分是多少？这些部门占了经济总量的30%左右，也就是说和地方政府推动GDP工程有关的部门拉动了经济增长。那么这些部门是中国经济真正过热的部门。&lt;br /&gt;&lt;br /&gt;那么其他的民营制造业呢？基本上过冷。这些部门只占了30%左右的部门是哪些部门呢？以去年为例，包括地产、政绩工程、形象工程、大型国企，其他的融资银行和证券公司等等，这些部门你知道去年的增长率是多少呢？就以去年为例，超过30%。30%的总量，它的成本率超过百分之三十几。一平摊下来，中国全国的经济增长应该是10%左右，理解了吗？我们的民营经济对国家的贡献是非常小的。&lt;br /&gt;&lt;br /&gt;因为我们这么多年把大量的资源投入在基础建设，基础建设也就是GDP工程建设推动了10几年来的经济发展。那么这个推动表面上看起来我国取得了光荣的 GDP，实际上我们为此付出了沉重的代价。我给你举个例子，什么叫做代价，这种发展模式使得我国GDP的组成非常的畸形、非常扭曲。我们拿我们的GDP和欧美、日本等国比较，那些国家，他们是以消费需求为主要拉动的，也就是说当我想喝矿泉水的时候你生产矿泉水，当我想弹钢琴的时候你生产钢琴，我想打手机的时候，你生产手机，很正常。因此他们的70%都是消费。我们刚好相反，我们的消费只有35%，只有别人的一半，我们的GDP是什么东西呢？都是你们在外面看到的钢筋水泥，占到50%以上，欧美各国20%不到。&lt;br /&gt;&lt;br /&gt;各位了不了解这种经济会造成什么样的可怕的结果？那就是，由于我们国内的消费太少，因此，造成了大量的产能过剩，我们制造太多的消费不了，而且我们产能过剩是怎么造成的呢？我们牺牲了我们的环境，破坏了我们资源，剥削了我们的劳工，因此，产能大幅扩张，而且产能大幅扩张到什么地步？到了我们老百姓消费不了的地步，大量产品制造出来，我们只有30%的消费，因此能是出口创汇，把过剩产能生产出来的产品卖给外国，美其名曰是出口创汇，其实是埋下了定时炸弹，就在 08年爆炸了，是什么因的炸弹呢？你想想，我们只消费的30%，而我们这么多的产能，这么多产品不得不出口给别的国家消费，不但破坏了环境剥削了劳工，同时我们赚了大把的美元外汇，06年破的1万亿，07年破的1.5万亿，08年破了1.8万亿，现在正在破1.9万亿，讲问以后就是1.9万亿了。外汇大量积累的结果使得我们这种被动以出口创汇为主导的畸形经济付上的沉重的代价，人民币不断升值，不断升值的结果，回过头来打击到这些以出口为主导的民营经济。&lt;br /&gt; &lt;br /&gt;所以，二元经济成型了，什么是二元经济，那就是真正拉动经济增长的与政府推动GDP工程有关的部门过热，而其他的民营制造业开始受到的严重的打击。汇率上升首先敲响了70%的民营制造业的警钟，面临的投资环境开始紧缩。因此，过冷的部门更冷，相对而言，过热的部门更热。就在这个时刻，又由于成本的不断上升，也就是国外的进口通货膨胀使得成本不断上升。进一步又打击到二元经济中过冷的民营制造业，它的投资环境更加恶劣。&lt;br /&gt;&lt;br /&gt;同时又在这个时刻，政府推出了劳动合同法，劳动合同法的本身意义是重大的，我身为弱势群体代言人，我是非常支持这个方案的，但是这个方案的推出不能以双输为代价，必须要以双赢为的代价才有意义。第一缺乏反方向的论证，第二缺乏试点，匆忙推出之后，中国过冷的民营制造业至少1/3以上造成严重打击。因此，过冷部门的民营企业家面临的投资环境进一步恶化。所以汇率，成本、劳动合同法，我还没有讲到次贷危机，第四，政府不断加大宏观调控的力度。我不断呼吁这是错的，政府到现在才听进去，可是去年已经是数次提高利率，宏观调控的接连推出大力度的推出，目的是什么？目的是降温，可是全国学者都搞错了，中国经济没有过热只是30%推动GDP工程的是过热的，而宏观调控推出的结果是彻底打击了过冷的民营制造业，有的时候想想这个事情觉得很难过，很悲哀的，这么明显的事情，大家看不懂，我看懂了以后说郎咸平是有争议的人物，这就是我们学者对我的态度。&lt;br /&gt;&lt;br /&gt;好了，就在这个艰难的时刻，政府加大力度宏观调控是什么结果呢？通过了三个管道进一步打击了民营制造业。第一个管道，是在宏观调控的压力之下，银行从过冷的制造业部门大量收会流动性资金，去干吗呢？不是放在银行里，放在银行里还好，拿出来以后拿给过热地方政府基础设施建设，这种做法使得社会的流动性由过冷的制造业透过银行体系转到过热的银行政府中去的，因此过冷的部门更冷，过热部门由于吸收了大量的制造业的资金变得更热，这就是宏观调控的第一个管道。&lt;br /&gt;&lt;br /&gt;宏观调控的第二个管道呢，不断提高利率，不断提高银行存款准备金率的做法。再加上前面讲的汇率上升、成本上升、劳动合同法推出，因此使得二元制造业中更干不下去了，他们怎么做呢？所以民营制造业的企业家就把应该投资在制造业的钱不投资了。拿出来，打到过热的部门去干吗呢？炒楼炒股去了。这就是从06年到 07 年所开始的股市泡沫、楼市泡沫的真正因素，那就是二元经济当中过冷的制造业持续衰退，他所面临的因此各种因素不断恶化，他们更不想干了。更不想干的结果回去炒楼炒股。&lt;br /&gt;&lt;br /&gt;这就是一开始，我告诉各位房价涨得最高的区域，通常是制造业最箫条的区域，这是第二条管道，第三条管道呢？简称海尔现象。什么叫做海尔现象就是处在过冷制造业的企业像海尔的家电制造业投资经商环境恶化，所以它也不想干的，因此从过冷的部门筹集大量的资金打到过热的部门干什么呢？&lt;br /&gt;&lt;br /&gt;这三个管道，造成什么结果呢？我重复一遍第一个管道，你会发现，各地的建设是如火如荼地推行，而且代价是民营制造业的资金更缺乏，资金逆流掉，造成了过热部门修桥铺路去了，第二个管道使得大量的制造业资金炒楼炒股造成中国GDP现象的表面繁荣，这是可怕的，因为这个表面繁荣配合第三个管道大量资金流入过热部门造成整个资源的误导。第二个管道和第三个管道的配合结果使得我国表面的繁荣，因此使得大部分，我不敢说是百分之百，差不多的、几乎百分之百的地产商，在我今天讲话的这刻面临重大的危机。&lt;br /&gt;&lt;br /&gt;我前面讲的这一切现象，综合在一起，我相信你们从事企业的来宾，应该都听过，就是这么简单的。那么这种现象和流动性过剩有什么关系呢？胡说八道。讲到今天我是那种水平的学者的话，我今天五秒钟讲完了，买股市股市泡沫，买楼楼市泡沫讲完了，不知道该讲什么了，我告诉你，我才刚开始，我还没有谈到次贷危机。&lt;br /&gt;&lt;br /&gt;我国二元经济已经将我国的经济发展带入到了一个箫条的经济，就算美国没有次贷危机中国经济依然下滑，危机照跌，楼市照跌，注意没有谈到次贷危机我们就已经抗不住了，你去年看到的股市泡沫已经给各位敲响了警钟，可能你们问我，朗教授，二元经济都听懂了，听懂了吗？你一开始讲的我们的股市跟楼市反应的基本面是对的，我就以股市为例，为什么这么问呢，怪他自己，怪他不听我演讲，不学习，如果06年来听都发了，08年听也可以，现在来不及了，那就用我前面讲二元经济现象，回答我们主持人的问题，为什么你会这样问呢？&lt;br /&gt;&lt;br /&gt;06年开始的股价大涨根本就不是尚福林说的股改，他胡说八道，他什么也没有搞懂，这点我都有点同情他，什么也没有搞懂，还搞这么多东西，现在我都不会生气了，还会义愤填膺地说，我无所谓，我也没有办法了。&lt;br /&gt;&lt;br /&gt;2005 年的时候我们透过媒体我警告尚福林千万不能推行股改，它是错的。你们也知道朗教授讲话是非常具体的，我过去讲什么情况下是成功的，什么情况是失败的，这个话我不会讲，那是没有信心的学者搞的话，我很有信心，我说错一定会错，我说股改是错的，而且是百分之百错的，他不知道怎么回答了，箭在弦上，不得不发，什么回答，我给他一个回答我说箭在弦上也得撤下，他不听我的。他说，那可能怀疑说，哎呦，既然朗教授说股改失败了，为什么06年开始国家大涨呢，我怎么会错呢？我什么时候错了？我告诉你06年股价大涨的唯一原因就是二元经济已经开始生效，大量的制造业资金大量进入股市跟楼市。&lt;br /&gt; &lt;br /&gt;那么，股价大涨的现象到07年5月30号股指跌到3千点这个时候你们就应该来听我的演讲，你们相信别人说的八千点一万点，哪个时候你们买了什么股票啊？买了二线蓝筹股是不是？所以从五月底到了11月从3千点到6千点你们买二线蓝筹的股民没有赚到钱，为什么没有赚到钱？因为当时拉动股指的都是大盘股，我们称之为2：8现象或者是3：7现象，20%多的股票拉动了股指，从3千点拉到了6千点，这个二八现象和三七现象的二或者是三是什么股票呢？是地产，钢铁，水泥，政绩工程、形象工程、大型国企，其他融资银行还有证券公司等等，没有错吧？你们是不是觉得耳熟啊？这不就是二元经济当中过热部门吗？&lt;br /&gt;&lt;br /&gt;所以说，去年五月底到11月，股票市场已经完全反映了朗教授的二元经济，在这个时刻我是声嘶力竭地呼吁政府一定要解决这个问题。一定要开始救助制造业，因此这是制造业的回光返照。如果政府不出手救制造业到了，第二年制造业会大量的倒闭。&lt;br /&gt;&lt;br /&gt;后来证明我讲的是对的，就在这个时刻我写下了中国经济的八大危机的文章。你们如果到这个时刻还不来听我的演讲的时候，11月也该来听了吧，也没有来听，11 月我在北京发言，媒体对我的发言不敢兴趣，他们情愿报导说某某学者说八千点到1万点，我在北京发言，我是股价必跌，因为二元经济。你想向到了11月股指到了6千点是 20%、30%的部门拉动的，可以想想涨幅多快，这样快的涨幅一定要回调，所以二元经济中过热的部门一定要回调，而过冷民营制造业按照我当时掌控的数据是迅速箫条，而且存在迅速倒闭的危机。二元经济中过热的部门一定要回调，股指一直跌，你根本不要怀疑，我还没有讲到次贷危机，次贷危机还没有来，我只是讲国内的现状，只是告诉你们，目前全世界闹得金融海啸还没有冲击到你们，你们就已经到了这个地步了，你想想后面还有什么希望，这一切都是我们自己经济体系中孕育出来的，和国际无关。&lt;br /&gt;&lt;br /&gt;为什么我在五月份的时候，我非常严肃地警告过全国股民，不要对奥运行情有幻想，中国根本没有奥运行情，而且在节目中，当这期节目散布得很广，很多人看到的，我讲的具体到了什么地步，我呼吁全国股民，股价在奥运之前必跌根本没有奥运行情，为什么？因为，二元经济全面箫条、崩溃的结果会使得股价大幅下跌，就像美国1929年一样，所以今天股价不断大幅下跌的现实意义，就显示着未来制造业持续箫条。今年三月份我在广州照片记者招待会，我呼吁政府救市我要告诉大家，我们专家学者讲的都是废话，很多学者说政府不应该救市，让市场多元化，这些都是胡说八道。没有经历过社会主义的的血的资本主义，它们是最市场化的一点，美国政府干什么，美国政府还不理解市场吗？他们是真正的资本主义国家，是真正的市场化国家，请你看看美国政府在干什么？美国政府在救市，我们呢？市场化，让市场解决吧，胡说八道。这些学者，我一直不想想他们。现在不想他们不行了。你说作为一个学者，就算你不做研究也理解，你胡说八道讲的话，也应该是一半对一半错的，你猜的，丢一下铜板的方法，像我们的学者每次都讲错那是更难的。（掌声）&lt;br /&gt;&lt;br /&gt;像我每次都讲对，很不容易，每次都讲错更不容易。为什么救市？美国很蠢吗？不懂市场化吗？美国人才济济为什么要救市，为什么三月份开始要救市，我告诉学者你根本不懂市场，那么在今天这个场合也是我第一次发言，谈到这个话题，我觉得对你们在座的企业家非常重要。因为，今天的中国已经进入了一个前所未有的工商链条的时代，什么叫做工商链条？也就是说10年前我们从过去5 千年积累的农耕社会走向了工商链条的社会。&lt;br /&gt;&lt;br /&gt;工商链条有什么特性？那就是一个部门出现问题之后，一定会产生多米诺骨牌效应的连锁效应的产生。所以我就以我刚才讲的故事，给你们做一个解释就明白了，为什么我们的消费这么多，只有30%，原因是什么？我们中国社会保障体系缺乏的，包括医疗、教育、住房的问题没有得到彻底解决之前，社会保障体系是不足的。所以这个社会保障体系不足，你以为不足就不足啊，你以为不足就是看不起病啊，如果只是看不起病就好了，那就不是工商链条。农耕时代看不起病就看不起病算了，现在工商链条时代一旦看不起病的结果，必定产生农耕时代所没有的多米诺骨牌效应。&lt;br /&gt;&lt;br /&gt;请你想在工商链条时代，当你看不起病之后你会怎么做？下一步是什么？你不敢消费了，你要存钱，万一你父母得了病怎么办？你小孩出国怎么办？你住房怎么办？有了这些问题让你不敢消费。下一步骨牌呢？不敢消费使得我国消费非常低，占了GDP35%，下一张骨牌一定是生产过剩，再下一张骨牌必定是出口创汇，再下一张是积累大量的美元外汇，再下一张是人民币汇率升值，再下一张打击了出口制造业，再下一张出口制造业倒闭，再下一张更不敢消费，再走一圈，这是无止境地恶化循环，这就是工商链条时代的特征。&lt;br /&gt;&lt;br /&gt;我呼吁政府应该怎样做？应该在股市泡沫楼市泡沫的时候，最大的力度救助制造业什么目的？斩断工商链条，也就是说进入股市和楼市的资金是来自制造业的季度衰退，政府应该做的是我在制造业部门设立防火墙，斩断工商链条，直接救助制造业，只要把制造业的营销环境搞上取的话，资金自然回流回来，一旦斩断的结果就不会有股市泡沫，不会有楼市泡沫，就不会有现在一切的问题出来。各位听懂了吗？政府应该做的是由政府出面斩断工商链条而设立防火墙，这就是我前年开始一直呼吁政府做的事，都听不懂。一直到事情崩溃之后，才说朗教授都说过。&lt;br /&gt;&lt;br /&gt;美国政府在干什么各位来宾想想？美国，是一个最资本主义的国家，没错吧？是最强调市场化的国家没错吗？而且共和党更强调，美国政府7千亿美元救市计划的本质目的就是斩断工商链条，也就是当金融部门出现问题的时候，立刻设立防火墙来斩断工商链条，由政府工资7千亿直接救助那些受到影响的金融机构，你只有把他们救活的以后，整个社会才会安定，否则按照我们中国这种专家、学者的水平的话，市场化不要干涉，你不要干涉结果，金融机构一旦崩溃产生大量的失业，使得美国老百姓信心丧失，下一步干什么不敢消费了，下面是什么？制造业产生危机，再下一张骨牌生产力减少，再下一张骨牌失业，再一张骨牌不敢消费。好了，开始一个恶性循环，所以说金融危机会由于美国政府的不作为，会产生实体经济的危机，各位听懂了吗？所以美国政府在干什么，比任何政府都要首先斩断工商链条。就是怕金融危机波及到实体部门，而我们中国的危机来源不是金融危机而是来源于制造业的危机，我们没有斩断工商链条的结果，是使得制造业的危机波及到股市和楼市，从而造成去年的股市和楼市泡沫把各位都套牢了。主持人问的是对的，我一看你的面，我就知道差不多都被套牢了，为什么呢，就是因为我们的政府没有斩断工商链条。为什么没有斩断呢？专家学者所误导，为什么他们误导呢，他们根本不懂，农耕时代培养出来的学生没办法，都是错的。&lt;br /&gt;&lt;br /&gt;我相信我跟你们这样沟通以后，大家马上就懂了是这样一回事，原来美国政府正在斩断工商链条。我最近我看到美国的形势发展，我就告诉各位，我前面跟各位讲的讲到现在，你注意到了没有，我一再告诉你，美国的次贷危机还没有影响到中国。就算是美国从来没有发生过次贷危机的话中国的股市也是这样跌，中国的楼盘也是这样跌，因为中国制造业持续衰退结果，必然拉动股市和楼市的下滑。情况会逐日的恶化，不是逐年的恶化，也不是逐月的恶化是逐日的恶化，每天都会恶化。&lt;br /&gt;&lt;br /&gt;我记得昨天一个学者说，回应我的话对那种唱赞歌的人你应该警醒，整个国际金融形势比任何一个人想的都要难得多，但是没有冲击到中国，就在没有冲击到中国的时候我们的楼市也产生了重大危机，我刚讲了股市，现在讲到楼市，哪里的企业倒闭多，哪里的资金快速流入楼市，比如深圳，大量制造业的资金打入深圳的楼盘，而且，它的切入角度是高价楼盘。为什么？从中国台湾、亚太等地区的楼市历史来看，而长期依然看涨。06年初是1万元/平方米，到了年终是四万元/平方米，大量资金流入，炒到了高端楼盘，附近的中低档楼盘随之水涨船高，真正有泡沫的是中低档楼盘，他们水涨船高，缺乏资金的支援，一旦今年箫条之后，跌价的是中低档楼盘，高档楼盘依然坚挺，那就是地产商的资金链即将断裂，好了，即将断裂的结果就是高档楼盘抗住，那就是深圳目前的现状。&lt;br /&gt;&lt;br /&gt;在北京跟上海情况是一样的，高端楼盘价格上去以后，中低档楼盘随之水涨船高。所以北京也好，上海也好，中低档楼盘目前跌价最多，高端楼盘则不是。北京为例，三环之内，根据我的数据，还是为早，顺义跌得更多，就跟深圳的关外一样，上海也是一样，内环有行无市。&lt;br /&gt; &lt;br /&gt;最近潘石屹同志卖得不错的，我们查了一下他的资料，买潘石屹的资金51%来自山西煤老大，冲击了各级楼盘，冲击到了价格大涨。我要告诉各位，地产，长期而来，相对股票，以亚洲其他国家和地区为例，包括香港和台湾为例，它还是比较能抗通货膨胀的。&lt;br /&gt;&lt;br /&gt;那么很多人问，你这样讲我都听懂了什么，楼市泡沫股市泡沫我该怎么办？我应该卖还是怎么办？你千万不要问我我不是股评家也不是卖地产的，我只是告诉你你所看到的现象背后的本质原因是什么？你要怎么做？你自己要去做判断。&lt;br /&gt;&lt;br /&gt;那么各位再想想，下面一个问题就是理财的问题，当你了解了我前面所讲的所有的理论以后，说花一点钱怎么办？我请各位来宾注意，在经济大箫条的前期你不要有幻想，你千万不要想到去赚钱好吗？这是一个很大的思想转变，你在这个时刻能够保本就谢天谢地了，而且中国根本就没有理财的问题，什么媒体的理财专刊，根本不要看，都是错的。你有什么理财的问题，存银行、通货膨胀、买股票，股价大跌。你有什么理财的问题。好，不要问我了，是不是该买黄金，买外币，我跟你讲这个问题问的都是错的。你今天不要问我朗教授应不应该买黄金，应不应买欧元，不要这样问，这都是在平时经济稳
