간만에 블로깅을 하면서, 옛날에 설정해놨던 syntax highlighter관련 코드들이 스킨 변경으로 날라간걸 알게 되었다.


간만에 다시 설정하려고 하다가 CDN이 없을까 검색해 봤는데

이미 고마운 분이 간단하게 적용할 수 있는 스크립트를 제공하고 있었다.


적용 방법은 아래 주소를  참조.

http://kay.starian.kr/22


직접 적용을 원한다면,

Syntax highlighter 주소 : http://alexgorbatchev.com/SyntaxHighlighter/


Posted by 소혼

댓글을 달아 주세요

virtual키워드를 사용해 child 객체의 메소드들을 호출할 수 있다는 것은 C++을 공부한 사람이라면 다들 알고 있는 사항이다.

예를 들어, 아래의 코드에서는 child의 call method가 호출된다.

### c++

class parent {

public: 

    virtual void call();

};

class child : public parent {

public:

    void call();

};

int main()

{

    parent* p = new child;

    p->call(); // child의 call이 호출됨

}



그렇다면 child의 instance는 virtual로 선언된 메소드들에 대해서 항상 child를 호출하는가?

오늘 그렇지 않다는 것을 배웠다.


아래 예제를 보자.

### c++

#include <stdio.h>

static void externalCall();

class A
{
public:
    A() {
        printf("In Constructor A\n");
        call();
    }
    virtual ~A() {
        printf("In Destructor A\n");
        call();
        externalCall();
    }
    virtual void call() {
        printf("    Call A is called\n");
    }
    void callFromA() {
        printf(" > In %s \n", __func__);
        call();
    }
};

class B : public A
{
public:
    B() {
        printf("In Constructor B\n");
        call();
    }
    ~B() {
        printf("In Destructor B\n");
        call();
        externalCall();
    }
    void call() {
        printf("    Call B is called\n");
    }
};

static A* global;

static void externalCall()
{
    printf(" > In %s \n", __func__);
    global->call();
}

int main()
{
    A* local = new B;
    printf("In %s \n", __func__);
    local->call();
    local->callFromA();

    global = local;
    externalCall();

    delete local;
}



위 예제를 실행해보면 재밌는 결과를 얻을 수 있다.

In Constructor A ---- 1
    Call A is called
In Constructor B
    Call B is called
In main  ---- 2
    Call B is called
 > In callFromA
    Call B is called
 > In externalCall
    Call B is called
In Destructor B ---- 3
    Call B is called
 > In externalCall
    Call B is called
In Destructor A
    Call A is called
 > In externalCall
    Call A is called


1. 실행 결과에서 먼저 생성자의 호출 순서를 알 수 있다.

생성자의 경우 부모클래스(A)의 생성자가 호출된 후, 자식 클래스(B)의 생성자가 호출된다.

이 때, 자식 클래스의 생성자가 호출되기 이전에 부른 call method는 부모 클래스의 method가 호출됨을 알 수 있다.


2. main에서는 예측한 것과 같이 자식 클래스(B)의 method만이 호출됨을 알 수 있다.

설령, 부모클래스의 메소드를 거쳐서 호출하더라도(callFromA) 자식 클래스의 인스턴스이기 때문에 자식 클래스의 메소드가 호출된다.


3. destructor의 호출 순서는 생성자의 경우와 반대로 자식 클래스의 소멸자 -> 부모클래스의 소멸자 순으로 불린다.

이 때, 자식 클래스의 소멸자 안에서 호출한 call method는 자식 클래스(B)의 메소드가 불린 반면,

부모 클래스(A)의 소멸자 안에서는 자식 클래스(B)의 call method가 아닌, 부모 클래스(A)의 call method가 불린 것을 알 수 있다.


externalCall의 결과만 보면 자식 클래스(B)의 소멸자에서 불릴때와 부모클래스(A)의 소멸자에서 불릴때 다른 메소드가 불리게 된다는 것을 알 수 있다.

소멸자가 부른 외부 함수(또는 다른 클래스의 함수)가 이를 모르고 호출할 경우, 의도하지 않은 동작을 할 수도 있기 때문에,

