春天该很好

生活有种无奈是:话说一半,只留美好。

比如,你说“春天该很好”,但你希望有人能听到后半句“你若尚在场”。

比如,你说“早安、午安、晚安”,但你希望有人能明白“假如再也见不到你,亦祝你早安、午安、晚安。”

遗憾的是,你只能微笑着对每个人说: “春天该很好。早安、午安、晚安。”

10个很有用的高级 Git 命令

迄今,我已经使用Git很长一段时间了,考虑分享一些不管你是团队开发还是个人项目,都受用的高级git命令。

1. 输出最后一次提交的改变
这个命令,我经常使用它 来发送其他没有使用git的人来检查或者集成所修改的。它会输出最近提交的修改内容到一个zip文件中。

git archive -o ../updated.zip HEAD $(git diff –name-only HEAD^)

如果你的 tag 名是 1.0,可以按照如下方式导出。

a. 导出并压缩为 zip 格式:
$ git archive –format=zip –output=v1.0.zip 1.0

b. 导出并压缩为 tar.bz2 格式:
$ git archive 1.0 | bzip2 > v1.0.tar.bz2

c. 导出并压缩为 tar.gz 格式:
$ git archive –format=tar 1.0 | gzip > v1.0.tar.gz

2. 输出两个提交间的改变
类似的,如果你需要输出某两个提交间的改变时,你可以使用这个。

git archive -o ../latest.zip NEW_COMMIT_ID_HERE $(git diff –name-only OLD_COMMIT_ID_HERE NEW_COMMIT_ID_HERE)

3. 克隆 指定的远程分支
如果你渴望只克隆远程仓库的一个指定分支,而不是整个仓库分支,这对你帮助很大。

git init
git remote add -t BRANCH_NAME_HERE -f origin REMOTE_REPO_URL_PATH_HERE
git checkout BRANCH_NAME_HERE

4. 应用 从不相关的本地仓库来的补丁
如果你需要其它一些不相关的本地仓库作为你现在仓库的补丁,这里就是通往那里的捷径。

git –git-dir=PATH_TO_OTHER_REPOSITORY_HERE/.git format-patch -k -1 –stdout COMMIT_HASH_ID_HERE| git am -3 -k

5. 检测 你的分支的改变是否为其它分支的一部分
cherry命令让我们检测你的分支的改变是否出现在其它一些分支中。它通过+或者-符号来显示从当前分支与所给的分支之间的改变:是否合并了(merged)。.+ 指示没有出现在所给分支中,反之,- 就表示出现在了所给的分支中了。这里就是如何去检测:

git cherry -v OTHER_BRANCH_NAME_HERE

#例如: 检测master分支

git cherry -v master

6.开始一个无历史的新分支
有时,你需要开始一个新分支,但是又不想把很长很长的历史记录带进来,例如,你想在公众区域(开源)放置你的代码,但是又不想别人知道它的历史记录。

git checkout –orphan NEW_BRANCH_NAME_HERE

7. 无切换分支的从其它分支Checkout文件

不想切换分支,但是又想从其它分支中获得你需要的文件:

git checkout BRANCH_NAME_HERE — PATH_TO_FILE_IN_BRANCH_HERE

8.忽略已追踪文件的变动
如果您正在一个团队中工作,而且大家都在同一条branch上面工作,那么您很有可能会经常用到fetch和merge。但是有时候这样会重置您的环境配置文件,如此的话,您就得在每次merge后修改它。使用这一命令,您就能要求git忽视指定文件的变动。这样,下回你再merge的话,这个文件就不会被修改了。

git update-index –assume-unchanged PATH_TO_FILE_HERE

9.检查提交的变动是否是release的一部分

name-rev命令能告诉您一个commit相对于最近一次release的位置。使用这条命令,您就可以检查您所做出的改动是否是release的一部分了。

git name-rev –name-only COMMIT_HASH_HERE

10.使用rebase推送而非merge

