脑洞大开,如何生成 2018 年度代码报告
昨天網易云音樂、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?<zhenbianshu@foxmail.com> Date:???Thu?Dec?27?19:32:28?2018?+0800fix?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.logxargs 指定了?{}?作為 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 用著真舒服~
總結
以上是生活随笔為你收集整理的脑洞大开,如何生成 2018 年度代码报告的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 周围的餐馆有哪些?GeoHash算法
 - 下一篇: DB-Engines 2018:Post