“我们每一个都是由自己一再重复和行为所铸造的,因而优秀不是一种行为,而是一种习惯”

–亚里士多德

Men acquire a particular quality by constantly acting a particular way. We become just by performing just actions, temperate by performing temperate actions, brave by performing brave actions.

– Aristotle

Aristotle

一开始就知道,到最后还是要离开,
没想到这一天的到来是如此的快,

从西南一出来,送走她的那刻,
我看见了她红红的眼眶,
我告诉自己要坚强一点。

在她寝室门前,我最后一次抱住了她,
坚持让她进去,我知道我快要控制不住自己的眼泪。
直到她的背影消失在转角。

回西南一的路上,我的眼眶已经湿了。
远远看到来送行的阿栩和老黑,我控制了一下情绪。

在吉普车前,我们相视无语;
张总说该走了,
阿栩一把抱住了我。
这下我彻底的崩溃了。

四年前我离开家来上海的时候,我没有流一滴泪。
我一直以为自己足够坚强。

真的不忍离去,
这里有伴我四年成长的美丽校园,
有古朴的西南一,
有和蔼的楼管阿姨,
有同学们的欢声笑语,
还有我美丽的爱情。

大学四年是我生命中最美好的日子,
而和她相识的半年是四年中最灿烂的日子。

在这一刻,
停不住的是汽车,
止不住的是泪水。

再见了同济,
再见了同窗,
再见了MM。

不敢抬头看,怕自己的泪水被你看见
好想好想就这样抱着你直到永远永远
一开始就知道有这么一天,不得不和你分开得一天
一直都觉得这一天好遥远,直到你搬出寝室的一刻
真真切切地意识到你真的要走了,只留下我一个人了
抬头看看你的眼睛,鼻子,脸庞,头发,发现你的心也在哭泣
不要这样,亲爱的,我们只是暂时的分别,很快又会再见面的

天气特别的好,中午出来的时候
一起来到西苑三楼,一盘虾还还有一盘凉豆腐
你陪我吃的饭总是很香,害我总是吃多了
我问你晚上还能一起吃饭吗
老总打来电话说一个小时后到
这应该是最后的午餐了

好像丢了什么东西一样
我跑下楼去寻找
吉普车不见了
音乐广场,足球场,土木大楼
到处都没有你的身影
心里好着急
快出来吧,别跟我玩捉迷藏了
我想见到你
六月二十五号
你走了
你说身逢盛世,有所作为

昨天在学习在sdk下创建状态栏, 在《windows程序设计》中没有相关内容, 只好求助于msdn, 我装的是6.0中文版的,不过翻译的很不完全,还不如不翻译。 在Platform SDk/User Interface Services/Common Controls/Status Bars 中我找到了相关介绍, 庆幸的是还有示例代码,如下:

// DoCreateStatusBar – creates a status bar and divides it into
// the specified number of parts.
// Returns the handle to the status bar.
// hwndParent – parent window for the status bar.
// nStatusID – child window identifier.
// hinst – handle to the application instance.
// nParts – number of parts into which to divide the status bar.
HWND DoCreateStatusBar(HWND hwndParent, int nStatusID,
HINSTANCE hinst, int nParts)
{
HWND hwndStatus;
RECT rcClient;
HLOCAL hloc;
LPINT lpParts;
int i, nWidth;
// Ensure that the common control DLL is loaded.
InitCommonControls();
// Create the status bar.
hwndStatus = CreateWindowEx(
0, // no extended styles
STATUSCLASSNAME, // name of status bar class
(LPCTSTR) NULL, // no text when first created
SBARS_SIZEGRIP | // includes a sizing grip
WS_CHILD, // creates a child window
0, 0, 0, 0, // ignores size and position
hwndParent, // handle to parent window
(HMENU) nStatusID, // child window identifier
hinst, // handle to application instance
NULL); // no window creation data
// Get the coordinates of the parent window’s client area.
GetClientRect(hwndParent, &rcClient);
// Allocate an array for holding the right edge coordinates.
hloc = LocalAlloc(LHND, sizeof(int) * nParts);
lpParts = LocalLock(hloc);
// Calculate the right edge coordinate for each part, and
// copy the coordinates to the array.
nWidth = rcClient.right / nParts;
for (i = 0; i < nParts; i++) {
lpParts[i] = nWidth;
nWidth += nWidth;
}
// Tell the status bar to create the window parts.
SendMessage(hwndStatus, SB_SETPARTS, (WPARAM) nParts,
(LPARAM) lpParts);
// Free the array, and return.
LocalUnlock(hloc);
LocalFree(hloc);
return hwndStatus;
}

注意到上面43-44行 程序的本意是想等分状态栏成nParts, 但lpParts[i],每等分的起始位置,却在循环中呈2的倍数增长。 当nParts==4时,实际效果只有3块。 于是我改了一下, for (i = 0; i < nParts; i++) { lpParts[i] = nWidth*(i+1); } 这样显示就正常了。

另外:如要在状态栏中显示其他信息,可以通过SendMessage函数发送SB_SETTEXT消息,在WPARAM中指定状态栏的索引,LPARAM中指定将要显示的字符串。

愚人节之西塘游

昨晚,天气预报,多云转晴。
今晨,天气预报,大雨、大雨。
昨晚,兴奋难眠。
今晨,睡眼惺忪。
昨晚,狂风大雨。
今晨,微风细雨。
公交车,北广场,售票处,轻轨,汽车站,六点半,八点三刻,十二点,十四点。
好一个愚人节啊!
## 阳光下与天使游西塘 我的天使好喜欢看樱花,正逢樱花盛开,每每路过,或远观,或站在树下抬头细赏, 恰似一副美人赏花图。

