JavaScript 재귀함수 예시

Posted by ironmask84
2015. 7. 20. 14:39 나는 프로그래머다!/HTML5



<!DOCTYPE html>
<html>
<body id="start">
<ul>
    <li><a href="./532">html</a></li>
    <li><a href="./533">css</a></li>
    <li><a href="./534">JavaScript</a>
        <ul>
            <li><a href="./535">JavaScript Core</a></li>
            <li><a href="./536">DOM</a></li>
            <li><a href="./537">BOM</a></li>
        </ul>
    </li>
</ul>
<script>
function traverse(target, callback){
    if(target.nodeType === 1){        // ===으로 사용하는 것 주의 nodeType이 1이면, Element Node 이다.
                                                 // (http://ironmask84.net/admin/entry/post/?id=214 참고)
        //if(target.nodeName === 'A')    // a 태그만 추출
        callback(target);
        var c = target.childNodes;
        for(var i=0; i<c.length; i++){
            traverse(c[i], callback);       // 재귀함수 호출
        }  
    }
}
traverse(document.getElementById('start'), function(elem){
    console.log(elem);
});
</script>
</body>
</html>


 

jQuery 와 Element 객체와 Node 객체

Posted by ironmask84
2015. 7. 16. 10:09 나는 프로그래머다!/HTML5




그림 : http://web.stanford.edu/class/cs98si/slides/the-document-object-model.html

Element객체와 jQuery

document.getElementById : return type은 HTMLLIELement
document.getElementsByTagName : return type은 HTMLCollection (유사배열)
-> 실행결과가 하나인 경우 HTMLLIELement, 복수인 경우 HTMLCollection return
constructor 혹은 constructor.name 로 확인 가능

var li = document.getElementsByTagName('li');
var li2 = $(li);
위와같이 jQuery function 인 $(); 로 둘러싸면, return type이 jQuery 가 되지만,
복수일 경우 유사배열로 잡히며, li2[0], li2[1]... 각각은 HTMLLIELement 타입이 된다.
-> l1.constructor.name, li2.constructor.name, li2[0].constructor.name  로 확인 가능

document.getElementById('target').getAttribute(name);
==> ==> $('#target').attr(name);
document.getElementById('target').setAttribute(name, value) ;
==> $('#target').attr(name, value);

document.getElementById('target').hasAttribute(name);

document.getElementById('target').removeAttribute(name);
==> $('#target').removeattr(name);


Node 객체

Node.childNodes : 자식노드들을 유사배열에 담아서 리턴한다.
Node.firstChild : 첫번째 자식노드
Node.lastChild : 마지막 자식노드
Node.nextSibling : 다음 형제 노드
Node.previousSibling : 이전 형제 노드

** Node 와 Node.nextSibling.previousSibling는 같다.  (이런 식으로 Chaining 식으로 사용 가능)

Node.nodeType node의 타입을 의미한다.
Node.nodeName node의 이름 (태그명을 의미한다.)


** 2015_08_28 추가!

querySelector() 이용 시, 태그의 class 속성 접근 시 매우 편리

this.calls.querySelector('.handled-call.incoming .additionalContactInfo');
위와 같은 방식으로 calls라는 변수(어느 태그값을 가져온 변수 document.getElementById 등 이용) 하위에
태그들 중 
handled-call.incoming 클래스를 가진 녀석의 하위에 있는 녀석들 중 additionalContactInfo 클래스를 가진 녀석이 리턴된다.

'나는 프로그래머다! > HTML5' 카테고리의 다른 글

JavaScript - 이벤트 응용1 (버블링과 캡쳐링)  (0) 2015.07.28
JavaScript - 이벤트  (0) 2015.07.28
JavaScript에서의 객체와 객체지향  (0) 2015.07.22
JavaScript의 함수!!  (0) 2015.07.21
JavaScript 재귀함수 예시  (0) 2015.07.20
Attribute와 Property  (0) 2015.07.14
DOM Tree  (0) 2015.07.13
JQuery 초 간단 이해  (0) 2015.07.10
SublimeText2  (0) 2015.06.19
HTML 과 JavaScript 기본 참고 사이트  (0) 2015.06.19
 

Attribute와 Property

Posted by ironmask84
2015. 7. 14. 16:13 나는 프로그래머다!/HTML5


attribute(HTML의 속성) VS property(JavaScript의 속성)

$().attr(jQuery를 통해 attribute 제어) VS $().prop(jQuery를 통해 property 제어)
=> setAttribute(), getAttribute == $().attr
   removeAttribute() == $().removeAttr

