第一次使用flickr便对其多文件选取和无刷新上传产生了浓厚的兴趣,于是开始分析,功能实现主要通过脚本upload.js.v1.46.10 的上传类。

u.oControl.browseMultiple(u.fileTypes); 实现多文件选取

u.oControl.upload(J.id,u.url); 实现去刷新上传

所以关键便是 u.oControl.,经查发现

var J="yUpload";
u.oControl=(isIE?window[J]:document[J]);

还有

var r=new SWFObject("/images/upload/yuploadcomponent.swf","yUpload",1,1,9,"#fff");
 r.addParam("allowScriptAccess","always");
 r.write("yuploadcontrol");
 if(isIE)
 {
  window.yUpload=document.getElementById("yUpload");
 }

便想到,这些功能是借助flash实现的,无奈flash不熟悉,幸好有互联网,百度搜索 flash+上传文件

便看到下面这篇文章:

 

Author:David | English Version 【转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
URL:http://blog.iyi.cn/start/2007/06/ajaxflash.html

 

FancyUpload,用flash和mootools实现的一款多文件无刷新上传工具。
最大的特点是可以一次选择多个文件,无刷新上传。
早些时候曾想过一次选择多个文件的问题,浏览器默认的file标签一次只能选择一个文件,要浏览并读取本地文件就必须调用本地的组件或命令,所以单纯用javascript+html无解。
今天查看订阅的feeds时,无意中在Ajaxian看到这个演示图片上选择了多个文件:

非常好奇,过去看了一下demo,果然可以一次选择多个文件!

Browsfile的button没什么特别,就是一个button,肯定是通过js触发了某个动作。前面说过js和html是不能实现这个功能的,那么肯定是flash实现了这个功能。

文件里面有个Swiff.Uploader.swf,就是这个swf实现了文件浏览的功能,as在这:http://digitarald.de/workspace/packages/Uploader/Swiff.Uploader.as

google了一下flash filebrowserflash fileupload果然找到很多内容

这片中文的详细说明了那个flash的原理:
http://www.cnblogs.com/walkingboy/archive/2007/02/09/Flash_FileUpload_FileReference.html
出处可能是这个:
http://www.codeproject.com/aspnet/FlashUpload.asp

原理是用了flash的FileReferenceList API实现的多文件选取。
http://markshu.ca/imm/flash/tutorial/fileReference.html

另外还有几个实例:
http://www.betriebsraum.de/blog/2006/01/13/download-flash-8-file-browser/

http://www.extremefx.com.ar/blog/flash-textarea




本文出自:  http://blog.iyi.cn/start/2007/06/ajaxflash.html

文章来源:http://songpengf117.blog.163.com/blog/static/1667205200711289362033
posted @ 2008-05-11 18:58 spnet 阅读(27) | 评论 (0)编辑

下载Notepad++ 和Compare插件最新版本https://sourceforge.net/project/showfiles.php?group_id=189927

将ComparePlugin.dll解压到Notepad++\plugins目录下

首先 Using Multi-View

方法:

As well as having a tabbed display Notepad++ can display two files side by side or one above the other, or show two parts of the same file.

If you have two files open, you can right-click on one of the tabs and select "Go to another view" (or select View/"Go to another view"). Now both files will be shown at once, one above the other. What you have now is like two instances of Notepad++ running in one window. Each "view" has its own set of tabs - if you have a tab in the bottom window selected and open another file, its tab will go to the bottom view; if you have a top tab selected, newly opened files will get a tab in the top view.

You can arrange them side by side by right-clicking on the separator bar and selecting one of the rotate options (see image), and you can adjust the position of the separator bar by dragging it. There is also a tiny arrow at each end of the view separator. Clicking on them moves the separator to the very edge, making one view fill the window. When this has been done, you can still drag the separator back to the middle.

You can move tabs between views by right clicking on their tab and selecting "Go to another view". When you move the last tab in a view to the other view, that view disappears.

