如何编写grunt 插件

也许现有的grunt plugin无法满足你的需求,那就只能自己写一个plugin。

准备工作:

一、 当然首先是查一下plugin的API文档及模板。grunt的API比较少,但是已经包含了大部分的基础功能了。如常用的文件读取,log输出等。

相关前期文档可以查看:

http://www.gruntjs.net/docs/creating-plugins/ 
http://www.gruntjs.net/api/grunt.file/

二、 创建项目环境。

看完文档之后,接下来就得开始编写项目了,还好grunt已经为我们准备了标准的plugin模板,我们通过git命令下载回来后直接修改。然后就可以进入插件开发。

项目创建流程如下:

vIfyie

1、通过 npm install -g grunt-init 命令安装 grunt-init 。 
2、通过 git clone git://github.com/gruntjs/grunt-init-gruntplugin.git ~/.grunt-init/gruntplugin 命令安装grunt插件模版。 
3、在一个空的目录中执行 grunt-init gruntplugin 。 
执行这一步时,会出现如下问答式的内容。根据自己需要填写好就会创建出相应的项目所需文件。 
当然,如果你还不清楚这些怎么填写,也可以随便写一下,日后也可以直接修改配置文件。 

4、执行 npm install 命令以准备开发环境。

好了,现在可以开始grunt plugin的书写了。

140531151439

以下是我新建的一个插件目录结构。 

在task文件夹里编写你需要的任务,其中常用的一个函数接口是 grunt.files

以下是我刚写是timestamp 插件,看代码也许比文字更容易理解,呵呵。插件的项目地址: https://github.com/baofen14787/grunt-timestamp-file

/*
 * grunt-timestamp-file
 * https://github.com/baofen14787/grunt-timestamp-file
 *
 * Copyright (c) 2014 hugo
 * Licensed under the MIT license.
 */
var crypto = require('crypto');

'use strict';

module.exports = function (grunt) {

	// Please see the Grunt documentation for more information regarding task
	// creation: http://gruntjs.com/creating-tasks

	grunt.registerMultiTask('timestamp_file', 'grunt create timestamp file in project', function () {

		// Merge task-specific and/or target-specific options with these defaults.
		//默认参数
		var options = this.options({
			punctuation	 :   '.',
			separator	   :   '\n ',
			urlRoot		 :   '',						  //生成的页面片地址URL根目录地址
			timestampType   :   'md5',  //md5 || time
			timestampFormat :   'yymmddhMMss'
		});

		function ttType(filepath){
			var timeString,
				sourcedata;
			if(options.timestampType == 'md5'){
				sourcedata = grunt.file.read(filepath);
				timeString = md5(sourcedata, options.timestampType).substring(0,10);  //MD5太长 截短一点
			}else{
				timeString = grunt.template.today(options.timestampFormat)
			}
			return timeString;
		}

		function md5(content, encoding) {
			return crypto.createHash('md5').update(content, encoding).digest('hex');
		}

		/**
		 * 创建script标签
		 * @param filepath
		 * @param attr
		 * @returns {string}
		 */
		function createScript(filepath,attr){
			var version = ttType(filepath),
				url = options.urlRoot + filepath;

			var str = '<script src="'+ url + '?v='+ version +'" ';
			if(typeof attr === 'object'){
				for(var i in attr){
					str += i + '="' + attr[i] + '" ';
				}
			}
			str += '></script>';
			return str;
		}

		function createStyle(filepath,attr){
			var version = ttType(filepath),
				url = options.urlRoot + filepath;
			var str = '<link rel="stylesheet" type="text/css" media="screen" href='+ url + '?v='+ version +'" ';
			if(typeof attr === 'object'){
				for(var i in attr){
					str += i + '="' + attr[i] + '" ';
				}
			}
			str += '/>';
			return str;
		}

		function createTimesTamp(filepath,attr){
			//判定文件类型
			var fileTyle = filepath.split('.'),
				tag;
			attr = attr || options.attr;
			fileTyle = fileTyle[fileTyle.length -1];

			switch (fileTyle){
				case 'js':
					tag = createScript(filepath,attr);
					break
				case 'css':
					tag = createStyle(filepath,attr);
			}
			return tag;
		}

		console.info('filepath:', this.files)
		//开始读取文件
		this.files.forEach(function (f) {

			// Concat specified files.
			var src = f.src.filter(function (filepath) {
				//如果文件不存在 则 提示警告
				if (!grunt.file.exists(filepath)) {
					grunt.log.warn('Source file "' + filepath + '" not found.');
					return false;
				} else {
					return true;
				}
			}).map(function (filepath) {
					// Read file source.
					return createTimesTamp(filepath);
				}).join(grunt.util.normalizelf(options.separator));

			// Handle options.
			src += options.punctuation;

			// Write the destination file.
			grunt.file.write(f.dest, src);

			// Print a success message.
			grunt.log.writeln('File "' + f.dest + '" created.');
		});
	});



};

