2018 年度程式碼報告
作者:枕邊書 連結:https://zhenbianshu.github.io
最近,網易雲音樂、B站等 APP 都放出了使用者的 2018 年度使用報告,在朋友圈掀起了一股年度報告的熱潮,我昨天在刷微博時看到”精分君”分享的《年度罵人報告》後,在被笑得眼淚都出來的同時,也在想我是不是也可以出一個《年度程式碼報告》呢?
收集資訊
得益於今年工作的穩定,所有原生代碼倉庫都老實地放在各個 jetBean 軟體目錄下,而且程式碼版本控制工具上,工作用 Gitlab,業餘用 Github,都屬於 git 系列,所有的提交記錄都可以從 git log 裡查詢到,極大地方便了我收集資訊。
git log
使用 git log 命令可以很方便地檢視 git 的提交記錄,我們在 git 目錄下,不帶任何引數使用 git log 命令時,會像平常使用 less 等命令時,進入一個內容瀏覽介面,在這裡,我們可以翻頁從前到後檢視所有的 git 提交記錄。使用 > 內容重定向符可以把 git log 重定向到指定的檔案中,這時候我們看到的資訊如下:
commit ee66af2de2e0b11bb9c987969916fcf486c25f1e
Author: zhenbianshu <[email protected] >
Date: Thu Dec 27 19:32:28 2018 +0800
fix site base url;
可以看到,每一條提交記錄都被拆分成了多行,而且如果 commit comment 有多行的話,日誌會更不規則。git log 提供了 --pretty
引數可以幫助我們提取指定欄位,並將它們整合到同一行。
pretty 引數的用法為 git log --pretty="FORMAT"
,如我們常用的 printf 函式一樣,可以在 FORMAT 中指定需要欄位的佔位符,各個欄位對應的佔位符都可以在 Git 官方文件中查詢到,這裡我只需要 %h(短 hash)、%cd(完整提交時間)、%s(提交時的 comment)
--after
各 --before
限制 git log 的時間範圍,在多人合作的專案中,還需要使用 --author
限定提交的作者,最終完整的命令如下:
git log --after="2018-01-01" --before="2019-01-01" --author="zhenbianshu" --no-merges --pretty=format:"%h | %cd | %s" >> /tmp/git.log
新增資訊
通過 git log,我拿到像這樣的提交資訊:81cb3a0bb | Fri Feb 9 10:25:12 2018 +0800 | fix bad smell;
,由於缺少專案和語言資訊,還需要完善一下這些提交資訊。首先,在上一步,我將各個專案的 git log 都儲存在 專案.log
的檔案裡了,一共有 20 個專案,意味著我去年向 20 個倉庫貢獻了程式碼。 但這些倉庫使用的程式語言是沒法自動識別的,我只好手動把這些倉庫都放到 程式語言 資料夾內,最終的檔案目錄如下:
./C/rsync.log
./go/gotorch.log
./Java/story.log
./shell/video-simulation.log
...
接下來,再把各個檔案的的路徑名填充到各行後整合到一個檔案就行了。這裡我使用了 find、 xargs 和 awk
命令,命令如下:
find . -name "*.log" | xargs -I {} awk -v file="{}" '{print file,$0 }' {} >> /tmp/raw.log
xargs 指定了 {} 作為 find 查到檔案的替代符,然後使用 awk 的 -v 選項將檔名作為變數傳入每一行。
分析
shell 命令
分析其實挺簡單,就是把常用的 linux 命令揉合一下,無非是 awk、grep、sort、uniq、wc
等。
主要用到的命令選項是:
grep -e XX -e YY
搜尋包含 XX 或包含 YY 的行;grep -E 'regex'
按照正則搜尋;awk '{if(A){B}}'
awk 裡的條件判斷語句;sort -f '*' -kn
以 * 分隔每行後,按第 n 列排序。
分析命令
貼兩個所用的分析命令吧。
(1)提交程式碼最多時段。我把一天的時間劃分為四個時段: 0-6點凌晨、6-12點上午、12-18點午後、18-24點夜晚,對應命令是:
awk '{if($6>="00:00:00" && $6<"06:00:00"){print "凌晨"};if($6>="06:00:00" && $6<"12:00:00"){print "上午"};if($6>="12:00:00" && $6<"18:00:00"){print "午後"};if($6>="18:00:00" && $6<="23:59:59"){print "夜晚"};}' git.log | sort | uniq -C
結果是:
5 凌晨
296 上午
679 午後
346 夜晚
(2)提交天數最多的專案。第二項是專案名,第五項是日期。
awk '{print $2,$5}' | sort | uniq | awk '{print $1}' | sort | uniq -c
圖片處理
資料分析出來之後,就是處理圖片了。
我是在網易雲音樂年度聽歌報告的基礎上改的(不用作商業,應該沒問題吧,有問題請私我),所以需要一個像 Photoshop 一樣的 P 圖工具,在 Mac 上推薦用 Pixelmator,功能上跟 Photoshop 沒什麼區別,但軟體大小才 100 多 M,比動轍 1G 多的 Photoshop 好多了。
軟體工具上,主要用了補丁、文字、選區、裁剪、取色、倒色、圖層等工具,之前有些 Ps 基礎,用起來很簡單。
成果
歡迎關注
Java名企面試吧,10點24分,我們不見不散!
能力有限,歡迎指教!