You can show the *same* file in both views by selecting View/"Clone to another view". Editing done in one view is reflected in the other, making this a handy feature if you need to refer to two parts of the same file at once. You can also select View/Synchronise Vertical/Horizontal Scrolling to keep them aligned that way if you wish. This is useful if you need to keep some column headings visible while editing fixed width columns of data further down the file, or keep row headings visible while editing the end of a data file too wide for your screen. Note that each view can have its own font size, so you may wish to make them the same, particularly with cloned views.

然后比对

更多帮助 见http://notepad-plus.wiki.sourceforge.net/


文章来源:http://songpengf117.blog.163.com/blog/static/16672052007101445417575
posted @ 2008-05-11 18:58 spnet 阅读(20) | 评论 (0)编辑
 ASP Request.ServerVariables 速查
 

本机ip:<%=request.servervariables("remote_addr")%>
服务器名:<%=Request.ServerVariables("SERVER_NAME")%>
服务器IP:<%=Request.ServerVariables("LOCAL_ADDR")%>
服务器端口:<%=Request.ServerVariables("SERVER_PORT")%>
服务器时间:<%=now%>
IIS版本:<%=Request.ServerVariables("SERVER_SOFTWARE")%>
脚本超时时间:<%=Server.ScriptTimeout%>
本文件路径:<%=server.mappath(Request.ServerVariables("SCRIPT_NAME"))%>
服务器CPU数量:<%=Request.ServerVariables("NUMBER_OF_PROCESSORS")%>
服务器解译引擎:<%=ScriptEngine & "/"& ScriptEngineMajorVersion&"."&ScriptEngineMinorVersion&"."& ScriptEngineBuildVersion %>
服务器操作系统:<%=Request.ServerVariables("OS")%>
支持的文件类型:<%=Request.ServerVariables("HTTP_Accept")%>
访问的文件路径:<%=Request.ServerVariables("HTTP_url")%>
用户代理的信息:<%=Request.ServerVariables("HTTP_USER_AGENT")%>
获取url中的文件名和传过来的值:request.ServerVariables("script_name")+"?"+request.ServerVariableS("QUERY_STRING")

其中ServerVariables就是服务器的环境变量了,该变量包含的内容比较多,我们同样先采用for循环进行遍历查看下。
<%for each i in request.servervariables%>
<%=i%>:
<%=request.servervariables(i)%>
<hr>
<%Next%>

Request.ServerVariables("HTTP_REFERER")的工作方式

下列情况是从浏览器的地址栏正常取得Request.ServerVariables("HTTP_REFERER")的:
1.直接用<a href>
2.用Submit或<input type=image>提交的表单(POST or GET)
3.使用Jscript提交的表单(POST or GET)

下面我们再看看Request.ServerVariables("HTTP_REFERER")不能正常取值的情况:
1.从收藏夹链接
2.单击''主页''或者自定义的地址
3.利用Jscript的location.href or location.replace()
4.在浏览器直接输入地址
5.<%Response.Redirect%>
6.<%Response.AddHeader%>或<meta http-equiv=refresh>转向
7.用XML加载地址

显然,Request.ServerVariables("HTTP_REFERER")在多数情况下是不能正常工作的




本文出自:  http://hi.baidu.com/wing718/blog/item/4513840a9a27ba3eb0351df5.html

文章来源:http://songpengf117.blog.163.com/blog/static/1667205200792495352675
posted @ 2008-05-11 18:58 spnet 阅读(7) | 评论 (0)编辑


