2010年4月

解决不同浏览器上中文文件名的下载乱码问题

目前,我们的U盘和Mail中对含有中文文件名的下载处理都不是太好


在某些浏览器下,下载显示的文件名是乱码


我又顺便看了一下其他各邮箱和网盘的处理,只有QQ处理的比较好


现在时基本上每个浏览器都能正常显示中文的文件名


花了一些时间对IE,Firefox,Opera,Chrome,Safari这几个浏览器进行了测试


总结了一下,各浏览器能正确识别的编码格式,只要按照这样的编码来设置对应的Content-Disposition


那么应该就不会出现中文文件名的乱码问题了


 


首先,Content-Disposition值可以有以下几种编码格式


1. 直接urlencode:


    Content-Disposition: attachment; filename="struts2.0%E4%B8%AD%E6%96%87%E6%95%99%E7%A8%8B.chm"


2. Base64编码:


    Content-Disposition: attachment; filename="=?UTF8?B?c3RydXRzMi4w5Lit5paH5pWZ56iLLmNobQ==?="


3. RFC2231规定的标准:


    Content-Disposition: attachment; filename*=UTF-8''%E5%9B%9E%E6%89%A7.msg


4. 直接ISO编码的文件名:


    Content-Disposition: attachment;filename="测试.txt"


然后,各浏览器支持的对应编码格式为:


1.  IE浏览器,采用URLEncoder编码


2.  Opera浏览器,采用filename*方式


3.  Safari浏览器,采用ISO编码的中文输出


4.  Chrome浏览器,采用Base64编码或ISO编码的中文输出


5.  FireFox浏览器,采用Base64或filename*或ISO编码的中文输出


 


对应的Java代码如下:



折叠复制代码




  1. new_filename = URLEncoder.encode(filename, "UTF8");  

  2. // 如果没有UA,则默认使用IE的方式进行编码,因为毕竟IE还是占多数的  

  3. rtn = "filename="" + new_filename + """;  

  4. if (userAgent != null)  

  5. {  

  6.     userAgent = userAgent.toLowerCase();  

  7.     // IE浏览器,只能采用URLEncoder编码  

  8.     if (userAgent.indexOf("msie") != -1)  

  9.     {  

  10.         rtn = "filename="" + new_filename + """;  

  11.     }  

  12.     // Opera浏览器只能采用filename*  

  13.     else if (userAgent.indexOf("opera") != -1)  

  14.     {  

  15.         rtn = "filename*=UTF-8''" + new_filename;  

  16.     }  

  17.     // Safari浏览器,只能采用ISO编码的中文输出  

  18.     else if (userAgent.indexOf("safari") != -1 )  

  19.     {  

  20.         rtn = "filename="" + new String(filename.getBytes("UTF-8"),"ISO8859-1") + """;  

  21.     }  

  22.     // Chrome浏览器,只能采用MimeUtility编码或ISO编码的中文输出  

  23.     else if (userAgent.indexOf("applewebkit") != -1 )  

  24.     {  

  25.         new_filename = MimeUtility.encodeText(filename, "UTF8""B");  

  26.         rtn = "filename="" + new_filename + """;  

  27.     }  

  28.     // FireFox浏览器,可以使用MimeUtility或filename*或ISO编码的中文输出  

  29.     else if (u
    serAgent.indexOf(
    "mozilla") != -1)  

  30.     {  

  31.         rtn = "filename*=UTF-8''" + new_filename;  

  32.     }  

  33. }  






目前,我测试的情况,在几个浏览器上都能正常输入中文文件名


但,也许浏览器不同版本,可能还会有乱码的情况.....


 


 

Windows上编译Apache2的模块

最近,Apache2上使用的一个模块升级了,因为windows上的dll文件也需要重新升级


在Windows上对应的dll文件最早是qyb老大给编译的,编译环境造就没了


我参照老大以前写的一个简单文档,搭建了一个环境,最后编译成功了


