'전체 글'에 해당되는 글 171건

  1. 2013.06.05 [android] 2D 그래픽 엔진 Skia
  2. 2013.06.03 오픈소스 이용시 코드 공개 여부
  3. 2013.06.02 [주식용어] Small Cap 이란? small cap 투자 전략
  4. 2013.05.31 [android] Volley - Network & ImageLoading 라이브러리 ( google I/O 2013 )
  5. 2013.05.24 SharedPreferences 사용시 주의점

[android] 2D 그래픽 엔진 Skia

android 2013. 6. 5. 14:28

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

안드로이드에서 2D 그래픽 엔진( Graphic engine ) 으로 사용하고 있는 것은 Skia라는 이름의 엔진이다. 개발밥을 먹으면서 써보지는 않았어도 대충 들어는 봤어야 하는데, 생전 처음 듣는 이름 이었다. 역사를 찾아 보니 아래와 같은 기사가 있었다. [1]


게다가 구글은 그 분야의 인수 및 인재 조달도 추진 중이다. 소형기기 제조엡체인 데인저(Danger)의 설립자이자 뒤에 휴대 전화용 소프트웨어 제조업체인 앤드로이드(Android)를 설립한 앤디 루빈(Andy Rubin)은 앤드로이드의 인수와 함께 2005년에 구글에 입사했다.

또한 구글은 모바일 애플리케이션 개발 기업인 레큐와이어리스(Reqwireless) 및 스키아(Skia)라는 기업도 인수했다. 스키아의 첫 제품은 휴대 기기로 2D 그래픽스를 렌더링하는 휴대용 그래픽 엔진이다.

 

안드로이드를 2005 8월에 인수하였고, Skia는 같은해 11월에 인수 하였다. [2]

 

안드로이드에서 GUI를 담당하는 중추 역할인 그래픽엔진임에도 관련 자료가 많이 없는 것 같다. 안드로이드가 openSource 이긴 한데, Skia 관련 자료가 부족한 이유는 google에서 주도적으로 개발하면서 관련된 문서 및 reference가 빈약하기 때문인 것 같다.

 

구글에서 제공하는 skiadocs page에서 약간의 정보를 찾을 수 있었다. [3]

Skia is a complete 2D graphic library for drawing Text, Geometries, and Images.

  • 3x3 matrices w/ perspective
  • antialiasing, transparency, filters
  • shaders, xfermodes, maskfilters, patheffects
  • subpixel text

Device backends for Skia currently include:

  • Raster
  • OpenGL
  • PDF
  • XPS
  • Picture (for recording and then playing back into another Canvas)

 

 

skia에도 GPU 를 직접 사용해서 hardware acceleration을 사용하는 구조가 있는데, 안드로이드 View System은 독자적인 GPU 지원 구조를 만들어서 사용하고 있다고 한다.

 

아래 그림은 안드로이드의 그래픽 서브 시스템을 도식화한 것이다. [4]

 

 

우리가 많이 사용하는 Canvas HWUISkia를 이용해서 Surface로 요청을 하는 구조이다. 3.0 이전에는 Skia로 다 처리되던 것이 3.0 이후부터는 성능 이슈로 인해서 skia 부분이 점점 HWUI로 대체되고 있다. HWUI 모듈은 GPU를 사용하는 UI component 이다. Android 3.0 부터 tablet에 대한 지원이 되었는데, tablet이 화면이 크다보니 기존에 사용하던 skia로는 animation이 매끄럽지 않아서  HWUIrenderscript 같은 것이 등장하게 된 것 이다.

 

Skia에 대해서 더 궁금한분은 직접 소스를 받아 보시길.. [5]

 

참고

[1] 신문기사: http://www.zdnet.co.kr/news/news_view.asp?artice_id=00000039156220&type=det

[2] http://academic.naver.com/view.nhn?doc_id=47296809&dir_id=0&page=0&query=Android%20skia&ndsCategoryId=20300

[3] 스키아 문서 : https://sites.google.com/site/skiadocs/home

[4] 안드로이드 그래픽 서브 시스템 : http://developer.mips.com/2012/04/11/learning-about-android-graphics-subsystem/

