jquery map

프로그램/js 2015.03.27 17:01

기본 array를 새로운 array로 mapping 하는 함수.


공식홈에서는 이렇게 가이드를 하고 있다.

  • jQuery.map( array, callback )

    • array
      Type: Array
      The Array to translate.
    • callback
      Type: FunctionObject elementOfArray, Integer indexInArray ) => Object
      The function to process each item against. The first argument to the function is the array item, the second argument is the index in array The function can return any value. A returned array will be flattened into the resulting array. Within the function, this refers to the global (window) object.
  • version added: 1.6jQuery.map( object, callback )

    • object
      Type: Object
      The Object to translate.
    • callback
      Type: FunctionObject propertyOfObject, String key ) => Object
      The function to process each item against. The first argument to the function is the value; the second argument is the key of the object property. The function can return any value to add to the array. A returned array will be flattened into the resulting array. Within the function, this refers to the global (window) object.

이를 설명하면 객체나 배열을 callback function의 첫 번째 인자로 주고  index or key의 두번째 인자를 활용하여  새로운 배열을 만들어 낼 수 있다. 


예를 들어 ..


var arr = [ "a", "b", "c", "d", "e" ];

arr = jQuery.map( arr, function( n, i ) {
return ( n.toUpperCase() + i );
});

이렇게 연산을 하면 리턴 배열은 

A0, B1, C2, D3, E4

이러한 결과 값을 가지게 되는 것이다.

'프로그램 > js' 카테고리의 다른 글

ajax와 인코딩문제  (0) 2015.03.27
javascript object 개념.  (0) 2015.03.27
jquery map  (0) 2015.03.27
slice()를 이용한 array copy  (0) 2015.03.27
jquery autocomplete  (0) 2015.02.22
블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요

slice 메소드는 

보통은 array.slice(start index, end index)를 이용하여 원하는 array만 얻고자할 때 쓰이는 메소드인데

array.slice(0)으로 하면 0번 인덱스 부터 끝까지 복사하게 되어 배열 전체를 복사하는 결과를 가져 올 수 있다.

$.map과 성격이 유사하고 혼용해서 쓰면 되겠다.

'프로그램 > js' 카테고리의 다른 글

ajax와 인코딩문제  (0) 2015.03.27
javascript object 개념.  (0) 2015.03.27
jquery map  (0) 2015.03.27
slice()를 이용한 array copy  (0) 2015.03.27
jquery autocomplete  (0) 2015.02.22
블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요

TIMESTAMP만의 특성입니다.

서버의 시간에 의존(UTC에 따라 변형된다는 의미로 해석하면 될 것 같네요)
범위가 '1970-01-01 00:00:01' UTC to '2038-01-09 03:14:07' UTC로 제한됨
on update CURRENT_TIMESTAMP 옵션을 사용할 수 있다.


DATETIME은 순수하게 상수로 된 날짜로 인식한다.

그러나 TIMESTAMP는 서버시간에 의존하는 날짜 개념이다. (서버 time zone 변경시, 바뀐다)


해외서버를 사용한다면 문제를 일으킬 수 있다.


timestamp 옵션 중에 

on update CURRENT_TIMESTAMP 이건, UPDATE

옵션은 시간 update 시 시간 까지 변경해 주는 옵션이다..

하지만 지금 구현하고 있는 게시판은 수정시 시간 업데이트를 쓰지 않는다 .


이러한 특성 때문에 클라이언트 시간을 받아서 서버에 저장하는 경우 TIMESTAMP 보다는 DATETIME을 쓰는 것이 좋을 수 있다.


추가로 업데이트시 아래와 같은 방법으로도 구현할 수 있다는데..업데이트시에도 클라이언트에서 now()로 삽입하면 되지 않을까?

여러가지 방법이 있는 듯 하다.

등록시간은 DATETIME으로 잡고, 수정시간은 TIMESTAMP on update CURRENT_TIMESTAMP로 사용하면, 편할 거 같다는 생각이 듭니다. 물론 UTC나 timezone에 영향은 고려해야겠지요.