记录一下过程:



  1. 安装Apache2,选择custom install,把对应的头文件和lib给装上

  2. 安装Win32OpenSSL

  3. 安装Visual C++ Express,需要把Windows SDK给装上

  4. 建立一个bat文件,设置环境变量(PATH,INCLUDE,LIB),并运行编译和链接命令:


  5. 折叠复制代码




    1. @set PATH=C:Program FilesMicrosoft Visual Studio 9.0Common7IDE;C:Program FilesMicrosoft Visual Studio 9.0VCBIN;C:Program FilesMicrosoft Visual Studio 9.0Common7Tools;C:WINDOWSMicrosoft.NETFrameworkv3.5;C:WINDOWSMicrosoft.NETFrameworkv2.0.50727;C:Program FilesMicrosoft Visual Studio 9.0VCVCPackages;c:Program FilesMicrosoft SDKsWindowsv6.0Ain;%PATH%  

    2. @set INCLUDE=C:Program FilesMicrosoft Visual Studio 9.0VCINCLUDE;c:Program FilesMicrosoft SDKsWindowsv6.0AInclude;c:Program FilesApache Software FoundationApache2.2include;c:Program FilesOpenSSLinclude;%INCLUDE%  

    3. @set LIB=C:Program FilesMicrosoft Visual Studio 9.0VCLIB;c:Program FilesMicrosoft SDKsWindowsv6.0ALib;c:Program FilesApache Software FoundationApache2.2lib;c:Program FilesOpenSSLlibVC;%LIB%  

    4. @set LIBPATH=C:WINDOWSMicrosoft.NETFrameworkv3.5;C:WINDOWSMicrosoft.NETFrameworkv2.0.50727;C:Program FilesMicrosoft Visual Studio 9.0VCLIB;%LIBPATH%  

    5.   

    6. cl /MD /D "WIN32" /c mod_test.c  

    7. link /DLL mod_test.obj libhttpd.lib libapr-1.lib libeay32MD.lib  

    8. mt -manifest mod_test.dll.manifest -outputresource:mod_test.dll;#2  







             VC安装后,会自动生成一个c:Program FilesMicrosoft Visual Studio 9.0Common7Toolsvsvars32.bat文件,可以参照里面的环境变量设置,并增加Apache2,OpenSSl,Microsoft SDKs对应的变量

MongoDB中MapReduce的应用

在MongoDB中可以使用MapReduce进行一些复杂的聚合查询


Map函数和Reduce函数可以使用JavaScript来实现


可以通过db.runCommand或mapReduce命令来执行一个MapReduce的操作:



折叠复制代码




  1. db.runCommand(

  2. { mapreduce : <collection>,

  3. map : <mapfunction>,

  4. reduce : <reducefunction>

  5. [, query : <queryfilter object>]

  6. [, sort : <sortthe query. useful for optimization>]

  7. [, limit : <numberof objects to return from collection>]

  8. [, out : <output-collectionname>]

  9. [, keeptemp: <true|false>]

  10. [, finalize : <finalizefunction>]

  11. [, scope : <objectwhere fields go into javascript global scope>]

  12. [, verbose : true]

  13. }

  14. );

  15. #或者使用一个包装后的Helper命令

  16. db.collection.mapReduce(mapfunction,reducefunction[,options]);




如果没有定义out,则它执行后默认生成一个临时的collection,当client连接断开后,该collection会自动被清除


一个简单的列子,有一个user_addr的collection,结果如下:



折叠复制代码




  1. db.user_addr.find({'Uid':'test@sohu.com'})

  2. { "_id" : ObjectId("4bbde0bf600ac3c3cc7245e3"), "Uid" : "yangsong@sohu.com", "Al" : [

  3. {

  4. "Nn" : "test-1",

  5. "Em" : "test-1@sohu.com",

  6. },

  7. {

  8. "Nn" : "test-2",

  9. "Em" : "test-2@sohu.com",

  10. },

  11. {

  12. "Nn" : "test-3",

  13. "Em" : "test-3@sohu.com",

  14. }

  15. ] }




存储了一个用户(Uid)对应的联系人信息(Al),现在要查询每个Em联系人对应的数目,则建立如下的MapReduce



折叠复制代码




  1. m=function() {

  2. for (index in this.Al) {

  3. emit(this.Al[index].Em, 1);

  4. }

  5. }

  6. r=function(k, vals) {

  7. var sum=0;

  8. for (index in vals) {

  9. sum += vals[index];

  10. > }

  11. return sum;

  12. }

  13. res=db.user_addr.mapReduce(m,r)

  14. {

  15. "result" : "tmp.mr.mapreduce_1272267853_1",

  16. "timeMillis" : 29,

  17. "counts" : {

  18. "input" : 5,

  19. "emit" : 26,

  20. "output" : 26

  21. },

  22. "ok" : 1,

  23. }

  24. db[res.result].find()




MongoDB中的group函数实际上也需要借助MapReduce来实现


如:按照uid来group,计算出每个uid有多少个联系人



折叠复制代码




  1. r=function (obj,prev) {  

  2.     prev.sum += obj.Al.length;  

  3. }  

  4. db.user_addr.group({key:{'Uid':1},reduce:r,initial:{sum:0}})  






 

