昨天網易雲音樂、B站等 APP 都放出了用戶的 2018 年度使用報告,在朋友圈掀起了一股年度報告的熱潮,我昨天在刷微博時看到”精分君”分享的《年度罵人報告》后,在被笑得眼淚都出來的同時,也在想我是不是也可以出一個《年度代碼報告》呢?
轉載隨意,文章會持續修訂,請注明來源地址:https://zhenbianshu.github.io 。
收集信息
得益於今年工作的穩定,所有本地代碼倉庫都老實地放在各個 jetBean 軟件目錄下,而且代碼版本控制工具上,工作用 Gitlab,業余用 Github,都屬於 git 系列,所有的提交記錄都可以從 git log 里查詢到,極大地方便了我收集信息。
git log
使用 git log
命令可以很方便地查看 git 的提交記錄,我們在 git 目錄下,不帶任何參數使用 git log 命令時,會像平常使用 less 等命令時,進入一個內容瀏覽界面,在這里,我們可以翻頁從前到后查看所有的 git 提交記錄。使用 >
內容重定向符可以把 git log 重定向到指定的文件中,這時候我們看到的信息如下:
commit ee66af2de2e0b11bb9c987969916fcf486c25f1e
Author: zhenbianshu <zhenbianshu@foxmail.com>
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 列排序;
分析命令
貼兩個所用的分析命令吧。
-
提交代碼最多時段。
我把一天的時間划分為四個時段: 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 夜晚
-
提交天數最多的項目。
第二項是項目名,第五項是日期。
awk '{print $2,$5}' | sort | uniq | awk '{print $1}' | sort | uniq -c
圖片處理
數據分析出來之后,就是處理圖片了。
我是在網易雲音樂年度聽歌報告的基礎上改的(不用作商業,應該沒問題吧,有問題請私我),所以需要一個像 Photoshop 一樣的 P 圖工具,在 Mac 上推薦用 Pixelmator
,功能上跟 Photoshop 沒什么區別,但軟件大小才 100 多 M,比動轍 1G 多的 Photoshop 好多了。
軟件工具上,主要用了補丁、文字、選區、裁剪、取色、倒色、圖層等工具,之前有些 Ps 基礎,用起來很簡單。
成果
然后就是成果展示了,有些地方抹花了,湊合看吧~
小結
做些有意思的事,代碼寫起來更歡快了呢~
另外,shell 用着真舒服~
關於本文有什么疑問可以在下面留言交流,如果您覺得本文對您有幫助,歡迎關注我的 微博 或 GitHub 。您也可以在我的 博客REPO 右上角點擊 Watch
並選擇 Releases only
項來 訂閱
我的博客,有新文章發布會第一時間通知您。