[5] skia 소스 : https://android.googlesource.com/platform/external/skia/

 

 

 



:

오픈소스 이용시 코드 공개 여부

개발 2013. 6. 3. 11:55

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

"한국저작권위원회" 라는것 이 있더군요.

여기서는 아래와 같이 개발할때 한번씩 체크해보면 좋을 유용한정보를 제공하고 있습니다.

각 라이선스 비교표 : http://www.olis.or.kr/ossw/license/compareGuide.do

1. APACHE, MIT, BDS 계열의 오픈소스를 이용할때는 코드 공개 의무가 없다고 하네요.

2. GNU 계열( GPLv2, GPLv3, LGPLv3 등) 은 배포시 소스코드를 제공해야 한다고 합니다.

 

또한 각 라이선스의 영문을 간략하게 요약하여 한글로 설명하고 있는 내용도 있습니다.

http://www.olis.or.kr/ossw/license/license/list.do?mapcode=010001

 

그외에도 오픈소스와 지적재산권및 라이선스에 관련하여 유용한 자료들이 있다.

http://www.olis.or.kr/ossw/license/licenseGuide.do

 

여기의 내용들을 읽어 봤는데도 잘 모르겠으면.. 직접 상담을 받을 수도 있다. ( 세금으로 운영되는 곳 같으니 적극적으로 이용하자~ ^^; )

http://www.olis.or.kr/ossw/consulting/consultingRequest/publicRequest.do

 

 



:

[주식용어] Small Cap 이란? small cap 투자 전략

정치&경제 2013. 6. 2. 00:49

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

각 증권사 별로 포트폴리오를 비교해 보고 있는데, 스몰캡이라는 용어가 자주 나온다.  멀까? 작은 모자인가?

 

네이버 백과 사전을 찾아 보니 아래와 같다.

Small Capital(소형주)의 약자로 스몰캡이라 부르며, 상장 또는 등록된 시가총액이 작은 회사들인 중소기업 주를 뜻한다. 반면 라지캡은 Large Capital의 약자로, 시가총액을 기준으로 기업을 분류했을 때 상위 그룹에 속하는 대형 기업들을 의미한다. 우리나라에서는 시가총액 상위 100위까지를 대형주(Large Cap), 상위 101위부터 300위까지를 중형주(Mid Cap), 나머지 종목을 소형주(Small Cap)로 분류한다.

그냥 소형주구나 ㅠㅠ

요즘은 middle small cap(중소형주) 에 관심을 가져야 할 때인가 봅니다. 위의 그림에서도 최근 3개월간의 수익율로 보면 중소형주로 구성된 포트폴리오가 4개나 순위에 올라와 있습니다.

 

이런 정보를 활용해서 개미가 할 수 있는 방법을 알려드립니다. ( 참고로, 최종 판단은 본인 스스로 )

 

1. 증권사의 포트폴리오 항목중 중복되는 항목에 투자한다.

   => 여러 증권사에서 구성한 포트폴리오에 중복으로 들어간 종목이라면 뭔가 좋은 이유나 타당한 이유가 있겠지 하는 생각으로 투자하는 방식입니다.

  => 아래의 표를 봐도 추천을 3개 이상받은 종목들의 3개월 수익율이 눈에 띄게 좋지는 않지만 그래도 은행이자보다는 높아 보입니다.  개별 종목에 따라서 이자대비 대박이라고 볼 수 있는 것도 있네요. 

 

2. 수익률이 괜찮은 포트폴리오의 항목을 선정하여 투자금을 N으로 나누어서 투자한다.

   => 코스피 200에 투자하는 인덱스 펀드를 따라하는 방식입니다. 인덱스 펀드의 구성 종목은 너무 많은니 증권사가 나름 추리고 추린 종목에 동승하는 전략입니다. 종목수가 몇개 안되니 직접 투자를 좋아하는 사람에게 좋은 방식입니다. 자연적으로 분산 투자도 하게 됩니다.

  => 좋은 case의 예 : 현대증권의 small cap 포트폴리오 구성 주식의 수익율    

  => 물론 않좋은 case의 증권사 포트폴리오도 있다. ^^;

 

 

 