cf. 참고로 datetime 이나 date 사용시 now로 저장 뒤에 select를 하면 제멋대로인 포맷으로 출력이 된다. 이럴경우 date_format()함수를 써서 alias로 컬럼을 지정해서 뽑아내는 방법이 유용하다. ex) date_format(time,%Y-%m-%d %h-%i %p 

year month day hour i? pm am 구분..

'데이터베이스 > mysql' 카테고리의 다른 글

mysql connection pool?  (0) 2015.03.27
dmysql 사용시 timestamp와 datetime의 차이  (0) 2015.03.27
블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요

http://egloos.zum.com/romanticDM/v/2143989

블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요

고생 끝에 FAT방식의 파일시스템을 c언어 기반으로 제작하였다.


제작과정에서 문제점과 해결방안을 남긴다.

1. 처음에 파일시스템을 설계할 때 파일이 지워지면 디렉토리의 압축뿐만 아니라 FAT의 압축도 함께 일어나도록 하였다. 하지만 이렇게 되면 처음에 파일을 생성하고 지울 때 는 쉬울지 몰라도 디렉터리를 여러개 생성하고 그 디렉터리 안에 파일이 있는 경우 FAT에 여기저기 흩어져 있을 것이므로 매우 FAT을 재정렬하는 문제는 매우 어렵게 된다. 따라서 fragmentation을 허용하고 다시 파일이나 디렉토리가 생성될 때 fragmentation을 재활용하는 방식으로 수정하였다.

2. create_file 함수를 작성할 때 /* last_sector = 이 디렉토리의 맨 마지막 섹터*/

라는 주석을 보고 이해가 전혀 되지 않았다.

또한 while (FAT[last_sector] != (unsigned short)~0) 이해할 수 없었다.

많은 고민 끝에 last_sector는 현재 디렉토리에서 확장된 디렉터리의 섹터를 나타내는 것으로 보았다. 또한 (unsigned short)~0부분은 처음에 실행하여도 무한 루프를 돌았 다. 이것은 논리적으로 전혀 이해가 안되었고 (unsigned short)0으로 수정하였다.

이렇게 수정하면

while (FAT[last_sector] != (unsigned short)0) {

//(unsigned short)~0에서->(unsigned short)0으로 변경해야 확장된 디렉토리로 넘 어갈 수 있습니다.

last_sector = FAT[last_sector];

}

이러한 코드의 의미는 확장된 다음섹터로 넘어가는 의미가 된다.

3. write_file을 구현 할 때 mini_sh에서 루프를 돌면서 사이즈를 512씩 잘라서 넘겨준다.

이러한 방법도 좋지만 create_file함수에서 매개변수 f_size를 하나를 추가하여 아예 처음 파일을 생성할 때 파일의 속성에 사이즈를 설정하고 오픈파일 테이블에 복사해서 그것을 write_file이 이용하도록 변경하였다. 이렇게 되면 mini_sh의 루프도 사라지고 size를 한번에 넘겨주게 된다.

 

//fs_createfile함수에 파라미터를 추가하였다.

//예를 들어mkfile a 2000 이라고 쉘에 입력하면

//사이즈2000fs_createfile의 파라미터로 전달된다.

int fs_createfile(char *name,int f_size)

 

//파라미터로 전달된 파일의 사이즈를 할당해준다.

ep->size = f_size

//오픈파일 테이블에 복사한다.

open_file_table[fid].size= ep->size;

 

그리고 wrtie_file함수를 쓴다.(위의 3.알고리즘 참조).

 

 

4. remove_file함수를 만들 때 FAT을 변경하는 부분을 만드는 알고리즘을 구현하기가 어 려웠다. 또한 파일의 수가 8개의 n배수였다가 n-1배수로 변경되는 순간 디렉토리를 압 축하는 것도 상당히 애를 먹었다. FAT을 변경하는 것은 파일의 첫 번째 섹터로부터 while문을 따라가며 구현하는 알고리즘을 만들었고 디렉토리를 압축하는 것은

//확장된 디렉토리를 축소하는 함수이다.

void curtail_directory(int files_in_dir,int pre_sector) 이러한 함수를 구현함으로써

해결하였다. 인자에 pre_sector을 받음으로 FAT에서 현재 확장된 디렉토리 이전의 디 렉토리의 섹터를 구해내고 이를 수정하고 현재디렉토리도 함께 수정하는 방식.

 

//파일의첫번째섹터를index로받는다.

index=ep->first_sector;

 

/*FAT 테이블에서 삭제할 부분을 수정한다.

FAT연결고리를 따라가면서 수정한다.*/

while(FAT[index]){

int copy_index=index;

index=FAT[index];

FAT[copy_index]=(unsigned short)~0;

}

FAT[index]=(unsigned short)~0;

 

if((files_in_dir-1)%8==0){//파일의 개수가 8개의 배수가 되는 순간 다시 디렉토리를 축소시켜야한다.

curtail_directory(files_in_dir,cur_dir);//curtail_directory함수이용!

}

5. fs_rmdir을 구현할 때 디렉토리를 삭제하면 디렉토리 안의 파일을 추적하면서 파일을 삭제해주어야 한다. 이 부분은 구현할 수 있었다. 하지만 디렉토리안의 디렉토리는 어 떻게 해결할지 막막했다. 디렉토리안의 디렉토리가 있고 그안에 디렉토리가 있고 계속 있을텐데 이 디렉토리들 안의 파일들까지 다 제거하려면 어떻게 함수를 구현해야 하 는가? -> 재귀함수를 통하여 해결하였다. remove_directory 라는 함수를 통하여 현 재 디렉토리안의 파일과 디렉토리를 추적해나가면서 디렉토리이면 그 디렉토리의 첫 번째 섹터를 다시 remove_directory의 인자로 전달하여 recursive하게 계속 call하 도록 하였다.

6. fsck 파일일관성 검사를 inode가 없는 FAT파일 시스템에서 어떻게 구현해야 할지 고 민했다. 두가지 방식으로 파일 일관성 검사를 진행 하도록 하였다.

1. 블록검사

FAT할당테이블을 보고 사용중인 테이블은 BLOCK_IN_USE 배열에 1로 표시하고 사용중이지 않은 테이블은 FREE_BLOCK 배열에 1로 표시한다. 이 때 두 배열중 에 어느 하나는 1이고 어느 하나는 0이여야 한다. 이는 두 배열의 같은 위치의 원 소를 더해서 값이 1이 되는지 확인 함으로써 해결가능하다.

2. 파일검사

디스크를 읽어서 파일의 개수를 알아내고 이는 파일,디렉토리 생성삭제시 카운트되는 변수 fd_number와 비교된다. 이 두 값이 같으면 일관성이 있는 것이고 같지 않으면 파일시스템 오류이다.

 

7. log_area 구현

로그에 실행할 연산 정보를 기록하는 것까지는 문제가 없었다. 하지만 파일시스템이 크러쉬되고 다시 실행 됬을 때 로그정보 뿐만 아니라 전에 만들었던 파일 및 디렉토 리가 모두 복구가 되어야지 만이 로그에 저장된 삭제연산이 가능하다. 그런데 파일 및 디렉토리를 모두 복구하는 것은 종료하기 전에 이 시스템의 FAT정보와 디스크정보를 모두 파일로 남겨야 함을 뜻한다. 처음에는 atexit 함수를 통하여 종료할 때 파일로 정보를 남기도록 하고 다시 실행하면 복구가 되도록 하였다. 하지만 이렇게 하면 크러 쉬가 될 때 atexit는 실행되지 않으므로 이전의 파일 디렉토리 정보가 저장이 안된다. 크러쉬 될 때 실행되는 함수를 정의할 수 있는 함수는 없었다. 따라서 log정보만 파일 로 기록하고 파일시스템이 크러쉬되고 재부팅 될 때 파일로부터 로그정보를 읽고 실 행되지 않은 연산이 있으면 무효화 하는 것으로 하였다.  


파일시스템.hwp


'이론 > 운영체제' 카테고리의 다른 글

데이터 통신 개요  (0) 2015.09.28
파일과 파일 시스템  (0) 2015.09.27
기억장치 관리  (0) 2015.09.27
프로세스 개요  (0) 2015.09.26
운영체제 개요  (0) 2015.09.26
운영체제 3학년 최종 텀프로젝트.  (0) 2015.03.19
블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요

node.js의 환경에서 mvc 패턴을 구현하다 보면 module.exports와 exports를 자주 접하게 된다.

그 차이에 대해 알아보자.


아래 코드를 보자. 

1
2
3
4
5
6
7
8
9
10
// greetings.js
// var exports = module.exports = {};
         
exports.sayHelloInEnglish = function() {
  return "HELLO";
};
    
exports.sayHelloInSpanish = function() {
  return "Hola";
};

In the code above, we could have replaced exports with module.exports and achieved the same result. If this seems confusing, remember that exports and module.exports reference the same object.

위의 설명처럼 exports는 개개의 function마다 적용되고 결국 module.exports와 결과는 같다.

This is the current value of module.exports:

1
2
3
4
5
6
7
8
9
module.exports = {
  sayHelloInEnglish: function() {
    return "HELLO";
  },
        
  sayHelloInSpanish: function() {
    return "Hola";
  }
};

위 코드와 같이 module.exports는 여러 function을 묶어서 정의하게 된다.


지금 껏 node.js를 사용해오면서 require()를 쓸 때 내부 원리를 모르고 단순히 모듈을 import 하였는데, require()도 module.export 방식을 이용해서 module을 import 하는 것 이었다.

var require = function(path) {
 
  // ...
 
  return module.exports;
};

위와 같은 방식이다.



블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요

출처 - http://mainia.tistory.com/637


1. 콘솔창을 연다

 

C:> cmd

 

2. DBA 접속

 

C:> sqlplus / as sysdba

 

3. 오라클을 시작한다. 시작 : startup,  종료 : shutdown immediate

 

C:> SQL > startup

 

4. 리스너를 시작한다.

 

리스너는 서버와 별도로 움직이므로 먼저 실행해도 상관없다

C:> lsnrctl start

 

5. 오라클 관리자로 접속한다

 

콘솔창에서 C:> sqlplus / as sysdba 를 실행한다.

계정과 패스워드가 없어도 sys 관리자로 접속이 가능하다. 관리자로

접속한 이유는 계정을 만들기 위함이다.

 

 

6. 계정에 해당하는 tablespace 를 만든다.

 

tablespace 를 만들기 위해 파일들이 어디에 저장되는지 알아봐야 한다.

그럴려면 기존에 만들어진 tablespace 의 정보를 알아보자

SQL> SELECT tablespace_name, bytes, file_name FROM dba_data_files;

저장된 곳을 확인했으면 그곳에 200M 정도의 gon 테이블 스페이스를 만든다

SQL> CREATE TABLESPACE gon

2  DATAFILE ‘C:\APP\ORA11\ORADATA\ORCL\gon01.dbf’ size 200M;

 

7. 계정 생성

 

SQL> CREATE USER gon // 계정 생성

2  IDENTIFIED BY gon // 패스워드 생성

3  DEFAULT TABLESPACE gon // 위에서 생성한 테이블스페이스 명

4  QUOTA UNLIMITED ON gon; // 테이블 스페이스의 제한량 무한대

 

8. 권한 부여

 

접속과 기타 기능을 사용할수 있도록 GRANT 를 이용해 할당한다.

권한은 rool 개념으로 관리하는데 connect, resource 롤을 할당한다. 이것으로

왠만한 기능은 다 된다.

SQL> GRANT connect, resource TO gon;

 

9. 네트워크 식별자 TNS 명 지정하기

 

오라클에 접속하기 위해서 TNS 라는 식별자를 설정해야한다. 그 속에

접속에 필요한 호스트 아이피, 포트, SID 를 설정한다. 그걸 담은 문자열

변수가 TNS 명이 되며 계정 아이디와 패스워드, TNS 명만 있으면

접속이 가능하다.

그 TNS 명을 설정하기 위해서 tnsnames.ora 파일을 찾아야 한다.

그 위치는 C:\app\ora11\product\11.2.0\dbhome_1\network\admin\tnsnames.ora 에 있다.

 

10. 접속확인

 

C:> sqlplus gon/gon@ORCL 를 통해 접속을 확인해보자

블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요

출처 -http://egloos.zum.com/intothesec/v/1256218

TNS(Transparent Network Substrate)

------------------------------------

 

TNS란 ORACLE社에서 개발한 Network 기술로써 서로 다른 Network 구성을 가지고 있는 Client/Server 또는 Server/Server 간에도 Data의 전송을 가능하게 해주는 기술을 말한다.

 

--------------

TNS Listener

--------------

TNS 기술을 사용하는 product인 SQL*NET V2가 사용하는 Listener를 TNS Listener라고 부르며 SQL*NET Client로부터 Connection을 받아 Server Process를 할당하는 역할을 한다. 다음의 2개의 다른 Community를 갖는 Network 구성의 경우에 TNS Listener가 어떠한 역할을 하는지를 보여준다.

 

1. Client쪽에서 Connection을 위해 요청한 request는 해당 TNS community를 통해 Server에 도달한다.

2. TNS community를 통해 Server에 도달한 request를 TNS Listener는 인식하게 된다.

3. TNS Listener는 connection에 Dedicated server process를 할당 할 것이고 MTS(Multi Threaded Server)의 경우에는 Shared dispatcher process의 address를 할당하여 Client가 요청한 사항에 대한 작업을 수행한다.

 

SQL*NET V2인 경우

------------------

 

Process name

tnslsnr

ps -ef|grep tnslsnr 로 Process가 살아 있는지 확인할 수 있다.

 

LISTENER 상태보기

lsnrctl stat listener_name으로 Listener가 살아 있는지 확인 할 수 있다.

Ex) lsnrctl stat LISTENER