* property 방식을 사용하는 것이 더 속도가 빠르다고 한다.
* 그렇다면, property를 사용하는 것이 더 장점이 있다는 뜻인데..

  하지만, attr에서 사용하는 이름과 약간 다른 부분이 있는 문제가 있다.

  이를 jQuery에서는 교정해주는 아주 훌륭한 기능이 있다.
  즉, 아래 둘다 같은 결과를 리턴하게 된다.
  $('#t1').prop('className', 'important'); // className는 property 방식
  $('#t1').prop('class', 'important');     // class는 attribute 방식

'나는 프로그래머다! > HTML5' 카테고리의 다른 글

JavaScript - 이벤트 응용1 (버블링과 캡쳐링)  (0) 2015.07.28
JavaScript - 이벤트  (0) 2015.07.28
JavaScript에서의 객체와 객체지향  (0) 2015.07.22
JavaScript의 함수!!  (0) 2015.07.21
JavaScript 재귀함수 예시  (0) 2015.07.20
jQuery 와 Element 객체와 Node 객체  (0) 2015.07.16
DOM Tree  (0) 2015.07.13
JQuery 초 간단 이해  (0) 2015.07.10
SublimeText2  (0) 2015.06.19
HTML 과 JavaScript 기본 참고 사이트  (0) 2015.06.19
 

DOM Tree

Posted by ironmask84
2015. 7. 13. 11:24 나는 프로그래머다!/HTML5


DOM Tree는 아래와 같다.


그림 : http://web.stanford.edu/class/cs98si/slides/the-document-object-model.html


ex) HTMLLIElement : http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/html.html#ID-74680021

* jQuery를 이용하면, 이러한 관계를 잘 몰라도 JavaScript 코딩이 수월하다.

즉, document.getElementById('ironmask').tagName 는 HTMLLIElement라는 객체를 반환합니다.
위 상수를 $()로 둘러싸게 되면, Jquery 타입을 갖게 됩니다.
아래처럼 대입해놓고, constructor 속성을 찍어보면 확연히 확인 가능합니다.


var sample = document.getElementById('ironmask').tagName
var j_sample = $(document.getElementById('ironmask').tagName)
console.log(sample.constructor)

 

JQuery 초 간단 이해

Posted by ironmask84
2015. 7. 10. 08:55 나는 프로그래머다!/HTML5


jQuery는 JavaScript에서 사용되는 편리하고 강력한 라이브러리 입니다.

자세한 내용은 아래 링크를 참고 하시면 됩니다. :)
-> http://jquery.com

* jQuery의 API 참고
->
https://api.jquery.com

jQuery를 이용하면 DOM을 사용하는 것 보다 훨씬 효율적으로 필요한 객체를 조회할 수 있고,
jQuery는 객체를 조회할 때 CSS 선택자를 이용합니다.


jQuery 라이브러리 사용 (jQuery’s CDN)
--> html 코드에 아래 코드를 추가하면 된다. :)
      <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>

jQuery의 기본 Syntax
$('CSS의 선택자').css('color', 'pink');

$('li').css('color', 'pink');
====================================================================================

 $()는 jQuery의 함수이다. 이 함수의 인자로 CSS 선택자(li)를 전달하면 jQuery 객체라는 것을 리턴한다. 이 객체는 선택자에 해당하는 엘리먼트를 제어하는 다양한 메소드를 가지고 있다. 위의 그림에서 css는 선택자에 해당하는 객체들의 style에 color:red로 변경한다.
====================================================================================

* jQuery에서 attr과 prop의 차이!!
-> attr은 html의 attribute 실제 값을 리턴, prop는 그에 매칭되는 JavaScript의 property값을 리턴


DOM과 jQuery의 비교 Sample
아래의 코드는 동일한 결과를 가져오는데,  jQuery가 훨씬 편리한 것을 알 수 있다.

1. DOM을 사용한 경우

            var lis = document.getElementsByTagName('li');
            for(var i=0; i<lis.length; i++){
                lis[i].style.color='pink';   
            }

2. jQuery를 사용한 경우 (jQuery에서는 아래 한 라인으로 암시적 반복이 수행된다.)

            $('li').css('color', 'pink')


jQuery의 Chaining 문법
아래의 Chaining 문법을 통해 여러가지의 css 설정 적용이 한 Line 에서 가능하다. (멋짐..)

         $('#active').css('color', 'red').css('textDecoration', 'underline');
