김세훈
Clunix Wiki
목차 |
자바
- 객체, 인스턴스 , 클래스, 타입에 대해...
- 객체와 인스턴스는 동일한 개념.
- 객체와 클래스의 차이는,
- 클래스는 사용자 정의 타입
- 객체는 그 타입을 가진 실제 변수
int a, b; 이럴 때, a, b는 int라는 타입의 변수입니다...비슷하게 class Test { ... } Test t; 이렇게 하면 t는 Test라는 클래스의 객체 일종의 구조체라고 생각하는게 이해하기 쉬울 거 같다.
- 객체, 인스턴스 , 클래스, 타입에 대해... (계속)
- 클래스는 결국 일종의 타입이며 단지 int, char, long등의 컴파일러가 기본적으로 제공하는 타입(이런 것들을 built-in type이라고 부른다. 우리말로 하자면 '내재 형- 이미 만들어진 것' 이라고 할 수 있죠)과 달리 여러 가지 객체 지향적인 특성들을 가지고 있을 뿐.
- 즉, 객체 역시 일반 변수와 거의 비슷하며 단지 클래스 변수이기 때문에 클래스의 특징을 가졌다는 차이가 있을 뿐.
- 인스턴스는 '스타크래프트'에 비유해볼 수 있다.
- 프로토스에서도 여러 유닛이 있는데 그것들을 하나의 클래스라고 부를 수 있다. (각각의 기능과 특징이 저마다 다르게 구현돼있는 클래스)
- 하지만 질럿 하나가 마우스의 클릭하는 곳을 향해 움직이고 있을 때, 그 때의 질럿은 인스턴스라고 말할 수 있다.
- 즉, 클래스는 개념속에 있는 것이고, 인스턴스는 현재 존재하고 있는 것이다. 객체로 만들어진 녀석들이 바로 인스턴스!!!
http://coffeenix.net/data_repository/html/gcc-err.html
- 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
자바스크립트
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의 거의 모든 부분이 모듈로 되어 있으며 확장할 수 있습니다. -