소멸자가 호출하는 함수가 다시 자신의 메소드를 호출하지 않도록 주의할 필요가 있을 것 같다.


PS>

쓰고 보니 이미 Effective C++에서 다루고 있는 내용이었다.

다시 읽어봐야겠다. ㅠ_ㅠ


http://www.artima.com/cppsource/nevercall.html

Posted by 소혼

댓글을 달아 주세요

디펜던시 있는 바이너리 사이즈들의 총합을 구하는 기능을 짜보려다가 포기

개발 환경에서 파이썬만 지원해줘도 이런 뻘짓을 안할텐데 ㅠㅠ


일단 ldd에서 나온 결과를 파싱하려고 생각했는데 너무 어렵다.


문자열과 관련된 자료 : http://linuxian.innori.com/15

문자열에서 특정 기호들을 짤라서 파싱하는 예제 : http://stackoverflow.com/questions/1617771/splitting-string-into-array


Posted by 소혼

댓글을 달아 주세요



'Life is... > Photo-Diary' 카테고리의 다른 글

2014 webkit meeting  (0) 2014.04.16
천사 가영.  (1) 2012.10.07
바다 손  (0) 2011.05.24
에버랜드 나무  (0) 2010.06.23
Posted by 소혼

댓글을 달아 주세요

  1. 지나가요 2012.10.19 03:00 Address Modify/Delete Reply

    정말 귀엽네요 :)

참고 자료

post comparing configure+make, cmake+make, and cmake+ninja

http://martine.github.com/ninja/manual.html


CMake 2.8.9 가 릴리즈 되었습니다.


 2.8.9의 Major change 중 하나는 Ninja가 기본으로 들어갔다는 사실입니다.

http://www.kitware.com/news/home/browse/CMake?2012_08_09&CMake+2.8.9+is+Now+Available%21



Ninja build는 빌드를 빠르게 하기 위한 툴입니다. 얼마나 빠른지는 post comparing configure+make, cmake+make, and cmake+ninja 를 참고하시면 됩니다.


현재 Ninja는 GYP와 CMake에서 지원됩니다.

CMake에서 사용하는 방법(리눅스)을 공유해보도록 하겠습니다.


1. Ninja 실행 파일 만들기

git clone git://github.com/martine/ninja.git

cd ninja

./bootstrap.py


>> ninja 파일이 생성된 것을 알 수 있습니다.

이 파일을 적절한 path에 복사합니다( /usr/local/bin )


2. cmake 2.8.9 설치

http://cmake.org/cmake/resources/software.html 에서 다운로드 받으실 수 있습니다.


3. 본인의 프로젝트에서 아래 명령 실행

mkdir bulid-dir

cd build-dir

cmake .. -G Ninja

ninja


>> 특이한 점은 make대신 ninja를 실행한다는 점입니다.

작은 규모의 프로젝트라고 해도 어마어마한 빌드속도를 경험하실 수 있습니다.


이 글이 도움이 되셨다면 아래 손가락을 눌러주세요.


'Open Source > cmake' 카테고리의 다른 글

CMake build with ninja  (0) 2012.09.25
[번역] CMake FAQ  (0) 2011.08.18
[CMAKE] File 다루기  (0) 2011.05.30
[cmake] 2. Hello with two files.  (0) 2011.04.12
[cmake] 목차  (0) 2011.04.12
[cmake] 2. Hello  (0) 2011.04.12
Posted by 소혼

댓글을 달아 주세요

[목차로 이동] Enlightenment Foundation Language


focus 테스트를 위해 [EFL] 3. Simple Application using Evas. 를 가지고 간단한 이벤트 테스트를 해보기로 했습니다

컴파일은 아래와 같이 하면 됩니다.
gcc -c simple simple.c `pkg-config --cflags --libs evas ecore-evas`


결론:

  - evas_object에서는 focus를 수동으로 옮겨주어야 한다.

    (elementary는 아님)


source code

#include <Evas.h>
#include <Ecore_Evas.h>
#include <stdio.h>

static void on_mouse_down(void* data, Evas* e, Evas_Object* o, void* event_info)
{
    printf("%s : %p\n", __func__, o);
}

