전체 233

Nutri Capture 방향성 - UI 스케치

#1 UI 스케치#1-1 개요먼저, 3개의 프래그먼트를 가지는 내비게이션 바를 만든다. 사용자는 '오늘' 프래그먼트, '통계' 프래그먼트, '나' 프래그먼트 중 하나를 선택할 수 있다. 기본 프래그먼트는 '오늘' 프래그먼트다. #1-2 '오늘' 프래그먼트'오늘' 프래그먼트는, 그 날 먹은 식품에 대한 정보를 표시한다.  + 버튼을 눌러서 아이템을 추가할 수 있다.
하루하루의 단위를 구분하는 Container는 ViewPager2 속에 담기게 구현한다. 각 Container는 스크롤로도 이동할 수 있고, ↑ 또는 ↓ 버튼으로도 간편하게 이동할 수 있다. 처음에 1안을 구상했으나, 2안도 괜찮아보여서 둘 다 업로드했다. 2안으로 갈 것 같다. 영 별로면 1안 또는 아예 새로운 디자인을 시도해보겠다. #1-3..

Nutri Capture 백엔드 - ERD

#1 ERD필수적인 테이블만 만들었다. 나중에 테이블을 추가해 넣을 가능성이 아주 높기에, 모든 테이블을 Non-Identifying Relationship으로 연결했다. 각 테이블의 모든 기본키는 AUTOINCREMENT가 Default값이다. nutrient 테이블은 100g 당 함유된 영양소가 기준이다. nutrient 테이블의 외래키 f_num는 UNIQUE KEY이고, 외래키 제약 조건인 ON CASCADE DELETE을 달아두었다. #2 코드 - SQLiteCREATE TABLE user ( -- 사용자 u_num INTEGER PRIMARY KEY AUTOINCREMENT, -- 사용자 번호 u_name TEXT, -- 닉네임 u_sex TEXT NOT NULL DE..

[백준] 11723 (집합)

#1 알고리즘#1-1문제의 조건 자체는 쉽지만, 테스트 케이스가 아주 많다. 따라서 빨리 계산해야 한다. 그렇게 하기 위해서 비트 연산을 이용한다. 먼저, 십진수로 값이 0인 변수를 선언하고, 그 변수에 0비트가 20개 있다고 친다. 오른쪽에서부터 n번째 자리에 있는 비트가 n이 '집합'에 존재하는지의 유무를 표시한다고 생각한다. 1이면 존재하고, 0이면 존재하지 않는다. #1-2이 문제의 풀이를 위해 주요하게 사용할 비트 연산은 left shift 연산)이다. 코틀린에서는 해당 연산을 shl라는 연산자로 지원한다. 1 shl a는 2진법으로 (a + 1)번째 자리가 1이고 나머지는 0인 수를 도출한다. 따라서 (1 shl (a - 1))로 a라는 값을 가지는 수가 '집합'에 존재함을 나타낼 수 있다. ..

Nutri Capture 방향성 - 앱의 목적, 유스케이스 다이어그램

#1 앱의 목적과 여담Nutri Capture는 몇 년전에 번뜩 떠오른 아이디어로 만든 앱이었다. 대학교에서 안드로이드 수업을 듣던 중 구글의 ML Kit에 대한 내용이 나왔다. ML Kit는 이미지 속에서 텍스트를 뽑아내거나 카메라로 얼굴을 인식하는 등의 기능이 담긴 딥러닝 라이브러리다. 교수님은 ML Kit의 다양한 기능 중 하나를 활용해 앱을 만들어보라는 과제를 주셨다. 그리고 그 때 내 옆에는 프링글스 과자가 있었다. 프링글스의 원통 포장지에 인쇄된 영양성분표가 눈에 들어왔다. 그렇게 해서 얻은 아이디어였다.하지만, "어떤 상상을 하든 이미 그것은 특허로 등록되어있다."라는 말도 있지 않은가. 이 앱도 마찬가지다. 이미 해외에 굉장한 다운로드 수를 보유한 비슷한 앱이 있었다. 그렇다고 멈추진 않는..

Nutri Capture 방향성 - 앱의 리팩토링 및 업그레이드

#1 개요 GitHub - Kanmanemone/Nutri_Capture: 영양성분표 스캔 및 영양 관리 앱영양성분표 스캔 및 영양 관리 앱. Contribute to Kanmanemone/Nutri_Capture development by creating an account on GitHub.github.com대학생 시절 만들었던 앱 'Nutri Capture'를 리팩토링하고, 여러 기능을 붙이는 프로젝트를 시작한다. 위의 깃허브 링크는 예전 버전의 앱이다. #2 리팩토링 목표이 앱의 코드는 시간이 꽤 지났기 때문에, 분명 몇몇의 라이브러리는 Deprecated되었을 것이다. 최신 라이브러리로 대체할 필요가 있다. 또, 이 앱에서 다크 모드에서 실행이 안되는 에러를 고치다가 도중에 그만두었던 기억이 난..

