프레임워크 9

Dockerfile에서 bash 명령 사용하기 | RUN, CMD, ENTRYPOINT 차이

도커는 이미지라는 틀을 만들고, 이를 사용해서 가상 머신을 만들어내는 식으로 동작한다.이때 이미지를 정의하기 위해 Dockerfile을 문법에 맞게 적어줘야하는데, 여기서 쉘 명령어를 사용하기가 여간 까다롭지 않다.도커파일에서 쉘 명령어를 입력하는 형식과, 사용할 수 있는 커맨드의 종류 두가지를 모두 정리해보았다. 1. Shell form과 exec formDockerfile 예시를 읽다보면 똑같은 일을 하는 명령을 두가지 방법으로 적어놓은 것을 볼 수 있다.FROM centos:7# 컨테이너 실행 직후 running... 이라는 문구를 두번 출력한다.CMD echo "running... 1"; echo "running... 2" # 괄호 없으면 shell formCMD ["/bin/bash", "-c"..

compiler version error 원인

아래와 같은 에러가 발생했고, 세부적으로는 NoSuchMethodError 유형이라고 떴다. > A failure occurred while executing org.jetbrains.kotlin.compilerRunner .GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction 더보기 java.lang.NoSuchMethodError: 'void org.jetbrains.kotlin.cli.common.messages.MessageCollector.report$default(org.jetbrains.kotlin.cli.common.messages.MessageCollector, org.jetbrains.kotlin.cli.common.messag..

Android와 이미지 형식

Bitmap과 Vector 사진을 컴퓨터에 저장하는 형식은 크게 비트맵/벡터로 나눌 수 있다. 1. 비트맵방식 (Bitmap) : 그림을 아주 작은 화소(픽셀)로 분해하고 각 화소의 색상과 위치를 기록해 저장하는 방식. 비트의 지도라는 뜻으로 픽셀을 하나씩 채워가면서 전체를 표현한다. ex) JPG, PNG, GIF, WEBP 2. 벡터방식 : 그림을 구성하고 있는 점이나 직선, 곡선 등의 위치와 기울기 등을 산술적인 데이터로 기록해 저장하는 방식. 파일 하나로 여러 화면 밀도에 대응할 수 있어 apk 크기를 줄일 수 있다. 복잡한 이미지는 표현할 수 없어서 간단한 도형이나 로고 등에 주로 사용한다. API 20 이상에서부터 Vector Asset Studio로 SVG, PSD를 프로젝트에 벡터 이미지로..

CoordinatorLayout에서 겹쳐진 뷰의 터치 이벤트를 처리하는 방식

BottomSheet를 구현하는 도중, BottomSheet 뒤에 가려진 버튼들이 클릭이 가능해지는 버그가 있었다. 스택 오버플로우의 글을 읽고 바텀시트에 clickable="true"를 추가해서 간단히 해결했지만, CoordinatorLayout에서 터치를 가로채는 방식에 대해서 정리해야겠다는 생각이 들었다. coordinatorLayout에서 상위 뷰가 하위 뷰의 터치를 가로채는 동작은 아래에 보이는 CoordinatorLayout.Behavior 를 상속받아서 구현한다. public class CoordinatorLayout extends ViewGroup implements NestedScrollingParent2, NestedScrollingParent3 { ... public static ab..

Jetpack Navigation Safeargs 사용법

navigation에서 argument는 프래그먼트에게 속성을 붙여주는 것과 비슷하다. fragment별로 앱바 종류를 argument에 저장해서 다른 앱바를 적용하게 할 수도 있고(Android10B MainActivity 참고) 다른 프래그먼트로부터 받을 데이터가 있으면 그걸 argument로 저장해서 받을 자리를 만들 수도 있다.(argument가 마치 우유 바구니같은 역할을 하는 것) 그러나 safe args를 통해 전달하는 데이터는 가능한 작은 값이어야한다. ex) 어떤 object를 줘야할 때, 오브젝트 대신 그 오브젝트를 찾을 수 있는 key 값이나 인덱스를 준다. 만약 대량의 데이터를 공유하는 화면인 경우 같은 뷰모델을 사용하는 것을 고려하자. 우리가 하는 디테일 정보 표시같은 경우 작은 ..

Hilt 간단한 예제

Hilt의 기본 개념은 아래 링크에 잘 나와있다. 우선 읽어보자 [Hilt tutorial] https://blog.mindorks.com/dagger-hilt-tutorial 이걸 잘 읽고, 이제 아래 그림을 머릿속에 담아두며 실습을 해보자 Activity에서 Cake을 필요로 한다. 이때 Cake은 아래와 같은 종속성을 필요로한다. Cake(bread: Bread) Bread(flour: WheatFlour, milk: Milk) WheatFlour(wheat: Wheat) [Step 1] 우선 모듈에서 Provide를 구현하고 그 후에 Inject를 해주자. /* Module */ import farmer

setContentView 안될 때 - onCreate 체크

코드를 몇 줄 쓰지도 않았는데 setContentView가 안 되는 경우가 있다. manifest에 등록도 똑바로 했고, xml 렌더링에 문제가 없는데도 문제가 생긴다면 올바른 onCreate 의 super를 호출했는지 확인해봐야 한다. Activity에 AppCompatActivity를 상속받은 후, Android 자동완성 기능을 이용해 탭 하면 선택되는 것은 onCreate(Bundle, PersistableBundle)이지만, setContentView를 호출할 수 있는 것은 onCreate(Bundle)이다. override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(bin..