트리거에서 mutating 에러(ORA-04091) 해결 방법

트리거에서 mutating 에러(ORA-04091) 해결 방법

— test 용 테이블 생성 —
CREATE TABLE a(coseq NUMBER PRIMARY KEY, coname VARCHAR2(30));
CREATE TABLE b(coseq NUMBER, item VARCHAR2(10), itemname VARCHAR2(30), flag NUMBER(1));
INSERT INTO a VALUES(1, ‘가회사’);
INSERT INTO a VALUES(2, ‘나회사’);
INSERT INTO a VALUES(3, ‘다회사’);
COMMIT;

— 0. 패키지에서 변경된 자료를 저장할 변수 정의 —
CREATE OR REPLACE PACKAGE pkg_test
IS
TYPE tp_coseq    IS TABLE OF b.coseq   %TYPE INDEX BY BINARY_INTEGER;
TYPE tp_item     IS TABLE OF b.item    %TYPE INDEX BY BINARY_INTEGER;
TYPE tp_itemname IS TABLE OF b.itemname%TYPE INDEX BY BINARY_INTEGER;
TYPE tp_gubun    IS TABLE OF VARCHAR2(1)     INDEX BY BINARY_INTEGER;
v_coseq    tp_coseq   ;
v_item     tp_item    ;
v_itemname tp_itemname;
v_gubun    tp_gubun   ;
i BINARY_INTEGER;
END;
/

— 1. 문장-트리거 에서 의 DML 실행전 패키지 변수 초기화 —
CREATE OR REPLACE TRIGGER tr_test_1
BEFORE INSERT OR UPDATE OR DELETE ON b
BEGIN
pkg_test.i := 0;
END;
/

— 2. 행-트리거 에서 패키지 변수에 변경된 값을 저장 —
CREATE OR REPLACE TRIGGER tr_test_2
BEFORE INSERT OR UPDATE OR DELETE ON b
FOR EACH ROW
WHEN (new.flag IS NULL OR (new.flag = old.flag AND old.flag <> 0) )
BEGIN
pkg_test.i := pkg_test.i + 1;
IF INSERTING THEN
:new.flag := 1;
pkg_test.v_coseq   (pkg_test.i) := :new.coseq   ;
pkg_test.v_item    (pkg_test.i) := :new.item    ;
pkg_test.v_itemname(pkg_test.i) := :new.itemname;
pkg_test.v_gubun   (pkg_test.i) := ‘I’          ;
ELSIF UPDATING THEN
:new.flag := :new.flag + 1;
pkg_test.v_coseq   (pkg_test.i) := :old.coseq   ;
pkg_test.v_item    (pkg_test.i) := :old.item    ;
pkg_test.v_itemname(pkg_test.i) := :new.itemname;
pkg_test.v_gubun   (pkg_test.i) := ‘U’          ;
ELSIF DELETING THEN
pkg_test.v_coseq   (pkg_test.i) := :old.coseq   ;
pkg_test.v_item    (pkg_test.i) := :old.item    ;
pkg_test.v_gubun   (pkg_test.i) := ‘D’          ;
END IF;
END;
/

— 3. 문장-트리거 에서 의 DML 실행후 별도 DML 처리 —
CREATE OR REPLACE TRIGGER tr_test_3
AFTER INSERT OR UPDATE OR DELETE ON b
BEGIN
FOR i IN 1..pkg_test.i LOOP
IF pkg_test.v_gubun(i) = ‘I’ THEN
INSERT INTO b(coseq, item, itemname, flag)
SELECT coseq
, pkg_test.v_item(i)
, pkg_test.v_itemname(i)
, 1
FROM a
WHERE coseq <> pkg_test.v_coseq(i)
;
ELSIF pkg_test.v_gubun(i) = ‘U’ THEN
UPDATE b
SET itemname = pkg_test.v_itemname(i)
, flag     = flag + 1
WHERE coseq <> pkg_test.v_coseq(i)
AND item  =  pkg_test.v_item (i)
;
ELSIF pkg_test.v_gubun(i) = ‘D’ THEN
UPDATE b
SET flag = 0
WHERE coseq <> pkg_test.v_coseq(i)
AND item  =  pkg_test.v_item (i)
;
DELETE FROM b
WHERE flag = 0
;
END IF;
END LOOP;
END;
/

— 테스트 —
SELECT * FROM b;

INSERT INTO b(coseq, item, itemname)
VALUES(1, ‘a1’, ‘aa1’)
;

UPDATE b
SET itemname = ‘bb1’
WHERE coseq = 2
AND item = ‘a1’
;

DELETE FROM b
WHERE coseq = 1
AND item = ‘a1’
;

Oracle Exception types and examples

EXCEPTION 의 종류와 특징

1. Exception Types

– Predefined Exception : 오라클에서 미리 정의한 ERROR…(NO_DATA_FOUND등…)
– Non-predefined Exception : 자주 일어나는 error가 아니어서 미리 define되어 있지 않은 error
– User-defined Exception :오라클 서버 error가 아니라 user가 업무상 rule에 위배되는 사항을 exception처리 하는 것.

2. Predefined Exception Names