:

[android] Volley - Network & ImageLoading 라이브러리 ( google I/O 2013 )

android 2013. 5. 31. 14:32

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Google I/O 2013에서 volley 라는 새로운 라이브러리를 발표했습니다. 주요 역할은 Http통신 및 이미지 로딩을 해주는 것입니다.

 

주요 특징

* requestQueue를 이용한 동시요청 처리

* 요청 우선순위 설정 가능 ( A요청이 B요청보다 먼저 응답을 받아야 할 경우 )

* 요청 취소 기능 ( adapter 같은 곳에서 scrolling 이 빠른경우 응답이 않왔을때는 취소가 필요하죠. )

* android 하위 버전(2.3)에서 존재하던 HttpURLConnection의 버그 해결

* NetworkImageView 제공

 

Google I/O의 발표영상

 

 

초간단 사용법

 

// 초기화

mQueue = Volley.newRequestQueue(context);// thread pool(4)

            

mImageLoader = new ImageLoader(mQueue, new BitmapCache());

기본으로 4개의 thread pool을 사용하게 되어 있다. 

 

 

// requestQueue 이용

final ImageView imageView = (ImageView) findViewById(R.id.image_view);

 

// clear

imageView.setImageBitmap(null);

 

// start load

Listener<Bitmap> listener = new Listener<Bitmap>() {

@Override

public void onResponse(Bitmap result) {

imageView.setImageBitmap(result);

}

};

 

ErrorListener errorListener = new ErrorListener() {

@Override

public void onErrorResponse(VolleyError error) {

       // error handling

       }

};

 

ImageRequest imageRequest = new ImageRequest(URL_IMAGE, listener, 0, 0, Config.ARGB_8888, errorListener);

imageRequest.setTag(TAG);

mQueue.add(imageRequest);

 ImageRequest를 생성해서 큐(queue)에 넣어주면 되는데, ImageRequest에  url과 성공, 실패시 처리할 리스터(listener)를 넘겨준다.

 

// NetworkImageView 이용

NetworkImageView imageView = (NetworkImageView) findViewById(R.id.network_image_view);

 

// clear

imageView.setImageUrl(null, null);

 

// start load

imageView.setImageUrl(URL_IMAGE, mImageLoader);

NetworkImageView는 정말 간단하다. 그냥 url 과 imageLoader만 넘겨주면 된다.  

 

// GET 호출 ( with parameter )

Listener<String> listener = new Listener<String>() {

                    @Override

                    public void onResponse(String result) {

                           // some action

                    }

             };

 

String uri = String.format("http://somesite.com/some_endpoint.php?param1=%1$s&param2=%2$s", num1, num2);

             StringRequest myReq = new StringRequest(Method.GET,

                    uri,

                    listener,

                    errorListener);

             mQueue.add(myReq);

GET 방식으로 이미지 호출이 아닌 api 호출해서 data를 받아 오는 경우도 흔하므로 위와 같이 StringRequest 이용해서 사용하면 된다. Parameter Get  방식이므로 url 전달하면 된다. ( Json 형식을 사용할땐, StringRequest 대신에 JsonRequest를 사용하면 된다. )

 

// POST 호출 ( with parameter )

StringRequest myReq = new StringRequest(Method.POST,

                    "http://somesite.com/some_endpoint.php",

                    listener,

                    errorListener) {

 

                    @Override

                    protected Map<String, String> getParams() throws com.android.volley.AuthFailureError {

                           Map<String, String> params = new HashMap<String, String>();

                           params.put("param1", num1);

                           params.put("param2", num2);

                           return params;

                    };

             };

             mQueue.add(myReq);

Post로 호출할 경우에는 StringRequestgetParams() 함수를 overriding 해주면 된다. 리턴형식으로 Map<String, String>을 사용하므로 여러 개의 파라미터를 전달 할 수 있다.

 

 

<참고>

valley : https://android.googlesource.com/platform/frameworks/volley

샘플 : https://github.com/ogrebgr/android_volley_examples

 

 

 



:

SharedPreferences 사용시 주의점

