[转载]陈皓:什么是工程师文化?

作者: 陈皓 来源: 酷壳 原文链接 

四年前,我在 QCon 上演讲了一个《建一支强大的小团队》(整理后的 PPT 分享于这里)提到了工程师文化,今天,我想在这里再写一篇关于工程师文化的文章,一方面是因为我又有了一些想法和体会,另一方面,因为我也正走在创业的道路,毫无疑问,要建一个有浓重的工程师文化的团队或公司,所以有必要把自己的相关想法开有成白底黑字的“字据”,以供打自己的脸——“要是未来没有做到,这篇文章就打我未来的脸” “这篇文章太幼稚了,未来的我会打我现在的脸”,我希望是前者。
  Again,这篇文章不是招人的贴子,因为我觉得,招聘第一重要的事,不是发招聘广告或是找猎头挖人,而是先得让自己变成一个能配得上真正工程师的公司,然后再谈吸引人的事。
  为什么要工程师文化
  看看最近二十年来社会的发展,计算机和互联网已经渗透到了这个社会的每一个角落,各式各样的计算机技术成为了整个世界发展的强大引擎,各式各样的创新,无论是业务创新还是技术创新,都是依托于技术的快速演进,技术成了解放生产力提高社会运作的效率的中坚力量。以美帝国主义为首的技术创新公司着着实实的改变着这个世界和人类的生活和生产习惯。
  今天,每个从事计算机行业的技术人员都应该感到幸运,因为,我们不但选对了行业,也出生在了正确的时代,可能感受到前所未有的刺激和变化,相比起我们的父辈,我们的人生,能经历这样的时代,实在是一种幸运。所以,选对了职业并出生在了正确的年代的我们,只是需要思考的一个问题就是,我是否呆在了正确的地方?
  在我看来,这个世界上有三种商业公司,
运营或销售驱动型的公司。这类的公司以运营和营销见长,技术对于他们来说,更多的只是为了支持大规模的营销活动,以及成本上的控制,所以,基本上来说不需要技术创新。这种公司最大的问题就是缺乏安全感。
产品驱动型的公司。这类公司以产品见长,通过创造能提升用户生活体验的产品见长,技术对于他们来说,除了支持大规模的在线用户之外,他们会更多的去寻找那些为了增强用户体验,提高整个业务流程效率的技术创新。比如:UI 的交互方面的,整个业务流程方面的。这种公司最大的问题,就是容易被别人模仿和抄袭。
技术驱动型的公司。这类的公司相信技术能改变世界,他们更多的是用强大的工程技术来创造有颠覆性的东西,更多的是用各种自动化的技术取代人类。比如:近代的蒸汽机技术取代了大量的人工,数字技术取代了大量信息传递的人工,现代,这类公司还希望通过人工智能来取代愚蠢的人类来做决定。这种公司最大的问题就是可能做出叫好不叫座的东西。
  这三种公司都可能成功,也都有问题,但是,无一例外,他们都需要强大的技术支撑,只不过,他们把技术所放在的位置不一样。
  无论你有多么的看不起技术人员,你都无法否认,你今天的生活相当的依赖这帮工程师,没有他们,你恐怕都不知道怎么生活了。邓爷爷几十年前就说过——“科学技术是第一生产力” ,无论什么样的科学技术的理论要落地都会依赖于工程技术有多先进。
  所以,在今天,作为一个 IT 或互联网公司,“工程师文化”不是一个问题,而是一个常识!
  工程师文化的特征
  我下面罗列的这些特征来源于,Google 的《重新定义公司》,我在 Amazon 的经历,37Signals 的《Rework》,Quora 上的 What Makes Good Engineering Culture? Slideshare 上的 What Makes Good Engineering Culture,以及我最近这半年来的一些实践。
  对我来说,我可以简单的把这么多的工程师文化的总结成两大类:“自由” 和 “效率”。
  本来还应该有个“创新”,但我个人认为,创新的前提是——在自由的环境下对提高效率的痴迷,就一定会发生创新。
  创新不是凭空出现新的东西,其实,观察一下人类的发展史,不难发现,几乎所有的创新基本上跳出原来的思维模式用新的思维模式对原有问题的效率进行质的提升。比如:通信、交通、医疗、教育、生活……几乎全都是在优化效率。
  所以,如果你的精神不自由,你很难跳出老的思维模式,你用老的思维模式你一定不会想到新的方法和方式,如果不是对效率的提升,这个创新可能会不接地气。
  自由
  首先,工程师文化意味的创新文化,工程师都是有创新冲动的人,因为手里有创造技能的人通常都想创造点什么。而创新的源泉水来源于精神的解放,精神自由才会引发各式各样的奇思怪想,才会有常人觉得不可能的疯狂想法和想像力,而这些想法和想像力导致了创新。
  精神上的自由具体表现在:
自我驱动。自己管理自己是最好的管理。最失败的管理就是家长和保姆式的管理。兴趣出发的工作才可能迸发出真正的动力。
灵活的工作时间和地点。工程师们更多的是脑力工作,而不是体力工作,工作上时间和地点的自由安排可以让工程师们的脑力工作更有效。Remote 是一个很不错的工作方式,开源社区基本上都是这钟方式。和 Remote 有关的话题可参看这本书《Remote》
信息平等。这意味着,全体员工得到的是原始信息,而不是被管理者们层层加工消化后的信息,大的包括战略、方向、目标、财务,小的包括文档、代码、和知识的共享等。同样,也表现在意见表达上,任何人都有可能表达自己的意见和建议的平等机会,这样才会激发出更多的思路和思辩,从而有不同的更好的思路出现。而不是,大家都看到了问题,而没有人敢说。在 Google 除了代码全员共享,还有 Thanks God, It’s Friday 的文化,每周五,高管们会出来,任员工提各种尖锐的问题。在 Amazon,代码和文档基本上全员开放,包括财务报表也对员工开放,另外,除了所有的 NB 的 Principle SDE 隔三岔五都会有一个 Principle Talk,有很多 Talk 相当令人开脑洞,还有 Amazon 内部的 Up the River 文化,每年会选出一批公司最聪明最有想法的人集思会,讨公司下一步的和战略,并可以把相应的 KPI 直接按给 Senior VP。
不害怕错误。处理错误的正确的姿势是分析总结教训,而不是惩罚故障人。前者让人改善进步,后者让人萎缩不前。最大的错误就是不敢犯错,最大的问题就是不敢直面问题。
宽松的审批系统甚至没有审批系统。审批通常暗示着三件事,1)对人的不完全信任,2)繁琐的流程,3)思维上的束服。这些都是创新和想像力的天敌。一个公司的监管、审批、流程越重,这个公司的活力也就越差。
20% 的自由时间。这是 Google 公司提出来的,员工有 20% 自由的时间做自己想做的项目,Gmail 就是这么出来的。
  效率
  工程师天生是追求效率的。有人说认为程序员花大量的时间做自动化的工具,还不如人肉的效率高,比如,写自动化的脚本花 5 个小时,而重复做这件事 200 次只花 3 个小时。有这样的理解的人根本不懂工程。
  一方面,这个工具可以共享重用,更多的人可以从中受益,而不是微观上的比较。更重要的是,这是一种文化,一种提高效率的文化,他会鼓励更多的这样的事情发生。如果你因为一个程序员花大量的时间开发自动化的工具,而认为这个程序员没有效率,对之批评甚至惩罚的话,那么你就扼杀了提高效率的文化(关于效率,大家可以看看我的另一篇文章《关于加班和效率》,你会真正了解什么是效率)
  人类之所以比别的动物聪明就是会使用和发明工具,而古语也有云:“工欲善其事,必先利其器”,看看美军的装备你就知道战争工具的好坏有多重要了,一个公司的强大之处在执行力,而执行力的强大之处在于你有什么样的支持工具。这些,已经不是工程师文化,而是人类发展的文化。
  针对于工程师文化来说,尤其是软件工程,提升工程效率的具体表现如下:
简化。简化不是简陋,简单的东西通常意味着用户更好理解,也意味着更容易的维护和运维。就像阿里推行的“小而美”,就像乔布期推崇的“没有产品手册简单易用的产品”,就像 Amazon 推行的 Working Backwards 里说的那样,一个新的产品或功能,产品经理需要写三个文档:媒体公关文、用户手册、常见问题,三个文档不准备超过两页 A4 纸,且不准用任何图片说明。
残酷无情的推行自动化。编写程序的最本质的东西就是自动化,看看人类发展史上自动化了多少东西。对于自动化来说,不仅仅只是消除人肉的重复劳动,更重要的是,很多事情人完全干不过机器,比如加一台机器,程序在秒级就可以完成,人是永远不可能达到这样的速度的。自动化需要大力开发提高生产力的工具,比如:持续集成,持续部署,自动化运维,基础自动化运维,甚至自动化的运营工具。(Amazon 的软件工程中对自动化和简代相当迷恋)
避免无效率的组织架构和无效率的管理。这体现在这些方面:1)扁平化的组织架构,2)努力用自动化工具取代支持型的工作,3)不超过 10 个人的全栈小团队,4)不按人员的技能分工而是按其负责的产品或功能分工(关于分工,请参看《让我们来谈谈分工》),5)通过产品的目标或信条 Tenets 来减少沟通和决策过程(Amazon 里的每个部门,每个团队,每个产品都有自己的 Tenets,这个 Tenets 标明了要什么不要什么,比如:AWS 的几个信条:运维是最高优级的——这意味着只要是会让运维变得复杂的需求都可能会工程团队被拒掉,Throughput & Laentcy 不能更差——这意味着,功能要为性能让路,因为性能变差了,用户就要买更多的资源)
正确的组件抽象。抽象是简化的一部份,一方面,抽象意味着重用和通用,另一方面抽象意味着强大的扩展性,以适配各种可能性。最重要的是,抽象意味着技术能力的输出,无论是内部的其它团队还外部的团队。比如:Google 的 MapReduce/BigTable,FaceBook 的 Thrift,还有 Amazon 内部的 WebService 框架 Coral Service、处理日志监控的 Timber,以及全线 AWS 产品都用到的 Amazon Lock Framework(一个分布式锁框架)……
开发高质量的产品。因为高质量的代码,不但可以容易的修改和维护,还可以因为少处理线上故障,从而有更多的时间去为未来做更多创造性的工作。这意味着需要有非常严谨的 Design Review,Code Review,以及测试,关于 Code Review,可以参看这篇文章《从 Code Review 谈如何做技术》,关于严谨的测试,可以参看这篇文章《如果做性能测试》
不断的提高标准以及招聘最好的人。取法其上,得乎其中,取法其中,得乎其下,取法其下,法不得也。如果一个公司或一个团队想变得越来越好,越来越强大的话,就必需要不断的提高自己的工作标准,提高工作标准意味着要不断地招聘最好的人。在 Amazon 和 Google 的招聘官中都有一个叫 Bar Rasier 的人,这个人就是为了提高招聘标准而设立的。
创建一个持续改善的文化。一个好的组织,一个好的团队,是需要不断反思前进的,这需要全体员工一起来的。微观层面上,在项目做完后需要有一个总结会分析项目中的得失,在故障出现后,需要有故障分析会,反思得失,在 Amazon,严重的故障,需要写一个 COE(Correction of Errors)的文档,其中有一节叫“Ask 5 Whys”,让你自己问自己至少 5 个为什么。在宏观层面,一个公司每年都应该做一定的工作数据分析或是员工调查,比如,是否招聘到了不错的人、工作的投入产出比,员工在哪些地方花时间了,等等,然后不断的用技术手段来改善。(Amazon 每年的工程师员工调查表是我活那么大见过的最细最细的调查表了, 问题除了对公司、经理、文化的,还有从,日常工作、开发环境、持结集成,测试自动化、产品质量、软件架构、软件维护、线上问题处理、年度计划、数据仓库建设、通用工具投票……这个员工调查直接导致公司的对工程的投资方向)
  工程师文化如何落地
  如果你要让任何文化在公司内得到执行,你有下面几个手段可以选择:
通过政治手段:你需要把三个地方——招聘、绩效考核 & 升职。比如,你要落地工程师文化中的简化和自动化,那你你在招聘的时候,你需要把懂简化和喜欢自动化的人招进来,然后在绩效考核和升职的地方设置上一条硬性指标——你今年简化了什么?自动化了什么?如果没有,对不起不但不能升职,绩效可能还不达标。
通过经济手段:让不做这事的成本 > 要做这个的成本。然后,正常的人类都会选择成本低的方案。比如,如果你要推行 Design/Code Review/UT 以提高质量,你就把 QA 和 OPS 团队全挪到一边去,让 Dev 团队自己测试,自己负责,而 QA 和 OPS 团队只是帮你做工具罢了,而测试和运维的事全是你 DEV 的 Ownership,出了故障也是 dev 自己负责,于是,他们就会发现,不做 code review 和 ut 的成本远远大于做 code review/ut 的成本,他们就会去做的。
  最后,工程师文化要落地,还有几个小条件,