Exception Name Description
ACCESS_INTO_NULL ORA-06530 초기화되지 않은 object의 속성에 값을 assign하라.
COLLECTION_IS_NULL ORA-06531 초기화되지 않은 nested table에 EXISTS와 다른 method를 적용시켜라.
CURSOR_ALREADY_OPEN ORA-06511 OPEN CURSOR가 이미 open되어 있다.
DUP_VAL_ON_INDEX ORA-00001 중복된 값을 insert하려고 한다.
INVALID_CURSOR ORA-01001 잘못된 cursor연산자를 발생시켰다.
INVALID_NUMBER ORA-01722 문자열을 number type으로 convertion 실패
LOGIN_DENIED ORA-01017 오라클 login시 username or password를 잘못 입력했다.
NO_DATA_FOUND ORA-01403 single row SELECT된 데이터가 없다.
NOT_LOGGED_ON ORA-01012 PL/SQL이 오라클에 connect되지 않은 상태에서 database를 호출하려고 한다.
PROGRAM_ERROR ORA-06501 PL/SQL이 내부적인 문제가 있다.
ROWTYPE_MISMATCH ORA-06504 Host cursor변수와 PL/SQL cursor변수가 return type과 일치하지 않는다.
STORAGE_ERROR ORA-06500 PL/SQL을 실행중 memory를 손상시켰다.
SUBSCRIPT_BEYOND_COUNT ORA-06533 nested table을 참조하는 element가 너무 큰 index를 사용했다.
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 nested table을 참조하는 element가 정상적인 범위의 벗어난index를 사용했다.
TIMEOUT_ON_RESOURCE ORA-00051 resource를 기다리는 동안 time-out이 발생했다.
TOO_MANY_ROWS ORA-01422 single row SELECT된 데이터가 너무많은 row를 갖고있다.
VALUE_ERROR ORA-06502 Arithmetic, conversion, truncation, size constraint ERROR
ZERO_DIVIDE ORA-01467 0으로 나누기를 실행했다.

Predefined Exception 의 예
BEGIN SELECT … COMMIT ;
EXCEPTION WHEN NO_DATA_FOUND THEN
statement ;
WHEN TOO_MANY_ROWS THEN
statement ;
WHEN OTHERS THEN
statement ;
END ;

Non-Predefined Exception 의 예

DECLARE
e_products_invalid EXCEPTION ;
PRAGMA EXCEPTION_INIT (e_products_invalid, -2292 ) ;
v_message VARCHAR2(50) ;
BEGIN

EXCEPTION
WHEN e_products_invalid THEN
:g_message := ‘Product code specified is not valid.’ ;

END ;

–> -2292 error code를 e_products_invalid 라는 이름으로 정의 하겠다.

User-Defined Exception 의 예

DECLARE
e_amount_remaining EXCEPTION ;

BEGIN

RAISE e_amount_remaining ; — 여기서부터 e_amount_remaining을 발생 시킨다.

EXCEPTION
WHEN e_amount_remaining THEN
:g_message := ‘There is still an amount in stock.’ ;

END ;

3. SQLCODE 와 SQLERRM

– SQLCODE : error code를 return한다.
– SQLERRM : error message를 return한다.

DECLARE
v_error_code NUMBER ;
v_error_message VARCHAR2(255) ;
BEGIN

EXCEPTION

WHEN OTHERS THEN
ROLLBACK ;
v_error_code := SQLCODE ;
v_error_message := SQLERRM ;
INSERT INTO errors VALUES (v_error_code, v_error_message) ;
END ;

4. RAISE_APPLICATION_ERROR
; error message를 user가 define하고 싶을때 사용한다.
error code범위는 ( -20000 ~ -20999 )

예1) EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR (-20201, ‘Manager is not a valid employee.’) ;
END ;

예2) DELETE FROM emp
WHERE mgr = v_mgr ;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20202,’This is not a valid manager’) ;
END IF ;

[출처] 오라클 Exception |작성자 마루아라

By awesomejude Posted in DB

독일어 소유격, 소유대명사 그리고 현재완료!! ^^

2. 소유격

우리가 흔히 영어에서 말하는 소유격(my, your, his, her, its, their, our)이 독일어에도 존재하는데요. 하나하나 차근차근 살펴보기로 하지요.. 저도 잘 모르는데, 말투가 왜 이런지는 잘 모르겠습니다. 선생님이 되고 싶나 봐요.. 어쨌든~

제 생각에는 가장 먼저 짚고 넘어가야 할 것이 인칭대명사의 소유격(2격)과 소유대명사의 차이인 것 같아서 그 두 가지의 차이점을 설명해드릴게요.

  1. 인칭대명사 2격 : 소유격으로 불리지만 소유의 의미를 전혀 갖고 있지 않으며, 2격지배 전치사, 동사, 형용사를 위해 쓰인다.
    자체가 대명사이기 때문에 어미변화갖지 않는다.
  2. 소유대명사 : 소유대명사라고 생각하면, 우리가 이미 잘 알고 있는 것으로, ‘나의’, ‘너의’, ‘그의’, ‘그녀의’ 와 같은 소유의 의미를 갖고 있으며,
    명사에 따라 어미변화갖는다.
1인칭 2인칭 3인칭
남성 여성 중성
단수 1격 ich du er sie Sie
2격 meiner deiner seiner ihrer seiner
3격 mir dir ihm ihn ihm
4격 mich dich ihn sie Es
소유대명사 mein dein sein ihr sein
복수 1격 wir ihr sie(Sie)
2격 unser euer ihrer(Ihrer)
3격 uns euch ihnen(ihnen)
4격 uns euch sie(Sie)
소유대명사 unser euer ihr/Ihr

위에서 언급했다시피, 인칭대명사 2격은 어미 변화가 일어나지 않는 것이고, 소유대명사는 명사의 성에 따라 어미 변화가 일어납니다. 여기서 일어나는 어미의 변화는 부정관사 어미변화와 같은데, 깔끔하게 정리된 표가 있어서 함께 첨부합니다.