/* active 라는 id를 가진 요소에 red와 underline을 적용 */


jQuery의 조회 범위 제한 문법
아래와 같이 여러가지 방법을 통해 범위 제한 및 CSS 적용이 Chaining가 가능하다.

1. $( ".marked", "#active").css( "background-color", "red" );
-> 여기서 "#active" 는 Selcetor context라고 한다. ".marked" 는 Selctor 이다.

2. $( "#active .marked").css( "background-color", "red" );
-> 1번과 같은 결과를 수행한다.  (id가 active 인 것중에서 클래스가 marked 인 것을 조회한다.)

3, $( "#active").find('.marked').css( "background-color", "red" );
-> 1,2번과 같은 결과를 가져오며 여기서는 .find() 메소드를 이용한 것

4. $('#active').css('color','blue').find('.marked').css( "background-color", "red" );
-> .find()를 이용하는 것의 장점은 Chainging 이 가능하기 때문!!




/* Javascript Sample */
console.info("hello world");

'나는 프로그래머다! > HTML5' 카테고리의 다른 글

JavaScript - 이벤트 응용1 (버블링과 캡쳐링)  (0) 2015.07.28
JavaScript - 이벤트  (0) 2015.07.28
JavaScript에서의 객체와 객체지향  (0) 2015.07.22
JavaScript의 함수!!  (0) 2015.07.21
JavaScript 재귀함수 예시  (0) 2015.07.20
jQuery 와 Element 객체와 Node 객체  (0) 2015.07.16
Attribute와 Property  (0) 2015.07.14
DOM Tree  (0) 2015.07.13
SublimeText2  (0) 2015.06.19
HTML 과 JavaScript 기본 참고 사이트  (0) 2015.06.19
 

SublimeText2

Posted by ironmask84
2015. 6. 19. 14:54 나는 프로그래머다!/HTML5


Sublime Text2 라는 Tool은 FFOS 프로젝트를 위한 HTML5 스터디를 위해 알게되었습니다.

이클립스 자동완성 기능의 맞을 알게된 저는 이 툴이 매우 편리하게 다가왔죠 ㅎㅎ

그리고 개인이 무료로 사용할 수 있는 훌륭한 Tool 입니다.

각설하고, 아래 간단한 사용법과 팁을 알려드립니다.

1. Tool 다운 Site : http://www.sublimetext.com/

2. Package control (for Plug in) Site : https://packagecontrol.io/
==> Emmet 플러그인 추천  
** 공식 사이트
http://docs.emmet.io/
https://github.com/sergeche/emmet-sublime

ex) html 파일 인 경우!
html:5 + Tab키
body>div + Tab키 , ul>li*20{item $} + Tab키, table>tr*10>td*5 + Tab키,

