RSS
 

Java的跨平台就是一句谎言

30

  实不相瞒,Java是我见过的执行效率最低的程序设计语言,前不久在论坛上有个评测,计算9999的阶乘,同样的循环算法,Java的耗时是.NET的5倍。我以前很喜欢Serv-U,自从它用Java重写之后我就再也没用过,实在是太慢了,我宁可用IIS搭建FTP,虽然IIS搭建FTP在权限管理上很不灵活。

  我有个同学,他是搞Java的,他给我说“Java不是效率低,而是速度慢。”,我不是搞Java的,我实在想不透这句话的含义,难道执行速度慢不就是效率低吗?难道执行速度慢还成效率高了?

  其实Java之所以在曾经独步天下,就是因为他的跨平台、安全性,这两方面,效率可不是Java的强项,反而是他最短的一块挡板,虽然Java总是用理论证明比.NET快。

  也许C#刚上市的时候有些抄袭Java吧,但自从C# 2.0上市之后,整个局面就扭转乾坤了,不但Java在模仿C#,而且他从来都没能跟得上C#的脚步。

  就安全性而言,Java已经远远低于VB.NET,更无法与安全性著称的C#相比。

  也许唯一可以让世人留恋Java的理由就剩下它的王牌——跨平台。

  说句实话,Java跨平台根本就不是外行人想想的那种,一次编译,处处运行。

  因为各系统的API不同,代码调用API编写程序就会遇到很多不兼容的地方,比如Java改写后的Serv-U就不能在手机上执行,手机的游戏也不能直接在微机上执行。

  归根到底,Java跨平台可以,但是要重新编写代码,否则还分什么J2EE/J2SE/J2ME呢!

  如果需要重新编写代码,几乎任何一门计算机语言都可以跨平台了,还用得着Java嘛,而且像PHP/C#等语言不需要修改代码都可以跨Windows/Linux。

  另外,小型软件代码重用价值低,没有必要跨平台;大型软件,有严格的规划、部署,不可以随意跨平台。

  Java欺骗了我们那么多年,如今的多核时代,我认为它气数已尽!

 
 

第三方测试报告:Java不如.NET安全

30

  这是一个非常有趣的问题,也是一个很容易引发争论的问题。对于Java和.NET来说,任何一方都拥有着庞大的粉丝群。但是在这个问题上,除了粉丝的情感和商家的炒作以外,是否有什么确切的证据来支持某一方的观点呢?

  在Java推出基于字节码的跨平台技术之后,Microsoft也为.NET推出了字节码解释模型(common language runtime)。对于两者的区别,我个人的观点一直是他们都可以开发出安全级别很高的应用软件,只是两者的开发形式、适用环境有一些区别罢了。对于安全问题,以前也经常有客户会问到两者之间的区别,当时也没有很在意,因为任何一方的安全级别都已经足够满足客户的要求了。也就是说即使有一些高低区别也没有大的关系。

  Veracode是一家应用产品安全测试方案提供商,他们的服务是对二进制、字节码以及Web应用进行扫描,以发现安全问题。他们一直持续保留和收集着他们每次的扫描结果,并最近开始发布他们他们的扫描结果分析报告。因为他们的工作范围里,既有.NET应用,也有Java应用,因此我们可以通过他们的数据得到一些.NET和Java之间的安全差异证据。

  需要说明的是,这些数据并不是出现在正式发布的报告当中(这些数据将可能出现在下一次修订当中。编辑注:也许是在等待厂商进行公关)。从这个报告的数据中可以看出:每MB代码中,.NET的漏洞密度为27.2,Java则为30.0。也就是单位数量代码中Java的安全漏洞要高于.NET。

  对大多数人来说,这是一个非常接近的数字,也在抽样误差允许范围之内。可以认为.NET和Java的安全性在同一个级别范围内。但是如果将安全问题数据再进一步划分为不同类型的话,则会发现更有趣的事情,会发现在不同的方面.NET和Java的安全成都差异还是比较大的。下面是报告的一部分内容:

Java不如dotnet安全

  这是一个对.NET和Java开发者非常有用的数据。因为从报告中可以看到两个程序语言在哪些方面更容易出现安全问题,比如二者的跨站脚本攻击防范能力都不高(注:在Java Servlet 3.0规范中已经做了改进),所以设计应用的时候就要注意防范跨站脚本攻击问题,尤其是.NET更应该注意。在Veracode的说明中对这个问题的解释是:之所以.NET在防范跨站脚本攻击方面问题这么多,是因为老版本的.NET控制结构不会对输出进行编码,因此如果要使用.NET的话。确认一定要使用最新的控制结构。

  最后需要注意的是,安全问题并不是选择一个程序语言,或者说是在.NET和Java之间,或者是构建在其上的产品之间的选择理由。一个完整的系统,要综合考虑应用领域环境、用户特点要求、未来维护发展等很多方面。

 
 

中文字体在 CSS 中的写法

20

针对字体的写法,觉得需要说明一下:

body,
button, input, select, textarea {
    font: 12px/1 Tahoma, Helvetica, Arial, "\5b8b\4f53", sans-serif;
}

“\5b8b\4f53″ 就是 “宋体”。用 unicode 表示,不用 SimSun, 是因为 Firefox 的某些版本和 Opera 不支持 SimSun 的写法。普及点字体知识:

字体的别名
系统中的一个字体是允许有多种别名形式存在的。比如,在 Windows 下,Georgia 也可以用 Georgia MS 来命名,它们其实是同一种字体。宋体的正式名称是 SimSun,而“宋体”只是它的别名。

按照规范,浏览器应该能自动识别字体的别名,并映射到正确的字体文件。比如,font-famliy: SimSun和font-family: “宋体”应该具有等价的效果。可惜,似乎很多浏览器都不能正确执行前一条定义……

