• 首页
  • 归档
  • 关于
  • 微博
  • GITHUB
  • [译]Git回滚合并

    May 26, 2015

    如果工作流严重依赖分支合并的话,也难免会碰到需要回滚合并的情况。而且回滚还分为两种情况:永久回滚,或者回滚后在稍后重新合并。

    假设有如下分支图:

    注:Git分支图中的箭头表示依赖关系,并不是分支发展路线。发展路线和箭头是相反的。也就是图中是从C1开始一直发展到C12的。

    假设要回滚C10。

    第一种解决方案是将master回退到C8,然后将两个特性分支jk/post-checkout和db/push-cleanup合并过来。

    1
    2
    3
    4
    git checkout master
    git reset --hard [sha_of_C8]
    git merge jk/post-checkout
    git merge db/push-cleanup

    完成之后,分支图如下:

    接下来就可以继续在新的master上工作,然后在适当的时候将tv/rebase-stat合并回来。

    ...阅读全文
  • 团队使用Git和Git-Flow手记

    May 11, 2015

    去年10月份,在我们被产品节奏逼到墙角无路可走的时候,我们在几乎没有准备的情况下,在团队中引入了Git。目前时间已经过去半年,回顾这半年的时间,基本还是运作得比较顺利。当然过程中也少不了踩坑,因此记录一些心得。

    Why Git?

    如果用一句话来说的话,我们是冲“分支”而来的。背景如下:

    团队的固定版本节奏为两周一个版本,一周半的时间开发,半周时间测试发布。如果使用软件工程中的概念来说的话,这是一个比较典型的瀑布式流程,即“需求->设计->开发->测试->发布”,然后周而复始,过程中几乎没有重叠。

    伴随着瀑布式的流程,代码也只有一份,“开发->改bug->发布”,周而复始。

    直到去年10月,公司做了一场声势浩大的营销活动,灾难开始了:一方面需要以并不确定的研发周期支持各种运营活动(运营时间不等人,必须快速写快速发),一方面是运营活动带来大量客户,与客户相关的流程也陷入频繁修改发布的过程。此外支持各种终端需求也集中爆发,需要web侧快速跟进上线。当然,还有一个东西,就是上面瀑布流程中两周发布一次的“主版本”。当这么多版本交叠在一起时,我们发现必须要引入分支来管理研发过程。于是果断切Git。

    ...阅读全文
  • 使用PM2 Deploy部署基于Git版本管理的网站应用

    Nov 19, 2014

    按照官方介绍,PM2是一款用于生产环境Node.js应用进程管理的工具。按照民间介绍,它主要有这样几个功能:保证Node.js应用永远在线(挂掉自动重启)、自动负载均衡、零中断重启应用等。

    鉴于它是如此优秀,这里还是简要介绍一下前两个功能。

    安装

    首先,它是一个Node.js写的工具,使用npm即可安装使用:

    npm install -g pm2
    

    运行Node.js程序

    如果不使用pm2,运行Node.js程序是这样:

    node xxx.js
    

    使用pm2,是这样:

    pm2 start xxx.js
    

    监视模式

    如果你正在开发Node.js应用,需要在代码变更后自动重启应用,只需要在pm2的参数中加上--watch即可:

    pm2 start xxx.js --watch
    
    ...阅读全文
  • 如何高效debug

    Jun 29, 2014

    这是一个公司内网上的问题,原意是题主觉得debug非常费时,影响了项目的效率,问如何改进。当时也在内网随手码了几点,回头又看了一遍觉得很有共性,可以再扩展一下单独写写,于是诞生此文。因为专业所限,本文的部分细节也只限于web前端,但思路和其它语言是相通的。

    首先,程序员要调整好心态。

    事实上,debug是程序员工作的重要组成部分,甚至在产品的某些阶段是唯一的组成部分,所以不用把调bug看成是拖累产品进度、降低效率的凶手,这是一件必须要花时间认真去做的事情,它就是你的工作,也是整个项目进度过程中必不可少的组成部分。所以在debug的时候也可以更加平心静气一些,不用那么急躁。

    当然,这个心态的改变也会涉及到项目进度安排上的一些调整,比如在排期的时候就要预估debug的时间,而不能仅仅只安排编码的时间。此外,还需要给自己做好时间管理,尽量能排比较大段的不被打扰的时间来debug。

    把心态放平之后,有的bug可能解决起来真的就没那么耗时了。在心态平和、思路清晰、无人打扰的情况下,一般修起bug来都有如神助,效率高得连自己都不太敢相信。相反,往往越是着急的时候越是难定位到bug的真正原因。

    ...阅读全文
  • Retina屏下的CSS雪碧图

    Mar 19, 2014

    CSS雪碧图早已经成为前端知识体系中一个必备知识了,时至今日,可能很多人都觉得这一块已经没有什么东西可以再讲了的。但事实上雪碧图一直都可以引出新的话题,比如从最早的连接数和体积的平衡到格式之争到图像摆放位置的策略,再到合并图像的颗粒度,再到内存占用、CPU占用等性能问题……

    没错,今天还要在这一古老的话题上展开,引入一个新的问题,那就是雪碧图在retina屏下存在的问题及应对方案。(值得注意的是,retina屏一般指分辨率为普通屏幕两倍的屏,这样按照普通尺寸开发出来的网站相当于被放大了2倍,会导致图像模糊之类的现象产生,理想的解决方案是为retina专门适配一套皮肤,但本文关注的问题是未适配retina屏幕的网站所出现的问题。)

    雪碧图本身不是浏览器或者web标准中的技术,因此它的不少细节取决于浏览器的实现,本文中的讨论的内容正是如此,为避免争议,本文所有结论的得出场景限定为Mac OSX 10.9.1、Chrome浏览器V33。是否适用iPhone、iPad等场景未做相应测试。

    无处不在的白边

    如前文所述,在retina屏上浏览未做专门适配的网站,会出现图像模糊等问题,无法达到最佳效果,但一般情况下,仍然处于可以接受的范围。不过,在某些网站上,却出现了比图像模糊更糟糕的情况:

    ...阅读全文
  • 学习ES6生成器(Generator)

    Dec 29, 2013

    这几天,TJ大神的koa框架突然在国内火起来了,随之而来的,则是其使用的ES6生成器(Generator)引起了广大码农的强烈兴趣,各种文章也如雨后春笋般拔地而起,比如这篇、这篇、还有这篇。这个神奇的生成器被视为解决JS“回调恶魔金字塔”的利器。在动手实践之后,发现介绍ES6生成器的文章仍然有些疏漏,因此有了这篇文章,权当是对各位大大们的补充好了。

    背景

    在JS的使用场景中,异步操作的处理是一个不可回避的问题,如果不做任何抽象、组织,只是“跟着感觉走”,那么面对“按顺序发起3个ajax请求”的需求,很容易就能写出如下代码(假设已引入jQuery):

    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
    26
    27
    28
    29
    30
    31
    32
    // 第1个ajax请求
    $.ajax({
    url:'http://echo.113.im',
    dateType:'json',
    type:'get',
    data:{
    data:JSON.stringify({status:1,data:'hello world'}),
    type:'json',
    timeout:1000
    },
    success:function(data){
    if(data.status === 1){
    // 第2个ajax请求
    $.ajax({
    ......此处省略500字
    success:function(data){
    if(data.status === 1){
    // 第3个ajax请求
    $.ajax({
    ......此处省略500字
    success:function(data){
    if(data.status === 1){

    }
    }
    });
    }
    }
    });
    }
    }
    });

    当顺序执行的异步操作越来越多的时候,回调层级也就越多,这也就是传说中的“回调恶魔金字塔”。

    ...阅读全文
  • 如何设计一个前端模板引擎

    Aug 25, 2013

    前端模板引擎现在已经被广泛应用于前端开发了,几乎每个项目都会使用。微博上甚至出现了“不写个模板引擎就没办法在前端界混了”的言论。当然,这是玩笑话,却也能在一定程度上反映前端模板的普及程度。如果你还没有了解过前端模板引擎,赶紧去补补课吧。

    本文其实算不上是一篇讲模板引擎设计的文章,写这篇文章的动力来自于自己使用过一些模板引擎(jQuery Tmpl、jade、ejs、artTemplate以及ThinkPHP自带后端模板引擎)之后的心得,所以可能不会涉及到模板引擎设计的方方面面,更多地是讲模板引擎之间的一些有差异的细节以及我的思考和取舍。

    来历

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var tempHtml = '<table>' +
    ' <tr>' +
    ' <th>Hello</th>' +
    ' <th>World</th>' +
    ' <th>!</th>' +
    ' </tr>' +
    ' <tr>' +
    ' <td>' + myData.col1 + '</td>' +
    ' <td>' + myData.col2 +'</td>' +
    ' <td>' + (myData.col3 === 'yes'?'!':'?') + '</td>' +
    ' </tr>' +
    ' </table>';

    document.querySelector('#myDiv').innerHTML = tempHtml;

    相信上面的代码对哪怕做过一点点涉及界面开发的都应该很熟悉吧。当我们想把一段结构和一段数据组合起来,再放到页面上时,就会常常面临这样一段复杂的代码。

    这段代码相信不用我说你也会觉得它实在有点复杂:要处理结构中字符串本身的拼接,还要注意结构与数据的拼接,处理数据拼接时还要注意运算优先级(尤其在使用?:三元运算符时),还要为了可读性考虑纠结的缩进……

    当然,最麻烦的还不是这里,当我们想要对一个数据循环遍历并输出时,居然还要自己去写循环,再一圈一圈地把这些结构拼起来,最后再拼上首尾的结构。而当数据为空时,又要自己去写一个“暂无数据”之类的占位符……

    ...阅读全文
  • [译]什么是Shadow Dom?

    Jun 7, 2012

    如果你做过网站,那么很可能你已经用过一些JavaScript类库。既然如此,你可能会对这些不知名的类库作者心存感激。

    这些作者——web开发领域的勇士们——都面对着同样的一个问题——封装。他们会花大量的精力在面向对象的经典问题之一上面,即如何封装自己的代码,以便与类库使用者的代码分离。

    除了SVG,现在的Web平台只提供了一种原生的方法去隔离代码块,这并不优雅。没错,我说的就是iframe。对大部分需要封装的场景来说,frames太重而且限制太多。

    如果我需要把每个自定义的按钮都放到iframe里,你是什么感觉,会不会疯掉?

    所以,我们需要一些更好的东西。事实上,大部分的浏览器已经变相地提供了一种强大技术去隐藏一些实现细节。这个技术就是所谓的“shadow DOM”。

    ...阅读全文
  • xheditor从剪贴板粘贴图片的实现原理

    Nov 30, 2011

    xheditor是一个优秀的国产富文本编辑器,最近的(其实我也不知道有多久了)版本推出了一个粘贴剪贴板图片的功能,很是喜爱,好奇了好久,最终不住去看了下源码,基本明白了。

    2016-07-29 似乎这个编辑器也很久没更新了,现在对上面这段话持保留态度,不做推荐。

    首先,这个功能很新,不支持IE系列浏览器……用的是一些新的API。我手上的代码是1.1.10,所以代码行数以这个版本为准。

    一点前置小知识是必备的,那就是对大部分截图软件来说,截图操作是一个把截取的图片转换成指定格式(windows自带的是bmp)然后放入剪贴板的过程。所以,要粘贴图片,核心就是读取剪贴板。

    ...阅读全文
上一页

© 2012 - 2021 TooBug, powered by Hexo and hexo-theme-apollo.

粤ICP备15078043号