【转】什么是Cookie

当微软还没有推出IE8的时候,老实说,我就不喜欢这个浏览器。这不是来自于我对微软的偏见(这个公司确实非常伟大),而是来自于我对Cookie这个美好事 物的无比忠诚。但是,IE8的出现,让我们的美好蒙上一层厚厚的阴影。不过,当一切还没有变得非常严重之前,让我们先来了解一下Cookie是什么,它对 于我们的意义,以及我们为什么需要捍卫它。

  • 什么是Cookie以及Cookie的作用

Cookie是在你浏览网页的时候,网站服务器放在客户端(Client End,就是你的电脑)里面的一个小小的TXT文件。这个文件里面存储了一些与你访问的这个网站有关的一些东西,当你下一次访问这个网站的时 候,Cookie就会记住你上次访问时候的一些状态或者设置,让服务器针对性的发送页面的相关内容。Cookie里面包含的信息并没有一个标准的格式,各 个网站服务器的规范都可能不同,但一般会包括:所访问网站的域名(domain name),访问开始的时间,访问者的IP地址等客户端信息,访问者关于这个网站的一些设置等等。比如,你设置的诸如Google一个页面要显示几条搜索 结果之类的信息,即使你不登录你的Google账号,你下次访问时也能够保存下来,这就是上次你访问时把相关信息放入了Cookie的效果。如果是在线购 物网站,还记录了一些你的购物车,储物架以及你的账户名等信息。另外有些网站则会通过Cookie把你的登录账号和密码记下来,这样你下次打开浏览器就会 自动登录。

当然,如果你在系统文件夹中打开Cookie的TXT文件,你并不会看到这些信息而只能看到一串乱七八糟的字符,因为为了安全起 见,Cookie的内容一般都是加密的,只有对应的服务器才能读懂。另外,由于Cookie只是TXT文件,而不是程序,更不是病毒,不能自己运行,不会 对操作系统和其他任何计算机程序产生影响,也不会通过互联网传播,因此它对互联网安全实际上不构成威胁。

对于网站分析而言,Cookie的作用在于帮助嵌入代码类的网站分析工具记录网站的访问(Visit)和访 问者(Unique Visitor)的信息,没有Cookie就无法实现相关监测。而通过服务器端Log来进行网站分析的软件则不需要Cookie也能实现相关分析,因此 Cookie只对嵌入代码类工具有效。那些你耳熟能详的工具——Google Analytics、Omniture、HBX、WebTrends(嵌入代码版)等等,都需要在网站访问者的电脑上放置Cookie才能实现监测。

  • Cookie的数量和时效

Cookie的数量是指一个网站可以在客户端放置Cookie的个数。一个网站并不是只能放置一个Cookie在客户端,而是根据需要,会放置 多个不同的Cookie。对网站分析工具而言,帮助监测Visit的Cookie和帮助监测Unique Visitor的Cookie就不能是一个,而应该分开设置。对每一个网站(域)而言,不同浏览器能够支持的最多Cookie数是不同 的。IE7和FireFox3.0支持每个网站50个Cookie,而Opera则支持30个。无论是30还是50,基本都够用了。

Cookie的时效(expiration)是另一个非常重要的概念,也是Cookie的重要属性之一。任何Cookie都是有时效的,有些 Cookie的有效时间很短,有些Cookie则在浏览器关闭的同时自动失效,而有些则是号称”永久Cookie”。其实,Cookie的时效是在服务器 端人为设置的,可以设置为1秒,也可以设置10年,也可以设置在浏览器关闭的同时失效,完全根据不同情况的需要。永久Cookie就是指那些时效很长的 Cookie,但不是真的永久。

Cookie的时效性对于网站分析监测意义重大。Visit的监测依赖于Cookie的时效。例如,Google Analytics对Visit的Cookie设置了两个时效,一个是30分钟,另一个是浏览器关闭时。这就意味着,如果Visit Cookie在30分钟内没有更新,这个Cookie就失效了——这就是为什么我们说Visit这个度量衡量的是间隔不超过30分钟的页面浏览过程,如果 两次页面浏览之间的时间超过了30分钟,那么Visit计数会被增加1。另外,如果你打开一个网站,看了一会儿就关掉浏览器,那么当你再次打开浏览器重新 开这个网站的时候,即使两次浏览没有超过30分钟,也会被计算为一个新的Visit,原因就是Visit Cookie浏览器关闭时效结束的设置起的作用。