1.h1 – h6, 各个浏览器下的 font-size 有差异,统一一下,我觉得还是有好处的,特别是 h3 和 h4.
2.list-style 放在 ul ol 上,是遵守最小影响原则。li 会继承 ul ol 的 list-style.
3.acronym 表示首字母缩略词,是 abbr 的一种。目前还是有使用的场合,等 HTML5 正式流行后,再去掉不迟。tt 也如此。
4.pre 的 monospace, 从语义上讲,的确不大妥当。但大部分使用场合,pre 的内容都是希望等宽的。某种程度上,等宽才能让 pre 真正实现 pre format.
5.a 去掉了下划线,是因为考虑中文。除了搜狐、新浪这种老旧站点,目前大部分中文站点,链接默认都不会加下划线。这是一种中国特色,同时也是一种国际化趋势。加下划线的链接,越来越多的用来表示强调或某种视觉效果,比如 WordPress 的后台。
6.滚动条的问题,已去除。放在 reset 里,的确不妥当。
7.另:ie7- 下,hr 有默认色,这次更新加上了:hr { *color: #fff; }(理想情况下,应该设为 transparent, 可惜不行). 讨厌的 ie -.-

 
 

用户体验的76个体验点

16

网站体验,指的是利用网络特性,为客户提供完善的网络体验,提高客户的满意度,从而与客户建立起紧密而持续的关系。

网站体验的分类

1、感官体验:呈现给用户视听上的体验,强调舒适性。

2、交互体验:呈现给用户操作上的体验,强调易用/可用性。

3、情感体验:呈现给用户心理上的体验,强调友好性。

4、浏览体验:呈现给用户浏览上的体验,强调吸引性。

5、信任体验:呈现给用户的信任体验,强调可靠性。

网站体验的76个体验点

一、感官体验:呈现给用户视听上的体验,强调舒适性。

1. 设计风格:符合目标客户的审美习惯,并具有一定的引导性。

网站在设计之前,必须明确目标客户群体,并针对目标客户的审美喜好,进行分析,从而确定网站的总体设计风格。

2. 网站LOGO:确保logo的保护空间,确保品牌的清晰展示而又不占据过分空间。

3. 页面速度:正常情况下,尽量确保页面在5秒内打开。如果是大 型门户网站,必须考虑南北互通问题,进行必要的压力测试。

4. 页面布局:重点突出,主次分明,图文并茂。与企业的营销目标相结合,将目标客户最感兴趣的,最具有销售力的信息放置在最重要的位置。

5. 页面色彩:与品牌整体形象相统一,主色调+辅助色不超过三种颜色。以恰当的色彩明度和亮度,确保浏览者的浏览舒适度。

6. 动画效果:与主画面相协调,打开速度快,动画效果节奏适中,不干扰主画面浏览。

7. 页面导航:导航条清晰明了、突出,层级分明。

8. 页面大小:适合多数浏览器浏览(以15寸及17寸显示器为主)。

9. 图片展示:比例协调、不变形,图片清晰。图片排列既不过于密集,也不会过于疏远。

10. 图标使用:简洁、明了、易懂、准确,与页面整体风格统一。

11. 广告位:避免干扰视线,广告图片符合整体风格,避免喧宾夺主。

12. 背景音乐:与整体网站主题统一,文件要小,不能干扰阅读。要设置开关按钮及音量控制按钮。

二、交互体验:呈现给用户操作上的体验,强调易用/可用性。

13. 会员申请:介绍清晰的会员权责,并提示用户确认已阅读条款。

14. 会员注册:流程清晰、简洁。待会员注册成功后,再详细完善资料。

15. 表单填写:尽量采用下拉选择,需填写部分需注明要填写内容,并对必填字段作出限制。(如手机位数、邮编等等,避免无效信息)

16. 表单提交:表单填写后需输入验证码,防止注水。提交成功后,应显示感谢提示。

17. 按钮设置:对于交互性的按钮必须清晰突出,以确保用户可以清楚地点击。

18. 点击提示:点击浏览过的信息颜色需要显示为不同的颜色,以区分于未阅读内容,避免重复阅读。

19. 错误提示:若表单填写错误,应指明填写错误之处,并保存原有填写内容,减少重复工作。

20. 在线问答:用户提问后后台要及时反馈,后台显示有新提问以确保回复及时。

21. 意见反馈:当用户在使用中发生任何问题,都可随时提供反馈意见。

22. 在线调查:为用户关注的问题设置调查,并显示调查结果,提高用户的参与度。

23. 在线搜索:搜索提交后,显示清晰列表,并对该搜索结果中的相关字符以不同颜色加以区分。

24. 页面刷新:尽量采用无刷新(AJAX)技术,以减少页面的刷新率。

Ajax是新兴的网络开发技术的象征。它将JavaScript和XML技术结合在一起,用户每次调用新数据时,无需反复向服务器发出请求,而是在浏览器的缓存区预先获取下次可能用到的数据,界面的响应速度因此得到了显著提升。

25. 新开窗口:尽量减少新开的窗口,以避免开过多的无效窗口,设置弹出窗口的关闭功能。

26. 资料安全:确保资料的安全保密,对于客户密码和资料进行加密保存。

27. 显示路径:无论用户浏览到哪一个层级,哪一个页面,都可以清楚知道看到该页面的路径。

三、浏览体验:呈现给用户浏览上的体验,强调吸引性。

28. 栏目的命名:与栏目内容准确相关,简洁清晰,不宜过于深奥。

29. 栏目的层级:最多不超过三层,导航清晰,运用JAVAscrip等技术使得层级之间伸缩便利。

30. 内容的分类:同一栏目下,不同分类区隔清晰,不要互相包含或混淆。

31. 内容的丰富性:每一个栏目应确保足够的信息量,避免栏目无内容情况出现。

32. 内容的原创性:尽量多采用原创性内容,以确保内容的可读性。

33. 信息的更新频率:确保稳定的更新频率,以吸引浏览者经常浏览。

34. 信息的编写方式:段落标题加粗,以区别于内文。采用倒金字塔结构。

35. 新文章的标记:为新文章提供不同标识(如new),吸引浏览者查看。

36. 文章导读:为重要内容在首页设立导读,使得浏览者可以了解到所需信息。文字截取字数准确,避免断章取义。

37. 精彩内容的推荐:在频道首页或文章左右侧,提供精彩内容推荐,吸引浏览者浏览。

38. 相关内容的推荐:在用户浏览文章的左右侧或下部,提供相关内容推荐,吸引浏览者浏览。

39. 收藏夹的设置:为会员设置收藏夹,对于喜爱的产品或信息,可进行收藏。

40. 栏目的订阅:提供Rss或邮件订阅功能

41. 信息的搜索:在页面的醒目位置,提供信息搜索框,便于查找到所需内容。

42. 页面打印:允许用户打印该页资料,以便于保存。

43. 文字排列:标题与正文明显区隔,段落清晰。

44. 文字字体:采用易于阅读的字体,避免文字过小或过密造成的阅读障碍。可对字体进行大中小设置,以满足不同的浏览习惯。

45. 页面底色:不能干扰主体页面的阅读。

46. 页面的长度:设置一定的页面长度,避免页面过长而影响阅读。

47. 分页浏览:对于长篇文章 进行分页浏览。

48. 语言版本:为面向不同国家的客户提供不同的浏览版本。

49. 快速通道:为有明确目的的用户提供快速入口。

四、情感体验:呈现给用户心理上的体验,强调友好性。

50. 客户分类:将不同的浏览者进行划分(如消费者、经销商、内部员工),为客户提供不同的服务。

51. 友好提示:对于每一个操作进行友好提示,以增加浏览者的亲和度。

52. 会员交流:提供便利的会员交流功能(如论坛),增进会员感情。

53. 售后反馈:定期进行售后的反馈跟踪,提高客户满意度。

54. 会员优惠:定期举办会员优惠活动,让会员感觉到实实在在的利益。

55. 会员推荐:根据会员资料及购买习惯,为其推荐适合的产品或服务。

56. 鼓励用户参与:提供用户评论、投票等功能,让会员更多地参与进来。

57. 会员活动:定期举办网上会员活动,提供会员网下交流机会。

58. 专家答疑:为用户提出的疑问进行专业解答。

59. 邮件/短信问候:针对不同客户,为客户定期提供邮件/短信问候,增进与客户间感情。

60. 好友推荐:提供邮件推荐功能。

61. 网站地图:为用户提供清晰的网站指引。

五、信任体验:呈现给用户的信任体验,强调可靠性。

62. 搜索引擎:查找相关内容可以显示在搜索引擎前列。

63. 公司介绍:真实可靠的信息发布,包括公司规模、发展状况、公司资质等。

64. 投资者关系:上市公司需为股民提供真实准确的年报,财务信息等。

65. 服务保障:将公司的服务保障清晰列出,增强客户信任。

66. 页面标题:准确地描述公司名称及相关内容。

67. 文章来源:为摘引的文章标注摘引来源,避免版权纠纷。

68. 文章编辑作者:为原创性文章注明编辑或作者,以提高文章的可信度。

69. 联系方式:准确有效的地址、电话等联系方式,便于查找。

70. 服务热线:将公司的服务热线列在醒目的地方,便于客户查找。

71. 有效的投诉途径:为客户提供投诉或建议邮箱或在线反馈。

72. 安全及隐私条款:对于交互式网站,注明安全及隐私条款可以减少客户顾虑,避免纠纷。

73. 法律声明:对于网站法律条款的声明可以避免企业陷入不必要的纠纷中。

74. 网站备案:让浏览者确认网站的合法性。

75. 相关链接:对于集团企业及相关企业的链接,应该具有相关性。

76. 帮助中心:对于流程较复杂的服务,必须具备帮助中心进行服务介绍。

 
 

设计提升满意度

16

 

  在学校修管理学的时候,有讲过一个管理激励的理论。管理激励是基于行为和认知科学的研究,来发现人们的需要、动机、目标和行为四者之间关系的核心理论,主要的目的是讨论如何满足人的各种需要、调动人的积极性。由此也引出了一个人们会在怎样的情况感到满意的问题。

  在人机交互中,同样有满意度的概念。那怎样设计令用户满意的交互呢?或许首先应该从满意度的评价因素来考虑。产品要让用户满意,最基本的条件应该是该产品符合用户的最低需求,能帮助用户解决问题。其次,满意是关于行动结果的评价。因此,当人机交互的结果符合或者超出用户预期,那么用户就会感到满意。否则用户会产生不满情绪。从而考虑设计满意的交互,或许可以从满足用户需求和行为激励两个层次来考虑。这样,一些管理激励的方法论,也可以为我们提供一些理论指导。

   一、需求的层次性。著名的马斯洛的需求层次理论告诉我们人在社会生活中的需求是有层次性的,只有当最基本的需求得到满足后,人才会去尝试自我实现或其它高层次的需求。同样,在产品设计中我们也不应当之局限于解决基本功能需求,还应该满足用户一些自我控制和探索的需要。

  1)满足用户探索的需要。让用户去发现一些简单的操作,或许比给出很多Tips信息去提示用户会更有吸引力。而这样做的前提是你设计的交互方式是符合用户习惯或者预期的。

  2)给用户超出预期的操作结果,会让他们更喜欢产品的设计。如Picasa的照片查看方式,不是和其它软件一样弹出一个窗口,而是用半透明将桌面其它地方遮住,从而让视觉焦点聚集在图片上。这种新的浏览方式很容易让用户获得新鲜感,而新鲜感更容易导致满意的产生。


