跳到主要內容

發表文章

Chrome 放棄請求

有人遇到 Chrome 放棄 (abort) ajax 請求 (request) 的狀況,但原因不明。只知道 XMLHttpRequestEventTarget.onabort 被呼叫了。 有人查了 Chrome 的程式碼與也有人歸納自己的經驗,發現有以下幾種情形 Chrome 會放棄請求: 發出請求的 DOM 元素已經被刪叫 例如說 <img> 將要載入圖片,但在載入發生之前, <img> 就被刪掉了。 做了某件事造成不需要該請求 例如載入一個 iframe,但卻改變 src 屬性,因此原本要載入的內容就不需要了。 多個請求中的第一個失敗了 架設有多個請求陸續發到同一個伺服器,先發的某個請求因為網路問題失敗了,例如 DNS 錯誤、400 等,那後續的請求就會被取消 Self-signed certificate 不被 android Chrome 信任 你發出一個請求到一個 self-signed 網站,因為 SSL certificate 不被 Chrome 信任,因此它就悄悄地取消該請求,也沒有任何訊息。要下載與安裝該 certificate 到 Chrome 中才能解決。 點擊在 form 中的 <button> 若點擊在 form 中的 <button> 要發出 AJAX 請求,也會被瀏覽器取消。 你可以改用 div 或 span 。如果必須要用 button ,必須呼叫 preventDefault() 。 ajax 請求違反 same origin policy 參考資料: https://stackoverflow.com/questions/12009423/what-does-status-canceled-for-a-resource-mean-in-chrome-developer-tools/13459106#13459106 http://twincreations.co.uk/ajax-request-canceled-status-with-no-http-header/

[Maven] 增加建構 (build) 過程的資訊到 Manifest 中

自動產生建構相關的資訊 在部署到伺服器後,有時會弄不清楚這個到底是根據哪一個 commit 發布的、何時發布的、某個函示庫使用哪個版本,或是 不想一直修改版號,想要用發布時間代替版號 頻繁的部署到伺服器,甚至部署到不同的伺服器,你想知道目前這個伺服器上目前到底是哪一版、或執行哪個 commit 的 code 這時你可以把建構過程的資訊加入 manifest 中,再由程式讀出來顯示在適合的地方。 用 buildnumber 產生 git commit, git 分支 (branch) 等資訊 < plugin > < groupId > org.codehaus.mojo </ groupId > < artifactId > buildnumber-maven-plugin </ artifactId > < version > 1.4 </ version > < executions > < execution > < goals > < goal > create </ goal > </ goals > </ execution > </ executions > < configuration > < revisionOnScmFailure > 0 </ revisionOnScmFailure > < useLastCommittedRevision > true </ useLastCommittedRevision > </ configuration > </ plugin > 用 build-helper 產生台灣時間 (GMT+8)。因為 project.build.timestamp 是 UTC+0 時間。 < plugin > < groupId > o...

testcafe 除錯

某次用 testcafe 測試時,呼叫某個 library 的函數後,整個瀏覽器就沒反應,也無錯誤訊息,完全無法得知發生何事。 這時只好追蹤進該函數才能知道發生何事,以下兩個參數可以啟用 node.js server 端的除錯器: testcafe --inspect --debug-brk chrome ./test.ts 參考 All the tricks that help you debug TestCafe tests 只要在程式碼中寫下 debugger; 該除錯器就會幫你停在那ㄧ行,接下來你就可單步執行去找問題。 最後發現是 Promise 中的 lambda function 內有錯誤: fs.copyFileSync 是 undefined,因為從 node 8.5.0 之後才存在該函數。 後來發現這兩個參數其實是 node.js 的除錯參數,看來 testcafe 本身也是執行 node.js。

2018 台灣領袖高峰會心得 - 面對失敗

幾乎每個講者都提到失敗。 對個人來說,不要害怕失敗,要勇敢面對,甚至要把失敗當做養分,當作天然資源一樣運用,從中我們可以學習、並改進,進而成長。不要把失敗當做是對自己的否定,那只是你人生中必然會出現的一種狀況。 一個例子 我想到前陣子一個發生在我自己身上的事。 某次我在試用公司產品時,發現了一個缺陷,回報給產品團隊時,他們卻說他們那邊無法重現這個問題,但我這邊卻能很明確用幾個步驟產生該缺陷。我與同事花了不少時間找原因,比較我跟產品團隊的環境差別,後來才突然發現我電腦上的客戶端程式與產品伺服器版本不同,因此連線上產品伺服器去操作的時候才會產生該缺陷,然而必須要使用客戶端程式與產品伺服器相同版本才能正確運作。 剛發現原因的時候,又陷入過往錯誤的思考模式,開始否定自己,覺得丟臉,感覺是自己犯了愚蠢的錯誤,弄錯版本給同事找麻煩。過了一會,冷靜一想,其實使用者操作的時候看不出伺服器版本,如果用錯誤的版本連上伺服器也不會立即產生什麼錯誤,大部分功能都可以正常使用,只是就是會在特定情況發生該缺陷。因此未來客戶也可能會跟我犯一樣的錯誤而不自覺,而這樣會導致我們跟客戶之間花費大量時間除錯。於是我建議產品團隊要增加一個版本不一致警告,當客戶端連上一個不同版本的伺服器時,會主動跳出警告顯示兩方的版本,就能避免意外使用不同版本而造成難以除錯的狀況。而主管也都同意增加此功能。

ZK 教學 - 常見錯誤用法 06 - 慎選 data binding 語法

慎選 data binding 語法 最常用的語法有以下 4 種: @init: 只從 ViewModel 載入一次 @load:載入並追蹤 ViewModel 變化 @save:寫入 ViewModel1 @bind:(雙向)等於 @load + @save 後面 3 種因為需要持續維持(追蹤)元件與 ViewModel 的綁定關係,伺服器需要建立 tracking node,因此成本較高。 依對系統的負擔排名如下: 因此如果沒有動態變化的需要,請使用 @init 。 例如在 Listbox , Grid , Tree 內的 <template> 若只是顯示資料,只需用 @init ,可以免去大量 tracking node 所需的記憶體。 例如: < grid width = " 400px " model = " @init(vm.itemList) " > < columns > < column label = " index " /> < column label = " name " /> </ columns > < template name = " model " > < row > < label value = " @init(forEachStatus.index) " /> < label value = " @init(each.name) " /> </ row > </ template > </ grid >

將 Atom 作為 markdown 編輯器

如果要將 Atom 作為 markdown 編輯器的話,本身已經內建預覽功能 (ctrl+shift+m),再加上以下兩個套件會更方便: markdown-scroll-sync 捲動原始檔案時,預覽畫面也會跟著捲動。 markdown-writer 增加熱鍵插入 markdown 語法,如 cmd+shift+’ 插入 code block。安裝完後,要先選 Packages / Markdown Writer / Configurations / Create Default Keymaps,熱鍵才會作用。

Intellij IDEA java 在 mac 下除錯模式啟動特別慢(卡住)

使用 Intellij 時,很常需要用除錯 (debug) 模式執行一個程式,但我發現在 Mac 下每次啟動都會卡住整個 Intellij 好幾秒鐘(完全無法操作),然後才會啟動,非常影響除錯效率,近來終於找到 stackoverflow 上有人提供的解法 :可以透過修改 /ect/hosts 或是啟動 File Sharing 來解決。