月份: 2015-02

手机浏览器下的mp3播放器

下载地址:http://pan.baidu.com/s/1c0rRlfE

知乎上获得“赞数除以字数”最大值的答案是哪个?

您觉得年轻人(特别是男生)太早结婚会影响事业的发展吗?
李开复:我21岁结婚。
6个字,5218个赞同,平均每字870个赞同
热恋阶段,见到恋人时你想做的第一件事是什么?
一一:笑。
1个字,3090个赞同,平均每字3090个赞同
什么叫暖男?
卫枫:云备胎。
3个字,8325个赞同,平均每字2775个赞同
男朋友别人面前很正经,在我面前很二怎么办?
董翔:真爱。
2个字,5409个赞同,平均每字2705个赞同
吃什么最补脑?
唐先声:亏。
1个字,2589个赞同,平均每字2589个赞同
当今这个社会如此以瘦为美,胖点就没有一点好处吗?
OoPsy:没有。
2个字,5157个赞同,平均每字2579个赞同
姑娘发短信说“我感冒了”,最好的回答是什么?
GayScript:开门。
2个字,4761个赞同,平均每字2381个赞同
如何让相亲的女方反感自己?
崔浩男:你就正常表现。
6个字,11871个赞同,平均每字1979个赞同
国庆北京游有哪些好建议?
OpheliaSweetie:别去。
2个字,3917个赞同,平均每字1959个赞同
什么是爱?爱一个人是什么感觉?
腐生:好像突然有了软肋,也突然有了铠甲。
15个字,26892个赞同,平均每字1793个赞同
哪些产品在中国销售价格很低,在海外市场定价却很贵?
陈敛:书。
1个字,1575个赞同,平均每字1575个赞同
为什么《董小姐》里“爱上一匹野马,可我的家里没有草原”会引起如此强烈的共鸣?
宋冬野:想多了各位。。我就是那么比喻了一下。。。
15个字,19215个赞同,平均每字1281个赞同
武林高手都是怎样识别杀气的?
罗索:背景音乐。
4个字,4581个赞同,平均每字1145个赞同
你的中国梦是什么?
梁欢:移民。
2个字,2178个赞同,平均每字1089个赞同
人在什么时候最舒服?
frank:空调加棉被。
5个字,5205个赞同,平均每字1041个赞同
你最孤独的时刻是什么?
InkHugo:第二杯半价。
5个字,5192个赞同,平均每字1038个赞同
目前最好的用来学习外语的安卓应用是什么?
TanKnoX:关机。
2个字,1927个赞同,平均每字964个赞同
为什么我男朋友总是觉得别的男生对我有企图?
王奕翔:他太了解男人了。
7个字,6682个赞同,平均每字955个赞同
“心灵鸡汤”式的文章错在哪?
田七:没给勺子。
4个字,3716个赞同,平均每字929个赞同
如何隐晦地表达我想你?
陈佳:在干嘛?
3个字,2624个赞同,平均每字875个赞同
如果母鸡有思想,它会想些什么?
Trickie:我母鸡啊。
4个字,3340个赞同,平均每字835个赞同
百度搜索有那么多缺点,大家为什么还要用呢?
froginwater:因为要测试网络是不是断开了。
13个字,10598个赞同,平均每字815个赞同
女生对大肚子男生怎么看?
少白狗蛋:看都不看。
4个字,3231个赞同,平均每字808个赞同
如何拒绝不爱但很善良的男生?
默默:不要在寂寞的时候找他。
10个字,6694个赞同,平均每字669个赞同
什么叫见过大世面?
张若鸿:会讲究,能将就
6个字,3955个赞同,平均每字659个赞同
命运是什么?
邓亚圣:命是弱者借口,运乃强者谦词
12个字,7883个赞同,平均每字657个赞同
杀气是一种什么感觉?
张起灵:你妈喊你全名的时候。
9个字,5889个赞同,平均每字654个赞同
怎样含蓄地表达“我已经被收买了”?
Icarus:我说句公道话……
6个字,3640个赞同,平均每字607个赞同
怎样才能做到不在乎别人骂?
姜山:你要相信,比你优秀的人是不会鸟你的。
16个字,9590个赞同,平均每字599个赞同
做哪些事情可以提升生活品质?
茉茉:定期扔東西。相信我!
8个字,4275个赞同,平均每字534个赞同
怎样提升一个人的文笔?
白孺子:阅读、模仿与失恋。
7个字,3606个赞同,平均每字515个赞同
如何帅气地回复男友的分手短信?
王豖:哦
1个字,508个赞同,平均每字508个赞同
如何做到为人和善又不失强硬?
lsShaw:我前大大大boss说的:从不说硬话;从不做软事。
23个字,11621个赞同,平均每字505个赞同
男女之间没有纯友谊吗?
蔡浩te:有,越丑越纯!!!
5个字,2324个赞同,平均每字465个赞同
“谁,执我之手,敛我半世癫狂”是什么意思?
ananaB:我有病,谁有药!
6个字,2748个赞同,平均每字458个赞同
你在生活中得到过的最好的建议是什么?
御子柴:切莫交浅言深
6个字,2665个赞同,平均每字444个赞同
你在幸福考拉上究竟学会了什么?
ananaB:小时候不努力学习,长大了就只能给别人dian zan。。。

CSS3详解:transform [旋转rotate、扭曲skew、缩放scale和移动translate以及矩阵变形matrix]

CSS3详解:transform [旋转rotate、扭曲skew、缩放scale和移动translate以及矩阵变形matrix]

transform的属性包括:rotate() / skew() / scale() / translate(x,y) ,分别还有x、y之分,比如:rotatex() 和 rotatey() ,以此类推。

下面我们来分解各个属性的用法:

1.旋转 rotate():

水平旋转,属性值格式为Xdeg。(deg是“度”的意思)rotate(Xdeg)。X为正数时,顺时针旋转;为负数时,逆时针旋转

.demo_transform1{-webkit-transform:rotate(10deg);-moz-transform:rotate(10deg)}

改变元素基点transform-origin

————————————————————————————

2.扭曲 transform:skew():

将元素沿水平方向倾斜变形。skew(Xdeg,Ydeg)。这个比较难表述,想象一下平行四边形吧。属性值为一个时,x、y轴参数相同;为两个时,x、y轴各自倾斜。

.demo_transform2{-webkit-transform:skew(20deg);-moz-transform:skew(20deg)}

————————————————————————————

3.缩放 scale():

缩放,1为原始大小。scale(x)。正数放大,负数缩小。属性值为一个时,x/y轴同时缩放;属性值为两个值时,分别控制x、y轴的缩放。

.demo_transform3{-webkit-transform:scale(1.5);-moz-transform:scale(1.5)}

————————————————————————————

4.位移 translate(x,y):

定位元素,基于XY轴重新定位元素。translate(Xpx,Ypx)。属性值为一个时,x、y轴参数相同;为两个时,x、y轴分别定位

.demo_transform4{-webkit-transform:translate(120px,0);-moz-transform:translate(120px,0)}

5.矩阵matrix

matrix(<number>, <number>, <number>, <number>, <number>, <number>) : 以一个含六值的(a,b,c,d,e,f)变换矩阵的形式指定一个2D变换,相当于直接应用一个[a b c d e f]变换矩阵。就是基于水平方向(X轴)和垂直方向(Y轴)重新定位元素,此属性值使用涉及到数学中的矩阵,我在这里只是简单的说一下CSS3中的transform有这么一个属性值,如果有感兴趣的朋友可以去了解更深层次的martix使用方法,这里就不多说了。

————————————————————————————

6.transform综合应用:

transform的常用属性就是这些了,下面我们借助transition的帮忙来演示一个关于css3 transform的综合实例:

.demo_transform5{-webkit-transition:all 1s ease-in-out;-moz-transition:all 1s ease-in-out}
.demo_transform5:hover{-webkit-transform:rotate(360deg) skew(-20deg) scale(3.0) translate(100px,0);-moz-transform:rotate(360deg) skew(-20deg)scale(3.0) translate(100px,0)}

示例代码:

阅读详细 »

大气实用jQuery手机移动端日历日期选择插件[滚动方式]

大气实用jQuery手机移动端日历日期选择插件[滚动方式]

下载地址:http://pan.baidu.com/s/1m59AA

axure rp prov7.0破解中文版(网页原型)

pro,这是一款支持交互的网页原型工具,这里为您提供的v7.0破解中文版,是一个绿色版,它只需要一键就可以安装并汉化,操作很简单,不需要输入注册码等内容,这个版本的网页原型工具相当给力。

本软件需要安装.net 4.0:

【使用说明】

下载完成后解压缩;

点击“!)AxureRPPorable.exe”,自动注册axure。


点击安装;


再选择是,再打开就是汉化版的了。


【特别提示】

v7.0版本的左下角功能还没有汉化完全,您可以选择一个早先的汉化完整的版本。

32位及64位系统都可用,本版本已经包含有元件汉化+界面汉化,是最完美的axure7.0版本。

Axurerpchs7.zip
http://pan.baidu.com/s/1wEV4y
http://www.paopaoche.net/soft/42431.html

AxureRPPro65.zip
http://pan.baidu.com/s/1jGxK4WQ
http://www.paopaoche.net/soft/36605.html

网页滚动到底部ajax加载数据