picasa照片查看方式

  二、行为引导的激励特性。行为引导的激励包含两方面的含义:挫折的缓解、良性行为的强化。挫折是目标不能完成时产生的心理反应,而人在受挫时更容易产生消极和焦虑的情绪,因此要想让用户对产品满意,不仅仅只考虑正常操作下良好的交互体验。还应当在非正常情境下积极的作出缓解用户压力的努力。

  1)当用户操作受挫时的反馈要减轻用户紧张和焦虑感,最好能够说明情况并提供解决问题的建议。如下面的两个例子,以轻松的方式化解了操作中的非正常情况,不会导致用户过于紧张或反感。


抓虾网服务器搬迁


有趣的404页面

  2)当用户操作成功时,操作反馈要让用户感受到成就感。这种反馈比较适合于希望强化用户某种操作的情境。如下面鲁大师垃圾清理和360体检结果的反馈内容,就明确让用户能感受到自己的操作带来了多么伟大的效果,而成就感这种情绪体验本身就包含了满意的内涵。


鲁大师垃圾清理的操作反馈


360体检结果为健康的反馈

  3)当完成任务链较长的操作时,或许阶段性的给予及时的激励反馈,是缓解用户心理负担和达到满意的良好方法。

  设计用户满意的产品是用户体验易用性目标的一个延伸,以上例子仅仅是满意度设计的一些点滴想法。抛砖引玉,大家多多批评指正~

 本文转自:http://cdc.tencent.com/

 
 