만약 lsnrctl stat listener_name에서 Listener가 살아 있지 않은 데 ps -ef|grep tnslsnr로 Process가 살아 있으면 다음과 같이 한다.

lsnrctl stop listener_name으로 Listener를 Shutdown시킨다.

Listener가 Shutdown되었음에도 Process(tnslsnr)가 살아 있다면 kill -9 tnslsnr을 이용해 강제로 Process를 Kill시킨다. lsnrctl start listener_name로 다시 Listener를 Startup 한다.

 

LISTENER 구동시키기

lsnrctl start listener_name로 Listener를 구동시킨다.

 

LISTENER 죽이기

lsnrctl stop listener_name으로 Listener를 죽인다.

 

[SQL*Net]Configuration File Administration

 

Client 쪽의 Configuration file들

------------------------------------

1. TNSNAMES.ORA file이 필요하다. SQL*NET V2에만 존재하는 file 이다. 이 file에는 Service name과 Network를 통해 connect하고자 하는 수신지에 관한 사항을 기술한다. 즉, 연결을 하고자 하는 쪽의 computer machine상에 반드시 이 file이 존재해야 한다.

 

[예] oratest.world =   (DESCRIPTION =     (ADDRESS_LIST =         (ADDRESS =           (COMMUNITY = tcp.world)          (PROTOCOL = TCP)          (Host = 200.200.177.51)          (Port = 1521)        )        (ADDRESS =           (COMMUNITY = tcp.world)          (PROTOCOL = TCP)          (Host = 200.200.177.51)          (Port = 1526)        )    )    (CONNECT_DATA = (SID = oratest)    )  ) linux.world =   (DESCRIPTION =     (ADDRESS_LIST =         (ADDRESS =           (COMMUNITY = tcp.world)          (PROTOCOL = TCP)          (Host = 200.200.177.1)          (Port = 1521)        )        (ADDRESS =           (COMMUNITY = tcp.world)          (PROTOCOL = TCP)          (Host = 200.200.177.1)          (Port = 1526)        )    )    (CONNECT_DATA = (SID = linux)    )  ) ORA8I.test.co.kr=  (DESCRIPTION =    (ADDRESS_LIST =      (ADDRESS = (PROTOCOL = TCP)(HOST = 200.200.177.24)(PORT = 1521))    )    (CONNECT_DATA =      (SERVICE_NAME = ora8i.test)    )  ) 

 

