Quantcast
Channel: IT社区推荐资讯 - ITIndex.net
Viewing all 15843 articles
Browse latest View live

地图聊天等服务移动化水平超九成 PC端渐消亡

$
0
0

移动应用已经成为普通大众最主流的上网方式,传统的PC端,则逐渐没落,美国互联网市场调研公司comScore,日前发布了五月份移动互联网和网络数字媒体消费的一份报告,其中显示流媒体电台、地图、照片、即时通信等诸多互联网服务的移动化水平,已经超过了九成。comScore这份报告,据称是根据五月份网民10亿分钟的上网交互时间的样本分析得出。

据称,五月份创下了移动互联网发展的一个里程碑事件:网民花费在移动应用上的时间,在所有花费在数字媒体的时间的占比,首次超过了50%,达到51%。

据称,包括智能手机和平板电脑在内的移动终端,在所有的数字媒体消费时间中,占到了60%。PC等设备,已经成为次要终端。

众所周知的是,移动设备正在取代家里的电脑,成为主导的上网工具,Facebook、Twitter、谷歌等互联网公司,也正在实施大手笔的“移动化战略”,即把越来越多的服务,开发成各个操作系统的APP,供用户下载使用。

comScore的报告显示,不同互联网应用服务的移动化水平,存在差异。其中,一些产品开始发展成为“纯移动业务”。

地图聊天等服务移动化水平超九成 PC端渐消亡

移动端与PC端应用使用时间对比

其中,以音乐流媒体服务商Pandora领军的数字电台业务,其96%的用户交互,来自移动设备。而在照片应用中,96%的用户交互,来自于移动设备,这一领域的领军厂商包括Facebook旗下的Instagram,以及雅虎旗下的Flickr。

其他移动化程度超过90%的业务包括在线地图(谷歌地图、苹果地图是主力),以及即时通信服务(领军企业包括Facebook旗下Messenger和WhatsApp,以及Viber等)。

90%的移动化水平也表明,目前仍有少数网民,通过电脑查阅在线地图或是进行即时通信聊天。

在游戏业务中,86%的用户交互来自于移动端,其余来自于电脑端。

comScore指出,在和普通大众生活息息相关的社交网络产品上,移动化水平为71%,即三成的用户交互,还来自于电脑端。

虽然移动化程度并不高,但社交网络无疑是最重要的上网活动,其用户停留时间,在全部数字媒体消费时间内占到了两成。数据显示,在过去一年中,移动社交产品的交互时间,增长了55%。


[原]性能是怎么来的

$
0
0
性能是怎么来的


互联网的性能能够模拟测试吗?如何保证性能?


一、架构
系统架构:分散物理部署


前端层:负载均衡、静态化/CDN
逻辑层:异步、服务化
数据层:读写分离、缓存、消息队列、不同数据不同数据引擎、数据同步


二、开发
DBA:核心交易表:数据类型拆分、数据列拆分、数据行拆分、索引
开发leader:大交易事务代码审查与优化


三、交付运维
灰度上线
降级
流量排队、流量分流


四、基础运维
硬件:网络、网卡、内存、CPU、存储

系统软件:系统软件、中间件参数配置


五、应用运维监控优化

数据层:大IO SQL的监控与优化

作者:david_lv 发表于2014-6-27 9:08:28 原文链接
阅读:106 评论:0 查看评论

Javascript网页截屏的方法

$
0
0

最近我在研究开发一个火狐插件,具体的功能是将网页内容截屏并分享到微博上。目前基本功能已经实现,大家可以在 @程序师视野里看到用这个截图插件分享的微博的效果。

之前我曾写过 如何将canvas图形转换成图片下载canvas图像的方法,这些都是在为这个插件做技术准备。

技术路线很清晰,将网页的某个区域的内容生成图像,保持到canvas里,然后将canvas内容转换成图片,保存到本地,最后上传到微博。

我在网上搜寻到 html2canvas这个能将指定网页元素内容生成canvas图像的javascript工具。这个js工具的用法很简单,你只需要将它的js文件引入到页面里,然后调用 html2canvas()函数:

html2canvas(document.body, {
    onrendered: function(canvas) {
        /* canvas is the actual canvas element,
           to append it to the page call for example
           document.body.appendChild( canvas );
        */
    }
});

这个 html2canvas()函数有个参数,上面的例子里传入的参数是 document.body,这会截取整个页面的图像。如果你想只截取一个区域,比如对某个 div或某个 table截图,你就将这个 div或某个 table当做参数传进去。

我最终并没有选用html2canvas这个js工具,因为在我的实验过程中发现它有几个问题。

首先,跨域问题。我举个例子说明这个问题,比如我的网页网址是http://www.webhek.com/about/,而我在这个页面上有个张图片,这个图片并不是来自www.webhek.com域,而是来自CDN图片服务器www.webhek-cdn.com/images/about.jpg,那么,这张图片就和这个网页不是同域,那么html2canvas就无法对这种图片进行截图,如果你的网站的所有图片都放在单独的图片服务器上,那么用html2canvas对整个网页进行截图是就会发现所有图片的地方都是空白。

这个问题也有补救的方法,就是用代理:

<!DOCTYPE html><html><head><meta charset="utf-8"><title>html2canvas php proxy</title><script src="html2canvas.js"></script><script>
        //<![CDATA[
        (function() {
            window.onload = function(){
                html2canvas(document.body, {"logging": true, //Enable log (use Web Console for get Errors and Warnings)"proxy":"html2canvasproxy.php","onrendered": function(canvas) {
                        var img = new Image();
                        img.onload = function() {
                            img.onload = null;
                            document.body.appendChild(img);
                        };
                        img.onerror = function() {
                            img.onerror = null;
                            if(window.console.log) {
                                window.console.log("Not loaded image from canvas.toDataURL");
                            } else {
                                alert("Not loaded image from canvas.toDataURL");
                            }
                        };
                        img.src = canvas.toDataURL("image/png");
                    }
                });
            };
        })();
        //]]></script></head><body><p><img alt="google maps static" src="http://maps.googleapis.com/maps/api/staticmap?center=40.714728,-73.998672&zoom=12&size=800x600&maptype=roadmap&sensor=false"></p></body></html>

这个方法只能用在你自己的服务器里,如果是对别人的网页截图,还是不行。

试验的过程中还发现用html2canvas截屏出来的图像有时会出现文字重叠的现象。我估计是因为html2canvas在解析页面内容、处理css时不是很完美的原因。

最后,我在火狐浏览器的官方网站上找到了 drawWindow()这个方法,这个方法和上面提到html2canvas不同之处在于,它不分析页面元素,它只针对区域,也就是说,它接受的参数是四个数字标志的区域,不论这个区域中什么地方,有没有页面内容。

void drawWindow(
  in nsIDOMWindow window,
  in float x, 
  in float y,
  in float w,
  in float h,
  in DOMString bgColor,
  in unsigned long flags [optional]
);

这个原生的JavaScript方法看起来非常的完美,正是我需要的,但这个方法不能使用在普通网页中,因为火狐官方发现这个方法会引起有 安全漏洞,在这个bug修复之前,只有具有“Chrome privileges”的代码才能使用这个 drawWindow()函数。

虽然有很大的限制,但周折一下还是可以用的,在我开发的火狐addon插件中,main.js就是具有“Chrome privileges”的代码。我在网上发现了一段火狐插件SDK里自带 代码样例

var window = require('window/utils').getMostRecentBrowserWindow();
var tab = require('tabs/utils').getActiveTab(window);
var thumbnail = window.document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
thumbnail.mozOpaque = true;
window = tab.linkedBrowser.contentWindow;
thumbnail.width = Math.ceil(window.screen.availWidth / 5.75);
var aspectRatio = 0.5625; // 16:9
thumbnail.height = Math.round(thumbnail.width * aspectRatio);
var ctx = thumbnail.getContext("2d");
var snippetWidth = window.innerWidth * .6;
var scale = thumbnail.width / snippetWidth;
ctx.scale(scale, scale);
ctx.drawWindow(window, window.scrollX, window.scrollY, snippetWidth, snippetWidth * aspectRatio, "rgb(255,255,255)");
// thumbnail now represents a thumbnail of the tab

这段代码写的非常清楚,只需要依据它做稍微的修改就能适应自己的需求。

我是第一次接触火狐插件开发,是边学习,边研究,边开发。所以开发速度很慢,这个小小的插件用了整整一周才基本上达到能用的程度。你可以在 @程序师视野微博里看到用它上传的图片效果还是不错的。

先能用,然后使用的过程中慢慢做改进,这是我的软件开发理念。

希望和对火狐插件有兴趣的朋友一起探讨、一起学习。

 

新老租车模式大PK——租车时代来临

$
0
0

1.    中国的汽车短租市场还处于早期阶段。但随着休闲商务旅游需求的提升,及持有驾照人数增加,市场将进入高成长阶段。同时,各地的限牌政策客观上促进了汽车租赁市场的发展。

2.    传统B2C租车公司都属于重资产的模式,扩张较慢,资产负债率高,利润率低。但其对资产极强的管控能力,有效地保证了服务的质量和品质。

3.    新兴的P2P租车模式,摆脱了传统租赁的“资产包袱”,扩张很快同时利润率高。但在线下服务上,还需要更有效的方式保证服务的质量和标准化。

图片说明文字

序、资本涌入,租车市场风起云涌

2013年12月,易到用车获得携程领投的6000万美元B轮投资; 2014年5月,神州租车向港交所递交了主板上市申请;6月,PP租车获得由红杉资和清流资本的1000万美元A轮投资。

资本的聚集,标志着汽车短租市场的爆发。尽管中国汽车租赁市场兴起的时间并不长,但也已经出现了几类不同的玩家。对于租客和投资者来说,新老租车模式,究竟哪一种代表着未来?

一、中国租车市场尚处早期,潜力巨大

罗兰贝格数据显示,中国汽车短租市场规模从2008年的10亿元增至2013年的60亿元,年复合增长率32%。该增速远高于同期巴西(13%)、美国(6%)、日本(2%)、德国(2%)的短租市场年复合增长率。罗兰贝格预计到2018年,中国汽车短租市场规模将达到180亿元,年复合增长率约27%。

同时,租车市场尚处于发展早期阶段。租车市场渗透率(租赁车辆数占车辆总数比例)2012年只有0.4%,同期日本为2.5%,美国1.6%,韩国1.4%,巴西1.3%。

随着中国休闲及商务旅游需求的增长,以及持有驾照人数的增加,整个租车市场进入快速增长阶段。此外,各地先后颁布的限牌政策也在客观上增加了汽车租赁的需求。根据罗兰贝格的预测,持有驾照人数与私家车数量之间的差距将在未来持续扩大。

中国租赁行业开放的时间不长,目前发展比较成熟的汽车短租公司基本在2006-2007年前后成立,如神州租车,一嗨租车,至尊租车等,这一批都属于传统的B2C租赁模式。随着汽车租赁市场的增长和互联网的普及,新形态的汽车租赁模式也在不断涌现。2013年PP租车上线后,这种P2P租车模式很快为市场接受并成为资本追捧的热点。

除了B2C和P2P的区分,汽车短租市场还有自驾和配备司机这两类。根据现行法律,配置司机这种服务只能由拥有运营牌照的出租汽车公司提供。因此,易到用车这种“连车带人”的租车方式在政策上存在相对比较大的政策风险。本文仅探讨B2C组合和P2P租车在模式上的一些差异。

二、B2C租车模式——神州租车

传统的租车公司都属于B2C的模式,租车公司自行够买车辆并建立线下门店完成租车服务。神州、一嗨、至尊都属于传统的B2C模式。

B2C租车模式下的收入主要来自租车业务及二手车销售收入。二手车收益是当所购置车辆使用达到一定年限后,租赁公司向终端用户、经销商出售二手车的销售收入。以神州租车为例,2013年,租车业务产生的收入占81.7%,二手车收益占比为18.3%。

神州租车车队规模目前达到5.5万辆,在69个城市有751家直营店;在152个规模较小的城市发展了191个加盟店;市场占有率31.2%,排名其后的一嗨和至尊则是8.1%和1.9%。

B2C的模式一直被投资者质疑“太重”,传统的租车生意是个重资产的活,收入的提升依赖规模的扩张,而车队扩张需要投入大笔资金采购,因此传统的租车公司对融资贷款的需求很大。根据最新数据,神州租车资产负债率达到97.3%,这个数字也是传统B2C租车公司的普遍水平。

在这种模式下,传统租车公司普遍盈利困难,需要通过实现规模化效应后,依赖管理水平提高运营效率才能实现盈利。同时,由于对资金的依赖大,传统B2C模式扩张起来也相对较慢。

在重资产的负担下,B2C模式的优势在于对资产的管控力极强,由于门店和车辆都是自己的,在服务品质上更容易有保证,可以为租客提供更高端更标准化的服务。通过支付相对高一些的租金,获得可靠的服务和后续保障,仍然是大多数租客的能够认可的租车方式。

三、P2P租车模式——PP租车

P2P租车,是通过平台直接连接私家车主的闲置车辆和租车者的用车需求。私家车主可以在平台上将自己的车辆标价出租,租车者可以搜索查找距离自己最近的待租车辆并向私家车主发出请求。PP租车,宝驾租车都属于这一模式。

对于租车者来说,P2P的模式下可以获得更低的租车价格。对于车主而言,可以通过闲置车辆带来收入。以PP租车为例,PP租车在其平台上给出私家车主的出租指导价低于市场价的30%,价格当然成为吸引租客的重要因素。

从模式上说,P2P租车与传统租车相比,最本质区别就是不用花一分钱去购置车辆,所以成本很低,扩张起来也很快。根据PP租车披露的数据,目前PP租车在北京注册有近10000辆私家车,这个数字已经超过神州租车在北京地区的汽车数量。在拿到1000万美金的A轮融资后,PP租车也明确表示要开始在全国范围内的扩张。这样的扩张速度在传统租车模式下是很难想象的。

相比之下, P2P租车模式的优点是轻资产、盈利空间更大、扩张性强。但问题也很明显,在P2P租车模式下,如何保证下单的成功率和服务的标准化,都是现有的难点。

另外, P2P租车这种“车人分离”的模式在风险控制上面临着更多的问题,车主承担的潜在风险相对比较高,在违章、刮蹭、事故、加油各个环节上都可能出现纠纷,自己的利益如何保证,成为私家车主的主要担忧。

PP租车目前的做法是,风控上采取和传统租赁公司相同的手段,验证两证一卡。此外,通过用户互评机制建立线上的信用管理系统,尝试通过互联网的手段去解决风险问题。

结语、用户利益为先

不论是B2C还是P2P,重资产还是轻资产,想要做好租车生意都有着一些无法回避的难点。能够在高速成长的市场迅速跑马圈地,同时保证线下的服务质量和用户利益,才有可能在这个资本蜂拥而上的战场上获得一席之地。

来源:http://www.199it.com/archives/246718.html

 


© 推荐 for 互联网的那点事. | 猛击下载: iPhone客户端猛击下载: Android客户端

drbd脑裂处理

$
0
0
前面写过一篇关于使用drbd+corosync+pacemaker实现postgresql高可用的博客,其实drbd的对等节点如果不在线的话,即主节点的数据更改如果无法及时传送到备节点达到一定时间,会造成数据不一致,即使故障节点在长时间离线后恢复,drbd可能也不能正常同步了。或者另外一种情况,主备都在线,但心跳网络断了而出现脑裂,两个节点都认为自己是主节点,也会造成两个节点的数据不一致,这样需要人工干预,告诉drbd以哪个节点为主节点,或者在drbd配置脑裂的行为。下面是长时间备节点不在线后出现的情况:
备节点:

[root@pgtest4 ~]# cat /proc/drbd 
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by root@pgtest4, 2014-06-08 16:39:23

 1: cs:StandAlone ro:Secondary/ Unknown ds:UpToDate/DUnknown   r-----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:57596

cs(连接状态)出现standalone,即孤立的
ro(角色)对等节点为unknown(非正常状态),本地节点为secondary(从节点)
ds(磁盘状态)是uptodate/dunknown,也是本地节点为处于正在更新状态,而对等节点为unknown状态。
从以上可以看出,备节点发生了drbd脑裂,注意,drbd的脑裂和集群的脑裂是两个概念,而此时的集群状态是正常的:

[root@pgtest3 ~]# crm status
Last updated: Fri Jun 27 08:34:28 2014
Last change: Fri Jun 27 08:34:22 2014 via crm_attribute on pgtest4
Stack: classic openais (with plugin)
Current DC: pgtest3 - partition with quorum
Version: 1.1.8-7.el6-394e906
2 Nodes configured, 2 expected votes
5 Resources configured.


Node pgtest4: standby
Online: [ pgtest3 ]

 Master/Slave Set: ms_postgresql [postgresql]
     Masters: [ pgtest3 ]
     Stopped: [ postgresql:1 ]
 pgresource (lsb:postgresql): Started pgtest3
 pgstore (ocf::heartbeat:Filesystem): Started pgtest3
 vip (ocf::heartbeat:IPaddr): Started pgtest3
即使使用crm node standby命令也可以正常把集群资源转移到pgtest4备节点上,但两个节点的数据已经不一致了。

所以此时要非常小心,如果使用pgtest4而且又有新数据进来,就会和pgtest3的数据冲突了,将来必须以一份数据为主,要么pgtest3,要么pgtest4,但数据都会丢一些,下面手工进行同步,以pgtest3为主,重新同步:

[root@pgtest4 ~]# drbdadm secondary r0 #首先让drbd节点配置为从节点
[root@pgtest4 ~]# drbdadm connect --discard-my-data r0 #从主节点同步数据,并且discard自己的数据
[root@pgtest4 ~]# cat /proc/drbd 
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by root@pgtest4, 2014-06-08 16:39:23

 1: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
    ns:0 nr:79104 dw:79104 dr:0 al:0 bm:26 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

现在状态就变成connect的了,ro也变成Secondary/Primary的了,这时再切换节点并连接pg查看数据,数据已经是一致状态了。

因此使用drbd做高可用要特别注意的一点就是:尽量保证主备同时在线,如果备节点需要维护等而长期不在线,当在线时最好手工同步下数据,不过如果没有配置资源粘性的话,很有可能资源会自动往主节点上跑,因此建议设置资源粘性,让资源在飘到一个节点上后就不动了,配置方法如下:
crm(live)# configure
crm(live)configure# rsc_defaults resource-stickiness=100
crm(live)configure# verify
crm(live)configure# commit

