잡담2016. 5. 26. 12:41

3월부터 개인적인 시간이 생기면서, 그동안 부족했던 부분들을 채워 보고자 Coursera.org에서 강의를 신청 했었다.

 

두 개의 강으로 나누어져 있는 알고리즘 강의가 있었는데, Part I은 주경야독으로 빡세게 진행 했었고, 나머지 Part II를 마져 수강 신청 했었다.

 

그러고는, 요즘 인공지능, 머신러닝 얘기가 하도 많아서, 상식차원에서 좀 알아야 되지 않겠나 하는 충동으로 별 생각없이 첫 강의를 본다는게 수강 신청이 되어 버렸다. ㅎㅎ

 

그러고는 거의 3개월 가까이, 알고리즘과 머신러닝 강의를 소화 해 내느라, 계획에 없던 정신없는 생활을 해야 했고, 결국 certi를 획득 했다. ;ㅁ;

 

두 강의 모두, 마지막 주차 강의를 듣는 동안에는 두 교수님들의 말씀들에 뭉클하기 까지 하더라.

 

어느 블로그에서, 미국에 유학을 가면, 첫 학기에는 두 과목 수강하기도 힘들다는 내용을 본 적이 있는데, 실제 학위를 받기위해 직접 수강을 하는 경우에는 온라인 수강보다 몇 배 더 어렵겠다는 생각이 들었고, 미국 유학가서 학위를 받은 사람들을 다시 바라보게 되는 계기가 되었다.

 

어쨌든 이 강의를 통해 알고 느끼게 된 점은

  • 머신러닝이 무엇인지에 대해서 알게 되었다.
  • MATLAB은 논문 쓸 때 그래프 그리는 것이 주 용도가 아니었다.
  • 선형대수(Linear algebra)는 정말 중요하고 요긴하다.
  • 고등학교 때 이후로 손 놓고 있었던 미분이 어렴풋이 기억 나더라.
  • 3D 그래픽하면서 다시 공부했던 수학이 큰 도움이 되었다.
  • 퀴즈와 과제는 문제와 지문의 이해 자체도 큰 허들이다.
  • 해외(미국) 유학은 쉽지 않겠다.

 

기-승-전-수학이군...

 

끝.

 

Posted by 세월의돌
리눅스 & 안드로이드2016. 1. 22. 13:41

Input Device의 input event를 App.에서 직접 받아 볼 필요가 있어, NDK로 epoll을 이용해 구현 했던 내용을 정리 해 본다.

epoll 관련 설명은 The Event Poll Interface를 참고 하였다.


우선, device driver file의 fd를 사용해야 하기 때문에, 해당 device file을 열 수 있는 권한을 App.이 가지고 있어야 한다. (예를 들면 App.이 system 권한을 가지고 있어야 한다.)

아래 예제 소스 각각의 특징에 대해서, 간략하게만 정리 해 둔다. 구현 했던 걸, 생각나는 대로 다시 정리한 것이라서, 그대로 copy & paste 하면 제대로 빌드가 되지 않을 수는 있겠으나, 전체적인 맥락은 유효하니 나중에 필요할 때 다시 볼 수 있을 것으로 믿는다.ㅎㅎ


[Header]

  • epoll이나 device driver 파일을 열고나면, 열린 file descriptor를 복사한다는거 자체가 적절하지 않으므로, 복사/대입을 막아 두었다.
  • epoll로 이벤트를 받고 처리하기위해 thread를 하나 만들었으며, 전달 받은 이벤트를 container에 저장 해 두고 사용하기 위해서 mutex를 하나 두었다.
  • JNI에서 instance를 생성하고 사용해야 하므로, 간단하게 constructor에서 모든 초기화를 마치고, destructor에서 file descriptor등을 닫도록 처리 했다.


[Source]

  • threadHandler에서는 epoll_wait으로 이벤트를 무한정 대기한다.(timeout 시간을 지정할 수도 있음)
  • 정상적으로 이벤트를 받은 경우, epoll_wait이 이벤트의 개수를 반환한다. 이 개수 만큼, 대상 file descriptor를 통해 이벤트 데이터를 읽어 들인다.
  • 오류를 검사하고, input_event 구조체를 통해 이벤트 데이터를 활용한다.


[JNI interface for JAVA]

  • App.에서 JAVA로 호출하게 될 native 함수 정의이다.
  • native도 복사/대입 금지를 하도록 되어 있으므로, JAVA interface도 singleton으로 구현하는 것이 적절하다고 판단 되므로, static으로 선언!
  • native instance의 pointer를 JAVA instance에서 보관하고 활용하는 방식으로 구현되어 있으므로, native interface를 추가하고 활용하기 위해서는, long 타입의 native instance pointer를 전달하는 것이 필요하다.
※ 참고로 native library를 동적으로 로드하기 위해 아래 코드가 JAVA layer에 추가되어 있어야 함.

static {
System.loadLibrary("epoll_sample");
}


[JNI interface for C/C++]

  • App.이 native 초기화를 진행하면, native instance를 생성하면서 초기화를 진행하고, 문제가 없으면 instance pointer를 반환한다.
  • 현재는 device driver 파일경로를 직접 표시 했는데, android property 등의 환경변수나 다른 입력을 통해 전달 받도록 할 수 있겠다.


[Android.mk]

  • 일반적인 NDK makefile이며, C++11을 사용하기위해 -std=c++11을 추가함. (Application.mk에서와 중복되어 있다)


[Application.mk]

  • GCC 4.9와 STL 사용을 위해 명시적으로 추가 해 두었다.
  • platform이 32bit/64bit ABI를 사용하므로 두 종류 모두 빌드 할 수 있도록, armeabi-v7a, arm64-v8a를 추가 했다.


※ NDK로는 아무 문제없이 빌드가 되는데, Android platform에 추가해서 빌드를 해 보니 STL header(string 등등)의 path를 기본적으로 찾지 못했고, prebuilt에 포함된 NDK v9을 이용해 빌드 하면 컴파일은 가능하지만, arm64-v8a binary link를 진행하면서 unsupported ELF machine number 183 에러가 발생하였다. 구글링을 통해 google group이나 stack overflow의 글들을 찾아 보고, 적용해 볼만한건 다 해 봤지만 빌드가 되지 않았다.

해결 방법을 아시는 분은 덧글로 알려주시면 감사하겠습니다. (__)


Posted by 세월의돌