Mein의 경우)

남성 (m) 여성 (f) 중성 (n) 복수 (p.l)
부정관사 어미 소유대명사 부정관사 어미 소유대명사 부정관사 어미 소유대명사 부정관사 어미 소유대명사
1격(N) ein X mein eine e meine ein X mein die e meine
2격(G) eines es meines einer er meiner eines es meines der er meiner
3격(D) einem em meinem einer er meiner einem em meinem den en meine
4격(A) einen en meinen eine e meine ein X mein die e meine

퍼옴: 독일어학당 사이트

http://kgculture.com.ne.kr

예를 들면, 좀 더 쉽게 이해가 되겠네요.

인칭대명사 2격의 예)

–       statt meiner (나 대신에)

소유대명사 예)

–       mein Vater und meine Mutter (나의 아버지와 나의 어머니)

–       meinem Bruder (나의 형에게)

–       mein Haus (나의 집을)

예제와 표의 내용이 맞는지 잘 이해하고 있는지 맞춰보세요..

예문 무더기…

제 여자친구의 고양이 die Katze meiner Freundin
제 남자친구의 개 der Hund meines Freundes
제 아이들의 장난감들 die Spielsachen meiner Kinder
이건 제 동료의 외투예요. Das ist der Mantel meines Kollegen.
저건 제 동료의 차예요. Das ist das Auto meiner Kollegin.
저건 제 동료의 작품이에요. Das ist die Arbeit meiner Kollegen.
셔츠의 단추가 떨어졌어요. Der Knopf von dem Hemd ist ab.
차고의 열쇠가 없어졌어요. Der Schlüssel von der Garage ist weg.
사장님의 컴퓨터가 고장났어요. Der Computer vom Chef ist kaputt.
저 여자아이의 부모님이 누구세요? Wer sind die Eltern des Mädchens?
그녀의 부모님 집에 어떻게 가요? Wie komme ich zum Haus ihrer Eltern?
그 집은 그 길의 끝에 있어요. Das Haus steht am Ende der Straße.
스위스의 수도의 이름이 뭐예요? Wie heißt die Hauptstadt von der Schweiz?
그 책의 제목이 뭐예요? Wie heißt der Titel von dem Buch?
그 이웃의 아이들의 이름이 뭐예요? Wie heißen die Kinder von den Nachbarn?
그 아이들의 방학이 언제예요? Wann sind die Schulferien von den Kindern?
그 의사의 상담시간이 언제예요? Wann sind die Sprechzeiten von dem Arzt?
그 박물관의 개장 시간이 언제예요? Wann sind die Öffnungszeiten von dem Museum?

(퍼옴: http://www.book2.eu)

5. haben + p.p 현재완료

(퍼옴 : http://alsrl77.blog.me/110126798165)

–       독일어의 현재완료형은 두 가지의 형태로 쓰인다.

–       독일어에서 내용상 현재완료는 과거시제와 다르지 않다.

–       현재완료는 말할 때, 비형식적(편지,이메일,문자)인 경우 사용하며,

과거시제는 형식적(신문,뉴스,소설)인 경우에 사용됩니다.

5.1. sein + … + p.p

: 장소나 상태의 변화를 나타내는 자동사와 몇 가지 예외인 동사

1)     장소의 이동

kommen (오다), gehen (가다), fahren (차를타고 가다),fliegen(날다.비행기를 타고 가다), einsteigen(버스를 타다. 차를 타다.)

2)     상태의 변화

erschrecken(놀라다), einschlafen(잠이들다), sterben(죽다),wachsen(자라다), werden(되다), aufstehen(일어나다)

3)     예외

sein, blieben(머무르다,체류하다), gelingen(잘되다,성공하다), geschehen(발생하다, 생기다, 되다), passieren(통과하다)

예문)

Er ist gerade angekommen. (그는 방금 도착했다.)

Marie ist heute nach Seoul gefahren. (마리는 이제 서울로 이동했다.)

Mein Vater ist vor 10 Jahren gestorben. (나의 아버지는 10년전에 돌아가셨다.)

5.2. haben + … + p.p

: 타동사, 비인칭동사, 조동사, 상태나 지속적인 의미의 자동사에 속하지 않는 모든 동사

ex)

Ich habe das Buch gekauft. (나는 이 책을 샀다.)

Es hat den ganzen Tag geregnet. (하루 종일 비가 내렸다.)

  • sein 혹은 haben을 사용해야 하며, sein을 사용하지 않는 동사는 모두 haben을 사용한다고 보면 된다.

동사의 변화형

1.     일반적인 동사 (규칙적)

ge…t

suchen(찾다) – gesucht

어간 맨 앞에 ge를 붙이고 어미 –en을 빼고 t를 붙이면 됩니다.

2.     분리동사

…ge…t

zuhören(귀기울이다.) zugehört

분리전철인 ‘zu’뒤에 ge를 붙이고 어미 –en을 빼고 t를 붙이면 됩니다.

3.     비분리동사 (br-,ge-,er-,ver-,zer-,ent-,emp-,miss-)

…t

bezahlen (계산하다) – bezahlt

ge가 붙지 않습니다.

 4.     끝이 ~ieren인 동사

Studieren, passieren… 등등 끝이 ~ieren으로 끝나는 동사들은 라틴어의 영향을 받은 단어들인데, 이것들은 보통 변화형도 함께 합니다.

….t

ge가 붙지 않습니다.