今天出游,带着一台数码相机,给我的天使拍个专辑,她一定会很开心的。天公做美,一出门雨就停了。正好路过她宿舍楼后面的樱花、雨后的樱花配着天使,在我的手中变成了一副赏心悦目的图画。

天使还喜欢西塘青砖铺的小路,她像小鸟一样在我的身边,一会飞来飞去,一会叽叽喳喳,一会小鸟伊人。还老念着“小桥流水人家”,看来她向往淡薄宁静的生活。

我们俩可以互拍,要合拍只能请人了。

这里的游客个个都端着相机,找个人不难。一般都会相互帮拍,这样我们和另一对人还组成了帮拍小组,一起走了不少地方,每帮拍一次都互赞“绝配”。天使老“趁我之危”,拍下我帮拍的光辉形象。

我的照片虽拍的不多,可张张都是精华,都是天使的“呕心之作”。她就让我在那站半天,琢磨什么光线啊,构图啊,搞得我都“表情僵化”了,下次得让她也尝尝“表情僵化”的味道。

没想到在这儿也能看到樱花,于是又拍了几张樱花之照。

乌蓬船上看西塘夜景还真是别有一番风味、河岸的红灯笼倒映在水中,随水波荡漾。

一起在河边吃饭,吃臭豆腐,看两边的小店,拍河岸的风景,就是我和天使的幸福之游。 ## 西塘印象

西塘是用来回忆,用来写意的。

他的美是古朴,是宁静,是一条条的小弄,是一块快的青石,是一间间的木屋,是一座座的石桥。

虽然塔的红灯笼里亮着的不是蜡烛,而是电灯,到处可见太阳能,电表,安全出口牌等等,标识出现代感的东西,有点遗憾,但依然感激历史留下了可以感知的过去,古镇在印象上还算是完整的。

写着“客栈”,“酒”和”茶“的泛黄的招牌都把我们带回了过去,同时也把过去的印象写在了我们的脑海中。

java.util.zip对中文的支持不好,不管是文件名,还是文件中有中文都会出现乱码,更有甚者含中文的doc文件压缩后无法解压,出现 “未知的文件末端”.

java的中文问题还是挺多的,很多都要通过转码. 我转来转去老是转不好, 无奈.

后来在网上看到 Ant中的org.apache.tools.zip对中文支持比较好, 这个类在ant.jar, 解压import后,直接就可以用了,类名和java.util.zip完全一样,不需要改.

建space以来来,第一次写技术文章,见笑

问题

我在写一个基于jsp/servlet的web应用程序,其中客户有一个需求,批量下载文件,当然首先需要先用java.util.zip打包(除了打包,没想到其他方法). 由于是事先不知道客户要下哪个目录下的文件,并且文件目录下的文件也是会变的,所有要求动态的打包.

方案

有两种方案

  1. 先将选定的的文件,打包放入临时文件夹,再让用户下载.
  2. 将选定的文件,边打包,边下载.

难点

  1. 由于基于http协议的web是无连接的,将文件提供给用户下载,用户什么时候下载完成,服务器无法知道.而临时文件夹空间也是有限的,所以web服务器要把生成的zip文件删除.但要捕获到用户下载完成比较难.特别是文件传输中,用户突然把浏览器关闭.
  2. 平常我们用zip类都是通过FileOutPutStream向磁盘写文件,没有通过网络向客户端写文件的,当然也不是说不可以,think in java中文第二版438页就说到”GZIP和ZIP程序库并非只能用来处理文件的压缩-他们当然可以压缩任何形式的数据,包括即将被传送至网络连线的数据。”,遗憾的是Bruce Eckel没有留下事例代码.

解决

  1. 其实要删除文件也不是没有方法,用Session Tracking,实现HttpSessionBindingListener接口的valueUnbound方法在移除session对象的时候web服务器会自动调用这个方法,可以在这里删除临时生成的文件.(由于比较烦琐,所以没有实现,改用第二种方案)
  2. 通过HttpServletResponse的getOutputStream()方法获得ServletOutputStream,然后再得到ZipOutputStream对象就可以了,其他的和普通的文件读写一样.
    源代码:
package done.servlet;
import java.io.*;
import java.util.*;
import java.util.zip.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ZipDownLoad extends HttpServlet {
/**
* Handles GET requests
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应头,MIMEtype告诉浏览器传送的文件类型
response.setContentType( "application/x-zip-compressed" );
//inline;参数让浏览器弹出下载窗口,而不是在网页中打开文件.filename设定文件名
response.setHeader( "Content-Disposition" , "inline; filename=download.zip" );
//通过response获得ServletOutputStream对象
ServletOutputStream sos=response.getOutputStream();
//获得ZipOutputStream对象
ZipOutputStream out=new ZipOutputStream(new BufferedOutputStream(sos));
//得到要下载的文件对象
BufferedInputStream in=new BufferedInputStream(new FileInputStream("c:\\grub.exe"));
//在zip文件中新建一个grub.exe文件
out.putNextEntry(new ZipEntry("grub.exe"));
//逐字读出写入
int c;
while((c = in.read())!=-1){
out.write(c);
}
in.close();
out.close(); //这里一句一定要,要不就会打开文件出错
}
/**
* Handles POST requests
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
/**
* Destroy the servlet
*/
public void destroy () {
}
}

### 参考 1. 使用Java实现网络传输数据的压缩 2. jspSmartUpload上传组件 3. Thinking in Java 中文第二版