static void on_focus_in(void* data, Evas* e, Evas_Object* o, void* event_info)
{
    printf("%s : %p\n", __func__, o);
}

static void on_focus_out(void* data, Evas* e, Evas_Object* o, void* event_info)
{
    printf("%s : %p\n", __func__, o);
}

int main()
{
    Evas* evas;
    Ecore_Evas* window;
    Evas_Object* rect2;
    Evas_Object* rect3;

    evas_init();
    ecore_init();
    ecore_evas_init();

    window = ecore_evas_new(NULL, 0, 0, 800, 600, NULL);
    evas = ecore_evas_get(window);
    ecore_evas_show(window);

    rect2 = evas_object_rectangle_add(evas);
    evas_object_color_set(rect2, 255, 0, 0,255);
    evas_object_move(rect2, 100, 100);
    evas_object_resize(rect2, 200, 200);
    evas_object_show(rect2);

    evas_object_event_callback_add(rect2, EVAS_CALLBACK_MOUSE_DOWN, on_mouse_down, NULL);
    evas_object_event_callback_add(rect2, EVAS_CALLBACK_FOCUS_IN, on_focus_in, NULL);
    evas_object_event_callback_add(rect2, EVAS_CALLBACK_FOCUS_OUT, on_focus_out, NULL);
    printf("rect2 is added : %p\n", rect2);

    rect3 = evas_object_rectangle_add(evas);
    evas_object_color_set(rect3, 0, 255, 0,255);
    evas_object_move(rect3, 400, 100);
    evas_object_resize(rect3, 200, 200);
    evas_object_show(rect3);

    evas_object_event_callback_add(rect3, EVAS_CALLBACK_MOUSE_DOWN, on_mouse_down, NULL);
    evas_object_event_callback_add(rect3, EVAS_CALLBACK_FOCUS_IN, on_focus_in, NULL);
    evas_object_event_callback_add(rect3, EVAS_CALLBACK_FOCUS_OUT, on_focus_out, NULL);
    printf("rect3 is added : %p\n", rect3);

    ecore_main_loop_begin();

    ecore_evas_shutdown();
    ecore_shutdown();
    evas_shutdown();

    return 0;
}

'Open Source > EFL' 카테고리의 다른 글

[TIZEN] Tizen App store 등록하기  (0) 2013.08.01
[EFL] EFL build on ubuntu (13.04)  (1) 2013.07.24
Simple event test(mouse down/focus) using Evas  (0) 2012.09.03
[ecore] screen size 얻기  (0) 2012.08.15
[Elementary] 기본 코드  (0) 2012.08.04
[EFL] How to build EFL on Ubuntu.  (0) 2012.02.21
Posted by 소혼
TAG EFL, Evas

댓글을 달아 주세요

E17 을 써보려고 ppa을 추가하는데 프록시 때문인지 잘 안된다.

(Enlightenment 17 설치하는 법)


보통 아래 명령을 가이드하는데,


sudo add-apt-repository ppa:user/ppa-name


이 대신 아래 문장을 써서 해결.

sudo su

add-apt-repository ppa:user/ppa-name

Posted by 소혼

댓글을 달아 주세요

  1. 천재태지서주영 2012.09.01 21:47 Address Modify/Delete Reply

    ppa 추가하고 설치도 잘 되나요?
    apt-get update하니 sum이 안맞는다던가 hash 사이즈가 다르다고 나와서 결국 설치를 못했어요.


#include <stdio.h>
#include <ecore_x.h>

int main()
{
    ecore_x_init(0);
    Ecore_X_Screen* screen = ecore_x_default_screen_get();
    if (!screen) {
        printf("Error\n");
    }

    int w, h;
    ecore_x_screen_size_get(screen, &w, &h);
    printf("%d, %d\n", w, h);
    return 0;
}

ecore_x_init이 되어있지 않으면

ecore_x_default_screen은  crash가 난다.

'Open Source > EFL' 카테고리의 다른 글

