2023年11月14日 星期二

又是油漆工演算法發威的一日

嚴格來說,約耳當初提到油漆工演算法時,指的是原本應該是線性成長的時間,因為程式哪邊做了錯誤的處理而導致不合理的時間增加!

但我總覺得線性成長就很嚴重了XD

最近又遇到兩件線性成長的事了,一個是統計了 9 年多社區月報表的 Excel 檔案存檔開始超過 5 秒了(只有 6 年半時都還沒那麼誇張);另一個則是我的 Daily Money Android 記帳軟體目前已經不能用了(嚴格來說是點信用卡明細時,無法在 Android 預設的回應時間內跑完)。

第一件事暫時可以不管,反正之後應該會開發簡易系統解決。

第二件事對我來說就有點嚴重了,到現在都還不能對帳!

昨天嘗試清空資料後再重新 import CSV 備份檔,看來並不如我想像的可以重整 SQLite db?想想也是,SQLite 開發作者也是個大神,怎麼可能會有問題!

記得不知道那個版本的 Android 開始,SQLite db 好像有加密了,不能像以前一樣,拿回電腦下指令查詢?這點還要再確認一次(確認我用舊 SDK 版本重 build 的 apk,db 還是可以打開) 。

整個問題的本質就是:雖然 Daily Money 是一個很優秀的開源記帳軟體,但他並沒有會計年度結帳概念,故針對資產負債科目餘額都是從初始值計算每筆記錄得來。

在不換軟體的情況下,目前應該有兩個解法:

01. 針對我的信用卡科目建 index。
02. 在資產負債表明細查詢功能中限定只查過去一年。

但我目前就是沒時間改 code 呀…

2023/11/15 更新

晚上再忙也要抽出時間改 code,能少一件事就是一件事。剛好 Daily Money 也是舊 Android 專案,這個打通了,我的某一個交接項目應該也會沒問題。

可能自己不是專門寫 Android App 的,新的 Android Studio 雖然可以順利匯入舊專案,但一直無法成功編譯,錯誤訊息也看不出所以然?還是睡覺比較實在XD

今早熊熊想到,唯一的一顆外接備份硬碟也許會有舊環境,吃完早餐馬上打開電腦尋找,果然舊愛還是最美!

順便記錄一下我最後修改的版本號碼,因為舊環境居然還不是最新的?

Daily Money - 20140920

中午吃完飯散步時想了一下,Android Studio 這個問題還是得解決,不然我其中一個交接項目鐵定會出問題,雖然不是我寫的,但我印象用了一堆第三方 jar 檔,如果這麼簡單的 Daily Money 都無法編譯,我無法想像那個交接項目會怎樣?

在搞定問題前,趁休息時間還沒結束先快速 review Daily Money 架構,發現我對 code 已經沒有印象,沒辦法了,只好從 logcat 下手,反正我只是要讓我可以繼續對帳,不需要花太多時間在這上面。

E ActivityManager: ANR in com.bottleworks.dailymoney (com.bottleworks.dailymoney/.ui.AccountDetailListActivity)
E ActivityManager: PID: 26594
E ActivityManager: Reason: Input dispatching timed out (90e066a com.bottleworks.dailymoney/com.bottleworks.dailymoney.ui.AccountDetailListActivity (server) is not responding. Waited 5005ms for FocusEvent(hasFocus=true))
E ActivityManager: Parent: com.bottleworks.dailymoney/.ui.AccountDetailListActivity
E ActivityManager: ErrorId: 0cf06345-57c2-401b-a26b-17a7bf27a91b
E ActivityManager: Frozen: false
E ActivityManager: Load: 0.06 / 0.64 / 0.5
E ActivityManager: ----- Output from /proc/pressure/memory -----
E ActivityManager: some avg10=0.09 avg60=0.66 avg300=2.13 total=160417487
E ActivityManager: full avg10=0.02 avg60=0.21 avg300=0.64 total=66706336
E ActivityManager: ----- End output from /proc/pressure/memory -----

原來出問題的是 AccountDetailListActivity 這個 view,我從這裡往回推找地方改 startDay 即可,晚上回家再繼續吧…