2. TNSNAV.ORA file이 필요하다. Network구성이 여러 Community로 구성되어 있는 경우에 이 Community의 description에 대해 기술할 수 있는 file이고 Community간 Interchange의 사항도 기술하는 file이다. 반드시 필요한 file은 아니며 만약Network 구성이 단일의 Protocol을 갖는 하나의 Community로 되어 있다면 이 file은 필요치 않다.

 

3. SQL*NET.ORA file. 이 file은 SQL*NET을 사용함에 있어서 Default Parameter를 사용하지 않고 Parameter를 새로이 설정하여 사용할 경우에 그 Parameter들에 대한 사항을 기술한다.

 

Server 쪽의 Configuration file

------------------------------

1. LISTENER.ORA file이 필요하다.

만약 Server(A) 쪽에서 다른 Server(B)쪽의 Database에 연결하려 할 경우가 있다면 Server(A)쪽에 TNSNAMES.ORA file을 가지고 있어야 하고 Server(B)에는 LISTENER.ORA file이 존재해야 한다. LISTENER.ORA file은 machine 상의 모든 Listener의 name과 address를 포함하고 있으며 Database의 SID와 Listener를 control하는 Control Parameter에 관한 정보를 담고 있다.

 

LISTENER.ORA와 TNSNAMES.ORA