第一,团队要小,Ownership 很重要,Eat Your Own Dog Food。 没有人帮你擦屁股,自己的屎自己吃,没有痛苦,不会产生想进步的动力。
第二,热爱学习和尝试,学习尝试新的技术,开拓眼界,学习尝试新的思维方式,否则,呆在原地,原有的思维方式只会让你在原地打转转。
第三,老板更多的相信技术而不是管理。相信技术会用技术来解决问题,相信管理,那就只会有制度、流程和价值观来解决问题。
  其它
  说了这么多,时代还在发展,不过,这是我这么多年经历或看到的工程师文化的东西了。最后吐几个槽——
  对于 996 和加班这个事,对于工程师来说从来都不是问题,在解决技术问题或是创造的时候,工程师是个很自觉的群体,基本不需要有别人驱动,工程师是最乐意 Work Hard 的人了。我相信几乎所有走上编程这个职业的人来说,基本上都是兴趣所至,觉得编程很有趣,但却被各个公司 996 搞得对编程毫无兴趣。为什么,你们这些公司要向中国的教育学习呢?人家本来对这事有比较高的兴趣的,但就是要通过考试/KPI/996 这些东西把人家的兴趣一点一点的磨灭掉,把人变成机器、奴隶、牲口,让人对学习和工作产生了厌倦和讨厌,会是你们这些管理者们所希望的?是不是只有把人变得不思进取了,你们才会管理?就像《软件开发中的两种管理方式》中说的第一种人一样?
  另外,我不知道,为什么我一说这些东西,就会有很多人(包括程序员自己)来和我说我是个理想主义者,这些已经不是什么理想了,已被很多成功的公司用了很多很多年了。只是你没有见到过罢了。还有的人说,因为中国的国情不同。这更让我费解了。这让我想到了当年大清朝派了一堆人出国考察后回来后,说外国的那套共和的东西不符合中国国情,最终也在历史的潮流中被淹没掉了。另外,什么叫“中国的国情不同”?中国有全世界数一数二的互联网用户,也有全世界数一数二的市场,不再是以前那个一穷二白的年代了,中国的国情到底有哪些不同呢?
  我不知道各位工程师是为什么活的?但我觉得,我们选择了一个刺激的职业,也赶上了这个行业大发展的时代,我们不妨扪心自问一下,你是否愿意让自己的能力、青春和热情就这样被磨灭了?
  (全文完)

php-memcache-windows安装及测试结果

相关内容下载 memcache官网
http://memcached.org/
需要下载并开启一个服务端软件memcached
如果出现缺少msvcr71.dll文件的情况 请下载对应文件 至Windows/System32或Windows/SysWOW64下
在php/ext文件夹中添加php_memcache.dll文件 为php添加memcache类
重启web服务环境 输出phpinfo()会多处memcache项的相关信息

建立php脚本 测试 存取100000条信息 例如
// phpinfo();die();

$memcache = new Memcache;
$memcache->connect(‘127.0.0.1’, 11211);
for($i = 1;$i<100000;$i++){ $arr[$i] = '第'.$i.'条信息'; } $t1 = my_microtime(); foreach($arr as $k=>$v){
$memcache->add($k,$v);
}
$t2 = my_microtime();
$new_arr = array();
for($i = 1;$i<100000;$i++){ $new_arr[$k] = $memcache->get($k);
}
$t3 = my_microtime();

echo ‘
memcached用foreach存100000条记录共用时’.($t2-$t1).’ms’;
echo ‘
memcached用for读100000条记录共用时’.($t3-$t2).’ms’;

function my_microtime() {
list($s1, $s2) = explode(‘ ‘, microtime());
return (float)sprintf(‘%.0f’, (floatval($s1) + floatval($s2)) * 1000);
}

结果:
memcached用foreach存100000条记录共用时2886ms
memcached用for读100000条记录共用时2751ms

以上

软件备份下载https://pan.baidu.com/disk/home#list/vmode=list&path=%2F%E8%BD%AF%E4%BB%B6%2Fmemcache

js常用数据操作函数库

1.js操作cookie

js原生操作cookie
document.cookie=”name=”+username;
编写函数
//写cookies
function setCookie(name,value)
{
var Days = 30;
var exp = new Date();
exp.setTime(exp.getTime() + Days*24*60*60*1000);
document.cookie = name + “=”+ escape (value) + “;expires=” +    exp.toGMTString();
}
//读cookie
function getCookie(name)
{
var arr,reg=new RegExp(“(^| )”+name+”=([^;]*)(;|$)”);
if(arr=document.cookie.match(reg))
return unescape(arr[2]);
else
return null;
}
//删除cookie
function delCookie(name)
{
var exp = new Date();
exp.setTime(exp.getTime() – 1);
var cval=getCookie(name);
if(cval!=null)
document.cookie= name + “=”+cval+”;expires=”+exp.toGMTString();
}

2.js获取url 