a[href="http://ironmask84.net"]>{ironmask's life} + Tab키, .title + Tab키 (div태그의 class로 자동 생성)

3. Sublime 많은 팁 Site (유용한 Plug 포함) : https://opentutorials.org/course/671/3595

제가 추천 드리는 기본적인 단축키
1. html:5 입력후 Tab키 누르면 기본적 html5 양식 출력

2. Ctrl + / : 한줄 주석달기 (html, script, css등 다 됩니다)

3. Ctrl + Shift + / : 요소별로 선택한 요소 전체 주석

4. Alt + Shift + 2, 3, 4 : 화면 영역 분할하기  (Ctrl + 1, 2, 3, 4 로 영역 포커싱 가능)

5. Ctrl + D : 현재 선택한 단어와 동일한 단어를 연속으로 선택 가능


아래는 타 블로그의 유익한 내용을 담아봤습니다. ^^


html 코딩 중에 브라우저로 바로 열기를 추가해 보겠습니다. 해당 기능은 플러그인으로 설치하는게 아니라 직접 코드를 만들어서 플러그인을 제작한 뒤에 단축키를 지정해줘야 합니다. 에디트플러스 쓰시는 분들은 Ctrl + B로 브라우저보기 할 수 있죠. 드림위버에는 F12가 있구요.


일단 메뉴의 Tools -> New Plugin을 누릅니다. 이상한 샘플 명령어들이 있는 파일 하나가 열립니다. 그곳에 아래 내용으로 덮어 씌우기를 합니다. 그리고 저장해 준뒤 파일을 닫습니다.


import sublime, sublime_plugin

import webbrowser


class OpenBrowserCommand(sublime_plugin.TextCommand):

    def run(self,edit): 

        url = self.view.file_name()

        webbrowser.open_new(url)


그런 뒤에 단축키를 지정해보죠. 단축키 지정은 Preference -> Key Bindings – User입니다. 지난 포스트에서 폰트 옵션을 지정한 것처럼 제가 지정한 단축키를 따로 저장하는 파일입니다. 파일이 열리면 아래의 코드를 복사해서 붙여넣어줍니다.


{ "keys": ["ctrl+b"], "command": "open_browser" }


저장한 뒤 파일을 닫아준뒤 html 파일 작업중에 Ctrl + B를 누르면 기본 브라우저로 html 파일이 열립니다. 그럼 말이 나온 김에 단축키에 대해 알아보겠습니다. 가장 많이 사용하는 단축키는 아래와 같습니다.


  • Shift + Del(Backspace) : 현재 커서가 있는 줄 완전 삭제
  • Ctrl + Del(Backspace) : 단어 단위로 삭제하기
  • Ctrl + Shift + D : 현재 커서가 있는 줄 아래로 현재 줄 복사
  • Ctrl + Shift + [, ]  : 태그 닫기와 열기
  • F11 : 전체화면모드


 

HTML 과 JavaScript 기본 참고 사이트

Posted by ironmask84
2015. 6. 19. 14:46 나는 프로그래머다!/HTML5


기본 강의 사이트
--> https://opentutorials.org/module/904/6619

sublimeText 사이트
--> http://www.sublimetext.com/

sublimeText Package 사이트
--> https://packagecontrol.io/

웹프로그래밍 전문 블로그
--> http://webdir.tistory.com/319

'나는 프로그래머다! > HTML5' 카테고리의 다른 글

JavaScript - 이벤트 응용1 (버블링과 캡쳐링)  (0) 2015.07.28
JavaScript - 이벤트  (0) 2015.07.28
JavaScript에서의 객체와 객체지향  (0) 2015.07.22
JavaScript의 함수!!  (0) 2015.07.21
JavaScript 재귀함수 예시  (0) 2015.07.20
jQuery 와 Element 객체와 Node 객체  (0) 2015.07.16
Attribute와 Property  (0) 2015.07.14
DOM Tree  (0) 2015.07.13
JQuery 초 간단 이해  (0) 2015.07.10
SublimeText2  (0) 2015.06.19
 

JNI & 예제

Posted by ironmask84
2013. 4. 1. 14:27 나는 프로그래머다!/Java & Android


JNI는 요 근래에 알개 되었다. C언의 요소들을 자바에서 사용하고자해서 찾아보것이 알개 된계기
JNI는 자바에서 C/C++로 구현되거나 자바에 비해 장점이라 할수 있는 것들을 사용할수 있개 해주는 것이다.

 native method라는 것을 구현화 함으로 C와 C++의 문법적 요소들을 가져와 쓰는 것이다.
이러한 장점에 비해 자바의 강점인 이식성과 네이티브 메소드들의 자바의  메소드들과 같은 보호를 장담하지 못한다는 단점이 있다.

 자료를 수집하려 들려본 블로그, 카페들 중에서는 이론상으로 C로 구현된 것들(API)을 모두 가져다 쓸수 있다고 표현한 분들도 있었지만 해보지 않아 장담할 수없어 아쉽다.

 첫 단계로 "Hello World"예제를 만드는 법을 설명하갰다.
테스트 환경은 윈도우 2003 R2, 자바 1.6  비쥬얼스트디오 6.0에서 하였다.

 먼저 HelloWorld.java다

=============================================================
public class HelloWorld {
 static
 {
  System.loadLibrary("HelloWorld");
  System.out.println("===library was loaded");
 }

 public native void printHelloWorld();
 public static void main(String[] args) throws Exception
 {
  new HelloWorld().printHelloWorld();
 }
}
=============================================================

위에서 static이라 구현해 준 부분은 자바소스가 실행될때 HelloWorld라는 라이브러리를 가져다 쓰갰다는 이야기가 된다.

 그리고 public native void printHelloWorld() 이부분이 C에서 구현해주고 사용할 메소드,함수의 선언 부분이다.

 위의 소스가 준비가 됬다면 이제는 javac 와 javah로 컴파일과 해더파일을 작성해주면 된다. 컴파일이 먼저 이루어져야 하겠고 javah뒤에는 확장자를 뺀 클래스 파일의 이름을 넣어 주면 된다.

위 그림과 같이 되갰으며 아무 매세지가 나오지 않으면 성공한것이다.


그럼 HelloWorld.h 해더 파일을 보갰다.

=============================================================
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    printHelloWorld
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_printHelloWorld
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
=============================================================

 javah로 만들어준 해더 파일이다. 이파일은 수정하면 안되며 c에서 구현해줄 함수의 선언 부를 볼수 가있다.
그럼 이 해더파일을 이용해 c파일을 만들갰다.

=============================================================
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>

JNIEXPORT void JNICALL Java_HelloWorld_printHelloWorld(JNIEnv *env, jobject obj)
{
 printf("Hello World!\n");
 return;
}
=============================================================

 이것이 c언어로 구현해 주어야 할 부분이다.
이소스는 비쥬얼 스트디오에서 DLL을 만들어주는 프로젝트를 만들어야 한다.
일단 jni.h파일과 만들어준 HelloWorld.h 파일을 인클루드해야 한다.
jni.h는 자바가 설치된 디렉토리 및에 있으며 비쥬얼 스트디오에서는 라이브러리 추가를 해주어야 한다.

 함수의 명은 Java_클래스명_자바에서 선언한 네이티브메소드명 이 되갰다.
이제 이소스를 DLL파일로 만들어 주었으면 작업공간의 가장 상위 폴더로 옯겨준다.

이제 실행을 해보자


이와 같은 결과가 나올것이다.

출처 : http://blog.naver.com/sysganda/30095941540 

 


 

make / 모듈 추가 방법

Posted by ironmask84
2013. 4. 1. 14:22 나는 프로그래머다!/Java & Android


테스트 라이브러리를 플랫폼에 추가하기
안드로이드는 config.mk 에서 각 프로젝트별 android.mk를 뒤져
빌드하는 형태로 구성되어 있다~


안드로이드 플랫폼내에 모듈이나 어플리케이션을 추가시키기 위해
별도의 mk 및 타겟 플랫폼 빌드환경을 구성하기에는 작업해야 하는 일이
많고, 안드로이드에 특화된 시뮬레이터, 서명 등의 문제가 발생할 여지가 있다.

(실제로 발생하는지는 모르겠다... -_-;)


아무튼 기 구성된 make 프로세스에 포함시켜 빌드하는게

가장 편한 방법이기에 해당내용을 정리해 본다. 


ex) helloworld 라는 공용라이브러리 추가하기