手机发送“闪信”的问题

近期,有不少人反应收到我的短信不是普通短信


而是直接显示在屏幕上,一不小心按下键盘,就没有了,这样就看不到短信内容了


这种短信,我倒是听说过,即“闪信”


我从来就没有申请过这个业务的,今天晚上准备发短信时


突然在想,会不会是发短信的软件“短信大师”搞的鬼?


于是,找了找它的设置,并没有发现有设置的地方


上它的官方网站上看了下说明,才发现在发短信的界面最下发有个“闪信”的字样


可能是哪次我不小心点中了,造成每次发短信都默认选中,而我还真从来没注意过这个东西


其实,对于软件来说,有时候,功能太多了,也许并非是一个好事情....

使IE内核的浏览器web页面变灰

昨天是全国哀悼日,以纪念青海玉树地震遇难的同胞


网站的首页需要去除颜色,全部变灰


对于IE内核的浏览器,比较简单,加一个css样式即可:



折叠复制代码




  1. html  

  2. {    

  3.     filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);  

  4. }







对于非IE浏览器,则只能自己修改所有的CSS以及图片了(昨天请教了SAS的技术人员,没有别的捷径......)


今天,看到张宴的blog,也可以通过nginx的http_sub_module来实现


这个模块是用来对http的response进行查找替换的,在编译时,需要增加--with-http_sub_module选项



折叠复制代码




  1. location = /index.jsp


  2. {  

  3.   sub_filter  '</head>'  '<style type="text/css">html {filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);}</style></head>';

  4. }







具体我没有尝试,但我觉得这种方式,对于高并发的请求,效率可能会有问题

MongoDB常用的操作命令


  1. 超级用户相关:

    折叠复制代码




    1. use admin

    2. #增加或修改用户密码

    3. db.addUser('admin','pwd')

    4. #查看用户列表

    5. db.system.users.find()

    6. #用户认证

    7. db.auth('admin','pwd')

    8. #删除用户

    9. db.removeUser('mongodb')

    10. #查看所有用户

    11. show users

    12. #查看所有数据库

    13. show dbs

    14. #查看所有的collection

    15. show collections

    16. #查看各collection的状态

    17. db.printCollectionStats()

    18. #查看主从复制状态

    19. db.printReplicationInfo()

    20. #修复数据库

    21. db.repairDatabase()

    22. #设置记录profiling,0=off 1=slow 2=all

    23. db.setProfilingLevel(1)

    24. #查看profiling

    25. show profile

    26. #拷贝数据库

    27. db.copyDatabase('mail_addr','mail_addr_tmp')

    28. #删除collection

    29. db.mail_addr.drop()

    30. #删除当前的数据库

    31. db.dropDatabase()





  2. 客户端连接

    折叠复制代码




    1. /usr/local/mongodb/bin/mongo user_addr -u user -p 'pwd'





  3. 增删改

    折叠复制代码




    1. #存储嵌套的对象

    2. db.foo.save({'name':'ysz','address':{'city':'beijing','post':100096},'phone':[138,139]})

    3. #存储数组对象

    4. db.user_addr.save({'Uid':'yushunzhi@sohu.com','Al':['test-1@sohu.com','test-2@sohu.com']})

    5. #根据query条件修改,如果不存在则插入,允许修改多条记录

    6. db.foo.update({'yy':5},{'$set':{'xx':2}},upsert=true,multi=true)

    7. #删除yy=5的记录

    8. db.foo.remove({'yy':5})

    9. #删除所有的记录

    10. db.foo.remove()





  4. 索引

    折叠复制代码




    1. #增加索引:1(ascending),-1(descending)

    2. db.things.ensureIndex({firstname: 1, lastname: 1}, {unique: true});

    3. #索引子对象

    4. db.user_addr.ensureIndex({'Al.Em': 1})

    5. #查看索引信息

    6. db.deliver_status.getIndexes()

    7. db.deliver_status.getIndexKeys()

    8. #根据索引名删除索引

    9. db.user_addr.dropIndex('Al.Em_1')





  5. 查询

    折叠复制代码




    1. #查找所有

    2. db.foo.find()

    3. #查找一条记录

    4. db.foo.findOne()

    5. #根据条件检索10条记录

    6. db.foo.find({'msg':'Hello 1'}).limit(10)

    7. #sort排序

    8. db.deliver_status.find({'From':'yushunzhi@sohu.com'}).sort({'Dt',-1})

    9. db.deliver_status.find().sort({'Ct':-1}).limit(1)

    10. #count操作

    11. db.user_addr.count()

    12. #distinct操作

    13. db.foo.distinct('msg')

    14. #>操作

    15. db.foo.find({"timestamp": {"$gte" : 2}})

    16. #子对象的查找

    17. db.foo.find({'address.city':'beijing'})





  6. 管理


  7. 折叠复制代码




    1. #查看collection数据的大小

    2. db.deliver_status.dataSize()

    3. #查看colleciont状态

    4. db.deliver_status.stats()

    5. #查询所有索引的大小

    6. db.deliver_status.totalIndexSize()





 