studieren (공부하다) – studiert

passieren(발생하다) – passiert

By awesomejude Posted in Deutsch

독일어 첫걸음..

6. Ja – Nein – Frage (Yes-No 질문)

좌측 표와 우측 표에 나와있는 사람과 출신, 공부하고 있는 언어를 참고하여 Ja oder Nein으로 답변할 수 있도록 문장을 구성하는 문제입니다.

 

Partner 1 Partner 2
Herr Wild – Bonn? Frau Ito – Italienisch?
Frau Ito – Tokio? Herr Wild – Japanisch?
Monika Mai – Rom? Dino Botta – Deutsch?
Dino Bitta – Japan?  

 

 

Partner 1 Partner 2
Ex) Kommt Herr Wild aus Bonn?

– Wild씨가 Bonn에서 왔습니까?

Nein, aus München.

= Nein, er kommt aus München.

(아니오, 그는 Müchen 에서 왔습니다.)

oder (혹은)

= Nein, er kommt nicht aus Bonn.

(아니오, 그는 Bonn에서 오지 않았습니다.)

Frau Ito – Tokio?

Kommt Frau Ito aus Tokio?

(Frau Ito 가 Tokio에서 왔습니까?

Ja, sie kommt aus Tokio.

(네, 그녀는 Tokio에서 왔습니다.)

 

 

Monika Mai – Rom?

Kommt Monika Mai aus Rom?

(Monika Mai가 Rom에서 왔습니까?

Nein, aus Tokio.

(아니오, Tokio에서 왔습니다.)

= Nein, sie kommt aus Tokio.

oder

= Nein, sie kommt nicht aus Rom.

Dino Botta – Japan?

Kommt Dino Botta aus Japan?

(Dino Botta가 Japan에서 왔습니까?)

Nein, aus Italien.

(아니오, Italia에서 왔습니다.)

= Nein, er kommt aus Italia.

oder

= Nein, er kommt nicht aus Japan.

 

 

* 여기서 조금 헷갈렸던 부분은 nicht(아니다) 라는 부사를 어느 곳에 넣어야 하는지 였는데, 찾아보니 nicht 위치에 대한 좋은 예문이 있어서 함께 올립니다.

 

일부 명사의 경우를 제외하고

부정하고 싶은 모든 단어, 전치사구, 종속절 앞에 위치합니다.

의미는 문장 전체의 부정을 뜻합니다.

 

원문 :

In der Schule gab er mir gestern ein Buch.

학교에서 그는 어제 나에게 책을 주었다.

 

In der Schule gab er nicht mir gestern ein Buch. (mir 부정)

학교에서 그는 어제 책을 나에게 주지 않았다.

 

In der Schule gab er mir nicht gestern ein Buch. (gestern 부정)

학교에서 그는 나에게 책을 어제 주지 않았다.

 

In der Schule gab er mir gestern kein Buch. (명사 Buch 부정)

학교에서 그는 어제 나에게 책을 주지 않았다.

 

  • l  gab 은 geben(주다) 동사의 과거형입니다.
  • l  kein 은 중성명사앞에서 쓰는 부사입니다.

 

오른쪽 표

Partner 2 Partner 1
Frau Ito – Italienisch?

Lernt Frau Ito Italienisch?

(Frau Ito가 이탈리아어를 배웁니까?)

Nein, sie lernt Deutsch.

(아니오, 그녀는 독일어를 배웁니다.)

Oder

Nein, sie lernt nicht Italienisch.

(아니오, 그녀는 이탈리아어를 배우지 않습니다.)

Herr Wild – Japanisch?

Lernt Herr Wild Japanisch?

(Herr Wild가 일본어를 배웁니까?)

Ja, er lernt Japanisch.

(네, 그는 일본어를 배웁니다.)

Dino Botta – Deutsch?

Lernt Dino Botta Deutsch?

(Dino Botta가 독일어를 배웁니까?)

Ja, er lernt Deutsch.

(네, 그는 독일어를 배웁니다.)

 

 

7. W-Frage und Ja-Nein-Frage

W로 시작하는 의문문과 Yes-No 의문문을 만드는 문제입니다. 참고로 Partner 2의 답변은 제 주관적으로 작성한 것이니 내용에 대한 태클은 정중히 사양합니다. ^^

 

Partner 1   Partner 2
Woher kommen Sie?

(당신은 어디에서 왔습니까?)

Kommen Sie aus Italien?

(당신 이탈리아에서 왔습니까?)

Nein, ich komme aus Corea.

(아니오, 저는 한국에서 왔습니다.)

Wo arbeiten Sie?

(당신은 어디서 일하십니까?)

Arbeiten Sie in München?

(뮌헨에서 일하십니까?)

Nein, ich arbeite in Düsseldorf.

(아니오, 저는 뒤셀도르프에서 일합니다.)

Was machen Sie?

(당신은 뭐하십니까?)

직업을 묻거나, 현재 무엇을 하고 있는지를 묻고 있는 내용

Essen Sie Schweins Haxen?

(당신은 슈바인학센을 먹습니까?)

Sind Sie Arzt ?

(당신은 의사입니까?)

Trinken Sie Altbier?

(당신은 알트비어를 마십니까?)

 

Ja, ich gern esse Schweins Haxen.

(네, 저는 슈바인학센을 즐겨 먹습니다.)

Nein, ich bin Techniker.

(아니오, 저는 기술자입니다.)

Ja, ich sehr trinke bier.

(네, 저는 맥주를 매우 즐겨마십니다.)

Wo wohnen Sie?

(당신은 어디사십니까?)

Wohnen Sie in Frankfurt?

(프랑크푸르트에 사십니까?)

Nein, ich wohne in Essen.

(아니오, 저는 에센에 삽니다.)

 

* 의문문을 어떻게 만드는 지 어순이 궁금해서 찾아보았는데, 마침 또 괜찮은 예문이 있어 퍼왔습니다.

 

1) 의문사를 사용할 때

의문사 다음에 동사가 2번째 위치에 사용된다.

의문사 +  동사 + 주어 + (기타 문장) 

 의문사  동사  주어  기타 문장
 Wann  hat  das Konzert  begonnen?
 Wohin  habt  ihr  es gelegt?

Wann hat das Konzert begonnen? (When the concert has begun?)
Wohin habt ihr es gelegt? (Where did you put it?)

 

2) 일반적인 질문 형태 – 의문사를 사용하지 않고 단순히 아는지 혹은 맞는지 물어볼 때.