Unique Visitor也依赖于Cookie的时效。如果这个Cookie的时间设定为2天失效,那么你今明两天都访问同一个网站,Unique Visitor只会记录为从0增加到1;而如果你第三天又来,那么Unique Visitor就会再增加计数一次,共计2次。除了Visit和Unique Visitor外,Return visitor、Frequency等等度量当然也依赖于Cookie的时效。

  • 1st party cookie和3rd party cookie

  第一方Cookie和第三方Cookie其实是一个 非常简单的概念,但是我在百度上随便搜索了一些解释,好像都不是很清楚,也不是很准确。实际上,所谓第一方和第三方的说法,是用来确定Cookie的归属 的,这个归属是指Cookie中记录的域(domain)。举个例子:如果你访问我的这个网站www.chinawebanalytics.cn的时候, 我的网站在你的电脑上设置了一个Cookie,里面的记录的域名也是www.chinawebanalytics.cn,那么这个Cookie就是第一方 的,归你访问的网站www.chinawebanalytics.cn所有。而如果你访问网站www.chinawebanalytics.cn时,在你 的计算机中设置的Cookie的域名是www.omd.com,那么这个Cookie就是第三方Cookie,归www.omd.com所有。

对于网站分析而言,这个概念是非常重要的。例如,你会问Google Analytics使用的Cookie是1st party的,还是3rd party的。答案是第一方的。首先,Google Analytics在每个被监测网站上的Cookie都是由我们熟悉的监测javascript代码所创建的(是的,javascript也可以创建 Cookie,知道这点就够了,不需要深挖),其次,这个被创建的cookie的域不是analytics.google.com,而是被监测网站自己的 域。因此,虽然这个Cookie实际上是在Google Analytics的帮助下建立的,而且也为Google Analytics所用(反而不能被“被监测网站”直接利用),它仍然是第一方Cookie。

所以,第一方Cookie并不一定需要由某个网站自己的服务器给自己建立,别的网站也能为它建立;而且,第一方Cookie也不一定是能由某个 网站自己读取的,它完全可能由第三方读取。第一方和第三方的唯一区别只是:Cookie中的域名是否和被访问网站的域一样,是就是第一 方,否就是第三方。

这真的是一个容易混淆的概念,希望看了我上面的内容您弄清楚了。

网站分析和所有的互联网广告的监测,都会更喜欢第三方Cookie。原因是,第三方Cookie可以用来监 测跨网站的访问者行为。例如,DoubleClick使用的就是第三方Cookie,这个公司会为你打开的所有载有DoubleClick广告的页面建立 同一个(仅一个)域为DoubleClick的Cookie,这样,只要你打开了这些网页,无论它们是否属于同一网站,你的浏览广告的行为 DoubleClick都能知道。但是第一方Cookie就不行了,因为第一方Cookie得用被监测网站的域,这样多个网站就会有多个不同的 Cookie,跨网站浏览行为就无法监测了。

对于大多数浏览器而言,第三方Cookie是被默认关闭的,原因在于人们在讨论 Cookie涉及的隐私问题时,倾向于认为第三方Cookie极 大的获取了人们的行为隐私,并由此产生了对第三方Cookie普遍的不信任和误解。但事实上,所有的Cookie都不会泄露任何关于浏览者个人的隐私信 息,它捕捉的仅仅只是浏览行为本身,第三方Cookie也不例外。而如果所有人都愿意接受第三方cookie,那么网站分析能够给出的分析和优化方案会更 多。但可惜,因为第三方Cookie被普遍禁用,因此利用第三方Cookie的监测工具并不多,只有监测网络广告的工具才会坚持使用第三方Cookie。

  • 没有Cookie,还能监测到什么?

