목록분류 전체보기 (105)
우찬쓰 개발블로그
저자 - 로버트 C. 마틴 (Uncle Bob) 코드를 클린하게 짜는 방법에 대해 소개한 책. 클린 시리즈에서 가장 유명하다. 변수명과 메소드명을 어떻게 신경써야 하는지, 함수는 왜 작게짜야하고 왜 파라미터수를 줄여야 하는지 등 디테일하게 이상적인 코드에 대해 설명하고 있음. 물론 아주 이상적인 얘기를 하고 있기 때문에 모든 좋은 프로그램들이 이 것을 지키고 있진 않음. 하지만 적어도 어떻게 짜야 더 유지보수와 가독성에 좋은지 가이드를 잘 하고 있음. 앞에는 몰입해서 읽었지만 뒤로갈수록 예제가 디테일해져서 읽기 힘들어 지는 책이긴 했다.
개인 토이프로젝트를 하다가 겪은 일이다. Storage에 이미지를 저장하긴 했지만, 너무 비정상적으로 높은 저장된 바이트가 나왔고, 심지어 Storage에 있는 모든 파일을 지워보았지만 이 수치가 떨어지지 않았다. 좀 들여다보니 한가지 힌트를 볼 수 있었는데, 그것은 바로 Container Registry에 사용한 스토리지가 포함된다는 것이다. 이것이 왜 배포할때마다 쌓이고 있는지에 대한 의문은 아래 링크에서 알 수 있었다. https://stackoverflow.com/a/64310577/9797457 간단히 요약하자면, 내가 Firebase Functions를 배포할때마다 옛날 artifects들이 지워지지 않고 쌓이고 있다는 소리다. 그래서 해결 방법을 보자. Firebase Storage에 들어간..
현재 개발하고 있는 토이 프로젝트에 RxJava는 쓰지않는데 EventBus기능이 필요해졌다. LocalBroadcastManager를 쓸수도 있겠지만, 이 클래스는 context를 필요로 하다보니 코드의 양이 늘어나는 문제도 있고, 현재 프로젝트의 아키텍쳐 구조를 헤칠것 같았다. 그래서 Coroutine에 있는 SharedFlow를 이용하여 EventBus를 구현해보기로 했다. 유저가 글쓰기를 하고나면, 다른 화면에서 이벤트를 받아서 리프레시 해주어야 한다. Coroutine 공식 문서를 보면 EventBus에 대한 가이드를 어느정도 해주고 있다. kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-sh..
MVVM 아키텍에서 LiveData를 쓰다보면 흔하게 마주할 수 있는 상황이 바로 Event 일회성 처리에 대한 문제이다. private val _eventStartSettingActivity = MutableLiveData() val eventStartSettingActivity: LiveData get() = _eventStartSettingActivity MainActivity로부터 SettingActivity를 시작하는 다음과 같은 event용 LiveData가 있다고 해보자. 이 이벤트를 emit하는 곳은 activity_main.xml에서 onClick을 처리하도록한 databinding이라고 생각하고, 이 클릭이벤트의 대한 메소드를 아래와 같이 정의했다. fun onClickSettingMe..
안드로이드 10부터 다크모드를 지원하기 시작했지만, 실제 적용해본적이 없어서 토이프로젝트에 적용해보기로 했습니다. 일단 결과물을 볼까요? 저는 기본적으로 흰색과 검은색으로 테마를 정했기 때문에, 깔끔한 다크모드가 적용된 것을 보실 수 있습니다. 그럼 바로 그 과정을 시작해봅시다. 위처럼 기존에 하드하게 박혀있던 컬러를 걷어내야 되겠죠? 이제는 values에 있는 color.xml을 복사해서 한벌을 더 준비해줍니다. 다크모드에 들어갈 color.xml은 values-night에 넣어주시면 됩니다. 그리고 저는 텍스트 컬러를 직접 이름으로 구분하여 컬러를 각각 다르게 넣어줬습니다. themes도 마찬가지로 나누어서 두벌을 준비하고, 각각의 설정 컬러를 새롭게 적용해줍니다. 이렇게만 하면 끝입니다! 라고 말하..
저는 이쯤에서부터 깃허브 호스팅을 시작했던 것으로 기억합니다. 어느정도 플레이 할 수 있는 테트리스가 되니 다른분들도 시켜보고 싶더군요. 깃허브 호스팅은 간단합니다. `gh-pages`라는 브랜치를 만들어서 push하면, 가장 상위루트에 index.html로 정의한 파일이 호스팅되게 됩니다. URL을 예를 들어보면 제 github 프로젝트 주소가 github.com/WoochanLee/BalanceTetris이고, 호스팅하면 woochanlee.github.io/BalanceTetris 이런 주소가 됩니다. 이 주소를 공유하여 테스터분들의 피드백을 요청하여 봤습니다. 근데 피드백을 들어보니, 랜덤의 문제점이 들어납니다. 긴 블럭만 계속 나온다던지.. 아니면 죽어도 안나온다던지.. 그래서 찾아보니 테트리스..
이제 테트리스 게임같긴 한데 뭔가 밋밋하죠? 네 맞습니다.. 색상을 입혀야 겠군요. 여기까지 만들고나서 지인들에게 조언을 구해보니 중요한 사실이 있었습니다. 테트리스의 각 블록은 이미 암묵적으로 정해진 색상이 있더군요(저도 이때 처음 알게되었음) 그래서 저도 그 색상을 따다가 블럭의 설계도에 추가해 봤습니다. /** ****□□□□**** **/ class BlockTypeOne { constructor() { this.widthBlockCount = 4; this.widthBlockMarginCount = 0; this.heightBlockCount = 1; this.heightBlockMarginCount = 1; this.blockColor = "#8CD6F3"; this.shape = [ [0, ..
고지가 눈앞에 보이니, 게임 시작부터 게임 오버까지 만들고 싶어졌습니다! 자 그럼 완성된 줄을 지우는 로직부터 시작해봅시다. removeCompletedLine(lineCount) { let stackedBlockArray = this.stackedBlock.blockArray; for (let y = 0; y < heightBlockCount; y++) { let isCompletedLine = true; for (let x = 0; x < widthBlockCount; x++) { if (!stackedBlockArray[x][y]) { isCompletedLine = false; break; } } if (isCompletedLine) { this.removeLine(y); return this.r..
이제 블럭을 좌우로 움직일 때 입니다! 화살표에 따라 블럭이 움직여 줘야 게임이겠죠 ㅎㅎ 그리서 key 이벤트를 받아 블럭이 움직이도록 해봅시다. window.onkeydown = (e) => { handleKeyboardEvent(e); }; function handleKeyboardEvent(e) { switch (e.code) { case "ArrowLeft": onClickLeftArrow(controlBlocks, stackedBlocks); break; case "ArrowRight": onClickRightArrow(controlBlocks, stackedBlocks); break; case "ArrowDown": onClickDownArrow(controlBlocks, stackedBloc..
이전에 테트리스 블럭이 쌓일 공간을 만들었으니, 이제 직접 조정할 블럭과 쌓일 블럭을 만들어야겠죠? 저는 이 두개를 stackedBlock과 controlBlock으로 이름붙였습니다. 그리고 각 블럭을 초기화 해봅니다. const widthBlockCount = 10; const heightBlockCount = 25; let stackedBlock = new Array(widthBlockCount); let controlBlock = new Array(widthBlockCount); initBlockArray(stackedBlock); initBlockArray(controlBlock); function initBlockArray(blockArray) { for (let x = 0; x < widthB..