1. 테스트 라이브러리를 위한 폴더명 설정  "helloworld"

2. /frameworks/base/helloworld 폴더 추가(다른위치에 추가해도 됨)

3. /build/core/pathmap.mk 수정

pathmap.mk는 프레임워크의 각 서브항목에 대해 정의해둔 곳이다.

make 파일에서 FRAMEWORKS_BASE_SUBDIRS 를 찾아 마지막에 추가될

모듈(helloworld 추가)


#

# A list of all source roots under frameworks/base, which will be

# built into the android.jar.

#

FRAMEWORKS_BASE_SUBDIRS := \

$(addsuffix /java, \

   core \

   graphics \

   im \

   location \

   media \

   opengl \

   sax \

   telephony \

   wifi \

   vpn \

   keystore \

   helloworld \

)


4. 소스 복사 or 코딩

/frameworks/base/helloworld/libhelloworld/ 와 같은 폴더 생성 후 코딩 및 소스 추가


helloworld.h

namespace android {


class HelloWorldTest

{

public:

HelloWorldTest();

~HelloWorldTest();


void Test();

};

};


helloworld.cpp

#include "helloworld.h"

using namespace android;


void HelloWorldTest::Test()

{

return;

}



5. Android.mk 추가

LOCAL_PATH:= $(call my-dir)


include $(CLEAR_VARS)


#여기에 소스 목록을 등록

LOCAL_SRC_FILES:= \

helloworld.cpp


#여기에 사용하는 라이브러리들 등록

LOCAL_SHARED_LIBRARIES:= \

libui \

libcutils \

libutils


#출력 모듈명

LOCAL_MODULE:= libhelloworld

LOCAL_PRELINK_MODULE:= false


#링커 관련 플래그

ifeq ($(TARGET_OS)-$(TARGET_SIMULATOR),linux-true)

LOCAL_LDLIBS += -ldl

endif

 

#동적으로 참조할 라이브러리 추가

#에뮬레이터인 경우 libdl 을 동적참조

ifneq($(TARGET_SIMULATOR),true)

LOCAL_SHARED_LIBRARIES += libdl

endif


#헤더파일 위치

LOCAL_C_INCLUDES:= \

