ARTS 第4周
ARTS 第4周分享
[TOC]
Algorithm
832. Flipping an Image
難度:[easy]
[思路]
-
先flip,再invert
-
flip將二維陣列中的每一個數組進行flip,所以先遍歷這個二維陣列
-
對每個一維陣列進行flip
- 倒敘遍歷這個陣列,結果用一個新陣列儲存
- 用新陣列替換原陣列
-
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表示數字
- 命令列模式下
-
垂直分屏::vs [file2](v erticals plit)
-
水平分屏::sp [file2](horizontalsp lit)
- 分屏開啟兩個檔案
- 垂直分屏:vim-O[n]file1[file2 ... ]
- 水平分屏:vim-o[n]file1[file2 ... ]
- 如果n 大於後面的檔案數則新建檔案
- 分屏新建檔案
-
: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;
-
在更新之前查詢資料庫表中當前庫存數(quantity),
然後在做update的時候,以剛從庫存查詢出來的數值作為一個修改條件。
-
提交更新的時候,判斷資料庫表對應記錄的當前庫存數與第一次取出來的庫存數進行比對。
- 如果資料庫表當前庫存數與第一次取出來的庫存數相等,則予以更新
- 如果不相等,認為是過期資料
缺點:傳說中的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