function JSClass()
  {
      this.m_Text = 'division element';
      this.m_Element = document.createElement('DIV');
      this.m_Element.innerHTML = this.m_Text;
      //第一处,下面这句的this指什么东东?
      this.m_Element.attachEvent('onclick', this.ToString);
  }
  //第二处,这句的this指什么东东?
  JSClass.prototype.Render = function()
  {
      document.body.appendChild(this.m_Element);
  }    
  //第三处,这句的this指什么东东?
  JSClass.prototype.ToString = function()
  {
      alert(this.m_Text);
  };

  var jc = new JSClass();
  jc.Render();
  jc.ToString();

 

  它先给JSClass类加了个对象“m_Element”,是个DIV,this代表JSClass本身。第一处的This是给DIv的对象加了个Onclick的事件,表示Onclick时运行ToString事件。
  第二处的This是表示运行Render方法的对象。语句作用是给JSClass加了个属性,表示JSClass的实例有个叫“Render”的方法,可以将JSClass中的“m_Element”对象加载(用AppendChild方法)到document.body的对象里。
  第三处是表示运行ToString方法的对象。是对JSClass类加了第三个属性,表示在运行ToString方法时,用ALert的命令显示出“m_Text”的内容。

  最后那段内容,意思是先用JSClass的类建了一个叫jc的实例,
  然后运行JSClass类的Render方法,将jc实例中的DIV加载到BODY对象中。
  最后Alert出jc.m_Text的内容。


文章来源:http://songpengf117.blog.163.com/blog/static/166720520078249350938
posted @ 2008-05-11 18:58 spnet 阅读(10) | 评论 (0)编辑

打开记事本,输入:
[Version]
Signature="$Chicago$"
Provider="MetaBuilders"

[DestinationDirs]
DefaultDestDir=10,"web"

[DefaultInstall]
AddReg=CopyImageUrl_AddReg
CopyFiles=CopyImageUrl_CopyFiles

[CopyImageUrl_CopyFiles]
CopyImageUrl.html

[CopyImageUrl_AddReg]
HKCU,"Software\Microsoft\Internet Explorer\MenuExt\复制图片链接",,0x00000000,"%10%\web\CopyImageUrl.html"
HKCU,"Software\Microsoft\Internet Explorer\MenuExt\复制图片链接","contexts",1,02

另存为CopyImageUrl.inf再打开记事本,输入:


<SCRIPT LANGUAGE="JavaScript" defer>
var parentWin = external.menuArguments;
var srcEvent = external.menuArguments.event;
var doc = parentWin.document;
var eventElement = doc.elementFromPoint ( srcEvent.clientX, srcEvent.clientY );
var cpb = parentWin.clipboardData;
  
var srcImage = eventElement;
var str = new String(srcImage.href.toString());
str = + str +  
  
cpb.setData("Text",str.toString());
  
</SCRIPT>


另存为CopyImageUrl.html

准备工作完毕。
放在同一目录下。


右键点CopyImageUrl.inf,选择 安装。

Over!




本文出自:  http://hi.baidu.com/xyion/blog/item/5f864a4f60f65c34afc3ab88.html

文章来源:http://songpengf117.blog.163.com/blog/static/166720520078101063315
posted @ 2008-05-11 18:58 spnet 阅读(63) | 评论 (0)编辑

 

看了蝈蝈俊.net的《理解缓存》,觉得真的是一个对于web applcation 缓存应用的好文,难得的是覆盖了冰山海面下的部分。我现在做的应用可以说和缓存打的交道也不少(不过不是web应用),也写些东西来分享给大家。

1.缓存是什么?

在我看来,缓存是通过存储中间结果,缩短访问路径来减少开销,提高性能的方法。这个概括未必最科学全面,也不够具体。我们来看看一个http 动态页面访问的例子:

访问路径是 : 数据库->应用数据集->内存对象->动态页面->HTTP服务器->用户浏览器

一个简单的访问,中间经过了多个环节,我们称这些环节为访问路径,我们来看看哪些地方可以采用缓存:

  1. HTTP服务器->用户浏览器,大家都知道浏览器都有本地缓存,浏览过的页面图片脚本等都会根据http header还有html的相关指令临时保存在本地硬盘里面,假如再次访问,访问路径就变成了"本地硬盘缓存->用户浏览器", 浏览的环节大幅度减少,性能也提高了。在这个环节,经常还使用带缓存的代理服务器来提高性能。
  2. 动态页面->HTTP服务器,这里有多种方式, 比如动态页面静态化,目前大量的大型网站使用这种方式。还有WEB服务器根据一定规则缓存整个动态页面,比如asp.net的Page Cache。这里的访问路径变成了"缓存页面->HTTP服务器->用户浏览器"
  3. 本地数据集->内存对象->动态页面。常见的就是缓存数据集还有对象,这个是ASP.NET cache里面相对浓墨重彩的部分,也是Memcached发力的侧重点, 也就不多说了。
  4. 数据库->应用数据集,不少数据库实现都有查询缓存