如果您正在团队中工作并且整个团队都在同一条branch上面工作,那么您就得经常地进行fetch/merge或者pull。Git中,分支的合并以所提交的merge来记录,以此表明一条feature分支何时与主分支合并。但是在多团队成员共同工作于一条branch的情形中,常规的merge会导致log中出现多条消息,从而产生混淆。因此,您可以在pull的时候使用rebase,以此来减少无用的merge消息,从而保持历史记录的清晰。

git pull –rebase
您也可以将某条branch配置为总是使用rebase推送:

git config branch.BRANCH_NAME_HERE.rebase true

提前通知浏览器做硬件加速(CSS will-change 属性)

CSS will-change 属性介绍

如果你注意到在webkit的浏览器上“flicker”一些CSS操作(尤其是变形和动画方面的)的表现,你很可能之前就注意过硬件加速了

CPU、GPU和硬件加速

硬件加速意味着Graphics Processing Unit(GPU)会通过代替Central Processing Unit (CPU)做一些负荷比较大的事情,来协助浏览器快速渲染页面,当CSS操作使用硬件加速的时候,通常会使页面渲染速度加快

顾名思义,CPU和GPU都是计算机处理单元。CPU在电脑主板,几乎处理电脑的一切操作,有电脑大脑之称;GPU在显卡上,负责处理和渲染图形。此外GPU通过特殊的设计,使其擅长于渲染图形所需的数学和几何运算。因此把操作转嫁到GPU可以获得显著的性能提升,同时也可以减少移动设备CPU的争用。

硬件加速(或者说GPU加速)依赖于浏览器渲染页面使用的layering model,当特定的操作(CSS 3D变形)作用于页面上的一个元素,元素移动到它自己的layer,在这个layer中元素合一不受页面其他元素的干扰独立渲染,然后复合到页面中去。在这种隔离内容渲染的工作方式下,如果页面的变化仅仅是该元素的变形,其余部分不必被重新渲染,这会带来显著的速度优势。值得注意的是只有3D变形会有自己的layer,2D变形不会。

CSS的动画、变形、渐变并不会自动的触发GPU加速,而是使用浏览器稍慢的软件渲染引擎。然而一些浏览器提供了hardware acceleration by means of certain properties来获取更高的渲染性能。 举个例子,opacity属性是几个能够加速的属性之一,因为GPU可以方便的处理。基本上任何层的透明度渐变浏览器都会交给GPU处理来加速。除了opacity能够使用GPU处理的就是CSS 3D变形了

translateZ() (or translate3d()) Hack

很长一段时间内我们都通过translateZ()或者translate3d() hack来骗取浏览器触发硬件加速,具体做法就是为元素添加没有变化的3D变形,比如元素在2维空间可以通过添加以下CSS来硬件加速

transform: translate3d(0, 0, 0);
所谓硬件加速就是创建了一个被传递到GPU处理的层的操作,然而强制使用hack方式创建layer并不是长久之计,创建layer的技术可以使页面加速,但是也有代价:它们占用RAM和GPU存储空间(考虑到移动设备的存储容量有限),所以必须呗小心使用,确保这么做真的对页面渲染有所帮助

为了避免创建layer的hacks,一个允许我们提前通知浏览器我们将对元素做何种变化的CSS属性被引入,这样浏览器可以优化处理元素渲染的方式,为元素提前准备昂贵的动画处理操作,这就是wiil-change属性

牛逼的 will-change属性

will-change属性可以提前通知浏览器我们要对元素做什么动画,这样浏览器可以提前准备合适的优化设置。这样可以避免对页面响应速度有重要影响的昂贵成本。元素可以更快的被改变,渲染的也更快,这样页面可以快速更新,表现的更加流畅。

举个例子,当对于素使用 CSS 3D变形时,元素及其内容可以在合成到页面之前被创建到我们之前说的layer。然而把元素放到layer中是个昂贵的操作,这将会导致变形动画延迟一个课件的瞬间,也就是flicker