前端开发中一些常用技巧总结

14

自己前端开发中常用到的一些技巧及问题解决方法,会常更新,希望对前端路上的朋友有帮助.
1.文章标题列表中日期居右显示的方法:


2010-10-10写代码的文章标题

然后定义span右浮动:

 p span{float:right}

其实这种方法可以延伸到很多情况下,很实用的一种写法;

2.web标准中,同一页面中只能有一个h1标签.很多人知道这个概念,但做到的却很少;

3.空白外边距互相叠加的问题:一般通过添加透明边框或者1px的内边距避免.

4.ie6下max/min-width/height实现,_width: expression(this.width >600 ? “600px” : true);,height同理.

5.html/class/id,最好统一以小写书写,这样更严谨(符合xhtml标准);

6.不推荐用下面代码兼容IE8:

<meta http-equiv="X-UA-Compatible" content="IE=7" />

如果是非短期性页面,尽量避免使用,页面应尽可能保证向后兼容;

7.空div在IE(FF中没有)是有默认高度的,可以用定义:

div { witdh:100%; background:#9c0; ling-height:0}

的方式去掉默认高度;

8.在使用table标签时应该尽可能的利用它本身的属性,最大限度的分离结构与样式.

9.充分利用表单中label标签提升用户体验; 这一点对于页面中那些小的选项框,以及对残障人士阅读网站都有好处. 细节是用户体验的第一步;

10.fieldset, legend标签, 鲜为人知,却很实用的一组标签;它可以很明了的把一组元素框起来,主要用于表单;

11.optgroup标签,鲜为人知,它对提升选择表单用户体验很有帮助.作用? 就是可以在有很多选项时,对这些选项分组:


12.表单都要加name值,name值是一个标示,不同于id,据我所发现,若是未定义name值,非IE浏览器下是无法通过document.formid获取到表单元素的.请看如下代码及注释:

<html>
<head>
<script>
    window.onload=function(){ 
        aler t(document.xdmform.length);  //所有浏览器均会弹出表单元素长度
        aler t(document.xiedaimaform.length);  //仅IE会弹出该表单元素长度
    }
</script>
</head>
<body>
    <form name="xdmform" id="xiedaimaform" action="#">
    ......
    </form>
</body>
</html>
 
No Comments

Posted in css

 

C#获取存储过程的 Return返回值和Output输出参数值

10

1.获取Return返回值

//存储过程
//Create PROCEDURE MYSQL
//     @a int,
//     @b int
//AS
//     return @a + @b
//GO
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString());
conn.Open();
SqlCommand MyCommand = new SqlCommand("MYSQL", conn);
MyCommand.CommandType = CommandType.StoredProcedure;
MyCommand.Parameters.Add(new SqlParameter("@a", SqlDbType.Int));
MyCommand.Parameters["@a"].Value = 10;
MyCommand.Parameters.Add(new SqlParameter("@b", SqlDbType.Int));
MyCommand.Parameters["@b"].Value = 20;
MyCommand.Parameters.Add(new SqlParameter("@return", SqlDbType.Int));
MyCommand.Parameters["@return"].Direction = ParameterDirection.ReturnValue;
MyCommand.ExecuteNonQuery();
Response.Write(MyCommand.Parameters["@return"].Value.ToString());

