美文网首页
ARTS 第3周

ARTS 第3周

作者: 陈卧虫 | 来源:发表于2019-04-21 22:26 被阅读0次

    ARTS 第3周分享

    [TOC]

    Algorithm

    832. Flipping an Image

    难度:[easy]

    [思路]

    1. 先flip,再invert

    2. flip将二维数组中的每一个数组进行flip,所以先遍历这个二维数组

    3. 对每个一维数组进行flip

      • 倒叙遍历这个数组,结果用一个新数组存储
      • 用新数组替换原数组
    4. invet,两层循环遍历所有元素,将每一元素0和1互换即可

    [参考代码]

    func flipAndInvertImage(A [][]int) [][]int {
        // flip
        for i, v := range A {
            vr := make([]int,0)
            for ii:=len(v)-1; ii>=0; ii-- {
                vr = append(vr, v[ii])
                fmt.Println(vr)
            }
            A[i] = vr
            fmt.Println(A[i])
            fmt.Println("vr********************")
        }
        fmt.Println(A)
    
        // reverse
        for io, v := range A {
            for ii, vi := range v {
                if vi == 0 {
                    A[io][ii] = 1
                } else {
                    A[io][ii] = 0
                }
            }
        }
        return A
    }
    

    Review

    Go 系列教程 —— 15. 指针:https://studygolang.com/articles/12512

    主要讲的对go语言指针的基本介绍已经使用

    Tips

    vim 分屏的使用总结

    这周分享两个本周自己碰到的问题工作小问题以及总结吧

    第一个是vim的分屏,本人golang程序员,使用vim模式的goland开发,在Goland中开启分屏是很麻烦的,于是就想直接使用vim命令来开启和关闭分屏,额,就是为了高效(懒),

    下面就是我查资料以后觉得比较有用的vim分屏操作的一个整理

    新建分屏

    解释:[]中括号表示可有可无,n表示数字

    1. 命令行模式下
    • 垂直分屏::vs [file2] (vertical split)

    • 水平分屏::sp [file2] (horizontal split)

    1. 分屏打开两个文件
    • 垂直分屏:vim -O[n] file1 [file2 ... ]
    • 水平分屏:vim -o[n] file1 [file2 ... ]
    • 如果n 大于后面的文件数则新建文件
    1. 分屏新建文件
    • :new [newFileName]
      • 如果未填名字,可在保存文件时使用 :w filename ,为文件命名

    切换分屏

    a. 把光标移到右边的屏中
    ctrl+w l
    b. 把光标移到左边的屏中
    ctrl+w h
    c. 把光标移到上边的屏中
    ctrl+w k
    d. 把光标移到下边的屏中
    ctrl+w j
    e. 把光标移到下一个屏中
    ctrl+w w
    f. 把光标移到上一个屏中
    ctrl+w p

    移动分屏

    a. 向右移动
    ctrl+w L
    b. 向左移动
    ctrl+w H
    c. 向上移动
    ctrl+w K
    d. 向下移动
    ctrl+w J
    e. 向下旋转窗口 没效果
    ctrl+w r
    f. 向上旋转窗口 没效果
    ctrl+w R
    g. 当前窗口与下一个窗口对调 只限于开启双屏
    ctrl+w x

    关闭分屏

    • 除了单前分屏,关闭其它所有分屏 :only
    • 关闭单前分屏 :q
    • 关闭所有分屏 :qa

    git rebase

    git rebase之前也会使用,作用就是让提交记录变成直线而不是各种开叉与合并,这对于强迫症的我来说是一个相当实用的命令了,

    以前都是这种情况:

    我的本地分支落后于远程分支,但是我在本体提交了,所以我push推送到远端时会失败,我就需要先pull拉取远端的代码到本地,这时候git就会为你自动合并。一般这时我会使用git rebase 它会把分叉的提交变成直线,之后,我才push到远端。
    
    但是这次却出了一个问题,我和leader同时改了一个文件,并且他先推送到远端,这就导致我的版本落后于远端,所以我只能先pull拉取他的代码啦,结果肯定是冲突了。
    

    我解决完冲突再次commit之后,我就使用了git rebase命令希望把开叉变成直线,结果是我失败啦!开叉还是存在,我还自动进入了一个新的分支中去,之后就是一段胡乱操作猛如虎,自己都忘了自己做了啥,最终勉强提交上去了,但是那个开叉去一直存在了,它成了我心中的痛。。。

    痛定思痛之后我决定仔细研究一番git rebase

    以下是总结链接:

    https://www.jianshu.com/p/39c45f990c99

    Share

    漫话:如何给女朋友解释什么是乐观锁与悲观锁:
    https://mp.weixin.qq.com/s/TZy8iIGDL3gHPhVxTnJDeQ
    
    • 并发控制的目的是保证一个用户的工作不会对另一个用户的工作产生不合理的影响。
      • 没有控制好就会导致脏读,幻读和不可重复读等问题

    实现并发控制的主要手段就是通过锁:

    悲观锁

    在修改数据前,先锁定(Pessimistic Concurrency Control,缩写“PCC”)

    实现方式:通过数据库的锁机制

    • 它总是认为一定有人修改要修改数据,所以先取锁再访问

    • 这种总是认为会有冲突的态度,就是所谓的悲观

    • 缺点:处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会

      //0.开始事务
      begin;
      //1.查询出商品库存信息
      select quantity from items where id=1 for update;
      //2.修改商品库存为2
      update items set quantity=2 where id=1;
      //3.提交事务
      commit;
      
      select...for update 会把数据给锁住,innoDB默认行级锁;
      行级锁基于索引实现,如果sql语句不用到索引,会默认使用表级锁;
      

    乐观锁

    不使用锁,通过记录数据版本,对比版本判断是否修改( Optimistic Locking Control,OLC)

    实现方式:检测版本和更新数据 Compare and Swap(CAS)

    //查询出商品库存信息,quantity = 3
    select quantity from items where id=1;
    //修改商品库存为2
    update items set quantity=2 where quantity=3;
    
    1. 在更新之前查询数据库表中当前库存数(quantity),

      然后在做update的时候,以刚从库存查询出来的数值作为一个修改条件。

    2. 提交更新的时候,判断数据库表对应记录的当前库存数与第一次取出来的库存数进行比对。

    • 如果数据库表当前库存数与第一次取出来的库存数相等,则予以更新
    • 如果不相等, 认为是过期数据

    缺点:传说中的ABA问题

    解决方案:增加递增记录版本的字段:version

    //查询出商品信息,version = 1
    select version from items where id=1;
    //修改商品库存为2
    update items set quantity=2,version=3 where id=1 and version=2;
    

    每次操作的版本号都会随之增加,所以不会出现ABA问题,因为版本号只会增加不会减少.

    减小乐观锁力度,最大程度的提升吞吐率,提高并发能力!如下:

    update item
    set quantity=quantity-1
    where id=1 and quantity-1>0;
    

    以上SQL语句中,如果用户下单数为1,则通过quantity - 1 > 0的方式进行乐观锁控制。

    以上update语句,在执行过程中,会在一次原子操作中自己查询一遍quantity的值,并将其扣减掉1。

    高并发环境下锁粒度把控是一门重要的学问,选择一个好的锁,在保证数据安全的情况下,可以大大提升吞吐率,进而提升性能。

    总结:加锁一定要考虑粒度!

    • 悲观锁:态度悲观,认为对数据的并发修改的概率较大,所以要在修改之前加锁:先锁定再访问

    • 乐观锁:认为对数据修改的概率较低,不使用锁机制,直到提交时才对比记录的数据版本

    • 悲观锁实现方式:

      • 在修改前,先加排他锁
      • 成功:对记录修改,再解锁
      • 失败:等待或抛出异常
    • 乐观锁实现:检测冲突和更新数据(Compare And Swap)

      • 先获取修改的条件
      • 然后让他们同时去修改,但是在修改前判断修改条件是否改变
      • 如果修改条件没变:允许修改
      • 如果修改条件改变:条件过期,不允许修改

    本周阅读

    第三周:1,2,4,5,7
    漫话:如何给女朋友解释什么是乐观锁与悲观锁:https://mp.weixin.qq.com/s/TZy8iIGDL3gHPhVxTnJDeQ
    跟我一起写 Makefile(一):https://blog.csdn.net/haoel/article/details/2886
    
    一个好的 Go 语言 Makefile 是怎样的:https://mp.weixin.qq.com/s/wPnDnxtWQzmoMoCV8DSUKg
    都是关于makefile编写,自己还是不太懂。
    跟我一起写 Makefile(二): https://blog.csdn.net/haoel/article/details/2887
    跟我一起写 Makefile(三): https://blog.csdn.net/haoel/article/details/2888
    跟我一起写 Makefile(四):https://blog.csdn.net/haoel/article/details/2889
    vim分屏操作: https://www.jianshu.com/p/52949caa7e93
    在goland的vim模式中的分屏快捷键:
    垂直分屏:vs ( vertical split)
    水平分屏:sp ( SPlit )
    关闭分屏:qa (quit all)
    
    - 空
    
    git rebase 使用详解:https://blog.csdn.net/chenansic/article/details/44122107
    [golang] struct转JSON,解析JSON:https://blog.csdn.net/shachao888/article/details/53840577
    
    Go的竞态探测器: https://brantou.github.io/2017/05/23/go-race-detector/
    如何提升你的能力?给年轻程序员的几条建议: https://tech.glowing.com/cn/advices-to-junior-developers/?utm_medium=website&utm_source=gank.io%252Fxiandu
    
    -
    
    3.6 Git 分支 - 变基:https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%8F%98%E5%9F%BA
    Go 系列教程 —— 15. 指针:https://studygolang.com/articles/12512
    

    相关文章

      网友评论

          本文标题:ARTS 第3周

          本文链接:https://www.haomeiwen.com/subject/riusgqtx.html