另附drbd的状态含义:
一个资源可能有以下连接状态之一:
StandAlone独立的:网络配置不可用。资源还没有被连接或者是被管理断开(使用drbdadm disconnect命令),或者是由于出现认证失败或者是裂脑的情况。
Disconnecting断开:断开只是临时状态,下一个状态将是StandAlone独立的。
Unconnected悬空:是尝试连接前的临时状态,可能的下一个状态为WFconnection和WFReportParams。
Timeout超时:与对等节点连接超时,也是临时状态,下一个状态为Unconected悬空。
BrokerPipe:与对等节点连接丢失,也是临时状态,下一个状态为Unconected悬空。
NetworkFailure:与对等节点失去连接后的临时状态,下一个状态为Unconected悬空。
ProtocolError. 与对等节点失去连接后的临时状态,下一个状态为Unconected悬空。
TearDown拆解:临时状态,对等节点连接关闭,下一个状态为Unconected悬空。
WFConnection.等待和对等节点建立网络连接。
WFReportParams:已经建立TCP连接,本节点等待从对等节点传来的第一个网络包。
Connected连接:Drbd已经建立连接,数据镜像现在可用,节点处于正常状态。
StartingSyncS:完全同步,有管理员发起的刚刚开始同步。未来可能的状态为SyncSource或PausedSyncS。
StartingSyncT:完全同步,有管理员发起的刚刚开始同步,下一状态为WFSyncUUID。
WFBitMapS:部分同步刚刚开始,下一步可能的状态:SyncSource或PausedSyncS。
WFBitMapT:部分同步刚刚开始,下一步可能的状态:WFSyncUUID。
WFSyncUUID:同步即将开始,下一步可能的状态:SyncTarget或PausedSyncT。
SyncSource:以本节点为同步源的同步正在进行。
SyncTarget:以本节点为同步目标的同步正在进行。
PausedSyncS:以本地节点是一个持续同步的源,但是目前同步已经暂停。可能是因为另外一个同步正在进行或者是使用命令drbdadm pause-sync暂停了同步。
PausedSyncT:以本地节点为持续的同步目标,但是目前同步已经暂停,这可能是因为另外一个同步正在进行或者是使用命令drbdadm pause-sync暂停了同步。
VerifyS:以本地节点为验证源的线上设备验证正在执行。
VerifyT:以本地节点为目标源的线上设备验证正在执行。

Chrome 远程调试协议分析与实战

$
0
0
作者:the1sky

背景

某一天,A 君想获取 Chrome 页面中的性能数据,诸如时间、白屏和首屏等,因为需要和竞品进行对比分析,无法注入代码,该怎么办?

此时,你也许能想到 开发者工具(DevTools),也许知道 Timeline(包含浏览器完整的行为数据),该怎么自动获取到 Timeline 数据呢?

开发者工具

开发者工具(DevTools)是一个独立的 Web 应用程序(HTML+CSS+Javascript),被集成在浏览器中,通过 远程调试协议(remote debugging protocol)和浏览器内核进行交互,直接使用 Ctrl+Shift+I呼出。

devtools

可以在当前的浏览器页面直接打开 DevTools 调试,也可以在浏览器之外进行调试,本文的实战内容基于 PC 平台浏览器之外的远程调试。

远程调试协议

远程调试协议基于 WebSocket,利用 WebSocket 建立连接 DevTools 和浏览器内核的快速数据通道。DevTools 中的源代码( Main.js:220)如下:

var ws;
if ("ws" in WebInspector.queryParamsObject)
    ws = "ws://" + WebInspector.queryParamsObject.ws;
else if ("page" in WebInspector.queryParamsObject) {
    var page = WebInspector.queryParamsObject.page;
    var host = "host" in WebInspector.queryParamsObject ? WebInspector.queryParamsObject.host : window.location.host;
    ws = "ws://" + host + "/devtools/page/" + page;
}

该协议把操作划分为不同的域(domain),比如 DOM、Debugger、Network、Console 和 Timeline 等,可以理解为 DevTools 中的不同功能模块。

每个域(domain)定义了它所支持的 command 和它所产生的 event。

每个 command 包含 request 和 response 两部分,request 部分指定所要进行的操作以及操作说要的参数,response 部分表明操作状态,成功或失败。

command 和 event 中可能涉及到非基本数据类型,在 domain 中被归为 Type,比如:'frameId': <FrameId>,其中 FrameId 为非基本数据类型

至此,不难理解:

domain = command + event + type

远程调试协议应用场景

  • 针对移动端的远程调试,因为移动平台一般都不会提供足够大的区域来显示 DevTools,必须要在手机浏览器之外进行远程调试,具体配置请参看 这篇文章

  • 获取 JS 的 Runtime数据,常用的如 window.performancewindow.chrome.loadTimes()

  • 获取 NetworkTimeline数据,进行自动性能分析

  • 与强大的 phantomjs合体,phantomjs 暂时只支持基于 remote debugging protocol 的调试,希望能支持 Network 及 Timeline 数据的获取,phantomjs 的最新技术请 点击进入

远程调试协议结构

以 Page domain 为例

command 结构如下:

Page.navigate
request: {"id": <number>,"method": "Page.navigate","params": {"url": <string>
    }
}
response: {"id": <number>,"error": <object>
}

执行 Page.navigate 操作,需要参数 url,id 可以随意指定,不过要确认全局的唯一性,因为需要通过 id 关联 request 和 response。

event 结构如下:

Page.loadEventFired
{"method": "Page.loadEventFired","params": {"timestamp": <number>
    }
}

Page domain 派发 loadEventFired 事件结构数据(通过 WebSocket 的 onmessage 获取),并包含参数 timestamp

type 结构如下:

Frame: object
    id ( string )
        Frame unique identifier.
    loaderId ( Network.LoaderId )
        Identifier of the loader associated with this frame.
    mimeType ( string )
        Frame document's mimeType as determined by the browser.
    name ( optional string )
        Frame's name as specified in the tag.
    parentId ( optional string )
        Parent frame identifier.
    securityOrigin ( string )
        Frame document's security origin.
    url ( string )
        Frame document's URL.

Frame type 为包含 id,loaderId,mimeType,name,parentId,securityOrigin 和 url 字段的 Object 数据类型,其中 loaderId 为另外一个定义在 Network domain 中的 type

更多协议内容请猛戳 这里

远程调试协议实战

此协议用于 server 端和 client 端的通讯,所以需要先建立 server 端,然后 client 端通过协议连接到 server 端

开启 server 服务

打开浏览器的远程调试支持,并指定端口号:

./chrome --remote-debugging-port=9222

./chrome为已安装的 Chrome 可执行程序

获取 server 地址

在浏览器中直接输入:

http://localhost:9222/json

获取所有的 tabs 信息,数据格式如下:

[
    {},
    {},
    {}
]

每个 {} 的内容如下:

{
    description: "",
    devtoolsFrontendUrl: "/devtools/devtools.html?ws=localhost:9222/devtools/page/A12A4B08-E5AF-4A84-A86A-A1C86E731D7F",
    faviconUrl: "http://www.baidu.com/favicon.ico",
    id: "A12A4B08-E5AF-4A84-A86A-A1C86E731D7F",
    thumbnailUrl: "/thumb/A12A4B08-E5AF-4A84-A86A-A1C86E731D7F",
    title: "百度一下,你就知道",
    type: "page",
    url: "http://www.baidu.com/",
    webSocketDebuggerUrl: "ws://localhost:9222/devtools/page/A12A4B08-E5AF-4A84-A86A-A1C86E731D7F"
}

websocket server 端地址:

webSocketDebuggerUrl: "ws://localhost:9222/devtools/page/A12A4B08-E5AF-4A84-A86A-A1C86E731D7F"

建立连接

在任意地址栏中输入 http://localhost:9222 + devtoolsFrontendUrl值即可(等同于在当前页面直接打开 DevTools):

http://localhost:9222/devtools/devtools.html?ws=localhost:9222/devtools/page/A12A4B08-E5AF-4A84-A86A-A1C86E731D7F"

或直接使用 WebSocket 连接,使用 webSocketDebuggerUrl 值连接:

var ws = new WebSocket('ws://localhost:9222/devtools/page/A12A4B08-E5AF-4A84-A86A-A1C86E731D7F"');

注意:每次只能进行一次 WebSocket 连接,之后的连接都会失败

调用 Command

WebSocket 通道建立完成之后,通过如下方式进行调用:

打开指定页面,并进行事件监听(以 Page.loadEventFired 为例):

ws.onmessage = function(event) {
    console.log(event.data);
};
ws.send('{"id": 1, "method": "Page.navigate", "params": {"url": "http://www.baidu.com"}}')

获取到的 loadEventFired 事件数据如下:

{"method": "Page.loadEventFired", "params": {"timestamp": 1402317772.874949}}

更多连接方式

nodejs ws

非常轻量级的 WebSocket 库,支持 client 端和 server 端,使用方式基本同 HTML5 的标准 WebSocket 库

client 示例:

var WebSocket = require('ws');
var ws = new WebSocket('ws://www.host.com/path');
ws.on('open', function() {
    ws.send('something');
});
ws.on('message', function(data, flags) {
    // flags.binary will be set if a binary data is received
    // flags.masked will be set if the data was masked
});

server 示例:

var WebSocketServer = require('ws').Server
      , wss = new WebSocketServer({port: 8080});
    wss.on('connection', function(ws) {
        ws.on('message', function(message) {
            console.log('received: %s', message);
        });
        ws.send('something');
    });

请移步: 官方 ws 库

nodejs chrome-remote-interface

一个实现了 remote debugging protocol 的 nodejs 库,其中 WebSocket 使用的是 ws 库,使用方便,推荐使用

示例代码:

var Chrome = require('chrome-remote-interface');
Chrome(function (chrome) {
    with (chrome) {
        on('Page.loadEventFired', function(time) {
            send('Runtime.evaluate',{'expression': 'chrome.loadTimes()', returnByValue: true}, function(err, result) {
                //console.log(err, result );
            });
        });
        Page.enable();
        Page.navigate({'url': 'http://www.baidu.com'});
    }
});

请移步: 官方 chrome-remote-interface

nodejs socket.io

功能强大,支持集成 WebSocket 服务器端和 Express3 框架与一身,使用简单,有兴趣者请移步: 官方 socket.io

WebSocket

协议

它是 HTML5 一种新的协议,实现了浏览器与服务器全双工通信,只需要一个握手动作,浏览器和服务器之间就形成了一个快速通道,然后进行数据互传。

优点:

1、交互时的 header 只有约 2Bytes
2、服务端可以主动推送数据给客户端

header 格式(握手时):

request:

Cache-Control:no-cache
Connection:Upgrade
Host:localhost:9222
Origin:http://family.baidu.com
Pragma:no-cache
Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits, x-webkit-deflate-frame
Sec-WebSocket-Key:TKSQVug6zSIH4uzIyTYBcg==
Sec-WebSocket-Version:13
Upgrade:websocket
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1914.0 Safari/537.36

response:

Connection:Upgrade
Sec-WebSocket-Accept:HyjfMUpyYgWgkYLn/vDDf6rZLuk=
Upgrade:WebSocket

header 格式(交互时):

request:

User-Agent: Fiddler
Content-Type: application/json; charset=utf-8
Host: fakewebsocket
Content-Length: 211

response:

FiddlerTemplate: True
Date: Fri, 25 Jan 2013 16:49:29 GMT
Content-Length: 51

查看 WebSocket 连接

DevTools

直接使用 DevTools,在控制台建立 WebSocket 连接并交互,在 Network 面板中直接显示

fiddler

fiddler

自定义 fiddler 的规则,根据 WebSocket 特征提取信息并伪造 WebSocket 结构数据

因为伪造时,host 为 fakewebsocket,无法识别,所以通过 AutoResponder 伪造 respose 数据

请移步: Debug / Inspect WebSocket traffic with Fiddler

更多参考

软件开发人员的最佳实践

$
0
0


        最近在一个网站上看到一篇写关于软件开发人员应该有的几项实践,感觉写的非常的好。下面将列举下文章中提到的几个方面。

        首先文章中提出,软件开发人员需要不断的练习,什么是练习,为什么要练习,练习意味着什么?文章中给出了很好的解读。练习是一种习惯,练习是一个过程,练习并不意味着记住,练习需要不断的实践,练习需要专心致志的付出。射击运动员需要不断的练习才能射中更多的分数,开车也需要不断的练习才能成为driver,写字需要不断的练习才能写出好的字,然后才有可能成为书法家。

Shooting, Driving, Writing


 

Best Practice 1- Keep Reading Existing Software SourceCode

       大家会经常读好的开源软件的代码吗?也许会被认为是一件很枯燥的事情。小说家之所以成为小说家,是经过阅读成千上百优秀的小说才成为小说家,所以要写出优秀的代码也需要阅读成千上万行的代码。


Best Practice 2 - Complete your documents before next step

       在开发大型的软件中,分析文档非常重要,只有把要分析的东西都弄清楚了,才能进行下一步的开发。在开发之前,我们需要问自己下面这几个问题:

  • 1.软件的需求描述在哪里?
  • 2.软件设计文档在哪里?
  • 3.是否对所有的假设和限制条件描述清楚了?
  • 4.你是否评审完所有的文档?

如果你对上面的问题回答都是肯定的,你可以进行下一步的操作,Coding,许多公司都有一套完整的开发流程来保证各个环节的正确实施。



 

Best Practice 3 - Follow the defined standards, don'tcreate it

在软件开发过程中,需要遵循已有的标准,不要随便地创造自己的风格。在这点上,许多公司有自己的编程标准,这些标准可能是业界公认的,也有可能是前面开发人员经过好多年总结的比较好的实践。有一句话说的很好,追随前人的脚印,往往可以少走一些弯路。这些标准可能包括下面的几种:

文件命名规范,函数和模块命名规范,变量命名规范,可读性及其安全性规范等。

干净、整齐一致、漂亮是源代码可读性和可理解非常重要的特征,我们要记住一句话:Source code is your baby.


Best Practice 4 - Code should be written to be reviewed.

         可读性往往是源程序好坏最直观的体现。在我们写代码的时候,我们要时刻记住自己写的代码总会有人来评审,将面临的各种缺陷,比如:不好的编码风格,没有遵循标准,函数定义和注释不规范,可读性差,打开的文件没有关闭,分配的内存没有释放,太多的全局变量,太多的硬编码,太多重复代码等。在编码的时候要时刻记住上面的问题,当自己完成编码时,至少自己需要检查一遍,这往往能减少90%的错误。


        我非常喜欢一句话:Accept criticism but don't criticize!当自己写的代码比较烂的时候,我们要接受同行评审中指出的问题,别人给自己指出来并不意味着批评,而是更好的改进自己,再后面少犯错误。其实Review也是开发过程中一个至关重要的环节。作为一个开发者,也需要站在测试者的角度去看待问题,这样就可以减少错误的发生。


Best Practice 5 - Testing to be followed like a religion.

        每次写完代码都需要测试,不管是有经验的开发者还是新手,每修改一处代码需要经过测试验证。我们必须做到:

  • 时间再紧急对于测试也不要妥协
  • 修改一行注释得测试
  • 修改一个变量名得测试。
  • 如果你觉得没有必要,那是非常危险的。

Best Practice 6 - Keep your Code and Documents Safely.

  这点主要是防止代码和文档丢失,需要我们养成每天备份文档的习惯。也许大家都觉得比较繁琐,建议可以使用日期、时间、版本号来备份。

Best Practice 7 - Keep your Tools & Techniques Handy

  俗话说的好,工欲善其事,必先利其器。同样对于开发人员来说,好的工具和技巧能提高我们的效率还能减少出错的几率。比如:

  •        1.用一个好的编辑工具来编写和修改代码
  •        2.用一个好的调试器来调试代码
  •        3.用一个内存监视器来动态分配的内存
  •        4.用WinSCP or FileZilla 来传输文件。

         

 

Best Practice 8 -Leave the ego behind, Be eager to learn.

  这一点我觉得也比较重要,我们经常从书本和网上获取知识,但是对于IT,没有任何一个人能掌握任何一个领域的所有的知识,每天我们将面临着各种各样的问题。为了让自己不落后需要经常去学习。

New technologies are coming everyday


 

也许成功的道路上没有捷径,需要百倍的努力才有可能成功。今天你付出了一点,也就离成功的道路近一点。



作者:xiaoding133 发表于2014-6-27 21:06:45 原文链接
阅读:101 评论:0 查看评论

怎样实现Java远程访问Domino数据库

$
0
0