var loading = false;

$(window).scroll(function(){
      // 当滚动到最底部以上50像素时, 加载新内容
   
    if ($(document).height() – $(this).scrollTop() – $(this).height()<200){
      if(next_url && !loading){
        loading = true;
        $.getJSON(next_url, function(data){
          next_url = data.next_url;
          if(data.html){
            $(‘#infinite_scroll’).append( data.html );
            loading = false;
          }
        });
            }
            if(!next_url)$(‘.loading’).remove();
    }
  });

});

《近匠》Amaze UI:做最懂中国程序员的开源HTML5框架

Amaze UI是一款完全针对HTML5开发的轻量级、模块化、强调移动优先的开源跨屏前端框架,通过拆分、封装了一些常用的网页组件,让开发者只需复制代码便可将这些跨屏组件写入到自己的应用中。相比国外框架,Amaze UI更关注中文排版优化,强调浏览器兼容性,在GitHub上线半年的时间,便已获得2300+Star。

CSDN:最初决定打造Amaze UI这样一框架有着哪些初衷和考虑?

陈本峰:Amaze UI是我们整个云适配产品的一部分,希望引领推广最新的技术,带领大家走向未来的趋势方向。现在在国外对于Web开发有一个非常热的理念,就是Web组件化,这是Google在2013年提出的新概念。开发者不需要再花费时间精力去编写日历等的代码,可以直接引用组件。

在开发云适配的过程中,我们积累了包括菜单、轮播图等在内的大量针对手机端的UI控件,但其兼容性维护及复杂的屏幕适配还需要花费很多时间去进行,而我们也希望能够与别人共享,所以最终决定将其开源,在共同形成这么一个库的同时,也让大家都能受益。

CSDN:在云适配的产品线中,Amaze UI有着什么样的定位?

陈本峰:首先,云适配可以说是Amaze UI的一个用户,它就等于把Amaze UI打包到整个云适配系统中。相对而言,云适配的产品定位是针对现在已有的PC网站,将这些PC网站转换为一个能同时支持手机、平板的跨屏网站,而Amaze UI则是直接帮助开发者开发一个跨屏跨平台的网站。

CSDN:作为开源项目,Amaze UI是如何吸引开发者参与代码提交和建立生态的?

陈本峰:在国外,开源是一项非常热门的运动,在GitHub上有着很多这种类型的开源贡献开发者。但我们确实也感觉到,开源这件事在中国还是处于早期的萌芽阶段,许多程序员可能并没有太多的时间去做贡献。当然,Amaze UI自出现以来,还是有挺多的开发者完全出于兴趣来贡献代码,主要的代码还是我们自己在更新维护,上线不到半年的时间,Amaze UI在GitHub上已经名列国内最受欢迎的开发框架TOP10,有了两千多的Star。

CSDN:您曾说“Amaze UI是最懂中国程序员的开源HTML5跨屏前端框架”,能否从其功能或设计等方面举例说明?

陈本峰:“最懂中国程序员”主要突出一个点,就是我们的本土化。国外有许多非常有名的HTML5框架,但他们的字体都是英文,对中文字体没有任何设置。而对开发者来说,做一个网页,如果不设置字体的话,那么在不同的浏览器或操作系统下,显示出来的效果就是完全是默认的,排版会特别糟糕,而Amaze UI则专门针对中文做了很多优化。

其次,浏览器的兼容性也是一大问题。Amaze UI强调移动优先,先考虑移动平台上的诸多浏览器。今时今日,浏览器的概念与过去IE、火狐等独立浏览器俨然不同,只要是能够打开HTML5页面的容器都可以叫浏览器,而现在最大的浏览器非微信莫属,但国外的框架根本不可能想到对微信做兼容。除此之外,我们还会对手机百度,以及UC、QQ、360、傲游等手机浏览器进行兼容,这些都是非常具有本土特色的。

Amaze UI还有很多非常具有中国特色的组件,比如说菜单,国外的移动端菜单一般都是上下横线,按IE的规则将菜单收起来,强调简单,而中国的很多手机网站菜单都是直接平铺出来,整个网页内容很丰富,而我们做的这些界面特色非常适合中国的程序员,云适配就是帮助企业将PC网站转换为手机端网站。截止目前,我们大概已经转换了十几万的企业网站,同时也接触了大量的企业客户,对中国的市场需求最为了解,所以,我们说自己是最懂中国程序员的开发框架,因为中国程序员开发一个网页,势必会碰到这些问题。

CSDN:与jQuery等其他框架相比,Amaze UI上手难易度如何?有哪些优势?

陈本峰:在上手难易度这块,我们比较大的优势就是官方文档都是中文的,而国外框架的官方文档虽然有人翻译,但并不能涵盖全部,此外,我们还会直接在页面及文档中为开发者提供社区支持,这也是一种本土化的考虑。

Amaze UI与jQuery并不矛盾,而是互补关系。jQuery主要是让开发者去调用浏览器顶层的JavaScript API,中间有一层是调用底层的浏览器API。jQuery也有一个UI框架——jQuery UI,主要针对PC端,不跨屏,UI风格也比较老派,还有很多类似于弧形3D的效果,但如今在移动端的整体设计趋于扁平化,无论是iOS还是Android,都是扁平化设计。Amaze UI不仅能直接跨屏,其设计风格也非常符合现在移动端的需求。

CSDN:支持跨平台,为Amaze UI本身的研发带来了哪些技术挑战?

陈本峰:Amaze UI不止是跨平台,我们把它叫做跨屏跨平台,跨屏是指不同屏幕。Amaze UI有一个很大的好处就是开发者的网站一旦完成,手机、平板、PC三个屏幕适配也就全都有了,不用开发者再劳心劳力地去开发三个网站,而跨平台相对来说是HTML5本身的优势。

说到技术挑战,Amaze UI采用响应式设计(Responsive Design),将屏幕切分成12个网格,而其风格与网格链数会随着屏幕大小而发生变化,这就是响应式设计的概念,我们在设计网格系统时,会考虑到很多因素,以中国社区更容易理解的方式,在各种应用场景下,网格系统如何才能更好地服务。

CSDN:前段时间HTML5的定稿对于开发者和类似Amaze UI等前端框架分别具备哪些意义?

陈本峰:Amaze UI是中国第一个HTML5开源框架,我们从很早以前就开始在推行HTML5,但那个时候,相对于Native App而言,HTML5还处于一个比较劣势的状态。但从2014年下半年开始,尤其到年底,整个HTML5市场关注度越来越高,越来越多的人去从事HTML5开发,主要类型为游戏和广告,在去年,诸如神经猫等的HTML5游戏刷爆了朋友圈,而HTML5广告也开始出现。相对于得靠耗钱刷榜才能跻身排行榜的各大应用商店而言,微信朋友圈已经成为了开发者们的一个重要战场,只要做一个比较有意思的内容,就会有很多人帮你传播,而其成本要低很多。

所以,现在越来越多的企业开始转向HTML5,尤其是去年年底的HTML5定稿,又大幅地增加了开发者们对于HTML5的信心。我们明显感觉到,大家对HTML5的关注度一下子提升了许多。这样对我们的框架肯定有着非常积极的促进作用,因为当开发者们都在开发HTML5应用时,Amaze UI能够帮助他们节省很多时间,并提高开发效率。

CSDN:2015年关于Amaze UI会有哪些进一步的举措?

陈本峰:在Google提出Web组件化不久,W3C便将其作为一个标准来制定,而Facebook、雅虎等巨头公司也都加入进来,我认为这个标准是大家都公认的,它将是未来Web开发的一个趋势。Amaze UI在2015年的重点工作就是Web组件,打造这么一个Web组件开发规范,将所有组件标准化。

此外,我们还将引入一种现下非常流行的Web App开发框架。网页开发分为Web App和Web Site两种不同的概念,网站是由一个个页面组成,而Web App则完全是App的体验,使用HTML5开发,未来的发展肯定会朝向Web App,因为这个体验更好,但目前相对而言开发门槛比较高,作为一款框架,Amaze UI将做一种最基础性的工作,降低门槛,让程序员开发Web App比以前更简单。

本文为CSDN原创文章

php栏目类,php分类类,php树类,tree.class.php

php栏目类,php分类类,php树类,tree.class.php

支持:1

* 得到父级数组

* 得到子级数组

* 得到当前位置数组

* 得到树型结构 4 种形式

文件:tree.class.php

<?php
/**
* 通用的树型类,可以生成任何树型结构
*/
class tree {
	/**
	* 生成树型结构所需要的2维数组
	* @var array
	*/
	public $arr = array();

	/**
	* 生成树型结构所需修饰符号,可以换成图片
	* @var array
	*/
	public $icon = array('│','├','└');
	public $nbsp = "&nbsp;";

	public $id = 'tid';//分类id 
	public $pid = 'pid';//父id


	/**
	* @access private
	*/
	public $ret = '';

	/**
	* 构造函数,初始化类
	* @param array 2维数组,例如:
	* array(
	*      1 => array('tid'=>'1','pid'=>0,'name'=>'一级栏目一'),
	*      2 => array('tid'=>'2','pid'=>0,'name'=>'一级栏目二'),
	*      3 => array('tid'=>'3','pid'=>1,'name'=>'二级栏目一'),
	*      4 => array('tid'=>'4','pid'=>1,'name'=>'二级栏目二'),
	*      5 => array('tid'=>'5','pid'=>2,'name'=>'二级栏目三'),
	*      6 => array('tid'=>'6','pid'=>3,'name'=>'三级栏目一'),
	*      7 => array('tid'=>'7','pid'=>3,'name'=>'三级栏目二')
	*      )
	*/

