최강야구 직관 예매 후기 + 팁

이미지
최강야구 직관 포스터 최강야구 직관 예매 후기 드디어 최강야구 직관 예매에 성공했다. 😀 이때까지 총 3번 예매에 도전했었는데 이번이 처음 성공이다.  예매시간인 2시가 되자마자 바로 홈페이지에서 예매하기 버튼을 눌렀는데 대기표가 500번대였다.  이전의 경험에 비교했을 때 매우 가능성이 있는 대기번호여서 설레면서 기다렸다. (이전에는 10000번대였다...) 10분쯤 기다렸을 때 대기순번이 1이 되고 곧... 예매창이 떴다!!! 늘 다 매진이 된 예매창만 봐서 좌석이 남아있는 예매창은 낯설었다. 그리고 이미 이때 외야석을 제외한 좌석은 매진이었다. 😢 급하게 좌석을 찍고 페이코 간편결제로 예매를 완료했다. 아래 사진은 내 노력의 증거물이다. 다시 봐도 놀랍다. 내가 이걸 예매하는 날이 오다니... + 최강야구 직관 예매 팁 이제 내가 사용한 예매 방법을 공유해보려고 한다. 1. 페이코 앱 설치 및 회원가입     최강야구 예매를 담당하는 플랫폼은 '티켓링크'다.       티켓링크에서 결제를 하려면 페이코 결제나 무통장 입금을 선택할 수 있는데 페이코 결제가 빠르다. 무통장 입금을 할거면 설치해야할 프로그램도 있어서 더욱 성가시다.       만약에 페이코 결제가 아닌 무통장 입금이나 기타 다른 결제를 할 시에는 설치 프로그램이 있는지 미리 확인하자 2. 페이코 간편 결제 등록     미리 간편 결제를 등록해놓자. 페이코 앱에서 결제 등록 순서는 아래와 같다. 1. [MY] 클릭 2. [카드/계좌] 클릭 3.  [설정] 클릭 4.  [결제 수단 등록] 클릭 5. 원하는 방식으로 등록 3. 네이버 시계 확인          최강야구 예매는 보통 2시에 시작한다.       이때 네이버 시계를 이용해서 네이버 시계가 1시 59분 59초에서 2시로 넘어가자마자 예매하기를 클릭하면 된다.     네이버 시계는 네이버 검색창에서 네이버 시계를 치면 사진처럼 나온다.      이렇게 해서 외야석을 얻었다.  정말 미친듯이 가고 싶은

[Android] RecyclerView와 SeekBar 스크롤링 중첩