Java远程访问Domino数据库推荐采用CORBA实现,但配置非常关键,笔者在工作中也遇到了这个问题,在查阅资料的过程中发现,很多文章明显存在一些误区或者说没有写清楚的地方,现将笔者的实践经验总结出来,和大家分享。Domino服务器版本是5.0.9。

  基本步骤:

  1.修改Domino服务器安全性配置,允许你的用户运行Java/CORBA。具体操作是: 打开Lotus Domino Administrator,进入配置,打开当前服务器文档,选择“安全性”选项卡,在右下角“Java/COM 谁可以-”栏中,分别在“运行有限制的Java/Javascript/COM”和“运行无限制的Java/Javascript/COM”两项中填上你的连接用户名或用户所在组。

  2.给你的用户加上Internet地址和口令。如果你的用户没有Internet地址和口令,那么只有Domino的管理用户才可以连接,其他普通用户是连不上的,而且也没有具体的提示。笔者曾在这个地方浪费了一天的时间。

  注册个人时,点击高级选项,填写Internet网络域(Internet地址会自动生成,如myname@workgroup),同时选中“设置Internet口令”,以后将用这个Internet口令来建立会话。如果是已经注册的用户,则可以通过编辑注册信息来修改。

  3.打开notes.ini文件,确认加载了DIIOP服务。检查notes.ini文件中的类似这样一行:

  ServerTasks=Update,Replica,Router,AMgr, AdminP,CalConn,Sched,DIIOP,HTTP,LDAP

  4.还有其他配置,如用户对Server的访问权限、DIIOP端口设置等,这些启用Domino服务器的缺省配置即可。配置完了需要重启Domino服务器。

  5.将Domino服务器主目录下的data/domino/Java/NSCO. jar文件拷入Java工作环境,并在工程的构建路径中加入,或者在classpath环境变量中加入。

  6.将Domino服务器主目录下的data/domino/html/diiop_ior.txt(CORBA访问的识别信息)拷入你的Java工作环境,或者开放Domino服务器的HTTP服务。

  7.现在可以编写连接程序进行测试了:

  import lotus.domino.*; import Java.io.*; class Test { public static void main(String args[]) { Session session; String ior; String dominoURL="11.68.81.27"; //DOMINO服务器的IP地址 String username="username"; //用户ID String password="password"; //用户的internet口令 try { //如果已将ior文件拷到本地,则直接读ior文件 try { BufferedReader iorin= new BufferedReader(new FileReader("diiop_ior.txt")); ior=iorin.readLine(); iorin.close(); } catch (IOException e) { ior=null; } //如果读不到diiop_ior.txt文件,则需要通过网络从服务器下载这个文件 //这需要domino服务器开放http服务 if(ior==null) ior =NotesFactory.getIOR(dominoURL);//下载IOR session = NotesFactory.createSessionWithIOR(ior,username,password); System.out.println(session); //如果这一行打印出来了,表示连接成功 } catch (NotesException ex) { System.out.println(ex.getClass().getName()+":"+ex.id); } }}

  需要注意的是:

  1.必须开放Domino服务器的HTTP服务。

  甚至连Lotus domino designer的帮助文档都是这么说,其实不然,如果你直接将DIIOP_IOR.txt文件从Domino服务器拷贝过来了,HTTP服务就不必要启动。启动HTTP服务的惟一目的就是下载这个文件。

  2.必须要在Domino服务器配置中允许 HTTP 客户浏览数据库。

  这个是完全不必要的,上面已经讲了,开放HTTP服务仅仅是下载diiop_ior.txt文件,并不需要浏览数据库。

  3.有些文章称,确保设计者的机器上Notes.ini文件中含有以下行: ALLOW_NOTES_PACKAGE_APPLETS=1。其实,这个是不必要的。

  4. 有些文章提到要根据IDL文件创建自己的CORBA库,这样也没必要。对于远程访问,只需将data/domino/Java/NSCO.jar拷贝过去; 对于本地访问,只需将Domino目录下的notes.jar文件加到classpath中即可。

www.hahagaoxiao.com下沙转贴

本文转自 http://soft.chinabyte.com/database/80/12998080.shtml

 



已有 0人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐




WebView中的视频播放

$
0
0

activity_main.xml如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF"
    android:orientation="vertical" ><WebView
        android:id="@+id/videoWebView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:focusable="true"
        android:focusableInTouchMode="true" /></LinearLayout>

 

实现代码:

public class MainActivity extends Activity {

	private WebView videoWebView;
	private String videoUrl = "视频地址.mp4";
	private String imgUrl = "视频封面图片地址.png";
	private String html = "<html>视频如下:<br/><a href='" + videoUrl
			+ "' width='650' height='450' frameborder='0'><img src='" + imgUrl
			+ "' /></a></html>";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_main);

		videoWebView = (WebView) findViewById(R.id.videoWebView);

		WebSettings setting = videoWebView.getSettings();
		setting.setJavaScriptEnabled(true);
		setting.setDomStorageEnabled(true);
		setting.setDatabaseEnabled(true);
		setting.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
		setting.setDefaultTextEncodingName("UTF-8");

		videoWebView.setWebChromeClient(new WebChromeClient());
		videoWebView.setWebViewClient(new MyWebViewClient());
		videoWebView.loadData(html, "text/html;charset=UTF-8", "UTF-8");
	}

	public class MyWebViewClient extends WebViewClient {
		@Override
		public boolean shouldOverrideUrlLoading(WebView view, String url) {
			if (url.endsWith(".mp4")) {
				Intent intent = new Intent(Intent.ACTION_VIEW);
				intent.setDataAndType(Uri.parse(url), "video/*");
				view.getContext().startActivity(intent);

				return true;
			} else {
				return super.shouldOverrideUrlLoading(view, url);
			}
		}
	}
}

 





已有 0人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



美国的银行如何解决网络盗刷案件,有怎样的流程,哪些机构参与其中?

$
0
0
妈蛋,早上7点了还睡不着。。真该去回答下那个失眠的问题了。。爬起来继续码字~

本人在美国有过两次网上帐户被盗用的经历,再加上最近正在弄电子商务网站,从消费者和商户两头都刚好可以讨论下。声明本人不是在金融相关行业或银行业工作,只是个混在美国想创业的现大龄失业女青年一枚。答案仅限于本人目前经历,如有不专业的地方还请专业人士打脸~

把结论放前面吧。没耐心看的人 可以pass 掉后面流程和细节,留下辛苦写了几个小时的我独自在角落里画圈圈也是没有关系的呢~(酸)

---------------混歌先----------------------
涉及到的机构:
1.Merchant service 服务商:提供支持信用卡支付的全套解决方案,一般都会有保险支持。
2.Payment Gateway:提供支付通道
3.Merchant service 服务关联银行:客户的付款先进这个银行,再从该银行支付到商户账户。通常由服务商指定。有风控会检查可疑交易。
以上三者有时候可以是一体的,比如一些银行就可以全部充当以上三种角色。
4.信用卡发卡组织:Visa,Master,AMEX 等,他们会负责部分安全认证的工作,比如 AVS。
5.PCI Compliance 安全认证提供商:负责根据Payment Card Industry 设立的一系列Data Security Standard 对商户的网络安全环境进行认证,提供网络安全保险。
6.电子商务网站平台/电子商务解决方案提供商:有的电子商务解决方案提供商可以充当1,2的角色,但申请要求比较高,比如必须是美国公民或只支持境内卡等。
7.SSL Certificates认证提供商:对购物平台的数据传输提供经过认证的加密。有的电子商务解决方案提供商也会提供该项服务,灰常贴心,费用也不少收。。

写了这么多,总结下:
1. 可以确定的是,如果发生盗刷,绝对不止涉及银行和客户两方面。以上列出的所有机构都要举证说明自己无过错。任何一方无法证明自己无过错,都要承担相应责任。当然可以肯定的是最后赔付的肯定都是各机构的保险公司。
2.如果无法证明客户是恶意撤单,基本不会要客户举证并承担相应责任。举证的主要方还是在商户。因为是商户要求增加信用卡支付功能以提高自己的竞争力,进而提高销售额,则必然要承担更多责任。
3.本着客户是上帝的原则,商户和银行会在各个环节加强安全保障,而不是增加客户的负担。
4.当然,能这样客观处理主要还是基于美国有一套成熟的信用体系和保险机制。

---------------继续混歌----------------------
先从商户如何能支持信用卡支付说起吧。
1.首先,美国的公司(不论是否是电子商务的),只要想支持credit card/debit card 支付,都要找merchant service provider开merchant account, 中文不知怎么译。merchant service的提供商可以是银行,也可以是其他有资质的专业金融服务商。这样的金融服务商非常多,但走的支付通道(payment gateway)就是有限的几十家。具体他们之间的关系就只有专业人士来细说了。举个栗子, 我现在的merchant service 服务商,就称他为N吧,他们的payment gateway走的就是usaepay,而服务银行是Wells Fargo, 而实际上Wells Fargo自己也提供merchant service,他们之间的关系我现在还有点脑乱。。

2. 找到了Merchant service 服务商,完成一堆问卷调查和电话调查,填个申请表,等服务商风险部门审批。一般的服务商那里,只要你是正规在美国注册的公司且无不良信用记录,不管规模大小或成立时间长短,基本都能通过,但服务费用略高。大的服务商或银行审批门槛高些,但付合条件的商户可以得到优惠得多的服务费折扣。

3.说说服务费。不同商户服务费报价相差会很远,这里面猫腻很多。几大国际信用卡组织(visa,master和AMEX等)收的费用大概在2%-3%,不同的卡略有区别,这部分基本有详细的收费标准,可在各组织网上查到,这部分是照实收。服务商收的费用就五花八门了,固定费用如月费,报告费,单笔手续费和认证费等等,此外再收刷卡金额的0.3%-3%作为手续费,英文叫Discounted Rate. 对,这个区间就是这么大,这其中对应的就是不同风险级别的支付行为。最安全的行为是客户持美国境内的卡,在POS机上(通常是由服务商提供的 POS 机)由本人持卡刷(看签单),这种行为安全级别最高,收的费用最低,大概0.3-0.5%,需实物终端机支持。接下来比如是电子商务,由客户自己在网络终端输入卡信息,服务商收的费用要比上面那种多百分之零点几。最次的情况是由商户通过其它途径获取客户卡信息(email,电话等),由商户自己在payment gateway 提供的虚拟终端上手动输入卡信息,这样的行为风险最高,收的费用大概在1.5%。如果客户的卡是境外卡,费用再加收0.5%左右。这样算下来(加上卡组织收的费用)最安全的支付行为只用收2.5%左右,而最不安全的支付行为商户要支付将近5%的费用。

顺便吐个槽,美帝人民很不厚道,报价时虽然不会骗人,但费用各种隐瞒,要细问才挤牙膏样告诉你还有什么什么什么,等你反应过来坑都挖好了~要细说的话就是个和米国奸商斗智斗勇的感人事迹~

4. 再说说服务商收的其他费用。以上说的Discounted Rate』是和支付行为的安全程度挂钩的,其实就有保险的意味在里面。另外,有的服务商还会按月收『Breach Protection Fee』(每个月10美元左右)以及按年收『PCI Compliance Fee』(每年120美元左右,各家收费标准不同)。这两个费用都是和 PCI 相关的。PCI Compliance 就是由 Payment Card Industry 设立的一系列Data Security Standard ,如果商户通过了PCI Compliance 认证,则服务商可免收『PCI Compliance Fee』。但 PCI Compliance 认证是由专业的PCI 相关安全服务公司提供的,他们的年费也要收110美元左右。。。。(各家收费依然不同)。 PCI 安全服务提供商根据 PCI DSS 设立一系列标准问卷,并根据商户的反馈把商户分成1-4个层级,针对不同层级的商户设立不同的安全标准。比如网络支付的话,他们会定期扫描商户常用 IP 并对该 IP 地址的安全性进行评估,如果评估通过了证明网络安全有保障,这个『PCI Compliance Fee』服务商才能免收。最重要的是,PCI 安全服务提供商提供保险!一般保额都是10万美元。就是说如果商户通过了他们的PCI Compliance 认证,但还是被黑客通过网络盗取了最终用户的信用卡信息,由此造成的损失商户可以得到相应赔偿。

值得一提的是,『PCI Compliance Fee』不是每个服务商都会列在收费明细里,这个是猫腻之一。。据我观察,凡是不收月服务费的服务商,前期报价里即使没有这个费用,最后的合同里不起眼的地方也会加上这个费用,或者干脆等到要收的时候再告诉你,谁让你自己不去做PCI Compliance认证的。。一般收月费的服务商都不会再单收这个费用,已经包含在月费里了,但都要仔细问啊亲们~

5. 再来说说电子商务网站。不管是自己架站,还是找在线的电子商务解决方案提供商(如 Shopify 或 Volusion 等),如果要想实现客户在线提交订单的时候实时扣款,都需要网站后台和Merchant Service 服务商提供的 payment gateway 直接挂钩,客户的信用卡信息直接提交到 payment gateway, 商户不储存客户卡片信息,也无法看到详细的客户的信用卡信息。这种情况安全级别也相对较高。另外一种情况不是实时扣款的,一般客户提交的信用卡信息都在商户处,商户按批提交到Merchant Service 服务商的终端(最弱的情况是手工输入。。),这种情况安全性要相对差一些。不管怎么,客户的信用卡信息一旦要通过网络传输,该网站就最好要有 SSL Certificates(有的电子商务解决方案提供商是强制要求的)。 这里又来了一个SSL Certificates的认证提供商。。。有名的SSL 提供商包括Symantec,Comodo等,主要是将网络传输的数据进行加密。如果自己架站也可以自己做 SSL,但如果不是 Certificated SSL 的话,操作系统就会跳出『该网站不靠谱,你是否信任这个网站』之类的信息,谨慎的老美用户很多情况下就会选择放弃了。这个认证的费用从几美元一年到几百美元一年不等。。。

6. 如果客户是邮件订货或电话订货呢? 通常情况下是商户通过 Email 或电话获得客户信用卡信息后,通过payment gateway 的虚拟终端『Virtual Terminal』手工输入客户的信用卡信息并提交。必填的信息是卡号,用户名,有效期,卡背面的 CVV 码可以勾选『允许不匹配』,账单地址可空,其他选填的订单信息包括客户代码,订单号,发票号,PO 号和订单备注等等。原则上说只要有卡号,用户名,有效期就可以 charge 你的卡了,但如果 CVV 码勾选了"可以不匹配",这个支付行为就会被Merchant service 服务商的风评部门高度怀疑,可能会被收取额外的手续费或拒收。账单地址可空是因为有的境外卡因为语言不通的原因通常会通不过 AVS 认证(Address Verification System),很多商户会选择留空。也可以设置必须AVS匹配,安全性更高,这样的网站一般不支持境外卡支付。 其他的订单信息虽然说不是必填的,但如果出现盗刷,而商户无法提供可追溯的订单信息,这个责任就是100%商户承担了。而且订单信息空白而金额异常的交易,一般也会被Merchant service 服务商的风评部门拒收。

————————还混————————————————————————————————
好了,现在进入正题。。。如果支付账户/信用卡被盗用了肿么办? 从客户和商户两方面来看:

A. 客户:
1.如果你在这笔款的刷卡商户处有帐号且有过购物记录,最好及时联系商户声明此单不是你下的,要求撤单。商家一般会有些标准问题询问,如基本可确定是盗刷,(刷卡地或送货地和用户常住地不一致等),商户会马上先给予返款并帮你重设账户和密码。然后就没你事儿了。

2.如果你不认识这个商户,则立即给发卡银行打电话说这笔款不是你刷的,要求撤销支付。银行会去进行调查,但举证的责任在商户,没你什么事儿。就是说刷卡商户必须能举证这个订单确实是你下的。最后款肯定会退还,具体多久能退没有概念,没具体经历过这种情况,但肯定不会拖很久,因为一般Merchant service 服务商都会先行赔付,并把这笔款直接从商户的账户里划走,并多收一笔charge back fee。
我当时是 paypal 账户被盗用过一次,在 ebay 上刷了一个 iphone4s。我给paypal 打电话后确认了我常用收货地址不是俄罗斯,我本人也不在俄罗斯以后,他们马上就给我refund 了,并 reset 了我的账户密码。另外一次是 walmart 的 online账户,也是刷了一个iphone。。好在还没发货,walmart 马上取消了订单并冻结了我的账户。
当然如果订单确实是客户下的,并且属于恶意撤单,即商户能举证自己无过错,并提供客户已确认订单的信息,应该是可以起诉客户如实付款的,就看金额值不值得折腾了。

B. 商户。
1. 首先不管因为什么原因,客户一旦申请了撤消付款,商户就会被多收一笔charge back fee,通常是25美元。一旦有客户反馈订单问题,不光是信用卡盗刷,甚至收到的包裹缺件啊破损啊货不对板啊什么的,该退退该换换,商户都会积极解决,否则客户可以以各种『商户提供的产品/服务与说明不符』等原因申请银行撤消付款。25美元的charge back fee是小事儿,影响商户信用度,以后很难申请Merchant service 服务了。

2.如果接到客户报告说订单不是自己下的,商户核对客户信息,对比以往订单记录以后如果能确认是盗刷,该退款就会马上 refund。商户自己主动 renfund 是不会被收charge back fee的,也不会影响商户信用。此时商户应当怀疑自己网络安全出问题,应及时采取相应措施并通知PCI Compliance 安全认证提供商 如果有经济损失,且证实确实是网络漏洞造成,可以向PCI Compliance 安全认证提供商申请赔付,因为他们没有查出来你有漏洞~

3. 如果银行直接通知商户说客户要求撤消付款,charge back fee是肯定要被收的。如果已经造成了损失,且商户想要回款项,商户就必须要举证说明订单确实是客户下的,并且证实自己是PCI Compliance 认证过的,且网站有 SSL 认证,即商户自己无安全方面的过错。这种情况目前我还没遇到过,不确定是由银行还是Merchant service 服务商承担责任,有明白人可指点下。但商户只要能举证自己无责,也是可以申请要回这笔款或保险赔偿的。至于银行或者Merchant service 服务商,不管谁承担责任,可以想象的是他们必然都有保险公司在后面进行赔付。大金额的肯定也会报警追查骗子的信息并记录在案。一般Merchant service 服务商都有一个骗子库『Fraud list』,并会教商户大概什么样的订单有是骗子的可疑,商户可随时查这个『Fraud list』。

4.如果遇上骗子客户,盗用别人信用卡信息后网上下单,卡主等到商户发货后才申请撤款,他就能白收货物之类的。这种情况目前我也还没遇到过,但同样商户只要能举证自己无责,也是可以申请要回这笔款的,不确定是由银行还是Merchant service 服务商承担责任。

5.如果商户本身是骗子,或者信用卡套现的,如果短期追究不到商户,发生的损失应该是Merchant service 服务商承担,因为他们负责审核商户的资质。

以上是我所知所有内容了。。欢迎专业人士指点~

— 完 —
本文作者: Pony Pan

【知乎日报】 你都看到这啦,快来点我嘛 Σ(▼□▼メ)

此问题还有 1 个回答,查看全部。
延伸阅读:
在国内,信用卡被盗刷后通知银行,银行接下来具体会怎么处理?
信用卡被盗刷了怎么办?

联通电信获FDD 4G试验网牌照,看点有哪些?

$
0
0

工信部今天下午宣布,批准中国电信、中国联通分别在16个城市开展LTE混合组网试验。意味着中国电信和中国联通期待已久的FDD-LTE试验网牌照已经发放,我国三大运营商已进入FDD与TDD等、的4G竞争时代。

http://static.cnbetacdn.com/newsimg/2014/0627/25_1jHkQIGHN.jpg

FDD 4G试验网城市范围

中国联通随后宣布,已在上海、广州、深圳、重庆、郑州、武汉、成都、西安、长沙、济南、杭州、沈阳、哈尔滨、福州、南京、石家庄等16个城市开展TD-LTE/LTE FDD混合组网试验。

中国电信也获得了16个城市的TD-LTE/LTE FDD混合组网试验许可,包括上海、西安、成都、杭州、武汉、南京、济南、合肥、石家庄、海口、郑州、重庆、深圳、南昌、南宁、兰州。

从对比可以看出,联通与电信FDD 4G试验网城市中都没有包含北京,但同时都有上海。一线城市中联通有广州,电信则有深圳,其他二线城市布局大体相当。

为何此时发放?

2013年12月4日,工信部正式向三大运营商发布TD-LTE牌照。这是一个令中国移动欢呼雀跃、中国联通尴尬、中国电信苦笑的局面。

经过半年时间TD-LTE发展,国内运营商竞争状况发生明显变化。中国移动4G用户增长超过1000万户,网络覆盖超过200个城市。原来3G时代占优的中国电信和中国联通陷入颓势:中国联通4月份3G用户仅增89.5万户,创造了近5年来最低增幅。而中国电信则直接出现3G用户大幅缩水,今年5月份流失3G用户95万,今年上半年累计流失超过400万用户,已减少至1亿(实际1.04亿)的规模“红线”,这让监管部门受到各方的巨大压力。

工信部也随后表示,今年以来,我国TD-LTE网络建设和产业发展已取得初步成效。近日,中国电信、中国联通分别递交了关于开展TD-LTE/LTE FDD混合组网试验的申请及相关补充材料。为适应LTE融合发展的趋势,促进资源合理利用,我部依据相关法定程序,批准中国电信、中国联通分别在16个城市开展LTE混合组网试验。