由于第三方Cookie不受欢迎,很少有网站分析工具会采用它。而如果完全没有Cookie,那么网站分析工具几乎无法工作。但实际上,如果没 有Cookie,还是能监测到一点儿东西的。这个东西是PV。因为PV的监测只要引发javascript监测代码就可以,跟cookie无关。例如,在 Omniture中,如果某个客户端禁用cookie,Omniture还是会记录这个客户端贡献的PV,但完全无法记录Visit,这就会使这个工具监 测的PV/Visit会比实际值略大。说点儿题外话:在没有Cookie的时候,Omniture会退而求其次用访问者客户端IP地址来辨别不同的 Visitor(Unique Visitor),这样禁用cookie后unique visitor其实还能监测,但由于visit不能监测了,因此有可能在Omniture中出现Unique Visitor大于Visit的情况。

没了Cookie,除了PV,其他的度量基本上就获得不了数据了,所以我会认为没有Cookie,我们什么都没了。或 者Visitor和Visitor所在的地理位置还能通过IP地址获得,但众所周知的原因,这个数据是非常不精确的,我们需要Cookie。

那么,你会问,多少客户端会禁用Cookie呢?我没有精确的数字,但我认为第一方Cookie应该会有大概80%的用户正在使用,只有20% 左右会禁用它。而第三方Cookie,由于是默认不开启的,因此我估计顶多只有20%的人在使用它。

随着IE8的出现,肯定会进一步降低Cookie的使用率,这也将进一步降低网站分析数据的样本数量。我不认为这 会降低网站分析工具在描述定性问题时的准确性(定性问题例如Bounce Rate,例如Time on site,以及Returning visitor和New visitor的比例),但在描述定量问题时会出现误差,或者更确切地说会偏小。如果随着Cookie禁用比例的增加,超过50%的人都禁用的话,那么网 站分析的原有方法论就会有麻烦了。不过,我肯定不相信Cookie禁用比例会有剧烈的上升,我很乐观——Cookie带给人们的方便远远要比一些不足一提 的隐私问题要多的多要大的多。禁用Cookie更多只是心理的慰藉(其实大多数时候一定只是心理上的感觉,而没有什么实际的对安全和隐私的帮助),但带来 的不方便则会直接影响你的浏览体验。

因此,无论是为了我们的专业本身,还是为了让浏览网页的用户有更好的体验,或是为了让网站本身能够创造更多的便利化应用,我们都有足够的理由支 持Cookie,反对微软的IE8色情浏览模式,捍卫我们应该捍卫的——这代表着智慧和进步。Eric Peterson写给总统奥巴马的那封公开信值得看看,这代表着我们所有网站分析从业者的最强烈呼声。

Continue reading 【转】什么是Cookie

javascript 打印

javascript 打印
使用iframe,写入类容,window.print打印,这个很简便。[测试sfari,firefox,ie,chrome都支持,opera不支持]
<html>
    <head>
        <style >
body {
    background-color: blue;
    background-color: red \9;
}
</style>
    <script type="text/javascript">
        function pt(){
            var ifa=document.getElementById('ifa');
            var doc=ifa.contentWindow.document;
            doc.write('ssssss');
            doc.close();
            ifa.contentWindow.print();
        }
    </script>        
    </head>
    <body>blabla
    <a onclick="pt();" href="#">print</a>
    <iframe id="ifa" ></iframe>
    </body>
</html>
但是要注意iframe的内容应该本页同域,否则有权限限制。

ie有问题,iframe打印不是iframe那个页面的内容而是iframe所在页面的内容。
解决办法,针对ie使用document.execCommand('print');即可

Continue reading javascript 打印

