Programming(199)
-
Kotlin에서 JSONObject .get*의 확장 함수를 만들어봤다. (reflection, generics, reified)
반복 구문의 발생 Java, Kotlin에서 JSONObject을 사용하여 JSON으로 작성된 데이터 구조를 파싱할 때, getInt, getString 등을 사용하는 경우가 많았다. 이 메서드는 문자열 키를 받아서 매칭되는 값을 반환하는데, 매칭되는 값이 없을 경우 Exception을 던지게 되어있다. Exception이 발생한 경우에는 null을 반환하도록 코드를 작성하면, 아래와 같다. try { JSONObject.getInt("key") } catch (JSONException e) { e.printStackTrace() null } try { JSONObject.getString("key") } catch (JSONException e) { e.printStackTrace() null }위에서..
2020.09.07 -
libcrypt.so와 glibc의 크로스 컴파일에 대하여
libcrypt.so(crypt 라이브러리)에 대하여 이전에 OpenResty(NGINX)를 크로스컴파일하는 과정을 기록한 글에서, 글의 말미에 libcrypt.so에 관련된 내용을 잠깐 기록했었다. 별도의 글을 남기는 이유는 라이브러리 자체가 특정 서버에만 영향을 끼치는 게 아니며, 리서치 시 glibc의 libgcrypt.so, openssl의 libcrypto.so등 비슷한 라이브러리로 인해 파악이 어려웠기 때문이다. 간략하게 libcrypt.so에 대해 알아보자. Crypt 라이브러리 crypt 라이브러리를 구글에서 검색해보면, 위키피디아의 crypt(c)페이지가 나온다. 페이지 상단의 몇 줄을 읽어보면, 비밀번호 해쉬값 생성시 사용되는 녀석임을 알 수 있다. 이제 왜 이 녀석이 없으면 HTTP_..
2020.05.18 -
Spawn-fcgi의 크로스 컴파일
Spawn-fcgi의 크로스 컴파일에 대하여 spawn-fcgi는 nginx에서 다른 라이브러리를 사용하지 않고 fcgi를 돌릴 때 필요한 아이로, fcgi를 프로세스 단위로 실행해주는 녀석이다. 이 녀석을 사용하여 fcgi를 실행한 뒤, nginx에서 proxy-pass해주면 fcgi를 이용하여 통신하는 것이 가능해진다. OpenResty/NGINX를 크로스 컴파일 할 때와 마찬가지로, QEMU나 Scratchbox와 같은 툴로 에뮬레이터 환경을 구축한 뒤 컴파일하면 아무런 설정 없이 컴파일이 가능하다. Scratchbox와 QEMU에 대해서는 OpenResty/NGINX의 크로스 컴파일 할 때 알아봤으므로, 이번에는 설명을 생략하도록 하겠다. configure를 통한 설정 Scratchbox와 QEM..
2020.05.08 -
Android의 WebView를 사용할 때, 클라이언트 에러를 추적하는 방법 정리.
WevView를 세팅해보자. 우선은 레이아웃을 만들어보자. 웹뷰를 액티비티 한 가득 띄워놓을거니까, 아래처럼 xml파일을 작성하면 된다. xml파일의 작성이 끝났다면, 이번에는 Activity를 만들 차례다. 파일을 하나 생성해서 Activity를 상속받은 클래스를 하나 만들어주고, 아까전에 생성한 xml파일을 setContentView로 때려박아주자. 그 뒤 webView의 loadUrl을 호출해주면, 웹 뷰를 사용할 준비는 대충 끝났다. class MainActivity: Activity() { override fun onCreate(savedInstanceState: Bundle?) { //레이아웃 세팅 super.onCreate(savedInstanceState) setContentView(R.l..
2020.03.02 -
코틀린으로 배우는 함수형 프로그래밍 연습문제 #3 [푸는 중]
[연습문제 3-2] X의 n승을 구하는 함수를 재귀로 표현해보자. 함수의 선언 타입은 다음과 같다. fun power(x: Double, n:Int): Double fun power(x: Double, n:Int): Double { return when(n) { 1 -> x else -> power(x*x, n-1) } }[연습문제 3-3] 입력n의 팩터리얼인 n!을 구하는 함수를 재귀로 구현해보자. tailrec fun factorial(x: Int, result: Int = x): Int { return when(x) { 1 -> result else -> factorial(x-1, result*(x-1)) } }[연습문제 3-4] 10진수 숫자를 입력받아서 2진수 문자열로 변환하는 함수를 작성하라...
2020.01.19 -
[Android] YUV와 RGB의 색공간 변환과 LIBYUV를 이용한 하드웨어 가속
YUV란? YUV(YIQ/YCbCr/YPbPr)는 색을 구성하는 방법 중 하나로 밝기(Y)와 청색 색차(U), 적색 색차(V) 정보로 색을 구성한다. 여기서 Y 신호만 받는다면 흑백이 된다. 여러 번 복제한 VHS 테이프나 방송 상태가 좋지 못한 채널에서 흑백으로 보이는 것도 이 때문. Lab과 마찬가지로 인간이 색을 인식하는 방식으로 구성되었다. - 나무위키 발췌(https://namu.wiki/w/YUV) 사실 발췌는 해왔지만 정확하게 아는 것은 아니다. 흑백 TV의 위치를 컬러 TV가 조금씩 대체해가던 과도기 시절, RGB를 흑백 TV에 송출하기 어렵기 때문에 만들어진 색 공간 개념이라고 한다. RGB보다 전송에 용이하기 때문에 흑백 TV가 더 이상 사용되지 않는 요즈음에도 많이 사용하고 있다고 한..
2019.12.13