工信部称,今年以来,我国TD-LTE网络建设和产业发展已取得初步成效。近日,中国电信集团公司、中国联合网络通信集团有限公司分别向我部递交了关于开展TD-LTE/LTE FDD混合组网试验的申请及相关补充材料。为适应LTE融合发展的趋势,促进资源合理利用,我部依据相关法定程序,批准中国电信集团公司、中国联合网络通信集团有限公司分别在16个城市开展LTE混合组网试验。

为何要强调LTE混合组网试验?

TD-LTE 4G标准由中国企业所推动,可加强中国企业在全球通信行业但话语权,并降低专利支付费用。因此主管部门一直强调中国联通与中国电信必须坚持FDD与TDD混合组网。不过,由于国际上还没有成熟的CDMA运营商向TD-LTE规模升级的先例,这将给中国电信的4G终端布局带来很大考验。

工信部也强调称:“TD-LTE和LTE FDD都是新一代移动通信的国际标准,TD-LTE和LTE FDD相互融合并共同发展已成为未来全球移动通信产业的趋势,目前全球已有13个TD-LTE/LTE FDD融合网络。根据国际电信联盟(ITU)建议,我国同全球各国一样,也分别规划了TDD和FDD频率,可同时满足我国TDD和FDD制式移动通信系统的发展需求。未来,为充分利用频率资源,方便用户在国内国外都能很好使用移动通信业务,我国需统筹发展TD-LTE和LTE FDD。

何时正式发放FDD全国商用牌照?

工信部今天发放的实际上是16个城市的FDD试商用牌照,其他大多数城市目前依然不能使用FDD 4G网络。业内预计,工信部最快将于今年10月前后,最迟到12月(TD-LTE发牌一周年时间点)发放FDD正式商用牌照。

工信部今天称:目前,我部已根据企业申请,依据相关法定程序,批准相关企业开展LTE混合组网试验,系统验证LTE FDD和TD-LTE混合组网的发展模式。未来,条件成熟后,我部也将依据相关企业申请,发放LTE FDD牌照,推动融合发展,促进资源有效利用。

LTE混合组网试验内容有哪些?

工信部称:一是通过试验逐步解决混合组网模式下各制式网络互操作等技术难题,积极引导产业链发展演进。二是通过试验促进LTE芯片和终端产业发展,切实满足用户使用需求。三是通过试验验证多网络覆盖环境下的网络资源调度策略,探索未来商用运营经验。四是通过试验促进业务应用创新,带动运营支撑系统等配套环节的演进发展。

电信联通同时建设TDD与FDD,是否浪费投资?

实际上,中国电信与中国联通更希望获得FDD牌照,这在两家运营商高层之前多次公开讲话中已有明确信息。不过,在监管部门强调下,两家运营商都部署了一定量级的TDD网络,并计划未来作为热点地区的高速数据流量补充。

工信部对此表示称:一是根据企业试验方案,试验将采取融合组网模式,LTE FDD与TD-LTE共用一张核心网,可以有效避免重复投资。二是融合组网试验中,各企业将根据各区域实际情况,结合不同技术的特点,按照业务量增长情况合理设计和使用FDD和TDD接入资源,按需建设LTE基站,并不会造成资源浪费。三是我部将进一步推动运营企业开展共建共享的相关工作,鼓励和引导企业通过租建结合的方式组建LTE网络,避免重复建设和资源浪费。

实际影响有哪些?

对于中国电信来说,由于之前一直未获得FDD牌照,芯片、终端、网络等产业链各方都处于不明确状态。这也是其今年上半年3G终端青黄不接、用户缩水都重要愿意。随着FDD试验网牌照发放,中国电信一系列都产业链政策都将明确,对国内4G产业链来说都是一件好事。

对于中国联通来讲,其年内网络主要还是以3G网络升级为主,因此实际影响并没有中国电信明显。而对中国移动来说,在其两家竞争对手都获得FDD牌照之后,国内4G之争将正式上演,留给中国移动4G补足的时间点越来越紧迫了。

当前一种先进实用的架构设计

$
0
0

目录

1系统架构图...2

2架构设计...3

2.1项目开发环境...3

2.2运行环境要求:...3

2.3 服务器架构平台:...4

2.4.架构逻辑设计...5

2.4.1 LVS+KEEPLIVED+SQUID+HAPROXY+JBOSS集群...5

2.4.2mysql集群...6

2.4.3fastdfs图片服务器集群...8

3 架构剖析...8

3.1负载均衡器解析...8

3.2 lvs解析...9

3.3keeplived解析...10

3.4 haproxy解析...10

3.5mysql解析...11

3.6couchbase解析。...12

3.7 squid解析...13

3.8 lucene解析...13

3.9Nagios解析...13

 

当前一种先进实用的架构设计

                  李万鸿

对用JAVA开发的项目来说,根据“成熟稳定、先进科学、实用可靠“的原则,可以使用这样一种架构,采用多个集群来保证系统的高性能、高可靠性、伸缩性、可维护性和安全的需要,服务器可以线性扩展,使用开源免费软件和廉价服务器,提供极高的性价比。

1系统架构图

2架构设计

2.1项目开发环境

1.       开发语言、工具:JAVA 、eclipse。

2.       技术架构采用STRUTS2+SPRING3+HIBERNATE3。

3.       采用自动测试工具进行严格测试,保证代码质量,如:QTP、ROBERT、LOADRUNNER等。

4.       软件环境:maven、SVN(git)、jetty,JDK6。

5.       硬件环境:cpu:P3 2.8GHZ以上 Memory:3G以上。

2.2运行环境要求:

硬件环境:

服务器端: 推荐配置为16G内存以上,CPU为2.8GHZ以上配置,硬盘容量为500G以上的服务器。

通信网络: 网络协议为HTTP、TCP/IP。

软件环境:

服务器端:

Ø   数据库服务器:mysql5.6。

Ø   Web服务器:jboss7

Ø   服务器采用华硕服务器。

Ø   服务器操作系统: linuxcentos6.5.

Ø   浏览器:Internet Explore8.0或以上版本、360浏览器6及以上版本。

Ø   NAS存储,42T,RAID5,用于存储数据。

屏幕分辨率推荐为:1024*768或以上。

 

2.3服务器架构平台:

1)    Lvs+keepalived-1.2.8 ,2台集群做互联网访问的入口。

2)    Squid3.3用2台集群进行页面缓存。

3)    HAPROXY1.4+keepalived-1.2.8用3台集群进行WEB服务器负载均衡和动静分离。

4)    jboss服务器进行3台集群,每台硬盘500G。

5)    mysql数据库用haproxy进行4台主从集群和负载均衡。

6)    用2台couchbase2集群进行数据缓存。

7)    用2台fastdfs3集群存储图片。

8)    用1台Lucene4.7搜索服务器。

9)    采用nagios3.5监控服务器,发生异常时可发邮件和短信。

这个架构先进实用,可以支持7X24每分钟数万至数十万的访问量。

2.4.架构逻辑设计

2.4.1 LVS+KEEPLIVED+SQUID+HAPROXY+JBOSS集群

用LVS+KEEPLIVED双机通过一个VIP(vitual  IP)对对个squid缓存服务器进行负载均衡,Squid缓存服务器通过haproxy为jboss服务器进行缓存,haproxy+keeplived双机对jboss服务器集群进行负载均衡调度。

  2.4.2mysql集群

MySQL支持双主的设置,即两个MySQL节点互为主备,不过虽然理论上,双主只要数据不冲突就可以工作的很好,但实际情况中还是很容发生数据冲突的,比如在同步完成之前,双方都修改同一条记录。因此在实际中,最好不要让两边同时修改。即逻辑上仍按照主从的方式工作。但双主的设置仍然是有意义的,因为这样做之后,切换主备会变的很简单。因为在出现故障后,如果之前配置了双主,则直接切换主备会很容易。

  双主在设置时,只需将上面的一段设置复制一份,分别写入两个MySQL节点的配置文件,但要修改相应的server-id,auto-increment-offset和master-host。auto-increment-offset就是为了让双主同时在一张表中进行添加操作时不会出现id冲突,所以在两个节点上auto-increment-offset设置为不同的值就好。 在两个节点上都为对方创建用户。

Mysql用2主多从,提供高性能服务,主数据库提供对数据库的写操作,从数据库进行读操作,实现了读写分离和数据库备份。从数据库可线性扩展。

  用haproxy+keeplived双机对slave数据库进行负载均衡,提供对数据库的读操作。

2.4.3fastdfs图片服务器集群

 Fastdfs集群保存图片等文件,可动态线性扩展。

 

3架构剖析

3.1负载均衡器解析

负载均衡器(调度器)是一种采用各种分配算法把网络请求分散到一个服务器集群中的可用服务器上去,通过管理进入的Web数据流量和增加有效的网络带宽,从而使网络访问者获得尽可能最佳的联网体验的硬件设备。

1、负载均衡器的工作层次:

1)工作于tcp/udp层实现底层协议的负载均衡,请求在内核中实现转发;

2)工作于应用层,支持特定的应用协议实现应用层的负载均衡,请求在用户空间中。

工作于tcp/udp层的性能要比工作于应用层的负载均衡器的好得多,若请求数量没超过应用层负载均衡器的容量,应使用应用层的负载均衡器,它能直接于前端更好的解决请求。

2、http/https协议层的负载均衡器

1)tcp/udp层:lvs, haproxy

2) 应用层:apache,nginx,haproxy,lighttpd,varnish, squid

3、mysql协议层的负载均衡器

1)tcp/udp层:lvs

2)应用层:haproxy,数据库专用连接池能实现读写分离。

3.2 lvs解析

LVS集群采用IP 负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的 虚拟服务器。整个 服务器集群的结构对客户是透明的,而且无需修改 客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。

3.3keeplived解析

Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。Layer3,4&7工作在IP/TCP协议栈的IP层,TCP层,及应用层。

3.4 haproxy解析

HAProxy提供高可用性、 负载均衡、动静分离以及基于TCP和HTTP应用的代 理,支持 虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的 并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

HAProxy实现了一种 事件驱动单一进程模型,此模型支持非常大的并发连接数。

3.5解析

MySQL被广泛地 应用Internet上的中小型网站中。由于其 体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站 数据库。MariaDB是mysql原开发团队的杰作,google公司已转为使用MariaDB。

Mysql成熟实用,稳定可靠,已在业界得到广泛的使用,mysql的性能比postgre优异,通过实际测试,可以看到mysql比postgre更强。

Mysql提供主从复制功能,主从服务器设置的稳健性得以提升,如果主服务器发生故障,可以把本来作为备份的从服务器提升为新的主服务器。在主从服务器上分开处理用户的请求,读的话,可以直接读取备机数据,可获得更短的响应时间。用从服务器做数据备份而不会占用主服务器的系统资源。采用haproxy对从数据库进行负载均衡,提供高性能的读操作。

实践证明,mysql-proxy,amoeba,master-master-manage、mysqlcluster的性能不稳定,不建议使用。

3.6couchbase解析。

Memcache基本上已经是开发的标配了,但是对于Memcache集群,很多线上部署仍然是很单薄的。

几个存在的问题:不健壮、数据不安全、配置变更可能导致存取异常、后备数据的一致性。鉴于存在以上问题,Memcache的开发团队开发了Membase,支持多台服务器集群,数据的切片和复制,有效的提高了服务稳定性和数据的安全性,并且支持数据的持久存储。代码的稳定性不够好,我曾经在部分线上业务上使用了Membase,后来因为几次莫名的存取操作缓慢,只能又撤销回到Memcache。之后,Membase团队与CouchDB团队合并,推出二合一的产品: Couchbase。

Couchbase的最大特点: 

1,完全继承Memcache,原生支持所有Memcache操作;

2,继承了Membase的特性,支持集群和数据持久化及线性扩展;

3,继承了CouchDB的文档性质,支持通过View对数据进行操作。这个View的特性,提供了以往memcache所不具备的便利性,但是同Mongodb相比又很简单原始,感觉不是一种普遍需求的功能。编程使用couchbase和使用memcached一样。

Couchbase比redis做缓存更好,redis一旦重启,速度非常慢,10G数据需要半个小时。

3.7 squid解析

Squid作为网页服务器的前置cache服务器,可以代理用户向web服务器请求数据并进行缓存,也可以用在局域网中,使局域网用户通过代理上网。Squid主要设计用于在Linux一类系统运行。

Squid是一个缓存internet数据的一个软件,可缓存html页面和图片等,它接收用户的下载申请,并自动处理所下载的数据。也就是说,当一个用户想要下载一个主页时,它向Squid发出一个申请,要Squid替它下载,然后Squid 连接所申请网站并请求该主页,接着把该主页传给用户同时保留一个备份,当别的用户申请同样的页面时,Squid把保存的备份立即传给用户,使用户觉得速度相当快。

3.8 lucene解析

Lucene是一套用于 全文检索搜寻的开源程式库,由 Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在 Java开发环境里Lucene是一个成熟的免费 开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。

3.9Nagios解析

Nagios是一款开源的免费网络监视工具,能有效监控Windows、Linux和Unix的 主机状态,交换机 路由器等网络设置,打印机等。在系统或服务状态异常时发出邮件或短信报警第一时间通知网站运维人员,在状态恢复后发出正常的邮件或短信通知。

总之,这是一个先进实用的架构,采用了haproxy、lvs、keeplived进行负载均衡,使用couchbase、squid进行缓存,使用mysql数据库主从方式,使用lucene搜索等技术,他们的配置要进行优化,提供了HA、HP的服务性能,值得采纳。

                          

     2014-06-28

作者:buddha17 发表于2014-6-28 9:43:41 原文链接
阅读:141 评论:0 查看评论

我不是高晓松娇妻,我是夕又米

$
0
0

萝卜网

想了好久,决定说说自己的事情。一年前的四月,晓松回到家,坐下来,平静地对我说,他想结束这段婚姻。理由是,和我在一起生活他感到不快乐,他想要更多的自由和创作空间。

三天后,晓松收拾好行李搬离了我们经营多年的家。一切猝不及防,我像从童话世界被忽然扔进倾盆大雨,浑身湿透。

坍塌的,并不仅仅是我和女儿多年被保护得很好的温室堡垒,还有我二十六年的信仰。出生在一个传统的家庭,我见证了父母幸福完整的婚姻。从小,他们对我谆谆教诲,“爱一个人就要爱他一辈子”,我以为,爱就是应该互相扶持的,婚姻就是应该白头偕老的。于是,当我遇见晓松,我充满热诚拼尽全力去爱。他教会我认识这个世界,为我打开很多扇窗户。对于未来,我曾有无数幻想,想一直陪伴他,想在他老得走不动时搀扶着他的胳膊,甚至想过,三十周年结婚纪念日,我们如何庆祝。

但我从未想过,玫瑰色的幻想会在一夜破碎。当他说出“分手”二字,我只是大脑空白傻呵呵地说“好的”。不是因为不在乎,而是因为我认为缘分强求不来。我并不知如何纠缠和挽留,也不擅长。或许,在残存的理性里,我还葆有最后一丝自尊。

接下来我开始避不见人。现在想起来,并不是因为惧怕别人的嘲笑和询问,而是因为,内心深处,我始终无法接受婚姻失败这件事。整整一个月,我严重失眠,面对食物毫无胃口,迅速瘦成了一把骨头。

面对世界不难,难的是如何面对最亲近的人。我在20岁时就做了母亲,一直觉得,自己还是个没长大的孩子。和女儿在一起,我总是嘻嘻哈哈,姐妹相称,疯玩疯闹,却从未真正考虑过生活的残酷。突如其来的打击让我不知所措。半夜里看着熟睡的女儿,我感到深深的恐惧和自责,我不知如何让她面对父母分开的事实,也不知这会给她的成长带来什么影响。

一个早上,送走女儿,我漫无目的把车停在路边发呆,看着路灯亮了又熄。忽然在后视镜里看见自己的脸,憔悴、枯槁。打开手机,屏保上女儿灿烂的笑脸忽然深深刺痛了我。我现在的样子,配做一个母亲吗?除了自怨自艾和自我折磨,我有没有想过,自己作为一个母亲的责任?我难道不能凭自己的能力给女儿一个更好的生活吗,为什么一定要做别人的附庸?

人说,为母则强。宛若大梦初醒。我开始强迫自己规律作息,再没胃口也要逼着自己吃饭。因为,我是一个母亲, 不能像个女孩一样,为了一根刺就躺在地上哭喊。

但是,我能做什么呢?嫁人之后我从没上过一天班,更不懂社会的种种明规则和潜规则。正在我一筹莫展之时,一位时尚圈前辈来家里看我,看到我的几张涂鸦。她夸我有艺术天分,建议我不妨自创一个品牌,专门做设计。

起初我很不自信,小心翼翼地给我现在的经纪人及合作人打电话,告诉她我想做个服装品牌,问她愿不愿意一起做。没想到,她特别爽快地答应了。一开始,我还存有疑虑,担心她是不是看在我是“某某夫人”才这么给面子,于是火急火燎地找她见面,告诉她我快要离婚了,会失去很多资源,问她是否还愿意跟我一起创业。她说,“没事儿,我看中的是你这个人,不是别的。”

至今,我依然感谢她陪伴了我人生中最最困难的这一年。接着,另一个正能量爆棚的姑娘加入,从始至终陪伴我,把我从阴霾中拉出来。在品牌筹备期,我每天像个怨妇一样给他们讲我的故事,曾经开心的、伤感的,一古脑地倒给他们听。那会儿我觉得把我这辈子要说的话都先预支完了,曾经看起来不可逾越的伤痛,也逐渐消失无踪。我们三个合伙人迅速地注册了公司,短短两个月将品牌上线。刚起步时资金有限,万事都要自己争取。那会儿是北京最冷的时候,我把自己裹成一个粽子,一大早跑去面料市场和小贩讨价还价,拖着编织袋奔到京郊和工厂开会……有一天,我在三环上堵着,接打无数电话,忽然想起以往睡到日上三竿拎着包逛街的慵懒时光,已经如此遥远。当我真正直面生活的沉重、繁忙,反而活得更加充盈和开阔。

品牌做到今天,我遇到无数的困难,但从未开口向谁寻求帮助。一年过去了,公司已经进入良好运转期,我也将开始尝试做新一轮时尚和互联网跨界的创业项目,也有越来越多的投资人向我和合伙人伸出了橄榄枝。眼前的天空愈加开阔,也明白自己仍有许多潜力等待发掘。未来的一年也许我会找到更多人生的支点,而不善表达的我,对你们只有感谢。

经历了那么多的我就像一个大病初愈、死后重生的人一样,才明白谁离开谁都不可怕。以前的我总在寻找别人为你营造的安全感,后来才明白安全感谁也不能一直给你,只有自己是自己最坚强的后盾。离开以前所认为的全世界,真正的全世界才会活生生地呈现在你眼前——离婚,不是枯萎,而是盛放。