$(LOCAL_PATH)/include \

$(call include-path-for, graphics corecg)


#빌드방식

include $(BUILD_SHARED_LIBRARY)


6. 아웃풋 위치

out/target/product/generic/system/ 에 빌드방식에 따른 폴더가

정의되어 있다.


동적 라이브러리의 경우

out/target/product/generic/system/lib/

out/target/product/generic/obj/SHARED_LIBRARIES/xxxx/

out/target/procuct/generic/symbols/system/lib/

등이 출력 위치이다.



7. 주요 define 항목 설명

LOCAL_PRELINK_MODULE : 프리링크 활성화(true, false)


LOCAL_MODULE_TAGS : 타겟 시스템 설정을 위한 태그

이 값은 최상위의 /build/core/main.mk 에서 각 프로젝트를 빌드할때

사용되는 값으로 어플리케이션의 속성을 지정하게 된다.

설치 관련 정보나 보안 등급, 디버깅 여부 등의 설정이 이루어진다.

기본 값은 user 이다.


eng, user ,userdebug, optional


LOCAL_MODULE_CLASS

모듈의 등급을 지정하는 것으로 아래와 같은 값이 들어감

EXECUTABLES , JAVA_LIBRARIES , SHARED_LIBRARIES


LOCAL_PACKAGE_NAME

/packages/app/ 에 등록된 패키지들과 마찬가지로

패키지명으로 기본 os 에 포함될 패키지를 의미한다.


이름은 패키지의 디렉토리명과 동일해야 한다.

실제 패키지가 이미지에 포함되기 위해서는

build/target/product/generic.mk 에도 등록해야 

system.img에 패키지가 포함된다.



LOCAL_CERTIFICATE : 키 서명

설정되지 않으면 testkey가 사용되며, 해당 키에 대한 값은

/build/target/product/security/ 폴더에 pk8, x509.pem 파일이 존재한다.

이 파일의 이름이 키가 되고, 빌드시 해당 키를 사용한다고

이곳에 지정하게 된다.


테스트용 키를 생성하기 위한 mkkey.sh 스크립트도 포함하고 있다.


LOCAL_CFLAGS : C , C++ 관련 컴파일러 플래그

LOCAL_CPPFLAGS : C++ 관련 컴파일러 플래그

LOCAL_CXXFLAGS

일반적으로 gcc 관련 옵션사항을 기술한다.


기본 최적화 옵션

-O : 기본 최적화를 켠다.

-O2 : 모든 최적화를 켠다. 대부분 -O 보다 나은 선택이며, 일반적으로 사용됨.

-O3 : -O2 에 더해 추가 최적화를 켠다. 바이너리 사이즈가 증가하며 디버깅이 거의 불가능.

-Os : -O2 에 더해 사이즈 관련 최적화를 한다. 큰 어플리케이션에 유용하다.

-O2, -O3 보다 실행 속도가 빠른데, 로드 시간의 감소, 메모리 사용 및 캐쉬, 디스크 사용등

의 최적화가 이루어지기 때문이다.

-fomit-frame-pointer : x86 시스템에서 함수 호출과 관련한 스택포인터와 

이를 지시하는 프레임 포인터에 해당하는 작업을 하지 않는다. 

(각 인수들,  리턴 주소 등의 ebp 관련 레지스터 )

-march=<your_arch> 

-mtune=<your_arch>

-mcpu=<your_arch>

머신 컴파일 옵션으로 대상에 대해 최적화를 수행한다. 대상의 cpu 정보를 넣어주면 되며,

세개 모두 동일한 내용이며, -march 는 -mtune을 의미한다.

-mtune/-mcpu는 gcc 구버전에서 이용되었다. 

-pipe : 컴파일시 별도의 임시파일을 생성하지 않음.



TARGET_SIMULATOR : 대상 시뮬레이터여부 , true/false

TARGET_OS : 대상 os

TARGET_ARCH : 대상 아키텍처



LOCAL_LDLIBS : 링커 옵션

LOCAL_STATIC_LIBRARIES

LOCAL_SHAREDLIBRARIES


LOCAL_C_INCLUDES : include 폴더

LOCAL_CPP_EXTENSION : cpp 소스의 확장자. 기본값은 .cpp



빌드 규칙

include $(BUILD_PACKAGE)

include $(BUILD_EXECUTABLE)

include $(BUILD_SHARED_LIBRARY)

include $(BUILD_HOST_EXCUTABLE)

 

출처 : http://blog.daum.net/hopefullife/117

 

 