三、最后,插件编写完后就开始发布了。

官网的发布写的比较简单,直接就是 npm pulish .但实际上直接运行这个命令很可能报错。

正确的发布顺序是:

# 初始化 package.json
C:\GitHub\grunt-timestamp-file> npm init
 
# 验证你在 npmjs.org 上的账号
C:\GitHub\grunt-timestamp-file> npm adduser
 
# 发布
C:\GitHub\grunt-timestamp-file> npm publish .

上面三部是初次发布插件的步骤。当然,在发布前需要你先去npmjs.org上注册一个账号。

如果你以后修改了代码,然后想要同步到 npm 上的话请修改 package.json 中的 version 然后再次 publish

最后,如果你报错 
no_perms Private mode enable, only admin can publish this module

那么可能是你用了国内的镜像地址了,只需要重新把地址注册回npmjs即可。npm config set registry http://registry.npmjs.org

免费使用Github micro plan 两年

Github去年面向学生和教师推出免费两年的 Github micro plan计划,也就是说两年内,你可以免费使用5个私有仓库来托管你的代码。

在线申请地址是: https://education.github.com/

这项计划是针对学生群体,而Github对学生群体的识别只针对edu后缀的邮箱,也就是说,如果你有edu后缀的邮箱,那你就可以免费使用micro plan计划了。

那么接下来的问题就是:去哪里搞个edu邮箱呢?

好吧,这个问题只能求助万能的淘宝,在淘宝搜索“edu邮箱”果然出现很多结果,找个便宜的,几块钱一个的,付款之后,拿这个邮箱再去Github申请免费2年的micro plan计划吧。