我感谢晓松带给我一切,感谢他给我带来这一生对我最重要的人——我的女儿,我会用我所有的爱去呵护她伴随她成长。

我和晓松还会以朋友相待,共同培养女儿成长。也祝愿我们各自有更美好的人生。

时间会淡忘一切,让我们释然。

来源:http://weibo.com/p/1001603726398463296395

您可能对以下文章感兴趣:

谣言:福岛核电站积水辐射超千万倍,海水放射浓度上升

【博海拾贝第三十一期】死宅再浪漫也活该没有妹子

邪恶小漫画:我们好好谈谈

吴宇森是如何进军好莱坞的?

特警拒绝执行指令,坚持原地清理发现追尾动车幸存女童
无觅

[转] 有关weka数据格式

$
0
0
摘自:http://www.cnblogs.com/xiaoka/archive/2012/03/22/2412421.html

Weka简介 (http://www.china-pub.com/computers/common/info.asp?id=29304)

      WEKA的全名是怀卡托智能分析环境(Walkato Environment for Knowledge Analysis),WEKA的开发者来自新西兰,而新西兰有一种鸟名字叫做weka,便是weka图标上的那只。

      WEKA是一个公开的数据挖掘工作平台,集合了大量能承担数据挖掘任务的机器学习算法,包括预处理、分类、回归、聚类、关联规则以及在新的交互式界面上的可视化。

      2005年8月,在第十一届ACM SIGKDD的会议上,怀卡托大学的Weka小组获得了数据挖掘和知识探索领域的最高服务奖,Weka系统得到了广泛的认可,被誉为数据挖掘和机器学习历史上的里程碑,是现金最完备的数据挖掘工具之一。Weka每月的下载次数都已破万。

    --摘自(http://www.china-pub.com/computers/common/info.asp?id=29304)

数据格式

      WEKA的数据是.arff(Attribute-Relation File Format)格式的,是ASCII文本文件。相当于一张二维的表格,@attribute中第二列是表中各项的属性,第二列指定了表格该项的类型,一般有五种类型:{NORMINAL, NUMBERIC, STRING, DATE, RELATION}。下面是一个例子:

复制代码
@RELATION iris

@ATTRIBUTE sepallength    REAL
@ATTRIBUTE sepalwidth     REAL
@ATTRIBUTE petallength     REAL
@ATTRIBUTE petalwidth    REAL
@ATTRIBUTE class     {Iris-setosa,Iris-versicolor,Iris-virginica}

@DATA
5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
4.7,3.2,1.3,0.2,Iris-versicolor
4.6,3.1,1.5,0.2,Iris-setosa
5.0,3.6,1.4,0.2,Iris-virginica
5.4,3.9,1.7,0.4,Iris-setosa
复制代码
其中:

1. @RELATION 我自己的理解是相当于给个名字,这二个字符串包含空格,必须加上引号,英文符号中的单引和双引都可;

2. @ATTRIBUTE 中第二列是表中各项的属性,第二列指定了表格该项的类型,一般有五种类型:{NORMINAL, NUMBERIC, STRING, DATE, RELATION};
3. @DATA标记后面写的都是数据,每一行都是一组数据。

      在WEKA中给用户提供了从数据库和Excel导出CSV文件转换成ARFF文件的方法,如果不嫌麻烦写个写文件的函数也一样。

稀疏数据格式

      稀疏数据格式Sparse ARFF和ARFF文件很像,是WEKA中提供的为了有大量零值数据格式。稀疏数据格式一般是<index><space><value>

如上面例子中的

5.1,3.5,1.4,0.2,Iris-setosa
可以写成:
1 5.1,2 3.5,3 1.4,4 0.2,5 Iris-setosa
文本数据格式

      文本数据格式在数据格式中并没有,但是在WEKA的数据样例中有这样的例子。当你把文本用TextDirectoryLoader将文本集合转化成数据的时候就会形成这样的格式。下面是一个例子:

复制代码
@relation D__temp_weka_TextDirectoryLoader

@attribute text string
@attribute @@class@@ {Libya,'Wall Street'}

@data
'Libyan fighters have raised the new government',Libya
'A special briefing by senior U.S. State Department Officials on Secretary Hillary Rodham Clinton\'s visit to Libya:',Libya
'Occupy Wall Street plans to demand probe into incident involving cop; Group also wants charges against protesters dropped','Wall Street'
'As Occupy Wall Street enters its fourth week, TIME takes a look at other sociopolitical movements in U.S. history','Wall Street'
'As Occupy Wall Street enters its fourth week, TIME takes a look at other sociopolitical movements in U.S. history','Wall Street'
'As Occupy Wall Street enters its fourth week, TIME takes a look at other sociopolitical movements in U.S. history','Wall Street'
复制代码
    使用TextDirectoryLoader转化文本,使用命令行:

   

java weka.core.converters.TextDirectoryLoader -dir D:/temp/weka/TextDirectoryLoader/ > D:/temp/weka/data.arff
      路径自己定义,记住不要漏掉符号>在文本文件夹路径和输出文件路径之间。

      其中文件夹路径下面有两个文件夹:Libya和Wall Street。这两个文件夹下面分别有属于各自类别的文本。

已有 0人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



提高Web开发效率的几个利器(含教程)

$
0
0

面对复杂的 Web 应用的开发,良好的流程和工具支持是必不可少的,它们可以让日常的开发工作更加顺畅、更加高效。本文介绍了6个Web开发利器以及相关的教程,帮助你在开发、调试、集成和发布过程极大地提高效率。

Sublime Text

SublimeText是一款非常精巧的文本编辑器,适合编写代码、做笔记、写文章。它用户界面十分整洁,功能非同凡响,性能快得出奇。这些非常棒的特性包括任意跳转(Goto Anything)、多重选择(multiple selections)、指令面板(command palette)、免打扰模式(distraction free mode)、分区编辑(split editing)、快速项目切换(instant project switch),你还可以随意地自定义更多功能。

也许你并不了解或者熟悉Sublime Text,这不奇怪。每个程序员都有符合自己使用习惯的IDE或者编辑器,一般也不会轻易去更换。不过,程序员的提升需要不断地尝试,编辑器也不例外。

教程:这里有一个长度不到1小时的免费 中文视频,帮助你快速地了解并上手Sublime Text。

Yeoman

Yeoman是一个新兴的工具。它结合了 Yo、Grunt 和 Bower 等工具,组成了一个完整的工具集合,提供各种 Web 应用开发中所需的实用功能。Yeoman 的最大优势在于它整合了各种流行的实用工具,提供了一站式的解决方案,使得 Web 应用开发中的很多方面变得简单。Yeoman 使得开发人员可以专注于应用本身的实现,而不用在搭建应用的基础结构、进行任务构建和其他辅助任务上花费过多的时间和精力。

教程: Yeoman官方教程

Grunt

Grunt是一个 JavaScript 任务执行工具,其核心理念是自动化。在 Web 应用开发过程中,会有很多不同的任务需要执行。这些任务与 Web 应用开发中的不同类型的组件和所处的阶段相关。比如对 JavaScript 来说,在开发阶段会需要使用 JSLint 和 JSHint 这样的工具来检查 JavaScript 代码的质量;在构建阶段,从前端性能的角度出发,会需要把多个 JavaScript 文件在合并之后进行压缩。对于 CSS 文件也有类似的任务需要执行。其他的任务还包括压缩图片、合并压缩和混淆 JavaScript 代码以及运行自动化单元测试用例等。借助Grunt,这些繁琐的重复工作,可以自动化完成。让前端开发工程师可以专注与开发本身,极大地提高了开发效率。

教程:一个小时的免费中文 视频教程,快速了解Grunt。

Bower

Bower 是一个前端库管理工具,可以很好的解决在 Web 应用中引用第三方库时可能遇到的问题。在 Web 应用开发中,一般都会使用很多第三方 JavaScript 库,比如 jQuery 和 Twitter Bootstrap 这样的常见库。传统的做法是从这些库的网站上直接下载所需版本的 JavaScript 库文件,放到 Web 应用的某个目录中,然后在 HTML 页面中引用。这种做法的问题在于引入了很多额外的工作量,包括查找所需的 JavaScript 库文件、下载和管理等。一些 JavaScript 库有很多个版本,也依赖于其他 JavaScript 库。对于给定版本的某个 JavaScript 库,需要找到它所依赖的兼容版本的其他 JavaScript 库。这可能是一个递归的过程,会花费很多的时间。Bower 所提供的功能类似于 Java 开发中会用到的 Apache Ivy、Apache Maven 或 Gradle 等工具。

教程: 上手Bower (英文)

Firebug

Firebug是Firefox下的一款扩展。它集HTML查看和编辑、Javascript控制台、网络状况监视器于一体,是开发JavaScript、CSS、HTML和Ajax的得力助手。Firebug如同一把精巧的瑞士军刀,从各个不同的角度剖析Web页面内部的细节层面,给Web开发者带来很大的便利。

Firebug 除了功能强大,还非常容易上手。大多数Web开发者对它并不陌生,但未必完全了解这个神器,并最大化地发挥它的价值。

教程:全面介绍Firebug的免费中文 视频教程

Fiddler

Fiddler是最强大最好用的Web调试工具之一。它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据,Fiddler包含了一个强大的基于事件脚本的子系统,并且能使用.net语言进行扩展。你对HTTP 协议越了解, 你就能越掌握Fiddler的使用方法. 你越使用Fiddler,就越能帮助你了解HTTP协议.Fiddler无论对开发人员或者测试人员来说,都是非常有用的工具。

教程:不到一个小时的免费中文 视频教程,快速了解Fiddler。

开发工具之外的Tips

靠谱的“梯子”

技术是无边界的,然而我们却被限制在局域网里。与其花费很多精力去寻找各种免费的代理和工具,不如找一个靠谱的“梯子”,或者自己搭建一个,通过SSH通道,然后再结合使用浏览器扩展,这并不难。即使是需要为梯子购买VPS,这种小额的花费也是非常值得的!因为这种投资可以节省你大量的时间,而且帮助你保持通畅的思维,工作容易进入“流”状态(参见 维基百科),而不是“撞墙”后思路中断。

善用搜索引擎

首先选择一个好的搜索引擎,然后掌握一些常用的搜索技巧。对于程序员,Google是不二之选。访问不了Google?请参考上一条。做了一个明智的选择后,你需要掌握一些常用的搜索技巧,帮助你快速地找到需要的内容。大海捞针,信手拈来。这篇文章《 如何使用GOOGLE高级搜索技巧》结合实例分享了很多实用的方法,推荐一读。

结束语

在Web开发过程中,还有哪些对你的开发效率有帮助的工具和技巧呢?请在评论中分享一下私藏的干货吧~

参考资料:

Fiddler 教程
Yeoman:Web 应用开发流程与工具
Yeoman官方教程
如何在Google中进行搜索》 (打不开?请参考开发工具之外的第一条Tips)
如何用好 Google 等搜索引擎?
Flow (psychology)

提高Web开发效率的几个利器(含教程),首发于 博客 - 伯乐在线


原来酱紫!这些产品当年是这样获得第一批种子用户的!

$
0
0
咦?这些产品当年都是怎么抢到第一批用户的?

  许多互联网公司在创业初期,最难的事不是产品研发,而是如何发展第一批有价值的用户,即种子用户(seed users)。这一批人最接近产品定位,并直接影响产品日后的口碑传播及辐射范围,更重要的是,他们可能是社区平台类产品优质内容的主要提供者。在Dropbox的案例中,他们的老大在有狂热粉丝们聚集的Digg发布了一个充满geek才懂的暗语“彩蛋”视频,该视频迅速在Digg上窜到了第一。结果,Dropbox的beta版还没发布,就已经有75000个用户在waiting list上排着了——可谓得来全不费工夫。

  那其他公司又是怎么做的?

  社区类产品们

  1.知乎:先向专业人士发邀请码,“全封闭”后再开放注册

  知乎创始人周源最开始采用的是“杀熟”策略,发邮件邀请好友。2010年上线的前两个星期,他们就邀请到大约200位用户,多数是创始团队的朋友或同事,几乎全部来自IT创业圈,其中有不少媒体人或行业评论员,这个小圈子开始“互问互答”。但外界很难拿到邀请码,它在初始阶段几乎是全封闭的。

  当知乎一点点开放注册,直到用户数量达到2000人的时候,便出现了雷军、李开复等IT名人,他们贡献了各种高质量的回答;他们也因为社区的纯洁性,首选知乎作为发声平台。知乎在发展头两年,一直用邀请注册的方式维护社区的专业性,由此形成了第一批种子用户。直到2013年3月开放注册后,知乎才在更广的话题领域有了较大发展。

  发邀请码的做法也被不少创业团队在使用。比如一个名为“泡面吧”的跟随式在线编程教学网站(类似“Codecademy”),他们主要在相关论坛寻找种子用户,首次内测阶段的邀请码只有500个,但随后因需求旺盛,迅速增加到2000个、4000个……

  2. MySpace和豆瓣:从“文艺”的角度入手,“臭味相投”

  (先为曾经火爆的MySpace点根蜡烛)有人认为MySpace上线后,立刻通过病毒式传播迅速增长用户群,但实事并非如此。其第一批用户是创始人的线下的乐队资源,最初积累的是他们的粉丝用户。

  其实,从充满文艺气息的小众的用户群入手在中国也有一个案例。比如豆瓣就从书籍入手得到了第一批用户。这一批用户可以算是“品味略高”,不仅可以贡献更高质量的内容,也让豆瓣围绕着书籍、文艺、清新等标签逐渐增强吸引力范围。

  3. 新浪微博:高价请大V呗

  新浪博客发展初期通过媒体关系拉拢到了大批意见领袖、知名人士尤其是娱乐圈明星开通博客撰写博文,甚至开出高价稿酬,其它门户纷纷效仿。而这一幕在微博时代又重演了。

  4. 虎嗅:传媒圈内积累种子用户

  虎嗅最开始创办时与现在有所不同,每天只发布一篇精品文章(附带少量其他文章),并精简关键信息,条目化发布到微博上。一开始虎嗅的用户为受邀前来的媒体圈人士,在内容受到好评和转发之后,虎嗅逐步积累了第一批读者和作者投稿。

  工具类产品们

  5. 脸萌:应用商店推荐位,鼓励分享得到口碑传播

  半年前,脸萌App正式上线。各大应用商店当时都给出了推荐位,比如APP Store的精品推荐等,但脸萌并没有登时火爆。经过两个月的攻坚期,用户突破百万。真正火起来却则是在三个月之后,人人网、朋友圈和微博开始出现刷屏现象。用户通过更换头像和发布萌图,各大社交网站纷纷被脸萌刷屏,形成一股“萌风”。数据显示,脸萌的下载量从5月底开始迅速攀升,四天内在iOS和Androd平台的下载量总计约120万。用户自发的病毒性传播在短时间内帮脸萌形成巨大影响力,但最开始脸萌的用户积累却来自应用商店的推荐。

  和脸萌打法类似的还有我们之前介绍过的另一款“90后”App节操精选,他们同样是依靠产品的新鲜度以及有趣的名字得到了分发市场的推荐位;再通过鼓励分享获得更多用户。

  6. 嘀嘀打车:靠烧钱+聪明的地推

  打车软件作为一个平台,需要聚集司机与乘客两方面的资源,而在打车应用扎堆抢市场的初期,相比乘客,拉拢司机端的资源更为紧迫。

  打车应用的做法通常是地推和烧钱。但嘀嘀作为市场的后进者,一开始在这两方面都有困难。当时摇摇招车一度包揽了垄断了机场的推广市场,而嘀嘀只能在西站附近抢夺司机资源。

  除此之外,嘀嘀打车创始人程维说过,嘀嘀曾去跟几个出租公司谈合作,大家都说没有“红头文件”,怕调度出租车违法不敢做,后来嘀嘀终于在京郊找到一家出租公司肯合作,但那些出租师父却都需要手把手地教,才慢慢从10人发展到100人。后来嘀嘀花了几万元做个一则广告:司机只需发短信至12114即可获得下载链接,这也帮助嘀嘀获得了最早一批司机用户。

  社交类产品们

  7. 来往:马云强推,员工人人要出力

  虽然阿里巴巴财大气粗,但其推出的来往仍就在苦苦找寻微信阴影下的发展路线,特别是来往积攒第一批用户的故事,让人看到就算是巨头也不是做什么都那么容易(世界还是公平的)。2013年10月一天,马云在公司内网中就来往就公开表态,呼吁阿里巴巴员工成为来往产品推广员的文章,并把来往挑战微信比喻为一场“战争”,他下达了死命令——阿里人11月底前不到100个公司外面的来往用户,视同放弃红包。“当然有100+未必有红包,没有100个是肯定没有红包。”

  在这种量级的鞭策下,这两天,阿里员工们在微博、QQ、微信和朋友圈里发起了声势浩大的“揽客”的群众运动。

  当然,这种由上至下定指标的推广方针并非马云独创。国外的LinkedIn在寻找种子用户阶段,创业团队每人都有50个指标,在线下邀请高素质的商务用户,CEO则负责100个。

  8. 腾讯系:庞大用户群,相互导流已经够可怕了

  腾讯家族产品众多,以QQ为土壤,QQ空间、腾讯微博、QQ邮箱等产品,在最开始发展用户的时候,都利用了用户不得不看的王牌产品,强制推送链接,引导用户使用。这种运营手法已经非常成熟,不仅有直接的流量导入,互相推荐,还有QQ杀手级的“升级加速”和“点亮图标”推广手法。这一手法在QQ产品的推广中屡试不爽,迅速提高了市场占有率。

  关于QQ如何获得第一批用户的,有网友分享说:97年以前,成气候的IM通讯软件只有以色列的ICQ,当时上网的人几乎都有一个ICQ号码,日常大部分沟通也在ICQ上;99年左右的时候,internet逐渐在国内普及,大量公司、个人及组织纷纷推出即时通讯类软件,但始终无法撼动已经建立用户间强关系链的ICQ。但1999年国庆时候,Yahoo、ICQ等服务器在国外的纷纷被墙,OICQ本身还算和ICQ相似,且又是原生中文界面,于是趁势而起。

   关注 互联网的一些事官方微信,回复ID " 17848 " 即可在微信里阅读本篇内容。

  在查找公众号中搜索:imyixieshi,或者扫描下方二维码快速关注。

   关注互联网的一些事微信

  本文链接: http://www.yixieshi.com/pd/17848.html

  ===============关于互联网的一些事===============

   互联网的一些事http://www.yixieshi.com)  ——  专注于互联网产品设计的媒体平台,报道互联网前沿资讯,分享产品设计经验、用户体验心得。为产品策划和产品运营人士提供专业的产品资讯文档,以及产品设计、策划、运营、交互设计、用户体验、电子商务信息、互联网创业信息、移动互联网等专业信息服务。

   官方微博: @互联网的一些事

   官方微信: 互联网的一些事(ID:imyixieshi)

  如果您对互联网产品有独特的想法和见解,欢迎给我们投稿。投稿信箱:tougao#yixieshi.com (自行将“#”修改为“@”)

第一个完整的Map/Reduce小程序

$
0
0

          从在自己的win7下面装好虚拟机,然后在虚拟机上面安装hadoop,然后再安装hadoop-eclipse插件,过去好像有一个星期了,之前装虚拟机和hadoop都没成功,上个星期解除了封印,一口气把hadoop学习前期的所有的东西都搞定了,接下来就是遥遥无期的hadoop之路。希望自己能坚持下去。

         今天按着别人的思路在win7下面的eclipse里面敲了算是处女作的Map/Reduce程序,虽然很简单,但是自己还是一步一步的走通了,因为hadoop是安装在虚拟机上的,但是eclipse是在win7下面,所以在中间运行的时候会有一系列的错误,昨天晚上把遇到的问题百度的百度,问神的问神,烧香的烧香,基本上都解决了,现在能把程序跑起来,感觉自己的熬夜什么的都没有白费

          下面把一个完整的Map/Reduce程序贴出来,算是一个开始,也是一个纪念嘛!

     

        问题描述:

        先上数据:

         13599999999 10086

         13899999999      120

         13944444444 110

         13722222222 110

         18800000000 120

         13722222222 10086

         18944444444 10086

        

         要求是把拨打过同一个电话的电话输出来比如:

          110 13944444444,13722222222

         

         接下来就是Map/Reduce函数, Map函数将每一行数据读入,然后进行分割,分割成 <key,value>的格式         上面的 key相当于110value相当于13944444444,也就是数据前面的是value,后面的是key,代码如下:

     

public static class Map extends Mapper<LongWritable, Text, Text, Text> {

		public void map(LongWritable key, Text value, Context context)
				throws IOException, InterruptedException {

			String line = value.toString(); // 读取源数据

			try {
				// 数据处理
				String[] lineSplit = line.split(" "); // 将数据分割
				String anum = lineSplit[0];
				String bnum = lineSplit[1];

				context.write(new Text(bnum), new Text(anum)); // 输出

			} catch (java.lang.ArrayIndexOutOfBoundsException e) {
				context.getCounter(Counter.LINESKIT).increment(1); // 出错令计数器加1
				return;
			}

		}

	}

 

 

    接下就是Reduce类, Reduce类要做的就是把从 Map传入来的数据进行整合, 将Map中具有相同key值的value    进行迭代,代码如下(需要知道的是, Map函数的输出也就是Reduce函数的输入,所以在写里面的reduce函     数的时候要注意 参数的类型要和上面 Map的输出值的类型相对应):

 

public static class Reduce extends Reducer<Text, Text, Text, Text> {
		//Iterable<> 使用一个迭代器将数据保存起来
		public void reduce(Text key,Iterable<Text> values,Context context) throws IOException, InterruptedException {
			String valueString;
			String out = "";
			for(Text value : values) {
				valueString = value.toString();
				out += valueString+",";
			}
			context.write(key, new Text(out));
		}
	}

 

 

     接下来就是贴出整个程序,里面有个枚举是用来记录数据错误的时候进行一个计数,还有一个run方法是重写     了主类实现的接口的方法,每个Map/Reduce程序里面run方法里面书写的套路基本上都是一样的,main方       法里面书写的套路基本上也都是一样的,只要改一下主类的名字就可以了

  

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public class Test_2 extends Configured implements Tool {
	enum Counter {
		LINESKIT, // 出错的行
	}

	public static class Map extends Mapper<LongWritable, Text, Text, Text> {

		public void map(LongWritable key, Text value, Context context)
				throws IOException, InterruptedException {

			String line = value.toString(); // 读取源数据

			try {
				// 数据处理
				String[] lineSplit = line.split(" "); // 将数据分割
				String anum = lineSplit[0];
				String bnum = lineSplit[1];

				context.write(new Text(bnum), new Text(anum)); // 输出

			} catch (java.lang.ArrayIndexOutOfBoundsException e) {
				context.getCounter(Counter.LINESKIT).increment(1); // 出错令计数器加1
				return;
			}

		}

	}
	
	public static class Reduce extends Reducer<Text, Text, Text, Text> {
		//Iterable<> 使用一个迭代器将数据保存起来
		public void reduce(Text key,Iterable<Text> values,Context context) throws IOException, InterruptedException {
			String valueString;
			String out = "";
			for(Text value : values) {
				valueString = value.toString();
				out += valueString+",";
			}
			context.write(key, new Text(out));
		}
	}

	@Override
	public int run(String[] args) throws Exception {
		Configuration conf =getConf();
		
		Job job = new Job(conf,"Test_2");    //任务名:主类的名字
		job.setJarByClass(Test_2.class);        //指定class
		
		FileInputFormat.addInputPath(job, new Path(args[0]));   //指定输入路径
		FileOutputFormat.setOutputPath(job, new Path(args[1]));  //指定输出路径
		
		job.setMapperClass(Map.class);    //调用上面的Map类作为Map任务代码
		job.setReducerClass(Reduce.class);   //调用上面的Reduce类做为Reduce任务代码
		
		job.setOutputFormatClass(TextOutputFormat.class);
		
		job.setOutputKeyClass(Text.class);    //指定输出的key的格式
		job.setOutputValueClass(Text.class);    //指定输出的value的格式
		
		job.waitForCompletion(true);
		
		return job.isSuccessful()?1:0;
	}
	
	public static void main(String[] args) throws Exception {
		//main 方法运行
		int res = ToolRunner.run(new Configuration(),new Test_2(),args);
		System.exit(res);
	}
	
}

  

 

    传好数据,

   

 

做好配置:在项目上右键,选择Run as 下面的 Run connfigruations,前面的Main填上项目的名字,然后填上主类的名字,接下来的Arguments写上linux下面hdfs中存放文件的路径和输出结果的路径,最后点击Apply 然后点击run



 

运行结果 :刷新右边DFS Locations 下面的root目录,下面就出现了你在上一步Arguments处填写的输出目录,需要注意的是运行前要保证 root目录下面的没有和你在Argments填写时同名的输出结果的目录,



 
 双击我们的输出目录下面的part-r-00000,就可以看到我们想要的结果了:



 

 

细心的数一下,我们的数据是不是少了一条,原因是我们给的数据上面的格式不对,仔细看上面的的第二条数据,可以知道中间不是只空了一个空格,所以这一条数据就被跳过了。

 

 

心得:写完第一个Map/Reduce函数,之前也看过几个,感觉 模式基本上是一样的, 需要记得的就是Map函数的输出结果是Reduce函数的输入,因此在写Map方法和Reduce方法的时候就要注意里面的参数的类型要保持一致,否则会出错,其他的 就基本上按照套路来就可以了,按照不同的需求写 出不同的方法,模板就感觉只有一个。

 



已有 0人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



程序员的自我修养——操作系统篇

$
0
0

  也许,只需这一篇文章,便能让你全面的认识操作系统!

  在阅读本文之前,推荐阅读“ 自己动手制作4位计算机”。

目录:

1. 进程的有哪几种状态,状态转换图,及导致转换的事件。

2. 进程与线程的区别。

3. 进程通信的几种方式。

4. 线程同步几种方式。

5. 线程的实现方式. (用户线程与内核线程的区别)

6. 用户态和核心态的区别。

7. 用户栈和内核栈的区别。

8. 内存池、进程池、线程池。

9. 死锁的概念,导致死锁的原因,导致死锁的四个必要条件,处理死锁的四个方式,预防死锁的方法、避免死锁的方法。

10. 进程调度算法。

11. Windows内存管理的方式(块式、页式、段式、段页式).

12. 内存连续分配方式采用的几种算法及各自优劣。

13. 动态链接及静态链接.

14. 基本分页、请求分页储存管理方式。

15. 基本分段、请求分段储存管理方式。

16. 分段分页方式的比较各自优缺点。

17. 几种页面置换算法,会算所需换页数。(LRU用程序如何实现?)

18. 虚拟内存的定义及实现方式。

19. 操作系统的四个特性。

20. DMA。

21. Spooling。

22. 外存分配的几种方式,及各种优劣。

  操作系统是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石。操作系统需要处理管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。

  操作系统上运行的计算机程序通常由一个或一组进程组成。因此,本文便从进程开始说起!

  1.进程的有哪几种状态,状态转换图,及导致转换的事件。

程序员的自我修养(1)——操作系统篇 - 第1张  | 快课网

  如上图所示,进程包括三种状态:就绪态、运行态和阻塞态。详细说明如下:

  注意:创建和退出不是进程的状态。阻塞也叫等待,等待和就绪的区别:等待是等待除CPU以外的资源,而就绪等待的是CPU资源。

  1)就绪——执行:对就绪状态的进程,当进程调度程序按一种选定的策略从中选中一个就绪进程,为之分配了处理机后,该进程便由就绪状态变为执行状态;

  2)执行——等待:正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为等待状态,如进程提出输入/输出请求而变成等待外部设备传输信息的状态,进程申请资源(主存空间或外部设备)得不到满足时变成等待资源状态,进程运行中出现了故障(程序出错或主存储器读写错等)变成等待干预状态等等;

  3)等待——就绪:处于等待状态的进程,在其等待的事件已经发生,如输入/输出完成,资源得到满足或错误处理完毕时,处于等待状态的进程并不马上转入执行状态,而是先转入就绪状态,然后再由系统进程调度程序在适当的时候将该进程转为执行状态;

  4)执行——就绪:正在执行的进程,因时间片用完而被暂停执行,或在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行而被迫让出处理机时,该进程便由执行状态转变为就绪状态。

  2.进程与线程的区别。

  详见快课之前分享的文章:

   进程与线程的图文描述

   进程和线程的区别

  3.进程通信的几种方式。

  以linux操作系统为例(window也类似),linux下进程间通信方式如下:

  1管道(Pipe)及有名管道(namedpipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;

  2信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);

  3报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列systemV消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

  4共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

  5信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。

  6套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和SystemV的变种都支持套接字。

  4.线程同步几种方式。

  线程同步的方式主要有以下四种:临界区(CriticalSection)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)的区别。

  他们的主要区别和特点如下:

  1)临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。

  2)互斥量:采用互斥对象机制。只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。

  3)信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。

  4)事件:通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作。

  5.线程的实现方式.(换种方式说即:用户线程与内核线程的区别)

  线程的实现可以分为两类:用户级线程(User-LevelThread)和内核线线程(Kernel-LevelThread),后者又称为内核支持的线程或轻量级进程。在多线程操作系统中,各个系统的实现方式并不相同,在有的系统中实现了用户级线程,有的系统中实现了内核级线程。

  用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。不需要用户态/核心态切换,速度快,操作系统内核不知道多线程的存在,因此一个线程阻塞将使得整个进程(包括它的所有线程)阻塞。由于这里的处理器时间片分配是以进程为基本单位,所以每个线程执行的时间相对减少。

  内核线程:由操作系统内核创建和撤销。内核维护进程及线程的上下文信息以及线程切换。一个内核线程由于I/O操作而阻塞,不会影响其它线程的运行。

  以下是用户级线程和内核级线程的区别:

  1)内核支持线程是OS内核可感知的,而用户级线程是OS内核不可感知的。

  2)用户级线程的创建、撤消和调度不需要OS内核的支持,是在语言(如Java)这一级处理的;而内核支持线程的创建、撤消和调度都需OS内核提供支持,而且与进程的创建、撤消和调度大体是相同的。

  3)用户级线程执行系统调用指令时将导致其所属进程被中断,而内核支持线程执行系统调用指令时,只导致该线程被中断。

  4)在只有用户级线程的系统内,CPU调度还是以进程为单位,处于运行状态的进程中的多个线程,由用户程序控制线程的轮换运行;在有内核支持线程的系统内,CPU调度则以线程为单位,由OS的线程调度程序负责线程的调度。

  5)用户级线程的程序实体是运行在用户态下的程序,而内核支持线程的程序实体则是可以运行在任何状态下的程序。

  6.用户态和核心态的区别。

  在讲述用户态和核心态的区别之前,我们先要说说“特权级”的概念。

  熟悉Unix/Linux系统的人都知道,我们创建一个子进程时,是通过调用fork函数来实现的。事实上,fork的工作实际上是以系统调用的方式完成进程创建功能的,具体的工作是由sys_fork负责实施。对于任何操作系统来说,创建一个新的进程都是属于核心功能,因为它要做很多底层细致地工作,消耗系统的物理资源,比如分配物理内存,从父进程拷贝相关信息,拷贝设置页目录页表等等,这些显然不能随便让哪个程序就能去做,于是就自然引出特权级别的概念,显然,最关键性的权力必须由高特权级的程序来执行,这样才可以做到集中管理,减少有限资源的访问和使用冲突。

  特权级显然是非常有效的管理和控制程序执行的手段,因此在硬件上对特权级做了很多支持,就Intelx86架构的CPU来说一共有0~3四个特权级,0级最高,3级最低,硬件上在执行每条指令时都会对指令所具有的特权级做相应的检查,相关的概念有CPL、DPL和RPL,这里不再过多阐述。硬件已经提供了一套特权级使用的相关机制,软件自然就是好好利用的问题,这属于操作系统要做的事情,对于Unix/Linux来说,只使用了0级特权级和3级特权级。也就是说在Unix/Linux系统中,一条工作在0级特权级的指令具有了CPU能提供的最高权力,而一条工作在3级特权级的指令具有CPU提供的最低或者说最基本权力。

  OK,有了上面对“特权级”概念的了解,就能更直观的了解用户态和核心态的区别。内核态与用户态是操作系统的两种运行级别,,当程序运行在3级特权级上时,就可以称之为运行在用户态,因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态;反之,当程序运行在0级特权级上时,就可以称之为运行在内核态。运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态。通常来说,以下三种情况会导致用户态到内核态的切换:

  1)系统调用

  这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如前例中fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int80h中断。

  2)异常

  当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。

  3)外围设备的中断

  当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

  这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。

  7.用户栈和内核栈的区别。

  操作系统中,每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间。当进程在用户空间运行时,cpu堆栈指针寄存器里面的内容是用户堆栈地址,使用用户栈;当进程在内核空间时,cpu堆栈指针寄存器里面的内容是内核栈空间地址,使用内核栈。

  内核栈是内存中属于操作系统空间的一块区域,其主要用途为:

  1)保存中断现场,对于嵌套中断,被中断程序的现场信息依次压入系统栈,中断返回时逆序弹出;

  2)保存操作系统子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。

  用户栈是用户进程空间中的一块区域,用于保存用户进程的子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。

  PS:那么为什么不直接用一个栈,何必浪费那么多的空间呢?

  1)如果只用系统栈。系统栈一般大小有限,如果中断有16个优先级,那么系统栈一般大小为15(只需保存15个低优先级的中断,另一个高优先级中断处理程序处于运行),但用户程序子程序调用次数可能很多,那样15次子程序调用以后的子程序调用的参数、返回值、返回点以及子程序(函数)的局部变量就不能被保存,用户程序也就无法正常运行了。

  2)如果只用用户栈。我们知道系统程序需要在某种保护下运行,而用户栈在用户空间(即cpu处于用户态,而cpu处于核心态时是受保护的),不能提供相应的保护措施(或相当困难)。

  8.内存池、进程池、线程池。

  首先介绍一个概念“池化技术”。池化技术一言以蔽之就是:提前保存大量的资源,以备不时之需以及重复使用。池化技术应用广泛,如内存池,线程池,连接池等等。内存池相关的内容,建议看看Apache、Nginx等开源web服务器的内存池实现。

  由于在实际应用当做,分配内存、创建进程、线程都会设计到一些系统调用,系统调用需要导致程序从用户态切换到内核态,是非常耗时的操作。因此,当程序中需要频繁的进行内存申请释放,进程、线程创建销毁等操作时,通常会使用内存池、进程池、线程池技术来提升程序的性能。

  线程池:线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,当需要一个开辟一个线程去做具体的工作时,就会唤醒线程池中的某一个睡眠线程,让它去做具体工作,当工作完成后,线程又处于睡眠状态,而不是将线程销毁。

  进程池与线程池同理。

  内存池:内存池是指程序预先从操作系统申请一块足够大内存,此后,当程序中需要申请内存的时候,不是直接向操作系统申请,而是直接从内存池中获取;同理,当程序释放内存的时候,并不真正将内存返回给操作系统,而是返回内存池。当程序退出(或者特定时间)时,内存池才将之前申请的真正内存释放。

  9.死锁的概念,导致死锁的原因,导致死锁的四个必要条件,预防死锁的方法、避免死锁的方法

  计算机系统中,如果系统的资源分配策略不当,更常见的可能是程序员写的程序有错误等,则会导致进程因竞争资源不当而产生死锁的现象。

  产生死锁的原因主要是:

  1)因为系统资源不足。

  2)进程运行推进的顺序不合适。

  3)资源分配不当等。

  如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。

  产生死锁的四个必要条件:

  1)互斥条件:一个资源每次只能被一个进程使用。

  2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

  3)不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

  4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

  这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

  死锁的解除与预防:

  理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。

  此外,也要防止进程在处于等待状态的情况下占用资源,在系统运行过程中,对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,若分配后系统可能发生死锁,则不予分配,否则予以分配。因此,对资源的分配要给予合理的规划。

  10.进程调度算法。

  几种进程调度算法:

  一、先来先服务和短作业(进程)优先调度算法

  1.先来先服务调度算法。先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。由此可知,本算法适合于CPU繁忙型作业,而不利于I/O繁忙型的作业(进程)。  2.短作业(进程)优先调度算法。短作业(进程)优先调度算法(SJ/PF)是指对短作业或短进程优先调度的算法,该算法既可用于作业调度,也可用于进程调度。但其对长作业不利;不能保证紧迫性作业(进程)被及时处理;作业的长短只是被估算出来的。

  二、高优先权优先调度算法

  1.优先权调度算法的类型。为了照顾紧迫性作业,使之进入系统后便获得优先处理,引入了最高优先权优先(FPF)调度算法。此算法常被用在批处理系统中,作为作业调度算法,也作为多种操作系统中的进程调度,还可以用于实时系统中。当其用于作业调度,将后备队列中若干个优先权最高的作业装入内存。当其用于进程调度时,把处理机分配给就绪队列中优先权最高的进程,此时,又可以进一步把该算法分成以下两种:

  1)非抢占式优先权算法

  2)抢占式优先权调度算法(高性能计算机操作系统)

  2.优先权类型

  对于最高优先权优先调度算法,其核心在于:它是使用静态优先权还是动态优先权,以及如何确定进程的优先权。

  3.高响应比优先调度算法

  为了弥补短作业优先算法的不足,我们引入动态优先权,使作业的优先等级随着等待时间的增加而以速率a提高。该优先权变化规律可描述为:优先权=(等待时间+要求服务时间)/要求服务时间;即=(响应时间)/要求服务时间

  三、基于时间片的轮转调度算法

  1.时间片轮转法。时间片轮转法一般用于进程调度,每次调度,把CPU分配队首进程,并令其执行一个时间片。当执行的时间片用完时,由一个记时器发出一个时钟中断请求,该进程被停止,并被送往就绪队列末尾;依次循环。

  2.多级反馈队列调度算法多级反馈队列调度算法多级反馈队列调度算法,不必事先知道各种进程所需要执行的时间,它是目前被公认的一种较好的进程调度算法。其实施过程如下:

  1)设置多个就绪队列,并为各个队列赋予不同的优先级。在优先权越高的队列中,为每个进程所规定的执行时间片就越小。

  2)当一个新进程进入内存后,首先放入第一队列的末尾,按FCFS原则排队等候调度。如果他能在一个时间片中完成,便可撤离;如果未完成,就转入第二队列的末尾,在同样等待调度……如此下去,当一个长作业(进程)从第一队列依次将到第n队列(最后队列)后,便按第n队列时间片轮转运行。

  3)仅当第一队列空闲时,调度程序才调度第二队列中的进程运行;仅当第1到第(i-1)队列空时,才会调度第i队列中的进程运行,并执行相应的时间片轮转。

  4)如果处理机正在处理第i队列中某进程,又有新进程进入优先权较高的队列,则此新队列抢占正在运行的处理机,并把正在运行的进程放在第i队列的队尾。

  11.Windows内存管理的方式(块式、页式、段式、段页式).

  块式管理

  把主存分为一大块、一大块的,当所需的程序片断不在主存时就分配一块主存空间,把程序片断载入主存,就算所需的程序片度只有几个字节也只能把这一块分配给它。这样会造成很大的浪费,但时易于管理。

  页式管理

  把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,显然这种方法的空间利用率要比块式管理高很多。

  段式

  把主存分为一段一段的,每一段的空间又要比一页一页的空间小很多,这种方法在空间利用率上又比页式管理高很多,但是也有另外一个缺点。一个程序片断可能会被分为几十段,这样很多时间就会被浪费在计算每一段的物理地址上(计算机最耗时间的大家都知道是I/O吧)。

  段页式管理。(现在常用)

  结合了段式管理和页式管理的优点。把主存分为若干页,每一页又分为若干段。

  12.内存连续分配方式采用的几种算法及各自优劣。

  内存的连续分配方式有:单一连续分配、固定分区分配、动态分区分配以及动态重定位分区分配四种方式。

  单一连续分配:只能用于单用户、单任务的操作系统中。

  固定分区分配:可运行多道程序的存储管理方式。

  动态分区分配:根据进程的实际需要,动态地为之分配内存空间。

  可重定位分区分配:必须把一个系统或用户程序装入一连续的内存空间。

  13.动态链接及静态链接。

  静态链接就是在编译链接时直接将需要的执行代码拷贝到调用处,优点就是在程序发布的时候就不需要的依赖库,也就是不再需要带着库一块发布,程序可以独立执行,但是体积可能会相对大一些。

  动态链接就是在编译的时候不直接拷贝可执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中,然后程序在运行到指定的代码时,去共享执行内存中已经加载的动态库可执行代码,最终达到运行时连接的目的。优点是多个程序可以共享同一段代码,而不需要在磁盘上存储多个拷贝,缺点是由于是运行时加载,可能会影响程序的前期执行性能。

  14.基本分页、请求分页储存管理方式。

  基本分页储存管理方式具有如下特征:

  1)一次性。要求将作业全部装入内存后方能运行。许多作业在每次运行时,并非其全部程序和数据都要用到。如果一次性地装入其全部程序,造成内存空间的浪费。

  2)驻留性。作业装入内存后,便一直驻留在内存中,直至作业运行结束。尽管运行中的进程会因I/O而长期等待,或有的程序模块在运行过一次后就不再需要(运行)了,但它们都仍将继续占用宝贵的内存资源。

  请求分页储存管理是实现虚拟存储器的一种常用方式,它是在基本分页储存管理的基础上实现的。其基本思想是:在进程开始运行之前,仅装入当前要执行的部分页面即可运行;在执行过程中,可使用请求调入中断动态装入要访问但又不在内存的页面;当内存空间已满,而又需要装入新的页面时,者根据置换功能适当调出某个页面,以便腾出空间而装入新的页面。为实现请求分页,需要一定的硬件支持,包括:页表机制、缺页中断机构、地址变换机构。

  15.基本分段、请求分段储存管理方式。(略)

  16.分段分页方式的比较各自优缺点。

  分段和分页其实都是一种对地址的划分或者映射的方式。两者的区别主要有以下几点:

  1)页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率;或者说,分页仅仅是由于系统管理的需要,而不是用户的需要(也是对用户透明的)。段是信息的逻辑单位,它含有一组其意义相对完整的信息(比如数据段、代码段和堆栈段等)。分段的目的是为了能更好的满足用户的需要(用户也是可以使用的)。

  2)页的大小固定且由系统确定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而一个系统只能有一种大小的页面。段的长度却不固定,决定于用户所编写的程序,通常由编辑程序在对源程序进行编辑时,根据信息的性质来划分。

  3)分页的作业地址空间是维一的,即单一的线性空间,程序员只须利用一个记忆符(线性地址的16进制表示),即可表示一地址。分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名(比如数据段、代码段和堆栈段等),又需给出段内地址。

  4)页和段都有存储保护机制。但存取权限不同:段有读、写和执行三种权限;而页只有读和写两种权限。

  17.几种页面置换算法。

  1)最佳置换算法(OPT)(理想置换算法)

  这是一种理想情况下的页面置换算法,但实际上是不可能实现的。该算法的基本思想是:发生缺页时,有些页面在内存中,其中有一页将很快被访问(也包含紧接着的下一条指令的那页),而其他页面则可能要到10、100或者1000条指令后才会被访问,每个页面都可以用在该页面首次被访问前所要执行的指令数进行标记。最佳页面置换算法只是简单地规定:标记最大的页应该被置换。这个算法唯一的一个问题就是它无法实现。当缺页发生时,操作系统无法知道各个页面下一次是在什么时候被访问。虽然这个算法不可能实现,但是最佳页面置换算法可以用于对可实现算法的性能进行衡量比较。

  2)先进先出置换算法(FIFO)

  最简单的页面置换算法是先入先出(FIFO)法。这种算法的实质是,总是选择在主存中停留时间最长(即最老)的一页置换,即先进入内存的页,先退出内存。理由是:最早调入内存的页,其不再被使用的可能性比刚调入内存的可能性大。建立一个FIFO队列,收容所有在内存中的页。被置换页面总是在队列头上进行。当一个页面被放入内存时,就把它插在队尾上。

  这种算法只是在按线性顺序访问地址空间时才是理想的,否则效率不高。因为那些常被访问的页,往往在主存中也停留得最久,结果它们因变“老”而不得不被置换出去。

  FIFO的另一个缺点是,它有一种异常现象,即在增加存储块的情况下,反而使缺页中断率增加了。当然,导致这种异常现象的页面走向实际上是很少见的。

  3)最近最久未使用(LRU)算法

  FIFO算法和OPT算法之间的主要差别是,FIFO算法利用页面进入内存后的时间长短作为置换依据,而OPT算法的依据是将来使用页面的时间。如果以最近的过去作为不久将来的近似,那么就可以把过去最长一段时间里不曾被使用的页面置换掉。它的实质是,当需要置换一页时,选择在最近一段时间里最久没有使用过的页面予以置换。这种算法就称为最久未使用算法(LeastRecentlyUsed,LRU)。LRU算法是与每个页面最后使用的时间有关的。当必须置换一个页面时,LRU算法选择过去一段时间里最久未被使用的页面。

  18.虚拟内存的定义及实现方式。

  虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(例如RAM)的使用也更有效率。

  19.操作系统的四个特性。

  1)并发(concurrence)

  并行性与并发性这两个概念是既相似又区别的两个概念。并行性是指两个或者多个事件在同一时刻发生,这是一个具有微观意义的概念,即在物理上这些事件是同时发生的;而并发性是指两个或者多个事件在同一时间的间隔内发生,它是一个较为宏观的概念。在多道程序环境下,并发性是指在一段时间内有多道程序在同时运行,但在单处理机的系统中,每一时刻仅能执行一道程序,故微观上这些程序是在交替执行的。应当指出,通常的程序是静态实体,它们是不能并发执行的。为了使程序能并发执行,系统必须分别为每个程序建立进程。进程,又称任务,简单来说,是指在系统中能独立运行并作为资源分配的基本单位,它是一个活动的实体。多个进程之间可以并发执行和交换信息。一个进程在运行时需要运行时需要一定的资源,如cpu,存储空间,及i/o设备等。在操作系统中引入进程的目的是使程序能并发执行。

  2)共享(sharing)

  所谓共享是指,系统中的资源可供内存中多个并发执行的进程共同使用。由于资源的属性不同,故多个进程对资源的共享方式也不同,可以分为:互斥共享方式和同时访问方式。

  3)虚拟(virtual)

  是指通过技术吧一个物理实体变成若干个逻辑上的对应物。在操作系统中虚拟的实现主要是通过分时的使用方法。显然,如果n是某一个物理设备所对应的虚拟逻辑设备数,则虚拟设备的速度必然是物理设备速度的1/n。

  4)异步(asynchronism)

  在多道程序设计环境下,允许多个进程并发执行,由于资源等因素的限制,通常,进程的执行并非“一气呵成”,而是以“走走停停”的方式运行。内存中每个进程在何时执行,何时暂停,以怎样的方式向前推进,每道程序总共需要多少时间才能完成,都是不可预知的。或者说,进程是以一步的方式运行的。尽管如此,但只要运行环境相同,作业经过多次运行,都会获得完全相同的结果。

  20.DMA

  直接存储器访问(DirectMemoryAccess,DMA)是计算机科学中的一种内存访问技术。它允许某些计算机内部的硬件子系统(电脑外设),可以独立地直接读写系统存储器,而不需绕道中央处理器(CPU)。在同等程度的处理器负担下,DMA是一种快速的数据传送方式。很多硬件的系统会使用DMA,包含硬盘控制器、绘图显卡、网卡和声卡。

  21.Spooling

  SPOOLing(即外部设备联机并行操作),即SimultaneousPeripheralOperationOn-Line的缩写,它是关于慢速字符设备如何与计算机主机交换信息的一种技术,通常称为“假脱机技术”。

  22.外存分配的几种方式,及其优劣。

  1)连续分配

  连续分配:创建文件时,分配一组连续的块;FAT中每个文件只要一项,说明起始块和文件的长度。对顺序文件有利。

  优点:

  简单。适用于一次性写入的操作

  支持顺序存取和随机存取,顺序存取速度快

  所需的磁盘寻道次数和寻道时间最少(因为由于空间的连续性,当访问下一个磁盘块时,一般无需移动磁头,当需要磁头移动,只需要移动一个磁道。

  缺点:

  文件不能动态增长(可能文件末尾处的空块已经分配给别的文件)

  不利于文件插入和删除

  外部碎片问题(反复增删文件后),使得很难找到空间大小足够的连续块。进行紧缩

  在创建文件时声明文件的大小。

  2)链式分配

  链式分配:一个文件的信息存放在若干不连续的物理块中,各块之间通过指针连接,前一个物理块指向下一个物理块。FAT中每个文件同样只需要一项,包括文件名、起始块号和最后块号。任何一个自由块都可以加入到链中。

  优点:

  提高了磁盘空间利用率,不存在外部碎片问题

  有利于文件插入和删除

  有利于文件动态扩充

  缺点:

  存取速度慢,一般仅适于对信息的顺序存取,不适于随机存取:查找某一个块必须从头开始沿指针进行。

  可靠性问题,如指针出错;更多的寻道次数和寻道时间

  链接指针占用一定的空间,将多个块组成簇(cluster),按簇进行分配而不是按块进行分配(增加了磁盘碎片)。

  3)索引分配

  索引分配:每个文件在FAT中有一个一级索引,索引包含分配给文件的每个分区的入口。文件的索引保存在一个单独的块中。FAT中该文件的入口指向这一块。

  优点:

  保持了链接结构的优点,又解决了其缺点:按块分配可以消除外部碎片,按大小可变的分区分配可以提高局部性。索引分配支持顺序访问文件和直接访问文件,是普遍采用的一种方式。

  满足了文件动态增长、插入删除的要求(只要有空闲块)

  也能充分利用外存空间

  缺点:

  较多的寻道次数和寻道时间.

  索引表本身带来了系统开销,如:内外存空间,存取时间

  如果觉得本文有用,请顶我们一下!谢谢!

