git rebase移动commit到另外分支

    起因

    有两个分支, 一个master, 一个topic.

    master上面有commit: A C D
    topic上面有commit: A B C D

    本来是要在master上面提交2个新的commit: X Y , 但提交之后才发现是在topic上面提交的. 现在想把 X Y 两个commit移动到mater上面.

    git rebase --onto 可以实现这个功能, 模拟一下.

    模拟脚本

    用下面这个脚本模拟一下当前的情况

    git init
    date > 1
    git add 1
    git commit -m'1'
    git checkout -b dev
    date > 2
    git add 2
    git commit -m'2'
    git checkout master
    date > 3
    git add 3
    git commit -m'3'
    git checkout dev
    git merge master -m'merge from master into dev'
    date > 4
    git add 4
    git commit -m'4'
    date > 5
    git add 5
    git commit -m'5'
    

    脚本执行之后的commit情况

    * 2d2e87a - (HEAD -> dev) 5 (2 seconds ago) <childe>
    * afef668 - 4 (2 seconds ago) <childe>
    *   472e819 - merge from master into dev (2 seconds ago) <childe>
    |\
    | * ac945fe - (master) 3 (2 seconds ago) <childe>
    * | 1afa191 - 2 (2 seconds ago) <childe>
    |/
    * 18f563a - 1 (2 seconds ago) <childe>
    

    移动commit

    [/private/tmp/1521020400 on dev]
    % git checkout -b newbranch
    Switched to a new branch 'newbranch'
    [/private/tmp/1521020400 on newbranch]
    % git rebase --onto master 472e819 newbranch
    First, rewinding head to replay your work on top of it...
    Applying: 4
    Applying: 5
    [/private/tmp/1521020400 on newbranch]
    % git checkout master
    Switched to branch 'master'
    [/private/tmp/1521020400 on master]
    % git merge newbranch
    Updating ac945fe..33c077f
    Fast-forward
     4 | 1 +
     5 | 1 +
     2 files changed, 2 insertions(+)
     create mode 100644 4
     create mode 100644 5
    [/private/tmp/1521020400 on dev]
    % git rebase --onto 472e819  dev
    

    具体文档参见 https://git-scm.com/docs/git-rebase/2.21.0

    Read More...

    vmtouch

    vmtouch可以方便的控制和诊断文件在系统Cache中的情况

    官方文档在https://hoytech.com/vmtouch/

    Read More...

    使用span query解决elasticsearch中的一种复杂搜索

    “传说中的陈老师”(什么鬼??)提了一个需求, 是想利用ES来做一种比较复杂的搜索情况, 我自己测试了一下span query, 看起来是可以满足.

    Read More...

    为何没有充分利用CPU的一个小故事

    解决问题之后, 了解了负载均衡中一个比较隐蔽的坑(也只是对我这种新手来说是坑)

    写完之后发现自己还是没有把事情讲清楚的能力!摔.

    Read More...

    nginx的路径变化

    经常搞不清楚nginx的路径变化,特别是在proxy_pass的时候. 看下官方文档了解一下.

    http://nginx.org/en/docs/http/ngx_http_core_module.html#locationhttp://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass

    Read More...

    按顺序但非"完全精度"查找

    占个坑先吧.

    POST city/_search
    {
       "query": {
          "span_near": {
             "clauses": [
                {
                   "span_term": {
                      "cname": "地"
                   }
                },
                {
                   "span_term": {
                      "cname": "北"
                   }
                }
             ],
             "slop": 10,
             "in_order": true
          }
       }
    }
    
    Read More...

    斗地主

    前两天看到一个斗地主残局(斗地主都有残局了..), 如下图. 我便想写个程序算一下结果如何. 记录一下, 锻练一下自己说清楚事情的能力.

    想法是用程序模拟两个人对局. 就每人依次出牌. 如果一个人牌打完了, 对手就会要求悔棋. 一直到悔到最后没办法悔了就输了.

    每个人都先从最简单的牌开始出,最开始出单张,打到最后发现单张不行,就出对子.
    比如说, 农民先出一张3, 打到最后发现没办法赢, 再尝试先出一张4. 打到最后发现单张没办法赢, 就出2张3. 依次继续.
    大小顺序我们可以随便定, 我是按这样来的: 单张,一对,三张,三带一,顺子,四带2,普通炸,王炸,Pass
    解释一下最后的Pass是什么意思: 竟然想不到简单的例子, 就直接拿上图举例. 农民先出A, 地主小怪. 按顺序的话, 应该是出炸,但最后会发现炸会输,按我们定义好的顺序,接下来就是Pass,也就是说,地主出小怪, 我选择不出牌.

    其中几个需要仔细斟酌一下的细节:

    1. 什么时候需要悔牌?
      • 一个人的牌出完了, 对手要求悔牌
      • A悔牌之后, 发现自己上一轮是Pass, 那只能继续往前悔牌
    2. 什么时候算赢?
      • 农民第一次出牌已经需要Pass了, 说明他输了
      • 地主要求农民悔牌的时候, 农民已经是第一张牌, 说明地主输了
    3. 需要保存/传递哪些信息
      1. 按顺序记录当前出过的所有牌
      2. 当前出牌的人
      3. 当前桌面上的牌是什么 (可以放第1项里面)
      4. 如果是刚刚悔牌, 需要保存/传递刚悔的是什么牌
      5. 是不是处于悔牌状态(具体到我的代码实现中, 这个值是需要传递的. 在你的实现中,可以通过第4项直接得到). 这个关系到下一次可以出什么牌. 比如说桌面是444带J, 如果我不是悔牌, 那我的3张必须比4大,单张随意. 如果我是悔牌, 那么三张可以一样, 但单张必须比之前的大.

    简单的伪代码:

    while True:
        cureent_player.next
        if len(paths) == 1 and desktop is Pass:
            第一牌就只能Pass,没得打了,判cureent_player输
    
        if destop is Pass and previous_desktop is Pass:
            //注意这里是需要从Pass往前悔三次牌, 这种回退是一定可以的
            rollback(cureent_player,previous_player, cureent_player)
        if cureent_player.win:
            if rollback(cureent_player,previous_player) is False:
                无牌可悔,cureent_player赢
    

    具体代码见https://github.com/childe/doudizhu

    英语太差, 有几个变量名字解释一下:

    • Round 是指选手出的一次牌. 比如444带J是一个Round对象. Pass也是一个Round对象
    • minimal Two.minimal(cards)本意是指在所有cards里面, 选出最小的对子牌. 这个方法用在对手刚Pass, 而自己悔牌,需要从单张升级到对子的时候. 但可能没有对子,需要继续寻找有没有3张,3带1,顺子等.

    就这么多了, 我代码水平太次, 真正实现起来,还是Debug了好久,代码可读性也不是很理想. 另外希望没有打扰到你的思路, 对程序员来说, 递归可能是一种更加自然的思路. 但用Python实现的话,有可能会抛递归层次太深的异常. 毕竟我在i5上面跑了整5分钟, 日志打印了300MB…

    Read More...