이번 작업 이후에는 전체 시스템을 새로 제작할것이고, 그 시스템은 내가 추구하는 이상적인 설계를 따라가도록 하기 위함이다.
일단 종래의 프로그램을 물려 테스트를 시도해보았으나 -_-
mysqli 클래스가 예상과는 빗나가게 conn handler가 앞에 붙는 문제가 발생 ;;
(쿼리를 우선시 하느냐, 커넥션을 우선시 하느냐의 경로에서 php개발자가 선택한것은 쿼리가 아니었는가 싶기도 하다. 이것은 물론 statical usage에 국한되지만. 기존 펑션과의 호환성을 일부러 배제하기 위함이었을까? 어쨋든 우리는 별도의 클래스를 만들어 쓰기때문에 관계없지만)
기타 deprecated 된 수많은 펑션들의 향연 -_- 이 펑션들은 6버전대부터 remove된다고 하므로 변경된 로직을 태우던가 방향우회를 해야한다.
여하튼 약 6시간가량의 과부하테스트를 진행해본결과 class 사용에 있어 5.1버전보다 약 40%이상 퍼포먼스적 우위에 있었다는 점은 마음에 든다. (테스트전에 rpm과 가장 비슷하게 빌드했다고 생각하고 있지만. 몇가지 빠진옵션이 있어 rpm과 다소 차이가 발생할수도 있다. 그리고 우리가 쓰는 cflags나 빌드옵션은 rpm과는 다소 차이가 있어 이부분에서 퍼포먼스가 다소 향상되었을수도 있다)
전반적인 평가는 good!
그러나 소스코드를 (어차피 새로 짜야하지만) 다시 갈아야한다는 문제앞에 정신이 아득해지기 시작한다.
1. 그놈이나 kde를 설치하지 않은 fresh 서버에 설치한다. 2. selinux 를 끈다. (그러나 수정가능) 3. yum 을 update한다 (upgrade명령을 추천). 그리고 리붓 4. cnt5064-deps.sh 실행 5. cnt5064-perl.sh 실행 6. cnt5064-svcs.sh 에 mysql 루트패스워드를 수정하고, firewall.sh 에 ip주소를 수정한다. 7. cnt5064-svcs.sh 실행 & 리부팅 8. cnt5064-install.sh 실행 9. cnt5064-djbdns-localcache-install.sh 실행 혹은 bind를 설정한다.
Fresh Configuration
Directory Reviews
* 기본적인 qmail 의 시스템은 /var/qmail 에 설치된다 (prefix) 이하는 prefix sub로 설명한다. * control 디렉토리에는 qmail main system 의 설정관련 파일이 존재한다. * smtp rules 은 /etc/tcprules.d/ 에 존재한다. 설정변경후에는 컴파일이 필요하지만 service script 을 사용함으로써 (init.d의 qmailctl등) 바로 만들수 있다. qmailctl cdb
Fast Configuration
아래 설명된 target configuration 파일은 control 디렉토리 하에 있음
1. defaultdomain - 사용할 도메인만 입력 2. defaulthost - 사용할 도메인 입력 (상동) 3. locals - 로컬서버의 어드레스들을 입력 (mx 포함) 4. me - 자신의 도메인을 입력 (1상동) 5. rcpthosts - 송신을 허용할 호스트들을 입력 6. databytes - 메일이 핸들링할 최고용량 설정 7. virtualdomains - 가상도메인 설정 8. spfbehavior - spf 체크를 사용할지에 대해 설정 (enforcing화 하려면 3) 9. simcontrol - 스팸 체크관련 시스템의 컨트롤 (ip기반임)
Spam Configuration
설치후 perl CPAN 을 이용하여 필요한 모듈을 추가로 설정하여야 spam control 시스템이 정상적으로 동작한다. sudo -u vpopmail /usr/bin/spamassassin -D --lint 등으로 테스트해서 오류가 올라오는 perl 의 패키지를 찾아서 cpan을 통해 인스톨한다.
Vpopmail Configuration
vpopmail 관련 프로그램 binary path -> /home/vpopmail/bin
vadddomain 등으로 도메인 추가후 vadduser 등으로 사용자 삽입
QR: 만약 기존서버에서 이관하는 경우에는 /var/qmail/users/assign 의 값을 옮겨야 함.
(private/public) function (펑션명) (데이터 입력부):데이터 반환형식 { 실행문 } 으로 펑션의 구조는 되어있다는것
예제 public function abc (A:String):String 은 A라는 내부변수로 String을 입력받고 String 으로 반환한다는 뜻이다.
QR01 을 마치면 이제 액션스크립트의 모든것을 핸들링할 수 있게 된다.
그러나 플래시 개발자들의 클래스는 언제나 모두 완벽하지 않다. 그렇기 때문에 새로 짜야하는 클래스나, 구조들이 매우 많다.
1. 무비클립도 Class 다.. 뭐 변수타입에 있다면 말다했듯이 마찬가지 이야기다. 그러나 MovieClip 또한 엄격히는 Class 이며, 별도로 이용시 해당 무비클립의 linkage가 활성화되는 순간 as 파일이 생성되도록 되어있다. (그러나 브릿지등에서는 이 기능이 동작하지 않아 잘 모르겠다 실제로 생기는지 어쩐지) 해당 무비클립의 AS 는 별도로 생성된 파일등에서 이용하는것이 올바르다.
이를 위해서는 flash 및 모든 프로그래밍에 호환되는 표준 펑션들을 미리 익힐 필요가 있다.
이러한 펑션들은 ActionScript 3.0 Language / Language Elements / Global Functions, Operators, Statements 등을 참조하라.
기본적인 함수와 변수를 핸들링 하는 함수들이 씌여있다.
2. Sprite 클래스에 대해 알아야 한다. 이녀석은 무비클립이나 기본적인 디스플레이를 핸들링 하기 위해 필요한 기초클래스가 되어있다. 이녀석을 통해 무비클립의 인스턴스들은 객체화하여 배열하거나, 배치순을 조정하거나, 인스턴스간의 상호연동을 꽤할수 있게 되는 부분이다. 따라서 클래스형식의 코딩에 있어 중요한 부분을 차지한다.
이 클래스는 Extends 를 선헌해 사용하면된다.
이 부분의 강의가 끝날 경우 이제 액션스크립트의 이해도는 중반부를 달리게 된다. 나머지는 도움말을 얼마나 많이 보고 익히는가가 전부다.
이 자료는 간단히 플래시 액션스크립트 3.0 에 적응하기 위해 만들어진 Quick Reference로써 이 자료를 이용한 간략한 강의를 목적으로 제작되었으며, 이 자료만으로는 이해가 잘 되지 않을 수 있다.
1. 변수 핸들링
변수 = Variable = 변동하는 수치 (정적이지 않고 변하는 수치)
변수명의 정의(선언)는 var 로 시작한다. 예제코드)
var i=10;
i라는 명칭의 변수에 10이라는 정수를 담는다
흔히 이렇게들 var i=10 이라고 as 2.0 때부터들 많이들 써왔다.
그러나 as 3.0 에서부터 혼동이 오기 시작하고 적응이 잘 안되는게 바로 이 변수선언이나 변수 및 펑션들에 대한 기초가 잡혀있지 않기 때문이다.
변수에는 여러가지 종류가 있다. 이 종류를 컨테이너 내지는 데이터타입, 자료형이라고 한다. 언어마다 조금씩 틀리게 부른다.
var i=10 이렇게 자료형이 없이 선언되는것을 mixed variable 이라고 표현한다. 자동감지식으로써 정수인가 문자열인가 데이터형인가, 어레이인가를 자동감지하여 선언시키는 시스템이다. PHP등지에서 쓰이며 이러한 자동감지식 변수는 감지처리 및 오버라이딩 (재설정행위)로 인한 연산부하가 따라서 걸리게 된다.
이제 어떠한 자료형이 존재하는지 간단히 본다. 아래의 자료형은 대부분의 언어 (php, c, vb, python) 등에서 공용적으로 쓰인다.
정수형 (int) = 숫자만 담는다. 32비트제로 -20억정도부터 20억정도의 수치를 담을 수 있다.
정수형 (Number) - int 와 같다. 그러나 64비트 연산을 제공한다 소수선언은 52비트까지만 연산이 가능한것으로 알고있다. 이녀석을 흔히들 쓰는데 정수형은 c로 치자면 double float이다. 따라서 더 많은 메모리를 사용한다. 흔히 웹디들이 작은 숫자단위에 Number형을 자주 쓰는데 이것은 매우 잘못된 경우다. int 를 써야한다.
정수형 (uint) - unsigned int 를 의미한다. -20억~20억까지의 수치가 아니라, 0부터 40억까지 표현하게 된다. 따라서 20억이상의 수치를 표현하기 위해서는 uint 를 쓰는것이 좋다.
불린형 (Boolean) - True ? False 혹은 1 ? 0 을 의미한다. 스위칭등의 변수로 사용할때 많이 쓴다.
문자형 (String) - UTF-16 캐릭터셋을 기본으로 하는 문자열이 저장된다. 문자형을 삽입할때는 "" 등의 쿼테이션이 필수다. 기본은 Null 이며, UTF-8 이나 euckr 등으로 캐릭터셋을 변경시킬수 있다. (시스템 함수를 통해)
void형 (void) - c에서와 유사한 형식으로 돌고있는데, void 는 특정한 값을 담고있지 않는다. 엄밀히는 펑션의 결과를 반환하거나, 펑션을 포인팅하는데 사용된다. 클래스 등지에서 이용되며, 이때 return 문이 삽입되어야 한다.
배열형 (Array) - 간단한 자료구조를 포함하는 형식이다. 이를 배열이라고 하며, 배열에 대해서는 별도의 강의가 필요하다. 기초적인것은 10명의 이름을 하나의 변수에 서로 구분되게 넣는 경우로 보자 var test:Array = new Array('홍길동','동길홍','가나다','마바사'); 이러한 형식으로 저장하고 호출할때는 test[0] 이나 test[숫자] 로 호출이 가능하다. 물론 숫자는 해당 레코드를 정확히 지칭하여야 한다.
또 간단히 설명하자면 액셀의 한 행과 같다. 액셀에서 1행의 A열, B열, C열을 이름, 전화번호, 주소 라고 설정했다치다. 그렇다면 이것은 어레이로
var test:Array = new Array(); test[0]['이름']='홍길동'; test[0]['주소']='뭐뭐뭐'; test[0]['전번']='뭐뭐뭐'; test[1]['이름']='음음음';
의 형식으로 표현이 가능하다. test[0]['이름'] 에서 앞의 0은 행번호다. 뒤에 이름은 열이름이라고 보면된다. 이를 적절히 매핑하는것을 더블포인팅 어레이 또는 어소시에이티브 어레이라고한다.
함수형 (Function) - 펑션타입의 변수다. 즉, 변하는 수가 아니라 실행되는 구문이 삽입되는것이다. {}로 실행구문을 인덴트하여야 한다. 흔히 말하는 프로그램이 이 펑션에 속한다.
오브젝트형 (Object) - 글로 설명하기가 복잡하지는 시점이다 오브젝트는 말그대로 위에 해당하는 모든것을 담게된다. Mixed var 형식인데, 흔히들 클래스를 오브젝트라고 표현한다. 이 변수는 하나의 명칭으로 다양한 기능을 포괄시킬수있다.
var A:Object = new Object(); A.i = 10; A.b = "스트링";
등으로 정의할수가 있을지는 모르겠다 --;; 이런식으론 사실 안해봤다.
그러나 위처럼 A라는 변수안에 i라는 추가 정수형 변수와 b 라는 문자형 변수가 혼재된다. 즉 말그대로 오브젝트를 포괄하는 형식이다. 이 형식을 대표적으로 이용하는것이 클래스라고 부른다.
클래스형 (Class) - 클래스는 기선언된 하나의 오브젝트 집합체다. 그 안에 다양한 변수와 다양한 함수를 프로그래밍하여 이를 이용할수가 있다. 위에 오브젝트에 대한 설명과 동일하다.
간단한 클래스를 예로든다.
class test { public var a:string = "문자열 테스팅 성공입니다"; function test() { trace("클래스가 시작되었습니다"); } function test_start() { trace(this.a); } }
이렇게 클래스를 선언한다.
클래스를 호출하는것은 간단하다. 향후 메모리관리자 쉬운 액세스를 위해 클래스는 변수형으로 주로 요청한다.
var gogogo:test = new test();
여기서 첫 :test 는 클래스명을 지칭한다. 그러나 복잡하게 갈수록.. 굳이 클래스명이 아니기도 한다는 사실;; 그 다음에 new test() 는 test 라는 클래스의 새로운 선언과 함수의 실행을 의미한다.
그렇다면 저렇게 선언을 하기만 하여도 test() 펑션이 구동한다. 따라서 바로 화면에 클래스가 시작되었습니다. 라는 문구가 표기된다.
그 다음 test_start 라는 펑션을 구동시켜보자
gogogo.test_start();
라고 실행을 하면 문자열 테스트 성공입니다 라고 출력된다.
즉 gogogo 라고 선언된 variable 이 object 타입으로써 하단부에 클래스가 돌고있는것이다. 변수가 꼭 변하는 수만이 아니라 이런형식으로 프로그래밍도 가능하다는 사실을 잊어서는 안된다 ;;
예를들어 a 라는 변수가 function 으로 +10 씩 가중시킨다고 할 경우
var a:Function = function(p:uint) { return p+10; };
svn은 각 디렉토리에 .svn 이라는 폴더를 만들어 이 경로가 리파지터리와 싱크됨을 선언하게된다. 따라 그 파일을 지워버리면, working copy 가 아닌게 되므로 더이상 svn명령을 사용할수 없게되므로 주의해야한다. 이와 유사한 역할을 하는것이 export 명령어다.
select a.*, count(b.entry) from first_table as a inner join second_table as b on a.idx=b.no group by a.idx;
(left join 형 a table idx = b table no와 동기화, a.idx로 그룹하여 b테이블의 부가정보 획득)
union selection
(select * from first_tabe where idx=1) union (select field1, field2, field3 from second_table where no=1) order by idx desc;
필드명은 처음 셀렉트된것을 따른다. 따라서 alias를 주던가 해야되며 뒤에 테이블이 필드갯수가 틀릴때는 위처럼 맞춰주면된다.
select insert
insert into first_table select * from second_table where idx=2;
필드갯수 일치화 필요
view selection create view testdb.view_table as select * from second_table;
select * from view_table;
이놈은 tmp table 만드는 삽질없이 바로 뷰트리 태워주는놈이다. mysql 5.0에서만 가능
unique selection select * from first_table group by aa having count(*) > 1
중복레코드 추적 (aa필드기준)
distinct query
select distinct aa from table group by bb where expr
가급적 쓰지않는게 낫다 group by 보다 퍼포먼스 떨어진다. row exam 갯수가 적을때만 대충 편하게 이용.
제작시 자주쓰이는 쿼리들 나열 -> 이거 이외이 삽질은 안하는것이 좋다
주로 sql에서 쓰이는 function 은
select (is_null, if, substr, concat, date_add, date_sub) 정도
datetime filed의 경우 date function 을 쓰는것이 로드에 효율적이다.
그리고 생각해보니 update if select 서브쿼리들 몇개는 썼었는데 트랜잭션으로 바꿧다 -_-