Failed to allocate memory: 8 에뮬레이터 실행시 에러 대처 방안

Posted by ironmask84
2012. 4. 26. 15:31 나는 프로그래머다!


AVD(에뮬레이터) 4.X 띄우다 보면 아래와 같은 에러가 나는 경우가 있습니다.

Failed to allocate memory: 8
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.




메모리 문제 때문에 발생하는 것인데요.

이클립스 설정 파일인 eclipse.ini 파일에서 잡는 메모리 영역보다 작게 잡아주면,

해결이 됩니다. 

즉, eclipse.ini 파일에서 xmx 메모리를 512로 잡았으면,
아래 그림의Device Ram Size를 512 이하로 잡아주시면 됩니다.





 

소스인사이트 팁들

Posted by ironmask84
2011. 1. 7. 10:26 나는 프로그래머다!


출처 : http://andstudy.springnote.com/pages/3778703

0.개요

본 문서는 안드로이드 스터디 모임에서 소스 인사이트를 통해 소스 코드 드라이빙을 하는 데

필요한 기능을 정리한 것이다.

 

1.자주 쓰는 기능

 

1.1 프로젝트 내 특정 심볼을 검색할 때?

F7

 

1.2 심볼이 검색이 안되는 경우는?

프로젝트 전체 파일들에 대해 lookup reference 기능을 이용해서 찾는다.(grep 명령어와 비슷)

ctrl + /

 

1.3 특정 단어(심볼)을 하이라이트 해서 보고 싶을 때?

shift + F8

 

아래 그림은 'coldboot' 함수를 하이라이트 한 것임.

si2.jpg

 

2.소스인사이트 세팅

 

2.1 소스인사이트에서 ARM assembly language 추가하기

안드로이드 소스 중 일부는 arm 기반의 어셈블리 파일로 되어 있다.

소스 인사이트의 기본 설정은 arm assembly에 대한 언어 정보가 추가되어 있지 않으므로

사용자가 별도로 추가해줘야 한다.

http://kaisyu.springnote.com/pages/1578764

 

2.2 소스인사이트 한글 주석 깨지는 걸 막는 매크로

인터넷 검색중 가장 깔끔한 방식인 듯 싶네요.

굳이 대화 상자 없이도 바로 입력 가능하게 하다니.. (정말 이 친구 아이디어 죽이네요 ^^)

출처 : http://blog.daum.net/bluebread

 

1. DoNoting() 이라는 macro를 만들어 추가한다. 진짜로 아무일도 하지 않는 걸로.
    macro DoNothing()
    {
    }
2. Option > Key Assignment 을 선택한다.
3. Macro: DoNothing 선택후에 Assign New Key를 누르고 다음의 키조합을 입력한다.
    Shift + 한/영 (황당한 조합이지만 먹힌다.)
4. 화면에 "shift+ " 로 표시되면 들어간 것이다.
5. 완료!!

이후로 아무 것도 해줄 필요가 없다.
그냥 메모장 쓰듯이 한글입력하면 된다. 쌍자음 그냥 입력해도 안 깨진다.

 

2.2 전체 file path를 보여주게끔 설정하기

소스 인사이트는 기본적으로 긴 파일 path를 ...으로 축약해서 보여준다.

소스 분석시 파일 경로를 제대로 아는 것은 매우 중요하다.

다음과 같은 설정으로 긴 파일 path를 정확하게 볼 수 있다.

 

si1.jpg

위의 그림과 같이 Trim long path names with ellipses 체크를 지우기.

 

2.3 떠 있는 창을 10개이내로 제한하기

http://www.ericstory.com/tag/Source%20Insight

 

 

3 단축키

1. Ctrl + = 또는 Ctrl + 왼쪽 마우스 버튼

=> 변수 및 함수에 커서를 위치시키고 이 키를 누르면 해당 선언문으로 이동 및 확인 할 수 있다.

 

2. Ctrl + 0

=> 우측 파일창으로 이동한다.

 

3. Alt + L

=> 좌측 함수창으로 이동한다.

 

4. F7 키

=> 프로젝트 전체에서 특정함수나 변수등을 찾기 위해 사용

 

5. F8 키

=> 현재 파일에서 특정함수나 변수등을 찾기 위해 사용

 

6. F5 키 (라인수 입력창)

=> 해당 라인으로 이동.

 

7. Alt + < or >

=> 이전/이후에 커서가 위치했던 곳으로 이동.

 

8. Ctrl + f, F3, F4