동사가 맨 앞에 오고 주어가 뒤따른다. 조동사를 사용하는 복합시제의 경우 동사원형 또는 과거분사는 문장의 맨 뒤로 간다.

 

동사 + 주어 + (기타 문장)

 

예문

Kennst du meine Freundin? (Do you know my girlfriend?)

Hat er es nehmen dürfen? (Was he allowed to take it?)

Wirst du ihn dort treffen? (Will you meet him there?)

Kommt er bald heim? (Is he coming home soon?)

[출처] 독일어 문장의 순서 – 의문문, 부정문|작성자 후아이

 

 

By awesomejude Posted in Deutsch

YUI Doc 사용법

YUI Doc

YUI Doc는 JavaScript Code 에 대한 API Documentation을 생성하기 위한 파이썬 타입의 어플리케이션입니다.

YUI Doc는 넓은 범위의 JavaScript Style을 지원하고 method, property, custom event, object의 상속자에 대한 정보도 HTML 형태의 문서로 만들어줍니다.

소스코드를 라이브러리화 하는데 유용하여, 유지보수에 도움이 됩니다. YUI Doc 은 안정적이며, 2005년 이후 YUI 프로젝트의 일부로 사용되고 있습니다.

YUI Doc은 코드내의 주석부분을 파싱해내는 엔진으로, JavaScript Application 코드내의 주석부분을 찾아서 메타 데이터의 형태로 모아주는 역할을 합니다.

주석을 사용하는 예입니다.

/**
*
* @tagname tagcontent
*
*/

모든 주석의 블록은 module, class, property, method, event를 포함해야 합니다.

Settings

1. python 2.7 버전 이상을 설치 ( http://www.python.org/download/ )

2. setuptools 설치 ( http://pypi.python.org/pypi/setuptools#files )

3. YUI Doc 에 필요한 Tool 설치

  • Pygments
  • Simple JSON
  • Cheetah

위의 세가지 툴은 setuptools를 설치하면, easy_install 이란 명령어로 쉽게 설치가 가능합니다.

setuptools를 설치 후, C:\Python27\Scripts 로 이동,

CMD 에서 아래와 같이 입력

C:\Python27\Scripts>easy_install Pygments SimpleJSON Cheetah

사용하는 방법

1. YUI Doc 관련 github에서  ZIP 타입의 YUI Doc을 다운로드 : https://github.com/yui/yuidoc/downloads

* Yahoo Developer Site의 파일을 받으면, 추후에 HTML 파일 생성시 파이썬 오류 발생함.

2. 문서 포맷을 검토
API로 만들려고 하는 문서가 Tag의 포맷에 맞게 설정되어 있는지 검토합니다.

예)

/**
 * 나의 자바스크립트 애플리케이션
 * @module myapp
 */
var MYAPP = {};

/**
 * 수학 계산 유틸리티
 * @namespace MYAPP
 * @class math_stuff
 */
MYAPP.math_stuff = {
	/**
	 * 두 숫자를 더한다.
	 *
	 * @method sum
	 * @param {Number} a 첫번째 숫자
	 * @param {Number} b 두번째 숫자
	 * @return {Number} 두숫자를 더한 값
	 */
	sum: function (a,b) {
		return a+b;
	},
	/**
	 * 두 숫자를 곱한다.
	 *
	 * @method multi
	 * @param {Number} a 첫번째 숫자
	 * @param {Number} b 두번째 숫자
	 * @return {Number } 두 숫자를 곱한 값
	 */
	multi: function (a,b) {
		return a*b;
	}
};

/**
 * Person 객체를 생성한다.
 * @class Person
 * @constructor
 * @namespace MYAPP
 * @param {String} first 이름
 * @param {String} last 성
 */
MYAPP.Person = function(first,last) {
	/**
	 * 사람의 이름
	 * @property first_name
	 * @type String
	 */
	this.first_name = first;
	/**
	 * 사람의 성
	 * @property last_name
	 * @type String
	 */
	this.last_name = last;
};

/**
 * person 객체의 성명을 반환한다.
 *
 * @method getName
 * @return {String} 사람의 성명
 */
MYAPP.Person.prototype.getName = function (){
	return this.first_name + '' + this.last_name;
};

YUI 내에서 module은 JavaScript내에서 기능적으로 합쳐질수 있는 오브젝트의 그룹을 가리킵니다. module은 하나의 파일에서 여러 개로 존재할 수 있지만, module name은 유일해야 합니다.

각각의 파일은 하나 이상의 class를 포함 할 수 있으며, constructor 타입이나 static 타입으로 정의 될 수 있습니다.

3. 폴더경로 설정

example.bat, example.sh 파일은 JavaScript Code를 기반으로 YUI Doc을 실행하기 위한 템플릿으로 파일내에 정의된 경로를 자신의 폴더구조에 맞게 설정합니다.

예)