java 类初始化顺序

 
我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化 块)>构造器。我们也可以通过下面的测试代码来验证这一点:
Java代码
  1. public class InitialOrderTest {  
  2.  
  3.     // 静态变量  
  4.     public static String staticField = " 静态变量";  
  5.     // 变量  
  6.     public String field = "变量";  
  7.  
  8.     // 静态初始化块  
  9.     static {  
  10.         System.out.println(staticField);  
  11.         System.out.println("静态初始化块");  
  12.     }  
  13.  
  14.     // 初始化块  
  15.     {  
  16.         System.out.println(field);  
  17.         System.out.println("初始 化块");  
  18.     }  
  19.  
  20.     // 构造器  
  21.     public InitialOrderTest() {  
  22.         System.out.println("构造 器");  
  23.     }  
  24.  
  25.     public static void main(String[] args) {  
  26.         new InitialOrderTest();  
  27.     }  

运行以上代码,我们会得到如下的输出结果:

  1. 静态变量
  2. 静态初始化块
  3. 变量
  4. 初始化块
  5. 构造器

这与上文中说的完全符合。那么对于继承情况下又会怎样呢?我们仍然以一段测试代码来获取最终结果:

Java代码 复制代码
  1. class Parent {  
  2.     // 静态变量  
  3.     public static String p_StaticField = "父类--静态变量";  
  4.     // 变量  
  5.     public String p_Field = "父类--变量";  
  6.  
  7.     // 静态初始化块  
  8.     static {  
  9.         System.out.println(p_StaticField);  
  10.         System.out.println("父类--静态初始化块");  
  11.     }  
  12.  
  13.     // 初始化块  
  14.     {  
  15.         System.out.println(p_Field);  
  16.         System.out.println("父类 --初始化块");  
  17.     }  
  18.  
  19.     // 构造器  
  20.     public Parent() {  
  21.         System.out.println("父类 --构造器");  
  22.     }  
  23. }  
  24.  
  25. public class SubClass extends Parent {  
  26.     // 静态变量  
  27.     public static String s_StaticField = "子类--静态变量";  
  28.     // 变量  
  29.     public String s_Field = "子类--变量";  
  30.     // 静态初始化块  
  31.     static {  
  32.         System.out.println(s_StaticField);  
  33.         System.out.println("子类--静态初始化块");  
  34.     }  
  35.     // 初始化块  
  36.     {  
  37.         System.out.println(s_Field);  
  38.         System.out.println("子类 --初始化块");  
  39.     }  
  40.  
  41.     // 构造器  
  42.     public SubClass() {  
  43.         System.out.println("子类 --构造器");  
  44.     }  
  45.  
  46.     // 程序入口  
  47.     public static void main(String[] args) {  
  48.         new SubClass();  
  49.     }  
  50. }  

运行一下上面的代码,结果马上呈现在我们的眼前:

  1. 父类--静态变量
  2. 父类--静态初始化块
  3. 子类--静态变量
  4. 子类--静态初始化块
  5. 父类--变量
  6. 父类--初始化块
  7. 父类--构造器
  8. 子类--变量
  9. 子类--初始化块
  10. 子类--构造器

现在,结果已经不言自明了。大家可能会注意到一点,那就是,并不是父类完全初始化完毕后才进行子类的初始化,实际上子类的静态变量和静态初始化块的初始化 是在父类的变量、初始化块和构造器初始化之前就完成了。

那么对于静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢?是否静态变量总是先于静态初始化块,变量总是先于初始化块就被初始化了 呢?实际上这取决于它们在类中出现的先后顺序。我们以静态变量和静态初始化块为例来进行说明。

同样,我们还是写一个类来进行测试:

Java代码
  1. public class TestOrder {  
  2.     // 静态变量  
  3.     public static TestA a = new TestA();  
  4.       
  5.     // 静态初始化块  
  6.     static {  
  7.         System.out.println("静态 初始化块");  
  8.     }  
  9.       
  10.     // 静态变量  
  11.     public static TestB b = new TestB();  
  12.  
  13.     public static void main(String[] args) {  
  14.         new TestOrder();  
  15.     }  
  16. }  
  17.  
  18. class TestA {  
  19.     public TestA() {  
  20.         System.out.println("Test--A");  
  21.     }  
  22. }  
  23.  
  24. class TestB {  
  25.     public TestB() {  
  26.         System.out.println("Test--B");  
  27.     }  

运行上面的代码,会得到如下的结果:

  1. Test--A
  2. 静态初始化块
  3. Test--B

这也不要太纠结。
下面的写法会产生递归。
public class A
{
static{
a = new A("static block");
}
final static A a;
static A aa = new A("static init");
// A ma = new A("inner init");//这里在实例化变量时又实例自己的对象,递归
{
new A("inner block");//这里在实例化变量时又实例自己的对象,递归
}
public A()
{
// TODO Auto-generated constructor stub
}
public A(String i)
{
System.out.println(i);
}
public static void main(String[] args)
{

}
}

这里顺便温习一下构造函数的继承问题:

创建一个子类的对象实例的时候,必先调用父类的无参数的构造函数(默认构造函数),假如父类有带参数的构造函数,那么系统将不会给它创建无参数的构造函数,这时,子类在实例化的时候,因为找不到父类的默认构造函数,编译器将会报错,但如果在子类的构造函数中指定用父类的带参数的构造函数的时候,或者在父类中加一个无参数的构造函数,就不会报错。

Continue reading java 类初始化顺序

Extjs[ver<=3.1.0] enter键发送跨浏览器解决 等相关问题

聊天程序,enter键要发送同时清空编辑区:
Extjs textarea,
发现发送了后清空文本框后还是有个回车:
在chat里面的原因是截获事件后没有取消事件冒泡,导致先清空文本,最后残留的回车应该是事件冒泡产生的。
在ie里面设置event.keyCode = 8;[退格]即可
在火狐里面使用Ext包装的eventObject.preventDefault即可

==============================================
一下直接看源码可以分析出:
Ext panel要让它可拖动,可用draggable属性,但是如果没有设置panel的floating=true,则拖动后结束后还是会归原,可将 panel样式设置position:absolute即可.[这是wcsa里面出现的情况],另一种是没有header(没有设置title),
见下注释:

extDialog = new Ext.Panel({
style : 'z-index:' + (Ext.WindowMgr.zseed - 20),
width : 760,
height : 532,
layout : 'border',
tbar : _tbar,//toolbar作为伪header,没有设置header
floating : true,//
renderTo : Ext.getBody(),
x : x,
y : y,
items : [_rightpnl, chatpanel, southpnl]
});

extDialog.on('show', function() {//由于要取toolbar的el属性,故在render之后才可以
extDialog.dd = new Ext.Panel.DD(extDialog, {//draggleble是普通的配置文档上的copy
insertProxy : false,

onDrag : function(e) {
var pel = this.proxy.getEl();
this.x = pel.getLeft(true);
this.y = pel.getTop(true);
},

endDrag : function(e) {
this.panel.setPosition(this.x, this.y);
}
});
extDialog.body.setStyle('cursor', '');//由于没有header,将body的cursor设置为了move,所以还原
_tbar.el.setStyle('cursor', 'move');//设置toolbar的cursor为move
extDialog.dd.setHandleElId(_tbar.el.dom.id);//这个是必要的,chat里面遇到的问题是利民的textarea得不到焦点(鼠标点击没反应),就是因为默认DD没有header,将整个body设置成了handler
});

这个解决方案在ie6下有问题,整个Extjs层无法点击,最后还是改用window来做就没问题。

=======================
chat里面遇到,右侧要写html dialog,发现火狐下再展开原来collapse的panel会导致原来写好的iframe 里面的html是空的,跟踪dom发现这个收缩的panel整个被remove了,再展开时extjs试图还原,对一般的这个没问题,对
嵌入iframe则有问题,查看源码估计是展开收缩动画造成的原因,将Panel animCollapse的设置为false就可以了.

floatable:false,则可以让折叠的panel必须要点按钮才可以展开[borderlayout.region]

extjs3.1.0之前

Continue reading Extjs[ver<=3.1.0] enter键发送跨浏览器解决 等相关问题

净现值、折现率、内部收益率、投资利润

NPV:净现值 (Net Present Value )

      投资项目投入使用后的净现金流量,按资本成本或企业要求达到的报酬率折算为现值,减去初始投资以后的余额,叫净现值(net present value,NPV)。(净现值 = 未来报酬的 总现值初始投资)     

 

      未来报酬的总现值计算 方法:

            1、计算每年的营业净现金流量。

       2、计算未来报酬的总现值。

             (1)将每年的营业净现金流量折算成现值。

                          如果每年的NCF相等,则按年金法折成现值;

                          如果每年的NCF不相等,则先对每年的NCF进行折现,然后加以合计。

             (2)将终结现金流量折算成现值。

             (3)计算未来报酬的总现值。

 

      也就是说净现值大于零则方案可行,且净现值越大,方案越优,投资效益越好。

      简单的例子说明:  说白了就是未来可以净赚多少钱。初始投资10块,预计将来赚 12块,则2块就是净现值。

      现值 就是资金当前的价值,也就是说现在手上的这些钱他值多少钱。

      如果存到银行的话,净现值就是利息,现值就是本金+利息。

 

净现值=未来报酬总现值-建设投资总额

NPV=\sum^{n}_{t=1}\frac{C_t}{(1+r)^t}-C_0

式中:NPV—净现值

Co—初始投资额

Ct —t年现金流量

r—贴现率

n—投资项目的寿命周期

如果将初始投资额看做第0年的现金流量,同时考虑到(1 + r)o = 1,则上式可以变换为:

NPV=\sum^{n}_{t=0}\frac{C_t}{(1+r)^t}

净现值指标的决策标准是:如果投资项目的净现值大于零,接受该项目;如果投资项目的净现值小于零,放弃该项目;如果有多个互斥的投资项 目相互竞争,选取净现值最大的投资项目。

项目A、B的净现值均大于零,表明这两个项目均可取。如果二者只能取一个,则应选取项目A。

如果投资项目除初始投资额外各期现金流量均相等,则可利用年金现值系数表计算,使计算过程简化.

净现值指标考虑了投资项目资金流量的时间价值,较合理地反映了投资项目的真正的经济价值,是一个比较好的投资决策指标。

DR : 折现率[考试中往往由下面的折现系数求得,一般折现率由银行决定]

        折现率是指将未来有限期预期收益折算成现 值的比率。可以这样简单的理解:由于资金是有时间价值的,今天的一块钱和一年后的块钱在价值是是不能等同的。如何把一年后的一块钱和今 天的一块钱在价值上进行比较呢,那就要把一年后的一块钱折成今天的价值,这叫折现。公式是:PV = C/(1+r)^t   其中:PV = 现值(present value),C=期末金额,r=折现率,t=投资期数。

        举例:
        一年后一块钱在今天的价值=一年后的一块钱/(1+折现率) 
        二年后一块 钱在今天的价值=二年后的一块钱/(1+折现率)^2(注:平方) 
        三年后一块钱在今天的价值=三年后的一块钱/(1+折现 率)^3(注:立方)
依次类推。 在进行折现 时,折现率一般采用当前的市场利率,如同样期限的贷款利率等;或用资金的实际成本作为折现率。

        再举例来说,您的投资机会是把钱存银行,存款利率为10%,那么一年以后收到的1元,对您来说其现值为0.909(=1/1.1);而两年后的1元对您来 说其现值为0.826(=1/1.1^2)。也就是说,现在给您0.909元和1年后给您1元,您认为是相同的,因为您可以把0.909元存入银行,1年 后获得1元;同理,现在给您0.826元,和2年后给您1元并没有什么不同。 
 

折现系数

【折现系数】
又称一次偿付现值因素或复利现值系数,英文为discount factor,指根据折现率和年数计算出来的一个货币单位在不同时间的现值。在折现率不变的情况下,一个货币单位在n年的折现系数为:
R=1/(1+i)n   (注:此处n为(1+i)的上标)
式中:
R——折现系数;
i——折现率;
n——年数。

IRR : 内部收益率

        简单的说就是:NPV=0的时候的DR,一般我们比较的是行业的IRR。意思就是刚收回成本的时候的折 现率。说得通俗点,内部收益率越高,说明你投入的成本相对地少,但获得的收益却相对地多。

        比如A、 B两项投资,成本都是10万,经营期都是5年,A每年可获净现金流量3万,B可获4万,通过计算,可以得出A的内部收益率约等于15%,B的约等于 28%,这些,其实通过年金现值系数表就可以看得出来的。

 

ROI: 投资利润

      年投资利润率=年净利润/投资总额 *100%

      1、第一年投资利润率:
      第一年投资利润=1100-220-270-160=450
      第一年投资利润率=450/200*100%=225%

      2、第二年投资利润率:
      第二年投资利润=2450-530-650-300=970
      第二年投资利润率=970/200*100%=485%

      3、第三年投资利润率:
      第三年投资利润=5500-900-975-400=3225
      第三年投资利润率=3225/200*100%=1612.5%

Continue reading 净现值、折现率、内部收益率、投资利润

Pagination


Total views.

© 2013 - 2019. All rights reserved.

Powered by Hydejack v6.6.1