	public function init($arr=array()){
       $this->arr = $arr;
	   $this->ret = '';
	   return is_array($arr);
	}

	public function setid($id){

       $this->id = $id;

	}
	public function setpid($id){

       $this->pid = $pid;

	}
    /**
	* 得到父级数组
	* @param int
	* @return array
	*/
	public function get_parent($myid){
		$newarr = array();
		if(!isset($this->arr[$myid])) return false;
		$pid = $this->arr[$myid][$this->pid];
		$pid = $this->arr[$pid][$this->pid];
		if(is_array($this->arr)){
			foreach($this->arr as $id => $a){
				if($a[$this->pid] == $pid) $newarr[$id] = $a;
			}
		}
		return $newarr;
	}

    /**
	* 得到子级数组
	* @param int
	* @return array
	*/
	public function get_child($myid){
		$a = $newarr = array();
		if(is_array($this->arr)){
			foreach($this->arr as $id => $a){
				if($a[$this->pid] == $myid) $newarr[$id] = $a;
			}
		}
		return $newarr ? $newarr : false;
	}

    /**
	* 得到当前位置数组
	* @param int
	* @return array
	*/
	public function get_pos($myid,&$newarr = array()){
		$a = array();
		if(!isset($this->arr[$myid])) return false;
        $newarr[] = $this->arr[$myid];
		$pid = $this->arr[$myid][$this->pid];
		if(isset($this->arr[$pid])){
		    $this->get_pos($pid,$newarr);
		}
		if(is_array($newarr)){
			krsort($newarr);
			foreach($newarr as $v){
				$a[$v[$this->id]] = $v;
			}
		}
		return $a;
	}

    /**
	* 得到树型结构
	* @param int ID,表示获得这个ID下的所有子级
	* @param string 生成树型结构的基本代码,例如:"<option value=\$id \$selected>\$spacer\$name</option>"
	* @param int 被选中的ID,比如在做树型下拉框的时候需要用到
	* @return string
	*/
	public function get_tree($myid, $str, $sid = 0, $adds = '', $str_group = ''){


		$number=1;
		$child = $this->get_child($myid);



		if(is_array($child)){
		    $total = count($child);
			foreach($child as $id=>$value){
				$j=$k='';
				if($number==$total){
					$j .= $this->icon[2];
				}else{
					$j .= $this->icon[1];
					$k = $adds ? $this->icon[0] : '';
				}
				$spacer = $adds ? $adds.$j : '';
				$selected = $id==$sid ? 'selected' : '';
				#print_r($value);echo '<hr/>';
				@extract($value);

				
				$value[$this->pid] == 0 && $str_group ? eval("\$nstr = \"$str_group\";") : eval("\$nstr = \"$str\";");
				$this->ret .= $nstr;
				$nbsp = $this->nbsp;
				$this->get_tree($id, $str, $sid, $adds.$k.$nbsp,$str_group);
				$number++;
			}
		}


		return $this->ret;
	}
    /**
	* 同上一方法类似,但允许多选
	* $str = "<option value=\$id \$selected>\$spacer \$name</option>".PHP_EOL; //生成的形式
	* $tree->ret='';# ret 是 递归调用时 用到的变量 上边 tree 之后,ret有值 
	* $options = $tree->get_tree_multi(0,$str, $select_id = '1,2,3');
	*/
	public function get_tree_multi($myid, $str, $sid = 0, $adds = ''){
		$number=1;
		$child = $this->get_child($myid);
		if(is_array($child)){
		    $total = count($child);
			foreach($child as $id=>$a){
				$j=$k='';
				if($number==$total){
					$j .= $this->icon[2];
				}else{
					$j .= $this->icon[1];
					$k = $adds ? $this->icon[0] : '';
				}
				$spacer = $adds ? $adds.$j : '';
				
				$selected = $this->have($sid,$id) ? 'selected' : '';
				
				@extract($a);
				eval("\$nstr = \"$str\";");
				$this->ret .= $nstr;
				$this->get_tree_multi($id, $str, $sid, $adds.$k.'&nbsp;');
				$number++;
			}
		}
		return $this->ret;
	}
	 /**
	* @param integer $myid 要查询的ID
	* @param string $str   第一种HTML代码方式 
	* @param string $str2  第二种HTML代码方式
	* @param integer $sid  默认选中
	* @param integer $adds 前缀
	*/
	public function get_tree_category($myid=0 , $str="<div class=''>\$name</div>", $str2="<div class='selected'>\$name</div>", $sid = 0, $adds = ''){
		$number=1;
		$child = $this->get_child($myid);
		if(is_array($child)){
		    $total = count($child);
			foreach($child as $id=>$a){
				$j=$k='';
				if($number==$total){
					$j .= $this->icon[2];
				}else{
					$j .= $this->icon[1];
					$k = $adds ? $this->icon[0] : '';
				}
				$spacer = $adds ? $adds.$j : '';
				
				$selected = $this->have($sid,$id) ? 'selected' : '';

				@extract($a);
				if (empty($selected)) {
					eval("\$nstr = \"$str\";");
				} else {
					eval("\$nstr = \"$str2\";");
				}
				$this->ret .= $nstr;
				$this->get_tree_category($id, $str, $str2, $sid, $adds.$k.'&nbsp;');
				$number++;
			}
		}
		return $this->ret;
	}
	
	/**
	 * 同上一类方法,jquery treeview 风格,可伸缩样式(需要treeview插件支持)
	 * @param $myid 表示获得这个ID下的所有子级
	 * @param $effected_id 需要生成treeview目录数的id
	 * @param $str 末级样式
	 * @param $str2 目录级别样式
	 * @param $showlevel 直接显示层级数,其余为异步显示,0为全部限制
	 * @param $style 目录样式 默认 filetree 可增加其他样式如'filetree treeview-famfamfam'
	 * @param $currentlevel 计算当前层级,递归使用 适用改函数时不需要用该参数
	 * @param $recursion 递归使用 外部调用时为FALSE
	 */
    function get_treeview($myid=0,$effected_id='example',$str="<span class='file'>\$name</span>", $str2="<span class='folder'>\$name</span>" ,$showlevel = 0 ,$style='filetree ' , $currentlevel = 1,$recursion=FALSE) {
        $child = $this->get_child($myid);
        if(!defined('EFFECTED_INIT')){
           $effected = ' id="'.$effected_id.'"';
           define('EFFECTED_INIT', 1);
        } else {
           $effected = '';
        }
		$placeholder = 	'<ul><li><span class="placeholder"></span></li></ul>';
        if(!$recursion) $this->str .='<ul'.$effected.'  class="'.$style.'">';
        foreach($child as $id=>$a) {

        	@extract($a);
			if($showlevel > 0 && $showlevel == $currentlevel && $this->get_child($id)) $folder = 'hasChildren'; //如设置显示层级模式@2011.07.01
        	$floder_status = isset($folder) ? ' class="'.$folder.'"' : '';		
            $this->str .= $recursion ? '<ul><li'.$floder_status.' id=\''.$id.'\'>' : '<li'.$floder_status.' id=\''.$id.'\'>';
            $recursion = FALSE;
            if($this->get_child($id)){
            	eval("\$nstr = \"$str2\";");
            	$this->str .= $nstr;
                if($showlevel == 0 || ($showlevel > 0 && $showlevel > $currentlevel)) {
					$this->get_treeview($id, $effected_id, $str, $str2, $showlevel, $style, $currentlevel+1, TRUE);
				} elseif($showlevel > 0 && $showlevel == $currentlevel) {
					$this->str .= $placeholder;
				}
            } else {
                eval("\$nstr = \"$str\";");
                $this->str .= $nstr;
            }
            $this->str .=$recursion ? '</li></ul>': '</li>';
        }
        if(!$recursion)  $this->str .='</ul>';
        return $this->str;
    }
	
	/**
	 * 获取子栏目json
	 * Enter description here ...
	 * @param unknown_type $myid
	 */
	public function creat_sub_json($myid=0, $str='') {
		$sub_cats = $this->get_child($myid);
		$n = 0;
		if(is_array($sub_cats)) foreach($sub_cats as $c) {	

#print_r($c);

			# $data[$n][$this->id] = @iconv(CHARSET,'utf-8',$c[$this->id]);
			$data[$n][$this->id] = $c[$this->id];

#var_dump(  $this->get_child($c[$this->id])   );
			if($this->get_child($c[$this->id])) {
				$data[$n]['liclass'] = 'hasChildren';
				$data[$n]['children'] = array(array('text'=>'&nbsp;','classes'=>'placeholder'));
				$data[$n]['classes'] = 'folder';
				# $data[$n]['text'] = @iconv(CHARSET,'utf-8',$c['catname']);
				$data[$n]['text'] = $c['name'];
			} else {				
				if($str) {
					@extract(array_iconv($c,CHARSET,'utf-8'));
					eval("\$data[$n]['text'] = \"$str\";");
				} else {
					# $data[$n]['text'] = @iconv(CHARSET,'utf-8',$c['catname']);
					$data[$n]['text'] = $c['name'];
				}
			}
			$n++;

#echo '<hr/>';
		}
		return json_encode($data);		
	}
	private function have($list,$item){
		return(strpos(',,'.$list.','  ,  ','.$item.','));
	}
}
?>

 测试文件:test.php

