리버스 엔지니어링 Uhabits 데이터 모델

좋아, 그 제목은 화려하고 복잡하게 들린다. 내가 실제로 무엇을 했습니까? 먼저 내가 애초에 왜 그런 일을 했는지 설명해야 할 것 같다.

배경



나는 수년간 uhabits을 사용해 왔습니다. 새 numeric habit typev2.0.0에 추가된 것을 확인했습니다. 이전에는 부울 방식으로만 습관을 추적할 수 있었습니다. 이제 일일 체크박스 대신 숫자 입력을 통해 하루에 몇 번이나 무언가를 했는지 추적할 수 있습니다.

나는 새로운 형식의 이점을 얻을 수 있는 오래된 부울 형식의 많은 습관을 가지고 있었습니다. 예를 들어 나는 주당 단위 ​​수가 아니라 주당 일수를 사용하여 커피와 알코올 소비를 추적했습니다. 주위를 둘러 보았지만 습관 유형 사이를 전환하는 방법을 찾을 수 없었습니다. this feature request을(를) 찾았지만 아직 답장이 없습니다. 나는 코드베이스를 훑어보았고, 메인 언어인 kotlin을 모르기 때문에 pr을 만드는 것이 많은 일이라는 것을 깨달았습니다. 그래서 나는 습관 유형 사이를 전환하기 위해 나만의 작은 유틸리티를 만들기로 결정했습니다.

uhabits가 내부 sqlite 데이터베이스 가져오기/내보내기를 지원한다는 것을 알고 있습니다. kotlin은 모르지만 지금은 SQL을 하기 때문에 소스코드에서 논리를 파악하는 대신 새로운 숫자 유형으로 몇 가지 습관을 만들고 모든 것을 내보냈습니다. 내보낸 db를 열어서 기존 습관과 새로운 습관의 차이점을 비교했습니다.

데이터 모델 리버스 엔지니어링



나는 테이블과 필드를 꽤 쉽게 볼 수 있었지만 그것이 실제로 무엇을 위해 사용되었는지는 알려주지 않았습니다. 나머지는 비어 있거나(이벤트) 메타데이터 테이블(android_metadata, sqlite_sequence)이었기 때문에 습관 및 반복 테이블이 작업에 필요한 것임을 알아냈습니다.

나는 무슨 일이 일어날지 보기 위해 데이터를 만지작거리기 시작해야 했다. 습관 테이블부터 시작했습니다. type는 부울 습관의 경우 0이고 숫자 습관의 경우 1입니다. freq_num 부울 습관에 대해서만 변경됩니다. 숫자 습관의 경우 항상 1입니다. 부울 습관의 경우 일반적으로 target_value가 0이지만 숫자 습관의 경우 숫자가 될 수 있으므로 이는 의미가 있습니다. freq_den는 시간 단위를 가리키는 것 같습니다. 예를 들어 주당 5회를 목표로 부울 습관을 만들면 각 유형에 대해 다음을 얻을 수 있습니다.

// boolean, aim to do something 5 days every 7 days
{freq_den: 7, freq_num: 5, target_value: 0, type: 0}

// numeric, aim to do something 5 times every 7 days
{freq_den: 7, freq_num: 1, target_value: 5, type: 1}


다음으로 repetitions 테이블을 살펴보았습니다. 부울 습관은 일반적으로 확인했을 때 2의 값을 갖는 반면 숫자 습관은 1000의 배수로 증가하는 것을 확인했습니다. 1000이 1.00을 나타내는 데 사용되는 것처럼 보이므로 소수점도 추가할 수 있습니다. 예를 들어 1.5는 1500입니다.

2개의 기본 테이블에서 습관 유형 간의 차이점을 식별한 후에는 이전 부울 유형에서 새로운 숫자 유형으로 변환하는 몇 가지 파이썬 함수를 만들 수 있었습니다.

내 습관을 변환하고 다시 가져온 후 부울 및 숫자 습관에 대한 그래프가 완전히 일치하지 않는 것을 발견했습니다. 두 가지 옵션을 추가하기로 결정했습니다. 1은 그래프를 보존하려고 시도하고 다른 하나는 uhabits가 생성하는 방식으로 데이터를 보존합니다.

유형 간 변환을 위한 CLI 생성



내 변환기가 작동한다고 확신한 후 호출할 작은 CLI 레이어를 만들고 github에 게시했습니다. https://github.com/ConorSheehan1/uhabits_converter

최종 결과는 다음과 같습니다.


전에
후에



좋은 웹페이지 즐겨찾기