목록전체 글 (385)
만족
위의 Object를 read한 후, 그것을 write하고 다시 read하려고 할 때 발생한 예외이다. 신기한 것은 처음 read했을 때는 문제가 발생하지 않고, 그 데이터를 write한 다음, 다시 read했을때만 오류가 발생한다. W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.math.RoundingMode.ordinal()' on a null object reference at java.text.DecimalFormat.convertRoundingMode(DecimalFormat.java:4129) at java.text.DecimalFormat.readObject(DecimalFormat..
https://support.google.com/googleplay/android-developer/answer/10632485 2021년에 적용되는 Google Play 서비스 수수료 변경사항 - Play Console 고객센터 도움이 되었나요? 어떻게 하면 개선할 수 있을까요? 예아니요 support.google.com 위 링크에서 자세히 볼 수 있다. 위 내용을 요약할 것이다. 등록방법 15%의 서비스 수수료 등급에 공식적으로 등록하려면 다음 요건을 충족해야 합니다. 결제 프로필이 있어야 합니다. 현재 사용 중인 개발자 계정이 기본 개발자 계정인 계정 그룹을 만들고 연결된 개발자 계정(ADA)이 있는지 Google에 알립니다. 15% 서비스 수수료 등급에 관한 서비스 약관을 수락합니다. 15% 서비..
어떤 이미지의 색상을 변경해서 여러가지로 사용하고 싶을 때, 직접 각각의 색상들로 변경해서 여러 개의 drawable 파일로 만들 수도 있지만, 이는 매우 번거롭고, 변경사항에 유연하지 못하다. 따라서 tint라는 것을 사용해 여러 색상을 덧씌울 수 있는데, 이에 대해 알아보자. xml에서 tint 적용하기 android:tint로 적용할 수 있다. 요즘은 app:tint로 변경하라는 문구가 뜨는데, 아직은 둘 중 뭘로 해도 빌드는 잘 된다. 주의할 점은 이 방법으로는 벡터 이미지만 가능하다는 것이다. Java/Kotlin에서 tint적용하기 벡터 이미지와 비트맵 이미지에 색상을 입하는 방법이 다르다. 먼저 벡터 이미지에 색상을 덧씌워보자. imageView.setColorFilter(resources...
데이터베이스의 성능을 좌우하는 주요 요소인 인덱스에 대해 알아보자. 데이터베이스의 크기가 충분히 크지 않을 때(테이블 하나에 10000개정도?)는 인덱스를 걸지 않아도 딱히 눈에 띌만한 성능 저하가 나타나지는 않지만 10만개, 100만개처럼 늘어나다보면 문제가 두드러진다. 예를 들어, 위 쿼리 결과는 800만개의 행이 저장된 테이블에 대해 무지성 쿼리를 날린 결과인데, 실행 시간이 5초나 걸렸다. 엥? 5초면 괜찮은거 아니냐? 할 수도 있는데, 우리가 데이터베이스를 주로 사용하는 환경은 단일 사용자가 아닌 다중 사용자 대상이므로 여러 명의 사용자가 저런 쿼리를 날리게 되면 걸리는 시간은 더욱 늘어난다. 게다가, 느리기만 하면 그나마 다행이지... 컴퓨팅 자원도 엄청나게 소모한다. https://satis..
Real-Time Scheduling 정해진 시간 안에 주어진 기능이 제대로 동작하게 하는 스케쥴링 방식. Real-Time이 Super-Fast를 의미하는 것은 아니다. Real-Time Scheduling: Types Hard Real-Time 실행 시간이 정해진 Deadline을 넘어서면 치명적인 문제가 발생한다. 예를 들어 자동차 자율 주행 시스템이나, 원자로 감시 시스템 처럼 감지와 대응이 늦어질 경우 큰 사고로 이어질 수 있는 분야에 적용되는 기법이다. Soft Real-Time 실행 시간이 정해진 Deadline을 넘어서면 시스템의 품질이 하락하는 경우. (치명적인 사고를 발생시키지는 않음) 예를 들어, 축구 실시간 중계 방송에서 실행 시간이 Deadline을 넘어서면 buffering이나 ..
인터럽트가 발생할 경우 다른 프로세스들을 정지시킨 채로 인터럽트 핸들러가 우선적으로 실행되며 이 인터럽트 핸들러는 non-preemptive(다른 프로세스가 선점할 수 없음)하며, 다른 프로세스, 심지어 다른 인터럽트 핸들러들 까지도 현재 인터럽트 핸들러가 끝나기 전까지는 실행되지 않는다. 인터럽트 핸들러에서 실행하는 작업 중, 중요성이 비교적 낮고 시간이 오래 걸리는 작업에 대해 시스템 반응성을 최대한 보전하면서 진행하려면 어떻게 해야 할까? 중요도가 높은 것은 Top Half(즉시 한번에 처리), 그렇지 않은 것은 Bottom Half(여유가 될 때 까지 연기)로 이관하여 Interrupt Handler의 동작을 쪼갤 수 있다. Kinds of Bottom Halves Bottom Half와 관련된 ..
요즘 대부분의 컴퓨터가 멀티코어 환경인 만큼 프로그램 개발 시 발생하는 동기화 문제에 대해 얼마나 성능 감소를 완화시킬 수 있을지가 매우 중요하다. 실제로 우리가 동일한 성능을 가진 코어가 있을 때, 1코어 CPU와 2코어 CPU를 비교하면 2코어 CPU의 성능이 2배 빠를 것으로 기대하지만, 실제로 차이는 그보다 훨씬 적다. 코어 갯수가 늘어날 수록 동기화 문제가 점점 복잡해지고 그에 따라 Overhead가 커지기 때문인데, 오늘은 이런 동기화 성능 감소치를 비약적으로 낮춘 RCU에 대해 알아볼 것이다. 문제 어떤 문자열 포인터가 있다고 해 보자. 이 문자열 포인터에 N개의 스레드가 접근해 Read하려고 하고 M개의 스레드가 접근해 Write하려고 하는 상황이다. N개의 스레드가 Read하는 도중 1개..
Interrupt란? 비동기적으로 하드웨어 신호를 발생시켜 장치가 프로세서의 주목을 요청하는 것 I/O 장치와 프로세서 간의 속도 차이로 인해 프로세서가 I/O 작업을 요청하고, I/O 디바이스가 작업이 완료되었을 때 그것을 프로세서에게 알리는 것 역시 인터럽트이다. 이러한 인터럽트는 모든 종류에 대해 핸들링되는 것은 아니다. 실제로 인터럽트가 발생하더라도, 인터럽트 핸들러가 없는 인터럽트는 아무런 일도 일어나지 않는다. IRQ (Interrupt ReQuest) 그렇다면 OS는 인터럽트의 종류를 어떻게 구별할 수 있을까? (HDD가 발생시킨 인터럽트와 cpu timer가 발생시킨 인터럽트를 어떻게 구분하는가?) ubuntu에서는 /proc/interrupts에 인터럽트 정보를 기술한 파일이 존재하는데,..
android app 내부에서 프라이빗하게 사용할 수 있는 간단한 SQLite에 대해 알아보자. 파일 형태로 입출력할 경우 검색을 위해서는 먼저 모든 file을 스캔해야 하고 검색, 수정, 삭제 등 모든 기능을 직접 구현해야 해서 매우 귀찮기 때문에, 용량이 비교적 큰 데이터를 다룰 때는 raw file과 직접 IO하는 것 보다 DB를 사용하는 편이 더 좋다. DBHelper 가장 먼저 Database와 통신하기 위한 클래스를 작성한다. class MyDBHelper( val context: Context, ) : SQLiteOpenHelper(context, DB_NAME, null, DB_VERSION) { companion object { val DB_NAME = "mydb.db" val DB_VE..
android에서 app의 스레드는 main thread와, sub thread가 있다. 기본 스레드는 main thread이고, 여기에서 ui update 가 진행된다. 하지만 file IO, network IO와 같이 오랫동안 스레드 상태를 block으로 만드는 작업들의 경우 해당 작업을 main thread에서 진행하면 ui update를 할 수 없는 상태가 되어 사용자가 바라보기에는 앱이 멈췄다고 인식하게 된다. (사실 network io의 경우에는 아주 구버전의 안드로이드가 아니라면 main thread에서 아예 실행할 수 없다. 가능하다면 발생할 상황이다.) 따라서 오래 걸리는 작업들은 별도의 스레드를 이용하여 메인 스레드가 오랫동안 블락되지 않게 해 주어야 한다. CorotineScope 기..
위와 같이 하나의 액티비티에 존재하는 어떤 sharedData에 대해 액티비티에 attached된 2개의 fragment가 그것을 사용한다고 가정해 보자. 만약 fragment1이 데이터를 변경한다면, 변경한 데이터를 activity가 fragment2에도 반영해 주어야 하고, 반대의 경우에도 마찬가지이다. 이것을 코드로 구현하게 되면 코드가 지저분해지면서 가독성을 낮추고, 이는 곧 버그가 발생하기 쉬운 환경이 된다. 사실 여기에서 우리는 '데이터가 무엇으로 바뀌는지'에 관심이 있지, '데이터가 어떻게 변경되는지(how to fetch?)'는 관심이 없다. ViewModel RxJava나 React를 경험해 본 사람들이라면, 리액티브 프로그래밍 기법을 사용했을 때 위와 같은 불필요한 곳에 신경을 덜 쓸 ..
난 처음 업로드한 영상을 보고 100% 짭이라고 생각했는데, 그걸로 짭이 맞네 찐이네 뭐네 싸우길래 이번에 학교에서 과제로 진행한 AWS Rekognition 서비스를 이용해 얼굴을 비교해 보았다. AWS Rekognition은 다양한 사물, 사람 등에 대한 정보를 AI로 학습하여 유용한 정보를 주는 서비스라고 보면 될 것 같다. 이 서비스의 기능 중 하나인 '얼굴 비교'를 통해 두 얼굴 간 유사도를 알아볼 것이다. 과연 찐일까? 짭일까? 결과 무려 99.96%의 유사도(거의 쌍둥이 혹은 동일인물이라고 보면 되는 값이다)를 보이며 AWS가 정품인증을 해 주었다. 나도 이제 인정한다. 인정한다고 스바색기야아~
SELECT table_schema "DB Name", Round(Sum(data_length + index_length) / 1024 / 1024, 1) "DB Size in MB" FROM information_schema.tables GROUP BY table_schema; 위 SQL로 확인해볼 수 있다. 정상적으로 잘 표시되는 것을 확인할 수 있다. 수정 없이 그대로 갖다 붙이면 된다.
이번에는 데이터 모델링 시 유용하게 사용할 수 있는 패턴들에 대해 알아볼 것이다. Association Pattern 어떤 두 개체가 연관이 있기는 한데, 개체의 속성으로 추가하기에는 애매한 상황일 때 적용할 수 있다. 가령 음식 개체와 음식 제조 회사 개체가 있을 때, 모든 음식 제조 회사가 같은 음식을 만들 때 같은 가격과 같은 재료를 사용하지는 않는다. 이럴 경우 음식 가격과 음식 재료에 대한 정보를 회사 개체에 넣을 것인지, 음식 개체에 넣을 것인지가 애매해진다. 연관 패턴을 적용하면, 음식 가격/재료 속성을 포함하는 음식 제품이라는 새로운 개체를 만들고 음식 개체와 음식 제품 개체는 1:N 관계, 음식 제조 회사 개체와 음식 제품 개체가 1:N 관계를 갖게 만들 수 있다. Multivalued ..
Data Modeling을 위한 기본 개념에 무지하다면 아래 포스트를 읽어보고 오는 것을 추천한다. https://satisfactoryplace.tistory.com/232 [Database] Data Modeling (ER Modeling) 관계형 DB를 설계할 때 가장 많이 사용되는 기법으로 ER Modeling이 있다. ER Modeling은 이름에서부터 알 수 있듯이, Entity와 Relation을 이용해 현실 세계를 묘사한다. Entity Entity는 개체라고도 하며, 단독 satisfactoryplace.tistory.com Attribute ER 다이어그램이 Entity를 위와 같이 표현한 것과 달리, Crow Foot Notation에서는 아래와 같이 표현한다. 개체 표현이 더 간소화..
관계형 DB를 설계할 때 가장 많이 사용되는 기법으로 ER Modeling이 있다. ER Modeling은 이름에서부터 알 수 있듯이, Entity와 Relation을 이용해 현실 세계를 묘사한다. Entity Entity는 개체라고도 하며, 단독으로 존재할 수 있으며 다른 개체와 구별되는 object이다. 개체는 이름과 애트리뷰트를 갖는다. 이름은 개체의 이름이고, 애트리뷰트는 개체가 가질 수 있는 속성이다. 예를 들어, 사람이라는 개체는 성별, 나이, 키, 몸무게라는 애트리뷰트를 가질 수 있다. Attribute 첫 번째로 애트리뷰트는 단순 애트리뷰트와, 복합 애트리뷰트로 나눌 수 있다. 가령 사람의 나이라는 애트리뷰트는 더 이상 나눌 수 없는 단순 애트리뷰트이지만, 사람의 거주지 주소라는 애트리뷰트..
sudo(super user do) sudo는 슈퍼유저 권한으로 특정 작업을 수행한다. 그러나 슈퍼유저가 할 수 있는 모든 동작을 할 수 있는 것이 아니라, 일부 허용된 동작에 관해서만 사용이 가능하다. sudo su root계정으로 전환한다. root계정은 실제로 최고 권한을 가지고 있기 때문에 모든 동작이 가능하다. sudo vs sudo su ... 소유자가 root이고 권한이 771(other: 읽기만 가능)인 어떤 파일(file.txt)이 있다고 해보자. 이 때 그 파일을 수정하려 했을 때, root가 아닌 계정에서 sudo echo "test" > file.txt를 하면 Permission denied상태가 된다. sudo su를 하고 echo "test" > file.txt를 하면 소유자와 ..
대학교 ecampus 플랫폼인 HelloLMS 플랫폼에서의 사소한 버그와 해결방안에 대해 알아보자. 많은 학교에서 해당 플랫폼으로 ecampus를 운영하고 있다. 그럼에도 불구하고, 코로나가 터지고 비대면이 시작된지 1년 4개월 정도가 지났으나 지적되었던 문제점들이 전혀 개선되지 않고 있다. 강의 듣기, 강의자료 다운로드, 로그인 불가능 문제 나는 2021년 1학기에 복학을 했는데, 학기초부터 생긴 문제가 여전히 계속 발생하고 있다. 특정 상황에서 버튼을 눌러도 아무런 반응이 없다는 것인데, 조사해 보니 프로토콜 미통합 문제였다. 모던 브라우저에서는 http와 https의 혼용을 일정 부분 허용하지 않는다. 그런데 해당 사이트에서는 http와 https를 섞어서 사용해 이런 문제가 발생한다. 가령 사이트..
aws lightsail 을 사용 중 메모리 사용률이 100%에 매우 근접하게 되면 시스템이 아예 서버리는 문제가 발생되었다. (그래프가 끊긴 시점에서 전혀 서버가 응답하지 않았다) 특히 크롤링 작업을 할 때나, 사용자 수가 급증할 때 발생하는데 해결법은 aws lightsail console로 입장해 서버를 재시작하는 방법밖에 없는 데다가 재부팅 시간도 길기 때문에 서비스 품질 면에서 이는 매우 좋지 않은 경우다. 특히 저가형 VPS를 사용중일 경우 DB와 Web Server만 구동시키더라도 메모리 부족 현상이 금방 나타나고, 여기서 시스템 다운과 정상 작동 사이에서 아슬아슬한 줄타기를 하게 된다. Memory Swap 설명하기 전에 잠시 운영체제 관련 지식에 대해 설명할 것이다. 고전 OS들은 물리적..
mysql 모듈을 사용하던 중 발생한 오류이다. 동일한 코드였으나 어느 순간 갑자기 이 오류가 발생하기 시작했는데, 문제는 AFTER_FATAL_ERROR이라면서 이전에 오류는 찍히지도 않았다. 모듈 버전이나 노드의 버전이 바뀌면서 뭔가 변경점이 생긴 것 같다. 원인 메시지 원인처럼 쿼리 실행 전 커넥션에 무언가 치명적인 오류가 생긴 경우이다. 찾아보니 커넥션이 이루어진 후 일정 시간동안 쿼리가 발송되지 않으면 자동으로 커넥션이 종료된다고 한다. 커넥션이 끊긴 후 쿼리를 보내려고 하니, 위와 같은 오류가 발생하는 것이다. 해결법 커넥션이 끊기지 않게 하기 위해 코드블럭을 다음과 같이 변경한다 const preventClosingConnection= ()=>{ database.query('SELECT 1'..