有时候会出现编码错误导致的乱码
function get_url_var(name)
{
var reg = new RegExp(“(^|&amp;)”+ name +”=([^&amp;]*)(&amp;|$)”);
var r = window.location.search.substr(1).match(reg);
if(r!=null)return  unescape(r[2]); return null;
}

3.jq  ajax

$.ajax({
url:url
data:{
‘ui_cardnum’:ui_cardnum
},
type:’post’,
dataType:’json’,

success:function(data){

 

},
error:function(data) {
console.log(data);
}
});

 

4.js  操作localstorage

  • 获取键值:localStorage.getItem(“key”)
  • 设置键值:localStorage.setItem(“key”,”value”)
  • 清除键值:localStorage.removeItem(“key”)
  • 清除所有键值:localStorage.clear()

php 数据处理相关代码片段

一.2V数组转树形 代码片段

 

数据模型

 

$items = array(
1 => array(‘id’ => 1, ‘pid’ => 0, ‘name’ => ‘江西省’),
2 => array(‘id’ => 2, ‘pid’ => 0, ‘name’ => ‘黑龙江省’),
3 => array(‘id’ => 3, ‘pid’ => 1, ‘name’ => ‘南昌市’),
4 => array(‘id’ => 4, ‘pid’ => 2, ‘name’ => ‘哈尔滨市’),
5 => array(‘id’ => 5, ‘pid’ => 2, ‘name’ => ‘鸡西市’),
6 => array(‘id’ => 6, ‘pid’ => 4, ‘name’ => ‘香坊区’),
7 => array(‘id’ => 7, ‘pid’ => 4, ‘name’ => ‘南岗区’),
8 => array(‘id’ => 8, ‘pid’ => 6, ‘name’ => ‘和兴路’),
9 => array(‘id’ => 9, ‘pid’ => 7, ‘name’ => ‘西大直街’),
10 => array(‘id’ => 10, ‘pid’ => 8, ‘name’ => ‘东北林业大学’),
11 => array(‘id’ => 11, ‘pid’ => 9, ‘name’ => ‘哈尔滨工业大学’),
12 => array(‘id’ => 12, ‘pid’ => 8, ‘name’ => ‘哈尔滨师范大学’),
13 => array(‘id’ => 13, ‘pid’ => 1, ‘name’ => ‘赣州市’),
14 => array(‘id’ => 14, ‘pid’ => 13, ‘name’ => ‘赣县’),
15 => array(‘id’ => 15, ‘pid’ => 13, ‘name’ => ‘于都县’),
16 => array(‘id’ => 16, ‘pid’ => 14, ‘name’ => ‘茅店镇’),
17 => array(‘id’ => 17, ‘pid’ => 14, ‘name’ => ‘大田乡’),
18 => array(‘id’ => 18, ‘pid’ => 16, ‘name’ => ‘义源村’),
19 => array(‘id’ => 19, ‘pid’ => 16, ‘name’ => ‘上坝村’),
);

函数

 

function genTree9(Array $items) {

$tree = array();    //格式化好的树
foreach ($items as $item)
if (isset($items[$item[‘pid’]]))
$items[$item[‘pid’]][‘son’][] = &$items[$item[‘id’]];
else
$tree[] = &$items[$item[‘id’]];
return $tree;

}

二.传输过程中 汉字不转uncode

json_encode($data, JSON_UNESCAPED_UNICODE)

三.带有特殊字符的url转码

 

urlencode($data)

 

如  http://weixin.com?XXXX?a=1&b=222&c=666/d=777/…

 

其中? & /将被转义

四.get和post请求

get

function get_curl($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//运行curl,结果以json形式返回
$res = curl_exec($ch);
curl_close($ch);
return $res;
}

//post请求
function http_request($url,$data){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output=curl_exec($curl);
curl_close($curl);
return $output;
}

file_get_content()函数也可以作get获取内容 亦可以用作读取网络文件

10.27小型网站框架搭建文件小结

php脚本

@session_start();
开启session 为防止重复开启 添加@隐藏此条代码的警告信息


date_default_timezone_set(“Asia/Shanghai”);
设置php脚本时区 如中国所使用的北京/上海时间

header(“Content-type:text/html;charset=utf-8”);
设置脚本utf8编码


header(‘Access-Control-Allow-Origin: *’);

允许任何域访问

数据库连接代码

mysql_connect($add,$name,$pwd);

设置数据库字符编码

default-character-set=utf8

html标签 头文件

<meta http-equiv=”Content-type” content=”text/html;charset=utf-8″ />

完整设置页面utf8编码