五个广泛流传的对大龄程序员的误解

$
0
0

  最近我过了40岁生日。 一个朋友开玩笑的对我说:”嘿,我想这个意味着你已经老的不适合再去编程了吧!“,我表面上哈哈一笑,但心里却触动不少。 年龄歧视在我们这行里并不可笑。 就像今天用Java的兄弟沦落到这个地步一样,几年前,使用COBOL家伙被我们从心底里嘲笑其老旧的编码方式和缺乏新技术中的灵活性。

  如今轮到我被他们嘲笑了。 也许你也是这样。 如果目前没有,我估计这一天也会很快到来。 你还会笑的出来吗? 是的,我想会跟我一样的。

   我们这一行受年龄歧视体现在好几个方面。 大家都热衷于热门的新技术,追求以不可想象的超速度掌握这些新知识的能力,永不疲倦的加班,让产品按时发布的干劲--所有的这些都是做软件这行中年轻人的特长。 我还没说年轻的员工很便宜的事吧? 不是一般的便宜。 这个 计算机专业学历需求趋势统计并没有清楚的告诉你目前年轻、廉价的劳力已经严重的过剩,那些人力经理对这部分人的感觉就像是大海一样取之不尽用之不竭。 事实上,所有的数据都证明了一个结论:近10年来求职登记计算机专业学历水平要求正在下降或至少没升过。 如果说跟以前区别不太大的话,至少根据Jeff Atwood的数据,  人才信息储备库里的人才质量是没以前好了。 当你找人开发你的新项目,而又不相信外包,那去找谁呢?

  如果你正考虑只由年轻成员组成的开发团队,那么你需要再考虑一下。 在软件业,一些关于大龄软件开发者的传言被很多人深信不疑,这多少都使大龄的、有经验的人处于一种不利的位置。 但是这些人真的很蠢,他们认真参考这个学位趋势,拒绝超过40的任何人,因为我们开起来已经老的有点傻了。 让我来一个个的揭穿这些传言。

  传言: 大龄程序员要比年轻的昂贵,相比之下年轻的开发者更可取。

  真相: 有经验的程序员之所以被标高价的原因是,在软件企业中,员工工资是第一大成本。 这样看来,年轻就意味着便宜。 虽然没有经验的、年轻的程序员可以让你降低预算,但如果你的团队里都是这样的人,他们会让你支付的更久。 年轻的程序员没有接受过失败的教训。  他们也没有足够的时间学习这种教训。 想想吧,他们会在谁的项目上学习这种教训,会让谁蒙受损失? 是你。 当不能按期完成项目时你不是也要遭受损失吗? 再想想。

  是的,大龄程序员要比年轻程序员要求的薪水高。 但是,你有没有想过给他们这么高的薪水是要得到什么? 对于有经验的程序员,你实际是雇佣他们在以往失败的或成功的项目中获取的各种经验。 如果你想让他们在你的经理任期里学习这些经验教训,代价是昂贵的。 如果你花钱雇佣了一个有经验的程序员,他能确保你在以后的项目管理和软件开发过程中不会在犯那些经典的错误。 你的年度回顾图表也会漂亮的多,因为你雇佣了聪明能干的人,他们知道如果把工作漂亮的完成。

  传言: 大龄程序员缺少灵活性,缺乏学习新知识的能力,因为他们脑袋里的传统知识在作怪。

  真相: 相反,正式由于他们的阅历,越是有经验的程序员越是能够更迅速的,更深度的迁移到新的技术、框架和系统里。 例如,如果你学过C/C++的GUI框架,你的脑海里就会对消息传输,事件处理等概念的有了掌握,而MVC模式就是使用了这些概念来设计系统,分离表示层和后端业务处理的。 而最初你学习一个GUI框架时,除了要学习语法,实例,以及常用类库外,你还要学习这些概念性的东西。 经过了二三种或更多的GUI框架学习后,你会发现各种框架之间除了语法外都非常的相似。 你还会发现后,出现的框架已经克服了很多前辈所特有的局限性,已经不需要你再去花时间开发复杂的hack程序了。 这些深刻的见解可并不是那些新人可以拥有的。 由这些思想储备来提升的生产效率并不是你可以用什么方法直接测量到的。

  传言: 大龄程序员不愿意去干那些很幸苦的开发工作  (编者注: 长时间的,加班加点的工作)因为他们有家庭和其他一些事情拖累,这些在年轻员工身上就不会有。

  真相: 我认为,说熟练的程序员相比较更不愿意加班加点辛苦的工作是没错的,因为他们知道只有工作效率有问题才会将自己推到每周工作80小时的处境。 有人说是没有干劲了,但我却要请问,哪一个曾经有过这种经历的人还渴望再经历一次? 还有人说,“家庭负担”是一个因素,但这只是个表面上的假象。 高能力的、有经验的软件工程师对时间的管理是不留余地的,正是有了家庭的原因,他们才会更有动机在给予的规定的时间里把工作完成。 他们也许需要陪家人去参加舞会,去看足球比赛,但他们也会在业余时间把这些占用的时间补上,在标准的一周40小时里一心一意的工作。 好的有家室的程序员一定是一个有效的管理自己个人时间的人,否则他立刻会淹没在各种工作之中无法抽身。

  传言: 大龄程序员没有年轻程序员脑瓜灵活

  真相: 年龄的增长确实影响人的脑力,可以测试出年纪大的工作者确实要比年轻的反应速度慢一些。 可是思考敏捷只是我们的比较的一个方面而已。 思考的快并不是总是好事。 判断的正确与否呢? 有一个古老的说法:

正确的判断来自于经验,经验来自于错误的判断。

  这些老程序员见识过的、经历过的成功的、失败的案例都比年轻的多,由此可以看出,以思考速度退化为借口来拒绝大龄程序员是缺乏说服力的。 经验丰富的程序员有大量的历史可以拿来作为借鉴和参考,让你避免在现在的项目里有错误的判断。 年轻的程序员可能会有一些很好的新观点,但通常是没有经过测试和验证的。 如果团队里两种程序员组合,那会非常的有好处。

  传言:  大龄程序员对工作感到疲倦和挑剔,所以在岗位上没有年轻人那样有干劲。

  真相: 这种话很可能来自于一些老是被有经验的程序员批评为傻冒的人,这些有经验的程序员已经无法忍受那些愚蠢的决定在他们周围一次有一次的发生。 有经验的程序员在一公里外就能嗅出错误的气味。 他们绝对不会听你讲故事说这个产品如何在市场上不被客户接受,因为他们已经跟客户打了多年的交道,他们知道你企图用谎言来挽救你被解雇的命运。 他们绝对不会忍受,因为客户要求下月就要出产品,经理就要求他们每周工作80小时的要求,以为他们已经知道并说过至少要3个月才能完全实现客户要求的功能。

  年轻的程序员并没有经历那么多这样的处境,所以他们很少有反抗经理的错误决定的动作。 管理人员不能用他们天真的想法去要求事物。 如果你想拥有一个优秀的团队,让它生产出优秀的产品,那么允许人们将你从错误的道路拉回来,将会一次又一次的挽救你的项目。 当然,只有在你有勇气承认自己无知的情况才会这样。

  至于说热情在消失,你很难判断是岁月消磨了人的热情。 如果说是年龄的原因,那么如何解释Donald Knuth, Ward Cunningham, Bill Joy, 比尔 盖茨等成百上千的跨过了40岁门槛的人依旧没有丧失任何对这个领域的热情的呢?  他们没有丧失。热情就是热情。 你40岁时还拥有热情,那是你真的热爱这个行业。