从Git仓库中恢复已删除的分支或丢失的commit

在使用Git的过程中,有时可能会有一些误操作


比如:执行checkout -f 或 reset -hard 或 branch -d删除一个分支


结果造成本地(远程)的分支或某些commit丢失


这时,我们可以通过reflog来进行恢复,前提是丢失的分支或commit信息没有被git gc清除


一般情况下,gc对那些无用的object会保留很长时间后才清除的


reflog是git提供的一个内部工具,用于记录对git仓库进行的各种操作


可以使用git reflog show或git log -g命令来看到所有的操作日志


 


恢复的过程很简单:


1. 通过git log -g命令来找到我们需要恢复的信息对应的commitid,可以通过提交的时间和日期来辨别


2. 通过git branch recover_branch commitid 来建立一个新的分支


这样,我们就把丢失的东西给恢复到了recover_branch分支上了

成功登顶香山

今天天气真好,风和日丽,万里无云


爸爸妈妈还有奶奶带我去爬香山了


这是我第一次爬香山,也是第一次爬那么高的山


一踏进香山公园,我可高兴了


一路上拉着妈妈的手,踩着台阶,蹦蹦跳跳的往前走


虽然山很高,可我却一点也不畏惧,一点也不怕累


我和爸爸走在前面,妈妈和奶奶走在后面


我今天的表现很好,爬的可有劲了


而且一路上全是自己爬的,一会也没让爸爸妈妈抱


后来,我和爸爸还把妈妈和奶奶都拉在了后面


看着她们“呼哧呼哧”的喘着粗气,扶着栏杆一步一步的追我


我在想:妈妈奶奶,你们都老了,还是年轻好啊~


爬到半山腰上,爸爸给我买了一个冰棍吃


我边吃边爬,更有精神了


不一会儿,我们就爬到了山顶,真开心啊~


在山顶吃完东西后,我们就准备下山了


妈妈带我坐缆车下山的,爸爸和奶奶慢悠悠的走着下去


下山后,我又在水池边玩了好长时间的水


后来,才依依不舍的回家去了


今天,我玩的可真开心啊~


对了,忘了做自我介绍了:


我叫于昕昕,已经2周岁零8个月了

C#中ShowBalloonTip气泡不显示的问题

最近,使用C#开发一个windows上的客户端


使用了系统托盘控件notifyIcon,并有一个气泡通知的方法:



折叠复制代码




  1. protected void nofityMsg(string title, string msg)  

  2. {  

  3.     this.notifyIcon1.BalloonTipTitle = title;  

  4.     this.notifyIcon1.BalloonTipText = msg;  

  5.     this.notifyIcon1.Visible = true;


  6.     this.notifyIcon1.ShowBalloonTip(Notes.SYSTRAY_NOTIFY_TIME);  

  7. }







但运行后,托盘的气泡死活不能出来


后来才知道,windows的注册表里有一个键值,可以控制是否禁用托盘气泡提示


原文见:http://support.microsoft.com/kb/307729


修改注册表以下键值为1即可:


HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerAdvancedEnableBalloonTips

最新文章

最近回复

  • feifei435:这两个URI实际是不一样的
  • zsy: git push origin 分支 -f 给力!
  • 冼敏兵:简单易懂,good fit
  • Jack:无需改配置文件,看着累! # gluster volume se...
  • Mr.j:按照你的方法凑效了,折腾死了。。。。
  • zheyemaster:补充一句:我的网站路径:D:\wamp\www ~~菜鸟站长, ...
  • zheyemaster:wamp2.5(apache2.4.9)下局域网访问403错误的...
  • Git中pull对比fetch和merge | 炼似春秋:[…] 首先,我搜索了git pull和git fe...
  • higkoo:总结一下吧, 性能调优示例: gluster volume s...
  • knowaeap:请问一下博主,你维护的openyoudao支持opensuse吗

分类

归档

其它