이번에 프로젝트를 진행하며 가장 힘들었던 BottomSheet의 높이를 조절하게된 과정을 소개하려고 한다. 내가 의견을 내서 사용하게된 Material 디자인의 BottomSheet 기능인데 이렇게 고된 길을 걷게 될 줄 몰랐다. 왜 BottomSheet height를 조절해야 하지? Customizing이 된 BottomSheet를 사용하기 위해 BottomSheetDialogFragment를 상속하여 만든 CustomBottomSheetDialogFragment 클래스를 만들었다. 그리고 막연하게 onCreateView에서 뷰를 바인딩해주고 실행해본 결과 계속 BottomSheet가 엄청 찔끔 올라왔다. 해당 화면을 캡쳐해두진 않아서 보여줄 순 없지만 화면 높이의 1/10정도..? 이유는 기본적으로 ..
DialogFragment를 사용하던 중 Positive, Negative Button의 텍스트 사이즈 조절이 필요해졌다. DialogFragment에서는 onCreateDialog에서 AlertDialog.Builder가 create한 AlertDialog를 리턴하는데 create 이전에 간단한 다이얼로그 생성하듯 setTitle, setMessage, setPositiveButton 등을 호출한다. 나는 여기서 setPositiveButtonTextSize와 같은 메소드가 있을 줄 알았지만 없었다. (그러니깐 이 글을 쓰고 있겠지만) 아래는 onCreateDialog 메소드를 사용한 gist이다. https://gist.github.com/BonusTrack02/a22f1ef8c29dae79e6fca..
독자 관점에서 릴리즈 노트 작성하기 요즘 내가 가장 자주 작성하는 문서 중 하나이다. 여기서도 내가 원하는 중간을 가기가 생각보다 어렵다. 시간을 써서 자잘한 버그를 엄청 많이 잡아내면 뭔가 릴리즈 노트에 이런 내용을 다 적고 싶다. 하지만, 이런 버그 하나하나 모두 적게되면 독자 입장에서 읽기도 싫고 이렇게 버그가 많은 게 자랑인가 싶을 것이다. 반대로 '사소한 버그들을 수정했다'는 한 문장으로 퉁치는 순간 일한 보람도 없고 인정받기도 힘들다. 그래서 우선 순위를 정하여 릴리즈 노트를 작성해야 한다. 여기서 독자를 고려해 우선 순위를 정해야 하는데 독자는 회사가 될 수도 있고, 일반 소비자가 될 수도 있다. 독자가 관심있게 볼 내용과 관심도가 떨어지는 내용을 구분하여 다르게 작성해야 한다. 이것으로 이..
이번 글의 시작은 에러 메시지에 관한 내용이다. 사용자와 소통하는 에러 메시지 작성하기 웹 페이지에서 가장 자주 볼 수 있는 에러 404. 404 에러 화면에서도 사용자의 평가가 갈릴 수 있다. 구글의 404 화면을 보면 상당히 심플한데 이를 실제로 불편해하는 사용자도 있다. (사용자 본인이 링크를 잘못 입력한 것인지, 구글이 페이지를 삭제하는 바람에 에러 화면을 마주하게 된 것인지 모르기 때문) 반면, 위키피디아의 404 화면에는 사용자가 의도한 URL을 추측해서 제안하기도 한다. 친절하게도 우리나라의 경우에는 고객센터로 문의하는 링크가 포함되어 있는 경우가 대부분이다. 여기서 404 에러는 고객에게 죄송해야할까? 이것은 경우에 따라 다르다. 사용자가 URL을 잘못 입력한 경우에는 개발자가 죄송할 이유..
저번에 예고했던 대로 변수와 함수 이름을 짓는 법을 소개하는 것으로 이번 글을 시작하도록 하겠다. 변수 이름 짓기 우리는 흔히 반복문이나 배열 인덱스에 i라는 변수를 자주 사용한다. 이는 integer나 index의 첫 글자로 간주되므로 이상할 것이 없다. 하지만, d라는 변수가 있다면 해당 코드를 읽는 사람은 어떻게 받아들여야 할까? day? double? date? 책에서 소개하길 일자를 뜻하는 변수를 설정하고 싶다면 그냥 day를 사용하면 된다. 하지만, 우리가 어떤 프로그램이던 그냥 day란 없을 것이다. today? selectedDay? finalDay? 등 특정한 의미를 부여해 사용해야 한다. 변수 이름을 지을 때 고려할 또 하나의 척도가 있다. 바로, 검색이 용이한 이름이다. IDE가 발전..
가장 먼저 이 글은 의식의 흐름 그대로 적을 예정이기에 어떠한 질서도 없을 예정이다. 글의 제목은 다른 직종보다 디지털에 가까운 내가 요즘 느끼는 감정이다. 내가 원래 되고 싶었던 인간상이기도 하다. 디지털에 둘러싸여 있어도 그 속에서 아날로그의 무언가를 첨가할 수 있는 그런 사람. 그나마 유명한 사람이라고 하면 로스트아크 금강선 디렉터를 아주 좋은 예로 들 수 있겠다. 게임을 개발하는 사람이라지만 그 사이에서 사람들을 매료시킬 수 있는 언변, 글솜씨 등이 정말 존경스럽다. 보통 사람들은 아주 치밀하게 손익을 계산하며 지내고 있었지만 낭비없는 낭만은 없다고 말할 수 있는 사람. 어떤 것이 불편한지 공감할 수 있는 사람. 진짜 공감을 통해 사람들을 진정시킬 줄 아는 사람. 게임 내 특정 기능이 불편할 때 ..
나는 이번 시리즈를 책의 순서대로 소개해보려 한다. 책의 모든 내용을 소개하진 않을 것이고 내 마음에 남았던 부분만을 적어볼 예정이다. 먼저, 이 책은 신기하게도 내가 가장 관심있어하던 부분을 위한 빌드업부터 시작한다. 정말 놀라웠던 문장은 내가 어느 유튜브에서 보고 깊게 공감했던 내용이었는데 아래와 같다. 코딩도 결국 글쓰기와 같다. 솔직히 말하면 어떤 다른 문장도 이 문장을 이길 수 없을 것이다. 모든 문장을 대변하는 한 줄이다. 이 다음은 글쓰기 기본에 대해 소개하고 있는데, 글의 독자가 누구인지, 그에 따라 문장이 어떻게 구성되어야 하는지 생각해야 한다. 특히 개조식 글에는 글머리 기호를 써야한다. 다들 아는 네모나 동그라미 등이 예시일 것이다. 같은 챕터에서 글쓰기와 코드를 작성할 때 어떤 원칙..
정말 오랜만에 프로그래머스에 접속해보았다. 머리가 많이 굳었다는 게 실감되었다. 아날로그에 빠져 살아서 그랬나 싶기도 하다. 이제 문제풀러 가보자. 문제 일단, 두 수가 연산자를 거치면 문자열마냥 합쳐지는 것을 볼 수 있다. 따라서, 두 Int형 파라미터를 문자열로 붙였다. 만들어진 문자열을 다시 숫자로 바꾸어 a*b*2의 결과와 비교했다. 풀이 실행 결과
내가 이 클래스를 사용하게 된 이유 내가 사용하던 RecyclerView에는 각 아이템 하단에 구분선(Divider)이 있다. 이전에는 해당 아이템을 구성하는 xml에 MaterialDivider를 배치했었다. 새로운 요구사항이 들어오면서 구조 변경의 필요성을 느끼게 되었다. 새로운 요구사항은 마지막 아이템은 구분선이 가로 전체를 차지하도록 변경하는 것이었다. 새로운 요구사항에 따른 시도 RecyclerView Adapter의 onBindViewHolder에서 마지막 아이템을 확인해서 AttributeSet을 다시 할당해주었다. 나름 그럴싸한 로직이라 생각했다.(내 기준) 그 결과, 알 수 없는 버그들이 밀려들어왔다. 처음 adapter를 할당했을 땐 마지막 아이템에만 해당 AttributSet이 적용되..
Step 1. Create the SleepNight entity 이번 과제에서는 하룻밤 수면을 데이터베이스 엔티티를 의미하는 annotated data class로 정의한다. 하룻밤의 수면을 위해서는 시작 시간, 종료 시간, 퀄리티 등급을 기록해야 한다. 그리고 하룻밤을 구분하기 위해 고유 아이디가 필요하다. 1. database 패키지의 SleepNight.kt 파일을 연다. 2. SleepNight 데이터 클래스를 id, 시작 시간(millisecond 단위), 종료 시간(millisecond 단위), 숫자의 수면 퀄리티 등급 파라미터를 사용해 만든다. 품질 데이터가 수집되지 않았다는 것을 나타내기 위해 sleepQuality를 -1로 초기화해야 한다. 시작 시간을 유효한 시간으로 초기화한다. 선택..