假设有以下三个子站点:
cms.site.com
bbs.site.com
shop.site.com
cms是文章站,bbs是论坛,shop是网店。这三个站点,有不同的关注点,从流量来源看,cms主要来自搜索引擎,bbs主要来自合作网站推 荐,shop主要来自cms和bbs的站内广告。从用户的引导看,因为cms的访问量最大,希望把用户引导到bbs完成注册,以及进一步的在shop消 费。
cms关注的事件和目标有:
搜索引擎关键字的着陆页与跳出率,平均文章阅读数,回访,广告点击,商品购买,引导去bbs注册。
bbs关注的事件和目标有:
新用户的注册量,回访,论坛的发帖和回复,引导去shop购买。
shop关注的事件和目标有:
从cms,bbs来访用户的转化率,站内商品搜索,下单过程的流失率。
对于这三个站点,最简单的分析方式是建3个独立的GA账号,分别统计,因为GA cookie的域会默认用当前的站点,如:cms.site.com,这样即使同一个人分别访问了3个站点,也互不影响,还可以分别对各个账号设置事件记 录和目标。在这种情况下,当用户点cms的一个推荐链接来到bbs时,cms会作为引荐流量,从GA的角度,并不知道这三个站点是兄弟站点。
分开统计的好处是:事件,目标,用户变量,配置相互独立,可以从子站的角度看流量的变化。缺点是无法知道准确的总唯一访客数,以及site.com 的整体流量来源。另外,追踪引荐流量时,只能看到带来注册的引荐路径,至于用户之前访问了哪些页面,以及用户从哪里来,则很难分析。
对于这种情况,最佳的做法是即统计子站点也统计总站数据,建立一个新的账号main,cooki的域为.site.com,当要看汇总数据时,去这个账号看。
以cms为例,原有的统计代码是:
var _gaq = _gaq || [];
_gaq.push(
['_setAccount', 'UA-111001-1'],
['_trackPageview']
);
增加以下代码:
_gaq.push(
['t2._setAccount', 'UA-222001-1'],
['t2._setDomainName','.site.com'],
['t2._addIgnoredRef', 'site.com'],
['t2._trackPageview']
);
即创建一个新的Tracker(t2),指定账号(setAccount),设置cookie的所在域(setDomainName),并且把 site.com子站之间的推荐链接作为直接访问(addIgnoredRef),这样在cms站点访问一个页面时,将会分别提交到:cms,main 两个账号。
如果默认不做配置的话,你会在main账号的所有页面(All Pages)看到这样的页面列表:
/home
/topic/reply_3356
/topic/reply_2269
/article/1234
/buy/332
三个子站相同的页面,如home页被放在了一起,三个子站不同的页面,则按照浏览量,从高到低排列,在这种情况下,你即无法比较各个子站点的流量,也无法准确分析某个页面的:关键字,流量来源,跳出率等,因为有可能是混杂的数据。
以/home为例,虽然三个子站点的Page是一样的,但他们的Hostname是不一样的,点击/home链接,然后次级维度选:Hostname,这时即可看到详细的数据了。
还可以按:Hostname,Page 作为维度,PageViews作为指标,建一个自定义报表。
在自定义报表上,会列出三个站点的总PV:
点击cms.site.com链接,会列出该站点的页面和PV:
通过次级维度和自定义报表,虽然可以解决问题,但还是不方便,如果默认的页面列表能补上Hostname就好了,这样还可以在Content Drilldown视图,按目录,一级一级点下去,按站点,按目录查看和比较流量了。
这个可以做,为了不影响原始数据,新建一个配置文件:main_group_site,然后建一个过滤器:
即在Request URI前,补上Hostname,这时再去:所有页面(All Pages)报表看,就清楚多了,就像这样。
/cms.site.com/home
/bbs.site.com/home
/shop.site.com/home
/bbs.site.com/topic/reply_3356
/bbs.site.com /topic/reply_2269
/cms.site.com/article/1234
/shop.site.com/buy/332
这样还有一个顺带的好处,假设我们想知道 /shop.site.com/buy/332的引荐路径时,只要点击这个页面链接,然后看导航摘要,这时即可完整的看到:/shop.site.com/buy/332 访问的上一页,下一页路径了,就像这样:
子目录的流量汇总:
假设有以下2个子应用,放在同一个域的2个目录下:
app.site.com/listen
app.site.com/dict
如果不做处理,在提交到汇总账号时,看到的都将是 app.site.com,这样就无法按Hostname区分流量了,简单的做法是增加一个新的过滤器。
这样保存的Hostname将会修改为:
listen.app.site.com
dict.app.site.com
然后就可以按Hostname来区分子目录的流量了。
总结:
多子站点统计,可以从总体上查看和比较各个子站点的流量信息,以及在全站范围追踪完整的访问路径,对于建立整站流量的大局观很有意义,同时因为所有 的访问都放在了一起,最终得到的:跳出率,平均访问时间等数据,会不够准确,因为被平均了,这时应该分别看子站点的数据,从局部上分析和优化各个子站点的 流量。
此前我们也零零碎碎介绍过国外一些公司办公室陈设,知名的、不知名的,总之看着都让人流口水。
今天,又搜罗了13家位于荷兰阿姆斯特丹的创业公司办公室图片,让口水一次流个够!
看看人家这室内设计、这办公装备、这办公环境···竟然还有在船上办公的!国内公司的办公室啥时候能改良?拒绝格子间啊···
1. Greetz:荷兰首家网络祝福卡服务公司
2. LayerGloss:创立于今年5月份,被《连线》杂志评为“欧洲最热门创业公司之一”;他家的产品能让没有任何相关技术的人开发出自己的iOS应用。
3. 22tracks:在线音乐网站,包含22种音乐流派,每种流派收录22首歌;也已经推出了移动版应用。听音乐是员工们每天上班的主要内容,所以办公室有着效果极佳的隔音墙,以防扰民。
4. eBuddy:在2003年,eBuddy推出了全球首个基于网页的独立即时信息发送服务。
5. Usabilla:创建于2009年,主要提供网络视觉体验反馈收集工具,帮助网站进行针对性的优化。EA、华纳、LinkedIn以及索尼甚至美国政府都是它家的客户。
6. Hyves:曾经是荷兰第一大社交网站,网站名称还被收录进国家词典,成了一个新动词。
7. 9apps:在酒窖里成长的云计算公司,员工很少;而且由于过分喜爱目前的办公环境,公司十分纠结要不要扩大规模。
8. Mobypicture:图片分享应用。公司的所有家当都在这条船上,全体人员每天就漂在运河上办公···不过是在原地漂着。
9. Smart.pr:跟Usabilla在同一栋楼里。主要是为PR人员提供方便有效率的在线消息发布工具。
10. Blender:全球最受欢迎的开源3D模型应用开发公司,员工每周轮流为大家准备午餐。
11. Peerz:提供简历优化服务。办公室相对比较普通了。
12. Postpanic:设计公司。既然本身就是做设计的,自家办公室当然要设计感十足了。
13. The Next Web:TNW的故乡也在阿姆斯特丹。不过,办公室也没啥亮点···好吧,我承认这是放上来凑数的。放一张同样没啥亮点的妹子图,聊表歉意了。
据不完全统计,规模在千万美元以上的融资达近十起,如美国网络教育服 务商2tor获得2600万美元的巨额融资,欲让在线教育和学校教育平起平坐,挑战哈佛、耶鲁等常青藤盟校;创业公司The Minerva Project则获得2500万美元的巨额种子投资,意图打造“在线版哈佛大学”。此外还有UniversityNow总计获得了1730万美元投资、 Codecademy筹集到的资金达到了1000万美元、Echo360获得高达3300万美元的融资、Coursera总计筹集约2000万美元的资 金……
在线教育可能是一场学习的革命。知识曾经作为一种特权,只有少部分人能获得;今天,通过网络教育,优秀的内容得以广泛传播。在国外,互联网碰 撞教育已经产生巨大金矿,投资者听到了变革的呼声,胸怀远大的创业者也听到了变革的呼声。但是,当在线教育碰撞中国的应试教育氛围,现状并不乐观,而国外 的很多模式也很难复制。
反观国内在线教育网站,实际上只是将传统教学的模式数字化,但在教学方法上并没有很大的突破,也容易把传统教学的弊病带到线上。我们更关心的是新时代的模式,在PC或移动客户端包含富媒体效果、社交性、游戏机制、实时互动等元素的教育类网站或应用。
模式创新多样,国内难以复制
值得注意的是,十年前,一些美国大学的在线教育项目遭到了失败。2001年,芝加哥大学、密歇根大学和其他大学参与的哥伦比亚大学商业性的在 线教育项目Fathom启动,但两年后就夭折了。耶鲁大学、普林斯顿大学和斯坦福大学合作开发的非营利性在线教育项目AllLearn也在2006年也被 迫终结。
不过,仍有许多美国教育专家却对新的在线教育项目寄予乐观的希望。哈佛大学董事会现任成员劳伦斯·S·巴考(Lawrence.S.Bacow)博士指出,传统大学未来必须与新技术整合在一起,不然就将走向末路。
毫无疑问,互联网的出现和爆发,正是这个不可或缺的新技术。在最具价值的高等教育方面,国外在线教育从业者创造出了多种多样的新模式。
第一种仍然是是大学自身创办的。哈佛大学和麻省理工学院要在麻省理工学院去年底启动的在线教育项目MITx平台的基础上搭建edX,提供理工 科和人文社会科学的课程。麻省理工学院和哈佛大学的相关负责人称,他们不仅将利用edX这个平台建立一个庞大的全球性在线学习社群,而且还将研究教学方法 与技术。
edX由位于波士顿市剑桥镇的一个非营利组织负责运营,哈佛大学和麻省理工学院平等共有。两校将各投入3000万美元来启动该项目。edX的 前身起源于麻省理工学院去年12月宣布实施的在线开源学习项目MITx。通过新的交互式学习平台,MITx让在线学习的学生出席模拟实验室,与教授和其他 学生互动交流,完成学业的学生将获得正式证书。麻省理工学院表示,在其网络开放课程计划十周年之际,他们认为需要采用技术改进来打破高等教育的门槛。
对比一下便能发现,交互、个性、社交、富媒体等要素,成为大学在线课程的新模式和新方向。
第二种是与大学合作,为大学提供工具、技能、资金等来帮助大学创建并管理同学校教育同等重要的在线教育项目。在线大学教育先驱2tor正是凭此获得了2600万美元的融资。
目前2tor已经有了一些具体的成功案例,主要集中在研究生教育阶段。比如其与USC的Rossier教育学院合作创建了教育学硕士的在线项 目。在这些项目的创建中,2tor的角色主要是开发可以让教授们分享材料、提供教案和交互性课程以及帮助学生的网络平台。另外该平台目前已经拓展到了移动 领域,学生们可以下载2tor的iPhone、iPad和Android应用通过摄像头和3G网络随时随地参与学习。
当然这些在线项目每一个都需要花费巨资。创始人Jeremy就表示他们要为每一个具体的项目进行平台定制、同教师合作、设计校园社交网络和同 步视频系统,这使得每一个项目的花费都达到了1000万美元。不过值得欣慰的是2tor创建的首批3个在线学位项目目前已经共有来自30多个不同国家的 3500名学生。而为了保证在线学位项目的质量,这些项目都采取了和学校教育相同的考核体系。这样毕业出来的学生将真正和在学校获得教育的学生一样。
当前,2tor的盈利模式主要是和各大学合作伙伴共享学费收入,不过2tor本身不介入大学的招生和教学工作,仍由大学自己完成。
同样坚持此模式的还有在线教育产品的公司Echo360,凭借成立四年多来积累的超过100万学生,其“混合式学习解决方案”获得了超过3100万美元的融资,如今服务已经覆盖了全美高校10%的学生。
第三种,则是直接想要取代大学的计划。获得高达2500万美元的种子投资的The Minerva Project的野心是,构建一个虚拟的在线哈佛大学。
据了解,The Minerva Project将采用2tor搭建的实时网上教学系统来完成学生们的核心课程教育。同时其还将和许多在线教育培训机构进行合作使用这些教育机构的教学内容 作为延展学习的资源。这些都算不上什么,真正彰显其野心的则是它真的想要取代大学,成为一种新的权威教育渠道,是优质的师资、生源和足够出色的毕业生,这 也成为其达成野心的保证。
为此,The Minerva Project将和传统的大学教育一样,采用4年学制,且全部在互联网上完成。学生们第1年将在自己所在国家或所住地完成基本的核心课程学习,这样所有的 学生无论语言背景都具备了相同的学术基础。随后从第2年开始直到毕业,学生们要到一个新的国家至少是一个新的城市去学习,,至少掌握2门外语才能顺利毕 业。
最重要的是,The Minerva Project将学术能力作为筛选学生的唯一标准。它希望自己的申请人筛选过程和传统的大学完全不一样,他们不会考虑亲属、运动员、国家、宗教以及家庭背 景等因素,唯一筛选的标准就是你的学习能力有多强。而在教师方面,The Minerva Project甚至打算创建一个教师领域的诺贝尔奖“The Minerva Prize”,用于奖励当前最顶尖的大学教授帮助其创建课程。课程创建好后,The Minerva Project则会聘用博士毕业生来为学生们讲授这些课程。最后在毕业后,The Minerva Project也不会像传统的大学一样把毕业生们仅仅当作校友资源(潜在的捐助者),他们还会积极帮助毕业生寻找志同道合的伙伴以及各种资助金和机会。
这就是The Minerva Project的庞大野心。如果说以往的互联网教育还只停留在课外辅导或者培训上,那么The Minerva Project这样的项目的真正崛起将创造与现实大学平起平坐的局势。
当然,以上这些多是模式上的差异,具体到实现上,各种新鲜技术的应用和体验都十分不错。此外在其他技能型和中低年龄层次的突破上,可汗学院以及Lynda都十分优秀。除了这些,海外在线教育领域的创业者们还创造了许多其他新模式,并渐次站稳脚跟开始扩张地盘。
技术撬动政策的可能?
不过,在教育资源极度垄断、教育理念陈旧迂腐的中国,这些模式恐怕都难以走得通。事实上,国内的在线教育问题很多,包括怎样应用最新科技、解 决优秀师资缺乏、课程创新等,统一的权威平台等。那么,究竟有没有一种可能性,依靠互联网的技术力量,撬开应试教育和资源垄断的桎梏,为国内更广大更迫切 需要知识和技能的用户提供真正的在线教育?
我们知道,许多大学也都在开展在线教育。从1999年国内开展远程教育试点以来,共有69所高校被授权开设网络教育学院,通过网校独立招生、授予文凭和学位,一些网校还将精品网络课程、优秀教学资源等免费向社会开放。
不过,第一代在线教育公司以及知名大学的网校,只是做到了教材的电子化,很少能够应用灵活丰富的互联网资源和技术进行真正创新。具体的,国内 目前互联网与教育结合的一些主要形式包括:将教师的教学过程录制下来,放在互联网上供学校或学生选取;或通过门户网站的形式,将教育资讯、学习资源和各种 教材放在网站上;再者像上海市在推广的“电子书包”,学生可从学校服务器下载电子课件、辅导材料和作业等。
我们可以看看苹果公司走的终端突破的进军曲线。
凭借iPad的流行,苹果依靠iTunes U也切入了在线教育领域——这些年来,苹果从1000多所大学收集了超过50万份视频和音频教学文件,总计下载量达到了7亿次。不过教师公开发布课程仍然 还需要得到苹果的认证。但是,其近期发布的升级版iTunes U App已经允许任何教师在上面发布教学内容。
苹果这次新版的功能主要针对在教室使用iPad进行教学的K-12教师,允许他们建立多达12份的私人课程。在每份课程里,教室都能指导学生 使用各种主要由苹果驱动的媒介课程如iBooks、教科书、App、视频、Pages以及Keynote文件。新的iTunes U还提供了新的工具,允许学生在视频上做笔记。
而与其他专注于提供内容的在线教育不太一样,苹果不仅有来自全球的教师为其提供教学内容,还拥有iPad这个终端设备。因此它在这个演变过程中既能充当传统教育里的课堂“教学工具”,也将人们的行为习惯逐渐向在线教育培养。
而当前,随着Web2.0以及移动互联网时代的到来,一些新兴的、更具个性和效率的模式也逐渐显现出来,纷纷取得小范围突破。
最容易吸引用户的还是重编教材,并资源取胜富的平台,包括可汗学院也属于这一类。事实上,有些网站的视频是自主制作的,如剪切电影片段放在课 程中,或者借鉴国外课程时间短、内容精简的方式;美国网站TED-Ed甚至允许学生对视频做自主编辑、删减,再推荐给自己的同学。而另一部分网站用搜罗的 办法,如Course Hero就是将YouTube上的教育视频整合起来。此外,实用的工具类应用、丰富社交属性、“契约式”DIY学习甚至“拜师”式学习、“傻瓜式教学”等 方式都在国外取得了一些成功的案例,国内方面也有许多较为出色的实践者。
另一方面,考虑到其实在美国,在线科技的主要途径仍然还是免费或收费视频,而这些加上电子邮件、社交网站等工具基本上能够完成,这样看来也许 太过先进的技术工具并不是很必要。而如果把精力和资金放在开发课程内容、引进教学资源、扩大开放性等方面,且结合当下互联网的公开课平台以及其他资源共享 平台,完善互联网体验,增强学习成果的认可程度,并真正用互联网惯行的服务思维来进行推广运营,也许是另一种“技术性”突破。
至于国内用户有没有这么大的需求,仅仅提供有限的大学课堂视频的各种公开课,已经十足火爆了。
几乎没有什么比糟糕的情绪更能抽走一个人的行动力了。这样的体验过去常常降临在我的身上:起床的瞬间,全身的血液都不知去了哪里,大脑似乎无力思考,能隐隐约约感觉到前方有一堆没有解决的烦心事等着我,却没有力气去细想它们都是什么。于是拖延的一天开始了……
其实烦心事造成的坏心情是可以解决的。事实上,最常见的让人感到沮丧的情况不是“惊人的巨变”(比如挚友的离世,这相对少见),而是“屋漏偏逢连阴雨”,也就是很多件小的烦心事堆在一起,就会让人沮丧,这与任务过多时的痛苦有些相似。我一直保有写日记的习惯,在写作本文之前,我翻阅了我过去四个月的日记,在其中每一天的事件心情都被详细记录下来;我发现有14次,我感到心烦意乱,而它们全部是由于小事的堆积造成的。
来看一个故事吧(不是100%真实的):
那天下午,我在放学的路上想起了下周即将到来的考试。上次考试我没有考好,我和老师都很失望,期待着这一次能走出阴影;然而我越是这么想就越心慌,想起了还有五套布置的模拟题没有完成。我的脚步变得沉重起来,希望能给朋友打个电话缓解一下压力。可是在这个新的集体里,我还没有找到非常过心的朋友,唯一的一个老朋友昨天刚刚搬到外地上学去了,以后不知能不能联系到。——不仅没有新的朋友,连老朋友也要失去!难道这就是我的新生活的样子吗?我叹了口气。
到了家门口,站在一层,电梯还是慢慢地徘徊在最高楼层附近,真是浪费时间。我步行爬上了12层,已经累得气喘吁吁。没错,学业的压力让我很久没有锻炼了,我知道这样不好,可我似乎无能为力。我去洗澡想冲掉汗水,在镜子里发现自己曾经引以为豪的腹肌也不知何时消失了,我的腰腹有了赘肉,我很难过。
做作业吧。我需要查找一个关键概念的含义,但是老师上周发的讲义却消失在乱糟糟的文件堆里,不知去向。我只好求助于网络了,但是我的电脑总是很慢, 开机、打开浏览器、解析网页……浪费掉的时间至少占使用电脑时间的20%,可是都是零散时间,不能利用这些时间,我几乎要抓狂了!
到了这里,被一堆烦心事折磨一番后,我终于崩溃了,很可能会在这时抛下学习,着魔般地打开了某个游戏,但其实我一点也不想玩游戏,我只是心情很差。糟糕的情绪最终让我回到了拖延的怪圈。
很多读者读到这里时只留下一个印象:“这个下午真是糟糕”,却已经记不清有哪些烦心事困扰了我的这个下午。这与我的处境相似:我知道有一堆事烦着 我,但我不愿去想它们,因此我解决不了它们,于是我更烦躁。这是恶性循环。如果你对这个场景感到似曾相识,那么请继续读下去:针对坏情绪带来的问题,我开 始试着通过画图的方式来解决,最终我总结出了“情绪调节图”这个方法,利用它来对每一件烦心事进行快速的各个击破,把所有的坏心情清扫出我的大脑。
这是一张针对上述“烦恼的下午”的情绪调节图,它的绘制方法是:
1、在一张大白纸的中央位置画一个圈,写上“烦心事”;
2、在圈的周围延伸出一些“粗枝”,找出每一个让你烦扰的事件,填在这个粗枝上,用以表示你的每一个需要解决的问题;
3、从右上角的事件开始,顺时针方向逐个分析每一件事件的表现形式,也就是你认为这个事件烦人的原因(例如你认为“下周考试”是一个造成坏情绪的事 件,那它为什么是一个坏的事件呢?有的人并不因考试而担心啊!——因为“你上次没考好”,而“现在有五套模拟题没有完成”。这两个具体的原因给了你“这次 考试很烦人”的印象),把每一个具体的原因写在一根分出来的“细枝”上;
4、 现在开始总攻!这一步你要像秋风扫落叶一样地Crack掉每一个细枝上的“原因”,方法是在它旁边列出一个切实可行的解决方案,然后用方框框住每一个解决方案(方框使你在下一步对每一个行动一目了然)。
5、 调出你的GTD系统,把这张纸上所有的方框(每一个解决方案)纳入你的办事体系:放入收集篮,加入日程表,或者放进“立即行动”清单……然后,开始行动吧。
做到这里,你应达到的理想的状态是:你的心情变得很轻松,仿佛心里有一块大石头被你一点一点地敲掉了;你已经想不起来你今天遇到了哪些烦心事,也想不起来那些行动方案是针对什么事件的,但你知道你需要做的一切已经在你的GTD系统中等待着你了。
这个情绪调节图的道理何在呢?我们把每一步分析一下:
第1步:这个叫做“烦心事”的笼统概念是你此时最直观的目标:你需要提醒自己面对它,但它是不具体的;
第2步:通过这一步,你实际上把一个空虚而抽象的对手分解成了若干个切实的目标。想象一下,如果你对自己说“我 要解决我的烦心事”,你的大脑会立刻明白你究竟想做一件什么事吗?但是如果你说“我的好朋友到外地上学去了,这让我很难过,我必须从这件事中恢复过来”, 你的目标感和动力会大大增强;
第3步:从“粗枝”到“细枝”是对烦恼的进一步分解,你在这一步得到的应该是一个个难以继续分割的、造成烦恼的直接原因。
第4步:这一步应该快速完成,因为经过了你之前的努力,对每一个小事给出解决方案是很简单的。快速工作可以给你一种解脱的快乐。不要担心某个“原因”无法解决,事实上,经过了你的两次分解,再“强大”的烦恼也会变成一个简单的问题。
第5步:一旦你把每一个方框里的解决方案收入了GTD系统,你就完全不需要再考虑每一个解决方案是为了什么、与 哪一件烦心事有关。记住,这些行动方案是你刚才工作的结果,它们就是帮你脱出困境的钥匙。你要坚信:只要完成了这些解决方案,你的烦心事就会顺利地土崩瓦 解!——这是一种自信的状态,而它是最终驱赶坏情绪的清道夫。
在实施这个办法时还有两点注意事项。
1、画图的顺序是,由中间开始,向四周发散,因为这与思维顺序一致:大目标 – 小目标 – 原因 – 具体对策。
2、我推荐使用纸笔来做“情绪调节图”。本文中的图是PPT制作的,但它是用来展示的,而我为它在电脑上耗费了半个多小时,这不利于问题的解决。
停止操作
停止操作是通过向nginx进程发送信号(什么是信号请参阅linux文 章)来进行的
步骤1:查询nginx主进程号
ps -ef | grep nginx
在进程列表里 面找master进程,它的编号就是主进程号了。
步骤2:发送信号
从容停止Nginx:
kill -QUIT 主进程号
快速停止Nginx:
kill -TERM 主进程号
强制停止Nginx:
pkill -9 nginx
另外, 若在nginx.conf配置了pid文件存放路径则该文件存放的就是Nginx主进程号,如果没指定则放在nginx的logs目录下。有了pid文 件,我们就不用先查询Nginx的主进程号,而直接向Nginx发送信号了,命令如下:
kill -信号类型 '/usr/nginx/logs/nginx.pid'
平滑重启
如果更改了配置就要重启Nginx,要先关闭Nginx再打开?不是的,可以向Nginx 发送信号,平滑重启。
平滑重启命令:
kill -HUP 住进称号或进程号文件路径
或者使用
/usr/nginx/sbin/nginx -s reload
注意,修改了配置文件后最好先检查一下修改过的配置文件是否正 确,以免重启后Nginx出现错误影响服务器稳定运行。判断Nginx配置是否正确命令如下:
nginx -t -c /usr/nginx/conf/nginx.conf
或者
/usr/nginx/sbin/nginx -t
平滑升级
如果服务器正在运行的Nginx要进行升级、添加或删除模块时,我们需 要停掉服务器并做相应修改,这样服务器就要在一段时间内停止服务,Nginx可以在不停机的情况下进行各种升级动作而不影响服务器运行。
步骤1:
如 果升级Nginx程序,先用新程序替换旧程序文件,编译安装的话新程序直接编译到Nginx安装目录中。
步 骤2:执行命令
kill -USR2 旧版程序的主进程号或进程文件名
此时旧的Nginx主进程将会把自己的进程文件改名为.oldbin,然后执行新版 Nginx。新旧Nginx会同市运行,共同处理请求。
这时要逐步停止旧版 Nginx,输入命令:
kill -WINCH 旧版主进程号
慢慢旧的工作进程就都会随着任务执行完毕而退出,新版的Nginx的工作进程会逐渐取代旧版 工作进程。
此 时,我们可以决定使用新版还是恢复到旧版。
不重载配置启动新/旧工作进程
kill -HUP 旧/新版主进程号
从容关闭旧/新进程
kill -QUIT 旧/新主进程号
如果此时报错,提示还有进程没有结束就用下面命令先关闭旧/新工作进程,再关闭主进程号:
kill -TERM 旧/新工作进程号
这样下来,如果要恢复到旧版本,只需要上面的几个步 骤都是操作新版主进程号,如果要用新版本就上面的几个步骤都操作旧版主进程号就行了。
上面就是Nginx的一些基本的操作,希望以后Nginx能有更好的方法来处理这些操作, 最好是Nginx的命令而不是向Nginx进程发送系统信号。
自定义变量可能是google analytics中最复杂且最有用的一个功能。说他复杂是因为在使用自定义变量之前,需要你对所要追踪的数据和所达到的目的有清楚的规划,自定义变量靠在网站的不同页面进行单独插码来完成数据收集。说他最有用是因为通过自定义变量获得的数据可以清楚的了解访客的行为。
自定义变量与自定义访客群体
自定义变量的前身是自定义访客群体,也就是访问者报告下的用户定义的部分。自定义访客群体通过在页面或GATC中调用_setVar() 的方法来对访问者的身份进行标记。具体的工作过程是,当访问者在网站中完成了某个特定的行为时,在访问者的浏览器中创建一个_utmv的cookie,并在cookie值中定义此访问者的属性。这个属性值也会同时被记录到访问者报告下的用户定义报告中。
自定义访客群体最常见的用法是对访问者进行分类,也可以用来过滤动态IP地址。
比如:注册用户/游客;
VIP用户/购物用户/非购物用户
内部访问/(none)
由于自定义访客群体功能非常受欢迎,所以google analytics对这个功能进行了升级和扩展。将原来只能区分一个类别的版本扩展为可以分别记录5类,3个级别的高级版本:自定义变量。自定义变量可以完成所有自定义访客群体的功能。所以,google analytics建议更多的使用自定义变量来区分访问者。(自定义访客群体功能现在也依然可用,但会有一些问题,这个后面会提到。)
自定义变量功能概述
自定义变量可以让你了解到不同类别的访问者在浏览网站时进行的所有你最关注的行为。这句话有些绕口,但基本概括了自定义变量的功能。
例如:一个电子商务的网站可能会想知道:
1 20-30岁VS 30-40岁的访客哪个群体更有购买力?利润更高?
2 男性访客和女性访客在购物车的放弃率上有何差异?
3 喜欢CD的访问者也会对图书感兴趣吗?
这些都是自定义变量可以解决的问题。通过对自定义变量进行设置,我们可以在报告中清楚的看到这些数字。
自定义变量的工作原理
一个访问者可以在不同的时间多次访问网站,而在一次访问中可以浏览网站中的多个页面。 自定义变量就是按照访问者与网站的基本互动模式,将访问者和访问者与网站的互动分为三个级别。它们分别是:
访客级别—访客级别是对网站的访问者进行标记,具体的条件可以按照网站的实际需求来设置。例如:年龄,性别,学历,收入,购买记录等等。
Session级别—Session级别是在一次访问过程中,对访问者的行为或与网站的互动行为进行记录。例如:登录网站,加入收藏,加入购物车,移除产品,发表评论等等。
页面级别—页面级别也是在一次访问过程中,对访问者浏览过的页面进行记录。例如:新产品页,促销活动页,帮助页等等。
这里的页面范围可以通过页面级自定义变量进行设置。与Google analytics热门报告中的热门页面不同。例如:你可以将所有介绍新产品的页面都定义为新产品页面。
自定义变量属于“自定义类型数据”。当自定义的内容或事件被触发时,google analytics就会收到一条数据。并将数据记录在访问者报告中的自定义变量子报告中。
访客级返回数据
http://www.google-analytics.com/__utm.gif?utmwv=4.7.2&utmn=2133506401&utmhn=bluewhale.cc&utme=8(user)9(bluewhale)11(1)&utmcs=utf-8&utmsr=1280×1024&utmsc=32-bit&utmul=en-us… …
Session级返回数据
http://www.google-analytics.com/__utm.gif?utmwv=4.7.2&utmn=1548771060&utmhn=bluewhale.cc&utme=8(login)9(yes)11(2)&utmcs=utf-8&utmsr=1280×1024&utmsc=32-bit&utmul=en-us&… …
页面级返回数据
http://www.google-analytics.com/__utm.gif?utmwv=4.7.2&utmn=459118439&utmhn=bluewhale.cc&utme=8(Navigation)9(homepage)&utmcs=utf-8&utmsr=1280×1024&utmsc=32-bit&utmul=en-us&… …
其中访客级的数据会同时记录在浏览器的cookie中,当访问者下次访问网站时GATC自动读取cookie值来区分访问者属性,并针对这个属性记录访问者本次访问的浏览行为。也就是说访客级的值可以跨越不同的访次,而Session级和页面级的值只在特定的访次中有效,其中页面级的数据相当于对访次中pageviews的记录。
需要注意的几个问题
1访客级自定义变量与自定义访客群体的值都存储在_utmv cookie中,并且新值将会覆盖老值,所以两者不能同时使用。Google官方的建议是统一使用自定义变量来区分访客。
2 当访客更改访客级的自定义变量值时,页面级数据将同步更新,但Session级数据将在下个访次中才会更新。(这个是调用_setvar()方法时会产生的问题,但在新的自定义变量中并未说明具体的记录方式。)
例如:访问者在第一次访问时选择身份为CD爱好者,并被标记(_utmv cookie),当这个访问者第二次访问时在浏览了3个页面后又选择了身份为图书爱好者,并被标记(_utmv cookie)。此后该访问者继续浏览了5个页面,然后离开。那么,该访客的第二次访问时的身份将被记录为CD爱好者,在他变更身份前浏览的三个页面会被记录到CD爱好者身份下,而变更身份后浏览的5个页面将被记录到图书爱好者的身份下。所以,在选择区分访客类型时要尽量选择不易变更的属性,例如性别,职业等等。
3自定义变量分为三个基本,并通过代码中的数字进行标识。没有标识数字被默认为为页面级自定义变量。
4对于单一页面,最多只能设置5个自定义变量。可以是访客级,Session级或页面级的。但访客级的会覆盖cookie中原有的值。
5对自定义变量中设置的类别名称和值的长度不能超过64个字节。
自定义变量的实施
_setCustomVar(index, name, value, opt_scope)
_setCustomVar(类别, 自定变量名称, 自定义变量值, 自定义变量范围)
Index—自定义变量的类别,可以设置的范围是1-5
Name—自定义变量的名称,名称与值相对应。这里设置的内容将出现在自定义变量报告的最高一级。
Value—自定义变量的值,这个值与名称应该成对出现。通常一个名称可以对应很多个值。例如:当名称为性别时,对应的值就应该是男,女,两个值。
opt_scope—自定义变量的范围,可以设置的范围是1-3。其中1表示访客级别,2表示会话级别,3表示页面级别。为空时默认表示页面级别。
实施前的准备工作
自定义变量是否能追踪到数据,能追踪到哪些数据完全取决于之前的设置。简单的说就是,你关心哪些内容和行为,就对他们进行插码追踪。如果事先没有插码,就不会有任何数据。所以,在实施前就需要对网站结构和关心的内容进行整理。例如:访客类别划分,网站内容划分,所要关注的行为等等。有些时候为了获得准确的数据,还需要对网站的内容进行调整。在经过详细的规划后才有可能获得理想的数据。
三种插码实施的方法
根据网站的情况和追踪访问者行为的差异,可以使用三种不同的方法在网站的不同页面中添加自定义变量的追踪代码。
1在GATC代码中直接添加自定义变量的代码。这种方法实施起来比较简单,只需要在异步代码中增加一行自定义变量代码就可以了,但当遇到一些不需要追踪的页面时就会比较麻烦(当他们使用同一页底模板时)。如果你需要对整站应用自定义变量时,或者追踪页面有自己单独的页底模板时,可以考虑使用这种方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<!--GA tracking code begin-->
<script type= "text/javascript" >
var _gaq = _gaq || [];
_gaq.push([ '_setAccount' , 'UA-12347890-1' ]);
_gaq.push([ '_setCustomVar' , 1 , 'user' , 'bluewhale' , 1 ]);
_gaq.push([ '_trackPageview' ]);
( function () {
var ga = document.createElement( 'script' ); ga.type = 'text/javascript' ; ga.async = true ;
ga.src = 'http://www.google-analytics.com/ga.js' ;
var s = document.getElementsByTagName( 'script' )[ 0 ]; s.parentNode.insertBefore(ga, s);
})();
</script>
<!--GA tracking code end-->
|
2 如果第一种方法不适合的话,可以使用这种方法。在要追踪页面的GATC后单独添加自定义变量的代码。
1
2
3
4
|
<script type=”text/javascript”>
_gaq.push([ '_setCustomVar' , 1 , 'user' , 'bluewhale' , 1 ]);
_gaq.push([ '_trackPageview' ]);
</script>
|
3第三种方法比较灵活,可以追踪到一些页面元素或访问者的具体行为。例如:页面加载,点击,鼠标悬停,等等。实施方法和虚拟页面类似,在访问者产生点击行为时调用自定义变量。
1
|
<a href= "http://bluewhale.cc" onClick= "javascript:_gaq.push(['_setCustomVar', 1,'user','bluewhale',1]);_gaq.push(['_trackPageview']);" >
|
查看自定义变量数据
自定义变量的数据被记录在访问者报告下的自定义变量子报告中,报告的第一级显示的是所有自定义的自定义变量名称。选择变量名称可以查看不同值的数据。例如:在第一级报告中选择登录,下一级报告中将分别显示登录与未登录访次的数据。
与自定义报告配合使用
除了在自定义变量里查看数据外,还可以使用自定义报告创建报告。在自定义报告中,可以对不同类别的自定义变量名称或值创建报告,并且可以使用时间和来源子纬度对自定义变量的值进行细分。
除了自定义报告,自定义变量同样可以和高级群体配合使用。使用高级群体可以对一类访问者或者有同一行为的访次进行过滤。并与其他访次进行对比。下面截图中创建了登录访次的高级群体。
然后在报告中应用这个高级群体,并与所有访次的数据进行对比。按照这个方式同样还可以创建更多的高级群体,不过这都取决的于之前对自定义变量的设置。
Google Analytics自定义变量的功能太强大了,一篇文章只能说个大概。也许你已经对这个功能有了很好的使用心得了。那么请给我留言吧。让我们一起分享下。
DataTables(http://www.datatables.net/)应该是我到目前为止见过的,功能最强大的表格解决方案(当然,不计算其它整套框架中的table控件在内)。
先把它主页上写的特性翻译罗列如下:
- 可变长度分页;
- 动态过滤;
- 多列排序,带数据类型检测功能;
- 列宽度的智能处理;
- 从多种数据源获取数据(DOM,js Array, ajax file, server-side returning);
- 滚动配置属性;
- 完整国际化支持;
- jquery UI ThemeRoller支持;
- 经历了个2600多个单元测试,相当牢固;
- 有为数不少的插件支持;
- 免费的;
- 状态保存能力;
- 支持隐藏列;
- 动态创建表格的能力;
- 自动ajax数据加载;
- 自定义DOM位置;
- 单列过滤(这个与前面的过滤有区别么?);
- 多种分页器;
- 无损的DOM交互;
- 参与排序的列高亮;
- 高级数据源配置;
- 扩展的插件支持功能;
- 可以用css完全配置表象;
- 丰富的文档;
- 110多个例子;
- 对Adobe AIR的完全支持。
引入
使用
- $(document).ready(function(){
- $('#example').dataTable();
- });
-
-
- $(document).ready(function(){
- $('#example').dataTable({
- "bInfo": false
- });
- });
要注意的是,要被dataTable处理的table对象,必须有thead与tbody,而且,结构要规整(数据不一定要完整),这样才能正确处理。
以下是在进行dataTable绑定处理时候可以附加的参数:
属性名称 |
取值范围 |
解释 |
bAutoWidth |
true or false, default true |
是否自动计算表格各列宽度 |
bDeferRender |
true or false, default false |
用于渲染的一个参数 |
bFilter |
true or false, default true |
开关,是否启用客户端过滤功能 |
bInfo |
true or false, default true |
开关,是否显示表格的一些信息 |
bJQueryUI |
true or false, default false |
是否使用jquery ui themeroller的风格 |
bLengthChange |
true or false, default true |
开关,是否显示一个每页长度的选择条(需要分页器支持) |
bPaginate |
true or false, default true |
开关,是否显示(使用)分页器 |
bProcessing |
true or false, defualt false |
开关,以指定当正在处理数据的时候,是否显示“正在处理”这个提示信息 |
bScrollInfinite |
true or false, default false |
开关,以指定是否无限滚动(与sScrollY配合使用),在大数据量的时候很有用。当这个标志为true的时候,分页器就默认关闭 |
bSort |
true or false, default true |
开关,是否让各列具有按列排序功能 |
bSortClasses |
true or false, default true |
开关,指定当当前列在排序时,是否增加classes 'sorting_1', 'sorting_2' and 'sorting_3',打开后,在处理大数据时,性能有所损失 |
bStateSave |
true or false, default false |
开关,是否打开客户端状态记录功能。这个数据是记录在cookies中的,打开了这个记录后,即使刷新一次页面,或重新打开浏览器,之前的状态都是保存下来的 |
sScrollX |
'disabled' or '100%' 类似的字符串 |
是否开启水平滚动,以及指定滚动区域大小 |
sScrollY |
'disabled' or '200px' 类似的字符串 |
是否开启垂直滚动,以及指定滚动区域大小 |
-- |
-- |
-- |
选项 |
|
|
aaSorting |
array array[int,string], 如[], [[0,'asc'], [0,'desc']] |
指定按多列数据排序的依据 |
aaSortingFixed |
同上 |
同上。唯一不同点是不能被用户的自定义配置冲突 |
aLengthMenu |
default [10, 25, 50, 100],可以为一维数组,也可为二维数组,比如:[[10, 25, 50, -1], [10, 25, 50, "All"]] |
这个为选择每页的条目数,当使用一个二维数组时,二维层面只能有两个元素,第一个为显示每页条目数的选项,第二个是关于这些选项的解释 |
aoSearchCols |
default null, 类似:[null, {"sSearch": "My filter"}, null,{"sSearch": "^[0-9]", "bEscapeRegex": false}] |
给每个列单独定义其初始化搜索列表特性(这一块还没搞懂) |
asStripClasses |
default ['odd', 'even'], 比如['strip1', 'strip2', 'strip3'] |
指定要被应用到各行的class风格,会自动循环 |
bDestroy |
true or false, default false |
用于当要在同一个元素上执行新的dataTable绑定时,将之前的那个数据对象清除掉,换以新的对象设置 |
bRetrieve |
true or false, default false |
用于指明当执行dataTable绑定时,是否返回DataTable对象 |
bScrollCollapse |
true or false, default false |
指定适当的时候缩起滚动视图 |
bSortCellsTop |
true or false, default false |
(未知的东东) |
iCookieDuration |
整数,默认7200,单位为秒 |
指定用于存储客户端信息到cookie中的时间长度,超过这个时间后,自动过期 |
iDeferLoading |
整数,默认为null |
延迟加载,它的参数为要加载条目的数目,通常与bServerSide,sAjaxSource等配合使用 |
iDisplayLength |
整数,默认为10 |
用于指定一屏显示的条数,需开启分页器 |
iDisplayStart |
整数,默认为0 |
用于指定从哪一条数据开始显示到表格中去 |
iScrollLoadGap |
整数,默认为100 |
用于指定当DataTable设置为滚动时,最多可以一屏显示多少条数据 |
oSearch |
默认{ "sSearch": "", "bRegex": false, "bSmart": true } |
又是初始时指定搜索参数相关的,有点复杂,没搞懂目前 |
sAjaxDataProp |
字符串,default 'aaData' |
指定当从服务端获取表格数据时,数据项使用的名字 |
sAjaxSource |
URL字符串,default null |
指定要从哪个URL获取数据 |
sCookiePrefix |
字符串,default 'SpryMedia_DataTables_' |
当打开状态存储特性后,用于指定存储在cookies中的字符串的前缀名字 |
sDom |
default lfrtip (when bJQueryUI is false) or <"H"lfr>t<"F"ip> (when bJQueryUI is true) |
这是用于定义DataTable布局的一个强大的属性,另开专门文档来补充说明吧 |
sPaginationType |
'full_numbers' or 'two_button', default 'two_button' |
用于指定分页器风格 |
sScrollXInner |
string default 'disabled' |
又是水平滚动相关的,没搞懂啥意思 |
DataTable支持如下回调函数
回调函数名称 |
参数 |
返回值 |
默认 |
功能 |
fnCookieCallback |
1.string: Name of the cookie defined by DataTables 2.object: Data to be stored in the cookie 3.string: Cookie expires string 4.string: Path of the cookie to set |
string: cookie formatted string (which should be encoded by using encodeURIComponent()) |
null |
当每次cookies改变时,会触发这个函数调用 |
fnDrawCallback |
无 |
无 |
无 |
在每次table被draw完后调用,至于做什么就看着办吧 |
fnFooterCallback |
1.node : "TR" element for the footer 2.array array strings : Full table data (as derived from the original HTML) 3.int : Index for the current display starting point in the display array< 4.int : Index for the current display ending point in the display array 5.array int : Index array to translate the visual position to the full data array |
无 |
无 |
用于在每次重画的时候修改表格的脚部 |
fnFormatNumber |
1.int : number to be formatted |
String : formatted string for DataTables to show the number |
有默认的 |
用于在大数字上,自动加入一些逗号,分隔开 |
fnHeaderCallback |
1.node : "TR" element for the header 2.array array strings : Full table data (as derived from the original HTML) 3.int : Index for the current display starting point in the display array 4.int : Index for the current display ending point in the display array 5.array int : Index array to translate the visual position to the full data array |
无 |
无 |
用于在每次draw发生时,修改table的header |
fnInfoCallback |
1.object: DataTables settings object 2.int: Starting position in data for the draw 3.int: End position in data for the draw 4.int: Total number of rows in the table (regardless of filtering) 5.int: Total number of rows in the data set, after filtering 6.string: The string that DataTables has formatted using it's own rules |
string: The string to be displayed in the information element. |
无 |
用于传达table信息 |
fnInitComplete |
1.object:oSettings - DataTables settings object |
无 |
无 |
表格初始化完成后调用 |
fnPreDrawCallback |
1.object:oSettings - DataTables settings object |
Boolean |
无 |
用于在开始绘制之前调用,返回false的话,会阻止draw事件发生;返回其它值,draw可以顺利执行 |
fnRowCallback |
1.node : "TR" element for the current row 2.array strings : Raw data array for this row (as derived from the original HTML) 3.int : The display index for the current table draw 4.int : The index of the data in the full list of rows (after filtering) |
node : "TR" element for the current row |
无 |
当创建了行,但还未绘制到屏幕上的时候调用,通常用于改变行的class风格 |
fnServerData |
1.string: HTTP source to obtain the data from (i.e. sAjaxSource) 2.array objects: A key/value pair object containing the data to send to the server 3.function: Function to be called on completion of the data get process that will draw the data on the page. |
void |
$.getJSON |
用于替换默认发到服务端的请求操作 |
fnStateLoadCallback |
1.object:oSettings - DataTables settings object 2.object:oData - Object containing information retrieved from the state saving cookie which should be restored. For the exact properties please refer to the DataTables code. |
Boolean - false if the state should not be loaded, true otherwise |
无 |
在cookies中的数据被加载前执行,可以方便地修改这些数据 |
fnStateSaveCallback |
1.object:oSettings - DataTables settings object 2.String:sValue - a JSON string (without the final closing brace) which should be stored in the state saving cookie. |
String - the full string that should be used to save the state |
无 |
在状态数据被存储到cookies前执行,可以方便地做一些预操作 |
在做后台的时候并没有美工和前端工程师来配合你做页面,为了显示数据并有一定的美感,我们可以使用jQuery的DataTables插件来帮助我们完成任务
1、DataTables的默认配置
$(document).ready(function() {
$('#example').dataTable();
} );
示例:http://www.guoxk.com/html/DataTables/Zero-configuration.html
2、DataTables的一些基础属性配置
"bPaginate": true, //翻页功能
"bLengthChange": true, //改变每页显示数据数量
"bFilter": true, //过滤功能
"bSort": false, //排序功能
"bInfo": true,//页脚信息
"bAutoWidth": true//自动宽度
示例:http://www.guoxk.com/html/DataTables/Feature-enablement.html
3、数据排序
$(document).ready(function() {
$('#example').dataTable( {
"aaSorting": [
[ 4, "desc" ]
]
} );
} );
从第0列开始,以第4列倒序排列
示例:http://www.guoxk.com/html/DataTables/Sorting-data.html
4、多列排序
示例:http://www.guoxk.com/html/DataTables/Multi-column-sorting.html
5、隐藏某些列
$(document).ready(function() {
$('#example').dataTable( {
"aoColumnDefs": [
{ "bSearchable": false, "bVisible": false, "aTargets": [ 2 ] },
{ "bVisible": false, "aTargets": [ 3 ] }
] } );
} );
示例:http://www.guoxk.com/html/DataTables/Hidden-columns.html
6、改变页面上元素的位置
$(document).ready(function() {
$('#example').dataTable( {
"sDom": '<"top"fli>rt<"bottom"p><"clear">'
} );
} );
//l- 每页显示数量
//f - 过滤输入
//t - 表单Table
//i - 信息
//p - 翻页
//r - pRocessing
//< and > - div elements
//<"class" and > - div with a class
//Examples: <"wrapper"flipt>, <lf<t>ip>
示例:http://www.guoxk.com/html/DataTables/DOM-positioning.html
7、状态保存,使用了翻页或者改变了每页显示数据数量,会保存在cookie中,下回访问时会显示上一次关闭页面时的内容。
$(document).ready(function() {
$('#example').dataTable( {
"bStateSave": true
} );
} );
示例:http://www.guoxk.com/html/DataTables/State-saving.html
8、显示数字的翻页样式
$(document).ready(function() {
$('#example').dataTable( {
"sPaginationType": "full_numbers"
} );
} );
示例:http://www.guoxk.com/html/DataTables/Alternative-pagination-styles.html
9、水平限制宽度
$(document).ready(function() {
$('#example').dataTable( {
"sScrollX": "100%",
"sScrollXInner": "110%",
"bScrollCollapse": true
} );
} );
示例:http://www.guoxk.com/html/DataTables/Horizontal.html
10、垂直限制高度
示例:http://www.guoxk.com/html/DataTables/Vertical.html
11、水平和垂直两个方向共同限制
示例:http://www.guoxk.com/html/DataTables/HorizontalVerticalBoth.html
12、改变语言
$(document).ready(function() {
$('#example').dataTable( {
"oLanguage": {
"sLengthMenu": "每页显示 _MENU_ 条记录",
"sZeroRecords": "抱歉, 没有找到",
"sInfo": "从 _START_ 到 _END_ /共 _TOTAL_ 条数据",
"sInfoEmpty": "没有数据",
"sInfoFiltered": "(从 _MAX_ 条数据中检索)",
"oPaginate": {
"sFirst": "首页",
"sPrevious": "前一页",
"sNext": "后一页",
"sLast": "尾页"
},
"sZeroRecords": "没有检索到数据",
"sProcessing": "<img src='./loading.gif' />"
}
} );
} );
示例:http://www.guoxk.com/html/DataTables/Change-language-information.html
13、click事件
示例:http://www.guoxk.com/html/DataTables/event-click.html
14/配合使用tooltip插件
示例:http://www.guoxk.com/html/DataTables/tooltip.html
15、定义每页显示数据数量
$(document).ready(function() {
$('#example').dataTable( {
"aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]]
} );
} );
示例:http://www.guoxk.com/html/DataTables/length_menu.html
16、row callback
示例:http://www.guoxk.com/html/DataTables/RowCallback.html
最后一列的值如果为“A”则加粗显示
17、排序控制
$(document).ready(function() {
$('#example').dataTable( {
"aoColumns": [
null,
{ "asSorting": [ "asc" ] },
{ "asSorting": [ "desc", "asc", "asc" ] },
{ "asSorting": [ ] },
{ "asSorting": [ ] }
]
} );
} );
示例:http://www.guoxk.com/html/DataTables/sort.html
说明:第一列点击按默认情况排序,第二列点击已顺序排列,第三列点击一次倒序,二三次顺序,第四五列点击不实现排序
18、从配置文件中读取语言包
$(document).ready(function() {
$('#example').dataTable( {
"oLanguage": {
"sUrl": "cn.txt"
}
} );
} );
19、是用ajax源
$(document).ready(function() {
$('#example').dataTable( {
"bProcessing": true,
"sAjaxSource": './arrays.txt'
} );
} );
示例:http://www.guoxk.com/html/DataTables/ajax.html
20、使用ajax,在服务器端整理数据
$(document).ready(function() {
$('#example').dataTable( {
"bProcessing": true,
"bServerSide": true,
"sPaginationType": "full_numbers",
"sAjaxSource": "./server_processing.php",
/*如果加上下面这段内容,则使用post方式传递数据
"fnServerData": function ( sSource, aoData, fnCallback ) {
$.ajax( {
"dataType": 'json',
"type": "POST",
"url": sSource,
"data": aoData,
"success": fnCallback
} );
}*/
"oLanguage": {
"sUrl": "cn.txt"
},
"aoColumns": [
{ "sName": "platform" },
{ "sName": "version" },
{ "sName": "engine" },
{ "sName": "browser" },
{ "sName": "grade" }
]//$_GET['sColumns']将接收到aoColumns传递数据
} );
} );
示例:http://www.guoxk.com/html/DataTables/ajax-serverSide.html
21、为每行加载id和class
服务器端返回数据的格式:
{
"DT_RowId": "row_8",
"DT_RowClass": "gradeA",
"0": "Gecko",
"1": "Firefox 1.5",
"2": "Win 98+ / OSX.2+",
"3": "1.8",
"4": "A"
},
示例:http://www.guoxk.com/html/DataTables/add_id_class.html
22、为每行显示细节,点击行开头的“+”号展开细节显示
示例:http://www.guoxk.com/html/DataTables/with-row-information.html
23、选择多行
示例:http://www.guoxk.com/html/DataTables/selectRows.html
22、集成jQuery插件jEditable
示例:http://www.guoxk.com/html/DataTables/jEditable-integration.html
示例打包下载:http://www.guoxk.com/html/DataTables/DataTables.rar
本文会给你们展示50个jquery代码片段,这些代码能够给你的javascript项目提供帮助。其中的一些代码段是从jQuery1.4.2才开始支持的做法,另一些则是真正有用的函数或方法,他们能够帮助你又快又好地把事情完成。这些都是我尽量记住的有着最佳性能的代码段,因此如果你发现你任何可以做得更好的地方的话,欢迎把你的版本粘贴在评论中!我希望你在这一文章中能找到有帮助的东西。
1. 如何创建嵌套的过滤器:
-
-
-
-
- .filter(":not(:has(.selected))")
2. 如何重用元素搜索
-
var allItems = $("div.item");
- var keepList = $("div#container1 div.item");
-
-
-
- < DIV >class names:
- $(formToLookAt + " input:checked").each(function() {
- keepList = keepList.filter("." + $(this).attr("name"));
- });
- < /DIV>
3. 任何使用has()来检查某个元素是否包含某个类或是元素:
-
-
-
- $("input").has(".email").addClass("email_icon");
4. 如何使用jQuery来切换样式表
-
- $('link[media='screen']').attr('href', 'Alternative.css');
5. 如何限制选择范围(基于优化目的):
-
-
-
-
-
- var in_stock = $('#shopping_cart_items input.is_in_stock'); <ul id="shopping_cart_items"> <li><input type="radio" value="Item-X" name="item" class="is_in_stock" /> Item X</li> <li><input type="radio" value="Item-Y" name="item" class="3-5_days" /> Item Y</li> <li><input type="radio" value="Item-Z" name="item" class="unknown" /> Item Z</li> </ul>
6. 如何正确地使用ToggleClass:
-
-
-
- a.hasClass('blueButton') ? a.removeClass('blueButton') : a.addClass('blueButton');
-
- a.toggleClass('blueButton');
7. 如何设置IE特有的功能:
-
if ($.browser.msie) {
-
- }
8. 如何使用jQuery来代替一个元素:
-
$('#thatdiv').replaceWith('fnuh');
9. 如何验证某个元素是否为空:
-
if ($('#keks').html()) {
-
- }
10. 如何从一个未排序的集合中找出某个元素的索引号
-
$("ul > li").click(function () {
- var index = $(this).prevAll().length;
- });
11. 如何把函数绑定到事件上:
-
$('#foo').bind('click', function() {
- alert('User clicked on "foo."');
- });
12. 如何追加或是添加html到元素中:
-
$('#lal').append('sometext');
13. 在创建元素时,如何使用对象字面量(literal)来定义属性
-
var e = $("", { href: "#", class: "a-class another-class", title: "..." });
14. 如何使用多个属性来进行过滤
-
-
- var elements = $('#someid input[type=sometype][value=somevalue]').get();
15. 如何使用jQuery来预加载图像:
-
jQuery.preloadImages = function() {
- for(var i = 0; i < arguments.length; i++) {
- $("<img />").attr('src', arguments[i]);
- }
- };
-
- $.preloadImages('image1.gif', '/path/to/image2.png', 'some/image3.jpg');
16. 如何为任何与选择器相匹配的元素设置事件处理程序:
-
$('button.someClass').live('click', someFunction);
-
-
-
-
- $("table").each(function(){
- $("td", this).live("hover", function(){
- $(this).toggleClass("hover");
- });
- });
-
- $("table").delegate("td", "hover", function(){
- $(this).toggleClass("hover");
- });
17. 如何找到一个已经被选中的option元素:
-
$('#someElement').find('option:selected');
18. 如何隐藏一个包含了某个值文本的元素:
-
$("p.value:contains('thetextvalue')").hide();
19. 如果自动滚动到页面中的某区域
-
jQuery.fn.autoscroll = function(selector) {
- $('html,body').animate(
- {scrollTop: $(selector).offset().top},
- 500
- };
- }
-
- $('.area_name').autoscroll();
20. 如何检测各种浏览器:
-
检测Safari (if( $.browser.safari)),
- 检测IE6及之后版本 (if ($.browser.msie && $.browser.version > 6 )),
- 检测IE6及之前版本 (if ($.browser.msie && $.browser.version <= 6 )),
- 检测FireFox 2及之后版本 (if ($.browser.mozilla && $.browser.version >= '1.8' ))
21. 如何替换串中的词
-
var el = $('#id');
- el.html(el.html().replace(/word/ig, ''));
22. 如何禁用右键单击上下文菜单:
-
$(document).bind('contextmenu',function(e){
- return false;
- });
23. 如何定义一个定制的选择器
-
$.expr[':'].mycustomselector = function(element, index, meta, stack){
-
-
-
-
-
-
-
- $('.someClasses:test').doSomething();
24. 如何检查某个元素是否存在
-
if ($('#someDiv').length) {
-
- }
25. 如何使用jQuery来检测右键和左键的鼠标单击两种情况:
-
$("#someelement").live('click', function(e) {
- if( (!$.browser.msie && e.button == 0) || ($.browser.msie && e.button == 1) ) {
- alert("Left Mouse Button Clicked");
- } else if(e.button == 2) {
- alert("Right Mouse Button Clicked");
- }
- });
26. 如何显示或是删除input域中的默认值
-
-
-
- wap_val = [];
- $(".swap").each(function(i){
- wap_val[i] = $(this).val();
- $(this).focusin(function(){
- if ($(this).val() == swap_val[i]) {
- $(this).val("");
- }
- }).focusout(function(){
- if ($.trim($(this).val()) == "") {
- $(this).val(swap_val[i]);
- }
- });
- });
27. 如何在一段时间之后自动隐藏或关闭元素(支持1.4版本):
-
- setTimeout(function() {
- $('.mydiv').hide('blind', {}, 500)
- }, 5000);
-
- $(".mydiv").delay(5000).hide('blind', {}, 500);
28. 如何把已创建的元素动态地添加到DOM中:
-
var newDiv = $('');
- newDiv.attr('id','myNewDiv').appendTo('body');
29. 如何限制“Text-Area”域中的字符的个数:
-
jQuery.fn.maxLength = function(max){
- this.each(function(){
- var type = this.tagName.toLowerCase();
- var inputType = this.type? this.type.toLowerCase() : null;
- if(type == "input" && inputType == "text" || inputType == "password"){
-
- this.maxLength = max;
- }
- else if(type == "textarea"){
- this.onkeypress = function(e){
- var ob = e || event;
- var keyCode = ob.keyCode;
- var hasSelection = document.selection? document.selection.createRange().text.length > 0 : this.selectionStart != this.selectionEnd;
- return !(this.value.length >= max && (keyCode > 50 || keyCode == 32 || keyCode == 0 || keyCode == 13) && !ob.ctrlKey && !ob.altKey && !hasSelection);
- };
- this.onkeyup = function(){
- if(this.value.length > max){
- this.value = this.value.substring(0,max);
- }
- };
- }
- });
- };
-
- $('#mytextarea').maxLength(500);
30. 如何为函数创建一个基本的测试
-
- module("Module B");
- test("some other test", function() {
-
- expect(2);
-
- equals( true, false, "failing test" );
- equals( true, true, "passing test" );
- });
31. 如何在jQuery中克隆一个元素:
-
var cloned = $('#somediv').clone();
32. 在jQuery中如何测试某个元素是否可见
-
if($(element).is(':visible') == 'true') {
-
- }
33. 如何把一个元素放在屏幕的中心位置:
-
jQuery.fn.center = function () {
- this.css('position','absolute');
- this.css('top', ( $(window).height() - this.height() ) / +$(window).scrollTop() + 'px');
- this.css('left', ( $(window).width() - this.width() ) / 2+$(window).scrollLeft() + 'px');
- return this;
- }
-
- $(element).center();
34. 如何把有着某个特定名称的所有元素的值都放到一个数组中:
-
var arrInputValues = new Array();
- $("input[name='table[]']").each(function(){
- arrInputValues.push($(this).val());
- });
35. 如何从元素中除去HTML
-
(function($) {
- $.fn.stripHtml = function() {
- var regexp = /<("[^"]*"|'[^']*'|[^'">])*>/gi;
- this.each(function() {
- $(this).html( $(this).html().replace(regexp,”") );
- });
- return $(this);
- }
- })(jQuery);
-
- $('p').stripHtml();
36. 如何使用closest来取得父元素:
-
$('#searchBox').closest('div');
37. 如何使用Firebug和Firefox来记录jQuery事件日志:
-
-
- $('#someDiv').hide().log('div hidden').addClass('someClass');
- jQuery.log = jQuery.fn.log = function (msg) {
- if (console){
- console.log("%s: %o", msg, this);
- }
- return this;
- };
38. 如何强制在弹出窗口中打开链接:
-
jQuery('a.popup').live('click', function(){
- newwindow=window.open($(this).attr('href'),'','height=200,width=150');
- if (window.focus) {
- newwindow.focus();
- }
- return false;
- });
39. 如何强制在新的选项卡中打开链接:
-
jQuery('a.newTab').live('click', function(){
- newwindow=window.open($(this).href);
- jQuery(this).target = "_blank";
- return false;
- });
40. 在jQuery中如何使用.siblings()来选择同辈元素
-
- $('#nav li').click(function(){
- $('#nav li').removeClass('active');
- $(this).addClass('active');
- });
-
- $('#nav li').click(function(){
- $(this).addClass('active').siblings().removeClass('active');
- });
41. 如何切换页面上的所有复选框:
-
var tog = false;
-
- $('a').click(function() {
- $("input[type=checkbox]").attr("checked",!tog);
- tog = !tog;
- });
42. 如何基于一些输入文本来过滤一个元素列表:
-
-
- $('.someClass').filter(function() {
- return $(this).attr('value') == $('input#someId').val();
- })
43. 如何获得鼠标垫光标位置x和y
-
$(document).ready(function() {
- $(document).mousemove(function(e){
- $(’#XY’).html(”X Axis : ” + e.pageX + ” | Y Axis ” + e.pageY);
- });
- });
44. 如何把整个的列表元素(List Element,LI)变成可点击的
-
$("ul li").click(function(){
- window.location=$(this).find("a").attr("href");
- return false;
- });
-
<ul>
- <li><a href="#">Link 1</a></li>
- <li><a href="#">Link 2</a></li>
- <li><a href="#">Link 3</a></li>
- <li><a href="#">Link 4</a></li>
- </ul>
45. 如何使用jQuery来解析XML(基本的例子):
-
function parseXml(xml) {
-
- $(xml).find("Tutorial").each(function() {
- $("#output").append($(this).attr("author") + "");
- });
- }
46. 如何检查图像是否已经被完全加载进来
-
$('#theImage').attr('src', 'image.jpg').load(function() {
- alert('This Image Has Been Loaded');
- });
47. 如何使用jQuery来为事件指定命名空间:
-
- $('input').bind('blur.validation', function(e){
-
- });
-
- $('input').data('validation.isValid', true);
48. 如何检查cookie是否启用
-
var dt = new Date();
- dt.setSeconds(dt.getSeconds() + 60);
- document.cookie = "cookietest=1; expires=" + dt.toGMTString();
- var cookiesEnabled = document.cookie.indexOf("cookietest=") != -1;
- if(!cookiesEnabled) {
-
- }
49. 如何让cookie过期:
-
var date = new Date();
- date.setTime(date.getTime() + (x * 60 * 1000));
- $.cookie('example', 'foo', { expires: date });
50. 如何使用一个可点击的链接来替换页面中任何的URL
-
$.fn.replaceUrl = function() {
- var regexp = /((ftp|http|https)://(w+:{0,1}w*@)?(S+)(:[0-9]+)?(/|/([w#!:.?+=&%@!-/]))?)/gi;
- this.each(function() {
- $(this).html(
- $(this).html().replace(regexp,'<a href="$1">$1</a>‘)
- );
- });
- return $(this);
- }
-
- $('p').replaceUrl();
PDCA循环是能使任何一项活动有效进行的一种合乎逻辑的工作程序,特别是在质量管理中得到了广泛的应用并获得了经济成效。P、D、C、A四个英文字母所代表的意义如下:
① P(Plan)——计划。包括方针和目标的确定以及活动计划的制定;
② D(DO)——执行。执行就是具体运作,实现计划中的内容;
③ C(Check)——检查。就是要总结执行计划的结果,分清哪些对了,哪些错了,明确效果,找出问题;
④A(Action)——处理。对检查的结果进行处理,认可或否定。成功的经验要加以肯定,或者模式化或者标准化以适当推广;失败的教训要加以总结,以免重现;这一轮未解决的问题放到下一个PDCA循环。
1.P阶段
即根据顾客的要求和组织的方针,为提供结果建立必要的目标和过程。
步骤一:选择课题
新产品设计开发所选择的课题范围是以满足市场需求为前提,以企业获利为目标的。同时也需要根据企业的资源、技术等能力来确定开发方向。
课题是本次研究活动的切入点,课题的选择很重要,如果不进行市场调研,论证课题的可行性,就可能带来决策上的失误,有可能在投人大量人力、物力后造成设计开发的失败。比如:一个企业如果对市场发展动态信息缺少灵敏性,可能花大力气开发的新产品,在另一个企业已经是普通产品,就会造成人力、物力、财力的浪费。选择一个合理的项目课题可以减少研发的失败率,降低新产品投资的风险。选择课题时可以使用调查表、排列图、水平对比等方法,使头脑风暴能够结构化呈现较直观的信息,从而做出合理决策。
步骤二:设定目标
明确了研究活动的主题后,需要设定一个活动目标,也就是规定活动所要做到的内容和达到的标准。目标可以是定性+定量化的,能够用数量来表示的指标要尽可能量化,不能用数量来表示的指标也要明确。目标是用来衡量实验效果的指标,所以设定应该有依据,要通过充分的现状调查和比较来获得。例如:一种新药的开发必须掌握了解政府部门所制定的新药审批政策和标准。制订目标时可以使用关联图、因果图来系统化的揭示各种可能之间的联系,同时使用甘特图来制定计划时间表,从而可以确定研究进度并进行有效的控制。
步骤三:提出各种方案并确定最佳方案
创新并非单纯指发明创造的创新产品,还可以包括产品革新、产品改进和产品仿制等。其过程就是设立假说,然后去验证假说,目的是从影响产品特性的一些因素中去寻找出好的原料搭配、好的工艺参数搭配和工艺路线。然而现实条件中不可能把所有想到的实验方案都进行实施,所以提出各种方案后优选并确定出最佳的方案是较有效率的方法。
筛选出所需要的最佳方案,统计质量工具能够发挥较好的作用。正交试验设计法、矩阵图都是进行多方案设计中效率高、效果好的工具方法。
步骤四:制定对策
有了好的方案,其中的细节也不能忽视,计划的内容如何完成好,需要将方案步骤具体化,逐一制定对策,明确回答出方案中的“5W1H”即:为什么制定该措施(Why)?达到什么目标(What)?在何处执行(Where)?由谁负责完成(Who)?什么时间完成(When)?如何完成(How)?使用过程决策程序图或流程图,方案的具体实施步骤将会得到分解。
2.D阶段
即按照预定的计划,在实施的基础上,努力实现预期目标的过程。
步骤五:实施对策
对策制定完成后就进人了实验、验证阶段也就是做的阶段。在这一阶段除了按计划和方案实施外,还必须要对过程进行测量,确保工作能够按计划进度实施。同时建立起数据采集,收集起过程的原始记录和数据等项目文档。
3.C检查效果
即确认实施方案是否达到了目标。
步骤六:效果检查。
方案是否有效、目标是否完成,需要进行效果检查后才能得出结论。将采取的对策进行确认后,对采集到的证据进行总结分析,把完成情况同目标值进行比较,看是否达到了预定的目标。如果没有出现预期的结果时,应该确认是否严格按照计划实施对策,如果是,就意味着对策失败,那就要重新进行最佳方案的确定。
4.A阶段处置
步骤七:标准化。
对已被证明的有成效的措施,要进行标准化,制定成工作标准,以便以后的执行和推广。
步骤八:问题总结。
对于方案效果不显著的或者实施过程中出现的问题,进行总结,为开展新一轮的PDCA循环提供依据。例如:设计一个新型红外滤光膜,完成一轮循环后,进行效果检查时发现其中一项的光学性能指标未达到标准要求,总结经验后进人第二轮PDCA循环,按计划重新实施后达到了目标值。