这里缓存都在访问路径中的环节存储了中间结果,用来减少相应的开销

2.缓存本身的开销

缓存本身也是有性能开销的,一种是将内存存储到缓存中开销,一种是将内容取出来的开销。另外,缓存往往还要付出空间上的开销。另外还要付出系统复杂度的开销,这增加了开发和维护成本。

大家也听说过IE缓存太大了或者是文件系统碎片太多以后,可能相反会拖累浏览速度,测试我倒是没有做过,但是的确是完全可能的。也就是说,缓存的开销可能会不缓存而是直接访问还要大,这就是大家不想看到的了。

3. 缓存的目的

其实前面已经说过缓存是为了减少开销,提高性能,这不就是缓存的目的吗?这倒是没错,但是也不尽然。

因为开销是一个很笼统的词,具体点有CPU开销,磁盘IO开销,网络开销,数据库访问开销等,缓存对于性能的优化,除了一些大众化的优化措施以外,还得有的放矢。

以前学习写程序,大家一定都听说过什么时间换空间,空间换时间,到底什么时候要拿空间换时间,什么时候要拿时间换空间,只能看具体应用了。前面说过缓存也有开销,其实缓存就是拿某些开销换取其他开销的下降而已。比如说动态页面静态化是一些大型网站常见的优化方法,他付出了磁盘的空间和读写开销,来换取更低的CPU消耗(不用解析动态页面)和数据库访问。有些网站每天访问量没有多少,却频繁生成和更新静态页面,同时还在服务器上做下载,本来磁盘就不堪重负,这下更加是雪上加霜,可以说是缓存优化的反面例子。或者是本来内存不大,磁盘swap很多影响性能,但是却使用大量内存做页面和对象缓存,也是反面的例子。

所以说不能盲目的进行缓存优化,一个系统,性能出现了问题,或者将来可能出现问题,性能总会有一个或者若干个瓶颈,我们要做的就是平衡或者削弱这个瓶颈,缓存是重要的手段。

所以缓存的目的是针对几个主要指标,兼顾若干个其他指标,来尽量实现低开销。

比如,数据库的CPU较高,那么一般是复杂的查询或者是存储过程导致的,在前面的各个环节进行缓存优化,比如缓存数据集和内存对象,都是好的解决方法,缓存整个页面也是个好方法,但是缓存页面要付出更多的空间开销,在某些情况下,缓存数据集或者内存对象已经够了。

假如WEB服务器的CPU较高,往往是因为动态页面处理造成的,找出开销大的处理,将处理的结果对象缓存,或者是页面静态化是不错的方法,而缓存数据库结果集往往收效不大。

4. 啥样的缓存才是好缓存?

蝈蝈俊认为是命中率最高的缓存最好。我做的领域是streaming server的磁盘IO缓存和CDN的网络边缘缓存,瓶颈就是磁盘或者网络IO,这种时候,命中率就是硬道理。

但是对于web服务器来讲,影响性能的因素很多,不同的内容访问开销相差很大,什么是好缓存,虽然命中率是极为重要的指标,但是还得要综合缓存的开销,原始的访问路径/开销和性能瓶颈来综合评价。也就是说不同的应用侧重不同,跑的硬件条件和瓶颈也不一样,很难有一个简单的指标。

比如缓存一个命中率稍低,但是原始访问开销很大的对象(比如要经过复杂查询和处理的对象) 比一个命中率较高,但是原始访问开销很小的对象要划得来。我觉得假如有一个"加权命中率"会更好,原始访问开销大的对象,要给与更高的权值,再进行命中率的计算。