这种爱不会在一夜之间就消失的。 那些依旧沿着这些前辈的足迹前进的年轻的程序员们也许会拥有短暂的热情,也许会在这条道路的前进过程中面对困难和挑战发生动摇。

  作为总结,让我们清清楚楚的看清这些事情:年轻不是个坏事情。 年老也不是所有都好。  最重要的是,任何肚子里没有实货的程序员都不应该被雇佣,不论是年轻和年老。 保持你的团队成员年轻年老、有经验和没经验混合 — 保持队伍多样性存在,团队才能成长进步。 如果你正在招聘一些人,不要对坐在你前面的头发显花白的人置之不理。 如果他的才能能打动你,那就丢弃年龄的偏见。

  也许有一天这个人就是你。

搜索引擎变现策略指标体系

$
0
0

下文就百度商业变现的指标体系进行概要描述,并针对一个类似于百度LBS系统的变现思路,阐述一个商业系统变现策略指标体系的建立过程。

为什么需要商业变现策略指标体系

一般情况下,一个互联网产品,或是一个移动端产品在发展前期,主要会关注流量及用户量的增长。当流量,用户量做到一定程度时,就会考虑商业变现。例如今日头条,美丽说,高德地图这样的产品现在都开始商业化变现。而要从变现效果,效率衡量整个系统,以及监控技术策略对系统变现的贡献时,就需要建立一套完善的策略指标体系监控系统当前的状况, 发现系统策略效果瓶颈并有的放矢地去提升。

之前在百度,在和一位高级技术经理聊天时,他就说过, 之所以百度内部一位从Google过来的VP很受老板的重视,一个非常大的贡献,就是他推动百度凤巢指标体系建立,保证公司收入灵活可控,保证每次百度都能在华尔街交出漂亮的财报

指标体系包含的内容

广告主关心的指标

在广告界的人士都知道广告主的这样一句名言:“我知道我投入的广告费用的一半是白费钱财,但问题是,我不知道是哪一半”。而搜索引擎的搜索一大优点,就是能够监控每一次搜索点击的效果。

对百度广告主来说,他们最关心的,和所有的商业投资一样,是:投资回报率 (ROI)。广告主们(商家)想知道在百度体系的广告的投入是否真的有回报,而这个回报是否能够超过投入的资金,超过的比例有多大,这一点上,搜索引擎商业变现系统是做了精心的设计的:

从商家的角度理解ROI,就要了解三个指标:

1. 广告展现次数(简称show):当网民提供关键字,使用百度的搜索业务时候,相关的广告也会根据算法出现在页面相应的位置,用户投放的广告的展现次数,每天,每周,每月都会有统计。 当然,相对于传统的广告投放模式,只要展现了就要收费,百度对展现的广告是不收费的,哪怕用户看到了广告主企业的名字和推广口号,广告主已经获得了一定的广告收益,是要用户不点击广告链接,广告主不需要支付任何费用(针对竞价排名高,和右端广告而言)。这在传统的广告界是不可想象的,因为传统媒体,例如电视,包括门户网站上的banner广告,都是按照展现收费的:看到一次收一次的费用。

2. 广告点击次数(简称clk):用户看到广告后,点击了广告主提供的链接。 可以用每千次广告展现的点击率来计算。网民点了推广信息的链接。推广信息被点的次数被称为点击量,即Clicks,产生的费用叫做点击费用,平均到每次点击的费用被称为单次点击价格,即CPC,是Cost Per Click的缩写。推广信息点击量与展现次数之间的比值被称为点击率,即CTR,是Click-Through Rate的缩写,计算公式为:点击率=(点击量/展现量)×100%

3. 点击率到商业收益的转换:用户点击了客户的广告,就会看到客户自己的网站页面,如果被客户提供的商业服务或者产品所吸引,而付费的话,那么客户就实现了一次成功的商业收益

因为商业系统必须要保证客户(广告主)的利益,这样才能长久合作,所以商业变现策略指标体系必须包含这些指标。

在类似于百度,360,或是Google这样的搜索引擎, 其能精准监控的,就是1,2, 对于最终的商业转化,因为是在商家的网站上完成的,所以除非网站上内嵌了搜索引擎单独提供的独立工具(例如百度的福尔摩斯),否则搜索引擎无法了解这些信息。

投资人关心的变现策略指标

以上是百度广告主需要关心的指标。对于百度这样的上市公司,每个季度的财报中都需要有公司详细的赚钱相关财报内容及各种指标分解,以便了解当前变现系统的健康程度及瓶颈及后续的突破点。

例如百度的投资人不仅关心这个季度百度多挣了多少钱,还会关心多挣的这些钱是来自于哪个环节的提升,是否可持续, 是否后续还有增长空间。 就和分析公司财务报表,或是分析股权收益率一致。

为了让大家对搜索引擎变现策略指标体系有一个对比了解,以下先用股权收益率说明问题。大家可以不用有较强的金融,财务知识也能看懂这个公式,而搜索引擎变现策略的指标体系,与此公式有异曲同工之处,都是将最终的收益(率),分解为各个相对独立的因素,以便发现系统挣钱效率的优势与瓶颈。

该公式主要的目的是让大家了解如何对最终目标指标进行拆解,如果大家不感兴趣可以跳过该节。

股权收益率

即在股市中,投资人购买的股票收益率, 设想一下,一个精明的投资人, 在购买了某个公司大宗股票后,一方面会关注每年的股票收益,另一方面也会分析股权收益是来自于哪些因素的上涨,这样才能分析公司增长是否健康,例如,股权收益率可以简单地使用以下公式计算ROE=净利润/权益。但如果要对这个公式进行细分,将其中对股权收益率相关的影响因素均拆分出来,那可以得到以下公式:

屏幕快照 2014-06-29 下午4.42.10

其中

  1. 税收负担比例:反映公司的税收负担情况,例如有一个季度百度的税率为腾讯的一半,因为百度和国家有什么高新技术的合作所以税收减免(记得百度可能是7%左右,腾讯13%左右,不是精确比例),类似的情况就可以在(1)中反映
  2. 为公司向债权人负担的利息比例, 借的钱越多,这个值越小
  3. 利润率:为每一块钱的销售额所带来的利润。
  4. 资产周转率:为公司资产的使用效率,例如家乐福,沃尔玛虽然利润率很低,但因为出货量大,所以照样赚钱
  5. 杠杆比例:公司资产与公司权益的比例,用于表示用于赚钱的钱中,有多少是自己的,有多少是别人的(例如银行)。例如:北京以前买房的人都发了,因为买的早,一方面房价便宜,一方面使用银行贷款,假设30%首付,那相当于剩下70%银行贷款在房产上的收益,也是自己的。

类似地,如果对百度商业变现体系的收入进行一个拆解,也能将其分解为类似的独立因子,对系统效率进行细化分析。

搜索引擎投资人关心的变现策略指标

从宏观上,我们假设投资人都是唯利是图的,收入是他们最关心的事。当然,很多投资人也会兼顾长远的收益,所以他们会关系收入是如何组成的。我们这里抛开运营,股权收益,利息支付,税收等各种公司的开销,我们仅考虑变现系统的名义收入,即搜索引擎中计费系统的计费和。此时可以将搜索引擎收入分解为以下独立因子:

Revenue =PV * PVR * ASN * CTR2 * ACP

以上公式就是百度,360,Google搜索广告变现收入的拆解。

要弄清楚以上公式的具体含义,需要了解下列指标的定义:

  1. CPM1:cost per thousand1 按每千次检索收费, 百度用户每使用百度一千次做搜索为百度带来的收益。 也就是用户使用了百度服务一千次所带来的百度的收入。这个是衡量百度赚钱能力的重要指标。是百度变现能力的基本衡量标准。是根据每个季度的总收入除以PV(Page View)算出来的。
  2. CPM2:cost per thousand2 按每千次展示收费,广告所在的网页被浏览了一千次,即认为该广告展示了一千次。 这个指标是衡量广告客户的广告展现了一千次的时候,客户交付的费用(注意客户是在用户点击广告后才付费的). 这个指标可以衡量用户对于广告的感兴趣程度。从广告客户的角度讲,也可以衡量在百度投放广告的费用多少,以及投放的有效性。
  3. CPM3:cost per thousand3 表示平均每千次有广告展现的检索请求对应的广告收入,衡量单次有广告展现检索的平均收入贡献。这个指标是衡量当搜索结果的页面有广告展现的时候,每展现一千次,百度能够拿到的收入。有的搜索结果是没有广告展示的(CPM1把这些PV也计算进去了)。
  4. CPC:cost per click 按每次点击收费,是目前最流行的搜索引擎营销的付费方式,即只有当用户点击观看了你的推广链接后,才发生费用。
  5. CPA:cost per action 按每次用户消费行动收费,被认为将是互联网广告未来必然的发展方向,但由于不同产品的广告对action的定义和回报率有太大差异,实现过于复杂,目前在全球范围尚无搜索引擎使用CPA收费的成功先例。
CTR——点击率,在这里特指广告或推广链接出现后被用户点击的机率。CTR还将可以进一步的细分。
  6. CTR1:表示平均每次检索请求对应的广告点击数,衡量单次广告检索的平均点击贡献。理论上 CTR1 可能大于 1。因为每次检索客户可以点击一个广告,看了后,在回去原来的检索页,点击下一个广告。
  7. CTR2:表示平均每次广告展现对应的广告点击数,衡量单次广告展现的平均点击贡献。
  8. CTR3:表示平均每次有广告展现的检索请求对应的广告点击数,衡量单次有广告展现检索的平均点击贡献。理论上 CTR3 可能大于 1。
  9. ARPU:户均消费,影响它的因素包括:点击流量大小、关键词的相关性、同一关键词的竞争度,以及客户在搜索引擎广告上的预算上限等。
  10. PV:检索量,百度搜索框的搜索次数
  11. ADPV:出广告的检索量,即PV中,有广告展现的搜索数量
  12. CLK:click number,广告的总点击次数
  13. CSM: 百度广告主的总广告费支出
  14. ASN:平均展现条数。即:如果展现了搜索推广广告,每次平均展现多少条
  15. ACP:Average Click Price 平均点击价格  总消费/总点击
  16. PVR:Page View Rates, PV比率,出广告的检索量 / 检索量

有了以上这些定义后,我们再来回顾变现系统的计算公式:

Revenue =PV * PVR * ASN * CTR2 * ACP

可以看出以上各因子表明了变现系统不同组成的效率

  1. PV:是百度能够用于变现的流量上限,由用户体验决定,百度越好用,口碑越好, PV越高。该指标在百度类似的搜索引擎公司,主要由搜索部门负责。
  2. PVR:就是PV中被用于变现的比例,PVR越高,说明在百度搜索中,出广告的概率越高,有可能导致用户体验的下降
  3. ASN:单次有广告展现的PV,展现的广告数量,表明单次有广告展现时的变现利用程度。ASN越高表明单次搜索出的广告越多,可能导致用户体验的下降
  4. CTR2:单条广告展现时, 广告北点击的概率。表明广告推的是否精准,是否满足用户需求(至少是感官上是否吸引用户)
  5. ACP:单次点击价格,相当于单价的高低

这样的指标分解非常有利于指导策略的优化,以下是几个case:

  • PV:搜索部门的重要指标,增加下降,都能立刻看出搜索部门的业绩,或是竞争对手带来的影响,例如,就百度而言,Google退出中国PV上升,360上了搜索, PV下降,都能直接看出来
  • 点击率预估:假设PV,PVR,ASN,ACP都固定,则要增加收入,需要提升用户对广告的点击率,此时可以用模型来对点击率预估,提升CTR2。各大搜索引擎公司,对CTR2的预估,基本上都是商业部门的重要机密,也是最重视的技术之一
  • 增加广告展现:在各上市公司(包括传统行业公司),都会有‘冲业绩’这么一说,就是极度末时,为了达到之前的营收计划,需要使用各种手段增加收入,例如我们经常听说的银行给高利息临时拉存款等,在百度则可以通过调参提升收入,比如增加ASN或是PVR,达到收入符合华尔街预期的效果
  • ASN的变化:如果收入的增长是来自于ASN的增长,则说明百度的点击卖得更贵了,广告主会不乐意。相反,ASN下降,说明点击卖便宜了,百度的收入有可能降低,所以类似于CTR2上升,ASN不变这样的策略,是最好的

有了以上定义即收入的拆解,则收入可以用其他集中形式表示:

Revenue = PV * CPM1

Revenue =PV * PVR * CPM3

Revenue =PV * PVR * ASN * CPM2

Revenue =PV * CTR1 * ACP

Revenue =PV * PVR * CTR3 * ACP

百度商业部门的工作,几乎每天都是在围绕着这些指标来进行的。每一次策略的调整,工作方式的改变,都希望在这些指标上做出正向的贡献,因为这些指标对百度的收入是直接造成影响的。从百度的收入(Revenue)的计算公式上就可以看出(每一种计算方法得到的结果都殊途同归)

如何建设LBS变现策略指标体系

拿百度地图类似的LBS产品为例,假设我们的转化漏斗路径是:推荐&搜索之后展示结果列表也,然后用户点击结果进入店家的表述页面(POI),之后如果用户感兴趣,则点击具体的团购,优惠券进行购买,搜索漏斗如下:

LBS搜索漏斗

 

图:搜索漏斗

对应到线上系统,在评估衡量线上系统效果时,我们也需要分为这3阶段进行衡量,以及时发现线上策略效果的瓶颈所在, 快速找到提升重点。在以上3阶段中:

  1. 搜索or推荐:主要表明流量大小
  2. 点击详情页: 表现为用户带来的流量到详情页的浏览情况
  3. 转化:最终转化action

对于商业系统,我们最重要的目标就是保证在既定流量上,转化最高。

以下为我们需要关注的所有指标:

LBS_KPI

表:策略效果指标

如后续变现系统按转化收费,则整个LBS变现系统收入可定义为:

收入=  pv * pvr * easn * ctr2 * atr2 * aap

在产品的不同阶段,我们需要关注的重点不一样

  • 在产品上线的阶段,我们需要关注用户体验,所以ctr2和atr2需要重点关注
  • 用户体验提升到一定程度,商户已经认可我们产品效果时,再考虑提升成单的单价(例如佣金等),同事可以考虑对商业POI进行放量,提升pvr和easn

物料召回及检索类指标

该类指标主要用于监控系统的检索量, 以及系统的召回能力。 检索量等指标是系统变现可以使用的所有资源,更多受用户产品影响;而召回能力相关指标则体现出CPR系统对商业物料的召回能力。

以下为重要指标说明:

  • 检索量: 发送到系统的所有请求量;通过统计检索日志条数得到;为能够变现的流量全集。
  • 查询用户数:所有发起请求的用户数;统计检索日志中去重后uid得到,体现参与检索的用户量。
  • 用户平均检索量:平均每个用户发起的请求数量;体现用户检索角度的活跃度。
  • 单次检索返回结果数:平均单次检索返回结果条数; 体现系统的召回能力(准确性参见相关性评估)
  • 商业结果检索量:出现商业结果的检索次数;
  • 商业结果检索用户数:出现商业结果的检索用户数;体现商业结果能够覆盖的客户群体
  • 商业检索占比:出现商业结果检索量占总体检索量占比;可根据改指标分析潜在变现流量。
  • 商业检索用户占比:看到商业结果的用户占所有检索用户占比;可根据该指标分析潜在变现用户。
  • 单次检索商业结果返回条数:一次出现商业结果的检索,返回的结果条数;

点击行为类指标

该类指标主要用于衡量用户浏览搜索/推荐结果后的点击行为。该过程为转化漏斗第二阶段。

以下为具体指标及含义:

  • 点击条数:被点击的POI数量(包括自然POI和商业POI)
  • 有点击检索次数:产生点击行为的检索次数(包括自然POI和商业POI)。
  • 有点击用户数:产生点击的用户数量。
  • 商业POI点击条数:商业POI被点击的数量。
  • 商业POI有点击检索次数:出现商业POI,且产生商业POI点击的次数。
  • 商业POI点击用户数:点击商业POI的去重用户数。
  • 单次检索点击率:平均每次检索点击POI的概率;该值理论上可能大于1
  • 单次检索商业POI点击率:平均每次检索,点击商业POI的概率;该值理论上可以大于1
  • 单条商业POI展现点击率:平均每条商业POI展现的点击概率;用于衡量每条商业POI曝光产生点击的效率。
  • 单次有商业结果展现点击率:平均每次有商业POI展现的检索的点击概率;用于衡量出商业POI的流量产生点击的效率。

效用类指标

该类指标主要用于衡量用户点击进入POI详情页后,根据详情页信息,做出最终决策的阶段(包括点击‘预订’,‘成单’,‘下载’等行为)。该过程处于转化漏斗的第三阶段,也是最终阶段。

以下为具体指标定义:

  • POI展现数:包括自然POI和商业POI的展现次数。
  • POI展现用户数:浏览POI的去重用户数。
  • POI详情页转化数:此处的转化根据每个入口可能有所不同。
  • POI详情页转化率:POI详情页转化数/POI详情页展现数。
  • 单次转化收费: 完成单次转化后,向商户收取的平均费用。

以上密密麻麻的指标,在不同的商业变现系统中会有所差别,但基本上都是按照用户产品形态及转换漏斗进行设定,而每个策略的上线,都会使用类似的指标体系来衡量策略对不同漏斗部分的效率影响。

 

Viewing all 15843 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>