김세훈
Clunix Wiki
(버전 사이의 차이)
(→하둡) |
(→자바 상식 (0513)) |
||
(한 사용자의 중간의 편집 46개 숨겨짐) | |||
1번째 줄: | 1번째 줄: | ||
+ | = 자바 = | ||
+ | *'''객체, 인스턴스 , 클래스, 타입에 대해...''' | ||
+ | ** 객체와 인스턴스는 동일한 개념. | ||
+ | ** 객체와 클래스의 차이는, | ||
+ | *** 클래스는 '''사용자 정의 타입''' | ||
+ | *** 객체는 '''그 타입을 가진 실제 변수''' | ||
+ | int a, b; | ||
+ | 이럴 때, '''a, b는 int라는 타입의 변수'''입니다...비슷하게 | ||
+ | class Test | ||
+ | { | ||
+ | ... | ||
+ | } | ||
+ | Test t; | ||
+ | 이렇게 하면 '''t는 Test라는 클래스의 객체''' | ||
+ | 일종의 구조체라고 생각하는게 이해하기 쉬울 거 같다. | ||
+ | * '''객체, 인스턴스 , 클래스, 타입에 대해...''' (계속) | ||
+ | ** 클래스는 결국 일종의 '''타입'''이며 단지 int, char, long등의 컴파일러가 기본적으로 제공하는 타입(이런 것들을 '''built-in type'''이라고 부른다. 우리말로 하자면 '내재 형- '''이미 만들어진 것'''' 이라고 할 수 있죠)과 달리 여러 가지 객체 지향적인 특성들을 가지고 있을 뿐. | ||
+ | ** 즉, 객체 역시 일반 변수와 거의 비슷하며 단지 클래스 변수이기 때문에 '''클래스의 특징을 가졌다는 차이가 있을 뿐'''. | ||
+ | ** 인스턴스는 '스타크래프트'에 비유해볼 수 있다. | ||
+ | *** 프로토스에서도 여러 유닛이 있는데 그것들을 하나의 클래스라고 부를 수 있다. (각각의 기능과 특징이 저마다 다르게 구현돼있는 '''클래스''') | ||
+ | *** 하지만 질럿 하나가 마우스의 클릭하는 곳을 향해 움직이고 있을 때, 그 때의 질럿은 '''인스턴스'''라고 말할 수 있다. | ||
+ | *** 즉, ''' 클래스는 개념속에 있는 것이고, 인스턴스는 현재 존재하고 있는 것'''이다. 객체로 만들어진 녀석들이 바로 '''인스턴스'''!!! | ||
+ | * 변수 선언할 때, | ||
+ | ** String s = new String("테스트") -> 이럴 땐, s를 호출할 때마다 쓸데없이 String인스턴스를 생성한다. (x) | ||
+ | ** String s = "테스트" -> 매번 생성하지 않도록 되어있는 방법이다. 즉 l-value에 타입값이 명시돼있다면 r-value에 클래스타입을 적지 않아도 된다. | ||
+ | ==자바의 개념, 확실하게== | ||
+ | * 자바는 특별히 '''인터넷의 분산환경'''에서 사용되도록 설계된 프로그래밍 언어이다. | ||
+ | ** 자바는 C++ 언어처럼 보이지만, C++ 보다는 사용하기에 간단하고 프로그래밍의 '''완전한 객체지향성을 강화'''하였다. | ||
+ | ** 자바는 한 대의 컴퓨터나, 네트웍 상의 분산 클라이언트/서버 환경에서도 실행되는 응용프로그램을 만드는데 모두 사용될 수 있다. 이것은 또한 웹페이지의 일부로서 쓰이는 작은 응용프로그램 모듈이나 애플릿 등을 만드는 데에도 사용될 수 있다. '''애플릿'''들은 사용자들이 웹페이지를 통해 상호작용을 할 수 있도록 해준다. | ||
+ | |||
+ | *자바의 주요 특성들을 요약하면 다음과 같다. | ||
+ | ** 사용자가 만드는 프로그램들은 네트웍 상에서 '''쉽게 이식이 가능'''하다. | ||
+ | *** 사용자가 개발한 프로그램은 자바 가상머신이 설치된 서버나 클라이언트 등 네트웍의 어디에서든지 실행될 수 있도록, '''자바 바이트코드'''로 컴파일된다. | ||
+ | *** '''자바 가상머신'''은 바이트코드를 실제 컴퓨터 하드웨어에서 실행될 수 있는 코드로 해석한다. 이것은 명령어의 길이 등, 개별 컴퓨터 플랫폼간의 차이가 인식되고, 프로그램이 실행되어지고 있는 바로 그 위치에서 국부적(부분적)으로 조정될 수 있다는 것을 의미한다. 특정한 플랫폼에 맞는 프로그램 버전은 더 이상 필요하지 않다. | ||
+ | ** 자바코드는 '''"튼튼하다"'''. | ||
+ | *** 즉, 이것은 C++나 기타 다른 언어로 작성된 프로그램들과는 달리, 자바 객체들은 '''외부 데이터로부터 내부 또는 알려진 다른 객체들로 향하는 참조를 포함하지 않을 수 있다는 것을 의미'''한다. | ||
+ | *** 이것은 명령어가 다른 응용프로그램이나 운영체계 그 자체 내에 있는 '''데이터 저장소의 주소를 포함하지 않음을 보장함'''으로써, 그 프로그램이나 운영체계의 실행이 중단되거나 고장을 일으키지 않게 한다. 자바 가상머신은 각 객체에 대해 무결성을 보장하기 위해 여러 번의 검사를 실시한다. | ||
+ | ** 자바는 객체지향적이다. | ||
+ | *** 이는 다른 특성들 가운데, '''비슷한 객체들은 같은 클래스의 일부가 되고 공통 코드를 상속하는 등의 장점'''을 취할 수 있다는 것을 의미한다.('''아주중요!!!''') | ||
+ | *** 객체들은 전통적이고 절차적인 '''"동사"'''와 관계 있기보다, 사용자에게 '''"명사"(갖다 붙이면 얼추 되는 것)'''와 관계 있는 것으로 생각하게 한다. 메쏘드는 객체의 능력이나 행동 중의 하나로 생각할 수 있다. | ||
+ | *** 서버가 아닌 클라이언트에서 실행되는 것 외에도, 자바 애플릿은 빠르게 실행되기 위해 설계된 다른 특성들을 가진다. | ||
+ | *** C++에 비해 자바는 배우기 쉽다(?) (그러나, 물론 하룻밤새 배울 수 있는 것은 아니다). | ||
+ | |||
+ | * 자바는 1995년에 썬마이크로시스템즈에 의해 소개되었으며, 그 즉시 웹의 대화형 가능성에 대해 새로운 의미를 창출하였다. 주요 웹브라우저들은 모두 자바 가상머신을 포함한다. IBM, 마이크로소프트 등 거의 모든 주요 운영체계 개발자들이 자신들의 제품에 자바 컴파일러를 추가하였다. | ||
+ | * 자바 가상머신은 한번에 하나의 바이트코드 명령어를 해석하는 대신, 바이트코드를 '''동적으로 컴파일'''하여 실행코드로 만드는 JIT 컴파일러를 선택적으로 포함할 수 있다. 많은 경우에서, 동적 JIT 컴파일이 가상머신 해석보다 더 빠르다. | ||
+ | |||
+ | * 자바는 '''자바스크립트와 혼동되어서는 안된다.''' 넷스케이프에서 시작된 자바스크립트는 상위 계층에서 해석되어지며, 자바보다 배우기 쉽지만, 이식성이나 바이트코드의 실행 속도에서 자바보다 다소 떨어진다. 자바 애플릿들은 다시 컴파일하지 않고도 거의 모든 운영체계에서 실행될 것이고, 자바는 운영체계 고유의 확장판이나 변형이 없기 때문에, 자바는 일반적으로 웹의 응용프로그램을 개발하는데 있어 전략상 가장 중요한 언어로 간주되고 있다 (그러나, 자바스크립트는 웹 클라이언트 또는 서버 상에서 실행되는 크기가 작은 응용프로그램을 위해 유용할 수 있다). | ||
+ | |||
+ | ==알게된 자바== | ||
+ | * 아규먼트 우선('''인자값'''이 우선) | ||
+ | ** 외부변수 보다 그 함수에서 호출받은 인자값의 위치가 더 높다. | ||
+ | ** 그러니까, 같은 변수 이름이 중복됐다면, 분명에러가 나는데 이는 인자값을 두번 불러준 거나 마찬가지. | ||
+ | ** 그래서, 인자값이 아닌 다른 값이 이름이 같다면 '''this'''.x라고 써준다. (x가 변수 이름이라면 말이다.)'''?????''' | ||
+ | |||
+ | * 애비와 자식, super와 this | ||
+ | ** extends를 취하는 클래스는 그 취했던 클래스의 자식(서브)클래스. | ||
+ | ** 만약 여기서 부모(슈퍼)클래스가 메소드를 추상화 시켰을 경우, 이 메쏘드를 반드시 여기서 정의해야 한다. | ||
+ | ** 메쏘드는 동작, 생성자(맞나??)는 구성요소를 만드는 것. ('''예''': 질럿의 메쏘드- 걸어가며 때리기, 질럿의 생성자- 몸통, 머리, 다리) | ||
+ | ** '''private, public, protected'''... 이것도 권한자인데 알아야겠지 | ||
+ | |||
+ | * instanceof - 간단히 말해, 이 것은 검사대상의 인스턴스가 과연 어디에 속하는 인스턴스인지 묻는 것. | ||
+ | ** c에는 이와 비슷한게 (그냥 비슷했던건) sizeof가 있지. | ||
+ | |||
+ | * 상속 | ||
+ | ** '''기존의 기능을 불러와 써먹는 것.''' | ||
+ | ** 하지만 '''private'''으로 선언했던 (예: private int Add([[사용자:Clarysage|Clarysage]])) 것은 상속 불가능 | ||
+ | ** extends | ||
+ | *** 일반 클래스와 추상(abstract) 클래스의 상속 | ||
+ | *** 추상클래스는 두가지 종류의 메소드를 가진다. | ||
+ | *** 일반 메소드, abstract 메소드 | ||
+ | *** '''abstract 메소드는 메소드의 헤더(header)'''만 가진다. (그러니까 C로 생각해보면 그냥 '''초기화''') | ||
+ | *** 추상클래스를 상속 받는 경우에 그 추상클래스에 abstract 메소드가 존재하면 반드시 재정의 해야 한다. (자식인 sub가 반드시 정의!!!) | ||
+ | ** implements | ||
+ | *** 인터페이스(interface)를 상속 (으악, 그런거였군!!!) | ||
+ | *** 인터페이스안에 존재하는 모든 메소드는 메소드의 헤더(header)만 가진다. | ||
+ | *** 인터페이스를 상속 받는 경우에 그 인터페이스의 모든 메소드는 반드시 재정의 해야 한다. ('''당연''') | ||
+ | |||
+ | * 추상클래스란? | ||
+ | ** 추상 클래스의 핵심 아이디어는 다음의 경우에 유용하다는 것이다. | ||
+ | *** 구현할 '''수퍼 클래스에 공통적인 기능'''이 있을 때 | ||
+ | *** '''어떤 행위가 특정 클래스들에게만 사용될 때나 슈퍼클래스 속에 포함할 수 없을 때'''이다. | ||
+ | ** 그래서 슈퍼 클래스를 추상클래스로 구현한다. | ||
+ | *** 그리고 수퍼클래스가 공통으로 가지는 메소드를 정의한다. | ||
+ | *** 그런 다음 이 추상 클래스를 상속하여 각 서브 클래스를 구현한다. | ||
+ | *** 그리고 그 클래스에 유일한 메소드를 추가한다. | ||
+ | *** 추상클래스는 서브클래스에서 반드시 구현해야하는 행동을 기술하는 일종의 약속(계약)을 제공하는 것이다. | ||
+ | *** 추상클래스를 쓰려면 반드시 '''abstract'''이라는 글자를 넣어줘야 한다. | ||
+ | ** 추상클래스와 인터페이스 모두 타입으로서 특정 계약을 명시할 수 있게 한다. | ||
+ | *** 다시 말하면, '''추상클래스의 서브 클래스'''나 '''인터페이스를 구현한 클래스'''에서 특정 메소드를 정의하도록 요구할 수 다는 말 | ||
+ | *** 이 두 메커니즘은 다소 겹치는 듯하다. 인터페이스는 '''다중 상속의 형태를 나타낼(드러낼) 수 있다.''' | ||
+ | *** 왜냐하면 클래스를 정의할 때 하나 이상의 인터페이스를 구현할 수 있기 때문이다. | ||
+ | *** 인터페이스는 '''public 메소드나 상수에 대해서만 기술하는 것을 허용하고 인터페이스 내에서는 어떤 구현도 해서는 안된다'''. | ||
+ | |||
+ | * 인터폐이스란? | ||
+ | ** 추상메소드와 파이널 변수로만 이루어진 클래스와 파이널 변수로만 이뤄진 클래스. | ||
+ | *** 그래서 그속에 정의된 메소드는 자동적으로 '''public abstract'로 | ||
+ | *** 또한 정의된 변수는 자동적으로 '''public static final'''로 선언이 된다. | ||
+ | ** 만약 이렇게 생성된 것들 중 이를 상속당한 자식들이 정의해주지 않으면 객체생성을 할 수 없다. | ||
+ | ** 인터폐이스의 용도 | ||
+ | *** 강제적 상속관계를 만들지 않으면서 서로 관련없는 클래스들 상이의 유사성을 나타낼 때 | ||
+ | *** 하나 이상의 클래스들이 구현하기를 원하는 메소드를 선언할 경우 | ||
+ | *** 클래스를 보여주지 않고서 객체의 프로그래밍 인터페이스를 보여주어야 할 경우 | ||
+ | ** 인터페이스와 다중상속 ('''차이점''') | ||
+ | *** 인터페이스는 다중상속을 할 수 있도록 해주는 것이 아니라 '''다중상속을 하는 것처럼 해 주는 것이다.'''(속임수???) | ||
+ | *** 클래스는 인터페이스로부터 '''단지 상수만을 상속''' | ||
+ | *** 클래스는 인터페이스로부터 메소드의 구현(몸체???)에 대해서는 상속할 수 없다. | ||
+ | *** 인터페이스의 게층구조는 클래스의 계층 구조와 '''무관'''하다. | ||
+ | **** 같은 인터페이스를 구현하는 클래스들은 클래스 계층 구조 상에서 서로 관련이 있을 수도 없을 수도 있다. | ||
+ | *** 다중상속이라 단정지을 수 없지만, 하나의 인터페이스가 여러 개의 상위인터페이스를 가질 수 있도록 함으로 인해, 다중 인터페이스 상속을 할 수 있도록 해준다. | ||
+ | ** 인터페이스를 간단히 얘기하자면 | ||
+ | *** 이벤트 핸들러나, 각종 처리 함수를 미리 앞서 정의를 (추상화, 가상화)하면 뒤따르는 (implements)함수가 그걸 재정의 (오버라이딩)시켜준다. | ||
+ | |||
+ | * 다중?? | ||
+ | ** extends나 implements옆에 클래스나 인터페이스를 써주는 데 여기서 하나만 쓰지않고 여러개를 써주면 (구분자는 ',') 다중상속, 다중 인터페이스 상속이 되는 것이다. | ||
+ | |||
+ | === 중요한 자바 개념 정리=== | ||
+ | * '''오버라이딩''' | ||
+ | ** 상속관계에 있는 클래스'''끼리끼리 똑같은 메소드를 사용'''하는 것 | ||
+ | ** 근데 여기서 짚고 넘어가야 할 것!!! 바로 상속관계에 있는 클래스사이에서 (자식과 부모 사이에서) 부모가 정의한걸 따라하지 않고 자식이 따로 재정의를 했다고 해도 가능하다. | ||
+ | ** 그러니까 재정의도 상관없다는 것. | ||
+ | |||
+ | * '''오버로딩''' | ||
+ | ** 클래스 안에서 메소드명은 같은데 '''인자형, 인자의 갯수'''가 달라지는 것을 말한다. | ||
+ | |||
+ | * '''생성자''' ('''constructor''') | ||
+ | ** java에서는 생성자를 호출할 때 new키워드가 항상 필요. | ||
+ | ** java는 '''자동 메모리 관리'''를 해주기 때문에 메모리 할당과 생성자 호출을 나눠서 생각할 필요가 없다. | ||
+ | ** 어제 말했던 질럿 생각나지? 거기서 몸통, 머리, 다리등을 구성시켜 주는 것이 바로 '''생성자'''. | ||
+ | |||
+ | * 생성자든 메쏘드든, 클래스 안에 있다면 오버로딩 오버라이딩이 다 가능하다. | ||
+ | |||
+ | === 네트워크, 그리고 자바 === | ||
+ | * TCP/IP 이해 | ||
+ | ** 각단계 ( 1 ~ 5 ) | ||
+ | *** 피지컬 ( e.g.voltage ) (1) '''최하위 계층''' | ||
+ | *** 데이타 링크 ( e.g.Ethernet frames) (2) | ||
+ | *** 네트워크 ( IP ) (3) | ||
+ | *** 트랜스포트 ( TCP, UDP ) (4) | ||
+ | *** 어플리케이션 ( e.g.FTP, telnet, HTTP ) (5) '''최상위 계층''' | ||
+ | ** 프로토콜에서 각 계층은 상대방에게 전달할 '''데이터'''와 '''제어정보'''를 가지고 있다. | ||
+ | ** 여기서 데이터와 제어정보를 '''메세지'''라고 한다. | ||
+ | ** 메세지는 하위계층으로 전달되면 기존 메시지에 추가적인 제어 정보를 붙이게 되는데 이를 '''캡슐화'''라고 한다. (encapsulation) | ||
+ | *** 이와 반대되는 과정은 '''decapsuleataion''' | ||
+ | *** 우주 발사 장면을 연상시켜 비교해보자. 우주는 처음 쏘아올릴 때, 엄청 크다. 하지만 출발하면서 옆에 엔진들을 하나씩 분리해 나간후 결국 우주에 도달할 땐, 조그만 비행기 하나만 남는다. | ||
+ | |||
+ | * 애플릿 | ||
+ | ** 예전에 javaTV를 실습했을 때, xleTView를 사용했던거를 떠올리면 됨. | ||
+ | ** 그러니까, xlet이 TV수상기와 *.class간에 연결해주는 것이라면 | ||
+ | ** '''applet'''은 웹브라우저와 *.class간에 연결해주는 것이다. | ||
+ | * 근데 try, catch...이거 아무래도 오류를 받아 예외처리하는 것 같은데. 잘 모르겠다... | ||
+ | * 함수의 구성이 init, main 등등 거쳐야할 절차가 분명히 존재하는 듯. 대뜸 함수를 임의적으로 만들 수 있을 것 같진 않다. 주의하자. | ||
+ | |||
+ | == 자바 상식 (0512) == | ||
+ | * 왜 객체지향이라 불리는가? | ||
+ | ** 우선 함수나 명령을 구현하는 것을 살펴보면 알 수 있다. 우선 좀더 발전적인 기능의 메쏘드(그러니까 일반적인 명령어)를 호출하려면, 우선 이것과 관계된 인자를 불러야하는데 대게 '''객체'''를 부르는 경우가 많다. | ||
+ | ** 예) br = new BufferedReader(new InputStreamReader(System.in)); | ||
+ | ** 그래서, 함수의 정의와 구현에 관해 타입을 선언하고 그것의 쓰임새와 작동원리를 위주로 이해해야하는 C와 달리, JAVA는 이것과 맞물리는 오브젝트(객체)를 위주로 알아야한다. 서로간 연관성이 정말 깊다. | ||
+ | == 자바 상식 (0513) == | ||
+ | * 객체중에 Output이란 이름이 들어간 것들은 써주기 위한 객체들(write작업)이다. | ||
+ | * 반대로 Inptu이란 이름이 들어간 것들은 해당 파일에 있는 걸 읽어내기 위한 객체들(read작업)이다. | ||
+ | * 메쏘드 명명시, '''set'''에 관한 것은 재설정과 같이, 마치 sql에서 update와 비슷한 용도로 쓰일 때 써주면 좋을 것 같다. | ||
+ | * 객체일 경우, java.io.Serializable 인터폐이스를 구현하지 않으면 마샬링이 되지 않는다는 것을 반드시 기억해야 한다. (181페이지 참고) | ||
+ | * 박싱(boxing) : 원시값을 특정값으로 감싸주는 작업을 흔히 '''박싱(boxing)'''이라고 일컫는다. | ||
+ | ==== 정적 메소드, 숫자 및 정적 변수 ==== | ||
+ | * 정적 메소드(static)는 객체 레퍼런스 변수 대신 '''클래스명'''을 써서 호출합니다. | ||
+ | * 정적 메소드는 힙에 그 메소드가 들어있는 클래스의 인스턴스가 없어도 호출할 수 있습니다. | ||
+ | * 정적 변수(역시 static)는 해당 클래스에 속하는 모든 객체에서 공유하는 변수입니다. 인스턴스 변수는 각 인스턴스마다 사본이 하나씩있지만 정적 변수는 한 클래스에 복사본이 하나밖에 없습니다. | ||
+ | * 자바에서 상수를 만들 때엔 변수에 static과 final로 지정하면 됩니다. | ||
+ | * final로 지정한 변수값은 값을 한 번 대입하면 바꿀 수 없습니다. | ||
+ | * final 메소드는 오버라이드 할 수 없습니다. | ||
+ | * final 클래스는 확장할 숭 없습니다. (즉, 하위클래스를 만들 수 없습니다.) | ||
+ | |||
+ | = XML = | ||
+ | ==DTD== | ||
+ | * Document Type Definition, 마치 DB설계를 위해 DBA가 필요했던 것처럼 XML에선 DTD를 설계. | ||
+ | * 엘리먼트 (구성 요소) 선언 | ||
+ | ** <!ELEMENT 이름 내용> | ||
+ | ** 만약 <HTML>에서 <body>안에 속성이 들어있는데 이 <body>를 정의한다고 가정을 하면 | ||
+ | *** '''<!ELEMENT body (img | a)*>''' 이런 식으로 정의. | ||
+ | ** 또한 <head> 김세훈 </head>라고 당연하게 여기는 이 <head>는 이렇게 정의 됐을듯. | ||
+ | *** <!ELEMENT head '''(#PCDATA)'''> 파싱된 캐릭터 데이터란 의미의 #PCDATA(이건 '''김세훈'''을 의미하는 내용) | ||
+ | ** 만약 특정 구성체에 속해있는 '속성'이나 '구성'이 아예 없을 경우, <!ELEMENT 이름 EMPTY> | ||
+ | ** 속성의 선언 | ||
+ | *** '''<!ATTLIST 엘리먼트이름 속성이름 속성형(혹은 속성기본값)>''' | ||
+ | **** 참고 : '''프로패셔널 리눅스 1018페이지''' | ||
+ | **** 만약 <img src="xml.gif"/>이런 속성일 경우, | ||
+ | ***** 1) 엘리먼트(구성체)이름: img. | ||
+ | ***** 2) 속성이름: src. | ||
+ | ***** 3) 속성형: 문자열 (CDATA). | ||
+ | ***** 4) 속성기본값(혹은 옵션): 필요함 | ||
+ | ***** 이렇게 된거라면, '''<!ATTLIST img src CDATA #REQUIRED>''' | ||
+ | ** ENTITY | ||
+ | *** C로 따지면 '''#define'''과 같은 것. | ||
+ | ***<!ENTITY % Type "individual | band"> <!ATTLIST artist type (%Type;) #REQUIRED> 이것이랑 | ||
+ | ***<!ATTLIST artist type (individual | band) #REQUIRED> 이건 같은 뜻!!! | ||
+ | |||
+ | ==XSL== | ||
+ | * '''이거만 잘 이해하면 끝날 듯''' | ||
+ | ** CSS와 비슷하지만 좀 어려운 것 같기도. | ||
+ | * <xsl:template match="/"> | ||
+ | ** 일단 이것부터. 이건 '''/'''을 만나면 '''xsl:template이 적용된 처리를 하라'''는 뜻? | ||
+ | ** 그러니까 <xsl:template>에서 </xsl:template>까지 XML 문서에 적용하라는 것. 해당 템플릿을 적용하겠노라며. | ||
+ | * '''<xsl:apply-templates/>''' 말그대로 해당 템플릿을 적용. | ||
+ | ** 해당템플릿이란? 바로 아래 있는 글들. | ||
+ | * XSL도 XML과 마찬가지로 문법에 대한 관대함이 없다. 엄청나게 엄격. | ||
+ | ** 빈테그라도 <br>이렇게 하면 에러. <br></br>을 합친 '''<br/>'''로 적어줘야 에러 안 난다. | ||
+ | * '''<xsl:value-of select="artist"/>''' 이거는 실제 소스에서, | ||
+ | ** <artist> Frank Sinatra </artist> 이렇게 표시된 부분의 Frank Sintra를 저걸 선언한 부분에 넣는 것이다. | ||
+ | * '''<xsl:for-each select="tracks/track">''' | ||
+ | ** 이건 php문과 비슷하네. 즉, tracks/track이 반복될 때마다 <xsl:for-each>~</xsl:for-each>문을 실행하라는 듯. | ||
+ | * '''<xsl:value-of select="title/@numberoftracks"/>''' 이건<ATTLIST> 속성에 관한 것. | ||
+ | ** 여기서 '''@이하의 것은 속성'''입니다. 위의 것은 title엘리먼트의 속성 numberoftracks의 속성값을 나타냄. | ||
+ | ==XPath== | ||
+ | * DB에서 SQL로 질의하듯, XML에선 '''XPath'''로 질의를 한다. | ||
+ | * '''/root'''라고 치면 '''<root>엘리먼트를 가져오라'''는 것으로 이해하자. | ||
+ | * | ||
+ | ==URL쿼리== | ||
+ | * 선행조건: '''일단 mssql 서버 프로그램을 ''' 설치하자. | ||
+ | * MSSQL이란 건 참 특이하다. URL에 직접 질의어를 넣기 때문인데, 자칫 이런 사태가 발생할지도 모른다. | ||
+ | http://localhost/mini?sql=SELECT+Customers.CustomerID,OrderID,OrderDate+FROM+Customers,+Orders+WHERE+Customers.CustomerID=Orders.CustomerID+Order+by+Customers.CustomerID,OrderID+FOR+XML+AUTO&root=ROOT | ||
+ | * 전혀 간편하지 않은 위와같은 주소 입력은 '''저장 프로시져(stored procedure)'''를 통해 보완됐다고 한다. | ||
+ | ==저장프로시져== | ||
+ | * 참고: '''파싱(parsing)'''이란 구문분석(정제) 작업을 말함. | ||
+ | * 저장 프로시져는 위에서 언급했던 MSSQL의 처리과정중 불필요한 과정을 생략한다. 이로 인해 트래픽이나 성능향상을 가져올 수 있다. | ||
+ | * 저장 프로시져는 편하기도 해서 SQL구문을 URL에 직접 입력해야하는 고생을 덜 수 있다. | ||
+ | ** 예를 들어, SELECT CategoryName FROM Categories 이거를 CategoryInfo로 정의하고 싶다면 | ||
+ | ** '''CREATE PROC CategoryInfo AS SELECT CategoryName FROM Categories FOR XML AUTO''' | ||
+ | ** 그래서 실제 URL에 http://localhost/mini?sql=EXEC+CategoryInfo&root=ROOT이런 식으로 입력해도 된다. | ||
+ | ** CREATE PROC CategoryInfoWithInputParam''' @CategoryID int = 1''' | ||
+ | ** AS SELECT CategoryName FROM Categories WHERE Categories.CategoryID =''' @CategoryID''' FOR XML AUTO | ||
+ | ** 추가된 옵션사항은 @뿐. 이건 매게변수, 즉 인자라고 생각하면 되겠지. | ||
+ | ** http://localhost/mini?sql=EXEC+CategoryInfoWithInputParam+2&root=ROOT | ||
+ | ** http://localhost/mini?sql=EXEC+CategoryInfoWithInputParam+@CategoryID=2&root=ROOT 바로 위의 것과 똑같음. | ||
+ | ** 근데 URL입력 부분중 맨 뒤에 붙는 '''@root=ROOT'''이거 넣기 싫다면 | ||
+ | *** CREATE PROC CategoryInfoWithoutRoot @CategoryID int = 1 SELECT '<ROOT>' SELECT CategoryName | ||
+ | *** FROM Categories WHERE Categories.CategoryID = @CategoryID FOR XML AUTO SELECT '</ROOT>' | ||
+ | *** 여기서 주의할 것 : '''SELECT '</ROOT>'''' 요걸 주의하라 | ||
+ | * 이제 '''xsl'''에 적용시켜 보자. | ||
+ | http://www.word.pe.kr/bbs/zboard.php?id=xml&page=3&select_arrange=headnum&desc=asc&category=&sn=off&ss=on&sc=on&keyword=&sn1=&divpage=1 | ||
+ | |||
= http://coffeenix.net/data_repository/html/gcc-err.html = | = http://coffeenix.net/data_repository/html/gcc-err.html = | ||
+ | == C 상식 == | ||
+ | * strdup는 할당하고 그곳에 문자포인터를 대입시키는 명령을 한 줄로 표현하는 명령어이다. | ||
+ | * 문자 포인터 | ||
+ | ** 만약 인자값을 포인터로 받은 후, 함수 안에서 포인터변수를 선언한다면 이건 주소값만 취해 '''sprint'''등으로 값을 넣어줄 수 있다. '''주소값만 넘겨주면 되니까''' | ||
+ | * 또한, sqprint를 이용해서 해당 문자열에 값을 계속 추가시켜줄 수 있다. | ||
+ | ** 예) A += sprint("asdf", A); //기존의 문자열 값에 '''asdf'''를 추가. | ||
+ | * '''구조체 정의와 typedef''' | ||
+ | ** 어렵게 생각하지 말자. 구조체에 언더바가 난무하더라도 그 틀을 이해하면 된다. 예를 들어, | ||
+ | ** typedef struct _aaa_{[[사용자:Clarysage|Clarysage]]}aaa; 이렇게 적으면 struct _aaa_를 '''aaa'''를 선언하는 것이다. 결국 '''언더바는 구분해주는 것이다.''' | ||
+ | |||
* GDB 디버깅 프로그램 | * GDB 디버깅 프로그램 | ||
'''b file.c:func'''이런 식으로 하면 외부파일의 특정함수에 브레이크 포인트를 걸어줄 수 있다. | '''b file.c:func'''이런 식으로 하면 외부파일의 특정함수에 브레이크 포인트를 걸어줄 수 있다. | ||
53번째 줄: | 303번째 줄: | ||
- 삭제하는 방법 pkill '''-9''' pid | - 삭제하는 방법 pkill '''-9''' pid | ||
- partprobe(?) 암튼 이건 재부팅 방지용이다. | - partprobe(?) 암튼 이건 재부팅 방지용이다. | ||
+ | |||
== 하둡 == | == 하둡 == | ||
- hdfs상에서 송수신할 때, 나눠야할 블록, 버퍼량을 헤아려야 한다. | - hdfs상에서 송수신할 때, 나눠야할 블록, 버퍼량을 헤아려야 한다. | ||
88번째 줄: | 339번째 줄: | ||
== EMS == | == EMS == | ||
+ | |||
+ | ===mysql 설정=== | ||
+ | |||
+ | * 문제가 있을 경우. | ||
+ | ** 비밀번호를 분실했다. | ||
+ | *** '''./mysql/bin/mysqld_safe --user=mysql --skip-grant-tables & ''' | ||
+ | *** mysql> use mysql; | ||
+ | *** mysql> update user set password=password('새로운암호입력') where user='root'; | ||
+ | *** mysql> flush privileges; | ||
+ | * mysql에서 문제가 생긴다면 EMS전체에 애러가 날 수 있다. | ||
+ | * '''grant''' 쿼리는 심도있게 알아보자. | ||
+ | |||
+ | ===ln -s=== | ||
+ | |||
+ | * 링크시켜주는 것. | ||
+ | * 이것을 없애주는 절차도 까다롭다. | ||
+ | * ln -f '''--force(강제옵션)''' | ||
+ | * 그리고, 해당 폴더 /var/www/html/ 로 가서 삭제. | ||
=== 자바스크립트 === | === 자바스크립트 === | ||
108번째 줄: | 377번째 줄: | ||
ON employees2.id = invoices.EmployeeID; | ON employees2.id = invoices.EmployeeID; | ||
- 그냥 합치는 것 같다. | - 그냥 합치는 것 같다. | ||
+ | - 근데 이를 중복하느냐 마느냐에 따라서 '''UNION ALL'''을 쓸 수 있다. | ||
- 뭔가를 값을 얻어서 다른 폐이지에 보낼 때(처리할 때) 한 폐이지에 두개이상의 방식이 존재할 때, | - 뭔가를 값을 얻어서 다른 폐이지에 보낼 때(처리할 때) 한 폐이지에 두개이상의 방식이 존재할 때, | ||
고려해야한다. 그러니까 인풋 타입의 메쏘드를 get으로 할 것인지, post로 할 것인지, 뭐 요런 것들이 | 고려해야한다. 그러니까 인풋 타입의 메쏘드를 get으로 할 것인지, post로 할 것인지, 뭐 요런 것들이 | ||
204번째 줄: | 474번째 줄: | ||
- 나중에 인덱스를 활용할 때, 특히, UTS에서 넘어온 값이 몇번째인지 알고 싶을 때 활용하면 좋을 것 같다. | - 나중에 인덱스를 활용할 때, 특히, UTS에서 넘어온 값이 몇번째인지 알고 싶을 때 활용하면 좋을 것 같다. | ||
- '''C언어의 실전'''156페이지 참고해 볼 것. | - '''C언어의 실전'''156페이지 참고해 볼 것. | ||
+ | - 자동기억 변수와는 달리, 정적기억변수는 초기화자('=x')가 없아도 '''0으로''' 초기화됩니다. | ||
15) 그냥 시작주소값을 할당했던 주소에 대입을 시키면, 나중에 free에서 '''에러'''가 발생한다. | 15) 그냥 시작주소값을 할당했던 주소에 대입을 시키면, 나중에 free에서 '''에러'''가 발생한다. | ||
- 이를 해결하기 위한 방법은 시작주소값을 대상으로 기존의 할당했던 주소에 memcpy를 하면 나중에 에러가 발생하지 않는다.'''(중요!!!)''' | - 이를 해결하기 위한 방법은 시작주소값을 대상으로 기존의 할당했던 주소에 memcpy를 하면 나중에 에러가 발생하지 않는다.'''(중요!!!)''' | ||
219번째 줄: | 490번째 줄: | ||
가 loader쪽으로 간다. | 가 loader쪽으로 간다. | ||
5) loader쪽으로 들어와 출력되면 성공! | 5) loader쪽으로 들어와 출력되면 성공! | ||
+ | *참고사항 | ||
+ | **어떤 함수가 요약을 위한 헤시테이블이고, 어떤 함수가 메핑을 위한 헤시테이블인가? | ||
+ | ***우선, '''uts_init_dhtable'''이 메핑을 위한 헤시테이블함수이다. | ||
+ | ***그리고, '''uts_get_dhtable'''이 요약을 위한 헤시테이블함수다. | ||
+ | ***여기서 요약은 uts_transform에서 강제적으로 호출을 통해 이뤄지는 반면 메핑은... 글쎄 아무래도 자동적으로(프레임웤에 의해서) 들어가는 것 같다. | ||
+ | |||
+ | ===메핑의 원리=== | ||
+ | 1) 기호로 돼있거나 알 수 없게 돼있는 정보( 예)유닉스타임 )를 알아보기 쉽게 만들어 버리는 것. | ||
+ | 2) 그러기 위해선 EMS에서 작업했을때, setting처럼 설정돼있는 테이블을 꼭 참고해야하겠지 | ||
+ | 3) 이것도 '''검색(lookup)'''하는 과정에서 헤시테이블이라고 했는데 이것은 위의 것과 다르게 순수히 데이터를 메핑하는 것이고 위에 것은 | ||
+ | 한데로 모아 요약해주는 것이므로 엄연히 다른 것이다. | ||
+ | 4) 위의 헤시테이블은 '''기존에 없던 테이블을 생성하게 되는 것, 즉 키 값에 의해 테이블을 생성하고 거기에 넣는 것'''이다. | ||
+ | 5) 하지만 메핑에서 쓰이는 헤시테이블은 '''기존에 있는 여러테이블 중, 찾아보기 쉽게 키값으로 색인이 가능하게 한 후, 이것을 통해 데이터를''' | ||
+ | '''개조시키는 것'''이다. | ||
+ | |||
+ | ====빅파일의 원리==== | ||
+ | * 빅파일은 레코드 단위('''한 records... 로더나 익스트렉터, 트랜스포머에서 한번에 받아들이는 객체단위''')분산해서 저장해주는 아주 제한적인 분산파일 아키텍쳐. | ||
+ | ** '''분산용'''-> 그러니까, extractor에서 하나의 로컬파일을 추출하려 할 때 발생할지 모를 병목현상이 있을 수 있다. | ||
+ | ** 그래서 이를 하나의 extractor가 아닌 각각의 (여러개의) extractor를 푸는게 훨씬 빠를 듯. | ||
+ | |||
===정제의 원리=== | ===정제의 원리=== | ||
1) '''kimsh_0408.c 그리고 kimsh_0408.h'''참고 | 1) '''kimsh_0408.c 그리고 kimsh_0408.h'''참고 | ||
232번째 줄: | 523번째 줄: | ||
**예를 들어, 한 백화점에서 판매 데이터베이스의 데이터를 분석하여 금요일 오전에는 어떤 상품들이 잘 팔리는가, 그리고 팔리는 상품들간에는 어떤 상관관계가 있는가 등을 발견하고 이를 마케팅에 반영하는 것이다. 따라서 데이터마이닝의 필수 요소는 신뢰도가 높은 충분한 자료이다. 이것은 신뢰도 높은 충분한 자료가 정확한 예견을 가능하게 하기 때문이다. 그러나 '''너무 많은 자료는 오히려 데이터마이닝의 예견 능력을 떨어뜨릴 수 있으므로 최적의 결과를 산출할 수 있는 의미있는 자료의 확보'''가 필요하다. 한국에서 데이터마이닝은 아직은 초기 단계에 머물러 있다. 그러나 곧 일반화될 것으로 생각된다. 그 이유는 '''데이터마이닝을 하기 위한 최적의 시스템이 되는 데이터웨어하우스가 국내에 이미 많이 구축'''되어 있기 때문이다. 또 기업의 요구 사항이 주로 '''고객관리에 중점을 두는 데이터베이스 마케팅 쪽으로 가고 있기 때문에 데이터마이닝의 발달은 급속히 이루어질 수밖에 없다.''' 한편 기술적인 면에서 '''데이터마이닝을 잘 구현할 수 있는 소프트웨어가 나오면 데이터웨어하우스는 축소될 것이라는 의견'''도 있다 | **예를 들어, 한 백화점에서 판매 데이터베이스의 데이터를 분석하여 금요일 오전에는 어떤 상품들이 잘 팔리는가, 그리고 팔리는 상품들간에는 어떤 상관관계가 있는가 등을 발견하고 이를 마케팅에 반영하는 것이다. 따라서 데이터마이닝의 필수 요소는 신뢰도가 높은 충분한 자료이다. 이것은 신뢰도 높은 충분한 자료가 정확한 예견을 가능하게 하기 때문이다. 그러나 '''너무 많은 자료는 오히려 데이터마이닝의 예견 능력을 떨어뜨릴 수 있으므로 최적의 결과를 산출할 수 있는 의미있는 자료의 확보'''가 필요하다. 한국에서 데이터마이닝은 아직은 초기 단계에 머물러 있다. 그러나 곧 일반화될 것으로 생각된다. 그 이유는 '''데이터마이닝을 하기 위한 최적의 시스템이 되는 데이터웨어하우스가 국내에 이미 많이 구축'''되어 있기 때문이다. 또 기업의 요구 사항이 주로 '''고객관리에 중점을 두는 데이터베이스 마케팅 쪽으로 가고 있기 때문에 데이터마이닝의 발달은 급속히 이루어질 수밖에 없다.''' 한편 기술적인 면에서 '''데이터마이닝을 잘 구현할 수 있는 소프트웨어가 나오면 데이터웨어하우스는 축소될 것이라는 의견'''도 있다 | ||
===데이터 웨어하우스=== | ===데이터 웨어하우스=== | ||
+ | *'''데이터 웨어하우스의 개념''' | ||
**데이터 웨어하우스는 1980년대 중반 IBM이 자사 하드웨어를 판매하기 위해 처음으로 도입했던 개념으로, IBM은 인포메이션 웨어하우스(Information Warehouse)라는 용어를 사용하였다. | **데이터 웨어하우스는 1980년대 중반 IBM이 자사 하드웨어를 판매하기 위해 처음으로 도입했던 개념으로, IBM은 인포메이션 웨어하우스(Information Warehouse)라는 용어를 사용하였다. | ||
**이후 이 개념은 많은 하드웨어와 소프트웨어 및 툴 공급 업체들에 의해 이론적, 현실적으로 성장하였으며, 1980년대 후반 인몬(Inmon)이 데이터 접근 전략으로 데이터 웨어하우스 개념을 사용함으로써 많은 관심을 모으기 시작했다. | **이후 이 개념은 많은 하드웨어와 소프트웨어 및 툴 공급 업체들에 의해 이론적, 현실적으로 성장하였으며, 1980년대 후반 인몬(Inmon)이 데이터 접근 전략으로 데이터 웨어하우스 개념을 사용함으로써 많은 관심을 모으기 시작했다. | ||
242번째 줄: | 534번째 줄: | ||
***운영 시스템은 '''데이터는 레코드 단위'''로 계속 수정된다. | ***운영 시스템은 '''데이터는 레코드 단위'''로 계속 수정된다. | ||
***그러나 데이터 웨어하우스의 데이터는 '''대량으로 로딩되어 나중에 사용된다. 현존하는 데이터는 수정하지 않으므로 일관성이 유지된다.''' | ***그러나 데이터 웨어하우스의 데이터는 '''대량으로 로딩되어 나중에 사용된다. 현존하는 데이터는 수정하지 않으므로 일관성이 유지된다.''' | ||
+ | *'''데이터 웨어하우스의 특징''' | ||
+ | **시간 의존(time dependent) | ||
+ | ***시간에 따른 데이터의 적재 및 분석 | ||
+ | **비휘발성(non-volatile) | ||
+ | ***데이터가 갱신되지 않고 질의 목적으로 사용 - '''일관성'''유지 | ||
+ | ***운영 데이터가 아니고 이력 데이터 | ||
+ | **주제 중심적(subject-oriented) | ||
+ | ***의사 결정 지원을 목적으로 추출된 데이터 | ||
+ | ***통합된(integrated) 다양한 응용에서 사용되는 엔티티를 통합 | ||
+ | |||
+ | ===고급 매크로 표현식에 사용되는 여섯가지 테크닉(발췌)=== | ||
+ | |||
+ | * 첫째, 문자열 리터럴은 합쳐진다. | ||
+ | ** 이 기능을 사용하면 긴 출력 문장을 손쉽게 여러 개의 부분 문자열로 나눌 수 있다. | ||
+ | printf("이름: %s\n" | ||
+ | "나이: %d\n" | ||
+ | "전화번호: %s\n", a, b, c); | ||
+ | printf 다음에는 총 세 개의 연속된 문자열 리터럴이 나타난다. | ||
+ | 이 세 개의 리터럴은 합쳐져서 '''"이름: %s\n나이: %d\n전화번호: %s\n"''' 과 동일한 문자열이 된다. | ||
+ | |||
+ | * 둘째, '''## 연산자'''를 사용해서 토큰을 합성해서 만들어 낼 수 있다. | ||
+ | ** ##은 합치기 연산자 이다. 다음과 같은 기능을 생각해 보자. | ||
+ | COUNT(start)라고 선언을 하면 DWORD startCnt; 라는 변수를 선언하는 기능이다. 이를 매크로를 이용해서 만들어 보면 아래와 같다. | ||
+ | #define COUNT(val) DWORD val##Cnt | ||
+ | |||
+ | * 셋째, # 연산자는 전달된 인자를 문자열로 변환시킨다. | ||
+ | ** start를 매크로 인자로 전달했다면 '''"'''start'''"'''가 된다는 말이다. | ||
+ | ** 변수 값을 출력하는 매크로를 생각해 보자. | ||
+ | PRINT(start)를 하면 화면에 start = 3과 같은 형태로 출력하고 싶은 경우다. | ||
+ | 이럴 땐 아래와 같이 매크로를 만들면 된다. | ||
+ | '''#연산자'''와 위에서 소개한 문자열 리터럴이 합쳐진다는 점을 이용한 것이다. 좀 꽁수 같이 보인다면 두 번째 방식같이 구성할 수 도 있다. | ||
+ | #define PRINT(val) printf(#val " = %d", val) | ||
+ | #define PRINT(val) printf("%s = %d", #val, val) | ||
+ | |||
+ | * 넷째, '''#@''' 연산자는 전달된 인자를 문자로 변환시킨다. | ||
+ | ** a를 매크로 인자로 전달했다면 'a'를 만들어 주는 것이다. 아래와 같이 전달된 인자에 대한 문자를 생성해주는 매크로를 예로 들 수 있다. | ||
+ | #define makechar(val) #@val | ||
+ | |||
+ | * 다섯째, 매크로의 내용이 복잡하고 한 줄 이상의 표현식이 필요한 경우엔 주로 do ~ while(0)문을 사용한다. (이건 이번 ECM에서도 쓰인 것을 봤다.) | ||
+ | ** 이렇게 하는 이유는 do ~ while(0)가 하나의 구문으로 해석되고 자체 블록을 가지기 때문이다. | ||
+ | ** 이것을 단순 괄호({, })로 대체하면 안 된다. 중첩 if문에서 에러가 나기 때문이다. 주로 아래와 같이 사용한다. | ||
+ | #define COMPLEX_MACRO(a,b,c,d) do { \ | ||
+ | int complex_variable; \ | ||
+ | // some processing; \ | ||
+ | } while(0) | ||
+ | |||
+ | * 여섯째, 릴리즈 버전에서는 무시되는 매크로를 구성하는 경우다. 주로 디버깅 출력을 하는 매크로가 여기에 속한다. Visual C++ 6.0에서는 '?' 연산자를 사용해서 쇼트 서킷을 구성하는 방법을 주로 사용했다. 하지만 이 후 출시된 Visual C++에는 __noop이라는 내장 함수를 가지고 있다. 이 함수는 인자를 모두 무시하는 기능을 한다. 따라서 예전에 복잡한 쇼트서킷을 사용했던 함수를 두 번째와 같이 간단하게 구성할 수 있다. | ||
+ | |||
+ | #define TRACE 1 ? 0 : OutputDebugString | ||
+ | #define TRACE __noop | ||
+ | |||
+ | ===잠깐!!=== | ||
+ | *'''file.c'''에서 중요한 거 발견! | ||
+ | ** _setmode(fd, _O_BINARY). 이거 때문에 ecm_open에서 '''ECM_O_CREAT | ECM_O_TRUNC'''등등이 쓰이는 구나. 이 함수를 이용하게끔! | ||
+ | *** ECM_O_CREAT -> ecm_creat | ||
+ | *** ECM_O_TRUNC -> ecm_trunc ('''by o_flags_ecm2native) | ||
+ | |||
+ | ==자료 구조 중, string 관련 발췌== | ||
+ | *string에 관한 함수를 알고싶다면 '''c로쓴 자료구조론''' 96쪽을 보자. | ||
+ | **기존의 함수보다(strcat이나 strcpy...) 더 좋은 함수를 만들 수 있다. 포인트는 임시문자열(temp)를 두지말것. 공간과 시간의 낭비 | ||
+ | *패턴 매칭 | ||
+ | **그 일례가 이거다. strstr을 구현한 함수보다 빠르게 만들고 싶다면, | ||
+ | ***우선 실험대상의 끝문자와 같은 길이의 위치에 대상문자에 적용 | ||
+ | ***그리고 나서 끝문자가 실험대상의 것과 같은지 하나하나 나아가며 비교하다가, | ||
+ | ***같다면, 앞부터 차근차근 비교하기. 만약 주소값이 실험대상의 끝주소와 일치한다면 패턴매치 성공! | ||
+ | *하지만 이 역시 복잡도로 매기자면 좀 그렇다. 좀더 빠른 걸 만들려면 | ||
+ | **위에서 끝문자끼리 검사를 차근차근 했지, 그러면 그 와중에 대상의 패턴역시 읽어냈으니까 이걸 참고하자는 것. | ||
+ | **그러니까 엄한 패턴이 나오면 이걸 무시하고(끝문자가 서로 같다하더라도) 넘어가자. | ||
+ | **이 엄한 패턴을 정의한 함수가 따로 있다던데 이를 '''실패함수'''. | ||
+ | **이건 좀 어렵긴 한데 차차 알아가야 한다. 101쪽에 나왔으니까 함 참고해보자. | ||
= 이맥스 팁 = | = 이맥스 팁 = |
2009년 5월 13일 (수) 15:13 현재 판
목차 |
자바
- 객체, 인스턴스 , 클래스, 타입에 대해...
- 객체와 인스턴스는 동일한 개념.
- 객체와 클래스의 차이는,
- 클래스는 사용자 정의 타입
- 객체는 그 타입을 가진 실제 변수
int a, b; 이럴 때, a, b는 int라는 타입의 변수입니다...비슷하게 class Test { ... } Test t; 이렇게 하면 t는 Test라는 클래스의 객체 일종의 구조체라고 생각하는게 이해하기 쉬울 거 같다.
- 객체, 인스턴스 , 클래스, 타입에 대해... (계속)
- 클래스는 결국 일종의 타입이며 단지 int, char, long등의 컴파일러가 기본적으로 제공하는 타입(이런 것들을 built-in type이라고 부른다. 우리말로 하자면 '내재 형- 이미 만들어진 것' 이라고 할 수 있죠)과 달리 여러 가지 객체 지향적인 특성들을 가지고 있을 뿐.
- 즉, 객체 역시 일반 변수와 거의 비슷하며 단지 클래스 변수이기 때문에 클래스의 특징을 가졌다는 차이가 있을 뿐.
- 인스턴스는 '스타크래프트'에 비유해볼 수 있다.
- 프로토스에서도 여러 유닛이 있는데 그것들을 하나의 클래스라고 부를 수 있다. (각각의 기능과 특징이 저마다 다르게 구현돼있는 클래스)
- 하지만 질럿 하나가 마우스의 클릭하는 곳을 향해 움직이고 있을 때, 그 때의 질럿은 인스턴스라고 말할 수 있다.
- 즉, 클래스는 개념속에 있는 것이고, 인스턴스는 현재 존재하고 있는 것이다. 객체로 만들어진 녀석들이 바로 인스턴스!!!
- 변수 선언할 때,
- String s = new String("테스트") -> 이럴 땐, s를 호출할 때마다 쓸데없이 String인스턴스를 생성한다. (x)
- String s = "테스트" -> 매번 생성하지 않도록 되어있는 방법이다. 즉 l-value에 타입값이 명시돼있다면 r-value에 클래스타입을 적지 않아도 된다.
자바의 개념, 확실하게
- 자바는 특별히 인터넷의 분산환경에서 사용되도록 설계된 프로그래밍 언어이다.
- 자바는 C++ 언어처럼 보이지만, C++ 보다는 사용하기에 간단하고 프로그래밍의 완전한 객체지향성을 강화하였다.
- 자바는 한 대의 컴퓨터나, 네트웍 상의 분산 클라이언트/서버 환경에서도 실행되는 응용프로그램을 만드는데 모두 사용될 수 있다. 이것은 또한 웹페이지의 일부로서 쓰이는 작은 응용프로그램 모듈이나 애플릿 등을 만드는 데에도 사용될 수 있다. 애플릿들은 사용자들이 웹페이지를 통해 상호작용을 할 수 있도록 해준다.
- 자바의 주요 특성들을 요약하면 다음과 같다.
- 사용자가 만드는 프로그램들은 네트웍 상에서 쉽게 이식이 가능하다.
- 사용자가 개발한 프로그램은 자바 가상머신이 설치된 서버나 클라이언트 등 네트웍의 어디에서든지 실행될 수 있도록, 자바 바이트코드로 컴파일된다.
- 자바 가상머신은 바이트코드를 실제 컴퓨터 하드웨어에서 실행될 수 있는 코드로 해석한다. 이것은 명령어의 길이 등, 개별 컴퓨터 플랫폼간의 차이가 인식되고, 프로그램이 실행되어지고 있는 바로 그 위치에서 국부적(부분적)으로 조정될 수 있다는 것을 의미한다. 특정한 플랫폼에 맞는 프로그램 버전은 더 이상 필요하지 않다.
- 자바코드는 "튼튼하다".
- 즉, 이것은 C++나 기타 다른 언어로 작성된 프로그램들과는 달리, 자바 객체들은 외부 데이터로부터 내부 또는 알려진 다른 객체들로 향하는 참조를 포함하지 않을 수 있다는 것을 의미한다.
- 이것은 명령어가 다른 응용프로그램이나 운영체계 그 자체 내에 있는 데이터 저장소의 주소를 포함하지 않음을 보장함으로써, 그 프로그램이나 운영체계의 실행이 중단되거나 고장을 일으키지 않게 한다. 자바 가상머신은 각 객체에 대해 무결성을 보장하기 위해 여러 번의 검사를 실시한다.
- 자바는 객체지향적이다.
- 이는 다른 특성들 가운데, 비슷한 객체들은 같은 클래스의 일부가 되고 공통 코드를 상속하는 등의 장점을 취할 수 있다는 것을 의미한다.(아주중요!!!)
- 객체들은 전통적이고 절차적인 "동사"와 관계 있기보다, 사용자에게 "명사"(갖다 붙이면 얼추 되는 것)와 관계 있는 것으로 생각하게 한다. 메쏘드는 객체의 능력이나 행동 중의 하나로 생각할 수 있다.
- 서버가 아닌 클라이언트에서 실행되는 것 외에도, 자바 애플릿은 빠르게 실행되기 위해 설계된 다른 특성들을 가진다.
- C++에 비해 자바는 배우기 쉽다(?) (그러나, 물론 하룻밤새 배울 수 있는 것은 아니다).
- 사용자가 만드는 프로그램들은 네트웍 상에서 쉽게 이식이 가능하다.
- 자바는 1995년에 썬마이크로시스템즈에 의해 소개되었으며, 그 즉시 웹의 대화형 가능성에 대해 새로운 의미를 창출하였다. 주요 웹브라우저들은 모두 자바 가상머신을 포함한다. IBM, 마이크로소프트 등 거의 모든 주요 운영체계 개발자들이 자신들의 제품에 자바 컴파일러를 추가하였다.
- 자바 가상머신은 한번에 하나의 바이트코드 명령어를 해석하는 대신, 바이트코드를 동적으로 컴파일하여 실행코드로 만드는 JIT 컴파일러를 선택적으로 포함할 수 있다. 많은 경우에서, 동적 JIT 컴파일이 가상머신 해석보다 더 빠르다.
- 자바는 자바스크립트와 혼동되어서는 안된다. 넷스케이프에서 시작된 자바스크립트는 상위 계층에서 해석되어지며, 자바보다 배우기 쉽지만, 이식성이나 바이트코드의 실행 속도에서 자바보다 다소 떨어진다. 자바 애플릿들은 다시 컴파일하지 않고도 거의 모든 운영체계에서 실행될 것이고, 자바는 운영체계 고유의 확장판이나 변형이 없기 때문에, 자바는 일반적으로 웹의 응용프로그램을 개발하는데 있어 전략상 가장 중요한 언어로 간주되고 있다 (그러나, 자바스크립트는 웹 클라이언트 또는 서버 상에서 실행되는 크기가 작은 응용프로그램을 위해 유용할 수 있다).
알게된 자바
- 아규먼트 우선(인자값이 우선)
- 외부변수 보다 그 함수에서 호출받은 인자값의 위치가 더 높다.
- 그러니까, 같은 변수 이름이 중복됐다면, 분명에러가 나는데 이는 인자값을 두번 불러준 거나 마찬가지.
- 그래서, 인자값이 아닌 다른 값이 이름이 같다면 this.x라고 써준다. (x가 변수 이름이라면 말이다.)?????
- 애비와 자식, super와 this
- extends를 취하는 클래스는 그 취했던 클래스의 자식(서브)클래스.
- 만약 여기서 부모(슈퍼)클래스가 메소드를 추상화 시켰을 경우, 이 메쏘드를 반드시 여기서 정의해야 한다.
- 메쏘드는 동작, 생성자(맞나??)는 구성요소를 만드는 것. (예: 질럿의 메쏘드- 걸어가며 때리기, 질럿의 생성자- 몸통, 머리, 다리)
- private, public, protected... 이것도 권한자인데 알아야겠지
- instanceof - 간단히 말해, 이 것은 검사대상의 인스턴스가 과연 어디에 속하는 인스턴스인지 묻는 것.
- c에는 이와 비슷한게 (그냥 비슷했던건) sizeof가 있지.
- 상속
- 기존의 기능을 불러와 써먹는 것.
- 하지만 private으로 선언했던 (예: private int Add(Clarysage)) 것은 상속 불가능
- extends
- 일반 클래스와 추상(abstract) 클래스의 상속
- 추상클래스는 두가지 종류의 메소드를 가진다.
- 일반 메소드, abstract 메소드
- abstract 메소드는 메소드의 헤더(header)만 가진다. (그러니까 C로 생각해보면 그냥 초기화)
- 추상클래스를 상속 받는 경우에 그 추상클래스에 abstract 메소드가 존재하면 반드시 재정의 해야 한다. (자식인 sub가 반드시 정의!!!)
- implements
- 인터페이스(interface)를 상속 (으악, 그런거였군!!!)
- 인터페이스안에 존재하는 모든 메소드는 메소드의 헤더(header)만 가진다.
- 인터페이스를 상속 받는 경우에 그 인터페이스의 모든 메소드는 반드시 재정의 해야 한다. (당연)
- 추상클래스란?
- 추상 클래스의 핵심 아이디어는 다음의 경우에 유용하다는 것이다.
- 구현할 수퍼 클래스에 공통적인 기능이 있을 때
- 어떤 행위가 특정 클래스들에게만 사용될 때나 슈퍼클래스 속에 포함할 수 없을 때이다.
- 그래서 슈퍼 클래스를 추상클래스로 구현한다.
- 그리고 수퍼클래스가 공통으로 가지는 메소드를 정의한다.
- 그런 다음 이 추상 클래스를 상속하여 각 서브 클래스를 구현한다.
- 그리고 그 클래스에 유일한 메소드를 추가한다.
- 추상클래스는 서브클래스에서 반드시 구현해야하는 행동을 기술하는 일종의 약속(계약)을 제공하는 것이다.
- 추상클래스를 쓰려면 반드시 abstract이라는 글자를 넣어줘야 한다.
- 추상클래스와 인터페이스 모두 타입으로서 특정 계약을 명시할 수 있게 한다.
- 다시 말하면, 추상클래스의 서브 클래스나 인터페이스를 구현한 클래스에서 특정 메소드를 정의하도록 요구할 수 다는 말
- 이 두 메커니즘은 다소 겹치는 듯하다. 인터페이스는 다중 상속의 형태를 나타낼(드러낼) 수 있다.
- 왜냐하면 클래스를 정의할 때 하나 이상의 인터페이스를 구현할 수 있기 때문이다.
- 인터페이스는 public 메소드나 상수에 대해서만 기술하는 것을 허용하고 인터페이스 내에서는 어떤 구현도 해서는 안된다.
- 추상 클래스의 핵심 아이디어는 다음의 경우에 유용하다는 것이다.
- 인터폐이스란?
- 추상메소드와 파이널 변수로만 이루어진 클래스와 파이널 변수로만 이뤄진 클래스.
- 그래서 그속에 정의된 메소드는 자동적으로 public abstract'로
- 또한 정의된 변수는 자동적으로 public static final로 선언이 된다.
- 만약 이렇게 생성된 것들 중 이를 상속당한 자식들이 정의해주지 않으면 객체생성을 할 수 없다.
- 인터폐이스의 용도
- 강제적 상속관계를 만들지 않으면서 서로 관련없는 클래스들 상이의 유사성을 나타낼 때
- 하나 이상의 클래스들이 구현하기를 원하는 메소드를 선언할 경우
- 클래스를 보여주지 않고서 객체의 프로그래밍 인터페이스를 보여주어야 할 경우
- 인터페이스와 다중상속 (차이점)
- 인터페이스는 다중상속을 할 수 있도록 해주는 것이 아니라 다중상속을 하는 것처럼 해 주는 것이다.(속임수???)
- 클래스는 인터페이스로부터 단지 상수만을 상속
- 클래스는 인터페이스로부터 메소드의 구현(몸체???)에 대해서는 상속할 수 없다.
- 인터페이스의 게층구조는 클래스의 계층 구조와 무관하다.
- 같은 인터페이스를 구현하는 클래스들은 클래스 계층 구조 상에서 서로 관련이 있을 수도 없을 수도 있다.
- 다중상속이라 단정지을 수 없지만, 하나의 인터페이스가 여러 개의 상위인터페이스를 가질 수 있도록 함으로 인해, 다중 인터페이스 상속을 할 수 있도록 해준다.
- 인터페이스를 간단히 얘기하자면
- 이벤트 핸들러나, 각종 처리 함수를 미리 앞서 정의를 (추상화, 가상화)하면 뒤따르는 (implements)함수가 그걸 재정의 (오버라이딩)시켜준다.
- 추상메소드와 파이널 변수로만 이루어진 클래스와 파이널 변수로만 이뤄진 클래스.
- 다중??
- extends나 implements옆에 클래스나 인터페이스를 써주는 데 여기서 하나만 쓰지않고 여러개를 써주면 (구분자는 ',') 다중상속, 다중 인터페이스 상속이 되는 것이다.
중요한 자바 개념 정리
- 오버라이딩
- 상속관계에 있는 클래스끼리끼리 똑같은 메소드를 사용하는 것
- 근데 여기서 짚고 넘어가야 할 것!!! 바로 상속관계에 있는 클래스사이에서 (자식과 부모 사이에서) 부모가 정의한걸 따라하지 않고 자식이 따로 재정의를 했다고 해도 가능하다.
- 그러니까 재정의도 상관없다는 것.
- 오버로딩
- 클래스 안에서 메소드명은 같은데 인자형, 인자의 갯수가 달라지는 것을 말한다.
- 생성자 (constructor)
- java에서는 생성자를 호출할 때 new키워드가 항상 필요.
- java는 자동 메모리 관리를 해주기 때문에 메모리 할당과 생성자 호출을 나눠서 생각할 필요가 없다.
- 어제 말했던 질럿 생각나지? 거기서 몸통, 머리, 다리등을 구성시켜 주는 것이 바로 생성자.
- 생성자든 메쏘드든, 클래스 안에 있다면 오버로딩 오버라이딩이 다 가능하다.
네트워크, 그리고 자바
- TCP/IP 이해
- 각단계 ( 1 ~ 5 )
- 피지컬 ( e.g.voltage ) (1) 최하위 계층
- 데이타 링크 ( e.g.Ethernet frames) (2)
- 네트워크 ( IP ) (3)
- 트랜스포트 ( TCP, UDP ) (4)
- 어플리케이션 ( e.g.FTP, telnet, HTTP ) (5) 최상위 계층
- 프로토콜에서 각 계층은 상대방에게 전달할 데이터와 제어정보를 가지고 있다.
- 여기서 데이터와 제어정보를 메세지라고 한다.
- 메세지는 하위계층으로 전달되면 기존 메시지에 추가적인 제어 정보를 붙이게 되는데 이를 캡슐화라고 한다. (encapsulation)
- 이와 반대되는 과정은 decapsuleataion
- 우주 발사 장면을 연상시켜 비교해보자. 우주는 처음 쏘아올릴 때, 엄청 크다. 하지만 출발하면서 옆에 엔진들을 하나씩 분리해 나간후 결국 우주에 도달할 땐, 조그만 비행기 하나만 남는다.
- 각단계 ( 1 ~ 5 )
- 애플릿
- 예전에 javaTV를 실습했을 때, xleTView를 사용했던거를 떠올리면 됨.
- 그러니까, xlet이 TV수상기와 *.class간에 연결해주는 것이라면
- applet은 웹브라우저와 *.class간에 연결해주는 것이다.
- 근데 try, catch...이거 아무래도 오류를 받아 예외처리하는 것 같은데. 잘 모르겠다...
- 함수의 구성이 init, main 등등 거쳐야할 절차가 분명히 존재하는 듯. 대뜸 함수를 임의적으로 만들 수 있을 것 같진 않다. 주의하자.
자바 상식 (0512)
- 왜 객체지향이라 불리는가?
- 우선 함수나 명령을 구현하는 것을 살펴보면 알 수 있다. 우선 좀더 발전적인 기능의 메쏘드(그러니까 일반적인 명령어)를 호출하려면, 우선 이것과 관계된 인자를 불러야하는데 대게 객체를 부르는 경우가 많다.
- 예) br = new BufferedReader(new InputStreamReader(System.in));
- 그래서, 함수의 정의와 구현에 관해 타입을 선언하고 그것의 쓰임새와 작동원리를 위주로 이해해야하는 C와 달리, JAVA는 이것과 맞물리는 오브젝트(객체)를 위주로 알아야한다. 서로간 연관성이 정말 깊다.
자바 상식 (0513)
- 객체중에 Output이란 이름이 들어간 것들은 써주기 위한 객체들(write작업)이다.
- 반대로 Inptu이란 이름이 들어간 것들은 해당 파일에 있는 걸 읽어내기 위한 객체들(read작업)이다.
- 메쏘드 명명시, set에 관한 것은 재설정과 같이, 마치 sql에서 update와 비슷한 용도로 쓰일 때 써주면 좋을 것 같다.
- 객체일 경우, java.io.Serializable 인터폐이스를 구현하지 않으면 마샬링이 되지 않는다는 것을 반드시 기억해야 한다. (181페이지 참고)
- 박싱(boxing) : 원시값을 특정값으로 감싸주는 작업을 흔히 박싱(boxing)이라고 일컫는다.
정적 메소드, 숫자 및 정적 변수
- 정적 메소드(static)는 객체 레퍼런스 변수 대신 클래스명을 써서 호출합니다.
- 정적 메소드는 힙에 그 메소드가 들어있는 클래스의 인스턴스가 없어도 호출할 수 있습니다.
- 정적 변수(역시 static)는 해당 클래스에 속하는 모든 객체에서 공유하는 변수입니다. 인스턴스 변수는 각 인스턴스마다 사본이 하나씩있지만 정적 변수는 한 클래스에 복사본이 하나밖에 없습니다.
- 자바에서 상수를 만들 때엔 변수에 static과 final로 지정하면 됩니다.
- final로 지정한 변수값은 값을 한 번 대입하면 바꿀 수 없습니다.
- final 메소드는 오버라이드 할 수 없습니다.
- final 클래스는 확장할 숭 없습니다. (즉, 하위클래스를 만들 수 없습니다.)
XML
DTD
- Document Type Definition, 마치 DB설계를 위해 DBA가 필요했던 것처럼 XML에선 DTD를 설계.
- 엘리먼트 (구성 요소) 선언
- <!ELEMENT 이름 내용>
- 만약 <HTML>에서 <body>안에 속성이 들어있는데 이 <body>를 정의한다고 가정을 하면
- <!ELEMENT body (img | a)*> 이런 식으로 정의.
- 또한 <head> 김세훈 </head>라고 당연하게 여기는 이 <head>는 이렇게 정의 됐을듯.
- <!ELEMENT head (#PCDATA)> 파싱된 캐릭터 데이터란 의미의 #PCDATA(이건 김세훈을 의미하는 내용)
- 만약 특정 구성체에 속해있는 '속성'이나 '구성'이 아예 없을 경우, <!ELEMENT 이름 EMPTY>
- 속성의 선언
- <!ATTLIST 엘리먼트이름 속성이름 속성형(혹은 속성기본값)>
- 참고 : 프로패셔널 리눅스 1018페이지
- 만약 <img src="xml.gif"/>이런 속성일 경우,
- 1) 엘리먼트(구성체)이름: img.
- 2) 속성이름: src.
- 3) 속성형: 문자열 (CDATA).
- 4) 속성기본값(혹은 옵션): 필요함
- 이렇게 된거라면, <!ATTLIST img src CDATA #REQUIRED>
- <!ATTLIST 엘리먼트이름 속성이름 속성형(혹은 속성기본값)>
- ENTITY
- C로 따지면 #define과 같은 것.
- <!ENTITY % Type "individual | band"> <!ATTLIST artist type (%Type;) #REQUIRED> 이것이랑
- <!ATTLIST artist type (individual | band) #REQUIRED> 이건 같은 뜻!!!
XSL
- 이거만 잘 이해하면 끝날 듯
- CSS와 비슷하지만 좀 어려운 것 같기도.
- <xsl:template match="/">
- 일단 이것부터. 이건 /을 만나면 xsl:template이 적용된 처리를 하라는 뜻?
- 그러니까 <xsl:template>에서 </xsl:template>까지 XML 문서에 적용하라는 것. 해당 템플릿을 적용하겠노라며.
- <xsl:apply-templates/> 말그대로 해당 템플릿을 적용.
- 해당템플릿이란? 바로 아래 있는 글들.
- XSL도 XML과 마찬가지로 문법에 대한 관대함이 없다. 엄청나게 엄격.
- 빈테그라도
이렇게 하면 에러.
</br>을 합친
로 적어줘야 에러 안 난다.
- 빈테그라도
- <xsl:value-of select="artist"/> 이거는 실제 소스에서,
- <artist> Frank Sinatra </artist> 이렇게 표시된 부분의 Frank Sintra를 저걸 선언한 부분에 넣는 것이다.
- <xsl:for-each select="tracks/track">
- 이건 php문과 비슷하네. 즉, tracks/track이 반복될 때마다 <xsl:for-each>~</xsl:for-each>문을 실행하라는 듯.
- <xsl:value-of select="title/@numberoftracks"/> 이건<ATTLIST> 속성에 관한 것.
- 여기서 @이하의 것은 속성입니다. 위의 것은 title엘리먼트의 속성 numberoftracks의 속성값을 나타냄.
XPath
- DB에서 SQL로 질의하듯, XML에선 XPath로 질의를 한다.
- /root라고 치면 <root>엘리먼트를 가져오라는 것으로 이해하자.
URL쿼리
- 선행조건: 일단 mssql 서버 프로그램을 설치하자.
- MSSQL이란 건 참 특이하다. URL에 직접 질의어를 넣기 때문인데, 자칫 이런 사태가 발생할지도 모른다.
- 전혀 간편하지 않은 위와같은 주소 입력은 저장 프로시져(stored procedure)를 통해 보완됐다고 한다.
저장프로시져
- 참고: 파싱(parsing)이란 구문분석(정제) 작업을 말함.
- 저장 프로시져는 위에서 언급했던 MSSQL의 처리과정중 불필요한 과정을 생략한다. 이로 인해 트래픽이나 성능향상을 가져올 수 있다.
- 저장 프로시져는 편하기도 해서 SQL구문을 URL에 직접 입력해야하는 고생을 덜 수 있다.
- 예를 들어, SELECT CategoryName FROM Categories 이거를 CategoryInfo로 정의하고 싶다면
- CREATE PROC CategoryInfo AS SELECT CategoryName FROM Categories FOR XML AUTO
- 그래서 실제 URL에 http://localhost/mini?sql=EXEC+CategoryInfo&root=ROOT이런 식으로 입력해도 된다.
- CREATE PROC CategoryInfoWithInputParam @CategoryID int = 1
- AS SELECT CategoryName FROM Categories WHERE Categories.CategoryID = @CategoryID FOR XML AUTO
- 추가된 옵션사항은 @뿐. 이건 매게변수, 즉 인자라고 생각하면 되겠지.
- http://localhost/mini?sql=EXEC+CategoryInfoWithInputParam+2&root=ROOT
- http://localhost/mini?sql=EXEC+CategoryInfoWithInputParam+@CategoryID=2&root=ROOT 바로 위의 것과 똑같음.
- 근데 URL입력 부분중 맨 뒤에 붙는 @root=ROOT이거 넣기 싫다면
- CREATE PROC CategoryInfoWithoutRoot @CategoryID int = 1 SELECT '<ROOT>' SELECT CategoryName
- FROM Categories WHERE Categories.CategoryID = @CategoryID FOR XML AUTO SELECT '</ROOT>'
- 여기서 주의할 것 : SELECT '</ROOT>' 요걸 주의하라
- 이제 xsl에 적용시켜 보자.
http://coffeenix.net/data_repository/html/gcc-err.html
C 상식
- strdup는 할당하고 그곳에 문자포인터를 대입시키는 명령을 한 줄로 표현하는 명령어이다.
- 문자 포인터
- 만약 인자값을 포인터로 받은 후, 함수 안에서 포인터변수를 선언한다면 이건 주소값만 취해 sprint등으로 값을 넣어줄 수 있다. 주소값만 넘겨주면 되니까
- 또한, sqprint를 이용해서 해당 문자열에 값을 계속 추가시켜줄 수 있다.
- 예) A += sprint("asdf", A); //기존의 문자열 값에 asdf를 추가.
- 구조체 정의와 typedef
- 어렵게 생각하지 말자. 구조체에 언더바가 난무하더라도 그 틀을 이해하면 된다. 예를 들어,
- typedef struct _aaa_{Clarysage}aaa; 이렇게 적으면 struct _aaa_를 aaa를 선언하는 것이다. 결국 언더바는 구분해주는 것이다.
- GDB 디버깅 프로그램
b file.c:func이런 식으로 하면 외부파일의 특정함수에 브레이크 포인트를 걸어줄 수 있다. b 10 if var = 0 10행에 브레이크 포인트를 설정하는데 var 변수 값이 0일 때 작동 외부파일일지라도 브레이크 걸어준후 c를 하자!!! (컨티뉴)
- 리눅스 팁
이 명령을 기억하면 일일히 ps -ef안해줘도 attach할 때 많은 도움이 될것이다. -watch -d pgrep "프로세스명1|프로세스명2|프로세스명3"
해상도 바꾸고 싶을 때 리눅스 콘솔 화면의 해상도 설정하기 위해서는 grub.conf 안에 다음 라인을 추가한다. kernel /vmlinuz-2.6.x ro root=LABEL=/1 rhgb quiet vga=792 정확한 vga 설정값은 아래와 같다.
Colors 640x480 800x600 1024x768 1280x1024 1600x1200
256 769 771 773 775 796 32768 784 787 790 793 797 65536 785 788 791 794 798 16.8M 786 789 792 795 799
http://servermaster.pe.kr/tc/52 <- 여기 좋다.
링크 시킬때 - ln -s /원본... /링크시킬 위치...
링크 정보를 알고 싶을 떄 - phpMyadmin과 같은 html상의 링크는 - /var/www/html/ 쪽으로 가자! 남은 하드디스크량 알아 볼 때 - df -h
하드디스크 부족할 때 - fdisk /dev/sd... - extracted는 피할 것. - 후에 mount로 정착 - 그리고 마지막으로 링크 (위의 것 참고)
마운트
- mount /dev/sdb1(원래 있던 곳.) /tmp/hadoop-root 하둡의 원위치 - 이건 뭘까? umount /media/disk - http://mwultong.blogspot.com/2007/07/linux-mount.html <- 여길 참고하라! - http://user.chollian.net/~deuckgi/LinuxServer/linux.htm <-여기도 참고하라!
프로세스의 비중이 클 때 - top로 검사 (작업 관리자와 같은 화면 실시간 출력) - pid에 따른 비중에 맞춰 막히는 프로세서 삭제 - 삭제하는 방법 pkill -9 pid - partprobe(?) 암튼 이건 재부팅 방지용이다.
하둡
- hdfs상에서 송수신할 때, 나눠야할 블록, 버퍼량을 헤아려야 한다. - 예를 들어, 너무 많은 양을 한꺼번에 보내려 한다면 오류가 발생한다.
- h-base, hdfs, map & reduce 방식은 구글 것을 따라한거다. - 하둡은 높은 전송률, 낮은 지연률 - 단, 많은 양의 컴퓨터(렉)가 병렬구조의 클러스터를 이뤄야 된다- 을 자랑한다. - moving computation 움직일 수 있는 계산. 즉, 계산처리 과정의 근접화. 즉, 데이터의 이동, 근접화보다 더 효율적인 방법 이라고 한다. - hdfs는 상호작용이라기보단, 배치 프로세싱. (이게 도대체 무슨말인지...) - 결론은, 병행처리 구조상 획기적인 '속도의 증대'는 DFS의 놀라운 발견! - 하둡의 초기화는 우선 hadoop namenod -format 디렉토리 초기화(1) - start-all.sh (2)분산파일 시스템(DFS) 가동!
- 그리고 분산파일 시스템의 중지는 stop-all.sh 스크립트 이용
자세한건 여기에! http://www.joinc.co.kr/modules/moniwiki/wiki.php/JCvs/Search/Document/nutch/Hadoop?action=print
하둡의 정의
- 아파치 하둡 프로젝트는 다음을 포함하는 신뢰성 있고, 확장성 있는 분산 컴퓨팅 오픈소스 소프트웨어다.
- 하둡 코어(Hadoop Core)는, 우리의 기함 서브 프로젝트고, 분산 파일 시스템 HDFS를 제공하며 맵리듀스 분산 컴퓨팅 메타포를 지원한다.
- HBase 는 확장가능하고 분산된 데이터베이스를 하둡 코어(Hadoop Core) 위에 제공한다.
- Pig는 고수준 데이터 흐름제어(hihg-level data-flow) 언어이면서 병렬 연산을 위한 실행 프레임웍이다. 하둡 코어의 최상위에 위차하게 된다.
- ZooKeeper는 가용성과 신뢰성이 매우 높은 공동 작업 시스템이다. 분산된 어플리케이션들은 중요한 공유 상태의 업데이트를 저장하고 전달하기 위해서 ZooKeeper를 사용한다.
- Hive는 데이터 요약화(data summarization), 에드혹쿼리(adhoc querying), 데이터셋 조사등을 제공하기 위해 하둡 코어(Hadoop Core) 위에 배치된 데이터웨어하우스 인프라스트럭쳐다.
- hadoop-default.xml 이건 뭘까? - hadoop-site.xml 이건 뭘까? - $하둡홈/logs... - hadoop-daemon.sh start namenode - hadoop-daemon.sh start datanode - 위의 것도 염두해두자.
EMS
mysql 설정
- 문제가 있을 경우.
- 비밀번호를 분실했다.
- ./mysql/bin/mysqld_safe --user=mysql --skip-grant-tables &
- mysql> use mysql;
- mysql> update user set password=password('새로운암호입력') where user='root';
- mysql> flush privileges;
- 비밀번호를 분실했다.
- mysql에서 문제가 생긴다면 EMS전체에 애러가 날 수 있다.
- grant 쿼리는 심도있게 알아보자.
ln -s
- 링크시켜주는 것.
- 이것을 없애주는 절차도 까다롭다.
- ln -f --force(강제옵션)
- 그리고, 해당 폴더 /var/www/html/ 로 가서 삭제.
자바스크립트
member_list.js의 속성바꾸기. -$(id).attr=>속성바꾸기 시작하겠다. ("class", "btn_08")- $(id)에 해당하는 class속성을 btn_08로 바꾸겠다.
SQL
- client_data1 as A LEFT JOIN firm_data1 as B on A.f_id = B.f_id - 생각해보자. 모든 테이블의 값을 불러들어올 수 있는 명령!! - 생각해냈다. - UNION in SQL-tutorial (http://www.tizag.com/sqlTutorial/sqlunion.php) - SELECT employees.Lastname, employees.Firstname, invoices.Sale, invoices.Price FROM employees INNER JOIN invoices ON employees.id = invoices.EmployeeID UNION SELECT employees2.Lastname, employees2.Firstname, invoices.Sale, invoices.Price FROM employees2 INNER JOIN invoices ON employees2.id = invoices.EmployeeID; - 그냥 합치는 것 같다. - 근데 이를 중복하느냐 마느냐에 따라서 UNION ALL을 쓸 수 있다. - 뭔가를 값을 얻어서 다른 폐이지에 보낼 때(처리할 때) 한 폐이지에 두개이상의 방식이 존재할 때, 고려해야한다. 그러니까 인풋 타입의 메쏘드를 get으로 할 것인지, post로 할 것인지, 뭐 요런 것들이 2개 이상이라면 충돌(아마 그런걸거다.)을 우려할 수 있으므로 미리미리 막아두자. 검색엔진이라던지, 처리 버튼이라던지... - mysql은 세개의 테이블을 병합, 조회하는 거 빼곤 모든 작업이 가능하다. 동적콘텐츠 상에서 구현 불가능한 것도 mysql의 쿼리를 잘 굴려본다면 해답이 나온다. AVG in SQL-tutorial (sql-tutorial.net/SQL-AVG.asp) - SELECT AVG(column 1) FROM Table1 => SQL 해석 테이블 1의 column1속성에 속한 값의 평균값을 알려주세요. - 예) SELECT AVG(salesAmount) AS AvgSaleAmount FROM Sales => Sales테이블의 SalesAmount 속성의 평균값을 알려주세요. GROUP-BY in SQL-tutorial (sql-tutorial.net/SQL-GROUP-BY.asp) - 이건 위에 언급한 AVG나 SUM과 같은 것과 같이 쓰이는 경우가 많다. - SELECT Employee, SUM (Hours) FROM EmployeeHours GROUP By Employee => Employee에 해당하는 값을 동등한 것끼리 항목을 묶은 다음 각 그룹별 Hours 합친 값을 구해주세요. 별명을 지어 같은 소스를 각각 달리 구분하여 사용하기 - 간단하다. 필드명을 입력하는 곳에 필드이름을 쓰고 double-quote(쌍따옴표)로 명명을 하면 받아지는 이름이 바뀌게 된다.
해쉬 테이블
- 전화번호부, 그러니까 찾아보기 쉽게 색목별로 나눈 사전이나 전화번호부라면 해쉬테이블! - 어떤 곳에 넣어야 할 지, 그러니까 구분하는 기준을 정하는게 최우선과제겠지! - 하지만 이 역시 완벽하진 않아, 쉽게 에러가 날 수 있는데 대표적으로 값을 추가할 수 없는 충돌 현상이 그것이다! - 해결방법 다중슬롯: 그냥 2차원 배열 만들면 되지뭐! - 하지만 한쪽 슬롯에만 치중된다면- 낭비, 지연. - 결국 단순, 신속적인 해시테이블을 만들어야! - 선형탐색 : 꿩대신 닭. 해당 슬롯이 꽉차면 그 옆자리! - 동적 슬롯: 슬롯의 갯수를 가변적으로 관리하는 방법. 비교적으로 적극대처 방법. - 이 동적슬롯의 구현은 동적배열이나 연결리스트로 작성해야. 물론 이 때엔, 양이 방대해짐을 전제로 한다면, - 이분 검색을 하는게 유리하겠다. - 검색이라기 보단, 빠른 검색을 위한 자료관리 알고리즘.
uts
1) 용어 정리 - 스테이지 : U. T. S의 세단계를 세분화 시킨것.(같은 S를 가더라도 S1에 갈 건지, S2에 갈 건지 알아야지.) - DH테이블, 크게 svc와 tid로 나뉘는데 업데이터와 뭐가 다를까. 일단 보류 - UTS_ENV 이건 한 데이터의 세부정보. 2) 함수 - record_direction 3) 돌아가는 구조 - 폴더와 같은 이름.C : 거의 메인함수와 같은 격, 익스트렉터와 트렌스포머 그리고 이에따른 분리된 헤시테이블관리 그리고 헤시엔트리(hentry)를 관리하고 있다. - 폴더와 같은 이름.h : 모든 것을 정의하는 헤더파일, 참고로 위에 메크로 부분은 중복선언을 막기위한 것이란다. php의 require-once라고 이해하면 될 것이다. - transform.c : 후에 uts_transform함수에서 호출하게될 loc_mapping에 관여하는 파일. 4) DHTABLE정의 부분 - 2번째 부터 4번째까지의 인자 부분은 중요하다. (알아두어야 할것) - 그리고 맨 끝에서 4번째 인자는 2번째 스테이지에서 처리할 데이터(키값) - 맨 끝에서 3번째 인자는 키와 벨류를 합친 데이터량 - 맨 끝에서 2번째 인자는 해시테이블의 수(그러니까 분류처리할 종류의 갯수) - 맨 끝의 인자는 최종적으로 처리하여 보내줄 목표 단계(처음에 한건 3스테이지라고 설정했다.) 5) C 라이브러리를 기초로 만들어진 uts라이브러리 - opendir, readdir (http://blog.naver.com/PostView.nhn?blogId=beyondlegend&logNo=110029848992&from=search) - fopen 등등 여러 기능을 UTS 환경에 맞게 바꿔놨다. - 구현된 기능의 이름(함수이름)도 어렵지 않다 기존의 함수 이름 앞에 UTS라고 붙이면 된다. 6) 돌아가는 구조 - 일단, uts_extractor가 모든 걸 설정한다. 그러니까, 파일을 열고 거기안의 정보를 갖고온다.(갖고오기만 하면된다.) - 둘째로 get_direction여기서 스테이지 정하고 거기에 맞는 다음 단계 (transform)으로 간다. - 그 다음, uts_transform으로 가서, 갖고온 데이터를 기반으로 정제 또는 매핑을 한다. - 셋째로 get_direction여기서 스테이지 또 정하고 거기에 맞는 다음 단계로 간다. 헤시테이블 설정도 있다는데, 그건 나중에 알아보자. - 그 다음, uts_loader-- uts-init, uts-load, uts-fini등으로 분류되는데 여기서 아웃풋을 정리한다. 대부분 fwrite로 쓴다. - 끝 7) 함수는 C와 아주 흡사, 하지만 인자값이 어떤 것이 있으며 하는 일이 무언지 알아두자. - ecm_gen_path는 첫번째 두번째 인자값을 합쳐준다. 방을 만들거나 파일을 설정할 때 자주쓰이는 듯 하다. - extractor_id는 뭘까? - uts_emit_record이건 다음단계로 넘기는 것. 아주 중요한 것 인자값은 굳이 캐스트 연산을 하지 않아도 된다. 8) 설정 파일의 2대산맥. makefile.am이랑 configure.in이다. 여기에 설치를 해야 모듈을 잘 설치할 수 있다. 모듈의 uts.spec!!! 그리고 한가지더, 이것을 깔고난 후, aclocal, autoconf, automake를 재설치, 재실행해야 한다. 9) /usr/clx/bin/ecmconf -v 해주면 설정된 것이 나온다. 여기서 현재의 econf(/usr/clx/etc/econf)를 지워주고 ecmconf -h를 해주면 여기서 옵션창이 나오는데 여기의 지시에 맞춰 /usr/clx/bin/ecmconf -n clunix28 -c ~~ -p 908 -e 80 -m 1 -t 1000000 -L /asdfhhl;kasj 대신 -L은 시작폐이지 설정이니 주의.(loginpage/loginpage.html -T top/top.html)해주고 ecmctl -C start를 해보자 그러면 성공! 9.5) 여기서 노드값(ndname)이름을 설정하지 않으면 실행이 되질 않는다. 10)4월 2일현재까지의 알아낸 정도는, Makefile.am을 샅샅이 훑어보자. 특히, kimsh_la_LIBADD를 잘 설정해주지 못할 경우, make파일은 잘 될지 몰라도, 후에 런맵(runmap)실행시킬 때, 모듈이 존재하지 않는다며 cannot create job!!!이란 에러메시지가 뜰것이다. 그러니까 이것도 주위하며 잘 보자. 그러니까 주의!!!(num2bcd 함수 이용할 때 특히 주의!!!) ↑ ecm_memset + ecm_memcpy 이건 항상 같이 따라다니면 좋을 것 같다. 특히 이거 하기전에, ecm_malloc같은건 uts_alloc_record에서 알아서 해주기때문에 이런건 참고하자. free (해제)를 같은 대상으로 2번해주면 안되겠다. 디버깅 해줄 때, dis/en은 그간 만들었던 브레이킹 포인트를 각각 일괄 삭제/복구와 같다. 디버깅 만큼 강력한 터미널의 커맨드!!! 10-1) watch -d 'pgrep -l "edbd|ebcd|egid|ext2009년 4월 2일 (목) 08:54 (UTC)Clarysage"; ls -l /usr/clx/bigfiles' 10-2) tail -f /tmp/kimsh.log 11) call by reference를 좀더 이해하자. 그러니까 함수의 인자값자체를 함수를 거치면서 변하게끔 해주려면 a(&b)이렇게 보내주고 이걸 받는 쪽, 그러니까 함수가 구현된 부분에서는 void a(*b)이렇게 해주고 그 안에선 b라고 쓰면 되겠지.
12) memcpy와 strncpy의 다른점 - memcpy는 0x00에 상관 없이 지정한 갯수만큼 끝까지 복사시켜주고 strncpy는 0x00를 만나면 중도에 끝내버린다. 14) static의 특징!! - 유용하다면 엄청 유용한 변수 타입. - 외부에서 함수를 호출할 때, refresh(다시 초기화)가 되지 않고 변수가 그대로 설정이 된다. - 그냥 변수 선언과 차이점을 명백하게 알아두자. - 나중에 인덱스를 활용할 때, 특히, UTS에서 넘어온 값이 몇번째인지 알고 싶을 때 활용하면 좋을 것 같다. - C언어의 실전156페이지 참고해 볼 것. - 자동기억 변수와는 달리, 정적기억변수는 초기화자('=x')가 없아도 0으로 초기화됩니다. 15) 그냥 시작주소값을 할당했던 주소에 대입을 시키면, 나중에 free에서 에러가 발생한다. - 이를 해결하기 위한 방법은 시작주소값을 대상으로 기존의 할당했던 주소에 memcpy를 하면 나중에 에러가 발생하지 않는다.(중요!!!) - 이것때문에 memcpy를 함에 있어 주소값만 알아내도(할당하지 않더라도)이를 즉시, 카피해낼 수 있다. 시작 주소값만 있어도 된다!!! 16) strtol은 atoi보다 여러면에서 좋은 장치이다. 그러니까, atoi는 에러가 나더라도 이 것을 잡기 힘든데 strtol은 디버깅이 가능하다. 17) 더 알자.
헤시테이블의 원리
1) kimsh_0402.c 그리고 kimsh_0402.h참고 2) 트랜스폼이 주된 관건인데, 여기서 uts_get_dhtable이란 게 있다. 이것은, 키가 아닌 벨류값을 넣어야할 구조체가 미리 선언되있는 데이타를 집어넣어 주는 곳이다. 다시말해서, 일단 키값을 들어온 값의 키에 해당하는 곳을 입력받은 후, 그것에 맞는 헤시테이블을 제시한 후, (없으면 새로 생성. 물론 멤셋해줘야 겠지.) 이곳에 값을 집어넣는 것이다. 3) 그리고 거기에 맞는 데이터를 넣었다면 uts_hentry_transform으로 간다. 즉, uts_transform은 예전부터 자신의 임무가 끝남. 4) 여기서 들어온 데이터 값은 앞서 합쳐진 값으로 각각의 키값과 합쳐진 벨류값으로 나뉘어진다. 이를 받아들이고 보내는 곳. 결국엔 이 데이타 가 loader쪽으로 간다. 5) loader쪽으로 들어와 출력되면 성공!
- 참고사항
- 어떤 함수가 요약을 위한 헤시테이블이고, 어떤 함수가 메핑을 위한 헤시테이블인가?
- 우선, uts_init_dhtable이 메핑을 위한 헤시테이블함수이다.
- 그리고, uts_get_dhtable이 요약을 위한 헤시테이블함수다.
- 여기서 요약은 uts_transform에서 강제적으로 호출을 통해 이뤄지는 반면 메핑은... 글쎄 아무래도 자동적으로(프레임웤에 의해서) 들어가는 것 같다.
- 어떤 함수가 요약을 위한 헤시테이블이고, 어떤 함수가 메핑을 위한 헤시테이블인가?
메핑의 원리
1) 기호로 돼있거나 알 수 없게 돼있는 정보( 예)유닉스타임 )를 알아보기 쉽게 만들어 버리는 것. 2) 그러기 위해선 EMS에서 작업했을때, setting처럼 설정돼있는 테이블을 꼭 참고해야하겠지 3) 이것도 검색(lookup)하는 과정에서 헤시테이블이라고 했는데 이것은 위의 것과 다르게 순수히 데이터를 메핑하는 것이고 위에 것은 한데로 모아 요약해주는 것이므로 엄연히 다른 것이다. 4) 위의 헤시테이블은 기존에 없던 테이블을 생성하게 되는 것, 즉 키 값에 의해 테이블을 생성하고 거기에 넣는 것이다. 5) 하지만 메핑에서 쓰이는 헤시테이블은 기존에 있는 여러테이블 중, 찾아보기 쉽게 키값으로 색인이 가능하게 한 후, 이것을 통해 데이터를 개조시키는 것이다.
빅파일의 원리
- 빅파일은 레코드 단위(한 records... 로더나 익스트렉터, 트랜스포머에서 한번에 받아들이는 객체단위)분산해서 저장해주는 아주 제한적인 분산파일 아키텍쳐.
- 분산용-> 그러니까, extractor에서 하나의 로컬파일을 추출하려 할 때 발생할지 모를 병목현상이 있을 수 있다.
- 그래서 이를 하나의 extractor가 아닌 각각의 (여러개의) extractor를 푸는게 훨씬 빠를 듯.
정제의 원리
1) kimsh_0408.c 그리고 kimsh_0408.h참고 2) 일단, 이것을 하기에 앞서 짚고 넘어가야 할 것이 있다. 첫째, 받고자 하는 곳의 주소를 정확히 알아야 한다. 둘째, strtok를 하더라도 원하는 데이타 값이 공백이 있어선 안된다. 셋째, memcpy를 해주더라도 앞서 언급한 주소의 개념을 절대 가볍게 여겨선 안된다. 3) 이는 결국 헤더(설정)파일의 잘 짜여진 구조체와 extractor의 논리 흐름에 의해 판가름 난다. 그 후엔, 임의로 설정해 놓은 memcpy(내 것엔 ksh_memcpy)에 의해 보여지게 되는 것이다. 특별한 논리는 없다. 깔끔하면 된다.
데이터마이닝
- 일반적으로 데이터 마이닝이란 일정의 데이타를 가지고 유추를 통해 또 하나의 새로운 정보를 생산해내는 과정을 말한다.
- 많은 데이터 가운데 숨겨져 있는 유용한 상관관계를 발견하여, 미래에 실행 가능한 정보를 추출해 내고 의사 결정에 이용하는 과정을 말한다.데이터베이스로부터 과거에는 알지 못했지만 데이터 속에서 유도된 새로운 데이터 모델을 발견하여 미래에 실행 가능한 정보를 추출해 내고 의사 결정에 이용하는 과정을 말한다. 즉 데이터에 숨겨진 패턴과 관계를 찾아내어 광맥을 찾아내듯이(mining) 정보를 발견해 내는 것이다. 여기에서 정보 발견이란 데이터에 고급 통계 분석과 모델링 기법을 적용하여 유용한 패턴과 관계를 찾아내는 과정이다. 데이터베이스 마케팅의 핵심 기술이라고 할 수 있다.
- 예를 들어, 한 백화점에서 판매 데이터베이스의 데이터를 분석하여 금요일 오전에는 어떤 상품들이 잘 팔리는가, 그리고 팔리는 상품들간에는 어떤 상관관계가 있는가 등을 발견하고 이를 마케팅에 반영하는 것이다. 따라서 데이터마이닝의 필수 요소는 신뢰도가 높은 충분한 자료이다. 이것은 신뢰도 높은 충분한 자료가 정확한 예견을 가능하게 하기 때문이다. 그러나 너무 많은 자료는 오히려 데이터마이닝의 예견 능력을 떨어뜨릴 수 있으므로 최적의 결과를 산출할 수 있는 의미있는 자료의 확보가 필요하다. 한국에서 데이터마이닝은 아직은 초기 단계에 머물러 있다. 그러나 곧 일반화될 것으로 생각된다. 그 이유는 데이터마이닝을 하기 위한 최적의 시스템이 되는 데이터웨어하우스가 국내에 이미 많이 구축되어 있기 때문이다. 또 기업의 요구 사항이 주로 고객관리에 중점을 두는 데이터베이스 마케팅 쪽으로 가고 있기 때문에 데이터마이닝의 발달은 급속히 이루어질 수밖에 없다. 한편 기술적인 면에서 데이터마이닝을 잘 구현할 수 있는 소프트웨어가 나오면 데이터웨어하우스는 축소될 것이라는 의견도 있다
데이터 웨어하우스
- 데이터 웨어하우스의 개념
- 데이터 웨어하우스는 1980년대 중반 IBM이 자사 하드웨어를 판매하기 위해 처음으로 도입했던 개념으로, IBM은 인포메이션 웨어하우스(Information Warehouse)라는 용어를 사용하였다.
- 이후 이 개념은 많은 하드웨어와 소프트웨어 및 툴 공급 업체들에 의해 이론적, 현실적으로 성장하였으며, 1980년대 후반 인몬(Inmon)이 데이터 접근 전략으로 데이터 웨어하우스 개념을 사용함으로써 많은 관심을 모으기 시작했다.
- 데이터 웨어하우스는 원시 데이터 계층, 데이터 웨어하우스 계층, 클라이언트 계층으로 구성되며 데이터의 추출, 저장, 조회 등의 활동을 한다.
- 데이터 웨어하우스의 특징을 보면,
- 운영 시스템은 조직 운영에 필요한 재고관리와 회계정보, 영업 시스템과 같은 특화된 기능을 지원하지만
- 데이터 웨어하우스는 고객과 제품, 회계와 같은 주제를 중심으로 데이터를 구축한다.
- 운영 시스템의 데이터는 종종 코딩 방법과 형식에 일관성이 없을 때가 있으나,
- 데이터 웨어하우스의 모든 데이터는 일관성을 유지하여 데이터 호환이나 이식에 문제가 없다. 운영 시스템은 접근하는 시점을 정확히 유지하는 반면 데이터 웨어하우스에 저장된 데이터는 특정 시점에 데이터를 정확하게 유지하면서 동시에 장기적으로 유지될 수도 있다.
- 운영 시스템은 데이터는 레코드 단위로 계속 수정된다.
- 그러나 데이터 웨어하우스의 데이터는 대량으로 로딩되어 나중에 사용된다. 현존하는 데이터는 수정하지 않으므로 일관성이 유지된다.
- 데이터 웨어하우스의 특징
- 시간 의존(time dependent)
- 시간에 따른 데이터의 적재 및 분석
- 비휘발성(non-volatile)
- 데이터가 갱신되지 않고 질의 목적으로 사용 - 일관성유지
- 운영 데이터가 아니고 이력 데이터
- 주제 중심적(subject-oriented)
- 의사 결정 지원을 목적으로 추출된 데이터
- 통합된(integrated) 다양한 응용에서 사용되는 엔티티를 통합
- 시간 의존(time dependent)
고급 매크로 표현식에 사용되는 여섯가지 테크닉(발췌)
- 첫째, 문자열 리터럴은 합쳐진다.
- 이 기능을 사용하면 긴 출력 문장을 손쉽게 여러 개의 부분 문자열로 나눌 수 있다.
printf("이름: %s\n" "나이: %d\n" "전화번호: %s\n", a, b, c); printf 다음에는 총 세 개의 연속된 문자열 리터럴이 나타난다. 이 세 개의 리터럴은 합쳐져서 "이름: %s\n나이: %d\n전화번호: %s\n" 과 동일한 문자열이 된다.
- 둘째, ## 연산자를 사용해서 토큰을 합성해서 만들어 낼 수 있다.
- ##은 합치기 연산자 이다. 다음과 같은 기능을 생각해 보자.
COUNT(start)라고 선언을 하면 DWORD startCnt; 라는 변수를 선언하는 기능이다. 이를 매크로를 이용해서 만들어 보면 아래와 같다. #define COUNT(val) DWORD val##Cnt
- 셋째, # 연산자는 전달된 인자를 문자열로 변환시킨다.
- start를 매크로 인자로 전달했다면 "start"가 된다는 말이다.
- 변수 값을 출력하는 매크로를 생각해 보자.
PRINT(start)를 하면 화면에 start = 3과 같은 형태로 출력하고 싶은 경우다. 이럴 땐 아래와 같이 매크로를 만들면 된다. #연산자와 위에서 소개한 문자열 리터럴이 합쳐진다는 점을 이용한 것이다. 좀 꽁수 같이 보인다면 두 번째 방식같이 구성할 수 도 있다. #define PRINT(val) printf(#val " = %d", val) #define PRINT(val) printf("%s = %d", #val, val)
- 넷째, #@ 연산자는 전달된 인자를 문자로 변환시킨다.
- a를 매크로 인자로 전달했다면 'a'를 만들어 주는 것이다. 아래와 같이 전달된 인자에 대한 문자를 생성해주는 매크로를 예로 들 수 있다.
#define makechar(val) #@val
- 다섯째, 매크로의 내용이 복잡하고 한 줄 이상의 표현식이 필요한 경우엔 주로 do ~ while(0)문을 사용한다. (이건 이번 ECM에서도 쓰인 것을 봤다.)
- 이렇게 하는 이유는 do ~ while(0)가 하나의 구문으로 해석되고 자체 블록을 가지기 때문이다.
- 이것을 단순 괄호({, })로 대체하면 안 된다. 중첩 if문에서 에러가 나기 때문이다. 주로 아래와 같이 사용한다.
#define COMPLEX_MACRO(a,b,c,d) do { \ int complex_variable; \ // some processing; \ } while(0)
- 여섯째, 릴리즈 버전에서는 무시되는 매크로를 구성하는 경우다. 주로 디버깅 출력을 하는 매크로가 여기에 속한다. Visual C++ 6.0에서는 '?' 연산자를 사용해서 쇼트 서킷을 구성하는 방법을 주로 사용했다. 하지만 이 후 출시된 Visual C++에는 __noop이라는 내장 함수를 가지고 있다. 이 함수는 인자를 모두 무시하는 기능을 한다. 따라서 예전에 복잡한 쇼트서킷을 사용했던 함수를 두 번째와 같이 간단하게 구성할 수 있다.
#define TRACE 1 ? 0 : OutputDebugString #define TRACE __noop
잠깐!!
- file.c에서 중요한 거 발견!
- _setmode(fd, _O_BINARY). 이거 때문에 ecm_open에서 ECM_O_CREAT | ECM_O_TRUNC등등이 쓰이는 구나. 이 함수를 이용하게끔!
- ECM_O_CREAT -> ecm_creat
- ECM_O_TRUNC -> ecm_trunc (by o_flags_ecm2native)
- _setmode(fd, _O_BINARY). 이거 때문에 ecm_open에서 ECM_O_CREAT | ECM_O_TRUNC등등이 쓰이는 구나. 이 함수를 이용하게끔!
자료 구조 중, string 관련 발췌
- string에 관한 함수를 알고싶다면 c로쓴 자료구조론 96쪽을 보자.
- 기존의 함수보다(strcat이나 strcpy...) 더 좋은 함수를 만들 수 있다. 포인트는 임시문자열(temp)를 두지말것. 공간과 시간의 낭비
- 패턴 매칭
- 그 일례가 이거다. strstr을 구현한 함수보다 빠르게 만들고 싶다면,
- 우선 실험대상의 끝문자와 같은 길이의 위치에 대상문자에 적용
- 그리고 나서 끝문자가 실험대상의 것과 같은지 하나하나 나아가며 비교하다가,
- 같다면, 앞부터 차근차근 비교하기. 만약 주소값이 실험대상의 끝주소와 일치한다면 패턴매치 성공!
- 그 일례가 이거다. strstr을 구현한 함수보다 빠르게 만들고 싶다면,
- 하지만 이 역시 복잡도로 매기자면 좀 그렇다. 좀더 빠른 걸 만들려면
- 위에서 끝문자끼리 검사를 차근차근 했지, 그러면 그 와중에 대상의 패턴역시 읽어냈으니까 이걸 참고하자는 것.
- 그러니까 엄한 패턴이 나오면 이걸 무시하고(끝문자가 서로 같다하더라도) 넘어가자.
- 이 엄한 패턴을 정의한 함수가 따로 있다던데 이를 실패함수.
- 이건 좀 어렵긴 한데 차차 알아가야 한다. 101쪽에 나왔으니까 함 참고해보자.
이맥스 팁
1) C-x, r, m 북마크 표시해두기 2) C-x, r, l 표시해둔 북마크로 가기 3) C-x, r, b 표시해 둔 북마크로 가기 4) yum -update 이건 리눅스인데, 중요한 것. 5) C-x, [스페이스바] -> 이거 아무래도 브레이크(gdb)걸어놓는 것 같은데. 6) M-';' 소스코드가 있을때 주석 삽입. 자동으로 주석끼리의 줄도 맞춰줌. 7) M-q 주석이 지정된 폭을 넘어가면 알아서 칸을 맞춰준다. 8) C-space 블록 지정, 2번 하면 마킹까지 된다 9) C-u M-';' 현재줄에서 시작하는 주석 삭제. 블럭이 지정되어 있으면 블럭 전체 주석 처리함.
이맥스 섭버젼(svn) 팁
1) svn - failed : Valid UTF-8 DATA란 메세지가 나온다면 export lang의 설정을 해야한다. 현재 .bashrc로 alias 설정을 했기때문에 이맥스작업이라면 UTF-8이 아닌, euc-KR로 그 외에 작업은 가급적 UTF-8로 작업을 해야한다.
ECM-core 배웠던 명령어 나열
1) ./ecmctl -p 908 -e -n clarysage -c kimsh -C start 1.5) 근데 -p에서 908은 디폴트 값이므로 굳이 설정을 안해줘도 된다. 단 908이 아닌 다른 포트로 지정하고 싶으면 -p 숫자를 써야한다. 2) CFLAGS="-g -Wall" ./configure --enable-debug --prefix=/usr/clx 2.5) 단, UTS-modules 에서는, --disable-hadoop이라고 적어야한다. 3) edbd 4) ps -C ebcd (이건 근데 ps, kill같은건 리눅스 커맨드와 관련 깊다. man 으로 공부하자) 5) kill -usr1 (근데 이건 리눅스 커맨드 창에서 실현) 6) 갑자기 makefile하는 도중, 이상한 현상이 발생하면 - 사용환경이 다를 경우 aclocal, autoconf, automake를 실행하자. - 사용자를 root로 바꾼다. - autoreconf를 실행한다. (아마 이런 경고문이 뜰 것이다.) 7) pkill -usr1 그리고 프로세스 이름
IIS
- 인터넷 인포메이션 서버의 약자, 서버 프로그램
- ftp, www에 대해선 어느정도 알고 있으니.
- smtp는 아웃룩
- nntp역시 아웃룩인데, 토론그룹에 관한 것.
- MMC는 관리자(파일관리자 같은 것)
IIS 의 요청 처리 rpm
- Request Processing Models
- 사용자 요청처리라고 정의할 수 있겠다.
- 중간에 웹서버에서 로드한 ISAPI 모듈이 더 많을 경우 처리단계가 더 많아지게 된다.
- 최근 iis 6에선 요청처리를 별도의 응용 프로그램풀(워커프로세스)처리하여 웹서버의 안정성을 높인다고 한다.
- 암튼, 해당 지원하는 php라던지 asp같은 언어라면 동적컨텐츠라고 판단 캐시(일종의 'api보관소'인듯)를 탐색후 리턴
- Request 객체는 클라이언트 -> 서버로 작용하는 여러가지 데이터
- 값을 가져올 때 클라이언트에 있는 걸 서버쪽에 적용할 때의 객체
test = Request.form("test") test = Request.cookie("test")
- 그러니까 사용자의 정보를 서버쪽에 인식할 때의 정보를 통틀어 Request객체?
참고사항
- 6.0강력한 보안 높은 안정성 및 성능향상을 위한 엔지니어링 릴리스
- 7.0플랫폼릴리스? 이전버전의 고품질 기본 웹 서버코어를 핵심적인 최신 배포 및 관리 시나리오 지원을 갖춘 모듈 방식의
확장성 높은 플랫폼으로 전환하기 위한 릴리스
- http://blog.naver.com/piasa07?Redirect=Log&logNo=60055133409
- 성능 개선은 각 프로세스에 적은 수의 DLL을 로드하고 모듈초기화와 요청처리 중에 발생하는 메모리 할당을
취소화함으로써 얻어집니다.
- iis 트레이너이자 기술전도사인 브렛 힐의 어록 (http://network.hanb.co.kr/view.php?bi_id=1228)
- 새로운 아키텍처를 도입하게 된 몇 가지 이유가 있습니다. 첫번째는 서버 동작에 대한 권한을 사람들에게 주는 겁니다. 모듈 방식의 디자인을 통해서 사람들은 어떤 모듈을 사용할지, 모듈을 읽어들이는 순서, 누가 어떤 모듈을 읽어들일 수있는지를 제거할 수 있습니다. 사용자가 만든 모듈들은 IIS7의 요청처리 파이프라인(request-handling pipeline)을 통해서 로드되기 때문에 인증 같은 내부 이벤트를 가로채는(hook up) 모듈을 네이티브 언어나 관리형 언어로 작성할 수 있습니다. 이를 통해 개발자들은 보다 쉽게 IIS7의 기능을 수정하거나 확장할 수 있습니다. 따라서, 사람들은 새로운 기능을 발표하기 위해 IIS 팀에 의존할 필요가 없으며, IIS7에 직접 추가할 수 있는 모듈을 작성하기만 하면 됩니다. 확장성은 모듈에만 한정된 것은 아닙니다. 예를 들어, 스키마, 사용자 인터페이스, 응용프로그램이 보고하는 추적 이벤트(tracing events)를 포함한 IIS7의 거의 모든 부분이 모듈로 되어 있으며 확장할 수 있습니다. -