LISTENER.ORA file과 TNSNAMES.ORA 는 유사한 내용을 담고 있다. 특히 이 두 file의 ADDRESS와 ORACLE_SID section은 서로 일치해야 한다.

 

LISTENER.ORA              [selsp2c:/admhome/oracle/product/network/admin> listener.ora LISTENER =   (ADDRESS_LIST =      (ADDRESS =         (PROTOCOL = tcp)         (HOST = selsp2c)         (PORT = 1521)      )   ) STARTUP_WAIT_TIME_LISTENER = 0 CONNECT_TIMEOUT_LISTENER = 0 LOG_DIRECTORY_LISTENER = /admhome/oracle/product/network/log LOG_FILE_LISTENER = /admhome/oracle/product/network/log/log SID_LIST_LISTENER =   (SID_LIST =      (SID_DESC =         (SID_NAME = HJSUSA_T)   (ORACLE_HOME=/admhome/oracle/product)      )    ) TRACE_LEVEL_LISTENER = off TNSNAMES.ORA [selsp2c:/admhome/oracle/product/network/admin> tnsnames.ora HJSUSA_T =   (DESCRIPTION =      (ADDRESS_LIST =         (ADDRESS =            (PROTOCOL = tcp)            (HOST = 203.246.130.105)            (PORT = 1521)         )      )      (CONNECT_DATA =         (SID = HJSUSA_T)      )   ) 

 

TNSNAME.ORA & LISTENER.ORA file의 관리

 

어떠한 Node에 Instance가 새로 생성되었거나 삭제 되었다면 먼저 LISTENER.ORA file에 변경 사항을 기록하고 다른 Node의 TNSNAMES.ORA file을 Edit해야 할 것이다.

 

[SQL*Net]LISTENER.ORA file에 들어가는 Parameter

 

1.PASSWORDS_listener_name = (passwd[,...passwd])

이 Parameter는 lsnrctl [stat,start,stop,service] listener_name 과 같은 Listener Control Utility에 대한 사용을 특정인(DBA)에게만 허용하기 위해 설정된다. 이 Parameter를 설정하지 않으면 default로 UNIX Id를 가진 모든 User는 Listener Control Utility를 수행할 수 있다.

Ex) PASSWORDS_LISTENER = (oraChoi, oraKim)

 

2.CONNECT_TIMEOUT_listener_name = number

이 Parameter는 Client에서 connection이 출발한 후에 유효한 connection request를 TNS Listener가 얻도록 일정한 시간을 할애 하기 위해 setting한다. Time out 시간에 도달하면 TNS Listener는 connection을 drop해 버린다. Default는 10초이며 만약 이 값을 0으로 설정하면 TNS Listener가 connection request를 완전히 인식할 때까지 계속 기다리게 될 것이다.

Ex) CONNECT_TIMEOUT_LISTENER = 0 (신정보의 경우)

 