<?php
header("Content-type:text/html;charset=utf-8");
include('tree.class.php');


$arr = 	 array(
	      1 => array('tid'=>'1','pid'=>0,'name'=>'1'),
	      2 => array('tid'=>'2','pid'=>0,'name'=>'2'),
	      3 => array('tid'=>'3','pid'=>1,'name'=>'1-1'),
	      4 => array('tid'=>'4','pid'=>1,'name'=>'1-2'),
	      5 => array('tid'=>'5','pid'=>2,'name'=>'2-1'),
	      6 => array('tid'=>'6','pid'=>3,'name'=>'1-1-1'),
      	  7 => array('tid'=>'7','pid'=>3,'name'=>'1-1-2')
	     );
/*把类 实力为 对象 */
$tree = new Tree();
# 初始化 类 
$tree ->init($arr);


echo "get_tree() 生成树 <br/>".PHP_EOL;
$str = "<option value=\$id \$selected>\$spacer \$name</option>".PHP_EOL; //生成的形式
$options = $tree->get_tree(0,$str, $select_id = 5);




echo '<select>';
echo($options);
echo '</select>';



echo '<hr/>';##################################################################


echo 'get_parent( 6 )得到父级 数组 (6 de 父亲的兄弟姐妹)<br/>'.PHP_EOL;
print_r( $tree -> get_parent( 6 ) );

echo '<hr/>';##################################################################

echo 'get_child( 1 )得到子级数组 数组 (1 de 儿子的兄弟姐妹)<br/>'.PHP_EOL;
print_r( $tree -> get_child( 1 ) );

echo '<hr/>';##################################################################

echo 'get_pos( 6 )得到当前位置数组 <br/>'.PHP_EOL;
print_r( $tree -> get_pos( 6 ) );
$str = '';
foreach($tree -> get_pos( 6 ) as $k => $v){ 
	$str .= "<a href=\"?tid={$v['tid']}\" >{$v['name']}</a> > ";
}
echo $str;

echo '<hr/>';##################################################################

echo "get_tree_multi() 生成树 多选 <br/>".PHP_EOL;
$str = "<option value=\$id \$selected>\$spacer \$name</option>".PHP_EOL; //生成的形式
$tree->ret='';# ret 是 递归调用时 用到的变量 上边 tree 之后,ret有值 
$options = $tree->get_tree_multi(0,$str, $select_id = '1,2,3');

echo '<select size="10"  multiple="multiple">';
echo($options);
echo '</select>';

echo '<hr/>';##################################################################

echo "get_tree_category()  <br/>".PHP_EOL;
$str = "<option value=\$id \$selected>\$spacer \$name</option>".PHP_EOL; //生成的形式
$tree->ret='';# ret 是 递归调用时 用到的变量 上边 tree 之后,ret有值 
$options = $tree->get_tree_category(0 , "<div class='' data-tid={\$id} >  {\$spacer}   {\$name} </div>", "<div class='selected' data-tid={\$id} >  {\$spacer}   {\$name} </div>", $sid = 5, $adds = '') ;

echo($options);

echo '<hr/>';##################################################################

echo "get_treeview()  <br/>".PHP_EOL;
$str = "<option value=\$id \$selected>\$spacer \$name</option>".PHP_EOL; //生成的形式
$tree->ret='';# ret 是 递归调用时 用到的变量 上边 tree 之后,ret有值 
$options = $tree->get_treeview() ;

echo($options);

echo '<hr/>';##################################################################

echo "creat_sub_json()  这个能干什么没看懂???<br/>".PHP_EOL;
$tree->ret='';# ret 是 递归调用时 用到的变量 上边 tree 之后,ret有值 
$options = $tree->creat_sub_json() ;

echo($options);

下载地址:http://pan.baidu.com/s/1i3xg6fb

HTML5的FileReader接口封装 – FileReader.js

FileReader.js 封装了 HTML5 的 FileReader interface ,使用上更加简单。

浏览器支持:

  • Internet Explorer: 10+
  • Firefox: 10+
  • Chrome: 13+
  • Opera: 12+
  • Safari: partial

var opts = {
    dragClass: "drag",
    accept: false,
    readAsMap: {
        'image/*': 'DataURL',
        'text/*' : 'Text'
    },
    readAsDefault: 'BinaryString',
    on: {,
        beforestart: function(e, file) {
        	// return false if you want to skip this file

    	},
        loadstart: function(e, file) {
        	// Native ProgressEvent

    	},
        progress: function(e, file) {
        	// Native ProgressEvent

    	},
        load: function(e, file) {
        	// Native ProgressEvent

    	},
        error: function(e, file) {
        	// Native ProgressEvent

    	},
        loadend: function(e, file) {
        	// Native ProgressEvent

    	},
        abort: function(e, file) {
        	// Native ProgressEvent

    	},
        skip: function(e, file) {
        	// Called when a file is skipped.  This happens when:
        	// 	1) A file doesn't match the accept option
        	// 	2) false is returned in the beforestart callback
    	},
        groupstart: function(group) {

    	},
        groupend: function(group) {

    	}
    }
};

项目主页:http://www.open-open.com/lib/view/home/1338651006609

扩展阅读:

html5将图片转换base64进行上传、解决微信内置浏览器上传图片问题
HTML5学习之FileReader接口
HTML5的FileReader接口封装 – FileReader.js

HTML5学习之FileReader接口

用来把文件读入内存,并且读取文件中的数据。FileReader接口提供了一个异步API,使用该API可以在浏览器主线程中异步访问文件系统,读取文件中的数据。到目前文职,只有FF3.6+和Chrome6.0+实现了FileReader接口。

1、FileReader接口的方法

FileReader接口有4个方法,其中3个用来读取文件,另一个用来中断读取。无论读取成功或失败,方法并不会返回读取结果,这一结果存储在result属性中。

FileReader接口的方法

方法名 参数 描述
readAsBinaryString file 将文件读取为二进制编码
readAsText file,[encoding] 将文件读取为文本
readAsDataURL file 将文件读取为DataURL
abort (none) 终端读取操作

2、FileReader接口事件

FileReader接口包含了一套完整的事件模型,用于捕获读取文件时的状态。

FileReader接口的事件

事件 描述
onabort 中断
onerror 出错
onloadstart 开始
onprogress 正在读取
onload 成功读取
onloadend 读取完成,无论成功失败

3、FileReader接口的使用

 

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>HTML5学习之FileReader接口</title>
</head>

<body>
<script type="text/javascript">
var result=document.getElementById("result");
var file=document.getElementById("file");

//判断浏览器是否支持FileReader接口
if(typeof FileReader == 'undefined'){
    result.InnerHTML="<p>你的浏览器不支持FileReader接口!</p>";
    //使选择控件不可操作
    file.setAttribute("disabled","disabled");
}

function readAsDataURL(){
    //检验是否为图像文件
    var file = document.getElementById("file").files[0];
    if(!/image\/\w+/.test(file.type)){
        alert("看清楚,这个需要图片!");
        return false;
    }
    var reader = new FileReader();
    //将文件以Data URL形式读入页面
    reader.readAsDataURL(file);
    reader.onload=function(e){
        var result=document.getElementById("result");
        //显示文件
        result.innerHTML='<img src="' + this.result +'" alt="" />';
    }
}

function readAsBinaryString(){
    var file = document.getElementById("file").files[0];
    var reader = new FileReader();
    //将文件以二进制形式读入页面
    reader.readAsBinaryString(file);
    reader.onload=function(f){
        var result=document.getElementById("result");
        //显示文件
        result.innerHTML=this.result;
    }
}

function readAsText(){
    var file = document.getElementById("file").files[0];
    var reader = new FileReader();
    //将文件以文本形式读入页面
    reader.readAsText(file);
    reader.onload=function(f){
        var result=document.getElementById("result");
        //显示文件
        result.innerHTML=this.result;
    }
}
</script>
<p>
    <label>请选择一个文件:</label>
    <input type="file" id="file" />
    <input type="button" value="读取图像" onClick="readAsDataURL()" />
    <input type="button" value="读取二进制数据" onClick="readAsBinaryString()" />
    <input type="button" value="读取文本文件" onClick="readAsText()" />
</p>
<div id="result" name="result"></div>
</body>
</html>

扩展阅读:

html5将图片转换base64进行上传、解决微信内置浏览器上传图片问题
HTML5学习之FileReader接口
HTML5的FileReader接口封装 – FileReader.js

html5将图片转换base64进行上传、解决微信内置浏览器上传图片问题

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>html5将图片转换base64进行上传、解决微信内置浏览器上传图片问题</title>
</head>

<body>
<script>
function readFile(obj){   
        var file = obj.files[0];      
        //判断类型是不是图片  
        if(!/image\/\w+/.test(file.type)){     
                alert("请确保文件为图像类型");   
                return false;   
        }   
        var reader = new FileReader();   
        reader.readAsDataURL(file);   
        reader.onload = function(e){   
                alert(this.result); //就是base64  
   
        }   
}   
</script>
<input type="file"  id="picFile" onchange="readFile(this)" />   
</body>
</html>