假如一个缓存策略可以减少某个方面的性能开销,但是却带来了新的性能瓶颈,那么它也不是个好的缓存实现。比如磁盘IO紧张,页面更新非常频繁的情况下,静态页面缓存往往就不是一个好方法(好像没有用静态化页面做聊天室的吧:->)。

到底什么是好的缓存实现呢?前面也讲过了缓存的目的,我觉得充分利用了软硬件条件,消灭了性能瓶颈的就是好缓存。

5. 如何进行缓存优化

进行缓存优化,第一是要找到性能瓶颈,第二是找到瓶颈有关的应用部分。

性能瓶颈一般还是好找,系统有那么多性能计数器,数据库n多的调优工具,查询优化分析器。好好对照厂商的技术资料和google大法,很容易找到是CPU 内存还是IO限制了性能提高。

然后就是应用针对性能瓶颈的优化,有一个2/8定律,就是说80%的性能都消耗在20%的处理中,这20%也分为两种,一种是访问比例很高的,一种是开销贼大的,当然两个都占了,就更加没说的了。我们的任务就是集中火力提升这20%的性能,缓存往往是重要的方法。

寻找开销大的操作是个细活。我们在软件设计阶段可以预见瓶颈的部位,在出现问题的时候可以猜测出现瓶颈的部位,但是除非对行业模型,相关的架构性能还有一些性能细节非常了解(也就是说你实践过n次了),否则当初的预见和猜测都可能有较大偏差的,性能优化没有银弹,实践出真知。要多多使用工具进行分析,假如在系统里本身就有一些性能计数,可以在线或者离线提取就更好了。对于成熟的运营系统,性能统计和分析往往是其必不可少的功能。



在代码里寻找性能瓶颈太过细节,就不废话了,剩下的事情就是需要分析用户行为,根据用户对内容的访问频度实现不同的缓存策略。

6. 用户行为分析

用户行为主要有两种,一种是时间行为分布,就是一个内容的访问随时间变化的规律,不同的内容常常不同,比如新闻和音乐肯定是不一样的。
另外一种是空间分布,就是用户对于不同内容的偏好程度,大家常常说80/20规律,就是指大量的访问往往集中于少量内容,80/20只是一个定性的规律,这里一般适用的规律是zipf分布,我统计过一些系统的行为,和zipf分布的吻合度还是很好的,大家可以看看我的一篇文章:http://blog.joycode.com/peon/archive/2006/08/19/80885.aspx

大型的系统,缓存所有的内容肯定是不切实际的,缓存访问比率高的部分内容大概能达到多少缓存命中率呢?我根据zipf公式做了计算,结果可以看看下面的图:

y轴为命中率,x轴为缓存的内容占所有内容的比率,不同类型的内容有不同的a值(什么是a值, 请看http://blog.joycode.com/peon/archive/2006/08/19/80885.aspx),上面除了一条lg函数曲线外,其余的是各个a值对应的命中率曲线。可以看到a=0.95的时候,刚好符合20/80的定律。
光有理论的不够,进行实际统计永远是必须的,会议室里面的讨论永远代替不了实际的统计,log分析,性能计数器都是必要的技术。

7.关于分布式缓存

缓存会增加应用的复杂度,假如应用是分布式的而缓存不是分布式的,这个复杂度将会会平方。但是分布式缓存肯定比本机缓存效率低,所以是否选择分布式缓存实现,哪些内容使用分布式缓存哪些使用本机缓存,是第一步就得考虑的。

后记:
本文的着重点在性能,但是有些东西写的虚了点,有些想写的东西又没有写出来,算是薄积薄发献丑了:>
另外推荐一篇文章: 《从LiveJournal后台发展看大规模网站性能优化方法


本文出自:  http://blog.joycode.com/peon/archive/2007/09/05/108033.aspx

文章来源:http://songpengf117.blog.163.com/blog/static/166720520078663037122
posted @ 2008-05-11 18:58 spnet 阅读(13) | 评论 (0)编辑