3.TRACE_LEVEL_listener_name = OFF|USER|ADMIN

이 Parameter는 Trace를 설정하는 것으로 Default는 OFF이고 USER는 제한된 level의 tracing을 제공한다. ADMIN은 USER로 설정하는 것보다 더 자세한 Trace를 보여준다. 이 Parameter는 아래의 두 Parameter를 참조하여 Trace를 형성한다.

Ex) TRACE_LEVEL_LISTENER = ADMIN

 

4.TRACE_DIRECTORY_listener_name = path_to_trace_dir

이 Parameter는 Trace file이 위치하게 될 Directory를 설정한다. Default는 OS마다 다르며 UNIX의 경우에는 $ORACLE_HOME/network/trace이다.

Ex) TRACE_DIRECTORY_LISTENER = $HOME/trace

 

5.TRACE_FILE_listener_name = trace_filename

이 Parameter는 Trace 정보가 쓰여질 file의 이름을 지정하기 위해 setting될 수 있다. Default는 listener_name.trc이다.

Ex) TRACE_FILE_LISTENER=listener_name_V2.trc

 

6.LOG_DIRECTORY_listener_name = path_to log_directory

이 Parameter는 Listener event가 발생할 때마다 즉 Client가 Server의 TNS Listener에 connection request를 요청하여 TNS Listener가 connection을 받아들일 때마다 이 Parameter에서 지정한 Directory에 자동적으로 listener event의 사항을 기록하게 된다. Default는 OS마다 다르며 UNIX의 경우에는 $ORACLE_HOME/network/log이다.

Ex) LOG_DIRECTORY_LISTENER= $HOME /network/log_dir

 

7.LOG_FILE_listener_name = log_filename

이 Parameter는 Listener에 대한 log file의 이름을 setting한다. Default는 listener_name.log이다.

Ex) LOG_DIRECTORY_FILE= listener_name_V2.log

 

Server에서 다른 Server의 Database로 접속

 

1. SQL*NET V2에서 다른 Server의 Database에 접속하기

[형식] @SERVICE_NAME (SERVICE_NAME은 TNSNAMES.ORA에 기술되어 있는 SERVICE_NAME임) 다음의 예는 selsp2d Node에서 selsp2e Node의 Database(HJSTEST)에 접속할 경우를 보여준다.

Ex) [selsp2d:/admhome] sqlplus hansis/hansys@HJSTEST

SQL> select * from v$database;

NAME CREATED LOG_MODE

블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요

출처 - http://www.zetswing.com/bbs/board.php?bo_table=ORACLE_TIP&wr_id=22

테이블스페이스(TableSpace) 정의

 

테이블이 저장되는 공간입니다.

오라클 에서는 테이블스페이스라고 해서 테이블이 저장될 공간을 먼저 만들고 나서

테이블을 생성합니다. 각각의 테이블을 테이블스페이스별로 나누어서 관리와 퍼포먼스의

향상을 가지고 오는것입니다.

 

테이블스페이스를 생성하면 정의된 용량만큼 미리 확보한 테이블스페이스가 생성되어

지고 생성되어진 테이블스페이스에 테이블의 데이타가 저장됩니다.

 

예를 들면 많은 데이터가 쌓일 게시판 테이블은 기본용량 100메가 자동확장 10메가로

테이블스페이스를 만들어서 그곳에 게시판 테이블을 만들어 쓰면 게시판 데이터는 그곳에

100메가까지 데이터가 저장되고 용량 초과시 자동적으로 10메가단위로 테이블 스페이스의

크기는 확장됩니다.

 

이렇게 각 테이블의 특성에 맞게 테이블스페이스를 만들어 활당하면 좋습니다. 물론 각

