背景
今天雙十一,昨晚有好多電商行業的 IT 工程師們挑燈夜戰,為這個全民狂歡的購物節護航。還記得三年前我們公司一個產品上線前一周時,辦公室內拉起“跟 Bug 死扛到底”的橫幅,Bug 可以說是程序員的死穴。我每次預感到代碼有 Bug 時,神色立馬緊張起來。
編程路上,Bug 載道;前車之鑒,后車之師。本文整理了一些我在問答技術網站上看到的、回答過的有價值的問題。權當是個人知識庫了!
IDEA 編輯的功能
IDEA 強大的自動代碼補全功能快捷鍵 Tab,代碼標簽輸入完成后,按Tab,生成代碼。
- div.class.out + Tab
- 常用的有 fori/sout/psvm+Tab 即可生成循環
- System.out、main 方法等 boilerplate 樣板代碼,要輸入 for(User user : users) 只需輸入user.for+Tab
- 輸入 for(User user : users) 只需輸入user.for+Tab
- 要輸入Date birthday = user.getBirthday(); 只需輸入user.getBirthday().var+Tab 即可。
Python/ target=_blank class=infotextkey>Python 中查看某個模塊的用法
Python 命令行輸入后,可以使用 help 方法查看方法的用法,例如:
import re
help(re.compile)
在控制臺輸出得到該方法的描述信息:
Python 不忽略首行
Python 處理 csv 文件時,pandas.read_csv(“data.csv”) 默認會將第一行作為標題行信息,不做處理。怎么讓它從第一行開始處理呢?header=None 可以達到該目的。
df = pd.read_csv("data.csv", header=None)
對象晉升到老年代的過程
對象優先在Eden分配,且新生代對象晉升到老年代有多種情況
(1)、Eden 區滿時,進行 Minor GC,當 Eden 和一個 Survivor 區中依然存活的對象無法放入到 Survivor 中,則通過分配擔保機制提前轉移到老年代中。
(2)、若對象體積太大, 新生代無法容納這個對象,-XX:PretenureSizeThreshold 即對象的大小大于此值, 就會繞過新生代, 直接在老年代分配, 此參數只對 Serial 及 ParNew 兩款收集器有效。
(3)、存活期限長的對象直接進入老年代。
Python 邊遍歷邊刪除
邊遍歷邊刪除數組會導致數組索引范圍變化,導致程序出錯,這在 JAVA 中也是需要注意的問題。但是,Python 的數據處理方法提供了一個巧妙的處理方法。
使用 sorted(list) ,會產生一個新的數組,所以據此刪除原來數組的元素,不會改變下標,不會出錯。即遍歷過程中是用 sorted(list) 返回的新數組,而刪除是操作原來的數組,即遍歷用了一份拷貝,修改完原數據后得到最終需要的結果了。
__name__的含義
經常看到 Python 會看到 if __name__ == '__main__':這樣的代碼,這段代碼是什么作用呢,去掉這段代碼后,為什么程序不會執行呢?
__name__ 是系統內置變量,代表所在模塊名字,也即所在文件名。當模塊直接運行時,如 demo_list.py 文件被直接運行,__name__ 的值為 “__main__”,所以 if __name__ == '__main__': 通常是觸發主流程的。
推導式的過程
推導式的過程:是將整個最后的結果再存入容器的,而不是一邊遍歷一邊推導的。
會在推導式執行完成后,一次性將結果寫入 tmp_list 變量,而不是執行推導式的過程中就直接寫入 tmp_list 變量。
tmp_list = [i for i in num_list if i not in tmp_list]
這是無效的,tmp_list 并不是預期推導的值。
解析 ngix 日志按小時統計行數
給定一個 ngix 日志文件,解析時間列并按時間統計每小時的日志行數。日志文件格式為:
192.168.1.1 [22/Oct/2019:23:58:54 +0800] "POST /dasdhj/sadqwda/q.log HTTP/1.1" 200 133 0.022 "-" "Apache-HttpClient/4.3.3 (java 1.5)" "-"
編寫 Shell 解析命令為:
awk '{ print $2}' ngix.log | awk -F ":" '{a[$2]=a[$2]+1} END {for(i in a) { print "time:",i,"count:",a[i]}}'
思路:
- 先進對日志按空格分割,得到第二列的日志記錄時間戳列
- 再對時間列按冒號分割,得到時間列,并按時間列累加
- 輸出時間和累加值
input 表單不觸發 onclick 事件
一個簡單的觸發隱藏一個 h1 標簽的事件,但是沒有執行,代碼為:
<h1 id="EleId">請點擊此文本!</h1>
<input type="button" value="點擊隱藏" οnClick="alert('111');">
反復測試,最終確認是 input 的用法錯誤了,使用 button 按鈕元素就可以了:
<button id="clear-button" onclick="clearInput();">點擊隱藏</button>
線程池關閉導致 AtomicInteger 計數不準確問題
AtomicInteger 類是使用 CAS 原則來實現對數值類型的原子操作的,而且并發效率比 synchronized 高很多。今天看到一個因為線程池提前關閉,導致任務中對 AtomicInteger 計數操作未執行,進而打印的計數值不準確的問題。
這個問題側面驗證了原子類的高效,此外,還有一個知識點是關于 ConcurrentLinkedQueue 類的,判斷隊列是否還有元素,應該使用 isEmpty() ,而非 size()。因為是鏈表,size 操作需要遍歷列表統計元素總數;而 isEmpty() 直接判斷 first 是否為 null ,效率比前者高。
ajax 請求 415 問題
SSM 項目中出現 ajax 415,出現了請求類型為 json 時后臺 415 的問題,這個主要是提交請求時的文件類型和 SpringMVC 配置的類型不一致導致的:
- type:json
- 后臺要指定 medias 包含 json 類型