[EFL] EFL build on ubuntu (13.04)  (1) 2013.07.24
Simple event test(mouse down/focus) using Evas  (0) 2012.09.03
[ecore] screen size 얻기  (0) 2012.08.15
[Elementary] 기본 코드  (0) 2012.08.04
[EFL] How to build EFL on Ubuntu.  (0) 2012.02.21
SNAPSHOT of 2011/07/05  (0) 2011.07.06
Posted by 소혼
TAG ecore, EFL

댓글을 달아 주세요

참고 : http://korea.gnu.org/manual/release/ld/ld-sjp/ld-ko_2.html
참고2: http://studyfoss.egloos.com/5254916
참고3: http://stackoverflow.com/questions/8129782/version-script-and-hidden-visibility

gcc 옵션 중 version script라는 게 있다는 사실을 알았다.

정확히는 ld 옵션이기 때문에 gcc에서 옵션을 줄 때는

-Wl,--version-script=파일 경로

의 형태를 가져야 한다.

참고2에서는 버전 관리를 위해 사용했으나,
버전 관리 뿐 아니라 심볼 개수를 줄이는 용도로도 활용이 가능한가 보다.

예컨데,

// t.c

int __attribute__((visibility("default"))) foo() { return 1; }
int bar() { return 2; }
int __attribute__((visibility("default"))) exported() { return 3; }

// t.lds

{
  global
: exported;
  local
: *;
};


gcc t
.c -Wl,--version-script=t.lds -fPIC -shared -o t.so && nm -D t.so
                 w _Jv_RegisterClasses
                 w __cxa_finalize
                 w __gmon_start__
00000000000004f2 T exported

visibility가 default인 값은 두개지만, 그중 exported만 보이는 것을 알 수 있다.

Posted by 소혼
TAG gcc, 옵션

댓글을 달아 주세요


Elementary widget들을 위한 토대가 되는 코드입니다.


- 기본 window를 하나 만들고(elm_win_add), 

   * 거기에 title을 추가하고(elm_win_title_set)

   * signal을 연결하고(evas_object_smart_callback_add)

   * 윈도우 종료시, 자동으로 해제되도록 설정한다.(elm_win_autodel_set)

- back ground widget 을 만들어(elm_bg_add),

  * weight를 EXPAND로 줘서 커질 수 있게 하고,

  * 색을 파란색으로 칠하고(elm_bg_color_set)

  * win이 resize될 때 리사이즈되도록 설정하고(elm_win_resize_object_add)

  * 보여준다.(evas_object_show)

- elm_run으로 loop를 돌리고,

- (elm_exit로 인해,) loop가 종료되면 elm_shutdown으로 elementary를 정리한다.



코드

#include <elementary.h드>
#include <stdio.h>

void on_done(void *userData, Evas_Object *webView, void *eventInfo)
{
    elm_exit();
}

int elm_main(int argc, char **argv)                                                     
{   
    Evas_Object* win;                                                                   
    win = elm_win_add(NULL, "sample", ELM_WIN_BASIC);                                   
    elm_win_title_set(win, "sample");                                                   
    evas_object_smart_callback_add(win, "delete,request", on_done, NULL);               
    elm_win_autodel_set(win, EINA_TRUE);                                                
    
    Evas_Object* bg = elm_bg_add(win);                                                  
    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);           
    elm_bg_color_set(bg, 0, 0, 255);
    elm_win_resize_object_add(win, bg);                                                 
    evas_object_show(bg);
    
    evas_object_resize(win, 400, 400);                                                  
    evas_object_show(win);
    
    elm_run();                                                                          
    elm_shutdown();
    return 0;
}

ELM_MAIN()
.

빌드 명령

gcc sample.cpp `pkg-config --cflags --libs elementary`


실행 결과



약간의 설명


'Open Source > EFL' 카테고리의 다른 글

Simple event test(mouse down/focus) using Evas  (0) 2012.09.03
[ecore] screen size 얻기  (0) 2012.08.15
[Elementary] 기본 코드  (0) 2012.08.04
[EFL] How to build EFL on Ubuntu.  (0) 2012.02.21
SNAPSHOT of 2011/07/05  (0) 2011.07.06
EFL에서 자주 쓰는 환경 변수  (0) 2011.06.02
Posted by 소혼

댓글을 달아 주세요