扩展阅读:

html5将图片转换base64进行上传、解决微信内置浏览器上传图片问题
HTML5学习之FileReader接口
HTML5的FileReader接口封装 – FileReader.js

走向物联世界的应用

今天,成千上万的应用是为了让生活更加容易,无论是召唤出租车还是控制你的家庭供暖系统,理想情况下,这些应用应该作出正确的反应,因为它们收集了大量我们个人使用的数据。

但是我们目前所熟悉的应用主要还是集中于智能手机,外部设备通过无线科技被更好的集成,这时提供一个全新的应用群集将会改变我们的日常生活。因此,智能手机需要承担一个新的角色——互连世界的神经中心,技术人员更愿意称之为物联网。它已经开始,一些有趣的应用已经部署,这里有一些领域可以为投资者提供机会,同时品牌营销人员可以用一种崭新的方式去和消费者沟通。

从单一的健身追踪到全面的“万物开花”

已经流行起来的是类似Fitbit和Jawbone Up这类的腕戴活动追踪器,可以发送信息告知我们燃烧了多少卡路里,或者通知我们已给定某天的行程。然而苹果已经通过即将发布的Apple Watch改变了这一“游戏规则”。手表将不再仅限于健身,允许用户沟通、查阅天气甚至是心跳……

手表将集成来自其他品牌的应用,比如Nike,将包含它的Nike+应用作为设备的一部分。像其他的一些大的竞争者已经推出了自己的智能手表,如LG、Samsung和Motorola。Moto360能够做一些记笔记、玩游戏以及语音指令开车或行走方向的事情。

汽车的驾驶技术会比你好

在不久的将来,你的手机也将与你的汽车自动同步数据,包括使用频率、平均速度或汽车维护等。例如它会发送一个文本到你的手机上,告诉你是时候加油或检查汽车了。事实上今天已经有几个这样的应用,如Automatic、Torque和Mojio——利用汽车的OBD-II端口来收集你汽车的诊断数据并通过蓝牙适配器发送到你手机上。正如我们所看到的那样,谷歌无人驾驶汽车成为现实。并且在几年之内,所有的汽车都将配备Wi-Fi。

智能的家

很多人都应该知道Nest,一种家庭维护系统,让用户可以通过他们的智能手机来控制家庭恒温器或监视火灾的危害和CO2。不过目前很多公司正在努力开发更复杂的家庭安全和维护应用。例如一家名为Elgato的公司创造了一个新的家庭传感器,通过蓝牙技术收集空气压力、质量、温度、湿度以及用水量等数据。

下一站

这些只是冰山一角。将应用嵌入网络连接的设备,智能手机作为其神经中心,这是一个很大的机遇,而对于消费者而言,问题将集中在隐私领域。所以也需要有一种努力在这方面,让技术更好的满足于我们的生活。

☆ 十二星座都把什么放第一位?

白羊座:工作

受火星的影响,白羊座的人都有一种勇于冒险、不吝啬及领导的能力,特别是表现在工作方面,这是白羊座最大的魅力。白羊座的人天生具有很好的突击精神和精力,再加上积极努力的魄力,当灵感一闪,脑中立刻产生了构想及做法时,就会马上采取行动,做任何事都喜欢跑第一,立在最前端,充分的发挥领导的能力。

在他们心里,喜欢的事,最心爱的人,都不能动摇他们对于工作的冲劲。白羊就是一个典型的工作狂,所以,跟他们在一起前要慎重的考虑哦。

金牛座:金钱

金牛座对于金钱的热衷,其实源自于他们的没有安全感,他们认为谁都靠不住,只有紧紧握住兜里的钱才是正理。还有另外一点,没有安全感的金牛们都渴望拥有温 馨的家,让自己可以安心的生活,有责任感的他们总是希望自己能让家人享受到富足的生活。

拥有了爱人的金牛,则是希望自己能为爱人搭建起一个温暖的避风港,两人共享天伦之乐。金牛们笃信——贫贱夫妻百事哀。而实现这些,最现实的问题仍然是财政问题。因此,在没有成熟物质条件的情况下,金牛们往往不会匆忙地走入婚姻。不断充裕自己的财富始终是金牛们价值观的重点。他们一直认为有了面包才能有一切。

双子座:自己

多情,灵敏,善交际,这就是双子座。双子座的人非常擅于推销自己,不过个性多变,几乎可以用双面人来形容,双子的性格集合了12星座的各种特点,双子座是从冬季到春季之间,出现在银河东岸的一个星座。双子座的符号表示双胞胎的兄弟,其守护星为水星,守护神为支配知识的赫尔美斯。

在双子心里,没有很重要的东 西,几乎都是在一个位置,或者排行经常变化,有时候爱情重要,有时候亲情重要。不同的双子就更不一样了。要说稍微重要一点的,那就是自己了。这个唯一不变的信念。

巨蟹座:物质

天生缺乏安全感的巨蟹座,对巨蟹来说安全感来自两个方面,充足的金钱和稳固的家庭关系,缺一不可而物质首当其冲排在第一位,这样会给很多人错觉,觉得巨蟹 很虚伪,很势利,很自私,怪只能怪他们对现实过于理智,其实也是因为巨蟹家庭观念太深。

面包跟爱情都要,这样才能让自己过得更好,而跟金牛一样,没有面 包,爱情又怎么会幸福呢。所以,在巨蟹的心里,有了物质,才能有爱情,这是前提条件,也是保证。不过。巨蟹座是最执着的星座,他们对朋友、对家人的忠实,做事会一直坚持到底。

狮子座:亲情

不要看他们总是一副高高在上的样子,连头都不肯低下来。其实他们只是用这样高傲的样子来掩饰自己的没有安全感,自己的慌乱。他们是一个很让人心疼的星座,刀子嘴豆腐心永远不肯服输,他们不是不在乎爱情,只是,他们不敢去想,小说里的情节,会发生在自己的身上。

也许,狮子座更害怕被欺骗,他们有神经质,别人说了什么,就来回去想,想着想着就变了味道。狮子最会瞎想,常常想的自己都睡不着觉,跟他们相处时间长了,你就知道他们有多天真。他们最在乎的就是亲情,他们天生觉得家人是无人可比,要一辈子好好保护的。

处女座:学业

处女座追求完美,吹毛求疵是他们的特性。多数的处女座都很谦虚,但也因此给自己造成很大的压力。神经一直得不到放松,处于紧张得状态。处女座的人一般成绩 都能挺好。他们心思细腻谨慎,追求精确,想做的事一般都会努力兢兢业业的去做。

处女座的人很容易悲观,所以他们总是希望生活中人人都不要那么计较,天天可以过着无忧无虑的生活,在他们的心里,只有认真读书,才能有出息,才能保护想要保护的人,做想做的事,所以处女座的人一般都会认真的读书,以此达到自己心 中的梦想。

天秤座:利益

天秤座人对于细节的表现比较单一,但是表达起来却很上心。他们喜欢在一个方面表现得很强大,其中天秤座人对于社交或者交友都具有一定的技术手段。他们对于爱 情,友情,亲情,要求不多,也不会付出多大的心血。

其实天秤座最爱的是自己,他们为了让自己得到利益,可以装遍12个星座也在所不惜。他们不会为了利益放弃任何事,可以说,这是个外表看起来儒雅可人,风度翩翩,内里野心勃勃,利益当头的星座。

天蝎座:亲昵

天蝎座非常神秘,冥王星的守护给天蝎带来许多阴暗特质,天蝎座主管生殖器官,所以性欲旺盛,他们有着原始的性感躯体,把性爱放在第一位那也是不足为奇了。天蝎属于阴性,却由阳性火星守护,和白羊座人看似天差地别,却容易产生激烈的热情,结果往往还不错,让人意外。

天蝎座属于外冷内热型,俗称“闷骚”。一般脸部不会有有太大表情,可是他们的心里却很热情。这样的星座往往相处久了就会情不自禁的爱上TA,因为TA会在不知不觉中给你以体贴温柔的感觉,而外面却显得很刚硬,让人不自觉的心疼。

射手座:快乐

他就是个长不大的孩子,天真,爱玩,想要做的事一定会马上动手。射手阳光起来,可以纯真的像个孩子,本身射手就是爱玩爱自由的大孩子,爱上射手的人,最好 不要剥夺她玩的权利,否则她一定会逃跑。

而且如果射手不想你找到她的话,你就会一辈子找不到她。似乎没有什么可以束缚住他们,快乐便是他们生活的主题曲,有快乐足以。不管是亲情友情还是爱情,都能成为快乐的根源。而阻碍他快乐的根源的,他们会一一扫清。这也就是射手座经常不自觉的逃避的原因。

摩羯座:家人

生于寒冬,长于炎夏,是典型的外冷内热。可以抚慰他们那脆弱单薄的心的,他们觉得只有家人可以。摩羯座是十二星座中最有耐心,为事最小心、也是最善良的星座。他们做事脚踏实地,也比较固执,不达目的是不会放手的。

所以经常为了能给家人过上好日子而努力的奋斗事业,在他们心里,家人是第一位,可以为了他们做任何事,他们的忍耐力也是出奇的强大,同时也非常勤奋。他们心中总是背负着很多的责任感,但往往又很没有安全感,不会完全地相信别人。除了家人可以让他们无所顾忌的。

水瓶座:友情

很多人会把亲情,爱情排在第一位,可是水瓶座的人却总是把友情看得很重。他们对人友善又注重隐私。水瓶座绝对算得上是”友谊之星“,他喜欢结交每一类朋 友,但是确很难与他们交心,那需要很长的时间。他们对自己的家人就显得冷淡和疏远很多了。

由于受土星的影响,水瓶座的男生性格比较冷漠、孤僻,甚至在某些 特殊的情况下会表现得异常冷漠和不近人情。但是很多时候,他们又表现出幽默,善于交际的一面,并且还对人非常热忱,愿意帮助人。因此身边总有很多朋友,而 他们也渐渐把友情当成心里最重要的事。

双鱼座:爱情

这是一个很梦幻的星座,爱浪漫,爱幻想,爱童话。双鱼座是十二宫最后一个星座,他集合了所有星座的优缺点于一身,同时受水象星座的情绪化影响,使他们原来 复杂的性格又添加了更复杂的一笔。

在他们充满童话世界的脑海里,爱情是排在第一位的。黑马王子跟白雪公主的爱情故事那么动人心扉。他们已经完全迷醉在里面了。总幻想一些为了爱情抛弃事业,家人的戏码。

改良程序的11技巧

有很多理由都能说明为什么我们应该写出清晰、可读性好的程序。最重要的一点,程序你只写一次,但以后会无数次的阅读。当你第二天回头来看你的代码时,你就要开始阅读它了。当你把代码拿给其他人看时,他必须阅读你的代码。因此,在编写时多花一点时间,你会在阅读它时节省大量的时间。

让我们看一些基本的编程技巧:

1、尽量保持方法简短

2、永远永远不要把同一个变量用于多个不同的目的

3、使用自描述的变量名和方法名

4、尽可能的把变量定义在靠近使用它的地方

5、拒绝神秘数字

6、友好的对待你的语言

7、不要逆常规而行

8、警惕过早优化

9、积极重构测试过的程序

10、不要过度沉迷于技巧

11、通过习例学习新知

现在,让我们把每个小点展开来详细讲一下。

1、尽量保持方法简短

尽管很多人都遵循这个规则,但它仍然非常的重要。你写的方法要始终能在一个屏幕里放得下。如果你需要去滚动屏幕,这会分散你的注意力,而且你看不到整个的上下文。最佳长度是5-20行,这根据你的情况而定。当然,getters/setters 通常是一行代码的方法,但与其说它们是真正的方法,不如说它们只是存取工具。

2.永远永远不要把同一个变量用于多个不同的目的

一个变量应该始终只为一个目的服务。通过使变量常量化(C++里的const, Java里的final),使得编译器能够优化编译,而且使你的代码醒目表达这个变量是不能改变的,你的程序的可读性会变得更好。

3.使用自描述的变量名和方法名

你的代码应该,对于任何人来说,只要看一眼就能知道是干嘛的。尽量不要用简写方式,除非有特殊的习惯,就像下面的:

src – source pos – position prev – previous

如果你认为描述性的名称并不是那么有价值,请对比一下n, ns, nsisd 和numTeamMembers, seatCount, numSeatsInStadium。

4.尽可能的把变量定义在靠近使用它的地方

盖房子时,你可不希望把锤子放到别人的院子里。你希望把它们放的离手头越近越好。定义变量也是同样的道理。

int foo = 3; int bar = 5; // 一大段使用“bar”的代码, // 但没用到“foo” // … baz(foo);

这段代码可以简单的重构成

int bar = 5; // 一大段使用“bar”的代码, // 但没用到“foo” // … int foo = 3; baz(foo);

当你把变量的声明和第一次用到它的地方间隔太远时(距离超过一个屏幕),这确实会成为一个问题。记住上下文关系会变得困难,你需要滚动屏幕去找哪来的这个变量。

5.拒绝神秘数字

当你要把什么东西跟一个常量值做比较时,记得把这个值定义成常量。没有什么会比去猜测你的同事写的这样的代码更让人头疼的事了:

il < 4384

换个形式感觉如何?

inputLength < MAX_INPUT_LENGTH

6.友好的对待你的语言

学习新语言是一种很有乐趣的事情,你能学到一种新的完成任务的途径。当一个对一种语言已经很专业的人去学习另一种语言时,会出现一种很大的负面效应。比如说你是一个Java开发者,试图去学习Ruby。你应该学会用Ruby的方式解决问题,而不是沿用Java的解决问题的思想。

当你需要重复5遍”Hello world!“时,在Java里,你可能会这样做:

for (int i = 0; i < 5; i++) { System.out.println("Hello world!"); }

在Ruby里,你也许会禁不住这样写:

for i in (0..5) puts “Hello world!” end

这样看起来没问题,但有一个更好的方式:

5.times { puts “Hello world!” }

7.不要逆常规而行

每种语言都有自己不同的习俗约定。一般来说,人们听的最多的是Java的编码规范。让我们看看其中的一些习俗规范:

●方法名应该小写字母开头,其后用字母大写的单词连接(veryLongVariableName)

●类名应该都使用首字母大写的单词连接而成

●常量名应该全部大写,用下划线连接(MY_CONSTANT)

●左大括号应该跟 if 语句在同一行

只有在有必要的理由时才去打破这些常规,不要轻易的因为你不高兴就违反它。如果你只是在团队里改变一些这样的习惯,那也没问题,但当把你代码拿出来和其他的没有这些思想准备的程序员共享时,问题就会来了。

8.警惕过早优化

过早优化是所有问题的根源,至少电视上是这么说的 … 你第一应该关心的事情是写出易于理解的代码。起初写的程序不要求快。除非你的程序很慢,否则谈优化都是为时太早。如果你想优化什么东西,你首先需要知道问题出在哪。这就是我们需要profilers这个工具的原因。

在没有知道问题在哪的情况下试图对程序进行优化,其结果必然是把程序能坏,至少你的代码会丧失可读性。如果你觉得有些地方很慢,不要盲目的重写代码,你应先找到慢的证据。

不要傻乎乎的去解决根本不存在的问题。

9.积极重构测试过的程序

没有任何东西会是完美的。即使你感觉你真正写出了一段完美的代码,几个月后回头再看看,你可能会惊讶道”怎么会这样傻?“

改进程序的一个好方法就是重构,但要等程序测试通过之后。你首先要确保程序是好的可运行的,你可以通过自动化测试或手工测试完成这个工作。

之初,你需要的是程序可用。不要期望在第一次就写出完美的程序,你只需要把它写出来,可用。然后重构它,使之完美。对于你们当中知道测试驱动开发(TDD)的人来说,对这个会很熟悉。这里的关键就在于你要习惯于重构这种事情。如果你使用的是像IntelliJ IDEA这样强大的集成开发工具的话,重构的工作会变得简单的多。

重构之后,你也许会弄出一些Bug,导致某些功能出问题。这就是为什么说写自动化测试的原因。不论何时重构后,只要运行一下所有的测试用例,你就能准确的知道什么地方出了问题。

10.不要过度沉迷于技巧

当我第一次读到有关设计模式的知识时,我觉得我找到了圣杯。这些精心设计的思想作用显著,它能使你的设计易于理解,因为你可以简单的说”我使用的是‘观察器模式’“,而不用从头到尾的解释一遍。那么,有问题吗?一切看起来都这么自然、简单,你开始不论在哪都使用设计模式。为什么不把这个类做成singleton呢?干嘛不去再创建一些工厂类呢?

于是一个80行就能写完的脚本,你最终使用了10个类,15个接口,外加一大堆范式和标记符。97%的代码不做任何事情。设计模式是一种十分有用的用来简化你的设计的工具,但这不意味着你该在所有能用到的地方都用它。你应该用它们,但不能滥用。

11.通过习例学习新知

编程是一种学习新知的过程。当你学到了新的程序库或新语言,你可能会迫不及待的丢掉旧的代码,用你新学到的东西重新写一遍。有很多的理由都能说明你不该这么做。

往现有的应用里增加新的类库或框架同属于这种情况。就说你写了一个Javascript的web应用,期间,你发现了jQuery。现在你突然急切的想丢到你的Javascript程序,重新用jQuery写,尽管你还从来没用过它。

最好的方式是你先用jQuery写一些简单的例子,通过这种方式把你在应用里将要用到的知识都学会。需要AJAX?在你的项目之外做一些小例子,当完全弄懂了后,丢掉例子,应用到你的产品里。

如果你非常关注编程技术,我强烈的推荐你阅读Steve McConnell写的《代码大全》 一书。它会永远的改变你对编程的认识。:)

年终奖后,程序员的下一站是?

不可免俗,说说在这么一个时间节点里,大家都在议论的问题——年终奖。舆论的喧嚣里,有百度年会中曝出的50个月工资的年终奖,有阿里3000股股票,相当于100个月工资的年终奖。剥离炒作的噱头,谁都明白,这是个别公司的个别案例。

更多人的真实情况或许如此:年终奖=1~4*月薪。纵是如上的百度、阿里土豪,大多数人也是2.6*月薪(百度),4~9*月薪(阿里)。

年终奖后的下一站是?

在这个节点,说到年终奖,自然要说到一个大家「心照不宣」的问题——年终奖后的去或留。对于占了互联网行业不小比重的程序员来说,去的人往往比留的人多。原因或与大环境有关。

多年前,互联网行业只是互联网行业,如今,互联网与其他行业已不再有「泾渭分明」的区分,因为快速发展的互联网、移动互联网已像一匹脱缰的野马冲入传统行业,如金融,如租车,如外卖……因此,以往只是传统IT行业和互联网行业需要程序员,到现在已是每一个行业都需要程序员。

除此之外,回想2014年,国内互联网领域共发生1878笔融资,融资总额超1000亿元人民币。创业公司的平均融资金额是2013年的3倍以上,每个月融资金额达到1000万美元的公司大概是20个左右。

于是,也就有了「程序员跳槽薪资便翻倍」的行业「潜规则」。不管「潜规则」的可实现程度到底有多高,不争的事实是:程序员在拿完年终奖后选择离开的比例肯定不在少数。面对如今的招聘网站及猎头市场,一个好的程序员怎样才能顺利地实现行业「潜规则」呢?

招聘网站?求助于主打信息流的招聘网站,对于一个好的程序员而言,时间成本显然太高,个人隐私也成问题。熟人介绍?个人资源的有限性注定可供选择的甲方太少。求助猎头?只想为企业服务的猎头公司,对求职者来说,风险不小。

这些都排除在外后,对程序员而言,还剩什么选择?有没有一个拥有更多选择,又能保护自己隐私的求职平台呢?其实,这类平台在市场上已有几家。不过,因规模、受众的原因,名气并不大。以其中的100offer 为例,你就会发现对程序员跳槽而言,这类平台是一个较为明智的选择。

为什么说明智?按一位曾使用过100offer的程序员的说法,他把自己的简历丢给100offer,进入100offer 的「拍卖库」后,他要做的就是等待机会找上自己,按自己的想法去选择工作机会。在这个过程中,也用不着担心公司知道,更不必接受来自各种不明猎头公司的电话骚扰。

最后的结果,自然是这位程序员顺利地拿到自己想要的薪水、自己想做的工作。

需要说明的是,对程序员而言,100offer 本身也是一个有门槛的平台。宽进严出,程序员都可在平台上进行注册,但只有5%的注册用户可以享受到「拍卖」服务。这5%是怎样的呢?是在互联网公司工作两年以上,年薪大于20万的程序员。

程序员的薪资有泡沫吗?

随着行业的发展,这两年,程序员的薪资也水涨船高,另一种声音也就来了:程序员的薪资有泡沫吗?关于这点,问答社区知乎也有过不少议论。

想说的是,程序员的薪资确是携了产业发展大势的幸运,但并不存在所谓的「泡沫」。

看几组并不精确的数据。2000年,软件业产值规模是 240 亿;2013年,软件业产值规模是3万亿。2000年,软件业从业人员15万人;2013年,软件业从业人员470万人。前一组数据中,若加上自2000年后快速发展的互联网行业,其产值规模更是不可估量。这也就意味着,这些年来,程序员创造的价值正成几何倍数递增,但薪资水平并没有按同等比例的倍数增加。

另外,在相当多的互联网企业研发部门中,月加班100小时是主流,按正常上班时间一天8小时计算,也就意味着,相比普通上班族,每月多出12天的工作时间。

所谓的薪资泡沫何在呢?

最后。文章并非鼓励程序员频繁跳槽,获得「溢价」,而是想让程序员获得「议价」,匹配自己创造的价值。后者也是类似于 100offer 这样的平台的价值所在。

在ajax的url参数中callback=? 起什么作用

在 jQuery 中,可以通过使用JSONP 形式的回调函数来加载其他网域的JSON数据,如 “myurl?callback=?”。jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。
jQuery 会把?注册成window.? 的系统函数,然后映射调用。
一般用于跨域ajax请求,提供URL的一方会返回一个callback函数的JSON数据,然后回调时就能获取了。

请求的URL例子:
“myurl?callback=123123123” //这个123123就是?号,jquery自动生成的。
返回的数据例子:
123123123({“id”:”1″,”name”:”张三”})

别有用心的小米Note

3000多元,这是锤子手机起初的定价,后来迫于现实,锤子手机大幅调价。而在另一头,被资本市场热捧的小米在产品线拓展完中低端手机后,逆势而上推出了高端手机——小米Note,其顶配版本硬件非常炫目,但价格也达到了3299元。这一价格公布之后,网络上围观的用户一片哗然,不少人表示——小米性价比不再了、小米不再“发烧”、我何不再加1000多买iPhone……不仅如此,不少媒体和自媒体也纷纷发表类似的看法或看衰的言论。

对于3299元这一价格,小米联合创始人兼总裁林斌出席极客公园2015创新大会时称,小米Note 3299元的价格是贴着成本走的,依然主打性价比;而雷军也在一篇题为《为什么小米要做定价3299元高端手机》里指出,3299元依然是紧贴成本定价的,并且他还表示,这是小米用户的需要。

假设一个前提,如果他们说的确是事实,那么就有了两个疑问点:1.之前都是围绕1999价格成本推产品,为什么这次非要围绕2000和3000多的价格推产品?这真是小米——那群对价格比较敏感用户的需要吗?

这的确很难解释得通,但如果你看过发布会,或者仔细留心小米、雷军以及相关人的言论之后,你就会明白这一切是为什么了——小米生态系统需要一款高端手机,至少是价格上摆脱那群追求(Diao)性价比(丝)的用户。

他们曾反复宣传,小米推行“以手机为中心,连接所有智能设备”的战略,设计了“智能模块+通用控制中心+云服务”的智能家居整体解决方案,其中一些设备虽然不乏价格确实挺实惠,但整体的一揽子方案堆积起来,这不是那群对价格敏感用户所能承担的价格。另外这群用户也不太可能尝鲜,或许他们有尝鲜的想法,但消费习惯决定了他们不可能消费一些非必需品,他们最迫切的需求或许就是如何买得起房子、怎么去还房贷。从这点来看,小米庞大的生态圈(比如说智能家居)只能向一些有品位、解决了温饱并具备享受资本的人拓展,但这些人会用红米、小米4等千元系列手机吗?如果不用,实现用小米手机连接一切的战略就成了泡影,因此打开高端用户群体就成了关键。那如何突破这群“高端”用户?

商业调查记者、哈佛大学企业管理硕士出身的Charles Duhigg曾在《习惯的力量》揭示了一个奥秘:利用“暗示”、“惯常行为”和“奖赏”这三大要素可以影响消费者的习惯,他们不知不觉就会上商家的一些小把戏。如果说智能家居是奖赏,那么惯常行为就是他们喜欢追求有品质、不一样的生活,小米则就需要一个暗示来让这些“高端”用户形成习(上)惯(钩),因此3299元的小米Note或许就成了一个起点——暗示小米不Low,符合他们的生活品味。

雷军曾说过,小米的梦想是让每个人都能享受科技的乐趣,如果换另外一个角度进行解读的话,那就是小米的野心是想把所有人都圈在小米的生态圈内。若要实现这个梦想,小米生态圈的建设就应该从上往下,只有高端用户认可产品(尤其是智能家居领域),下面的用户才会跟进,然后顺延下来。

也许结局真如有些自媒体分析的,小米Note会步锤子手机的后尘——销量的确不咋的,但只要小米有高端手机,只要能突破其低端、廉价的形象,那么小米的目的就到了。

HTML5 VS 原生,世界究竟是谁的?

HTML5在近两年里可算是出尽了风头,无论是去年10月底的规范定稿,还是今年年初惊爆业内的微信开放JS SDK,亦或是腾讯、百度、360、搜狐等互联网巨头之间的布局争夺。这一切的一切似乎都在预示着HTML5将要给移动互联网界带来颠覆性变革。

也许以后,HTML5真的会重新定义移动互联网的黄金时代。但在此之前,当你准备开发一款应用时,切不可只一味的追寻别人所尊崇的技术,最重要的还是要搞清楚自己的整体需求。其中最为关键的问题包括“应用的受众是哪些?”、“用户想要获得的是什么?”,以及“吸引客户最好的策略是什么?”。其实,总的来说也就是两点:移动用户体验,劳动和资本投资需求。

既然有如此多的顾虑,那么总要选择最适合自己的开发方式。关于这个问题其实早就有各种分析,而这次我们再整体性的探索Web、原生以及混合应用开发之间的历史渊源。

Web应用:最小化成本,更新敏捷性

别看现在的HTML5风光无限,其实它的发展道路也是让人不胜唏嘘。自出生到去年规范的尘埃落定,长达8年的长跑真心不容易。其中最大的惨败要数2012年的Facebook事件,当时Facebook CEO扎克伯格怒言“押注HTML5是Facebook最大失误”,进而转战原生应用,这让支持HTML5的人受到了不小的打击。

还好,HTML5依然挺了过来,相继也出现了各种HTML5开发框架和游戏开发引擎。再加上,前段时间YouTube替换Flash,正式默认使用HTML5视频播放器,着实让HTML5好好的扬眉吐气了。一件事物能受欢迎,总归有受欢迎的理由。那么,HTML5又有那些优势?