스키마별로 지정된 테이블스페이스를 만들어 써야 관리적측면에서 무척이나 효율적입니다.

 

MySQL 에서는 DB 시스템 관련사항(사용자 정보, DB정보)을 가지고 있는 것이 mysql DB

라면 Oracle 에서는 system 테이블스페이스로 이해하면 됩니다.

 

※ 테이블 스페이스를 만들지 않으면 ORACLE서버가 자동으로 만들어 줍니다.



일반적인 테이블스페이스 생성 과정

 

1. SYS 계정으로 접속해서 Mytablespace라는 테이블 스페이스를 만듭니다.

 

2. SYS 계정에서 SCOTT2 유저를 생성합니다.( default tablespace는 Mytablespace로 만듭니다)

 

3. SCOTT 계정의 emp 테이블을 scott2 계정으로 복사 합니다.

 

create table scott2.emp table space mytablespace as select * from scott.emp;

이렇게 하면 성공하게 됩니다.

 

테이블스페이스(TableSpace) 개념

 

테이블의 Data 를 Delete 하고 Commit 하여도 Tablespace의 사용량은 변하지 않음

 

테이블의 크기가 늘어나서 테이블 스페이스 크기가 자동으로 늘어나게 설정한 상태에서 테이블의 크기가 줄어들면 자동으로 테이블 스페이스의 크기가 줄어들지는 않습니다. 이때는 사용자가 수동으로 크기를 설정해야 합니다.

 

테이블 스페이스는 미리 공간을 잡아 놓았으므로 한번 늘어난 넘이 데이타가 줄었다고 해서 줄어들지 않습니다. 10명이서 들어가기 위해 방을 큰걸 잡았다가 10명이 살던 방에서 3~4명이 나갔다고 방이 줄어들진 않는다고 보시면 됩니다.

 

일반적으로 scott라는 유저가 생성되면 기본적 테이블스페이스와 템프테이블스페이스가

지정됨니다. 테이블을 만들면 기본적인 테이블 스페이스에 저장되고 그 테이블 스페이스는

(create tablespce 테이블 스페이스 datafile '경로/파일명') 이렇게 만들어진 경로와 파일에

내용이 저장되어 집니다.

 

현재 oracle db의 만들어진 테이블 스페이스 보기

 

system 으로 로그인 해서 select * from dba_tablespaces; 쿼리 실행

해당 계정으로 로그인해서 select distinct tablespace_name from user_tables; 쿼리 실행

 

※ TABS 는 USER_TABLES 의 동의어입니다. 두개는 같은 것입니다.

 

테이블스페이스에 포함된 테이블 알아보기

 

SELECT TABLESPACE_NAME, TABLE_NAME FROM USER_TABLES WHERE TABLESPACE_NAME = '테이블스페이스명';

-- 해당 테이블스페이스에 포함된 테이블 정보를 조회

 

현재 ORACLE서버에 만들어져있는 TABLESPACE보기(SYSTEM계정에서 실행)

 

SELECT file_name, tablespace_name, bytes, status FROM DBA_DATA_FILES;

 

FILE_NAME : datafile의 물리적인 위치와 파일명을 알 수 있습니다. 
TABLESPACE_NAME : 테이블 스페이스의 이름을 알 수 있습니다. 
BYTES : 테이블 스페이스의 크기를 알수 있습니다. 
STATUS : 테이블 스페이스의 이용 가능 여부를 알 수 있습니다.

 

현재 계정에서 사용할수 있는 테이블의 용량 조회

 

SELECT * FROM USER_SEGMENTS;

 

테이블 스페이스별 사용 가능한 공간의 확인

 

SELECT tablespace_name, SUM(bytes), MAX(bytes) 

FROM DBA_FREE_SPACE 

GROUP BY tablespace_name;

 

SUM을 사용한 이유는하나의 테이블 스페이스에 분산되어 있는 여유공간을 합한 것이며, 

MAX를 사용한 이유는 여유 공간중 가장 큰 공간의 SIZE를 의미 합니다.

 

테이블 스페이스 생성명령

 

CREATE TABLESPACE storm

DATAFILE 'C:\ORACLE\ORADATA\app_data.dbf' SIZE 100M

DEFAULT STORAGE 
(

  INITIAL    10K
  NEXT      10K
  MINEXTENTS 2
  MAXEXTENTS 50
  PCTINCREASE 50

)

블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요

autocomplete  - 텍스트 입력창에 글자를 입력하면 recommend text 를 serve 해주는 것.


중요한 부분이 source 부분인데 recommend text 배열이라고 할 수 있다. 공식홈에서는 이렇게 가이드를 하고 있다


source Type: Array or String or FunctionObject request, Function response( Object data ) )