2.获取Output输出参数值

//存储过程
//Create PROCEDURE MYSQL
//     @a int,
//     @b int,
//     @c int output
//AS
//     Set @c = @a + @b
//GO
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString());
conn.Open();
SqlCommand MyCommand = new SqlCommand("MYSQL", conn);
MyCommand.CommandType = CommandType.StoredProcedure;
MyCommand.Parameters.Add(new SqlParameter("@a", SqlDbType.Int));
MyCommand.Parameters["@a"].Value = 20;
MyCommand.Parameters.Add(new SqlParameter("@b", SqlDbType.Int));
MyCommand.Parameters["@b"].Value = 20;
MyCommand.Parameters.Add(new SqlParameter("@c", SqlDbType.Int));
MyCommand.Parameters["@c"].Direction = ParameterDirection.Output;
MyCommand.ExecuteNonQuery();
Response.Write(MyCommand.Parameters["@c"].Value.ToString());

C#接收存储过程返回值:

     public static int User_Add(User us)
     {
         int iRet;
         SqlConnection conn = new SqlConnection(Conn_Str);
         SqlCommand cmd = new SqlCommand("User_Add", conn);
         cmd.CommandType = CommandType.StoredProcedure;
         cmd.Parameters.AddWithValue("@UName", us.UName);
         cmd.Parameters.AddWithValue("@UPass", us.UPass);
         cmd.Parameters.AddWithValue("@PassQuestion", us.PassQuestion);
         cmd.Parameters.AddWithValue("@PassKey", us.PassKey);
         cmd.Parameters.AddWithValue("@Email", us.Email);
         cmd.Parameters.AddWithValue("@RName", us.RName);
         cmd.Parameters.AddWithValue("@Area", us.Area);
         cmd.Parameters.AddWithValue("@Address", us.Address);
         cmd.Parameters.AddWithValue("@ZipCodes", us.ZipCodes);
         cmd.Parameters.AddWithValue("@Phone", us.Phone);
         cmd.Parameters.AddWithValue("@QQ", us.QQ);
         cmd.Parameters.Add("@RETURN_VALUE", "").Direction = ParameterDirection.ReturnValue;       
         try
         {
             conn.Open();
             cmd.ExecuteNonQuery();
             iRet = (int)cmd.Parameters["@RETURN_VALUE"].Value;
         }
         catch (SqlException ex)
         {
             throw ex;
         }
         finally
         {
             conn.Close();
         }
         return iRet;
     }