“一次编写,随处运行”。大多数浏览器都有着相同的运行方式,一个应用几乎可以在所有浏览器上运行,不像限定于只能在某一系统下运行的原生应用。对于用户来说,“一次编写,随处运行”的HTML5应用意味着应用的连续性,即不管是哪个操作系统都可以运行使用应用程序。
允许应用不断更新。HTML5还允许不断更新,开发者不需要再将新应用提交给应用商店等待批准。每次用户登录到该web应用时,都将获得应用最新版本。

以上两点都是众所周知的,其实最主要的原因还是应用开发的成本问题。相较原生应用,能够随处运行的HTML5,单在移植方面就省下了不少银子。而且,面对新平台,无需高价聘请专业人士或培养现有的人员去重新学习,先前的Web技术人员就可以直接使用。

原生应用:最大化性能和用户体验

原生应用的历史要比Web应用悠久的多,如地址簿、日历和计算器等默认自带的应用程序及可用的Web连接在很早以前就出现在移动设备上,1998年风靡全球的诺基亚经典游戏贪吃蛇就是典型之一。就平均而言,如今开发者采用最广泛的开发方法仍是原生应用开发。虽然HTML5风头正胜,但拥有强大性能及高品质用户体验的原生应用能占据大头也不足为奇。

相对Web应用,原生应用最大的优势就是可以访问设备中的所有功能,运行的速度更快、性能更高,而且可以启用优秀的离线处理和存储能力。不过,别只关注它的优势,若想要维持原生开发绝对是个不小的挑战。它的最大问题就是支持的设备非常有限,想要移植到其他平台就得准备好更多的预算。此外,还有审核过程的不一导致上线时间不确定,以及获得新版本时还需重新下载应用更新。

如果,你做应用之前的预算是没有太多限制的话,只采用原生方法的团队所开发的应用质量,绝对要比其他团队高质的多。不过现实就是现实,很少有开发商的资金是源源不断的。

混合应用填补空白

所谓混合应用,顾名思义,就是原生和Web应用的结合体,自然也就继承了两者的优缺点。换句话说,相当于利用Web开发技术编写的原生应用,如HTML5、CSS、JavaScript都是进入原生容器(Native Container)的比较常用的语言,原生应用包含了一个链接到HTML文件的WebView隐藏浏览器。

总的来说,混合应用也是蛮有魅力的,开发者可以自由调配其中原生和Web的比例。它的好处也很多:

跨平台优势,既省钱又省时间,同时还是创意付诸实践的最佳捷径。
Web开发者不论水平如何,只需经过短期培训就能成为合格的混合应用开发者。

以上的两点都表明了混合应用对成本的节省,也算是它继承Web的一大优点。不过,混合应用的性能终究还是比不过原生应用,如果其中掺入了太多的Web技术,还是会减缓应用的运行速度。但随着技术的不断提升,混合应用开发也在水涨船高,在不断的寻找在获得优秀用户体验的同时,尽力降低开发成本。

定睛2015,你是HTML5还是原生应用?

对于移动互联网未来的发展走向,没有人能够进行准确的预测,其中存在很多的变量。都说HTML5的时代真的来了,但是总觉得HTML5与原生应用之间并不存在激烈的竞争替代关系。各自有各自的优缺点,最终选择何种方式还是取决于自己项目的需求。而作为妥协存在的混合应用,倒也是不错的选择。

也许在2015年,HTML5真的会打造出一个更进一步的移动生态圈,不过最终结果如何还是取决于开发者,毕竟开发者在移动互联网发展中起着核心作用。你是选择原始的开发形式还是独辟蹊径的去探寻新的道路,亦或借助HTML5这道风口,随之起飞?不妨说出你的观点,我们洗耳恭听。

程序猿的故事,看罢不禁捂紧胸口。。。

程序猿问科比:“你为什么这么成功? ”
科比:“你知道洛杉矶凌晨四点是什么样子吗? ”
程序猿:“知道,一般那个时候我还在写代码,怎么了?”
科比:“额…….”

二、

女神:你能让这个论坛的人都吵起来,我今晚就跟你走。
程序猿:PHP语言是最好的语言!
论坛炸锅了,各种吵架。
女神:服了你了,我们走吧,你想干啥都行。
程序猿:今天不行,我一定要说服他们,PHP语言是最好的语言。

三、

我是一个苦b的程序员,今晚加班到快通宵了,困得快睁不开眼了,女上司很关心,问我要不要吃宵夜。我没好气地说,宵夜就算了,能让我睡一觉就行了。女上司红着脸说了句讨厌啊,然后坐在我身边不动,好像距离我很近,搞得我很紧张,难道她发现我的程序出了bug?

四、

老公一定要找程序员!!!!!!
钱多话少死的早

五、

老婆给当程序员的老公打电话:“下班顺路买一斤包子带回来,如果看到卖西瓜的,就买一个。”
当晚,程序员老公手捧一个包子进了家门……
老婆怒道:“你怎么就买了一个包子?!”
老公答曰:“因为看到了卖西瓜的。”

七、

某人发帖子:“各位JR,我想做一个程序猿,请问有什么要注意的……”
某猿:“等我下班跟你细说……”
然后……就没有然后了我问程序员朋友借了1000,他说再多借你24吧,凑个整

九、

程序员A: “我吃鱼香肉丝盖饭, 你吃什么?”
程序员B: “宫保鸡丁盖饭.”
程序员A 在点菜单写上:
鱼香肉丝盖饭 1
宫保鸡丁盖饭 1
程序员B: “我还是要牛肉面吧!”
程序员A 更正点菜单:
鱼香肉丝盖饭 1
// 宫保鸡丁盖饭 1
牛肉面 1

十、

我是一个程序猿,一天我坐在路边一边喝水一边苦苦检查bug,这时一个乞丐在我边上坐下了,开始要饭,我觉得他可怜,就给了他一块钱,然后接着调试程序。他可能生意不好,就无聊的看看我在干什么,然后过了一会,他幽幽说,这里少了一个分号。
我惊奇的问:“你也懂这行啊” 乞丐说:“我以前就是做这个的。”

十一、

某程序员退休后决定练习书法,于是重金购买文房四宝。一日,饭后突生雅兴,一番研墨拟纸,并点上上好檀香。定神片刻,泼墨挥毫,郑重地写下一行字:hello world!

十二、

搞IT太辛苦了,想换一行怎么办?”“敲一下Enter键。”

十三、

程序员不喜欢乾隆的第八个儿子,因为八阿哥 bug

十四、

一女同学在食堂吃饭时,一程序猿凑到旁边,“同学,我能和你说话不,我已经一个月没和女生说话了。

十五、

两个程序员在聊天:“我昨天碰到个辣妹。我把她带回家,马上就开始如饥似渴地亲吻,她就坐在我的键盘上,然后……”“你在家里也有台电脑?CPU是什么型号的?”

十六、

程序员的读书历程:x 语言入门 —> x 语言应用实践 —> x 语言高阶编程 —> x 语言的科学与艺术 —> 编程之美 —> 编程之道 —> 编程之禅—> 颈椎病康复指南。

史上最贵域名360.com指向好搜 360搜索业务进军国际前奏?

连日来,有关奇虎360斥巨资近1亿收购360.com域名的消息引发高度关注,创下了国内创造国内购买域名价格的新记录,堪称史上最贵域名。对于360收购360.com域名的原因,有消息指出,360或将与沃达丰合作联合推出360品牌手机。不过,根据最新消息显示,截止到目前,这一史上最贵域名360.com已经跳转到360旗下独立搜索品牌“好搜”的首页。

(在网址栏中直接输入360.com域名,直接跳转至好搜的首页)

360豪掷1700万美元(约合1亿元人民币)买下域名360.com,其目的就在于助力好搜加速实现中国第一搜索品牌这个目标?据了解,今年1月初,360搜索高调宣布以独立品牌方式,推出了独立搜索品牌“好搜”,并采用中文双拼域名haosou.com。那么,360此次又为何以1亿重金买下360.com这一新域名?这一举动让人颇为疑惑。

对此,有业内人士认为,360董事长周鸿祎早在雅虎时期,就有着浓厚的搜索情节。至今在360,搜索也是除了核心安全之外的最重要业务。因此,360不惜斥巨资买下360.com这一域名,最重要目的极有可能是好搜进军国际市场,提前布局铺路。

为什么说可能是进军国际化的前奏?一方面,作为360在搜索领域的最大竞争对手,百度于去年7月调推出葡语搜索进军巴西市场,此前百度在海外已经相继推出了泰语搜索与阿拉伯搜索。而360在搜索领域一直采取死磕百度的市场策略,这次买下360.com国际域名,其极有可能同样进军国际市场;另一方面,从国外用户品牌认知与使用习惯来讲,360拥有更高的品牌知名度,360.com也属于国际通用域名,对国外用户有着其他域名难以比拟的优势。

不难看出,360.com域名跳转好搜,不只是一次简单的域名跳转,这一意味着360或在2015年不断加码搜索业务,剑指中国搜索头把交椅。去年8月,360搜索市场份额突破30%,仅隔四个月之后,360再度祭出大动作,以独立品牌方式推出“好搜”重点发力移动端,再到如今斥巨资1亿元买下360.com新域名,这一连串的举措,或将搅动整个搜索市场格局。可以预见的是,2015年搜索市场的竞争无疑将更加激烈。