为了避免这种延时,我们可以在发生之前通知浏览器,这样浏览器会有一定的时间去准备这些变化,当发生的时候layer已经准备好了,这样动画酒会很流畅,不会闪屏

使用will-change提示浏览器关于即将发生的变形十分简单,添加个CSS属性就行

will-change: transform;
也可以告诉浏览器要改变元素的滚动条位置,或者多个要变化的属性,写下属性的名字就行,也可以写多个,逗号隔开

will-change: transform, opacity;
声明了元素即将进行的变化会让浏览器在渲染页面时做更好的决定,这明显比之前说的3D hacks要好。

合理使用

了解了will-change的行为,为浏览器上一切元素设置will-change是不是效率会变高?答案是否定的,will-change如果被滥用会使页面崩溃。

will-change也有副作用,虽然并不直接可见,毕竟它只是在背后和浏览器说悄悄话,为了合理使用will-change,给一些小建议

不要声明太多属性或为太多元素声明

*,
*::before,
*::after {
will-change: all;
}
虽然看起来很屌,但其实对页面渲染伤害很大,这样的规则设了和没设没什么区别,浏览器本来就尝试最优的渲染所有元素,就等于你让老师重点照顾班里每个同学一样,就是废话!

其实这甚至是有害的,因为一些操作会占用太多的资源,甚至会导致页面奔溃,就等于强制要求老师为每个学生补课,累死了。。。

给浏览器足够的时间工作

will-change顾名思义,通知浏览器即将发生的变化,而不是正在发生的变化。使用will-change,我们要求浏览器重点照顾我们声明的元素,为了这个浏览器需要一定的时间来组织优化操作,这样当变化发生的时候,优化才能没有延迟的作用到元素

在变化前立即为元素添加will-change几乎没有作用,可能还不如不设置,因为会导致新的layer创建

.element:hover {
will-change: transform;
transition: transform 2s;
transform: rotate(30deg) scale(1.5);
}
这样的设置就没什么用,我们需要给浏览器足够的时间,下面这样就是有用的,感受一下

.element {
/* style rules */
transition: transform 1s ease-out;
}
.element:hover {
will-change: transform;
}
.element:active {
transform: rotateY(180deg);
}
如果一定要hover的时候,也有技巧

.element {
transition: opacity .3s linear;
}
/* declare changes on the element when the mouse enters / hovers its ancestor */
.ancestor:hover .element {
will-change: opacity;
}
/* apply change when element is hovered */
.element:hover {
opacity: .5;
}
其实核心思想就是让浏览器有时间去准备

变化完成后移除will-change

对于一般的优化,当变化完成的时候浏览器会撤销优化,恢复普通模式,但是如果使用了will-change会导致该优化迟迟不能释放,这就要求我们用完了就释放

这时候我们需要借助JavaScript

// Rough generic example
// Get the element that is going to be animated on click, for example
var el = document.getElementById(‘element’);

// Set will-change when the element is hovered
el.addEventListener(‘mouseenter’, hintBrowser);
el.addEventListener(‘animationEnd’, removeHint);

function hintBrowser() {
// The optimizable properties that are going to change
// in the animation’s keyframes block
this.style.willChange = ‘transform, opacity’;
}

function removeHint() {
this.style.willChange = ‘auto’;
}
当然对于用户会反复触发的操作放在style中不移除也可以

will-change属性的值

auto 表示没有明确的意图; 无论是启发式和最优化,用户代理应该应用都和正常情况相同
scroll-position 表示开发者期望去在接下来去改变或者有动画应用元素的滚动位置
contents 表示开发者期望去在接下来去改变或者有动画应用元素的内容
用来排除关键字 will-change, none, all, auto, scroll-position, and contents, 从之外增加一些通用的关键字

will-change: transform:
will-change: opacity:
will-change: top, left, bottom, right:

如果一个属性无最初的值,在这个元素上这个属性将创建一个堆栈的内容, 明确规定在will-change的属性必须在这个元素上创建一个堆栈的内容.

