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