Default: none; must be specified
Defines the data to use, must be specified.

Independent of the variant you use, the label is always treated as text. If you want the label to be treated as html you can use Scott González' html extension. The demos all focus on different variations of the sourceoption - look for one that matches your use case, and check out the code.

label 이라는 key가 text로 취급된다. source 옵션은 3가지가 있다. 

Multiple types supported:

  • Array: An array can be used for local data. There are two supported formats:
    • An array of strings: [ "Choice1", "Choice2" ]
    • An array of objects with label and value properties: [ { label: "Choice1", value: "value1" }, ... ]
    The label property is displayed in the suggestion menu. The value will be inserted into the input element when a user selects an item. If just one property is specified, it will be used for both, e.g., if you provide only value properties, the value will also be used as the label.

우선 array는 string의 모임으로 구성 될 수도 있고 label key와 value 키를 가진 객체의 모임으로 구성될 수도 있다.
라벨 속성은 recommend 되는 텍스트이고 value는 눌렀을때 input에 입력되는 값이다. 만약 이렇게 key를 주지 않고 그냥 단어의 나열로 구성하면 두 속성을 모두 사용 하게 된다. 

  • String: When a string is used, the Autocomplete plugin expects that string to point to a URL resource that will return JSON data. It can be on the same host or on a different one (must provide JSONP). The Autocomplete plugin does not filter the results, instead a query string is added with a term field, which the server-side script should use for filtering the results. For example, if the source option is set to "http://example.com" and the user types foo, a GET request would be made to http://example.com?term=foo. The data itself can be in the same format as the local data described above.
  • Function: The third variation, a callback, provides the most flexibility and can be used to connect any data source to Autocomplete. The callback gets two arguments:
    • request object, with a single term property, which refers to the value currently in the text input. For example, if the user enters "new yo" in a city field, the Autocomplete term will equal "new yo".
    • response callback, which expects a single argument: the data to suggest to the user. This data should be filtered based on the provided term, and can be in any of the formats described above for simple local data. It's important when providing a custom source callback to handle errors during the request. You must always call the response callback even if you encounter an error. This ensures that the widget always has the correct state.

    When filtering data locally, you can make use of the built-in $.ui.autocomplete.escapeRegex function. It'll take a single string argument and escape all regex characters, making the result safe to pass to new RegExp().


ajax를 이용하여 source를 구성할 때 function을 많이 쓴다.

request object를 이용해 http post로 input text를 서버에 전송한다. 이때 서버에서 input text는 term property로 구분된다.

예를 들어 node.js에서는 req.body.term 으로 받을 수 있다.

response object는 user에게 suggest할 data object이다. 이 data object는 request object에서 post로 보낸 provied term에 의해 filter된다. 


그럼 ajax를 이용한 예제를 보겠다 .


$('#country_name').autocomplete({
		      	source: function( request, response ) {
		      		$.ajax({
		      			url : 'ajax.php',
		      			dataType: "json",
						data: {
						   name_startsWith: request.term,
						   type: 'country'
						},
						 success: function( data ) {
							 response( $.map( data, function( item ) {
								return {
									label: item,
									value: item
								}
							}));
						}
		      		});
		      	},
		      	autoFocus: true,
		      	minLength: 0      	
		      });

위와 같이 보낼 때 data에는 key값을 사용자가 직접 정해서 server로 보내고 있다.

이때 그냥 request를 보내게 되면 term키를 이용하여 서버에서 input text를 받아볼 수 있다.

success 할 경우 data object를 server에서 받아 $.map을 이용하여 label과 value를 직접 mapping 해주고 있다.


서버단 코드를 보겠다.


<?php
require_once 'config.php';

if($_GET['type'] == 'country'){
	$result = mysql_query("SELECT name FROM country where name LIKE '".strtoupper($_GET['name_startsWith'])."%'");	
	$data = array();
	while ($row = mysql_fetch_array($result)) {
		array_push($data, $row['name']);	
	}	
	echo json_encode($data);
}

?>

db 에서 LiKE를 이용하여 input keyword가 들어간 name을 추출하여 array로 만든뒤에 json으로 클라이언트에 보내고 있다..


필자는 서버단 코드를 database에 직접 접근 하지 않고 초기에 db를 한번만 접근하여 받아온 데이터를 redis store에 저장한 뒤 이에 접근 하는 방식으로 구현해보려고 하고있다. 

'프로그램 > js' 카테고리의 다른 글

ajax와 인코딩문제  (0) 2015.03.27
javascript object 개념.  (0) 2015.03.27
jquery map  (0) 2015.03.27
slice()를 이용한 array copy  (0) 2015.03.27
jquery autocomplete  (0) 2015.02.22
블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요