<meta name=”viewport” content=”width=device-width, initial-scale=1″>

放大倍数1.0 变向适应设备屏幕

<meta name=”renderer” content=”webkit”>

告知浏览器 页面适用内核 因为国内浏览器大多“聪明”地采用了双核模式 设置webkit值告知浏览器采用对应内核

<meta name=”renderer” content=”ie-comp”>

ie兼容模式 ie6和7 虽然不用。。

<meta name=”renderer” content=”ie-stand”> 

ie兼容模式 ie8 9 10 这个也不太用。。

<meta http-equiv=”Pragma” content=”no-cache” />   
<meta http-equiv=”Cache-Control” content=”no-cache” />
<meta http-equiv=”Expires” content=”0″ />
避免大多数浏览器缓存


路径尽量采用相对路径 修改 待续。。

JQ小结20160921

JQ小结

ajaxComplete() 每次完成ajax请求执行该函数 从 jQuery 1.8 开始, .ajaxComplete() 方法只能绑定到 document元素

$(document).ajaxComplete(function() {
 $( “.log” ).text( “Triggered ajaxComplete handler.” );
});

如果global选项设置为false,调用$.ajax() 或 $.ajaxSetup(),.ajaxComplete()方法将不会被触发。

add()结尾添加元素 或者 内容

append()在匹配的元素结尾添加元素 或 内容

after()在元素后面添加同级元素或移动到该位置 若document中有制定的选择器 则为移动 否则在结尾添加内容或标签

before() 在前面添加或移动

$(‘*’) 选择所有元素

$( “:animated” )选择所有正在运行动画的元素 必如关闭动画

