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


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

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


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

http://kay.starian.kr/22


직접 적용을 원한다면,

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


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

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

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


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


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

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




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

2014 webkit meeting  (0) 2014.04.16
천사 가영.  (1) 2012.10.07
바다 손  (0) 2011.05.24
에버랜드 나무  (0) 2010.06.23
  1. 지나가요 2012.10.19 03:00

    정말 귀엽네요 :)

참고 자료

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

[목차로 이동] 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

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

(Enlightenment 17 설치하는 법)


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


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


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

sudo su

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

  1. 천재태지서주영 2012.09.01 21:47

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

    • 소혼 2012.09.03 20:46 신고

      메세지 나오길래 한번 더 해봤는데 되던데요? ㅎ


#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
참고 : 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만 보이는 것을 알 수 있다.


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

+ Recent posts