如果一个属性无最初的值, 这个属性将造成这个元素产生一个包含区块的固定定位的元素, 明确规定在 will-change的属性必须造成这个元素产生一个包含区块的固定定位的元素

《罗马人的故事2·汉尼拔战记》读书笔记

已经日渐衰落的地中海霸主迦太基和挑战者罗马之间第二次较量,汉尼拔开始了他的天才表演。孤军翻越阿尔卑斯山,在没有本土任何支援的情况下横扫亚平宁半岛,强大的罗马军团遭受空前绝后重创。但是,在这个早已写下结局的剧本上,一切至上荣耀在故事的结尾都将化为悲怆。

[阅读]《无畏的天才:1985-2000年,硅谷数码世界的变革》

道格拉斯·曼纽摄影作品欣赏《无畏的天才:1985-2000年,硅谷数码世界的变革》

4070087_1200x1000_0
斯蒂夫.乔布斯正思考如何回应。摄于1986年,加利福尼亚州帕罗阿尔托。NeXT电脑设计部经理艾迪.李说,当斯蒂夫愤怒的时候,他会带着一种奇怪独特的笑容注视你。


4070091_1200x1000_0
Autodesk公司里的宠物狗


4070092_1200x1000_0
苹果公司,牛顿战争工作室。摄于1993年,加利福尼亚州库比蒂诺。


4070093_1200x1000_0
奥多比公司的假期。摄于1994年,加利福尼亚山景城。


4070094_1200x1000_0
乔布斯有着艺术家一样的直觉,他惯于思考如何利用现有的技术去创造全新的产品。乔布斯是一个技术控、一个编辑、一个猎手及一个超级狡猾的商人。他的身边围绕着这个星球上最杰出的人才,但他也会不断地向他们咆哮,要求他们做一些连自己都觉得不可能的事情。在他的不断鞭策下每个人都突破自我,超越自己的才华。


4070095_1200x1000_0
随着数码科技的影响力与涉及面越来越广,硅谷让世界发生了翻天覆地的变化,艺术家们逐渐开始接受使用新技术进行工作。


4070096_1200x1000_0
斯蒂夫.卡普斯,硅谷中的一位谦逊低调的英雄。他是Macintosh Finder 的设计者,并曾经帮助开发了众多图像界面,近几十年来,几乎所有的图像界面都是以他的设计为基础的。


1319562a2-7
4070097_1200x1000_0
这是罕见的乔布斯的动态影像,他把新的镁电脑外壳套在自己的头上做试验。他做的每一个决定都影响着整个计划的成败,有时必须做出冷酷的决定。与他共事过的同事形容乔布斯做决定之前往往代表了20分钟的咆哮和争吵,当他说出‘好,非常好’的时候就代表这件事已有定案了。


4070099_1200x1000_0
罗斯.佩罗在与NeXT公司主要成员共进午餐后,决定投资超过2000万美元。佩罗相信他们未来可以创造出惊人的财富。但后来他说这是他一生中最糟糕的错误。


13195BP9-1
乔布斯正在解释科技发展是10年一个周期,乔布斯希望自己可以主导下一波计算机的发展浪潮,即冰箱大小的主机会演变成只有一立方英尺的个人电脑,每一名大学生都能支付得起。


1319561317-4
在给NeXT小组开简报的中场,史蒂芬突然停下来,然后说:“来吧,大伙儿,从现在开始到圣诞节,让我们每天夜晚和周末也工作吧!然后我们可以有一周的假期。”一个坐在屋子角落里的工程师回答说:“呃……史蒂夫,我们现在已经是每天夜晚和周末都在工作了。”


1319563310-5
NeXT团队的工程师们经常会被乔布斯提出的各种建议吓到,这些行业大佬们看乔布斯阐述自己的思维时都会表现咋舌,其中有个工程师更气得想向他吐口水。