android 2013. 5. 24. 20:46

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

1. 가장 흔하게 실수하는 case

SharedPreferences preference = context.getSharedPreferences(PREFERENCE_FILE_NAME, Context.MODE_PRIVATE);

preference.edit().putBoolean(“testKey”, 10);

preference.edit().commit();

 

edit()를 각각 호출함으로써  editor A 에 값을 설정하고, editor B 를 커밋한 경우입니다. Edit() 설명을 보면 아래와 같습니다.

/**

     * Create a new Editor for these preferences, through which you can make

     * modifications to the data in the preferences and atomically commit those

     * changes back to the SharedPreferences object.

     *

     * <p>Note that you <em>must</em> call {@link Editor#commit} to have any

     * changes you perform in the Editor actually show up in the

     * SharedPreferences.

     *

     * @return Returns a new instance of the {@link Editor} interface, allowing

     * you to modify the values in this SharedPreferences object.

     */

    Editor edit();

리턴부분을 보면 new instance 라고 되어 있습니다. 즉 항상 새로운 editor instance를 반환하도록 되어 있습니다.  

 

2. Multi-process 환경에서

 

SharedPreferences를 이용하여 주로 설정값을 저장하는 용도로 사용하고 있습니다. 그런데 저장한 값이 읽어지지 않는 경우가 있었습니다. 더 정확하게는 예전의 값이 그대로 유지되는 경우입니다 

경험한 환경은 아래와 같습니다.

 

ProcessA에서 int 10을 씁니다 

SharedPreferences preference = context.getSharedPreferences(PREFERENCE_FILE_NAME, Context.MODE_PRIVATE);

Editor editor = preference.edit();

editor.putBoolean(“testKey”, 10);

editor.commit();

 

ProcessB에서 값을 읽습니다 ( 값이 않읽어진다. )

SharedPreferences preference = context.getSharedPreferences(PREFERENCE_FILE_NAME, Context.MODE_PRIVATE);

int localeIdx = preference.getInt(“testKey”, -1);

 

아래의 API 문서에서도 나와 있듯이 SharedPreferences는 process 사이에서 communication하기 좋은 방법입니다. 그런데 안된다 ㅠㅠ

API 문서를 찾아보니 아래와 같습니다 

public static final int MODE_MULTI_PROCESS

Added in API level 11

SharedPreference loading flag: when set, the file on disk will be checked for modification even if the shared preferences instance is already loaded in this process. This behavior is sometimes desired in cases where the application has multiple processes, all writing to the same SharedPreferences file. Generally there are better forms of communication between processes, though.

This was the legacy (but undocumented) behavior in and before Gingerbread (Android 2.3) and this flag is implied when targetting such releases. For applications targetting SDK versions greater than Android 2.3, this flag must be explicitly set if desired.

 

간단히 볼드부분을 번역하면 아래와 같습니다.

Gingerbread (Android2.3) 까지는 기본으로 MODE_MULTI_PROCESS가 설정되어 있었다.

Target SDK 버전이 Gingerbread (Android2.3) 보다 높으면 명시적으로 설정해야 된다.

( API level이 11 이므로 3.0 부터 사용하능하다는 이야기니까, 2.3 까지는 않써도 된다고 생각함. 그러나 버전 상관없이 다 동작하려면 항상 써주는게 좋다. )

결론은 아래처럼 변경하면 됩니다.

 

SharedPreferences preference = context.getSharedPreferences(PREFERENCE_FILE_NAME, Context.MODE_MULTI_PROCESS); // 여기

int localeIdx = preference.getInt(“testKey”, -1);

 

코드상으로는 MODE_PRIVATE | MODE_MULTI_PROCESS 이렇게 해주는 좋을것 같으나,

정의를 보면 MODE_PRIVATE 가 0으로 정의되어 있어서 그냥 MODE_MULTI_PROCESS 만 적어주었다.

 

public static final int MODE_PRIVATE = 0x0000;

public static final int MODE_MULTI_PROCESS = 0x0004;

 

참고 : http://developer.android.com/reference/android/content/Context.html#MODE_MULTI_PROCESS

 

 

 



: