2018년 2월 25일 일요일

Vim Plugin manager 설치

Vim Plugin manager 설치

다양한 Plugin을 편하게 설치하기 위해서는 대표적인 Vim Plugin manager인 Vunlde을 이용하는 것이 좋다.
다음 명령을 통해 Vundle을 설치한다.
$ git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

출처: http://hochulshin.com/osx-vi-javascript/ 

2016년 3월 30일 수요일

FUSE (Filesystem in Userspace) 에 대한 이해

일반적으로 filesystem 은 kernel layer 에서 개발하는데, 이 경우 kernel 에 대한 높은 이해가 필요하다.

kernel 에 대한 이해 없이 디버깅의 편리성, 시스템 안정성 향상, 개발 속도 같은 것들을 우선하는 filesystem 을 만들고 싶을 때 사용하는 것이 FUSE 가 되겠다.

즉 FUSE 는 filesystem 을 user layer 에서 개발할 수 있도록 도와주는 framework 이다.

일반적으로 linux, mac 등에서는 FUSE, windows 에서는 dokan 이 fuse 같은 framework 을 제공한다.

FUSE 를 구현하는 법은 간단하다.

예를 들어 user program 으로 read 를 구현하고

그것을 FUSE framework 에 넘기면, 내부적으로 kernel layer 에 read 가 불릴때 user program 에 구현된 read 를 불러준다.

(function pointer 달아가지고 fuse_main 호출하면 끝이다.)

쉽게 생각하면 user program 에서 libfuse 를 가져다쓰는 것이다.



그런데 libfuse 를 가져다 쓰지 않고 구현할 수도 있다.

libfuse 에서 해주는 일은 /dev/fuse 를 열고 주기적으로 해당 노드를 read 하여

(kernel 에서 부터 요청이 온 request 를 읽어서) 적절한 user function 을 호출하는 일을 한다.

(즉,  fuse kernel module 이 하는 일은 kernel에 filesystem operation 들을 /dev/fuse 에 써주는 역할이다.)

이 내용을 직접 user program 에서 작성하여 더 빠르게 request 를 처리하도록 설정할 수 있다는 것이다.

(thread 를 여러개 둬서 /dev/fuse 를 마구 읽어서 처리한다던지...)

user filesystem 에 한계는 명확히 존재하지만 libfuse 를 직접 구현하면 mmap 등을 이용해

kernel - user copy를 줄일 여지가 더 생기는 등 괜찮은 filesystem 을 만들 수 있다.










2016년 3월 15일 화요일

Android app WebView 의 local html file 에서 CORS(Cross-Origin Resource Sharing) 문제 해결하기

CORS 는 다른 도메인에서 요청을 보내는 것을 말한다. 자세한 내용은 검색하면 무슨 의미인지 금방 알 수 있을 것이다. 정보도 많고... 여튼, 이 요청에 대한 spec에 따라

App REST api 요청을 보낼때 (WebView html 통하여)
http request header 에 내가 누군지 (origin 이라는 항목에 내용을 http://www.google.com 같은 url 정보로 채우도록) 를 적게 되어있다. 이 정보는 WebView (정확히는 Android Web engine) 이 자동으로 적어준다.

위와 같은 정보를 적어서 보내면 server 에서 http request header 를 열어서 origin 을 확인하고 해당 요청을 허용해 줄 지 말지 결정한다.

그래서 일단 sever (Django) 에 작업을 해야했다.

우선 server 설정을 모든 origin 에 대하여 통과하도록 해두었다. 
(https://github.com/ottoyiu/django-cors-headers 을 이용)

그런데 특정 핸드폰에서는 origin 을 null 로 setting 해서 보낸다.
server 에 origin null 이 들어오면 설정이고 뭐고 그냥 error 가 return 된다.
(local html 파일에서의 요청 경우에 origin 설정에 대한 spec 이 없기 때문이다.)

그래서 명시적으로 WebView 설정을 해주어야 안전하다.

webSettings.setAllowFileAccess(true);
webSettings.setAllowContentAccess(true);
webSettings.setAllowFileAccessFromFileURLs(true);
webSettings.setAllowUniversalAccessFromFileURLs(true);
이렇게 해주면 local html 에서의 CORS 요청에도 origin 값을 설정해서 보내게 되어 어느 폰에서나 정상적인 처리가 가능하다.
(모든 폰을 다 해보지 못했으나, 안되던 기기에서 저 설정 후 되는 것을 확인했다.)


2016년 3월 11일 금요일

maria DB (mySQL) python 으로 접근하기

maria DB 설정은 다 되어있다고 하고 시작

shell 에서

$pip install MySQL-python

이걸하면 MySQLdb 를 사용할 수 있음.

그리고 아래와 같이 구현

https://github.com/kjunu/hello/blob/master/python/mariaDB.py



2015년 7월 28일 화요일

visual studio 2013 을 이용한 windows kernel driver 개발환경 만들기

visual studio 를 이용해서 windows kernel driver 를 만들고 debugger 붙이기

우선, kernel driver test PC 를 준비해야한다.
개발용 PC 에 직접 Test 를 실행하다가는 개발용 PC 를 포맷해야하는 일이 일어날 수도 있다. 이 경우 작업내용도 다 같이 날아갈 수도 :$

test PC 는 남아도는 PC 를 하나 구해도 상관없지만, 난 그런 자원이 없으므로 Virtual machine (VM) 을 하나 만든다. 그리고 개발용 PC 를 구한다. 그런데 내 개발용 PC 가 ubuntu 인 관계로 개발용 VM 을 하나 또 만들었다.

즉, 내 환경은 ubuntu 위의 virtual box : 개발용 VM1, Test 용 VM2

우선 VM1 에 windows 7 을 설치했다.
그리고 대충 업데이트들 하고
windows WDK 8.1 를 설치!
( https://msdn.microsoft.com/en-us/windows/hardware/gg454513.aspx )
그리고 clone 해서 VM2 를 만들었다. VM2의 컴퓨터 이름은 미리 바꿔주자. 나중에 헷갈림

이후 VM1 은 cpu 랑 ram 을 가능한 크게 주고, VM2 는 조금만 주었다.
Network 설정은 bridge 로 설정하였는데, NAT network 로 묶어도 된다.
( 여튼 서로 network 으로 VM1 에서 VM2 로 통신할 수 있게만 해주면 된다.
윈도우탐색기에서 네트워크를 클릭했을때 서로 보이면 ok )

그리고 VM1 과 VM2 를 serial 로 연결해준다.
( https://www.howtoforge.com/how-to-set-up-a-serial-port-between-two-virtual-machines-in-virtualbox )
이 과정을 지나면 VM1 을 켜야지만 VM2를 켤 수 있다.

이제 hardware 설정은 끝났고, 필요한 software 들을 설치한다.
VM1 에는 개발툴인 vs2013 을 설치~
VM2 에는 WDK target 설정을 위해 아래 패키지를 설치한다.
( C:\Program Files\Windows Kits\8.1\Remote\x86\WDK Test Target Setup x86-x86_en-us.msi
 당연히 x86 부분은 본인의 arch 에 맞는 걸로 변경해서... ㅎㅎㅎ)


자, 그러면 VM1 vs2013 을 켜고
Driver > Test > Configure Computers..., 선택 후 Add a new computer.
Computer name 에 VM2의 이름 (네트워크상의 컴퓨터이름) 을 입력하고
2번째 항목 (Provision computer and choose debugger settings) 선택 후 다음
com port 설정이 맞는 지 확인하고 또 다음.
그러면 VM2 에 이런 저런 창들이 떴다 없어졌다 하면서 리부팅도하고 설정이 된다.
이 때 VM2 의 windows 사용자 계정에는 반드시 password 를 설정되어 있어야한다.
도중에 한 분 물어보는데 password가 없으면 통과가 안된다.

이 과정이 잘 안된다는 사람들이 많은데,
네트워크 설정이랑 serial 설정만 제대로 되어있다면 문제 없이 동작한다. 잘 안되는 것 같으면 이 두 가지 설정을 다시 확인하자.

아래 링크대로 따라서 hello driver 를 하나 만든다.
https://msdn.microsoft.com/ko-kr/library/windows/hardware/hh439665(v=vs.85).aspx )
동작확인이 끝나면 개발환경 세팅 끝!





2013년 12월 5일 목요일

ubuntu 에서 library 없을 때 찾는 법

#sudo apt-cache search "찾을 것"

Android Camera device 를 사용한 app 개발 일기 2

오랫만에 글을 적는다. 생각보다 난이도가 있는 작업이었다.
한 달여간 작업 후에 손을 땐 상태가 되었다가 연말이 되어 한 해를 돌아보며 생각난 김에 적어둔다.

trello 후기
상당히 괜찮은 툴이다. 개인적으로 모바일에서도 pc 처럼 사용할 수 있어서 출퇴근하며 확인하고 아이디어 추가하고 하기 좋았다.

app 개발내용
# camera app 에 intent 날려서 mp4 파일 얻는 방식은 그다지 의미가 없었다.
일단 이 방식은 카메라 프리뷰 화면을 마음대로 할 수 없는 게 마음에 안들었다.
또한, 다양한 기기마다 만들어주는 해상도가 다르다는 것도 문제였고...
마음대로 필터를 넣을 수도 없었다.

# 결국 camera device 를 직접 접근해서 preview 받아오고 그걸 또 인코딩해서 mp4 로 만들어내도록 프로그래밍해 넣었다.

# 인코딩하는 방식이 여러가지 였는데, android 에서 기본적으로 제공하는 class 인 mediaRecoder 를 사용했다. 근데... 이 class 마음에 안든다. 카메라의 영상을 담아서 인코딩하는건 잘 되는데, 파일을 열어서 디코딩한 영상을 필터 먹이고 다시 인코딩 하려니까 잘 안되더라. 아 Nexus 7 에서는 잘 되었다. Galaxy S3, LG opG 는 안되서... 결국 필터는 포기..

# 안드로이드에는 기본적으로 제공하는 카메라 필터들이 존재한다. 이건 필수가 아니어서 제조사에서 구현한 (지원하는) 애들만 쓸 수 있다. 쿼리해서 지원하냐고 물어보고 한다고 하면 쓸 수 있는 방식.

# mp4 파일들을 이어 붙여야 했는데 이건 mp4parser 라는 opensource java library 가 있어서 그거 가져다가 썼다. 잘된다. 훌륭함. 단점은 인코딩 방식이 모두 같아야 한다는 것.

일단은 여기까지 적어두고 나중에 또.. 이어서.. 적다보니 일기가 아니라 그냥 후기가 되고 있군...

2013년 7월 30일 화요일

Android Camera device 를 사용한 app 개발 일기

app 개발에 대해서는 아무것도 모르는 채로 시작했다고 해도 과언이 아니다.

다만, 업무상 android framework 소스를 봐왔었다는 자신감으로 생각없이 막 시작했었다.

시작할 때의 마음가짐은 'app 개발 하는데 대충 웹질하면서 긁어 붙이면 금방 만들겠지.' 였다.

그렇지만 아직 alpha 버전도 못만들어내고 있는 걸로 봐서 너무 자만했나보다.

문제는 아직도 저런 마인드가 좀 남아있다는 것;;;

한 달 가량 개발을 하면서 프로그래밍 실력이 모자라다는 것을 반복해서 깨닫고 있다.

어떻게 class 를 나눌지 어떤 일 단위로 activity 로 쪼갤지 계속해서 헷갈린다.

여튼, 본격적인 개발 일기로 정리를 해야겠다.

3명이서 만들자고 시작했고, 이번 app 의 경우 내가 메인 개발자이다.

처음 한 일

github 만들기
가입하고 사람들한테 권한 주면 완료. 자세한 설정은 동료형님이 해줬다. 평소에 git을 써오던 터라 금방 한 듯 ㅎㅎㅎ

trello 만들기
역시 가입하고 사람들 초대하면 끝. 내가 했다.
알아내야 할 것,to do, doing, done,complete 정도로 관리하고 있다. 조금 엉망이 되어가는 느낌이지만 뭐...

app 개발 환경 만들기
linux 사용하고 있던 거에 android developer site 가서 이클립스만 받았음. 다른 애들은 원래 깔려있었는데 요즘보니 걍 원클릭으로 다 받아지는듯? 게다가 그냥 프로젝트 만들자마자 돌리면 hello world 뜬다. ㅎㅎㅎ 가상머신 쓰기 싫어서 그냥 가지고 있는 실제 기계에 올려서 테스트하기 시작.

app 개발 내용
아마 이 내용이 쭉 이어질 것 같다.

# 버튼 만드는 법 웹에서 긁어오면서 이해했다. 버튼 하나 넣는데도 은근히 귀찮은 작업.
# 다른 activity로 string array list 전달하는 방법. 괜히 putExtra로 고생할 뻔했지만 더 편한게 있었음. 키워드는 putStringArrayListExtra
# intent 날려서 camera app 을 구동시켜 output 얻어오기. camera에 대하여 일체 신경쓰지 않고 mp4 ,3gp 파일을 얻어올 수 있다. 시간제한, 용량제한 가능하고.. 근데 결론적으로 현시점에서는 안쓰게 되었다. 이거는 웹에 예제가 많긴 한데 모르면 괜히 헤맨다. 키워드는 android.media.action.VIDEO_CAPTURE

 to be continue




2013년 7월 17일 수요일

git stash 작업 tip

 stash 활용

오늘 얻은 내용정리

"현재 작업과 상관없는 급한 일을 처리해야할 때"

git stash
vi ... 급한일
git commit -a -m "급한 작업내용"
git stash pop
vi ... 원래 하던 일

stash apply, drop, pop,list 등 사용가능

stash 했던 내용과 현재 내용과 diff  보는 법

git stash show -p stash@{0}

뒤에 stash@{0} 은 stash list 로 확인하여 해당하는 stash 와 비교가 가능하다.


2013년 5월 6일 월요일

git 유용한 명령어들

git diff 가지고 패치하기


$git diff --no-prefix > patchfile
$cd path/to/top/                 
$patch -p0 < patchfile           

$git diff  > patchfile
$patch -p1< patchfile

commit 취소하기

$git reset HEAD^

$git reset HEAD^2

$git reset --hard HEAD^ (작업내용 날리면서 원복)

git reset 한 것 되돌리기


$ git branch <new branch> HEAD@{1}
$ git branch mybranch HEAD@{1}

지운 branch  되살리기


Deleted branch temp (was 4160aa).
$ git branch <new branch> <commit>
$ git branch mybranch 4160aa

2013년 4월 1일 월요일

ld : cannot find lz

Complie Android in Ubuntu 64

error message :

ld : cannot find lz

solution:

apt-get install lib32z-dev

or

apt-get install lib32z1-dev

2013년 3월 19일 화요일

Android app 이 3D 화면을 출력하는 과정 (surface flinger 와 EGL, GRALLOC)

app 이 surface flinger 에게 그릴 공간을 달라고 한다.

surface flinger 가 gralloc 에게 메모리를 달라고 한다.

gralloc(제조사가 만든다. 대부분 코드 비공개)이 메모리를 할당한다.

surface flinger 는 받은 메모리를 surface 로 만든다.
(struct surface 에 정보를 채우고 메모리 연결)

app 은 surface 를 받아왔다고 EGL 에게 알린다.

EGL(제조사가 만든다. 대부분 코드 비공개) 은 OpenGL ES 가 surface 에 달린 메모리를 사용할 있도록 한다.

이 때 부터 app 은 정상적으로 OpenGL API 를 사용할 수 있다.

app 이 여러 OpenGL API 를 통해서 surface 에 그림을 그리고 EGL 에게 다그렸다고 알린다.
실제 그림 그린 메모리가 반영된다.

그리고 나면 surface flinger 가 메모리(surface)를 가져다가 다른 app 들의 surface 와 합쳐서
화면에 출력한다.



2013년 3월 6일 수요일

bash 에서 return 값 확인하기

bash shell script 를 사용할 때 여러 개의 script 를 연결하다가 보면

"특정 script가 실패했을 때" 라는 조건을 걸고 싶을 때가 있다.

일반적으로는 내가 만든 script 가 내부적으로 실행했던 script 가 실패하면,

내가 만든 scrpit 까지 동작이 멈춰버린다.

이 때 return 값을 check 하게 하니 내부적을 실행한 scrpit 가 실패해도

내 scrpit 가 계속 진행한다.
(예시: VAL=`test.sh; echo $?` 하면 test.sh 가 실패해도 계속 진행한다.)

bash 에서 return 값을 check 하는 방법은

$?

를 보면 된다.

2013년 2월 19일 화요일

ubuntu 에 jdk 간편하게 설치하기

$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java7-installer

$ sudo add-apt-repository ppa:ferramroberto/java
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk sun-java6-plugin

2012년 10월 26일 금요일

request_threaded_irq


int __must_check
request_threaded_irq(unsigned int irq, irq_handler_t handler,
             irq_handler_t thread_fn,
             unsigned long flags, const char *name, void *dev);


  • irq 에 따라서 handler, thread_fn 을 돌려달라고 등록하기.



  • handler 에 NULL을 넣으면 default handler(irq_default_primary_handler) 가 불려 thread_fn 이 수행되는 동안 해당 irq 를 disable 상태로 만들어둔다. return 은 IRQ_WAKE_THEAD.
    • 참고하여 handler function 을 만들도록 해야겠다. 또한, thread_fn 안에서는 irq 를 enable 해주도록 할 것.



  • 왜 handler 와 thread_fn 두 개인가?
    • thread_fn 을 NULL 로 넣어도 상관없음.
      • 이 경우 그냥 request_irq 와 같음.



예제: mmc host 에서 새로운 mmc card 인식을 위하여 gpio 를 irq 로 연결할 때.



linux version 2.6x  도입.

2012년 7월 31일 화요일

bluetooth stack 분석

Android : bluez 를 이용
* bluez 구성
* linux kernel (net/bluetooth ) 부분에 hci command 를 이용한 l2cap 이 구현되어 있음.
* library 형태로 profile 들이 구현되어 있음.
* bluetoothd 라는 daemon 을 띄우고 d-bus 를 통해 android platform 과 통신함.
* sdp tree 관련 처리는 tool을 이용해서 따로 하고 있음.

Windows 7,8
* MS 에서 구현 bthport.sys 라는 port 가 있고 여기에 miniport 로 bthusb.sys 랑 bthuart.sys 같은게 있음. ( l2cap 이 여기서 다 구현되어 있음)

- 참고
bthusb 등이 bthport 에 있는 함수를 직접 부를 형태여서 이 사이에 filter를 달거나 할 수 없음.
따라서 당연히 device tree 를 확인하는 툴로 봐도 bthport.sys는 안보임.

* profile 들도 driver 형태로 구현함
* BRB 라고 bluetooth request block 을 만들어서 ioctl로 내리면 알아서 처리해줌.
* sdp tree 관련해서 처리하는 inteface 를 비슷한 layer에서 제공해줌.

2012년 4월 25일 수요일

unlink 시에는 negative dentry 가 생기지 않는다

lookup 시에 찾으려는 file 이 없으면 dentry 가 가르키는 (vfs) inode 를 NULL 로 만들어둔다.

이런 dentry는 nagative dentry 가 되어서 다음 번 lookup에 활용된다.


unlink 시에는 inode 를 없애야 하는데, 이 때 dentry 가 가르키는 inode만 없애는 것이 아니라

dentry 까지 같이 free 한다.

2012년 4월 3일 화요일

linux getdents (readdir) 의 callback filldir 에 대하여

readdir 
linux 에서 directory file 의 내용을 읽기 위하여 사용하는 API 이다.


대표적으로는 ls 가 readdir을 통해서 구현되었다고 생각하면 된다.
실제로 사용하는 syscall 은 getdents 이다. 


이름으로 보면 getdent's' 복수형이다. 
즉, readdir을 directroy file 내용을 하나씩 읽어오고
getdents는 여러개씩 읽어오도록 되어있다.


당연히 getdents 가 성능이 더 좋다.


내부의 구현을 보면 둘다 vfs_readdir() 을 부르게 되는데, 다만 이 때 넘겨주는 callback fuction 인 filler (readdir은  fillonedir, getdents는 filldir) 의 차이로 구분하게 된다.

여기서 남기고 싶은 이야기는


getdents 가 넘거주는 filldir 에 d_type 에 대한 것이다.



static int filldir(void * __buf, const char * name, int namlen, loff_t offset,
  u64 ino, unsigned int d_type)


뭐하는데 쓰이는 지 봤는데, 오로지 ext2,3,4, Btrfs 만 을 위한 field 같이 보인다.
다른 인자들은 특별할 것이 없이 fs 가 name, len, offset, ino 를 주면 buf 에 미리 약속된 형태(linux_dirent)로 적절히 넣어준다.
이 때 마지막에 d_type을 넣어주는데. 이것을 보고  block device, character device 인지 directory 인지 혹은 named pipe 인지 따위의 정보를 알 수 있다. 


http://linux.die.net/man/2/getdents 보면,
"Currently, only some file systems (among them: Btrfs, ext2, ext3, and ext4) have full support for returning the file type in d_type. All applications must properly handle a return of DT_UNKNOWN."


라고 되어있다.  


vfs code를 보다보니 Btrfs만을 위한 특별한 code가 들어있을 만큼 linux에서 Btrfs에게 신경을 써주는 거 같은데, 혹시나 이것도 그런 것일까? d_type 은 대체 무슨 이득이 있어서 넣어둔 것일까 궁금하다.

2011년 12월 7일 수요일

signed 와 unsigned 의 비교

그냥 ubuntu gcc로 compile 할 때는 멀쩡하던 것이
android 용으로 ndk-build 를 써서 빌드하니까 엄청난 warning 들이 나왔다.
다른 것들은 뭐 initialize 안한 것 부터해서 그냥 휙휙 고치면 되는 것들이었는데...

warning: comparison between signed and unsigned integer expressions
이 녀석은 조금 골치가 아프다. 아...놔... 누굴까 대체...

그래서!

int 와 unsigned int 를 비교하면 어떻게 되는지 실험해보기로 했다.

구글링으로도 잘 안나오더라...OTL
환경은 64bit ubuntu...그냥 int는 4byte, long은 8byte 이다... 혹시나 해서ㅎ

기억하던대로(?)

int i = -1  는 0xffffffff
unsigne int ui = -1 도 0xffffffff (unsigned 에 -1 넣어도  warning 없이 compile 잘 되는구나;;;)

비교하면 그냥 같다고 나오는구나...
걍 bit 배열만 보고 판단하는 구나.. 그랬구나 OTL 허무...

자 이제 ... 누군가

int x = -1 이라고 하고
unsigned int y 로 받아온 값을 비교하는데..

if( x == y ) goto error;
라고 적어둔 식에서 위에 경고가 뜨는 걸
그냥 type casting 으로 없애도 되는가에 대한 결론을 내보자.

재수없이 y 에 0xffffffff 가 들어왔다면?!
하아 -_-... error 겠구만... 잘 발견하기도 어려운...
일단은 0xffffffff은 안들어오는 것이 보장되는 것 같으니 일단은 type casting 만 하고 넘어간다.



블로그 시작

나도 뭐라도 남겨야 겠다.
이 사진의 이상한 점은?!ㅋㅋㅋ