bind()为元素绑定一个触发时间 如$(’#selector’).bind(‘click’, function(){…})

blur()当元素失去焦点时触发的时间

:checkbox Selector 匹配所有勾选的复选框元素

:checked Selector  匹配所有勾选的元素

error() bind(‘error’,function(){…})元素加载错误调用函数 如图片加载失败 加载默认图片

change() 表单中的控件 值发生变化的时候触发的时间 如下拉列表的选择 单/复选框值得改变 搜索框的输入操作变化等

delegate()为子元素预加载一个函数或事件 如在一个元素下添加一个子元素前加载函数 事件不会加载 若用delegate方法为其子元素预加载一个方法则会执行 待子元素添加后 事件会绑定在对应子元素上   参考w3cschool实例http://www.w3school.com.cn/tiy/t.asp?f=jquery_event_delegate_newelement

clone() 复制对应元素的属性 和 子标签内容 属性clone(true)连同元素的绑定事件也一并获取

contents()选择所有匹配元素的所有子元素

delay(600) 延迟一段时间执行下一事件 如$(selector).slideToggle(600).delay(1000).slideToggle(600);

slideUp() slideDown() slideToggle() 上下滑动

fadeIn()fadeOut() fadeToggle() 淡入淡出

fadeTo()调整匹配元素的透明度

each() 遍历一个jQuery对象,为每个匹配元素执行一个函数。

less 低成本高回报-带逻辑的层叠样式表

★变量

用@定义

@cg:green;
@cr:red;
@cy:yellow;

使用:

.passage{
    color:@cg;
    background-color:@cr;
    border-color:@yellow;
}

编译后:

.passage{
    color:green;
    background-color:red;
    border-color:yellow;
}

★运算

变量可以进行简单运算

★注释

/***********正常注释************/

//其他语言习惯注释 编译时去掉 只被保留在.less文件中

★任性!不想被编译

与其说任性不如说微软比较任性 即使再NB也必须迁就使用微软的庞大用户群 

有一些属性 比如滤镜(类似webkit中的opacity透明度)less不能识别 也可能以后会出现less识别不了的属性  需要处理

使用波浪线加一对单引号可以包含不想被编译的内容 如   ~’i do not want to get translated !’

★函数(混合1)

为类附加参数 

定义:

.border-radius(@radius:10px,@style:solid){

    -webkit-border-radius:@radius @style #313131;
    -moz-border-radius:@radius @style #313131;
    -o-border-radius:@radius @style #313131;
    -ms-border-radius:@radius @style #313131;
    border-radius:@radius @style #313131;

}

使用:

直接使用

.border-radius();//默认使用圆角10px, 样式直线

编译后:

.border-radius{

    -webkit-border-radius:10px solid #313131;
    -moz-border-radius:10px solid #313131;
    -o-border-radius:10px solid #313131;
    -ms-border-radius:10px solid #313131;
    border-radius:10px solid #313131;

}

或使用改变变量

.border-radius(30px, dashed);//使用圆角30px,样式虚线

编译后:

.border-radius{

    -webkit-border-radius:30px dashed #313131;
    -moz-border-radius:30px dashed #313131;
    -o-border-radius:30px dashed #313131;
    -ms-border-radius:30px dashed #313131;
    border-radius:30px dashed #313131;

}

★混合2

整个类的属性当做变量添加到新类中 并 附加其他属性

.img(@width:100px, @height:60px, @size:contain){
    
    width:@width;
    height:@height;
    background-repeat:no-repeat;
    background-size:@size;

}

使用

.img1{

    .img();
    
    background:url(…);

}

编译后:

.img1{

    width:100px;
    height:60px;
    background-repeat:no-repeat;
    background-size:contain;
    background:url(…);

}

★混合3

无键参数

//三个动画

@keyform ani1{
    …
}

@keyform ani2{
    …
}

@keyform ani3{
    …
}

//使用动画的三个类

.box1(ani1, @time:8s, @locus:linear){//使用动画1 轨迹直线
    animation:ani1 @time @locus infinite running;
}

.box2(ani2, @time:10s, @locus:ease){//使用动画2 轨迹先快后慢再快
    animation:ani1 @time @locus infinite running;
}

.box3(ani3, @time:20s, @locus:cubic-bezier(0.1,0.2,0.5,1)){//使用动画3 轨迹自定义贝塞尔曲线
    animation:ani1 @time @locus infinite running;
}

//——————————————————————

.box(@_, @time,@locus){
animation-name:@_;
}

使用

.i-box{

    .box(ani1,8s,linear);

}

即使用了box1的属性:动画1 轨迹直线 

值得注意 虽然.box中的@time和@locus在.box中没用 但必须加上 

如果@_没有匹配到 则会出现只有@time和@locus被编译

如下

.i-box{

   animation: 8s linear infinite running;//没有动画名 报错!!!

}

★嵌套

&表示父元素

.list{

    li{

list-style:none;
margin:0;
padding:0;

        a{

            font-size:#313131;opacity:0.5;

   &:hover{ opacity:1; }

        }

    }

}

编译后:

.list li{

    list-style:none;
    margin:0;
    padding:0;

}

.list li a{

    font-size:#313131;opacity:0.5;

}

.list li a:hover{

    opacity:1;

}

★超级懒B头顶称号arguments

@arguments可以代表所有参数

.box(@border-width:10px,@border-color:green,@border-line-style:solid){

    border:@arguments;

}

使用:

.box();或.box(20px);

★important的继承

加!important的类 其中包含的属性都会添加important属性 可以用作测试

【转】阿里云设计师就从[^-^]表情里挑了一个当LOGO!

 LOGO设计又有新套路!阿里云的新LOGO竟然是个表情

  阿里云新Logo一出,我伙呆的戏码又重新上演了!讲真,马云这个爸爸,我是认的,然而!阿里云push着咱家爸爸的大名,把新Logo“造”成这样,想知道爸爸同意吗?

阿里云设计师就从[^-^]这种表情里挑了一个当LOGO!

  阿里云新Logo,就是方括号内加一个小横线。刚一发布,对于仅有一面之缘的网友们来说,一种似曾相识的撞脸感扑面而来——貌似偶遇聊天必备的颜表情,只不过是从圆脸变成了方脸~

  先自行感觉一下↓↓↓

  新Logo长这样:
s

阿里云设计师就从[^-^]这种表情里挑了一个当LOGO!

  颜表情长这样:

  【不】圆脸:(>﹏<)方脸:[>﹏<]   【怀疑】圆脸:(→_→)方脸:[→_→]   【困】圆脸:( ̄o ̄) . z Z方脸:[ ̄o ̄]. z Z   【崇拜】圆脸:m( __ )m方脸:m[__]m   【我想想】 圆脸:(ˇˍˇ)方脸:[ˇˍˇ]   【无语】圆脸:( ̄. ̄)方脸:[ ̄. ̄]   感受到变“方”的颜表情的各种萌(cao)点了吗?但人家毕竟不是个表情,是Logo!Logo!Logo!好吧~ wu
阿里云设计师就从[^-^]这种表情里挑了一个当LOGO!

  来自官方的解释:新Logo中,“[]”代表计算,“—”代表流动的数据,计算和数据是现代社会的基础设施,因此“—”还是匀速运动的,无时无刻在创造着“无法计算的价值”~~~

  阿里云新Logo的元素对于敲代码的“工友”来说,简直再熟悉不过了:新Logo是从代码中的符号“[]”演绎而来——符合阿里云作为一家科技公司输出计算和数据技术能力、为生活为各行各业源源不断地赋能的初心,而这也是无国界的通用语言,能代表阿里云服务中国也服务全世界的未来创想!

阿里云设计师就从[^-^]这种表情里挑了一个当LOGO!

  尽管有点像“方”了的颜表情,但还是能感受到带有强烈的阿里巴巴DNA的“诗和远方”style,你们说呢?

  说一千道一万,感觉阿里云的新Logo还是跟各路盆友玩儿了一回深深的套路![= ̄ω ̄=]

css3属性小结

20160815 css3

border-radius 可以选两个值 3个值 4个值 分别表是左上右下/右上左下   左上/右上左下/右下 4个值为左上 顺时针

border-image使用必须知道边框图片的像素 不然不好用

background-size 宽高 cover contain

background-origin 表示背景的边界  padding-box内容中添加背景 border-box包含边框的添加背景 content-box在文本中添加背景

rgba hsla(色调 饱和度 明度 透明度alpha)

Gradients 

background: -webkit-linear-gradient(red, yellow);

text-shadow: 10px 10px #c6c6c6;

text-shadow: 10px 10px 5px #c6c6c6;第三个参数可以调节模糊度 越大越模糊 1px与原文本相同

box-shadow: 10px 10px 200px grey; 

例如卡片特效

.card {
    width: 250px;
height:250px;
border:1px;
    box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
    text-align: center;
margin:50px;
}

overflow: hidden ;配合 text-overflow:ellipsis; 达到超出元素边界变为。。。的形式呈现 但貌似不支持中文字符?

如果在该元素的hover事件中加以下属性 会令其在鼠标经过显示隐藏的内容

word-break: keep-all;适合横向排列word-wrap: break-word;适合纵向排列           选一个

CSS3 2D Transform 

★jq的animate函数不支持transform属性

transform:translate(x,y) 可以’转换’元素的位置 相当于定位 基点亦在左上

scale() 或 sacle(x,y)可以缩放元素大小 基点为元素中心点   使用height width属性基点在左上

scale() 中的值如果是负值 会先翻转内容 再缩放

rotate(阿尔法);旋转 基点默认为左上 

transform-origin:left top;也可以设置transform旋转基点

skew() skewX() skewY() 绕X/Y轴旋转 基线为上边界 和 左边界

transition: width 2s;过度效果

resize 属性规定是否可由用户调整元素尺寸 none|both|horizontal|vertical;

nav-index 导航索引号

忙与闲微妙变换带来的小感悟

        上个月从一家公司转到另一家公司。

        因为我是新手,想得到快速提升技术水平的机会,而原来的公司工作量很少 很清闲,工作的时候交流少,效率不高,无论工作还是学习总要等 等 等。来新公司之前,和新公司的老板有过一段交流,新公司的老板给我的印象是,他的思想比现在的老板先进,有过技术工作经验,体验过技术人员的工作过程,有更高的真正做事的想法。于是我来到了新公司,抱着学习态度打算做点事。

        因为之前公司工作少,所以自己的时间很充裕,掌握工作和学习的时间切换弹性较大。经常在发现问题的时候,有充分的时间研究出更高效适合自己的方法。来新公司之后,确实感到了些许压力,工作周期比较紧张,毕竟公司人少,可以说是为自己工作!

可能今天你不工作,明天公司就不存在了,那就尴尬了。。来新公司之后,公司又经历了人员变动,使得原本的工作又5个人落在了三个人身上。

        工作一个月有余,我越来越觉得,工作的压力导致繁忙,这回让你对解决问题方法的选择、对未来的预测、长远的规划变得无暇顾及。令我倍感担忧:来到一个工作较紧张,压力较大的地方工作是否对水平提升,对未来的路有影响呢?影响的效果好处多吗?

        不过,虽然压力大或是工作繁忙也必须保持清醒,保持周期性的总结,可能这种周期性的整理总结不如从前,但一定会提升汇总问题并研究解决的效率!因为你必须保持生存,公司必须生存!

        无论多忙都有必要周期性为自己留出空闲,留出的空闲可以和朋友出去放松、搭理自己必须处理的事务、捡起自己的爱好活动、或是让自己无所事事一下也好,说不定看似无所事事的一天会为你带来启发。

        还有,虽然生活不易且对鸡汤免疫的现代人有时会迷茫,变得“空了”,脑子里“null”了,但还要相信生活,发现生活带给我的有趣的地方,为社会创造价值的过程中分得一杯羹,心安理得,踏实妥帖。