13195C3V-3
虽然乔布斯出名地尖酸刻薄,而且报复心重,但不可否认那个时候的他非常快乐,天才的世界我们是搞不懂的。


4070100_1200x1000_0
在比尔.克林顿第二次参加总统大选期间,他出席一个由硅谷顶尖CEO共同举办的资金筹集活动,以此表示对硅谷的支持。


4070101_1200x1000_0
复仇前的祷告
在NeXT电脑发布之前,乔布斯在他的员工面前进行了一番激情洋溢的演说,并且大肆抨击了苹果和当时的CEO约翰·史考利,扬言一定要复仇。在道格·曼纽眼中,乔布斯控制欲很强,当被苹果踢出之后,他一直想找到机会重新杀回苹果公司。


4070102_1200x1000_0
苏珊卡尔设计了Macintosh,Windows与IBM第二代操作系统的LOGO,她的设计往往能给人们留下深刻的印象。


4070103_1200x1000_0
官方公布NeXT网络公司成立前,乔布斯已准备好了办公用电脑,它们拥有完整的主机、显示屏、打印机等等设备,图中电脑上盖了黑丝绒。


4070105_1200x1000_0
尽管Macintosh软件是以方便、易上手为设计目标的,但是随着一步一步的开发,它变得复杂而笨重。


4070108_1200x1000_0
传奇程序师,太阳微系统功勋领导人比尔.乔伊深信,完全自由的,为个人目的而进行的技术开发终有一天会危险到人类种群的生存。


4070110_1200x1000_0
清晨,NetObjects领导工作室里,工程师们留下的众多空中国食品盒子印证了他们为完成重要工作任务而通宵达旦。


策展人:
道格拉斯•曼纽(生于1957年)是一名来自纽约的摄影师。过去30年间,他的工作介于新闻摄影、委托工作与个人书籍编写等方面。凭借对摄影知识丰富的了解,他已经可以使用传统摄影技术来拍摄出能阐述自己主观思想的作品。他所有的作品都致力于探索人类生命中的挣扎与欢乐。
他自1981年开始从事新闻摄影工作,广泛参与各大新闻报业,包括《华盛顿邮报》、《时代杂志》、《新闻周刊》、《LIFE》、《财富》、《今日美国》 以及其他的国际出版社工作。曾经创作过的主题包括,埃塞俄比亚饥荒、奥林匹克、艾滋病灾难等。他以独家的、史无前例的方式纪录了硅谷在1985至2000年间的崛起。在那个人类历史上创造出财富与工作机会最多的时代,道格拉斯拍摄纪录了众多改变世界的创新者的日常生活,包括斯蒂夫.乔布斯、比尔.盖茨、约翰.沃诺克、卡罗尔.巴茨、安迪.格鲁夫、约翰.斯卡利、比尔.乔伊和约翰•杜尔。

摄影师自述:
在十五年的时间里,我记录下了硅谷中工程师,企业家和风险投资者们的故事。在外界人们的眼中,他们神秘莫测。在这个伟大的时代中,正是由于他们不懈的奋斗与努力创造出的技术革新,彻底的改变了人类社会的文化、行为的方式以及将要面临的新挑战。
我的记录历程始于1985年,这一年斯蒂夫.乔布斯被强制逐出苹果公司,他开始了自己新的追求:去建立一个超级电脑教育机构。在这个英才倍出的年代里,斯蒂夫.乔布斯无疑是杰出的一位。出色的想象力、开阔的视野与优秀的设计能力再结合上其不死的雄心壮志,造就了这样一位人才。我希望了解他创新的过程,并且我相信在以摄影的形式记录他的工作的同时,我可以利用这个途径,增进对整个硅谷世界的认识。当我向斯蒂夫的团队提出这个请求的时候,他们很快就同意了。在后来的三年中,我很顺利的扩展了自己的工作范围,赢得了众多著名创新者、超过七十家公司的信任与私下接触的机会。90年代,我继续随着这条线路开展摄影工作,在硅谷最辉煌的十五年里,我创作出超过250000张底片,整理记录成一个完整的摄影作品集。现在这些材料存于斯坦福大学图书馆,以作教学之用。
在这个时代里,日渐加速的创新步伐影响了整个世界工作的模式、公司结构以及商业环境。各个国家也都争先恐后开始利用与创造新的技术。一个数码世界创新的年代正在来临,毫无疑问,他将创造人类有史以来最多的财富与工作岗位。
贯穿于整个计划,我的摄影作品着重关注以下几点:
首先,我需要了解的是,这些在我工作中记录下的硅谷创新者们,是如何战胜恐惧与思维限制,去达到那个看似不可能的领域。我十分好奇,究竟是什么可以激发人们去对抗不可逾越的障碍,并最终找到他们人生的意义。他们和普通人究竟有什么不同?斯蒂夫.乔布斯想要再次改变世界,他想要协同他的团队去实现那个看似不可能的理想:将整个大型机整合浓缩为一个不足1立方英尺的方块。斯蒂夫告诉我,他希望一个在斯坦福的小孩可以使用它来在自己的宿舍里治疗癌症。因为他相信这可以做到,他的团队也同样相信,所以这个追求变成了他们的一个崇高使命。我开始明白,高超的技术人员
和普通人们都是一样的,坚定信心,战胜困难。想象一下,如果他们成功了,整个人类都将从中受益。
我在思考着,我所记录下的这些影像,如何在这个时代中发挥出其应有的作用。
自从2000年以来,在美国再没有任何一项技术革新能够像过去电脑事业那样为社会提供数以百万计的工作岗位。如今,Facebook, Twitter, Google及其从属公司只能提供50000个工作岗位,软件业的革新似乎停滞不前。创造就业机会,这一直都是一个全球性的问题。但是如今在美国,经济正在崩溃,教育系统好像也不再完整。计算机本科毕业生数量极具减少,今年是自1970年以来最少的一次。我们限制外来打工者、学生进入美国,以减少竞争。但是这样做的同时又限制了自己技术创新的能力。今天的孩子们不能想象没有邮件、网络的世界,他们依赖这些数码技术,但是却不知道它们从何而来。究竟怎样,我们才能激励下一代的创新者和工程师,像他们的前辈般的担起历史的责任?谁会是下一个斯蒂夫.乔布斯?他会在中国?印度?还是巴西?
在当今社会,我坚信这些影像可以激励大家,找回可以带动人类文明进步的工具。我曾经见证人们对梦想不可抑制、饥饿、原始的渴望,我相信这精神任然存在于硅谷,存在于世界。我衷心希望,这些记录辉煌的影像,能够给人们启示与力量。让新一代的追梦者,带领我们进入新一轮的技术革新,让新一代的年轻人,继承先辈们未完的梦想。

【生活乱炖】有种蔬菜叫香菜

730e0cf3d7ca7bcb9cac5869bc096b63f724a8a5

午饭是一碗凉拌米线,等了10多分钟米线端了上来。

配菜是绿、橙、白厚厚摞一层,分别是黄瓜、胡萝卜、白丝鸡丁,卖相甚是好看,米线半泡在清醋卤汁里,又撒点花生粉,闻起来也有味道。 一些看起来还好,问题是右手边那一撮翠绿,是香菜,对,竟然是香菜。

我一直以为,如果生命种真的有什么“不可承受之重”,那一定就是“有种蔬菜叫香菜”。

我熟练的抄起筷子把香菜挑出来。心想这30多的人吃饭还要挑菜,被小朋友看到不是好榜样,顿时心虚,环顾了下饭店四周,看能不能捕捉到一个无辜的小眼神。但看右手桌的红衣妹子也在四处乱瞅,见我扭过头来,手上筷子也停了下来,尴尬一笑,嗯,桌上是一撮刚挑出来的香菜。

PS:推荐 http://www.zhihu.com/question/28975137/answer/42759538