C#接收存储过程输出参数:

    public static decimal Cart_UserAmount(int UID)
    {
        decimal iRet;
        SqlConnection conn = new SqlConnection(Conn_Str);
        SqlCommand cmd = new SqlCommand("Cart_UserAmount", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@UID", UID);
        cmd.Parameters.Add("@Amount", SqlDbType.Decimal).Direction=ParameterDirection.Output;
        try
        {
            conn.Open();
            cmd.ExecuteNonQuery();
            iRet = (decimal)cmd.Parameters["@Amount"].Value;
        }
        catch (SqlException ex)
        {
            throw ex;
        }
        finally
        {
            conn.Close();
        }
        return iRet;
    }
 
No Comments

Posted in C#|.Net

 

VS2010执行剪贴、复制时,提示内存不足的官方补丁

08

      在VS 2010中执行剪切/拷贝文本操作时,有时会工作不正常,我们已经收到好几份这样的问题报告了。在某些情况下,VS因为计算错误而得出内存不足的结论(甚至实际上还有很多内存可用),还弹出这样的提示信息:

      “在此次程序运行时,可用内存容量不足,可能由于虚拟地址空间碎片过多导致,请稍后再试。”

      针对这个问题,我们已经发布了一个补丁程序,如果你也碰到类似的问题,可以从这里下载并安装补丁。另外关于这个问题,你还可以在Visual Studio团队的博客上获得更详细的说明。

 
 

网站开发中的文件存储 目录结构的探讨

08

网站应用中经常会有文件存储的需求,目录结构该怎么建才好呢?让我们来做下分析

对于少量用户写信息,大量用户都是在看信息的网站:例如CMS系统,编辑发咨询,用户看,例如中小企业产品发布网站。 对于这类需求我们可以把文件专门放到一个目录下,例如放到网站根目录的upload目录下,然后按天建文件夹,将每天的文件放到一个目录下,文件名可采用数字生成。例如:upload/20100612/1224455.jpg;通常的情况下这种目录结构就可以保证每个目录下不会有太多的文件。

对于博客,论坛应用,需要对每个用户分配文件存储空间,如果有需求的话还要限制用户的存储空间,对于一般规模的网站目录结构可以用用户id+日期的形式;例如upload/234/20100612/abc.jpg。如果规模较大,可以将文件分布到几台不同的服务器上,可以根据用户id制定一个分布的规则,每台服务器用不同的域名,并在数据库中存储文件的完整url地址,这种情况下的路径结构通常是:http://file1.abc.com/upload/234/20100612/abc.jpg。

我曾经观察过微软的文件下载文件存储的路径结构,他是用guid生成的一个路径,例如:http://download.microsoft.com/download/5/6/7/567758a3-759e-473e-bf8f-52154438565a/dotnetfx.exe ;它这个结构目录是guid的前三位和guid做了一个4级的目录,这种情况下,就保证了,每个目录下不会有很多目录,因为是guid所以每一个文件都放到一个单一的目录下了,这种结构对于做下载的网站应该是一种不错的选择。

还有web2.0的网站会涉及到用户头像的存储,头像的存储比较特殊,一个用户固定有那么几个尺寸的图片,我们分析一下开心网和sina的头像地址,看他们是如何做的存储
1. 开心网的存储,如下是两对链接地址,每对中的第一个是头像地址,第二个是用户首页,首页中的参数是用户id

http://pic1.kaixin001.com.cn/logo/13/39/50_133973_82.jpg

http://www.kaixin001.com/home/?uid=133973

http://www.kaixin001.com/home/?uid=36131662

http://pic.kaixin001.com.cn/logo/13/16/50_36131662_2.jpg

可以看出开心网的存储方式是存储到几台不同的服务器上,头像的地址是根据用户的id去划分目录做的存储,id的前4位被分成两个目录,文件名用的是包含前缀+用户id+后缀的方式做的存储。
2. 如下是两对sina的空间地址,和博客头像的地址

http://space.sina.com.cn/u/1642511512

http://portrait1.sinaimg.cn/1642511512/blog/180

http://space.sina.com.cn/u/1725778305

http://portrait2.sinaimg.cn/1725778305/blog/180

Sina博客头像的存储方式和开心不同,是用户id做一级目录,然后加上blog(应该是应用的名字)再加上一个数字180(猜想可能是头像类型的数字);sina和开心的区别是没有图片扩展名,猜想它可能是把头像放到了一个键值对的数据库中,根据url参数从键值对数据库中取出头像的图片数据,然后输出给客户端

从上面的分析可以猜想开心可能是直接存的文件,而sina可能存储在键值对数据库中,如果数据量很大的话,应该是新浪的方式根据伸缩性。

最后我们还得提一下为我们提供服务的博客园的存储方式,如下地址:

http://pic.cnblogs.com/face/u15230.jpg

http://pic.cnblogs.com/face/u105416.png

http://pic.cnblogs.com/face/u40200.png

很简单直观应该是放到了一个目录下,直接用户id做的文件名,没有分目录结构,这样在文件夹中文件过多时是否会引起性能问题呢?

 
 

修改下WebConfig的最后修改时间实现重启网站

08

修改下WebConfig的最后修改时间

string configFile=HttpContext.Current.Server.MapPath("~/Web.config");
System.IO.File.SetLastAccessTimeUtc(configFile,DateTime.UtcNow);

可以达到重启的功能,这样实现也有不好的地方,每次插件卸载都要都会引起重新编译,确实不太好,不过系统也不是老是在加载卸载插件,主要是在不修改源代码的前提下进行拓展,目的确实实现了。如果你有更好的插件实现方式,不妨分享一下,期待。