@ECHO OFF

REM ##########################################################################

REM The location of your yuidoc install
SET yuidoc_home=C:\Users\krinjupe\Downloads\yuidoc                                     //yuidoc가 존재하는 경로

REM The location of the files to parse.  Parses subdirectories, but will fail if
REM there are duplicate file names in these directories.  You can specify multiple
REM source trees:
REM      SET parser_in="c:\home\www\yahoo.dev\src\js c:\home\www\Event.dev\src"
SET parser_in=C:\Users\krinjupe\Downloads\yuidoc\src                                   //Library로 만들고자 하는 JavaScript 파일이 존재하는 경로

REM The location to output the parser data.  This output is a file containing a
REM json string, and copies of the parsed files.
SET parser_out=C:\Users\krinjupe\Downloads\yuidoc\src\parser                           //src 내의 JavaScript 파일이 파싱된 결과를 저장할 폴더의 경로

REM The directory to put the html file outputted by the generator
SET generator_out=C:\Users\krinjupe\Downloads\yuidoc\src\generator                     //Library를 구성하기 위해 생성된 HTML 타입의 파일을 저장할 폴더의 경로

REM The location of the template files.  Any subdirectories here will be copied
REM verbatim to the destination directory.
SET template=%yuidoc_home%\template

REM The project version that will be displayed in the documentation.
SET version="1.0.0"

REM The version of YUI the project uses.
SET yuiversion="2"

"%yuidoc_home%\bin\yuidoc.py" "%parser_in%" -p "%parser_out%" -o "%generator_out%" -t "%template%" -v %version% -Y %yuiversion%

위의 예처럼, parse_in 변수에 상세화된 소스코드의 경로는 single module을 폴더구조의 형태로 정의해야 합니다.

 4. YUI Doc 실행

YUI Doc의 bin 디렉토리로 이동  ex) C:\Users\krinjupe\Downloads\yuidoc\bin

CMD 창에서 example.bat 실행

5. 결과 확인

generator 디렉토리내에 관련 HTML 이 생성됨

예)  CMD window

Library Index file

MYAPP.math_stuff Class

Myapp.Person Class

Tags

Primary tags: 각각의 주석블록은 다음의 tag중 하나를 꼭 포함해야 합니다. 

Tag Name Notes
module There must be one module per source tree. By convention, put your module declaration at the top of the file that contains the main class for your module.
class The string identifying the functional class on its parent object; for example, the class forYAHOO.util.Event would be Event (and its @namespace would be “YAHOO.util”).
method The name of a method on the current class.
event In YUI, events are Custom Events fired off programmatically at interesting moments in a component’s execution. The event tag is similar to method, but there is no return tag and its params are arguments passed to the event listener.
property The name of a property on the current class.

예)

/**
* My method description.  Like other pieces of your comment blocks,
* this can span multiple lines.
* @method methodName
*/

Secondary Tags:  위에서 말하는 primary tag를 정의한 후, module, class, method, event or property 와 같은 Tag를 자유롭게 정의하여 사용할 수 있습니다. 

Tag Name Notes
submodule YUI Doc supports the notion that a module is a submodule of a parent module. For example, in YUI 3.x anim-scroll is a submodule of anim. A submodule encompasses a subset of the parent module’s functionality. To use submodule designation, provide the parent module’s name as the module property and the submodule’s name in the submodule property.
namespace While it is optional to provide a namespace, it is recommended. This lets you describe your class just with the name: For example, YAHOO.util.Event has a namespace ofYAHOO.util and a class of Event.
extends Sets up an inheritance relationship between the current class and a parent class; API docs will show and link to items inherited from the parent class.
config config is a managed configuration attribute. In YUI parlance, this is typically an attribute created and managed with the Config class (part of the Container Family).
attribute An attribute is a managed configuration attribute. In YUI parlance, this is typically an attribute created and managed with AttributeProvider (part of the YUI Element Utility). Anattribute is similar to a config, but YUI Doc will autogenerate documentation for the change events associated with the attribute as provided by Element. (Note: Unless you’re using YUI and referring to an attribute managed by AttributeProvider, you should avoid using this tag.)
constructor The presence of this tag (which requires no description) indicates that this class is instantiable.
static If a class does not have a constructor, then the static tag should be present to signal that it is a static class.
final For constants and for read-only configs and attributes.
param Defined as @param

Unknown macro: {type}name description or @param name

description, params can be used with classes, methods and events.

return Defined as @return

Unknown macro: {type}

description.

for Used to define an inner class:

/**

  • An inner class
  • @class foo
  • @for OuterClass
    /After the class is done, you need to inform the parser to start working on the outer class again:/*
  • Another method for the outer class
  • @method bar
  • @for OuterClass
    */
type For properties, configs and attributes.
private Privates by default are suppressed from the API docs. All methods and properties are assumed to be public unless marked as private.
protected Used to designate members that should not be modified by implementers unless they are creating a subclass.
requires Used to identify dependencies in the module declaration.
default The default value of a property, config or attribute.
uses For classes that use YAHOO.lang.augmentProto or YAHOO.lang.augmentObject. Optional method/properties (supplied to augmentProto or augmentObject) are not parsed by YUI Doc.

Customizing YUI Doc Template