凡事還是要做最壞打算,如果花一個下午還是不能解決 Android Studio 問題,我決定把我的舊 Eclipse 環境打包帶來公司,印象中我剛來公司碰這個交接專案時用的 Eclipse 比較新,但我認為不會有太大問題,再怎樣問題一定是比用 Android Studio 來得少,就多花半天時間試試吧,今天原本預計要準備開發環境的另一個交接項目就先 delay 半天囉。

折騰了一下午,目前只能順利編譯,但執行時還是會出現權限錯誤,大概知道是因為 Android 權限政策改變,故需要在 runtime 時賦予,這就不得不改 code 了。

撇開這個不提,下午也是需要做一些修改才能 build 出 apk,大概記錄一下!

01. Gradle 裡面 xxx.pom 找不到無法下載,要多加一個 google() 才可以。
02. Gradle 裡面設定版本用 33,不知為啥 34 不行。
03. Gradle compile 選項需改成 implementation,另外,Daily Money 架構如下:

Daily Money                  ui, library, third-library (lib\xxx.jar)
Daily Money - surface   empty main ?

雖然在 surface 裡面的設定檔有 implementation Daily Money,但在 import third-party Activity 時會報錯,如果複製一份 xxx.jar 並在 Daily Money - surface gradle 再 implementation 一次,會有類似 C 語言重覆定義錯誤,後來是在 surface 裡改用 implementation (..\DailyMoney\lib\xxx.jar)。

04. activity 宣告要全名,不能類似 .ui.DetailActivity。

以上都只是概念,我並沒有記下真正名字細節,但意思到了就好。

晚上回家試了一下 Eclipse,雖然可以 build apk,但會說版本太低無法安裝,可能跟我更新了 adb 有關,因為不更新 deivce 會一直顯示 offline,晚點再把備份的 SDK 覆蓋回來,看是否還會 offline?

這也不行,那也不行,這個 gap 還真有點寬,原本就是寫 Android App 的人,因為會一直隨著 Android 更新版本遇到問題,故不太會像我一樣有那樣寬的海溝要過!

這也是為什麼 daily-build 很重要,且要有自動測試的機制。

過了一陣子後,在外包版看到有人說這確實是大工程。

2023/11/16 更新

確定 device offline 是因為 adb 版本過舊(手機 Android 13),目前用了一個 workaround 方式來解決:

01. 保留舊環境及 Android SDK 不動好 build apk。
02. 使用 new adb tool 安裝 apk 及 logcat。
03. 從資產負債表過來的科目明細起始日參數從 null 改成年度起始日。

此次修改過後,行為如下,原本損益表來的會有值,資產負債表來的被我改過後第 2 次也會有值,應該跟值沒被 cleanup 清空有關,這個行為剛好也是我要的,避免重新計算。

資產負債表及損益表都是使用 BalanceActivity,按下任一科目則是進入 AccountDetailListActivity,桌面的日週月年明細表則是 DetailListActivity

可以使用 logcat daily-money:D *:S 只看 tag 是 daily-money 的訊息。

目前最新版本 Daily Money - 20231116,會計分錄共有 20,179 筆,資料期間為 2007/01/01 ~ 2023/11/16,以我常用信用卡為例,11 個月多一點大概有快 600 筆 Entry。

截個圖避免以後忘記。


終於可以對帳了,開心。

TODO: 

01. Remove tag debug msg, it is an object, no debug meaning - 不做事,target 很特別,有時會是上層科目名稱而不是 object,先知道就好。
02. Update code to git - Done.

dm_det table(最早資料從 2007/01/01 開始,應該是之前手動結帳過一次或是從 Palm PMT 軟體移植過來的已不可考?另外,貌似 dt_ 精度只記錄到天?)

如何手動結帳:找某一天當基準日開啟資產負債表,抄下當時科目餘額填上 accout 初始值,並用 PC 任何 SQLite tool 下 SQL 砍掉含基準日已前的所有交易,再將 db 放回手機;另外一個方法則是先 Export CSV,將查到的餘額填上 account CSV 初始值欄位,並將 entry CSV 砍掉基準日之前的列,最後再重新 Import 即可。


SQL query


快速找 code 技巧:不知道哪個畫面是哪個 Activity 就使用 logcat,注意 initial 及 cleanup 就知道是哪個 Activity。

沒有留言:

張貼留言