API (Application Programming Interface)

#1 알고리즘 #1-1 API는 UI와 비슷하다. UI가 화면을 통해 사용자와 소프트웨어가 상호작용하는 규격이라면, API는 프로그래머끼리 또는 소프트웨어끼리 또는 프로그래머와 소프트웨어 간의 상호작용을 위한 규격이라는 점에서 그렇다. UI는 인터페이스에 불과하며, 실제 화면을 구성하는 것은 버튼ㆍ스크롤바ㆍ텍스트 박스ㆍ이미지 등이다. API 또한 엄연히 인터페이스에 불과하며, 실제로 기능을 구현하는 것은 라이브러리다. 예를 들어, Google Map 서비스를 실제로 구현하는 것은 구글 서버에 저장된 지도ㆍ위치 관련 라이브러리들이지 Google Map API 자체가 아니다. 사용자는 그저 API 즉, '연결된 라이브러리에 접근해 그 기능을 활용할 수 있는 관문(인터페이스)'을 통해 상호작용할 뿐이다. #1..

[Kotlin] 확장 함수(Extension functions)

#1 코드 - 코틀린 #1-1 fun main() { var testInteger : Int = 7 testInteger = testInteger.plusAndMultiply(3, 5) println("${testInteger}") // 결과로 50이 출력된다. } fun Int.plusAndMultiply(plusValue : Int, multiplyValue : Int) : Int { return (this + plusValue) * multiplyValue } 이 코드는 확장 함수(Extension functions)를 사용하는 예이다. 확장 함수란 기존 클래스의 멤버 함수인 것처럼 호출할 수 있지만, 해당 클래스에 직접 정의된 멤버가 아닌 외부에서 정의된 함수다. 확장 함수의 문법은 아주 간단하다..

[백준] 2108 (통계학)

#1 알고리즘한 번의 for문으로 모든 걸 다 구하고 싶었다, 그 편이 성능에서 더 좋을 것이라는 생각에서였다. 하지만, 코드가 심각하게 길어지거나 코드가 짧은 대신 가독성이 좋지 않았다. 그래서 for문을 2번 쓰는 코드를 짰다. 첫번째 for문은 N개의 수를 읽어, 배열 valueCounts를 완성한다. 두번째 for문에선 완성된 배열 valueCounts를 순회하며 산술평균, 중앙값, 최빈값, 범위를 도출한다. #2 코드 - 코틀린import java.util.Queueimport java.util.LinkedListimport kotlin.math.roundToInt/*(1) 산술평균: Arithmetic mean(2) 중앙값: Median(3) 최빈값: Mode(4) 범위: Range*/fun ..

[백준] 10845 (큐)

#1 알고리즘java.util.Stack과는 달리 java.util.Queue는 클래스가 아니라 인터페이스다. 나는 java.util.Queue 인터페이스를 구현한 클래스인 LinkedList를 Queue로서 사용했다. last()는 확장 함수(Extension functions)다. #2 여담확장 함수 Iterable.last()가 기술된 _Collections.kt는 실제 위치가 kotlin-stdlib.jar/kotlin/collections에 있지는 않지만, 논리적인 구조상 파일 첫머리의 pakage에 kotlin.collections로 선언되어 있다. 참고로, _Collections.kt와 Collections.kt는 다른 파일이며 후자는 해당 디렉토리에 실제로 존재한다. 물론, 패키지 선언은 ..

AndroidX (구 Support Library)

#1 알고리즘안드로이드 API 레벨이 오를 때마다, 당연하게도 사용할 수 있는 안드로이드 프레임워크의 라이브러리가 달라진다. 예를 들어, android.widget.Toolbar 클래스는 안드로이드 API 레벨 21에 추가되었기에, 하위 버전의 API에서는 오류가 발생한다. Support Library가 나오기 전 안드로이드 개발자들은 앱이 설치된 휴대폰의 API 레벨을 읽고, 각 API 별로 분기 코드를 작성해야 했다. 이후, Support Library 출범 후 예전 안드로이드 API에도 최신 기능을 사용할 수 있게 되었다. 예를 들어, android.support.v7.widget.Toolbar 클래스는 안드로이드 API 레벨이 7 이상이기만 하면 사용할 수 있다 (패키지 명(네임스페이스)에 있는 ..