YUI Doc의 산출물로 구조화 하는 데 필요한 template 디렉토리 내에는 아래의 파일을 꼭 포함해야 합니다.

  • main.tmpl: This file provides the HTML structure for all meaningful output pages.
  • assets/api.css: This is the core CSS file for the output document

YUI Doc의 산출물 문서의 Style 서식은 YUI CSS ( Reset CSSFonts CSS, and Grids CSS ) 를 기반으로 하며, 해당 파일은 ‘template/assets/reset-fonts-grids-min.css.’ 경로에 위치하고 있습니다. 

‘Earth From Above’ by Yann Arthus-Bertrand

지하철역 광고에서 사진전을 한다는 것을 보았다.
주제는 ‘하늘에서 본 지구’ .. 미술관도 가끔 가곤 했지만, 사진전이라서 그런지 어렵다기 보다는 한번 가보고 싶다는 생각이 들었다.

3월 2일 ..
어제부터 휴일이었지만, 왠지 휴일에 가면 붐빌것 같아 평일 오전 시간을 택했다.
아침부터 비가 조금 내려, 상쾌하면서 조금 쌀쌀하고, 조용히 관람하기에는 좋은 타이밍인것 같았다.

가장 먼저 눈에 들어 온 것은 전시회를 열게 된 의의에 대한 작가의 글이었다.

너무 길어서 모두 기억이 나지는 않지만, 요약하자면..

‘사람은 자연을 소유할 수 없다. 사람은 자연의 일부 일 뿐이다. 60억년전에 탄생한 지구는 불과 20만년 전에 모습을 드러낸 사람들로 인해, 사막화, 온난화를 겪고 있으며, 이러한 영향으로 인해, 지구의 자연은 점차 파괴되어 가고 있다. 이러한 사실을 알고 있다면, 실천할 수 있는 사람은 다른 어떤 국가, 조직이 아닌 바로 당신 자신이다. 당신이 지구의 환경이 파괴되어 간다는 사실을 알고 있다면, 지금 당장 행동을 취해야 한다.’

 

 

 

나는 푸른색을 좋아해서인지 푸른색계열이 들어간 사진은 다 멋져 보였다. 이건 ‘몰디브의 눈’ 이라는 것으로 산호와 어우러져 마치 사람의 눈의 형상처럼 보였다.

 

 

 

 

‘코트디부아르’라고 하면 가장 먼저 떠오르는 건 첼시에서 뛰고 있는 드록바이다. 사실 아직도 첼시에서 뛰고 있는지 모르겠지만 말이다.
일을 마치고 너무나도 평화롭게 목화 솜 꾸러미에서 누워 휴식을 취하고 있는 모습.. 저 시간 만큼은 세상 그 누구도 부럽지 않았으리라..
문득 나도 그렇게 하늘을 바라보며 행복해했던 시간이 떠오른다. 군 시절 훈련중에 우연히 찾아 들어간 전원주택의 평상위에 누워서 바라보던 하늘.
충북 충주 근방이었던 것으로 기억하는데, 언제쯤 다시 가볼 수 있을 까… 꼭 한번 다시 가보고 싶다..

 

 

 

 

전시장에 들어서면 가장 먼저 볼 수 있는 사진이다. 사실 이것은 하늘에서 직접 보는 느낌을 나타내려고 2층에서 올라가서 볼 수 있도록 1층 바닥에 프린팅을 해 놓은 사진을 찍은 것인데, 내가 마치 헬리콥터 위에서 사람들을 내려다 보는 듯하다.

 

 

 

 

이건 미국 와이오밍주, 몬태나주에 걸쳐있는 엘로우 스톤 국립공원에 있는 간헐천인데, 어우러진 색상이 너무 기묘해서 기억에 남았다. 실제로 물은 너무 맑아서 아무것도 살 수 가 없다고 한다..

 

 

 

 

보는 순간, ‘아 여기..’ 했던 사진이다. 산타루치아 역에서 처음 발을 딛었을 때, 무거운 캐리어를 끌고 숙소를 찾아가던 내 모습, 바포레토를 타고 대운하를 지나던 모습, 곤돌라를 타고 와인을 마시던 내가 떠올랐다. 누군가와 함께 있었다면 내가 어디에 있었노라고 다 얘기해줬을 것만 같았다.

 

 

 

파아란 바다에서 놀고 있는 모습이 너무 부러웠다. 어쩜 수영장 바닥처럼 색이 저리도 일정할까???

꽃남 드라마를 통해, ‘아 ~ 저런 곳이 있구나!!’ 라는 생각을 갖고 있었는데, 다시 보니 반가웠다. 인간의 간섭 없이 자연 스스로 저런 모양을 만들어 냈다는데, 한번 더 놀라웠고, 언젠가 내 눈으로 직접 볼 수 있는 날이 오기를 기대한다. 프랑스에 있다니 .. 가능하지 않을까 싶다.. ㅎㅎ

가기전에 전시회에 대한 정보를 찾기 위해 블로그를 돌아 다녔었는데, 그 때 부터 눈에 들어왔던 사진 중에 하나이다.
케냐의 차보 국립공원에 있는 나무로, 코끼리가 엄청난 양의 나무를 먹어치우는 바람에 수목이 고갈되어 이런 모습을 띄게 되었다고 한다. 하지만 밀렵꾼들에 의해 코끼리들은 많이 종적을 감추었고, 주변의 야생동물들에게만 그늘을 제공하고 있다고 한다.
작품의 이름이 ‘생명의 나무’인데, 정가운데 위치한 나무 한그루에서 방사형으로 퍼져 나간 모습이 마치 생명의 근원인 듯한 느낌을 갖게 했다. 저 나무가 마지막 생명인 것처럼… 말이다.. 이렇게 보면 다 한번씩 가보고 싶다.. 케냐의 국립공원..