스크롤링 중첩 혹시 개발 중 스크롤링이 중첩되는 경험을 한 적 있는가? 위의 영상에서 보면 RecyclerView의 아이템이 가지고 있는 SeekBar를 조작할 때 RecyclerView의 가로 스크롤이 작동한다.  내가 원하는 건 SeekBar의 Progress를 조절하는 것인데 이게 RecyclerView에서 가로채서 스크롤링을 하는 것이다. 이렇게 되면 내가 원하는 그림이 나오지 않기 때문에 SeekBar에서 터치 이벤트가 일어나면 부모뷰(RecyclerView)에 이벤트를 전달하지 않는 방법으로 해결해보겠다. 터치 이벤트 중첩 해결 방법은 간단하다.  SeekBar를 상속받아서 이벤트 처리를 할때 requestDisallowInterceptTouchEvent() 를 호출하여 부모뷰로 이벤트를 전달하지 않는것이다.  class CustomSeekBar(context: Context, attributeSet: AttributeSet? = null): AppCompatSeekBar(context, attributeSet) { override fun onTouchEvent(event: MotionEvent?): Boolean { when (event?.action) { MotionEvent.ACTION_DOWN -> { parent.requestDisallowInterceptTouchEvent(true) } MotionEvent.ACTION_MOVE -> { parent.requestDisallowInterceptTouchEvent(true) } MotionEvent.ACTION_UP -> { parent.requestDisallowInterceptTouchEvent(true) }

[Android] MotionLayout 직계가 아닌 하위 View의 animation 미작동

이미지
MotionLayout 하위 View가 작동을 안한다. 어느 날과 같이 앱을 개발 중이었다. 나는 MotionLayout을 이용해서 유튜브의 미디어바와 같은 걸 만들려고 했다. 아래는 MotionLayout 계층 구조다. 계층 구조 이런 구조다. 열심히 만들어서 이제 애니메이션을 작동해보는데 ConstaintLayout은 작동을 하는데 View1, View2, View3은 내가 작성한 motion_scene처럼 작동을 안하는 것이다.  정확히 말하면 애니메이션은 작동을 하는데 View1, View2, View3의 사이즈와 위치 등과 같은 것이 적용이 안되었다.  그리고 2시간을 내다버리며 찾은 결과를 아래에 글로 쓴다. 사실 MotionLayout 적용할때마다 이러는거 같아서 글로 남긴다. MotionLayout은 직계 하위 View만 적용이 가능하다. 우선 View1, View2, View3이 Motion Scene에 작성한대로 작동안하는 이유는 MotionLayout의 직계 View가 아니라서다. 그렇다! MotionLayout은 직계 하위 View에만 영향을 미친다!! 그래서 ConstraintLayout는 MotionLayout 바로 하위에 위치해서 잘 작동했지만 View1, View2, View3은 MotionLayout의 직계 하위 View가 아니다. 그래서 작동을 안한거다.  그러면 어떻게 수정해줘야 할까?  보통 ConstraintLayout이 MotionLayout에 필요한 경우는 그 사이즈대로 하위 View의 위치를 제어하고 배경을 원하는 것으로 고정하기 위해서다. 그래서 나는 View1, View2, View3을 MotionLayout 하위로 이동시키고 ConstraintLayout은 프레임으로만 쓰기로 했다.  우선 아래는 수정 전 코드다. <? xml version ="1.0" encoding ="utf-8" ?> <layout> <dat

[Android] 빌드 에러 - NoSuchAlgorithmException: Algorithm HmaxPBESHA256 not avaliable

이미지
에러 및 원인 AAB로 앱을 빌드하고 있는 데 갑자기 에러가 발생했다.  Android Studio 업데이트 전에는 빌드하는 데 문제가 없었다. 그래서 막연히 Android Studio 버전 문제라고 생각했다. 에러메세지는 위와 같이 떴다. 에러 메세지의 마지막 줄을 보면 NoSuchAlgorithmException: Algorithm HmaxPBESHA256 not avaliable 을 볼 수 있다. 이거 때문에 KeyStore에서 Key를 읽는게 실패했다는 뜻이다. 우선  HmaxPBESHA256 가 그렇다면 뭔지부터 확인해봤다.  HmaxPBESHA256 은 해시 기반 메세지 인증 코드(HMAC)를 사용하여 SHA-256 해시 함수를 암호화하는 기술이라고 한다. 이 알고리즘은 JDK 8 이상에서 지원한다. 최근 JDK에서도 이 알고리즘을 지원하다고 한다.  나는 각 버전마다 알고리즘이 동일하지가 않을 수 있다고 생각이 들었고 첫번째로 한 것은 JDK 버전을 확인했다. 동일하게 JDK 11.0.8을 사용했지만 이 방법으로는 계속 에러가 났다.  만약 JDK 버전을 동일하게 세팅을 했는데도 에러가 생긴다면 아래 방법을 참조한다. 해결 방법 우선 JDK 버전을 동일하게 설정했지만 같은 에러가 난다면 직접 JDK 경로를 지정해서 key를 생성한다. windows라면 cmd를 켜고 Mac이면 터미널을 연다. 아니면 Android Studio에 있는 Terminal에서 실행해도 무관하다. 1. JDK 경로 지정해서 Keystore 및 Key 생성 명령어 [JDK 경로]\bin\keytool -genkey -v -keystore [Keystore 경로] -keyalg RSA -keysize 2048 -validity 9125 -alias [키 이름] -storetype JKS 예시 C:\Java\jdk-11\bin\keytool  -genkey -v -keystore "D:\androidApp\android_

[Git] 삭제한 파일 복구하기

이미지
가끔 git branch에 있는 모든 히스토리에서 파일 하나를 날리는 경우가 있다. api key 값이 올라갔을 때 날리거나 할텐데 잘못 날리면 history 뿐만이 아니고 지금 코드에서도 날라간다. 캐시만 지워야하는데 홀라당 모든 파일을 날리는 경우다. 그때 우리는 당황할 수 있지만 파일을 살릴 방법을 고민해봐야 한다. 아래는 내가 고민한 방법이다. 아래 방법을 이용하기 위해서는 삭제한 파일이 이전 commit 기록에 있어야 한다는 것이다. 삭제한 파일 복구 우선적으로 git commit 내역을 살핀다. 아래 명령어는 저장소에서 이루어진 동작을 보여준다. 여기서 삭제된 파일이 포함된 commit의 해시를 복사한다. git reflog 아래 사진은 해당 명령어의 실행과 실행 후 결과를 보여준다. 결과 중 문단 가장 앞에 있는 주황색 글자가 해당 commit의 해시 값이다. 이걸 복사하면 된다. 이제 해당 파일을 우리가 지정한 commit에서의 파일 상태로 돌린다. 이때 파일이 복구될 때 해당 commit에 저장되었던 상태다. git checkout 커밋 해시 -- 파일경로/파일명 특정 파일을 살리고 git status 를 치면 아래처럼 new file로 생성된게 보인다.

[Android] 코드 난독화와 Proguard

이미지
코드 난독화와 Proguard 코드 난독화는 프로그래밍 언어로 작성된 코드에 대해 읽기 어렵게 만드는 작업이다. 코드의 가독성을 낮춰 리버스엔지니어링의 대비책으로 사용된다.  Proguard는 자바 기반 코드를 난독화해주는 도구로, 난독화(Renaming), 용량 축소, 코드 추소, 최적화 등의 기능을 제공한다. 여기서 Proguard의 난독화는 식별자 전환, 클래스/메소드의 이름을 a,b,c 등 의미없는 이름으로 대체해주는 기능이다.  난독화의 종류는 다양하고 Proguard가 제공하는 난독화 기능은 정말 보안에 있어서 최소한의 성의다.  Proguard 설정 방법 설정은 매우 쉽다. App의 build.gradle 에 proguard의 설정을 true로 변경해주면 된다. bulid.gradle (:app) android { ... buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' proguardFiles('proguard-rules.pro') } debug { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' proguardFiles('proguard-rules.pro') } } } 위에 코드는 release와 debug 각각에 대한 proguard 설정이다. release와 debug에 대한 prog

[Android] Kakao map API를 이용해서 지도 그리기

이미지
카카오 지도 API를 사용해서 앱에 지도를 그려볼것이다. 대표적인 지도 API에는 구글, 네이버, 카카오가 있다. 이번에 카카오 인증을 써야해서 지도 API도 카카오 지도를 사용하기로 결정했다. 카카오 지도 API는 구글이나 네이버에서 제공하는 지도 API와 비슷한데 다른 점은 애뮬레이터에서는 작동이 안되고 실물폰에서만 된다는 것이다. 이 부분도 설정을 추가하여 애뮬레이터에서도 작동할 수 있도록 하겠다. Android Studio 설정 1. settings.gradle 파일에 kakao SDK 추가 후 Sync now plugins { ... id 'org.jetbrains.kotlin.android' version '1.7.10' apply false id 'com.google.gms.google-services' version '4.3.13' apply false } 2. 앱 단의 build.gradle( build.gradle (:app) )에 kakao SDK 추가 후 Sync now android { ... defaultConfig { ... // 애뮬레이터에서 카카오 지도 맵을 사용하기 위한 설정 ndk { abiFilters 'arm64-v8a', 'armeabi-v7a' } } } dependencies { ... implementation "com.kakao.sdk:v2-user:2.12.1" // 카카오 로그인 모듈 (keyHash값 때문에 설정) implementation 'com.kakao.maps.open:android:2.6.0' // 카카오 맵 API } 3. res/values 폴더 마우스 우클릭 &