本人已成功申请到了,看图。(PS:别举报我等这些穷屌丝啊`~~)

QQ截图20140425223616

最后,当然如果你想用私人仓库,但又不想搞那么麻烦,弄个edu邮箱什么的。那么,可推荐你使用 https://bitbucket.org

bitbucket和Github最主要的区别就是bitbucket可以免费使用无数个私人仓库。而且现在bitbucket已经支持中文界面了。

建议申请bitbucket的时候,使用和Github一样的邮箱,这样可以共同使用一个SSH Key,免得麻烦再去生成一个。

【京东SEO】京东站内优化分析

在国内的大型电商网站里,京东商城的SEO(搜索引擎优化)是目前做的最好的,京东内部也有专门的SEO团队,对京东进行长期的优化建设。本文将对京东SEO方面进行一些分析。

概述

京东目前的SEO概况
1、京东外部导入流量中,15%~20%的流量来源于搜索引擎(百度、360、google)。
2、这15%~20%的流量中,排除推广搜索、京东本身品牌搜索(如直接搜索京东、京东商城),约有80%的搜索是直接来自各类商品及周边长尾关键词的搜索。
2、京东每天通过搜索引擎带来的UV大概UV是170万~~200万左右。(用爱站(aizhan.com)、站长之家(chinaz.com)现有的流量数据综合估算)
3、在这200万UV中,搜索列表、品牌页、商品详情页、评论页带来的流量占全部seo流量的85%。
4、通过搜索引擎导入的流量,转化率约为5%-6%(估算)
5、京东在百度的收录量也非常庞大,总计超过1亿。

以上数据仅供参考,为个人推算而得。

1

标题title

在seo优化中,标题的优化占着举足轻重的地位,无论是从用户体验的角度出发,还是从搜索引擎的排名效果出发,title都是页面优化最最重要的因素。

京东所有页面都考虑到Title的书写合理性,在不同类型的页面,根据页面的特点,专门设置不同的Title,优化重点突出。

1

分析:
1)首页标题:大站的优化,首页标题基本都以品牌宣传为主。主要强调了其服务优势,同时也为了让用户记住JD.com这个新域名。

京东首页的标题,每个时期,也有所变化。

网上能搜索到曾经用过的标题:
2012年:京东网上商城–综合网购首选,正品行货,机打发票,售后上门取件,省钱又放心
2011年:中国专业的电脑、手机、数码、家电、日用百货网上购物商城

2)在一级分类及一级分类对应的二级域名,标题的设置较为单一。
京东的标题设置是:一级分类名称 + 部分热门的二级分类名称 + 京东商城

在大部分一级分类下,没有设置过多的产品关键字及长尾关键字。一级分类下的关键字是大类目,主要以品牌宣传为主,这类关键词以SEM为主,主要用于打造品牌,增加曝光度,实际转化率没有商祥页那么高。在一级分类里,京东没有使用长尾关键字的组合,而是去除多余的关键字,重点优化单一的分类关键字,重点非常突出。
一级栏目是京东优化的一个重点,在百度上搜索“手机”、“家用电器”、“电脑办公”等,基本都在前5位的排名,通过该关键字带来的流量,转化率其实也不高,(以前京东在一级分类下,也加入过很多周边的关键字,现在再来看,发现已经去掉了)

3)在二级分类下,关键字开始丰富,这类关键字的转化率相对一级分类也会高一些。
京东的标题设置是:二级分类名称+一级分类名称+ 基础长尾关键词+京东商城
基础长尾关键词是指搜索量较高的,用户搜索分类时 经常加上一起搜索的词语,这里是指:行情、价格、评价、正品行货
二级分类与一级分类相呼应。标题基本上都涵盖了网站所有热门产品。

4)在三级分类下,关键字已经具体到了产品型号、产品类型,这类关键字是流量转化率比前几类更具体、更高,也是优化的重点。
京东的标题设置更为简单:三级分类名称+基础长尾关键词+京东商城

三级分类,京东使用list.jd.com域名来做优化,其实三级分类和产品搜索页面非常类似,易迅的做法是直接将搜索页面和三级分类页面合并在一起,统一用搜索页面展示,这种方案在用户体验上较好,统一入口。而京东则单独用list.js.com 来做分类,重点对分类页面进行优化,搜索页面则独立处理。

在百度关键字排名中,京东很多三级分类都排名靠前。
三级分类的标题设置和一级分类很类似。但三级分类有个细节做得很好。如在用户选择相应的筛选条件时,标题会相应的变化。

2

京东在分类页面的标题设置非常紧凑,一环扣一环,涵盖了电商的大部分主流类目

5)商祥页,商祥页是具体的产品,也是SEO的核心部分,转化率也是最高的。京东在商祥页上,下了不少功夫。商祥页的标题非常规范。
京东的标题设置是:产品名+产品标题+基础组合关键字
产品名用【】扩起来,很明显是在告诉搜索引擎,这个内容是页面最核心的内容。
产品的标题很简单,就是产品名外加部分商品属性,这些属性都是精挑细选出来的,也是用户搜索率最高的。在这个标题里,京东将各种有可能匹配到的关键字添加进去,在产品标题里肯定也出现了产品名称,这样一来,很自然的就增加了产品名的密度,也就是增加了关键字的密度。

3

6) 评论页面,评论页面是长尾关键词的优化重点,也是商祥页外链的主要提供者(后续会讲)。
京东的标题设置是: 产品名称+大量长尾关键词

这类长尾关键词如“好不好”,“怎么样”,“购买心得” 等等,用户搜索时 搜索 产品名称加上这类长尾关键字,基本上都会有京东的影子,可以看出京东不放过每一个流量细节,提供相关性流量的出现机会。特别是在增加评论页后,提高的网站的收录和权重传递,评论页为商祥页提供了丰富的外链权重。
长尾关键词的搜索量虽然少,但是总量却非常庞大,这部分的流量也是非常可观的。

总结:从标题的设置可以看出京东优化的思路:从京东品牌、到热门商品分类、到具体商品分类,再结合长尾关键字。
通过长尾关键字的优化提高主关键字的排名,这是我们最常用的优化方式,京东在标题的设置上可以看出这一点。从流量来源看,SEO整站优化带来的流量,特别是大量长尾关键词带来的流量将远远大于其首页来的流量。

对标题优化的总结

标题的设置好坏,直接影响着整个SEO的优化,也是SEO优化的第一步。易迅在标题的设置上,和京东相比,差距不是一般的大。

Keywords、description

Keywords、description 在搜索排名的权重不高,但是合理的设置,可以提高关键字的密度及优化搜索结果页的体验。
Keywords包括行为描述、主营商品和网站名称,而description是进一步将这些关键词组合成完整的描述语句。

5

分析
京东非常注重页面在搜索引擎上的展示,正品行货,全国价格最低,结合前面的,很明显是在提醒用户放心,这里都是正品,并且价格还是全国最低的,具体是不是最低谁都无法断定,但至少这话能增大用户点击的欲望。
在不同的类目、不同的商祥页上,这些描述和keyword都是不一样的。没有丝毫浪费,关键字都围绕该页面展开,在description标签上,尽可能的提高关键字的密度,同时又保持语句通顺。
可以看出从title到keywords到description,它们都仅仅围绕关键词在做优化。同时有意的提高关键词的密度。
通过加大关键词的密度,从而提高关键词在搜索引擎的排名,是SEO优化的一个常用手段。京东在这点上做的非常到位。

SEO优化的核心思想是:每个页面抓住几个关键字(一般不超过5个)进行核心优化,想试图一个页面做完所有的关键字,是不可能的。

关键词布局

在关键字布局时,合理的使用h1 –6标签 及 strong、b、em等标签,同时在页面内容里适当的增加关键字密度,有利于提升关键词的排名。

h1标签

7

京东在不同页面,虽然在页面表现上一样,但实际标签h1的使用上,却不一样。并且在分类名称上使用了strong标签。

关键词密度

8

看一下商祥页的密度,商祥页面,京东基本都能出现产品名称,并且重复出现也很高。具体可查看网页。

京东如何在商祥页做到如此多的关键词出现次数?

商祥页,为了保证良好的用户体验,避免生搬硬套出现关键词,又要兼顾关键词的密度。为了解决这个难题,京东采用了黑帽SEO 作弊的方法来实现。
在京东商祥的每个页面,都存在这样一组仅仅是为了SEO的链接。在这里加入一组看不到的链接,既保证了关键词的密度,同时又兼顾了 产品与周边产品比较 这类关键词排名。一举两得。

9

如何提高页面质量?

14

电商页面以图片和链接为主,很少纯文本信息,一个高质量的页面,至少需要存在一些文本信息,这样方便搜索引擎分析页面。京东在商祥页面上,在产品描述页面,能用文字的尽量使用文字。

网站结构布局

搜索引擎蜘蛛爬行的抓取页面的顺序是从上到下,从左到右。最先出现的链接和关键字 权重也越大。在京东商祥页和列表页,都通过CSS来改变代码的顺序。

7

链接URL

URL层级
链接目录层级越浅,权重越大。在没有其他反向链接的前提下,每个目录的权重只是继承它的上级权重的一部分,因此这个权重会低于它的上级目录。也就是常说的离首页的层级越远,权重越小。
这个是有前提的,就是没有其他外链影响。所以网站在进行外链建设或者内链布局调整之后,是会出现在一些低级目录的权重高于上级目录的情况。尤其是在一些针对具体目录关键词的排名能力上。

在京东98%以上的页面,URL层级都是在顶级域名之下,最多也是在一级目录之下。这样就确保了权重最好的继承主域名,减少权重的分层流失。
如:
京东一级分类页URL:
http://channel.jd.com/electronic.html
http://channel.jd.com/home.html

二级分类URL:
http://list.jd.com/670-677-678-0-0-0-0-0-0-0-1-1-1-1-1-72-4137-0.html

商祥URL:
http://item.jd.com/688354.html

评论URL
http://club.jd.com/review/688354-0-1-0.html
http://club.jd.com/allreview/1-1.html

搜索页:
http://search.jd.com/search?keyword=3D%B5%E7%CA%D3&qr=&qrst=UNEXPAND&et=&rt=1&area=1&ev=exbrand_%CF%C4%C6%D5%A3%A8SHARP%A3%A9%40&uc=0#select

从京东几类URL来看,网站所有链接的层级都不超过两层,尽可能的减少链接的层级。同时也是尽可能的简短。

URL唯一性

URL的唯一性,需要考虑以下几种情况:
1)在更换域名,在网站栏目重新组织,更换链接地址时,统一用301跳转,确保原有链接的权重向新链接转移。

2)一个页面对应了多个URL,必然会分散这个页面的权重。
在搜索引擎里, 只有链接完全一样,才会认为是同一个链接,如果链接带上参数,虽然访问到的内容还是一样,但是在搜索引擎看来确是不同的链接,页面抓取也会出现多次,从而导致多个链接,内容一样。
京东的大部分链接均无参数(搜索页除外),产品页面使用canonical标签来确保链接唯一性,避免权重分散、流失。

canonica标签的主要作用是用来解决由于网址形式不同内容相同而造成的内容重复问题。

Image

如何解决页面相似度高问题?

刚才说到页面相似度,在SEO里,如果网站本身有很多相似度过高的页面,会引起搜索引擎的反感,从而影响对网站的收录,进而影响到网站关键字排名以及网站排名和网站流量等等。

在商祥页面,同一个商品的不同颜色、大小上,用的是不同的链接,也就是说一个商品同时可能出现多个类似的页面。

12

在搜索引擎看来,如果一个网站,页面相似度过高,会认为是作弊,搜索排名会比较差,而京东这块做得很好,看图可以看出,京东同一款商品,在不同属性下的页面相似度都在60%–85%左右
这也是搜索引擎能接受的范围。

站内锚文本

一般的链接结构是<a href=”http://www.ghugo.com” >web前端开发</a>。其中“web前端开发”就是锚文本,通常情况下搜索引擎会通过锚文本来理解http://www.ghugo.com 这个页面的内容是什么。

如果一个网站页面的站内链接锚文本足够精确,那这个网站页面在搜索引擎里面的排序就有非常大的机会排前。在京东页面会看到很多锚文本链接。这些锚文本的出现,同时也提高了关键字的密度,SEO的优化都是相辅相成的。

15

站内结构布局,链接丰富度

良好的内部链接,可以加快搜索引擎的收录,而且能够相互传递权重,达到页面权重整体提升。
可以从以下几个方面来考场页面链接的丰富度。

QQ截图20131118202716

从上图可以看出,京东的链接非常丰富,而易迅部分没有实现。
PS:ajax动态加载的内容搜索引擎无法识别,虽然页面上也存在相应的链接,但搜索引擎并不知晓。
京东有很多内容是动态加载的,但是对于一些关键的链接组及商品,则采用直接输出到页面上的方式,在优化用户体验的同时也兼顾了SEO。

链接权重传递

京东站内链接里,非常注重链接权重,丝毫不浪费一个链接。对于不需要排名的链接,京东统一加速nofollow属性。
加上nofollow属性的链接,权重将不传递。nofollow用在站内链接上,可以影响搜索引擎排名。

反向链接

百度百科的解释:假设把网页文档A中包含的指向B的链接命名为“A-B”,则对B来说这个“A-B”即为一个反向链接。

优化关键字排名的核心就是获取大量高权重、高PR的反向链接,根据我以往的优化经验来看,大量高质量的反向链接,能在短时间内将关键字排名提到首页前三位。

个人经验来看,反向链接在SEO中,占70%的作用。(2010年的经验,3年没研究SEO了,这个比例是否任然适用值得商榷。)

京东海量的商品,如何制造大量的反向链接提高排名?

club.jd.com 是制造反向链接的核心,通过用户评论,每个评论页面都带有商祥链接,从而增加商祥的反链数量。
club.jd.com 不仅优化了海量的长尾关键词,同时也提供了商祥及其他类目大量的反向链接。

2

club.jd.com这个域名的页面主要包括商品的评论页、商品的咨询信息、商品讨论圈。
以iphone5为例。

评论页
评论列表:1909页(http://club.jd.com/review/764903-0-1-0.html)
单条评论:32730条

商品咨询
商品咨询列表:188页(http://club.jd.com/allconsultations/764903-1-1.html)
商品咨询信息:3760条(1页20条)

商品讨论圈
商品讨论列表:80页(http://club.jd.com/bbs/764903-1-0-0.html)
商品讨论话题:240条(1页30条)
这样总共加起来仅仅针对白色iphone5一个单一商品的页面就有38907页,即有38907条反向链接。并且链接还在不断增加,购买人数越多,评论越多,反链就越多,排名就相应的提高。

这里有个点需要注意,对于二级域名,搜索引擎会认为是一个独立的网站,与主域名没有关系。所以club.jd.com 可以算是list.jd.com商祥页的反链。

友情链接

友情链接也是反向链接的一种。京东有专门用于交换友情链接的系统。http://club.jd.com/links.aspx
京东的友情链接,直接用了社区的域名,而没有新开一个新的域名来做友情链接,这里也是有讲究的。

新开域名,对交换链的友情链接没有帮助,友情链接页面不需要排名和做优化。有些站长在做友情链接的时候,可以会直接使用club.jd.com作为链接,而不是www.jd.com,
为了不浪费任何一个友链,京东选择了将友情链接放在club.jd.com 上。毕竟如果club.jd.com 权重提高了,那同时提高给商祥页面的链接权重也会相应提高。

索引页面

http://www.jd.com/allSort.aspx 京东有专门的索引页面,这类页面一是方便用户查找分类,但更多的是为了搜索引擎抓取数据的方便。相信这类页面更多的是以SEO为主。

SEO优化的基础思路:四处一词。

1)当前页面的title上出现这个关键词
2)当前页面keywords、description标签出现这个关键词
3)当前页面的内容里,多次出现这个关键词,并在第一次出现时,加粗
4)其他页面的锚文本里,出现这个关键词

京东的优化里面,上面四点都做到位了,而易迅在SEO上的表现却差强人意。

无售商品的优化

这是京东SEO中的一大亮点,也是国内电子商务网站唯一一个做到了无售卖的商品优化。
比如:http://www.jd.com/series/7711/product.html
http://www.jd.com/series/7711/
页面显示“索尼MDR-E552”这个商品,但是实际上,京东并没有这款商品,而是通过推荐来引导用户购买相类似的商品。
在看看“飞利浦HS465”这个关键词,京东在百度自然排名第7位。这类无货商品大部分是已经停产淘汰的商品。但是京东连这个流量也不放过,优化到极致。
基本上京东在 这类商品 关键字排名上,都能排在前10位内。

3

改变搜索结果排序

京东全站无处不在SEO,通过对目标关键词的优化,提升网站所有页面的权重及排名,改变搜索结果的排序,对用户搜索体验和转化率至关重要。

如百度搜索“京东手机”、“易迅手机”搜索结果页面,京东和手机相关的页面都排在前位,而易迅则是不相关的页面,并且搜索易迅+商品名称。这样的易迅高关联度的关键字,也很少有排在第一位的。

4

总结:本文通过对title、keyword、description的设置、链接及关键字布局等方面对京东SEO进行分析。京东无处不SEO,有很多优化的地方及优化思路值得我们学习。
其实京东的优化还远远不止这些,很多优化的细节太零碎,没有在本文指出。对于大型网站的优化,做好站内优化,只需要做好基础的白帽SEO,排名基本没多大问题。

mysql group by 无数据补0 方法

来看下这个SQL,这个SQL的意思是获取需求ID的数量及需求价格 并按需求类型分组显示。

SELECT `require_type_id` , COUNT(  `require_id` ) AScount,
SUM(  `require_final_cost` ) ASprice
FROM `tb_require`
WHEREDATE_FORMAT(  `require_start_date` ,  '%Y-%m') = DATE_FORMAT(  '2012-10-1',  '%Y-%m')
GROUPBY  `require_type_id`
1

得到如下数据:

但是没有数据的部分就无法显示出来了。

如果要将group by的数据显示完整,没有数据的字段显示0,可以使用子查询和 右连接查询。

改造的sql语句如下:

SELECTtb_type.`type_id` , IF(countIS NULL , 0, count) ascount  ,
IF(price ISNULL , 0, price) asprice
FROM
(select`require_type_id`,count(`require_id`) ascount  ,
sum(`require_final_cost`) asprice
FROMtb_require
wheredate_format(`require_start_date`,'%Y-%m')=  date_format('2012-10-1','%Y-%m')
GROUPBY `require_type_id`) indTable
RIGHTJOIN `tb_type` onindTable.`require_type_id` = `tb_type`.`type_id`
2

这样得到的数据则包含tb_type表所有的字段内容了。

这种方式适用于两个现有的表进行联合查询,但是有时候我们需要按日期进行分组。这个时候我们就需要创建个日期表了。
一个例子:

新建一个week表 week(id) 就是1-53

然后,采用连接查询。

SELECTweek.id , IF(amount ISNULL , 0, amount)
 
FROM
(SELECTWEEKOFYEAR(时间) AsperWeek  ,SUM(数量) ASamount FROM你的表 GROUPBY perWeek) indTable 
 
RIGHTJOIN week onindTable.perWeek = week.id;

除了if也可以用case then.

SELECT  CASE when c.co IS NULL then 0 else c.co END count,b.id,b.contact_name,b.team_name FROM team b
LEFT JOIN (SELECT count(*) co,a.team_id FROM member_team a GROUP BY a.team_id) c ON b.id = c.team_id

php 创建png8格式的图片 与png、jpg格式互转

php 创建png8格式的图片 代码如下

<?php
// Create a new true color image
$im = new imagecreatetruecolor(100, 100);;

// Fill with alpha background
$alphabg = imagecolorallocatealpha($im, 0, 0, 0, 127);
imagefill($im, 0, 0, $alphabg);

// Convert to palette-based with no dithering and 255 colors with alpha
imagetruecolortopalette($im, false, 255);
imagesavealpha($im, true);

// Save the image
imagepng($im, './paletteimage.png');
imagedestroy($im);
?>

php实现jpg图片与png图片互相转换函数:

/**
 *转换格式
 *
 */
function change_type($filepath,$filename,$type = 'png') {
	//获取图片的宽高等信息
	$img = $filepath.$filename;
	$info = GetImageSize($img);
	$width = $info[0];
	$height = $info[1];
	$temp = explode(".",$filename); 
	$new_filename = $temp[0] .'.' . $type;
	$save_path = $filepath . $new_filename;
	switch ($type) {
		case 'png' :
			$im = imagecreatefromjpeg($img);
			// Fill with alpha background
			$alphabg = imagecolorallocatealpha($im, 0, 0, 0, 127);
			imagefill($im, 0, 0, $alphabg);
			
			// Convert to palette-based with no dithering and 255 colors with alpha
			imagetruecolortopalette($im, false, 255);
			imagesavealpha($im, true);
			// Save the image
			imagepng($im, $save_path);
			imagedestroy($im);
			$process = true;
			break;
			
		case 'jpeg' :
		default :
			$image = imagecreatefrompng($img);
			imagejpeg($image, $save_path, 60);;
			imagedestroy($image);
			$process = true;
			break;
	}
	$filesize = filesize($save_path);
	$json_all=array();
	$json=array(
		"filename"=>$new_filename,
		"width"=>$width,
		"size"=>$this->formatSizeUnits($filesize)
	);
	array_push($json_all,$json);


	return $json_all;

}

Delicious Bookmarks 插件不支持FireFox 4的解决方法

Firefox 4 正式版已经出来一个星期了,大部分插件都能正常运行,唯独这个 Delicious Bookmarks 死活不更新,硬是和新版的FireFox不兼容。而且这插件还是Yahoo!官方出品,效率怎么那么低啊~~

平时用惯了Delicous做为书签收藏,一下用不了,还真不习惯。于是想想办法看能不能手动修改下,方便支持FireFox,Google了一番,方法还是有滴,而且还很简单。

1、Win+R ,调出“运行”框来,也可以点屏幕左侧“开始”菜单,找到运行框。

2、输入 %appdata% 按回车。

3、接下来就开始找以下文件了。\Mozilla\Firefox\Profiles\0fqblg0m.default\extensions\{2fa4ed95-0317-4c6a-a74c-5f3e3912c1f9}\install.rdf

其中0fqblg0m.default 这个文件夹的0fqblg0m应该是随即生成的,可以根据自己电脑去看(Profiles下就只有一个XXXX.default文件)

4、记事本打开install.rdf,把第四行

em:maxVersion=”4.0b3pre” />

改为

em:maxVersion=”4.0″ />
然后重启FF,就可以使用啦。

IIS环境下wordpress中永久链接去掉index.php

最近经常有同学问我Wordpress上设置永久链接前面的index.php怎么去掉。这其实和服务器有关,IIS 和Apache 下,情况不大一样。一般出现index.php 主要是iis这边设置的问题。网上找了一些资料,以下这篇文章测试可用。

=======================

因为服务器是使用的Windows2003+IIS,想摆脱Wordpress永久链接前面的index.php不像在APACHE下那么容易。只好GOOGLE+BAIDU,输入词条,搜到N多关于WP永久链接的文章。

最后发现两种已成功实现的方案:

第一种方案:

不需要第三方插件cos-html-cache支持,利用服务器有自定义404错误页面的功能解决问题,但前提是你的服务器或者主机有自定义404错误页面的功能。如果是服务器那肯定可以支持,如果是虚拟主机,需你的服务器供应商提供自定义404错误页面选项。你只需创建一个404错误页面,并且写入下列几行代码即可简单优雅的实现无插件完美支持windows iis主机的永久固定链接的伪静态化地址格式。

具体设置步骤:

1.用DW新建一个PHP文档,并且页面属性里面把编码设置成UTF-8,在里面写入下面代码,保存,命名为404.php。将404.php上传到网站根目录。

<?php
header("HTTP/1.1 200 OK");
$ori_qs = $_SERVER['QUERY_STRING'];
$pattern = '/[^;]+;[^:]+://[^/]+(/[^?]*)(?:?(.*))?/i';

preg_match($pattern, $ori_qs, $matches);
$_SERVER['PATH_INFO'] = $matches[1] . '?' . $matches[2];
$_SERVER['REQUEST_URI'] = $_SERVER['PATH_INFO'];
$query_args = explode('&', $matches[2]);
unset($_GET);
foreach ($query_args as $arg)
{
$the_arg = explode('=', $arg);
$_GET[$the_arg[0]] = $the_arg[1];
}

include('index.php');
?>

我开始从网上复制该段代码使用的时候发现出现500错误,仔细一看原来是大家转载代码的时候都没有把代码里面错误的单引号修正过来,网上流传的这段代码里面不少单引号都是中文全角单引号,需要改成英文半角的才可以。上面的我已经改过了。大家直接复制即可!

2.设置404自定义错误指向404.php,一般来说,绝大多数服务器控制面板均提供该选项。

3.进入wordpress管理后台,设置(Options)-永久链接(Permalinks),你就当自己的主机是linux主机使好了,任意、随便设置自己喜欢的伪静态地址格式及静态地址后缀。
例如:
/y%year%/%post_id%.html
/%year%/%monthnum%/%post_id%/
/%year%/%monthnum%/%postname%.html
我用的格式是:/%year%/%monthnum%/%postname%/

第二种方案:

无Rewrite用cos-html-cache实现静态化
要求:使用cos-html-cache插件
具体下载,设置步骤和使用方法请查看插件作者的说明:cos-html-cache插件链接

用起来有点麻烦,我还是选择了第一种 :razz:

看来大家有点小麻烦,可能我也不知道是怎么回事。我把我正常用的404文件打包了,大家可以下载了试试!【404.PHP下载

转自:http://www.ossi.cn/2009-02/iis-wordpress-indexphp

网络营销数据解读系列文章目录

by MarsOcean on November 29, 201

这些文章让你知道,如何让数据变得更有意义!

团购导航站的需求分析

这是3个月前的一个构思,之前写在邮箱记事本里, 前几天看到新浪网的这篇文章《团购信用调查报告发布 行业整体信用得分63》,就把我之前的一个团购点评想法放出来吧,哈。

简单来说,这个网站可以说是针对团购商家的大众点评网。现在来看,很多团购网,像团800,都有一些思路相同的地方。

以下是当时草草写的需求文档:

团购点评网:
需求来源:团购网站目前日益增多,但团购质量参差不齐。很多消费者反应货不对板。想购买某个团购商品时,不知道是否如描述的那样真实。而且同一商家很可能会参与多家团购网,这样团购的可以看看以前别人团购的意见。

网站解决的问题:团购点评,让团购透明化,让消费者买得更放心。让消费者放心团。

网站功能:首先是一个团购导航网站,百度一下“团购导航”。搜索出来的就是那些了。

主要加入的功能 1、商家点评功能,2、本次团购的评论  3、本次团购点评打分功能。

前期只需要这几个功能,后期可以加入更多的功能,比如团购网打分,团购网信任度等等。。。

google app engine(GAE)无法更新的解决方案

最近在一次更新google app engine程序时,出现了这个错误“Another transaction by user username is already in progress”
出现这个问题的原因是GAE更新不完整,即没有完成一次GAE更新,可能由于网络慢,或中途断网,或超时等原因造成。
而这时GAE会锁定这个用户,需要该用户使用“回滚”命令,取消这次更新。

错误提示信息如下:

OK,那现在如何“rollback”呢?

  1. 先新建一个bat文件,即 XXX.bat
  2. 复杂以下代码到新建的bat文件上,注意修改路径email and appnamehere
    "C:\Program Files\Python26\python" "C:\Program Files\Google\google_appengine\appcfg.py" -verbose --no_cookies --email=email@gmail.com --passin rollback appnamehere
  3. 最后保存bat文件,并运行他即可

或者直接在命令行中执行这句代码

appcfg.py --no_cookies --email=email@gmail.com --passin rollback appnamehere