=> ctrl + f : 현재 파일 내에서 검색

   F3 : 이전 검색 부분 이동

   F4 : 다음 검색 부분 이동

 

9. Alt + 드래그

=> 블럭 단위로 선택.(라인 선택 아님)

 

10. Ctrl + L

=> 라인 번호 표시

 

11. Ctrl + M

=> bookmark

 

12. Ctrl + H

=> replace

 

Ctrl+W(or w): close the current file
Ctrl+Shift+W(or w) : close all the files
Ctrl+S(or s): save the current file
Ctrl+A(or a): save all the files
F3/F4: search backward/forward
Shift+F3/F4: search back/forward for the current word under cursor

 

Ctrl + =
해당심볼의 선언부로 이동한다. 사용함수,변수의 선언부로 이동시 편리

Ctrl + /
해당심볼로 프로젝트 전체범위로 검색

Shift + F9
검색결과에서 다음검색으로 이동한다.

Ctrl + ,
이전편집장소로 이동

F7
프로젝트 내 심볼 검색 및 이동

F8
파일 내 심볼 검색 및 이동

Shift + F8
파일심볼창 보이기/숨기기

 

VC++ 디버깅 시 중단점 적용이 안된다고 할 경우

Posted by ironmask84
2010. 12. 6. 15:16 나는 프로그래머다!


VC 에서 자주 발생하는 "중단점이 적중되지 않았습니다." 오류는

멍청한 VC 의 유니코드 버그로써, 한글을 제대로 인식하지 못하여 나타나는 현상이다.

 

해결책으로는 도구 -> 옵션 -> 디버깅 -> 일반 에서 "소스 파일이 원래 버전과 정확하게 일치해야 함" 체크를 해제한다.

이 경우 한가지 주의사항이 있는데

컴파일시에 링크되는 라이브러리의 버전이 달라도 디버깅이 진행 되어버리는 어처구니없는 현상이 생긴다.

예를들면 A 라이브러리를 새로 컴파일 했지만, 깜빡잊고 파일카피를 안했다거나 전달을 안했다거나 어쨋든 미스가 발생했다치자

그러나 디버깅 할때는 A 라이브러리의 소스가 최신버전이다.

그럼 새롭게 추가된부분, 변경된 부분, 누락된부분을 실행하게되면 컴파일러가 에러를 내거나(이 경우는 오히려 다행...)

아니면 엉뚱한 전개가 펼쳐진다.

아주 미묘하게 엉뚱해지면 흔히 말하는 삽질이라는 것을 해야한다.

 

뭐....엄청나게 복잡한 프로젝트가 아니면 거의 상관없으니 안심하고 쓰자... 고 하는데 음...


--- 이 맘때 쯤 회사에서 폰개발 프로젝트에 VS C++ 2005를 쓰고 있었다...  ---


 

Cygwin 관련 팁들

Posted by ironmask84
2010. 12. 2. 16:39 나는 프로그래머다!





윈도우 환경에서 linux 기반 크로스컴파일 개발환경으로 쓰이는 것이 Cygwin인데요.

간단한 팁들 공유합니다.


setup.exe를 실행시킨 후 "Select Packages" 단계에서

Base Category 안의 cygwin 패키지를 확인해 보셔도 되고,

Cygwin을 실행시키고 다음 명령을 내려서 확인하셔도 됩니다.

$ uname -a

CYGWIN_NT-5.0 w2kbox 1.5.13(0.122/4/2) 2005-03-01 11:01 i686 unknown unknown Cygwin

혹은 cygcheck 명령을 써도 됩니다.

$ cygcheck -s | less

...

   Cygwin DLL version info:
       DLL version: 1.5.13
       DLL epoch: 19
       DLL bad signal mask: 19005
       DLL old termios: 5
       DLL malloc env: 28
       API major: 0
       API minor: 122
       Shared data: 4
       DLL identifier: cygwin1

============================================================

cygwin 삭제 방법

 

공식 사이트(http://cygwin.com) FAQ에 적힌 내용을 보면...

 

1. cygwin 폴더를 지운다. 안지워 질때는 시그윈이 사용중임으로 사용중인 시그윈을 모두 종료한다.

 

2. 레지스터를 지운다. 다음 두군데에서

    [HKEY_LOCAL_MACHINE\SOFTWARE]

    [HKEY_USERS]

    안에 Cygnus Solutions 키를 지운다.

 

3. 윈도우에 있는 바로가기를 지운다.


이렇게 한다고 합니다.