빙하에서 떨어져 나와 유빙이되어 바다를 떠도는 모습이다. 이렇게 빙하에서 떨어져 나온 유빙의 양만 엄청 나다고 한다. 운이 좋으면(?) 가까운 대륙에 까지도 닿기도 한다는데, 정말 빙하타고 내려올지도 모르는 둘리를 찾는시대가 되었다.

다음에 이어질 킬리만자로의 만년설보다는 덜 처참하지만, 세계에서 가장 높다고 하는 에베레스트 산의 모습이다. 하얗게 눈으로 뒤덮여져 있어야 할 산이 무언가 다 파헤쳐진듯한 모습이다. 가슴이 아프다.

극심한 온난화로 인하여 지난 100년간 85%의 만년설이 녹아 없어졌다고 한다. 어떤 조사결과에 따르면 2020년이면 다 사라져 버릴 것이라고 하는데, 이 사진을 보니 이미 다 녹아버린 듯하다. 너무나 안타깝다.

아이러니한 사실은 자연을 파괴시키는 행위를 가장 많이 하는 국가들은 소위 선진국이라고 일컫는 곳인데, 이에 대한 피해를 받는 국가는 개발도상국이라는 것이다. 아니, 개발도상국도 아닌 더 극빈한 나라라는 사실이다. 자연자원으로 관광산업을 하는 곳도 있겠지만, 자연과 함께 살아가는 생물들에게는 그 터전이 점차 사라지고 있는 실정이다.

얀 아르튀스 베르트랑,, (Yann Arthus-Bertrand)

이렇게 멋진 사진전을 열기 위해, 수년간 셀수도 없이 많은 사진을 찍고 노력한 베르트랑님께 감사 하다는 말을 전하고 싶다.
전시장 중간에는 실제로 어떻게 이러한 사진을 찍었는지에 대한 내용도 있었는데, 너무나 고생스러워 보였다. 헬리콥터를 타고 돌아다니다가 멋진 곳에서 그냥 셔터를 누르는 것이 아니라, 연료비와 비행시간을 고려하여 되도록이면 정해진 루트를 따라 이동해야 하고, 언제나 사진을 찍기 위해선 헬기의 문을 열어 놓고 다녀야 했다는 사실에서 여정의 험난함을 알 수 있었다. 자신만의 뚜렷한 목표가 없었다면 계속 이어 나가지 못했을 작업이라고 생각한다. 하고싶다는 의지를 잃지 않고 끝까지 프로젝트 완수를 위해 힘 써준 베르트랑님께 다시한번 뜨거운 박수를 보낸다.

이제 나도 실천해야 할 때이다.


마지막은 돼지의 모습이다. 마지막 전시관은 농업박람회 당시 동물들과 사람을 찍은 사진들로 이루어져있었는데, 정말 못생긴 돼지가 있어서 찍었다. 하긴 잘생기고 못생기고는 사람 눈, 아니 내눈에 그런 것이니까 저렇게 생긴것이 돼지계의 초미남으로 불리울지 어떻게 아나?!

유익한 관람이었다..

By awesomejude Posted in Holiday

Image Caching by using Javascript.

When you want to use the image several times at same URL, you can call it from image object that you referred at first time by using image caching.

Using this way makes it possible not to make image blink when it got focus by hover or tab action. Really helpful and easy to apply to your code.

———————————————-

function MM_preloadImages(){

var d=document;

if(d.images)
{
if(!d.MM_p)
d.MM_p=new Array();

var i,j=d.MM_p.length,a=MM_preloadImages.arguments;
for(i=0; i<a.length; i++)
{
if (a[i].indexOf("#")!=0)
{
d.MM_p[j]=new Image();
d.MM_p[j++].src=a[i];
}
}
}
}

MM_preloadImages('/images/common/gnb_tab_03_01.png',
'/images/common/gnb_tab_03_02.png',
'/images/common/gnb_tab_03_03.png');

Thanks to “http://happybruce.tistory.com&#8221;

By awesomejude Posted in JS

날짜 계산 함수

Webapp을 만들다가 날짜차이에 따라 최근 컨텐츠 표시여부를 체크하는 것이 필요했는데,, 역시나 구글이 쉽게 해결해 주었다.

heisice님이 만든 fromDay함수를 활용하면, 두 날짜의 차이를 쉽게 구할 수 있다.
더욱이 편한것은, Date Format중 month 에 대한 data는 Jan or January든 알아서 맞춰서 계산해준다는 것이다.. 흠.. 편리하군..

// coded by heisice@gmail.com
Date.prototype.fromDay = function(someday){
return Math.floor(((someday||new Date()).getTime()-this.getTime())/86400000+1);
}

// 특정 Date를 변수로 넘기면, 그 날짜까지와의 일수가 차이가 계산이 되고,
var days_total = new Date(“Jan 18,2012”).fromDay(new Date(“Jan 30,2012”));

// 아무 변수도 넘기지 않으면.. 오늘과의 일수 차이가 계산이 된다.
var days_work = new Date(“October 18,2007”).fromDay();

console.log(“총 “+days_total+”일 중에, 현재까지 “+days_work+”일이 지났습니다.”);

By awesomejude Posted in JS Tagged ,