'2007/05'에 해당되는 글 37건

  1. 2007.05.29 [MSSQL]인덱스 정리 by The.민군
  2. 2007.05.13 쓸만한 ATX 케이스 몇가지 by The.민군
  3. 2007.05.09 네트워크를 이용해 모니터를 2배로! Maxivista by The.민군
  4. 2007.05.08 [mysql 설치]LinuxThreads에러 by The.민군
  5. 2007.05.08 mysql 설치 by The.민군
  6. 2007.05.08 MySQL 설치후 데몬실행이 안될경우(socket '/tmp/mysql.. by The.민군
  7. 2007.05.07 Ajax 마스터하기, Part 10: 데이터 전송에 JSON 사용하기 by The.민군
  8. 2007.05.07 Java 리플렉션에 대한 재고(reflection)(1) by The.민군
  9. 2007.05.07 Flex 개발 및 공부에 도움되는 5대 Flex Explorer by The.민군
  10. 2007.05.05 ruby on rails로 구현한 쇼핑카트 데모와 소스보기 by The.민군
  11. 2007.05.05 Ruby on Rails」입문 -- (JP 번역문) by The.민군
  12. 2007.05.05 RoR Model Relation. by The.민군
  13. 2007.05.05 ruby on rails의 *script디렉토리 설명 by The.민군
  14. 2007.05.05 [generate명령 설명] ruby script/generate by The.민군
  15. 2007.05.05 [Rails] Scaffolds에 관하여 by The.민군

[MSSQL]인덱스 정리

MSSQL 2007.05.29 04:03
[MSSQL]인덱스 정리
select name from board where id=1

select문을 마우스로 드래그하여 선택한 후 메뉴의 쿼리-예상실행계획표시(Ctrl+L)를 택하고 밑에 나오는 그림에 마우스를 갖다대면 풍선도움말이 나온다.여기에 보면 물리적연산,논리적 연산에 Table Scan 이라고 나온다.



2. 인덱스 만들 때 고려할 점

인덱스를 만들면 좋은 컬럼
* where , order by , group by 문 등에서 자주 사용되는 칼럼(인덱스 데
이터는 order by문을 사용하지 않더라도 정렬된 순서로 되어있음)
* 프라이머리키,유니크 constraints 컬럼 (내부적으로 유니크 인덱스 사
용)
* 포린 키 컬럼

인덱스 만들면 나쁜 컬럼
* 쿼리에서 자주 사용하지 않는 컬럼
* 키값이 선별도가 나쁠때 (성별,국적,학력...)


3.인덱스가 있을경우

1)만드는 방법:
CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED]
INDEX index_name ON table (column [,...n])
[WITH
[PAD_INDEX]
[[,] FILLFACTOR = fillfactor]
[[,] IGNORE_DUP_KEY]
[[,] DROP_EXISTING]
[[,] STATISTICS_NORECOMPUTE]
]
[ON filegroup]

2)생성된 인덱스 보기
exec sp_helpindex 테이블이름

3)인덱스 제거
drop index ''table.index''[,...n]

4)클러스터드 인덱스(clustered index)
:책으로 예를 들면 차례에 해당한다.
한테이블에 하나만 있어야 한다.
차례에 나오는 순서와 책의 순서가 일치하듯 데이터가 키값에 따라 정렬되어있다.
일정한 범위를 주고 찾는 경우 속도 향상에 도움이 된다.

create clustered index board_CL on board(id)
go

select name from board where id=1

select문을 마우스로 드래그하여 선택한 후 메뉴의 쿼리-예상실행계획표시(Ctrl+L)를 택하고 밑에 나오는 그림에 마우스를 갖다대면 풍선도움말이 나온다.여기에 보면 물리적연산,논리적 연산에 clustered index seek이라고 나온다.



5)넌클러스터드 인덱스(nonclustered index)
:책으로 예를 들면 찾아보기에 해당한다.
용어찾기,표찾기,그림찾기 처럼 한테이블에 여러개가 있을수 있다.
찾아보기가 책의 순서와 일치하지 않듯이 데이터는 들어가 있는 순서대로 있다.
일정한 범위를 주고 찾는 경우 테이블 관리자가 테이블과 함께 인덱스까지 관리해야 한다.

create table board2(
id int not null,
name varchar(20) default ''default name'',
date smalldatetime default getdate()
)
go

create clustered index board_NC on board2(id)
go

select name from board2 where id=1

select문을 마우스로 드래그하여 선택한 후 메뉴의 쿼리-예상실행계획표시(Ctrl+L)를 택하고 밑에 나오는 그림에 마우스를 갖다대면 풍선도움말이 나온다.여기에 보면 물리적연산,논리적 연산에 index seek이라고 나온다.

5.유일색인과 중복허용
1)primary key constraint
:클러스터 색인,유일색인이 디폴트
create table board3(
id int constraint PK_id primary key not null,
name varchar(20) default ''default name'',
date smalldatetime default getdate()
)
go

2)create index
:넌클러스터 색인,중복허용
create table board4(
id int not null,
name varchar(20) default ''default name'',
date smalldatetime default getdate()
)
go

create index board4_NC on board4(id)

insert board4 values(1,default,default)
insert board4 values(1,default,default)
중복이 허용된다.

클러스터 색인에 유일색인으로 바꾸고 싶으면
delete board4 (테이블의 데이터 지우기)
drop index board4.board4_NC (색인 지우기)

create unique clustered index board4_CL on board4(id)
이제 중복이 허용되지 않고 클러스터드 인덱스로 바뀌었다.

6.테이블에서 중복된 컬럼값 찾기
테이블에 이미 중복된 키값이 있을 경우 유니크 인덱스(유일색인)를 만들 수 없다.그럼 테이블에 어떤값이 얼마나 중복되어 있는지 미리 볼 수 있는 방법을 알아보자.
create table member(
id int not null,
name varchar(20)
)

insert member values(1,''길동'')
insert member values(2,''철수'')
insert member values(2,''영희'')
insert member values(3,''순이'')
insert member values(3,''은정'')
insert member values(4,''성관'')

select * from memeber where id in(select id from member group by id having count(id)>1) order by id

7.복합(composite)인덱스
테이블에서 인덱스의 키값으로 사용되는 컬럼이 두개 이상일때를 말하며 두개 이상의 컬럼이 조건문에서 함께 자주 사용되는 경우 필요하다.주민등록번호 앞의 6다리와 뒤의 7자리로 두개의 컬럼에 저장할 때 유니크 복합인덱스를 사용하는것이 일반적이다.
*최대 16개까지의 컬럼이 하나의 인덱스에 사용될 수 있다.각 컬럼의 합은 전체 900바이트를 초과할 수 없다.
*(column1,column2)의 순서로 만든 인덱스는 (column2,column1)의 순서로 만든 인덱스와 키값 저장구조가 틀리다.중복이 가장 적은 컬럼을 앞에 두는순서로 만들면 인덱스를 더욱 효율적으로 사용하여 검색 속도를 높이게 된다.
*(column1,column2)의 순서로 만든 인덱스가 있을 때 조건문에서 column2만을 사용때는 인덱스를 사용할 수 없다.하지만 column1 또는 column1과 column2을 함께 사용할 때는 인덱스를 사용할 수 있다.

drop table member

create table member(
id int nuo null,
name varchar not null,
jumin1 char(6) null,
jumin2 char(7) null
)

create unique index ix_jumin on member(jumin1,jumin2)

8.covering index
전체 테이블에서 일부 컬럼만을 액세스할 때는 해당 컬럼에 대해서 넌클러스터드 인덱스를 만들어 두면 월등한 처리 성능의 향상을 볼 수 있다.
create table member2(
id1 int not null,
id2 int not null,
name varchar(20),
address char(950)
)

set nocount on
begin tran
declare @i int
set @i=0
while @i<1000
begin
insert member2 values(@i,@i,''A'',''TEST ADDRESS'')
set @i=@i+1
end
commit tran
set nocount off

(set nocount on은 한개행 적요됨 이 나타나지 않도록 하기 위함)

1)일반 index 성능 분석
create index ix_id1_id2 on member2(id1)

set statistics io on
select id2 from member2 where id1=100
set statistics io off

(여기서 statistics io on은 쿼리 성능 분석하는 것으로 입출력 처리 정보를 보여준다.I/O가 많다는 것은 속도가 느려진다는 것을 의미한다.
실행하는데 걸린 시간을 알고 싶으면 set statistics time on/off을 사용한다.)

실행한 후 메시지를 보면 논리적 읽기 수가 3으로 나온다.

set statistics io on
select id1 from member2 where id2=100
set statistics io off
실행한 후 메시지를 보면 논리적 읽시 수가 143이다.
이것이 인덱스를 사용할 때와 사용하지 않았을 때의 상황이다.

2)covering index를 생성했을때
create index ix_id1_id2 on member2(id1,id2) with drop_existing

(여기서 with drop existing 는 테이블에 이미 인덱스가 있을때 같은 이름으로 인덱스를 새로 만들때는 이 옵션을 쓴다.)

set statistics io on
select id2 from member2 where id1=100
set statistics io off

논리적 읽기수 4개로 나옴

set statistics io on
select id1 from member2 where id2=100
set statistics io off

논리적 읽기수 4개로 나옴

3)키값이 아닌 컬럼을 쿼리에서 사용할 때
select * from member2 where id2=100 where id2=100 ---모든 컬럼 선택

논리적 읽기 수 5개


9.Optimizer Hints사용법
Optimizer Hints는 쿼리를 실행할 때 데이터를 어떻게 액세스하는지를 지정하는 것으로 쿼리 옵티마이저가 선택하는 처리순서를 바꾸려고 할 때 사용한다.
1)사용법
select from table_name with (table_nint[,...n])

* index(0) 옵션은 테이블 스캔을 하게 한다.
* 하나의 쿼리에서 여러개의 인덱스를 사용할 수 있다. index(index1,index2)
* optimizer hints는 정적(static)으로 쿼리 실행계획(execution plan)을 지정하며 쿼리 옵티마이저보다 우선한다.그러므로 optimizer hints를 사용할 때는 처리 성능이 좋았더라도 테이블의 데이터나 환경 설정이 변했을 때는 쿼리 처리 성능이 저하될 수 있으므로 주의 해야 한다.

create table member3(
id1 int not null,
id2 int not null,
name varchar(20),
address char(950)
)

set nocount on
begin tran
declare @i int
set @i=0
while @i<1000
begin
insert member3 values(@i,@i%50,''A'',''TEST ADDRESS'')
set @i=@i+1
end
commit tran
set nocount off

create index ix_id1_id2 on member3(id1,id2)

일반 상태
set statistics io on
select * from member3 where id2=5
set statistics io off

논리적 읽기 수 143개

옵티마이저힌트 사용
set statistics io on
select * from member3 with(index(ix_id1_id2)) where id2=5
set statistics io off

논리적 읽기 수 24개

10.clusterd와 nonclustered 색인에 대한 이해
클러스터 색인이 넌클러스터 색인보다 빠르다.범위를 주고 찾는경우에도 클러스터 색인이 훨씬 좋은 성능을 자랑한다.넌클러스터 색인만으로 범위를 주고 찾는 것은 테이블 스캔보다 더 나쁜 성능을 낸다.그렇지만 클러스터색인은 테이블당 하나밖에 존해할 수 없기 때문에 신중히 선택해야 한다.
클러스터 인덱스가 없을때 프라이머리키 constraints를 생성하면 기본적으로 클러스터드 인덱스가 만들어진다.그러나 기본키를 무조건 클러스터 색인으로 설정하는 것은 옳지 않다.일반적으로 정렬이 되어있어야 더 좋은 속도를 낼 수 있는 컬럼을 클러스터 색인으로 만드는 것이 좋다.왜냐하면 클러스터 색인은 데이터가 미리 키값으로 정렬되어있기 때문이다.그래서 프라이머리키를 클러스터 인덱스로 사용하지 않을 경우 생성할 때 명시적으로 Nonclustered 옵션을 지정해줘야 한다.

1)테이블 만들고 클러스터 색인 만들기
create table t_index(
id int identity,
name char(20) default ''default name'',
date smalldatetime default getdate()
)

create clustered index t_index_CL on t_index(id)
go

2)테이블에 10000건의 데이터 입력
set nocount on
declare @i smallint
set @i=0
while @i<10000
begin
set @i=@i+1
insert t_index default values
end
set nocount off

3)제대로 입력되었는지 확인
select max(id) from t_index

4)색인이 언제 사용되는지 확인
select * from t_index where id=300

select문을 마우스로 드래그하여 선택한 후 메뉴의 쿼리-예상실행계획표시(Ctrl+L)를 택하고 밑에 나오는 그림에 마우스를 갖다대면 풍선도움말이 나온다.(아래부터 플랜이라 명한다.)여기에 보면 물리적연산,논리적 연산에 clustered index seek이라고 나온다.즉 색인을 사용하고 있다.

5)범위가 있는 경우
select * from t_index where id between 1 and 10000
플랜을 사용하면 clustered index seek이라고 나온다.즉 색인을 사용하고 있다.

6)클러스터 색인이 있을 경우 테이블 스캔
select * from t_index with(index(0)) where id=300
select * from t_index with(index(0)) where id between 1 and 10000
플랜을 사용하면 clustered index scan이라고 나온다.즉 테이블 스캔을 사용하고 있다.

7)nonclustered 색인 만들기
create nonclustered index t_index_NC on t_index(id)
go

8)질의 사용시 색인 사용하면 I/O얼마나 발생?
set statistics io on
select count(name) from t_index where id=300
set statistics io off

2페이지 발생

set statistics io on
select count(name) from t_index with(index(t_index_NC)) where id=300
set statistics io off

(클러스터드 인덱스가 존재하므로 optimizer hint를 명시하지 않으면 자동적으로 clusterd index가 사용된다.)

4페이지 발생
(그렇다면 순수하게 넌클러스터 색인에서만 발생한 페이지는 2페이지다.왜냐하면 넌클러스터 색인은 클러스터 인덱스에 의 다시 배열되어있으므로 넌클러스터 색인을 찾고 다시 클러스터 색인을 찾기 때문이다.)

9)범위를 주고 찾는 질의 수행할 경우 클러스터와 넌클러스터 색인의 차이

클러스터 색인 사용시
set statistics io on
select count(name) from t_index where id between 1 and 300
set statistics io off
논리적인 읽음 수 3

테이블 스캔 사용
set statistics io on
select count(name) from t_index with(index(0)) where id between 1 and 300
set statistics io off
논리적인 읽음 수 47

넌클러스터 색인 사용시
set statistics io on
select count(name) from t_index with(index(t_index_NC)) where id between 1 and 300
set statistics io off
논리적인 읽음 수 645

이것은 테이블 전체인 46페이지보다 더 많다.(테이블 크기는 exec sp_spaceed t_index를 실행해보면 알수 있다.data 368Kb를 8로 나누면 페이지가 나온다.)따라서 넌클러스터 색인은 범위를 주고 값을 찾을 때는 색인을 사용하지 않는 것보다 불리하다.

10)클러스터 색인만 삭제하면 어떤일이 발생?
drop index t_index.t_index_CL
넌클러스터 색인이 다시 만들어진다.크러스터 색인의 키 값을 가리키다가 행번호를 가리키게 되기 때문이다.

11)스토어드 프로시저의 recompile
프로시저 만들기
create proc porcGetById
@id int
as
select count(date) from t_index where id<@id

I/O양 비교
set statistics io on
select count(date) from t_index where id<2
exec procGetByID 2
둘다 3페이지의 I/O를 보인다.아무 차이 없다.

다음 질의를 이어서 실행해보자
set statistics io on
select count(date) from t_index where id<1000
exec procGetByID 1000
첫번째는 49페이지.두번째는 1003페이지.
첫번째 실행에서 색인을 사용하도록 컴파일 되었기 때문에 두번째도 넌클러스터 색인을 사용하였고 그래서 엄청난 I/O를 보이고 있다.recompile하면 된다.

set statistics io on
exec porcGetByID 1000 with recompile

12)새로운 테이블을 만들고 클러스터 색인과 넌클러스터 색인을 모두 만들자.
create table contig(
id int identity constraint PK_contig Primary Key nonclustered,
name char(20) not null,
date datetime default getdate()
)

set nocount on
declare @i smallint
set @i=0
while @i<2000
begin
set @i=@i+1
insert contig values(''NAME''+convert(char(20),@i),default)
end

select count(*) from contig
go

create clustered index contig_CL on contig(name)
go

이미 PK로 선언된 넌클러스터 색인이 있기 때문에 클러스터 색인을 만들면 넌클러스터 색인은 다시 만들어진다.그래서 항상 클러스터 색인을 먼저 만들고 그 뒤에 넌클러스터 색인을 만드는것이 좋다.
신고
Posted by The.민군
수많은 PC 유저들이 있고 그들중 내부 부품에만 100만원이 넘는 돈을 지출하는 사람들도 흔하지만.......
 
케이스에 투자를 하는 사람들은 의외로 상당히 드뭅니다.

크게 문제만 안 일으키면 된다는 주의인지 코어 2 듀오 E6600같은 괴물 CPU에(가격은 괴물이 아니지만 성능은 괴물이 되고도 충분히


남죠. 30만원 초반대 CPU가 100만원이 넘는 경쟁사의 플래그쉽 모델 CPU를 가볍게 제껴버리니..-_-..그것도 오버 안한 기본상태에서


말입니다. 국민오버하면 대부분 성능이 1.5배 이상 뛰는걸 감안하면 정말 공전절후의 괴물 CPU 맞는듯 합니다) P5B-Deluxe같은


풀스펙 메인보드에 7900GT같은 고급 그래픽카드 끼워놓고 풍2같은 안습 케이스를 쓰시는 분들도 많이들 계시니까요....


싸구려 케이스에 넣는다고 컴퓨터가 폭발하거나 하진 않지만 좋은 케이스는 하나 사면 5년 이상은 무난하게 쓸 수 있는데다가 조립을


하는 과정 자체도 몹시 즐겁고 조립 후의 사용 만족감또한 높은지라 저는 중급 이상의 케이스를 권하는 사람입니다.


케이스를 볼때 유의해야 할 몇가지가 있는데 첫번째는 냉각성능이고 두번째는 확장성입니다.


가격은 개인 돈 되는대로 쓰는거고 디자인은 자기 땡기는거 쓰면 그만이니 딱히 기준을 잡을게 없구요.


냉각성능에 있어 가장 중요한 요소는 바로 배기팬입니다.


케이스의 크기와 관계 없이 배기팬의 역할은 너무나도 중요하거든요.


아무리 빅타워 케이스라고 해도 배기팬이 없으면 시스템 내부의 온도는 상당히 높습니다.(제 케이스로 실험해봤습니다-_-)


가급적 후면 배기팬이 최소한 92mm팬은 되어야 하고(80mm쿨러는 대부분 풍량이 약해서 의미가 없습니다. 80mm팬으로 제 성능을


내려면 최소한 3000RPM급 이상으로 구동이 되어줘야 합니다) 가능하면 120mm팬이 달려있는게 좋습니다.


전면의 팬은 하드디스크가 한두개라면 없어도 크게 상관은 없습니다만 아무래도 있는게 디스크 수명 차원에서도 좋고 시스템 내부


공기 순환 차원에서도 더 좋습니다.(대부분 전면팬은 120mm가 달리는게 추세입니다. 그 정도면 충분하구요)


암튼 몇 가지 기준에 의해 케이스를 고르는데 가격대 별로 쓸만한거 한 두개씩 나열해보며 이야기 해보죠.



1. 3만원대 이하


3R시스템 K100


 사용자 삽입 이미지

광고 이미지가 아스트랄하네요.
 
케이스 이름에 김일백이라고 붙인것도 참신하구:D
 
그나마 3만원 이하 케이스중엔 실하더군요.
 
길다란 그래픽카드(8800GTX같은 애들....더럽게 크죠)를 장착할 수 있다고 자랑하는데 솔직히 그래픽카드에 60만원 투자하면서
 
케이스 2만 6천원짜리 쓰는 사람이 어디있겠슴까-_-
 
허나 앞 뒷면 120mm팬 기본 장착에 디자인도 무난하네요.
 
그리고 하드디스크가 일반적인 PC케이스와 달리 직각으로 꺾여서 장착됩니다.
 
사용자 삽입 이미지
 


 

 
 
요렇게 말이지요
 
하드디스크의 장착이 쉽다는 점이 있으나 선정리가 좀 귀찮고 아무래도 일반적으로 디스크가 팬의 바람이 불어오는 면에 수평하게
 
장착되는것에 비해선 냉각 성능이 좀 떨어지죠.
 
그래도 타공을 충실히 해놔서 크게 문제는 없겠네요.(디스크가 한두개라는 전제 하에)
 
사실 저렇게 달아놓은 이유가 요즘 대형화 되는 고가형 그래픽카드를 장착할 수 있도록 하기 위함인데 솔직히 위에서 말씀드렸듯이
 
크게 의미는 없는 기능인듯 합니다-_-
 
가격은 오늘(07년 1월 24일)기준으로 다나와 최저가 2만 6천원입니다.
 
제품 상세 정보는http://pc.danawa.com/price_right.html?cate1=861&cate2=879&pcode=389030 요기로!
 
 
3R 시스템 R510
 
슬림케이스 중에도 한 가지 골라봤습니다.



 

 

사용자 삽입 이미지
 
슬림케이스치고 배기팬이 제대로 된게 없어서 아주 짜증이 나던 차에 3R에서 쓸만한 물건 하나 나왔더군요.
 
케이스 상단에 120mm팬을 하나 달아서 발열을 잡을 수 있는 효과적인 구조를 갖췄습니다.
 
슬림케이스인데 ATX보드와 파워를 그대로 쓸 수 있다는것도 장점이고 CPU 바로 윗쪽에 배기팬이 달려서 열 정체도 심하지 않겠네요.
 
가격도 저렴합니다.
 
오늘 기준 다나와 최저가 27000원입니다.
 
상세 제품 정보는http://pc.danawa.com/price_right.html?cate1=861&cate2=879&pcode=237466 요기에!
 
 
2. 3~4만원대
 
쿠덴 CP370
 
사용자 삽입 이미지
 
유저들을 위한 배려가 상당히 돋보이는 모델입니다.
 
미들타워 케이스중 가격대비 성능은 최상급에 오르는 녀석이구요.
 
에어가이드 대신 120mm팬이 달려서 나온것도 맘에 들고 전후 120mm팬 기본 장착은 당근 빠따고 메인보드 장착하는 판넬 뒷면이
 
뚫려있어 보드 뒷면에 지지대를 달아줘야 하는 요즘의 타워형 쿨러 일부 모델들의 사용도 몹시 편리한 구조입니다.
 
 
사용자 삽입 이미지
 
가만 보면 별것 아닌것 같지만 여태까지 그 누구도 하지 않았던 것이라 돋보이는거죠:D
 
한 가지 재미있는 건 샘플사진에서 케이스에 장착된 메인보드가 상당히 구형이라는겁니다.
 
소켓의 크기나 핀의 밀도로 비추어 볼땐 소켓 478 규격 같은데 램슬롯이 3개이고 EIDE포트가 2개 달려있는것으로 보아(어떻게
 
아냐구요? 뒷면에 납땜된거 보면 딱 보이잖아요~아닌가?-_-) i845보드가 아닐까 싶습니다.
 
소켓 478 칩셋인 i865가 기본적으로 듀얼채널 메모리 컨트롤링을 지원하기에 보통 2개 혹은 4개등의 짝수 램슬롯이 달려있는데
 
3개의 램슬롯이 균등한 간격으로 배치된걸 보니845보드가 아무래도 맞는것 같습니다.(만약 3개뿐이라도 듀얼채널을 지원했다면
 
한 개의 램슬롯은 약간 거리를 두고 배치되어 있을텐데 같은 간격으로 배치되었으니 그건 아니지 싶군요. 실제로 nVidia의 애슬론 XP
 
지원 칩셋인 nForce 보드중 일부 모델들은 듀얼채널을 지원함에도 3개의 램슬롯이 2개,1개씩 약간의 간격을 두고 장착된 모델들이
 
있었습니다)
 
845보드라면 펜티엄4가 초기에 시장출시 되었을때 RD램 가격이 너무 비싸서 비교적 저가인 DDR SD램을 쓸 수 있도록 나온
 
저가형 칩셋인데(한 02년도쯤에 나왔던걸로 기억합니다) 저게 마침 케이스 샘플 촬영실에 굴러다녔나봅니다.
 
암튼 다시 본론으로 돌아와서.....
 
저 케이스 상당히 쓸만합니다.
 
가격은 오늘 기준으로 다나와 최저가 37000원입니다.
 
제품 상세 정보는http://www.coupden.com/k/p_03.php 여기에 있습니다.(다나와엔 상품정보가 좀 부실하게 올라와 있더군요)
 
 
3. 5만원대
 
3R시스템 R110

사용자 삽입 이미지
 
어쩌다보니 3R의 케이스를 많이 추천하네요.
 
중저가형 미들타워 케이스를 그나마 제일 잘 만드는 회사니까요.(솔직히 GMC 케이스들....후집니다-_-. 증말루;;)
 
위의 모델은 미들타워 치고는 약간 고가인 감이 있지만 사다가 조립해보니까 돈값은 충분히 하더군요.
 
일단 하드디스크 냉각구조가 상당히 참신합니다.
 
사용자 삽입 이미지
 
호오......
 
히트싱크가 달려있습니다.
 
하드디스크는 바깥에 내놓는것보다 케이스 내부에 장착된게 오히려 온도가 낮게 나옵니다.
 
케이스에 나사로 꽉 조여 장착하면 고정부를 통해 열기가 케이스로 전해지며 케이스 전체가 하드디스크를 위한 거대한 방열판 역할을
 
해주기 때문이지요.(하드디스크 앞에 전면팬이 없더라도 후면 배기팬만 120mm이상 모델이 달려 있다면 저런 결과가 나옵니다)
 
저런식으로 케이스에 의한 디스크 냉각효과를 제대로 고려한 구조는 높이 사줄만 합니다.
 
사진엔 잘 안보이지만 전면에 140mm팬이 달려있습니다.(밑에 설명에도 써있군요)
 
히트싱크와 더불어 전면 140mm팬의 충분한 풍량은 하드디스크에게 쾌적한 온도를 제공해줍니다.
 
뭐 저것말고도 전면부에 온도표시/팬컨트롤러가 통합된 액정이 하나 달려있다는것도 눈에 띄는데 케이스에 기본 장착된 온도센서가
 
박막형이 아닌지라 CPU 근처에 갖다대기가 참 뭐합니다.(결과적으로 크게 유용하진 않다는 이야기-_-)
 
박막형이고 센서가 달린 선의 길이가 좀 더 넉넉했다면 하는 바람이 있는데 말입니다.
 
내부 온도에 신경 안쓰는 저같은 사람은 팬컨이고 나발이고 다 필요없으니 저거 빼고 값이나 좀 내렸으면 하는데 그래도 저게 있으면
 
일단 모양은 예쁘죠.(저는 모든 팬을 최고 RPM으로 돌려야 직성이 풀리는 사람이라 팬컨트롤러 같은거 안씁니다)
 
아 참고로 저 케이스가 무지하게 무겁습니다.
 
하드디스크 히트싱크도 그렇고 케이스 강판 자체가 상당히 두껍더군요.
 
강판이 두꺼우면 내부의 부품들에서 발생하는 진동을 효과적으로 잡아주고 소음 차단 효과도 큽니다.
 
그리고 튼튼하구요.
 
통상 저가형 케이스들은 0.6mm 두께의 강판을 쓰는데(맨 위에서 소개한 3만원대 이하 케이스들이 0.6T일겁니다) 바로 위의 R110은
 
0.8T를 쓰는듯 합니다.(버니어 켈리퍼스가 없어서 못재봤어요-_-)
 
경쟁 모델로는 경쟁사인 GMC의 풍2 정도가 있겠는데 가격대비 성능이나 제품 마감도나 디자인으로 보나 이쪽이 훨씬 우위라고
 
판단됩니다.
 
가격은 다나와 최저가 5만 8천원이고 상세 정보는http://pc.danawa.com/price_right.html?cate1=861&cate2=879&pcode=226899
 
여기에 있습니다.
 
 
4. 10만원대 초반
 
Antec Titan
 
사용자 삽입 이미지
 
솔직히 디자인은 점수 못주겠습니다만-_-......
 
10만원대 초반 빅타워 케이스중 제일 쓸만한 녀석 같습니다.
 
 

사용자 삽입 이미지
 
사진에서 볼 수 있듯이 6개의 하드디스크를 전면부 레일로 장착할 수 있고(은근히 레일장착방식 편합니다) 전면부에 92mm팬도
 
두 개 달 수 있습니다.
 
빅타워케이스를 쓰는 주된 이유중 하나인 '다수의 하드디스크 장착'이라는 점에서 높은 점수를 받을 수 있습니다.
 
이쯤에서 한가지 짚고 넘어갈점.
 
일반적인 미들타워 케이스에서도 7개의 3.5인치 하드디스크 베이를 지원하는 모델이 많지 않느냐고 반문하는 사람이 있을런지
 
모르겠는데 하드디스크를 다닥다닥 붙여서 7개 꽉 채워 장착하면 하드디스크 죽기 딱 좋습니다-_-
 
발열이 감당이 안될 지경이기 때문입니다.
 
전면부에서 120mm팬이 냉각을 해준다고 해도 바람이 닿는건 끽해야 3~4개정도일테고 그나마도 하드디스크 사이의 간격이 충분치
 
않으면 다 막혀버려서 제대로 된 냉각 효과를 거두기가 어렵지요.
 
저런 방식으로 92mm가 두개 전면에 달려있음으로 장착된 모든 하드디스크에 바람을 불어줄 수 있고 디스크간의 간격도 충분하므로
 
바람이 막힐 염려도 없이 6개의 베이를 꽉 채워서 사용 가능합니다.
 

사용자 삽입 이미지
 
대단한 것은 아니지만 한가지 눈에 띄는 부분이 있는데 바로 위의 사진에 나타나 있는 PCI 확장카드 지지대입니다.
 
서버케이스로의 사용도 염두해 두고 만든 케이스임을 알수 있습니다.
 

사용자 삽입 이미지
 
상단의 사진처럼 서버에선 길이가 긴 확장카드를 쓰는 일이 빈번합니다.(주로 SCSI컨트롤러나 레이드 컨트롤러가 이에 해당합니다)
 
근데 이 길다란 카드가 자체 무게로 휘는 경우가 발생하면 카드에 좋을게 없습니다.(기판이 휘다못해 최악의 경우엔 기판 내부에
 
빼곡히 인쇄된 회로가 끊어지는 참사가 발생을...흙흙 저런거 한장에 비싼건 100만원도 넘습니다. 기판 날라가면 AS고 나발이고 없이
 
무조건 새 제품으로 교체해야하는겁니다T.T)
 
그러므로 케이스 앞쪽에서 잡아주는 지지대가 한 개쯤 있으면 좋은데 저 케이스는 달려있네요.
 
단 지지대의 재질이 철판이므로 아무래도 절연을 위해 종이 한 장쯤 끼워두는 센스는 필요하지 싶습니다.(재수없게 PCB 기판에 인쇄된
 
회로와 닿으면 X되는겁니다-_-)
 
디자인은 좀 후줄근 하지만 그래도 이것저것 매력적인 구석이 많은 케이스라 일단 추천해봤습니다.
 
가격은 11만 3천원이고 상세정보는http://pc.danawa.com/price_right.html?cate1=861&cate2=879&pcode=124590 여기에 있슴다!
 
 
5. 10만원대 후반
 
Antec Nine Hundred
 
 

사용자 삽입 이미지
 
15만원정도 하는 쓸만한 케이스가 잘 없었는데(그나마하나 있던것도 수입사가 바뀌면서 단종-_-)
 
이번에 안텍에서 쓸만한 물건 하나 나왔습니다.
 
디자인도 쌍콤하고 무엇보다도 하드디스크 냉각 구조가 무지하게 좋습니다.
 
 

사용자 삽입 이미지

오오.....


작은 케이지 안에 하드를 수납한뒤 3개로 묶어서 모듈을 만들고 그 모듈 전면에 120mm팬을 달아놓았습니다.


실상 가장 이상적인 구조입니다!


거기에 기본적으로 위의 모듈을 2개나 제공합니다!


정말 너무너무 좋습니다T.T


거기에 파워가 하단에 달리는 대신 상단에 200mm팬을 달아버렸습니다!


사용자 삽입 이미지
 
핸드폰을 두기 딱 적당한 수납공간도 마음에 드는군요:D
 
근데 파워가 케이스 하단에 달리는건 좀 문제가 있습니다.
 
일단 선정리가 개같습니다.
 
그리고 다른 선은 둘째치고 CPU용 4핀 보조전원 케이블이 충분히 길지 않으면 조립을 못하는 엿같은 사태가 발생할 가능성이 있습니다-_-
 
그것만 빼면 정말 95점을 줘도 아깝지 않은 케이스 같네요.(디자인도 제 취향에 맞는군요:D)
 
가격은 16만 5천원이고 상세 정보는http://pc.danawa.com/price_right.html?cate1=861&cate2=879&pcode=396409 입니다.
 
 
6.20만원 이상
 
Coolermaster Stacker 830 Evolution
 
사용자 삽입 이미지
 
 
말로 일일이 장점을 열거하기 힘들어서 제품정보 사진을 통째로 가져왔습니다.
 
크으.....정말 정점의 케이스입니다.
 
냉각구조, 확장성, 디자인, 내구력......
 
모든면에서 정점에 다다른 궁극의 케이스입니다.(어디까지나 PC/워크스테이션용이라는 전제 하에-_-)
 
정말 갖고 싶었고 살 기회도 있었지만 넘 비싸서 제꼈습니다.
 
근데 이 케이스에서 짜증나는게 하나 있습니다.
사용자 삽입 이미지
하드디스크를 이렇게 생긴 모듈 안에 넣고 저 모듈을 5.25인치 베이에 장착합니다.
 
3개의 5.25인치 베이를 이용해서 4개의 하드디스크를 장착하게 해줍니다.
 
근데 저 짠돌이 쿨러마스터가 저걸 하나밖에 안넣어줍니다T.T
 
저 큰 케이스에 하드디스크 4개가 뭔 말도 안되는 소립니까T.T
 
거기에 하나당 가격이 3만 5천원이나 합니다T.T
 
저것보다 13만원이나 싼 위의 안텍 900이도 두개주는데!!!
 
암튼 저것 말고는 딱히 개선할 부분이 없을 정도로 정말 잘 나온 케이스임엔 틀림이 없슴다.
 
가격은 29만5천원인데 쿨러마스터 국내 유통사인 컴티즌에서밖에 팔지 않으므로 최저가이자 최고가인 판매가입니다-_-
 
저 녀석의 가격이 너무 비싸 다른 케이스는 뭐 없나 알아보던중 발견한 물건이 한가지 있습니다.
 
 
Thermaltake Armor
 
사용자 삽입 이미지
 
쩝.......
 
사이트에 큰 이미지가 없더군요.
 
빅타이푼이나 스몰타이푼등의 CPU쿨러로 알려져 있는 써멀테이크의 아머라는 케이스입니다.
 
아직 국내에선 발매가 안되었고 해외 가격은 160달러 조금 아래수준에서 형성되어 있더군요.
 
수입도 안되는놈의 케이스 말해서 무엇하느냐!라고 물으신다면.....
 
'잘하면 조만간 수입될지도 몰라요.'라고 답변해 드리겠습니다.
 
컴퓨터 케이스를 바꾸고 싶어서 안달을 하다가 쓸만한게 넘 비싸서 포기상태였는데 저런 상큼한 모델이 존재해서 알아보니 국내
 
유통사가 OEM시장만 하다가 이번에 본사의 요청이 들어와 리테일 시장에도 진출하면서 수입을 고려중이라고 하더군요.
 
새로 개장한 써멀테이크 한국 지사의 홈페이지에 거의 맨 처음으로 들어간 일반 유저가 저인지라-_- 리뷰를 하겠다고 우겨서
 
긍정적인 답변을 들었고(거의 확정이 된듯한데 아직은 잘 모르겠네요. 내일 전화나 해봐야겠슴다) 잘하면 국내에서 1호로 저 케이스를
 
만져보는 쾌거를 이룩하겠습니다.
 
사용자 삽입 이미지사용자 삽입 이미지
 
사진이 너무 작군요-_-......
 
자세히 보면 파워서플라이가 수직으로 장착될수 있게 되어있고 대신 옆면에 92mm팬이 하나 추가되었습니다.
 
그리고 그 92mm팬 앞에는 3개의 하드를 장착할 수 있도록 베이가 달려있구요.(가운데 사진)
 
그리고 오른쪽 사진을 보면 케이스 상단 중앙부의 92mm팬을 확인하실 수 있습니다.
 
파워서플라이가 CPU의 고발열을 잡아주는 주된 역할을 하는데 저렇게 수직하게 달리면 CPU 바로 상단의 쿨러가 없다는게 좀
 
걸리긴 합니다.
 
나중에 받아보고 온도 테스트 해보면 답이 나오겠죠.
 
사용자 삽입 이미지
 
iCage라는 모듈로 하드디스크를 식혀줍니다.
 
재질이 알루미늄이라 쿨러마스터의 제품보다 열전도율면에선 좀 더 이득인데 장착 가능한 하드의 숫자가 3개라는점은 조금 아쉽네요.
 
가격만 3만원 안쪽에서 형성된다면 다른 케이스 유저들한테도 상당히 괜찮은 아이템이 될것 같은데 말입니다.
 
 

사용자 삽입 이미지

저도 저렇게 써보고 싶군요-_-


파일서버용으로 쓸만할듯;;



휴우........


글 쓰기 힘들군요.


그래도 싸이에선 못할 일을 하고 나니 기분은 좋네요.


혹시라도 틀린 내용이 있을때 지적을 해주시면 감사히 받아들이겠습니다:D


그럼 이만

신고
Posted by The.민군
네트워크를 이용해 모니터를 2배로 확장해주는 유틸리티 Maxivista


MDS(Multi Display System)은 윈도우 98SE부터 지원되던 기능으로 전문가들에게 큰 인기를 끌었던 기능이다. 이후 그래픽 카드에서 추가적으로 일부 제품에서 지원하기 시작하면서 지금은 대부분의 그래픽 카드가 기본적인 기능으로 지원하고 있다. 이 기능을 이용하면 한 대의 컴퓨터로 두 대 이상의 모니터를 연결해서 사용할 수 있다.☞ [김지현의 하드웨어 이야기] 모니터 더 넓게 사용하기 참조


이 MDS 기능을 독특한 방법으로 사용할 수 있도록 해주는 소프트웨어가 있다. 맥시비스타라는 유틸리티를 이용하면 네트워크를 이용해 다른 컴퓨터의 모니터를 내 컴퓨터의 MDS 기능으로 확장해서 사용할 수 있다. 이 유틸리티의 활용법을 알아본다.


1. 맥시비스타의 환경설정
맥시비스타는 네트워크에 연결된 두 대 이상의 컴퓨터에서 사용할 수 있는 프로그램이다. PT를 하거나 노트북을 가지고 있거나 강의실에서 이 프로그램은 유용하게 사용할 수 있다. 맥시비스타 프로그램을 다운로드한 후 메인 컴퓨터 즉 서버로 사용할 컴퓨터에 설치한다. 서버 컴퓨터와 네트워크로 연결된 제2PC의 모니터를 메인 컴퓨터에서 마치 메인 컴퓨터에 연결된 모니터처럼 사용할 수 있는 것이다.

☞ 프로그램 다운로드 :http://pds.hanafos.com/NPViewPds.asp?fileSeq=136393

사용자 삽입 이미지

메인 컴퓨터에서 맥시비스타를 설치한 후에 제2PC에서 사용할 표시 프로그램을 생성하라는 메시지가 나타난다. ‘표시프로그램 생성하기’ 버튼을 클릭한다.

사용자 삽입 이미지

표시 프로그램을 저장할 폴더를 물어오는 메뉴창이 나타난다. 적당한 곳에 프로그램을 저장한다. 이렇게 저장된 실행 파일은 ‘MaxiVistaViewerA.exe’라는 이름으로 저장되며 이 실행파일은 제2PC에 복사해서 사용한다.

사용자 삽입 이미지

메인 컴퓨터에서 실행한 맥시비스타 프로그램은 트레이에 아이콘으로 등록된다. 맥시비스타를 이용하려면 프로그램을 실행해두어야 한다.

사용자 삽입 이미지

트레이에 등록된 아이콘을 마우스 오른쪽 버튼으로 클릭하고 ‘환경설정’으로 마우스포인터를 가져가면 맥시비스타의 환경설정을 할 수 있는 메뉴가 나타난다. 제2PC의 모니터를 보다 선명한 화질로 사용하려면 상단의 ‘32bit’를 선택한다. 그리고 ‘무선 LAN’을 선택해두면 무선 네트워크를 지원하는 노트북이나 컴퓨터의 모니터를 서버 컴퓨터의 MDS로 확장해서 사용할 수 있다. 그리고 ‘화면 복제하기’에 체크를 해두면 메인 컴퓨터에서 나타난 모니터 화면의 내용을 그대로 제2PC의 모니터에 보여지도록 할 수 있다. ‘화면 복제하기’에 체크를 하지 않게 되면 제2PC의 모니터를 메인 컴퓨터의 제2 모니터로 확장해서 사용할 수 있도록 해준다. ‘네트웍 설정’을 클릭한다.

사용자 삽입 이미지

기본적으로 맥시비스타는 메인 컴퓨터에서 실행하고 표시 프로그램을 제2PC에서 실행해두면 자동으로 메인 컴퓨터에서 실행한 맥시비스타 서버 프로그램이 제2PC의 표시 프로그램을 찾아서 두 컴퓨터를 연결해준다. 하지만 내부 네트워크가 아닌 외부 네트워크에서 이용하거나 네트워크 설정에 따라 제대로 제2PC를 찾지 못하는 경우가 있다. 이 경우에는 ‘수동’을 클릭한 후에 제2PC의 IP 주소를 직접 기입해야 한다.

사용자 삽입 이미지

만일 제2PC를 검색하면 메인 컴퓨터의 트레이에 등록된 맥시비스타 아이콘이 녹색으로 표시된다. 노란불이 깜빡 거리면 메인 컴퓨터가 제2PC를 자동적으로 검색하는 것이다.

사용자 삽입 이미지

만일 제대로 제2PC가 검색되지 않으면 메인 컴퓨터의 트레이에 등록된 아이콘을 마우스 오른쪽 버튼으로 클릭한 후 ‘추가모니터 실행하기’를 선택해야 한다. 참고로 반드시 제2PC에서는 서버 프로그램의 표시 프로그램 생성하기를 이용해 생성한 프로그램을 실행해야 한다. 다른 메인 컴퓨터에서 생성한 표시 프로그램을 이용하면 안된다.

사용자 삽입 이미지

메인 컴퓨터에서 제어판의 디스플레이를 실행하면 디스플레이 등록정보를 만날 수 있다. ‘설정’ 탭을 선택하면 제2PC의 모니터를 확장해서 사용할 수 있는 메뉴가 나타난다. 화면에 나타난 ‘2’라고 표시된 모니터가 제2PC의 모니터이다. ‘2’를 마우스 오른쪽 버튼으로 클릭하고 ‘연결’을 선택한다. 이러한 방법으로 제2가 아닌 제3, 제4 등의 여러 컴퓨터의 모니터를 계속 추가적으로 확장해서 사용할 수 있다.

2. 맥시비스타 활용하기

맥시비스타는 메인 컴퓨터에서 환경설정하는 것이 어려울 뿐 제2PC에서는 사용법이 간단하다. 제2PC에서 표시 프로그램을 실행하는 것만으로 맥시비스타를 사용하기 위한 준비는 모두 완료된다.

사용자 삽입 이미지

제2PC에서 앞서 복사해둔 표시 프로그램을 실행한다. 프로그램은 한 번만 실행해야 한다. 2번 실행하면 이와 같은 메시지가 나타난다. 반드시 연결할 메인 컴퓨터에서 생성한 표시 프로그램을 실행해야만 한다.

사용자 삽입 이미지

제2PC에서 표시 프로그램을 실행하면 트레이에 아이콘이 등록된다. 아이콘을 마우스 오른쪽 버튼으로 클릭하면 제품 정보를 볼 수 있는 메뉴가 나타난다. 프로그램을 종료하려면 ‘EXIT’을 선택하면 된다.

사용자 삽입 이미지

‘ID’를 통해서 표시 프로그램을 생성한 메인 컴퓨터를 알 수 있다. 만일 ID가 메인 컴퓨터에 설치한 맥시비스타의 ID와 다르면 서로 연결이 안된다.

사용자 삽입 이미지

정상적으로 메인 컴퓨터와 제2PC가 연결되면 제2PC의 트레이에 등록된 아이콘이 주황색으로 표시된다.

사용자 삽입 이미지

좌측의 메인 컴퓨터인 노트북에 설치된 맥시비스타와 우측 컴퓨터에 설치된 표시 표시 프로그램에 의해서 두 컴퓨터가 서로 연결되어 있다. 좌측의 메인 컴퓨터에 나타난 화면이 그대로 복제되어 우측의 제2PC 모니터에 표시되는 것을 알 수 있다. 우측 제2PC 모니터에는 전체 해상도로 화면이 보여지도록 할 수도 있고 부분적으로 작게 보이도록 할 수도 있다. 이 방법을 이용하면 메인 컴퓨터에 나타난 화면을 여러 대의 컴퓨터 모니터에 모두 동시로 나타나게 할 수 있다. 예를 들어, 강의실에서 강사 PC에 맥시비스타 서버 프로그램을 설치하고 학생들 PC 모두에 표시 프로그램을 실행해두면 강사 PC에 나타난 화면을 모든 학생들 PC에 보여지도록 할 수 있다.

사용자 삽입 이미지

혹은 모니터를 확장해서 사용하는 것도 가능하다. 우측 메인 컴퓨터에 나타난 모니터와 좌측의 제2PC에 연결된 모니터가 서로 연결되어 확장되어 있음을 알 수 있다. 즉 제2PC의 모니터를 메인 컴퓨터에서 MDS 기능으로 연결된 모니터처럼 확장해서 사용할 수 있는 것이다. 물론 이 경우에 두 대의 컴퓨터 모두 전원이 들어와 있어야 한다. 제2PC 사용자가 메인 컴퓨터에 연결된 모니터 기능을 해제하려면 마우스를 클릭하면 화면이 본래대로 되돌아온다.

글/김지현(oojoo@oojoo.co.kr)

신고
Posted by The.민군

mysql 설치 중 LinuxThreads 에러 발생할 때

(Fedora Core 4 이상의 배포판에서 mysql 소스컴파일 설치시 발생한다.)

 

- /usr/include/pthread.h 파일에 /* Linuxthreads */ 라인을 삽입해준다.

echo "/* Linuxthreads */" >> /usr/include/pthread.h

 

<참고>

There are two workarounds which should enable 4.0 to build on a NPTL-only
system:
1) Insert a misleading comment into the header file defining thread functions:
     echo '/* Linuxthreads */' >> /usr/include/pthread.h
  (The check just goes by searching that string.)

2) Explicitly give a threads library:
     ./configure --with-pthread --with-named-thread-lib=-lpthread ...
  (This takes precedence over the checks.)
./configure --prefix=/usr/local/mysql --with-charset=euckr --with-pthread --with-named-thread-lib=-lpthread

신고
Posted by The.민군

mysql 설치

MYSQL 2007.05.08 23:50
.1. 개요
중소 규모의 데이터 베이스에서 mysql은 가장 뛰어난 성능을 지니고 있다.
1억 만건의 데이터를 처리 할수 있으며, select에 있어서 가장 빠른 것이 특징이다.
소규 규모 데이터 베이스 처리에 있어서 mysql이 가장 적절하다. APM이라는 것처럼
아파치와 궁합이 잘 맞는다.


3.2. 데이터 베이스 최적화
[참고]
1.http://www.mysql.com/doc/C/o/Compile_and_link_options.html
2.http://www.mysql.com/doc/c/o/configure_options.html
3.http://www.mysql.com/doc/M/y/MySQL_binaries.html
4.http://www.mysql.com/doc/W/h/Which_version.html
5.http://tunelinux.pe.kr/mysql/manual/10.txt
6.http://database.sarang.net/database/mysql/tuning/optimize_mysql.html
7.http://www.phpleader.co.kr/study/studycontent.php?study2_seq=47


3.3. 소스 화일 다운로드
[다운로드]
http://www.mysql.com/downloads/mysql-4.0.html


3.4. 컴파일 하기
#소스를 푼다.
[root@ilinuxbay APM_RERIN]# tar zxvf mysql-4.0.12.tar.gz
[root@ilinuxbay APM_RERIN]# cd mysql-4.0.12
[root@ilinuxbay mysql-4.0.12]#

#쉘을 작성 해서 한번에 mysql을 설치를 한다.
[root@ilinuxbay mysql-4.0.12]# vi pgcc_mysql.sh

############# 쉘로 작성 #############
# !/bin/bash
# mysql 옵션 설정 가능한 한줄로 쓴다 혹. 옵션이 적용 안될수 있음.
./configure --prefix=/usr/local/mysql --with-client-ldflags=-all-static \
--with-mysqld-ldflags=-all-static --with-charset=euc_kr --without-debug \
--enable-assembler --with-mysqld-user=mysql


# 컴파일을 하고 설치를 한다.
make && make install

# 데이터 베이스를 생성한다.
/usr/local/mysql/bin/mysql_install_db

# mysql 그룹과 디렉토리 퍼미션을 설정을 한다.
groupadd mysql
useradd -g mysql mysql
chown -R root /usr/local/mysql
chown -R mysql /usr/local/mysql/var
chgrp -R mysql /usr/local/mysql

# 라이브러들을 등록해준다.
echo /usr/local/mysql/lib/mysql >> /etc/ld.so.conf && ldconfig

# mysqld의 경로를 지정해준다.
echo PATH=$PATH:/usr/local/mysql/bin >> /etc/profile && source /etc/profile

# /usr/local/mysql/share/mysql/mysql.server 파일을 /etc/init.d/mysqld 로 복사한다.
cp /usr/local/mysql/share/mysql/mysql.server /etc/init.d/mysqld

############# 여기까지 쉘로 작성 #############

[root@ilinuxbay mysql-4.0.12]# bash pgcc_mysql.sh # 실행 시킨다.

#쉘이 잘 작동 했는지 확인

#-1 계정
[root@ilinuxbay mysql-4.0.12]# cat /etc/passwd | grep mysql
mysql:x:502:502::/home/mysql:/bin/bash

#-2 데이터 베이스
[root@ilinuxbay mysql-4.0.12]# ls /usr/local/mysql/var/
mysql test

#-3 라이브러리
[root@ilinuxbay mysql-4.0.12]# cat /etc/ld.so.conf | grep mysql
/usr/local/mysql/lib/mysql

#-4 디렉토리 퍼미션
[root@ilinuxbay mysql-4.0.12]# ls -la /usr/local/mysql/
total 48
drwxr-xr-x 12 root mysql 4096 Jul 23 15:14 .
drwxr-xr-x 16 root root 4096 Jul 23 15:14 ..
drwxr-xr-x 2 root mysql 4096 Jul 23 15:14 bin
drwxr-xr-x 3 root mysql 4096 Jul 23 15:14 include
drwxr-xr-x 2 root mysql 4096 Jul 23 15:14 info
drwxr-xr-x 3 root mysql 4096 Jul 23 15:14 lib
drwxr-xr-x 2 root mysql 4096 Jul 23 15:14 libexec
drwxr-xr-x 3 root mysql 4096 Jul 23 15:14 man
drwxr-xr-x 6 root mysql 4096 Jul 23 15:14 mysql-test
drwxr-xr-x 3 root mysql 4096 Jul 23 15:14 share
drwxr-xr-x 7 root mysql 4096 Jul 23 15:14 sql-bench
drwx------ 4 mysql mysql 4096 Jul 23 15:14 var

#mysql 자동화 스크립트 및 부팅시 자동 시작 설정
[root@ilinuxbay support-files]# cd /etc/rc.d/init.d/

# /etc/rc.d/init.d/mysqld 에 내용 추가
==> $bindir/mysqld_safe --datadir=$datadir --pid-file=$pid_file --language=korean &

# /etc/rc.d/init.d/mysqld 에 내용 추가
# max_connections=500 여기서 주의 점은 최대 화일 열수 있는 개수 설정이다.
# 그 메모리나 데이터 베이스 양에 따라서 적절히 조절을 해주어야 한다.

#############################################################################
# $bindir/mysqld_safe \ #
# --log-update=update.log -O max_connections=500 -O max_connect_error=999999999 \ #
# --user=$mysql_daemon_user --datadir=$datadir --pid-file=$pid_file --log=$log_file & #
#############################################################################

#화일을 생성한 후에 퍼미션을 실행 퍼미션으로 조정한다.
[root@ilinuxbay init.d]# chmod +x mysqld

# 설치 후에 시스템에 맞추어서 시스템 최적화 옵션 화일을 /etc/ 로 복사한다.

# 다음은 128메모리를 사용하는 경우이다.

[root@ilinuxbay init.d]# cd /usr/local/src/source/mysql-4.0.12/support-files
[root@ilinuxbay support-files]# cp my-medium.cnf /etc/my.cnf

# 512 M 이면
[root@ilinuxbay support-files]# cp my-large.cnf /etc/my.cnf

# 1G이면
[root@ilinuxbay support-files]# cp my-huge.cnf /etc/my.cnf


# 리부팅후 자동으로 시작할수 있게 초기화 스크립트에 링크를 걸어 준다.
[root@ilinuxbay init.d]# cd /etc/rc3.d/
[root@ilinuxbay rc3.d]# ln -s ../init.d/mysqld S98mysqld
[root@ilinuxbay rc3.d]# cd /etc/rc5.d/
[root@ilinuxbay rc5.d]# ln -s ../init.d/mysqld S98mysqld

#데이터 베이스를 시작한다.
[root@ilinuxbay init.d]# ./mysqld start
[root@ilinuxbay init.d]# Starting mysqld daemon with databases from
/usr/local/mysql/var

# ntsysv에 mysqld를 추가해준다
[root@ilinuxbay init.d]# chkconfig --add mysqld

# mysqld 서비스 데몬 확인
[root@ilinuxbay init.d]# ntsysv

#프로세스를 확인해서 제대로 프로세스가 뜨는지 확인 한다.
[root@ilinuxbay init.d]# pstree | grep mysql
|-mysqld_safe---mysqld---mysqld---8*[mysqld]

#mysql 패스워드 설정
proot@ilinuxbay /bin]# cd /usr/local/mysql/bin
[root@ilinuxbay /bin]# ./mysqladmin -u root password '패스워드'

# Exception : 패스워드 분실시 다음과 같이 한다
[root@ilinuxbay /bin]# cd /usr/local/mysql/bin
[root@ilinuxbay /bin]# killall mysqld
[root@ilinuxbay /bin]# ./safe_mysqld --skip-grant &
[root@ilinuxbay /bin]# mysql
mysql> USE mysql;
mysql> UPDATE user SET Password=PASSWORD('패스워드') WHERE user='root';
mysql> FLUSH PRIVILEGES;
신고
Posted by The.민군

MySQL server through socket '/tmp/mysql.sock'라는 에러가 뜰경우

[root@www bin]# ./mysql

ERROR 2002: Can't connect to local MySQL server through

socket '/tmp/mysql.sock' (2)

[root@www bin]#

위 내용은 APM설치후 mysql실행하면, 저렇게 나오는데..
아무리 vi /tmp/mysql.sock 를해도, 안에 아무런 내용이없는데.
저럴때는 어떻게 해야하나요?

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

mysql 서버가 실행되어 있지 않아서입니다.

/tmp/mysql.sock 소켓파일은 mysql 실행하시면 생성됩니다...

우선 root 상태에서 아래 명령어를 실행하세요.

[root@www bin]#./safe_mysqld --user=root &

그 다음 ps aux 로 mysql 데몬 정상적으로 실행되었는지 확인하신 다음 접속해 보세요.

참고로 설치하신 mysql버전이 mysql4.x.x 이상이라면..

[root@www bin]#./mysqld_safe --user=root &

요렇게 바뀐것 같던데요...



============================================================================


MySQL 데몬이 활성화 되지 않은듯 싶습니다.

RPM으로 설치 하셨다면

/etc/init.d/mysqld start 하시고

소스로 설치하셨다면 해당 설치 디렉토리에서 데몬 실행파일을 실행해보시기 바랍니다


==============================================================================


"socket '/tmp/mysql.sock' (2)"
위의 에러는 거의 대부분이 data가 들어가는 디렉토리의 권한이 없기 때문에 나타나는 에러입니다.

먼저 user를 추가해주시고요
#groupadd mysql
#useradd -g mysql mysql

그리고 나서 mysql의 데이타가 들어있는 디렉토리를 수정해주세요
#chown -R root "mysql 디렉토리"
#chown -R mysql "mysql의 데이타가 들어있는 디렉토리"
#chgrp -R mysql "mysql 디렉토리"

이렇게 해주세요.


===============================================================================


root@linuxdb mysql]# chown -R root .
이것의 의미를 잘모르세요 발생하신것 같네요.. 저의 불찰이기도 하고요..
제일 뒤에 보이는 .(점)도 필요한부분입니다.
./ <== 현재 디렉토리를 의미하고요
../ <== 앞단계의 디렉토리를 의미합니다.

즉, 만약에 mysql폴더가 /usr/local/mysql/ 이라면
chown -R root /usr/local/mysql/
chown -R mysql /usr/local/mysql/var <== 요기는 데이타가 쌓이는 폴더입니다.
※ 이부분이 않되어있어서 그런같습니다.
chgrp -R mysql /usr/local/mysql/

그럼 성공 하시길.. 즐거운 하루 되세요...

p.s 실행하실때..
mysqld ended 가 나오면 실행이 안된겁니다.
safe_mysqld &<== 요거를 꼭붙이셔서 실행하세요.
이의미는 '백그라운드로 돌려라'라는 의미입니다.
실행하셔서 아무런 반응이 없으면 된겁니다.엔터를 한번더 치셔서 다음명령어를 치시고 계속하시면 됩니다.


=====================================================================================


mysql.sock 은 유닉스 소켓 연결에 사용되는 화일 입니다..
우선 이화일의 위치를 확인 하실 필요가 있습니다..

mysql 의 bin 디렉토리에서

mysql_config --socket

이라고 치면 현재 설정 되어 있는
mysql.sock 화일의 위치가 나옵니다.

그러면 다음과 같이 -S옵션을 주어서 프로그램을 실행해 보세요
./mysqladmin -uroot password '123456' -S/tmp/mysql.sock

/tmp/mysql.sock 에 님의 현재 mysql.sock 위치를 넣으면 되겠죠?

혹시 이렇게 해도 되지 않는 다면

netstat -ap | grep mysql

해보세요
그럼 현재 mysql 서버가 사용하는 유닉스 서버의 소켓과 정보를 보여 줍니다.

만일 소켓 화일이 /tmp/mysql.sock 이 아니라면
netstat -ap | grep mysql
통해 얻은 새로운 mysql.sock 화일의 위치를 가지고 실행해 보세요

mysql.sock 화일의 설정은 php.ini 화일에서 지정 해줄수 있습니다.
php.ini 화일에 보면
mysql.default_socket = 이라는 설정이 있는데
여기에 위치를 지정해주면 됩니다.



====================================================================================



신고
Posted by The.민군

Ajax 마스터하기, Part 10:데이터 전송에 JSON 사용하기 (한글)

JavaScript 객체 사용하기

사용자 삽입 이미지
사용자 삽입 이미지

난이도 : 초급

Brett McLaughlin, Author and Editor, O'Reilly Media Inc.

2007 년 5 월 02 일

평이한 텍스트와 XML은 비동기식 애플리케이션에서 정보를 송수신 할 때 사용할 수 있는 데이터 포맷입니다.Ajax 마스터하기시리즈에서는 또 다른 유용한 데이터 포맷인 JavaScript Object Notation (JSON)에 대해 알아보고, 이것이 애플리케이션에서 데이터와 객체들을 어떻게 이동시키는지를 설명합니다.

여러분이 본 시리즈를 오랫동안 읽어왔다면, 데이터 포맷에 대한 지식도 많이 쌓였을 것이다. 이전 기술자료에서는 평이한 텍스트와 간단한 name/value 쌍이 많은 비동기식 애플리케이션에서 어떤 역할을 하는지를 살펴보았다. 여러분은 다음과 같은 데이터를 조합할 수 있다.

firstName=Brett&lastName=McLaughlin&email=brett@newInstance.com

더 이상 무엇을 할 필요가 없다. 사실, 웹 고수들은 이것이 GET 요청을 통해 보내지는 정보용 포맷이라는 것을 알고 있다.

그리고 나서, 본 시리즈에서는 XML에 대해서 다루었다. 확실한 것은 XML은 부정적인 측면과 긍정적인 측면 모두에서 정당한 평가의 몫을 받았고, 이러한 것이 Ajax 애플리케이션에서도 나타나는 것은 그리 놀랄 일이 아니다.본 시리즈의 지난 기술자료들에서 XML이 대안 데이터 포맷들을 어떻게 제공하는지를 파악하기 바란다.

<request>  <firstName>Brett</firstName>  <lastName>McLaughlin</lastName>  <email>brett@newInstance.com</email></request>

이것은 여러분이 위해서 보았던 것과 같은 데이터이지만, XML 포맷으로 저장되어 있다. 그 외에 특징적인 것은 없다. 평이한 텍스트와 name/value 쌍 대신에 XML을 사용할 수 있는 또 하나의 데이터 포맷일 뿐이다.

이 글에서는 또 다른 데이터 포맷인JavaScript Object Notation(JSON)에 대해 살펴보겠다. JSON은 여러분이 이미 보았던 것과 비슷한 부분이 있고, 어떤 부분은 생소하다. 이것은 여러분에게 또 다른 선택권을 줄 것이며, 그 선택은 그렇게 나쁘지 않다.

선택할 수 있는 권한

JSON 포맷에 대해 상세히 설명하기 전에, 특히, 평이한 텍스트에서 XML과 name/value 쌍으로 작업하는 방법을 이미 알고 있다면, 다양한 데이터 포맷을 다룬 기술자료들을 먼저 읽어보기 바란다.(다음 글에서도 JSON에 대해 다룰 것이다.) 이유는 간단하다. 여러분에게 선택권이 많이 주어지고 문제에 대한 옵션들이 많아질수록,단 하나의 솔루션 보다는 문제에 대한최상의 솔루션을 찾을 수 있는 더 좋은 기회들이 생기기 때문이다.

name/value 쌍과 XML

본 시리즈에서는 name/value 쌍이 적합한 상황과 XML을 사용하기에 적합한 상황에 대해 이미 다루었다. 거듭 말하지만, 여러분은 우선 name/value 쌍을 사용하는 것을 늘 생각해야 한다. 이것은 대부분의 비동기식 애플리케이션에서 생기는 문제들에 대한 가장 간단한 솔루션이고, JavaScript에 대한 기본적인 지식만 있어도 간단히 해결된다.

여러분은 XML로 전향하는데 제약이 없다면 대안 데이터 포맷을 사용하는 것에 관해 걱정할 필요가 없다. 확실히, XML 포맷의 입력을 요하는 서버 측 프로그램으로 데이터를 보낸다면, 데이터 포맷으로 XML을 사용해야 한다. 대부분의 경우, XML은 애플리케이션에 여러 정보 조각들을 보내야 하는 서버용으로 적합하다. 다시 말해서, XML은 Ajax 애플리케이션으로부터의 요청 보다는, Ajax 애플리케이션으로의 응답으로 더 일반적으로 사용된다.

JSON 추가하기

name/value 쌍 또는 XML을 사용할 때, JavaScript를 사용하여 애플리케이션에서 데이터를 가져다가, 이것을 데이터 포맷에 채워 넣는다. 이 경우, JavaScript는 데이터 조작 언어로서의 역할을 하고, 웹 폼에서 데이터를 이동시키고 조작하며, 이것을 서버 측 프로그램에 쉽게 보내질 수 있는 포맷에 넣는다.

하지만, 단순한 포맷 언어 이상으로 JavaScript를 사용해야 할 때가 있다. 이러한 경우에, JavaScript 언어의 객체를 사용하여 데이터를 표현하고, 웹 폼에서 데이터를 가져다가 요청을 한다. 이러한 상황에서, JavaScript에 있는 객체에서 데이터를 추출하고 그 데이터를 name/value 쌍 또는 XML로 채우는 것이 일이다. 이때에 JSON이 빛을 발한다. JavaScript 객체를 (동기식 또는 비동기식) 요청의 일부로 보내질 수 있는 데이터로 쉽게 변환할 수 있다.

기본적으로 JSON은 문제해결의 특효약은 아니다. 하지만, 매우 특수한 상황에 있어서 훌륭한 옵션이 된다. 그러한 상황에 절대로 놓이지 않을 것이라고 가정하지 말고, 이 글과 다음 글을 읽으면서 JSON을 배워가기 바란다. 그러한 유형의 문제에 직면할 때를 대비한다고 생각하면 좋을 것이다.


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


JSON 기초

JSON으로는 JavaScript 객체로 표현된 데이터를 한 함수에서 다른 함수로, 또는 비동기식 애플리케이션의 경우, 웹 클라이언트에서 서버 측 프로그램으로 쉽게 전달할 수 있는 스트링으로 변형할 수 있다. 문자열이 약간 이상해 보이지만 JavaScript에 의해 쉽게 인터프리팅 되고, JSON은 name/value 쌍 보다 복잡한 구조도 표현한다. 예를 들어, 단순한 키와 값 리스트 대신, 배열과 복합 객체들을 나타낼 수 있다.

JSON 예제

JSON에서는 name/value 쌍이 다음과 같이 표현된다.

{ "firstName": "Brett" }

이는 매우 기본적인 것이고, 텍스트의 name/value 쌍 보다는 더 많은 공간을 차지한다.

firstName=Brett

하지만, JSON은 여러 name/value 쌍들을 하나로 연결할 때 진가를 발휘한다. 우선, 다음과 같이, 여러 name/value 쌍으로 데이터레코드를 생성할 수 있다.

{ "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" }

신택스의 관점에서 보면 name/value 쌍 보다 나은 점이 없어 보이지만, 이 경우, JSON은 훨씬 더 사용하기 쉬우며, 가독성도 놀랍다. 예를 들어, 위 세 개의 값들은 같은 레코드의 일부이다. 중괄호는 그 값이 같은 커넥션을 갖고 있다는 것을 표시하고 있다.

값들의 배열

값을 나타내야 할 때, JSON은 보다 읽기 쉽고, 덜 장황하다. 예를 들어, 인명부가 있다고 해보자. XML에서는, 수 많은 오프닝/클로징 태그에 둘러싸이게 되고, 전형적인 name/value 쌍을 사용한다면, 독점적인 데이터 포맷을 사용해야 하거나,person1-firstName처럼 키 네임을 수정해야 한다.

JSON에서는 다음과 같이 괄호를 사용하여 레코드를 그룹핑 할 수 있다.

{ "people": [  { "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" },  { "firstName": "Jason", "lastName":"Hunter", "email": "jason@servlets.com" },  { "firstName": "Elliotte", "lastName":"Harold", "email": "elharo@macfaq.com" }]}

이해하기도 어렵지 않다. 이 경우,people이라는 하나의 변수가 있고, 값은 세 개의 아이템을 포함하고 있는 배열이며, 각각의 레코드에는 이름, 성, 이메일 주소가 있다. 위 예제는 레코드들을 모두 투입하는 방법과, 아이템을 괄호가 있는 싱글 값으로 그룹핑 하는 방법을 설명하고 있다. 물론, 같은 신택스를 사용할 수 있지만, 여러 값들(각각 여러 레코드들을 갖고 있음)을 갖고 있다.

{ "programmers": [  { "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" },  { "firstName": "Jason", "lastName":"Hunter", "email": "jason@servlets.com" },  { "firstName": "Elliotte", "lastName":"Harold", "email": "elharo@macfaq.com" } ],"authors": [  { "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },  { "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },  { "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" } ],"musicians": [  { "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },  { "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" } ]}

여기에서 주목해야 할 점은 각각이 다수의 값을 내포하고 있는 많은 값들을 표현할 수 있는 당신의 능력이다. 또 하나 주목해야 할 점은 레코드의 name/value 쌍들은 다른 메인 항목(programmers, authors, musicians)에 따라 변한다는 것이다. JSON은 완전히 동적이고, JSON 구조 안에서 데이터를 표현하는 방식을 바꿀 수 있다.

또 한 가지 알아두어야 할 것은 JSON 포맷 데이터로 작업할 때 제약 조건이 없다는 점이다. 따라서, 어떤 것을 표현하는 방식을 바꿀 수 있고, 심지어는 같은 데이터 구조 내에서 같은 것을 다른 방식으로 나타낼 수도 있다.


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


JavaScript에서 JSON 사용하기

JSON 포맷을 다룬 후라면, JavaScript에서 이것을 사용하는 것은 간단하다. JSON은 네이티브 JavaScript 포맷이고, JavaScript 내에서 JSON 데이터와 작업하기 위해 특별한 API나 툴킷이 필요 없다.

JSON 데이터를 변수에 할당하기

예를 들어, 새로운 JavaScript 변수를 만들고, JSON 포맷 데이터 스트링을 여기에 직접 할당한다고 해보자.

var people =  { "programmers": [    { "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" },    { "firstName": "Jason", "lastName":"Hunter", "email": "jason@servlets.com" },    { "firstName": "Elliotte", "lastName":"Harold", "email": "elharo@macfaq.com" }   ],  "authors": [    { "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },    { "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },    { "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }   ],  "musicians": [    { "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },    { "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }   ]  }

복잡하지 않다.people에는 이제 JSON 포맷 데이터가 포함되어 있다. 하지만, 많은 것을 수행하지 않는다. 데이터는 여전히 유용한 포맷으로 되어있지 않다.

데이터에 액세스 하기

위의 매우 긴 스트링은 단순한 배열일 뿐이고, JavaScript 변수에 그 배열이 있다면 쉽게 액세스 할 수 있다. 사실, 그 배열을 마침표로 구분할 수 있다. 따라서, programmers 리스트의 첫 번째 엔트리의 성(last name)에 액세스 하려면, JavaScript에서 다음과 같은 코드를 사용해야 한다.

people.programmers[0].lastName;

인덱싱은 '0' 부터 시작한다. 따라서, 이것은people변수에 있는 데이터로 시작한다. 그리고 나서,programmers라고 하는 아이템으로 이동하고, 첫 번째 레코드([0])에 액세스 한다. 마지막으로,lastName키의 값에 액세스 한다. 결과는 "McLaughlin"이라는 스트링 값이다.

다음은 같은 변수를 사용하는 예제들이다.

people.authors[1].genre   // Value is "fantasy"people.musicians[3].lastName  // Undefined. This refers to the fourth entry, and there isn't onepeople.programmers.[2].firstName // Value is "Elliotte"

이 신택스로도, 다양한 JSON 포맷 데이터로 작업할 수 있고, 추가 JavaScript 툴킷이나 API가 필요 없다.

JSON 데이터 수정하기

위에 나타난 점과 괄호 표기법을 사용하여 데이터에 액세스 하듯, 같은 방식으로 데이터를 쉽게 수정할 수 있다.

people.musicians[1].lastName = "Rachmaninov";

문자열에서 JavaScript 객체로 변환했다면 변수에 있는 데이터를 수정하면 된다.

문자열로 변환하기

물론, 모든 데이터 수정은 텍스트 포맷으로 쉽게 변환할 수 없다면 가치가 없다. 이것 역시 JavaScript에서는 간단하다.

String newJSONtext = people.toJSONString();

이것이 다이다. 원하는 곳 어디에서나 사용할 수 있는 텍스트 문자열이 생겼으니, 이것을 Ajax 애플리케이션에서 요청 스트링으로 사용할 수 있다.

훨씬 더 중요한 것은,어떤JavaScript 객체라도 JSON 텍스트로 변환할 수 있다. 원래 JSON 포맷 스트링으로 할당된 변수로만 작업할 필요가 없다.myObject라는 객체를 변형하려면, 같은 종류의 명령어를 실행하면 된다.

String myObjectInJSON = myObject.toJSONString();

이것이 JSON과 다른 데이터 포맷과의 가장 큰 차이이자, 이 시리즈를 통해 탐구할 주제이다. JSON에서는, 단순한 함수를 호출하면, 포맷팅 되어 사용하기에 알맞은 데이터를 얻을 수 있다. 다른 데이터 포맷의 경우, 미가공 데이터와 포맷 데이터간 변환은 여러분의 몫이다. Document Object Model 같이 데이터 구조를 텍스트로 변환하는 함수를 제공하는 API를 사용할 때도, 네이티브 JavaScript 객체와 신택스 보다는, API를 배우고 그 API의 객체를 알아야 한다.

여러분이 많은 JavaScript 객체들과 작업할 때, JSON은 데이터를 서버 측 프로그램으로 요청을 보내기에 알맞은 포맷으로 쉽게 변환할 수 있다.


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


결론

사용자 삽입 이미지
소셜 북마크

사용자 삽입 이미지
사용자 삽입 이미지mar.gar.in
사용자 삽입 이미지
사용자 삽입 이미지Digg
사용자 삽입 이미지
사용자 삽입 이미지del.icio.us
사용자 삽입 이미지
사용자 삽입 이미지Slashdot
사용자 삽입 이미지

본 시리즈에서는 데이터 포맷에 대한 내용을 많은 부분을 할애했다. 여러분의 비동기식 애플리케이션이 거의 비동기식이기 때문이다. 모든 종류의 데이터를 송수신 할 수 있는 다양한 툴과 기술이 있다면, 각 데이터 유형에 가장 잘 맞는 방식으로 수행하면 되고, Ajax 전문가의 반열에도 오를 것이다. 여기에 JSON을 추가하면, JavaScript에서 보다 복잡한 데이터 구조도 능숙히 다룰 준비가 된다.

다음 기술자료에서는 단순히 데이터를 보내는 것 이상으로, 서버 측 프로그램이 JSON 포맷 데이터를 수신하여 처리하는 부분을 설명할 것이다. 또한, 서버 측 프로그램이 스크립트와 서버 측 컴포넌트에 JSON 포맷으로 된 데이터를 보내는 방법도 설명할 것이다. XML, 평이한 텍스트, JSON 요청과 응답을 혼합하는 부분에 대해서도 설명할 것이다. 목표는 어떤 환경에서도 유연하게 이러한 툴들을 능숙히 조작할 수 있도록 하는 것이다.

기사의 원문보기



참고자료

교육

제품 및 기술 얻기

토론
신고
Posted by The.민군

Java 리플렉션에 대한 재고(reflection)(1)

제공 :한빛 네트워크
저자 :Russ Olsen
역자 :백기선
원문 :Reflections on Java Reflection

일상에서의 리플렉션(reflection)이란 거울 속에 비친 자신의 모습입니다. 프로그래밍 세상에서의 리플렉션은 프로그램이 자신의 모습을 보고 심지어 수정하기 까지 하는 것을 말합니다. Java reflection API는 바로 그런 기능을 언어의 기본 요소인 클래스, 필드, 메소드를 들여다 볼 수 있는 평범한 Java API를 통해 제공합니다. 리플렉션을 이해하는 것은 여러분이 자주 사용하는 툴을 이해하는데 도움이 됩니다. Eclipse가 어떻게 자동완성으로 메소드 이름을 만들어 줄까? Tomcat은 web.xml파일에 있는 클래스 이름을 가지고 웹의 요청을 처리할 서블릿을 실행하는 걸까? Spring은 어떻게 마술 같은 dependency injection을 하는 것일까? 여러분의 프로그램에서도 리플렉션을 사용하여 보다 동적이고 유연한 코드를 작성하실 수 있습니다. 리플렉션을 사용하면 이전에 본적 없는 클래스들을 매우 멋지게 처리할 수 있습니다.

클래스 만들기

이미 말했듯이 리플렉션의 기본 아이디어는 프로그램이 동작하는 내부에 집어 넣을 API를 제공하는 것입니다. Java에서 가장 기본이 되는 사상이 바로 클래스기 때문에(클래스 없이 자바 프로그램을 만들어 보세요) Class 클래스부터 살펴보는 것이 좋겠습니다. 이것의 객체는 Class 타입일 것입니다. 일단 Class객체를 가지게 되면 그것으로부터 클래스에 관련된 모든 정보를 뽑아낼 수 있습니다. 클래스의 이름, 그것이 public 인지 abstract 인지 final 인지 그리고 심지어 상위 클래스까지 말이죠.

이 정도면 이론은 충분합니다. 자, 이제 리플렉션 현미경을 가지고 아래에 있는 매우 간단한 Employee 클래스를 살펴봅시다.
package com.russolsen.reflect;public class Employee{   public String _firstName;   public String _lastName;   private int _salary;      public Employee()   {      this( "John", "Smith", 50000);   }    public Employee(String fn, String ln, int salary)   {      _firstName = fn;      _lastName = ln;      _salary = salary;   }         public int getSalary()   {      return _salary;   }      public void setSalary(int salary)   {      _salary = salary;   }      public String toString()    {      return "Employee: " + _firstName +  " "             + _lastName + " " + _salary;   }}
Class 객체를 만드는 가장 쉬운 방법은 해당 클래스 객체의 getClass 메소드를 호출하는 것입니다. 아래에 있는 코드는 Employee 객체를 만들고 그것의 Class 객체를 만들어서 클래스에 대한 다양한 정보들을 출력합니다.
package com.russolsen.reflect;import java.lang.reflect.Modifier;public class GetClassExample{   public static void main(String[] args)   {       Employee employee = new Employee();            Class klass = employee.getClass();            System.out.println( "Class name: " + klass.getName());      System.out.println(             "Class super class: " + klass.getSuperclass());            int mods = klass.getModifiers();      System.out.println(             "Class is public: " + Modifier.isPublic(mods));      System.out.println(             "Class is final: " +  Modifier.isFinal(mods));      System.out.println(             "Class is abstract: " + Modifier.isAbstract(mods));    }}
코드를 실행하면 다음과 같은 결과를 확인할 수 있습니다.
Class name: com.russolsen.reflect.EmployeeClass super class: class java.lang.ObjectClass is public: trueClass is final: falseClass is abstract: false
예제에서 보이듯이 클래스의 이름과 상위 클래스를 알아내는 것은 다른 접근 메소드들(Getters or Accessors)을 호출하는 것처럼 쉬운 일입니다. 만약 해당 클래스가 public 인지 abstract 인지 final 인지 알고 싶다면 약간 복잡해 집니다. 이 모든 정보가 getModifires에 의해 하나의 int 값으로 패키징되어 넘어오기 옵니다. 다행히 Java는 Modifier 클래스를 통해 getModifiers에서 넘어온 숫자를 가지고 여러 일을 할 수 있는 static 메소드들을 제공해 줍니다.

객체에 getClass를 호출하는 것 만이 Class 객체를 얻을 수 있는 유일한 방법은 아닙니다. 클래스 이름을 사용하여 직접 얻을 수도 있습니다.
Class klass = Employee.class;
세 번째 방법은 좀 더 흥미로운 방법입니다. 문자열을 통해서 Class 객체를 생성할 수 있습니다. 물론 그 문자열이 클래스 이름을 포함하고 있을 때 말이죠. 다음과 같이 Class 클래스에 있는 forName 을 호출하여 얻을 수 있습니다.
Class klass = Class.forName("com.russolsen.reflect.Employee");            System.out.println( "Class name: " + klass.getName());      System.out.println(             "Class super class: " + klass.getSuperclass());            // Print out the rest...
forName을 사용할 때 한 가지 주의할 것은 클래스 이름 앞에 완전한 패키지 경로를 붙여줘야 한다는 것입니다. 평범하고 늙은 “Employee” 말고 “com.russolsen.reflect.Employee" 여야만 합니다. forName을 통해 리플렉션 API의 기본적인 강력함(그리고 멋진 것)을 살펴봤습니다. 클래스 이름을 포함한 문자열로 시작할 수도 있고 class로 끝낼 수도 있습니다.

바로 인스턴스 만들기

class 객체를 가져오고 그것에 관한 정보를 찾는 것은 그것 자체로도 흥미롭고 유용합니다. 하지만 진짜 재미있는 것은 리플렉션을 사용하여 무언가를 실제 해보는 것입니다. Class 객체를 가지고 할 수 있는 가장 눈에 띄는 작업은 그 클래스의 새로운 객체를 만드는 것입니다. newInstance 메소드를 사용하여 간단하게 만들 수 있습니다. 실제 사용하는 것을 보여 주기 위하여 아래에 있는 간단한 프로그램은 커맨드 라인 인자(command line argument)로 Class 객체를 만들고 그 클래스 타입의 객체를 만드는 프로그램을 보여줍니다.
package com.russolsen.reflect;public class NewInstanceExample{   public static void main(String[] args)      throws ClassNotFoundException,      InstantiationException, IllegalAccessException   {      Class klass = Class.forName(args[0]);      Object theNewObject = klass.newInstance();      System.out.println("Just made: " + theNewObject);   }}
위 코드를 "com.russolsen.reflect.Employee" 인자와 함께 실행하면 새로운 Employee 객체를 만들게 됩니다.
Just made: Employee: John Smith 50000Run it again, but this time feed it "java.util.Date" and you will get:Just made: Tue Feb 27 20:25:20 EST 2007
간단한 코드 몇 줄로 얼마나 많은 유연성을 얻게 되었는지 생각해보세요. 위에 있는 프로그램은 실제 Employee 나 Date 클래스에 관해 아는 것이 하나도 없지만 각각의 새로운 객체들을 만들 수 있습니다. 이것이야 말로 Java 프로그래밍을 하는 또 다른 방법입니다.

인자 없는 생성자 너머에

Class.newInstance 메소드를 호출하는 것은 인자 없이 new를 사용하는 것과 동일합니다. 그러나 만약 인자가 없는 생성자 즉 default 생성자가 없는 클래스에 newInstance를 호출하면 어떻게 될까요? 좋을 일 없습니다. 별로 맘에 안 드는 InstantiationException을 받게 됩니다.

좋은 소식이 있습니다. 생성자 인자를 필요로 하는 클래스의 객체를 동적으로 만들 수 있습니다. 하지만 약간 더 힘든 작업을 해야 합니다. 그건 바로 클래스에서 해당 생성자를 찾고 적당한 인자를 사용하여 그것을 호출하는 일입니다. 적당한 생성자를 찾는 일은 여러분이 찾고자 하는 생성자에 대한 정보를 가지고 getConstrucor 메소드를 사용하면 됩니다. 그럼 Constuctor 객체를 얻게 되고 그것을 사용하여 새로운 객체를 만들 수 있습니다.
Let's see how this all works in code:      Class klass = Class.forName("com.russolsen.reflect.Employee");      Class[] paramTypes = {            String.class,             String.class,             Integer.TYPE };            Constructor cons = klass.getConstructor(paramTypes);            System.out.println( "Found the constructor: " + cons);            Object[] args = {             "Fred",             "Fintstone",             new Integer(90000) };            Object theObject = cons.newInstance(args);      System.out.println( "New object: " + theObject);
생성자들 사이의 차이점은 오직 그것들이 가지고 있는 매개 변수들입니다. 따라서 getConstructor 메소드에 찾고자 하는 생성자에 들어갈 매개변수 각각의 Class들 객체의 배열을 넘겨줍니다. 위에 있는 예제에서는 두 개의 String 그리고 하나의 int를 받는 생성자를 찾게 됩니다. Constructor 객체를 얻은 뒤 새로운 객체를 생성하는 일은 간단합니다. 실제 인자로 들어갈 객체의 배열을 newInstance 메소드를 호출하면서 넘겨주면 됩니다.

geConstructor에는 조그만 지뢰가 하나 있습니다. 파라미터의 타입으로 생성자를 식별하여 원하는 것을 찾을 때 primitive 인자와 그것의 wrapper 클래스를 잘 구별해야 합니다. 생성자가 인자로 primitive 타입인 int를 받는 것인가 아니면 그것의 삼촌 격인 java.lang.Integer 클래스의 객체를 받는 건가요? 만약 java.lang.integer 같은 wrapper 타입의 객체를 받는 생성자라면 Integer.class처럼 wrapper 클래스를 사용하면 됩니다. primitive 타입인 int를 사용하는 생성자라면 Integer.TYPE을 사용합니다. TYPE은 primitive을 위해 마련한 것입니다. 모든 wrapper 클래들은 static 타입인 TYPE 필드를 가지고 있고 이것을 사용하여 primitive 타입이라는 것을 알려줄 수 있습니다.
신고
Posted by The.민군
Flex 개발 및 공부에 도움되는 5대 Flex Explorer

 
q
1.Flex 2 Component Explorer : 플렉스 컴포넌트 종류 및 사용법
q사용자 삽입 이미지


2.Flex 2 Style Explorer
 : 플렉스 컴포넌트 CSS 및 스타일 사용법
q사용자 삽입 이미지


3.Flex 2 Effect Explorer
  : 플렉스 이펙트 사용법
사용자 삽입 이미지
q
4.Flex 2 Filter Explorerq 
: 이미지에 효과를 주기 위한 필터 사용법
사용자 삽입 이미지

5.Flex 2 Primitive Explorer: 플렉스 컴포넌트 드로잉 API 사용법
 사용자 삽입 이미지

신고
Posted by The.민군

쇼핑카트 데모보기


# view
<div style="margin-bottom:20px;height:120px;">
<% for product in @products %>
  <%= image_tag "/images/products/product#{product.id}",
        :id => "product_#{product.id}",
        :alt => product.title,
        :class => "products"  %>
  <%= draggable_element "product_#{product.id}", :revert => true %>
<% end %>
</div>

<h2>Your cart:</h2>

<div id="cart" class="cart" style="clear:left; height:132px;margin-top:10px;">
  <div id="wastebin">
    Drop items here to remove them from the cart.
  </div>
  <div id="items">
    <%= render :partial => "cart" %>
  </div>
  <div style="clear:both;"></div>
</div>

<div style="height:40px;padding-top:10px;">
<p id="indicator" style="display:none;margin-top:0px;">
  <%= image_tag "indicator.gif" %> Updating cart...
</p>
</div>

<%= drop_receiving_element "cart",
      :update => "items", :url => { :action => "add" },
      :accept => "products", :hoverclass => "cart-active",
      :loading => "Element.show('indicator')",
      :complete => "Element.hide('indicator')" %>
     
<%= drop_receiving_element "wastebin",
      :update => "items", :url => { :action => "remove" },
      :accept => "cart-items", :hoverclass => "wastebin-active",
      :before => "Element.hide(element)",
      :loading => "Element.show('indicator')",
      :complete => "Element.hide('indicator')" %>
   
# controller
class ShopController < ApplicationController
 
  def index
    session[:cart] ||= {}
    @products = Product.find(:all)
  end
 
  def add
    product_id = params[:id].split("_")[1]
   
    session[:cart][product_id] =
      session[:cart].include?(product_id) ?
      session[:cart][product_id]+1 : 1
 
    render :partial => 'cart'
  end
 
  def remove
    product_id = params[:id].split("_")[1]
   
    if session[:cart][product_id] > 1
      session[:cart][product_id] = session[:cart][product_id]-1
    else
      session[:cart].delete(product_id)
    end
   
    render :partial => 'cart'
  end
 
end


# _cart.rhtml partial
<% session[:cart].each do |product,quantity| %>
<div>
  <% quantity.times do |i| %>
    <%= image_tag "/images/products/product#{product}",
          :class => "cart-items",
          :id => "item_#{product}_#{i}",
          :style => "" %>
    <%= draggable_element "item_#{product}_#{i}", :revert => true %>
  <% end %>
  <span class="title">
    <%= Product.find(product).title + " (#{quantity})" %>
  </span>
</div>
<% end %>
<%= "Here's your shopping cart." if session[:cart].empty? %>

신고
Posted by The.민군

Ruby on Rails」입문
by Paul Adams  05 Sep 2005 (JP)


Page 1 : Ruby의 매력
--------------------------------------------------------------------------------
폴·아담스는 웹 멍키에 정착하고 있어 ,PHP나DNS에SOAP같은 약어계 기술이라면 무엇이든지 잘 하는 있고의 터무니 없고 냉정 침착한 쿨 사나이.

로즈메리의 향기나 감도는 거품 목욕탕같은 것에(이) 잠겨 느긋하게 쉬면서 , 특주의 새빨간 노트 PC로 이 튜토리얼을 읽거나 하고 있다 , 거기의 너. 혹시 , 이런 식으로 생각하지 않겠어? 「인터프리터형의 프로그램 언어는 , 이제 와서 필요없어. 「Perl」이나 「PHP」은 어떻게든 사용할 수 있고 , 「Python」이래 조금은 할 수 있다. 거기에 「UNIX」의 셸 스크립트도 있다. 이제(벌써) 충분할 것이다에. 어째서 그리고 「Ruby」이 화제가 되고 있어?」(은)는. 무엇을 숨기자 , 나도 그렇게 생각하고 있었어.

Ruby(은)는 , 일본이90연대에 낳은 최고 걸작의 하나. 무엇보다 , 미국에서 각광을 받게 된 것은 , 바로 최근의 일이지만. Ruby(은)는 , 순수한 객체 지향의 언어. 정수나 캐릭터 라인이라고 한 것에까지 고유의 메소드나 프롭퍼티가 있어 , 예를 들어print "Webmonkey".reverse하면 , 「yeknombeW」이라고 표시시킬 수가 있다. 그리고 , 실로 상쾌한 언어로 , 유연하고 직감적인 문법은 읽기 쉽고 , 게다가 쓰기 쉽다. Perl(이)나C의 경험자에게는 , 아주 쾌적할 것이다. 게다가 ,Ruby는 습득이나 활용이 간단할 뿐(만큼)이 아니고 , 그 과정이 즐거워. 독특한 입문 사이트 「Why's (Poignant) Guide to Ruby」따위를 사용하면(자) , 소설가스타니스와후·렘(Stanislaw Lem)과 화가에드워드·리어의 합작일까하고 의심해버릴 같은 , 기상 천외한 모험 이야기에 마음을 빼앗기고 있는 동안에 , 어느새인가Ruby를 습득할 수 있어버린다. 하는 김에 ,Ruby에 대한 애정까지 기르는 것까지 할 수 있어버리는 다. 웹 멍키의 편집부도 , 이 사이트의 작자에게 기사를 써 주면 어떨까?



「Ruby on Rails」입문
by Paul Adams  05 Sep 2005 (JP)


Page 2 : Rails의 매력
--------------------------------------------------------------------------------
Ruby에 주목이 모여 있는 배경에는 , 「Rails」의 존재가 있다. Rails(은)는 ,Ruby을 사용해 웹·어플리케이션을 만들기 위한 체제. Ruby(와)과Rails를 조합한 「Ruby on Rails」은 , 「베이스 캠프」(Basecamp)나 「백 팩」(Backpack)이라고 한 , 주목도의 높은 사이트에서도 사용되고 있다. 그런Rails것 매력을 봐 가자.

우선 ,Rails은 ,Ruby이라고 웹을 붙이기 위한 단순한 접착제가 아니다. 원래 ,Rails를 사용하지 않아도 ,Ruby그리고 웹 어플리케이션을 작성하는 것은 가능하다. 「아파치」(Apache)를 설정해 ,Ruby의 스크립트를CGI경유로 호출하면 된다. Rails(은)는 말하자면 , 프로그래밍을 위한 공구상자같은 것. 데이타베이스에 연동한 사이트전용으로 , 사이트의 뼈대나 잘 사용하는 기능무슨코드를 풍부하게 제공해 준다. 즉 ,Rails을 사용하면 , 데이타베이스 연동 사이트를 구축하기 전에 필요한 준비작업을 큰폭으로 단축할 수 있다. 그리고 그 뼈대에 따라 , 빈틈없이 한 , 착실한 코드를 쓰는 것이 요구되어 결과적으로 사이트 제작이 꽤 간단이 된다. 말해 보면 , 제대로 조직 선 회사에서 일하는 것 같은 것일까. 어디에 누가 있어 , 무엇을 하고 있는지 파악하기까지 다소 시간이 걸리지만 , 일단 나누어 버리면 , 나머지는 세들로 한 관리면의 문제에 하나 하나 번거롭게 해지는 것이 없다고 끓어라.

Rails(은)는 , 소프트웨어 설계 모델의1개인 「모델·뷰·콘트롤러(Model-View-Controller)」(MVC)스타일의 아키텍쳐를 채용하고 있다. MVC그럼 , 데이타베이스의 데이터나 정보를 표현한 「모델」이라고 , 유저·인터페이스의 「뷰」, 그리고 기능 논리의 「콘트롤러」의3개가 , 명확하게 나뉘고 있다. 이 아키텍쳐의 이점에 관해서는 ,여러 가지 논의가 있다. 하지만 , 확실하고 있는 것은 , 어수선하고 있어 이식이 어렵고 , 공유도 할 수 없는 것 같은 어플리케이션을 만들려고 해도 , 상당히 노력하지 않는 한 그렇게 흉내내고는 할 수 없다는 것이다.

게다가 ,Rails는 뭐니뭐니해도 간단하다. 웹상이 도달하는 곳에 , 그 증언이 발견될 것. 「Ruby on Rails은 보는 것도 처음이었는데 , 그 날 동안에 모바일용의 소셜l 네트워크 기능을 갖춘 옥션 사이트를 만들어 버렸다. 소요 시간은6시간. Ajax대응의 태스크 관리 프로그램을 만들고 있는 여가에야!」(은)는 상태다.

Rails의 메리트가 어디에 있을까는 차치하고 , 최근은 「레이르즈데이」(Rails Day)같은 이벤트도 있어 , 더욱 더 분위기를 살리고 있다. 이 이벤트는 , 개발자들이 수백명의 규모로 모여 ,24시간 내구의 웹 어플리케이션 개발을 했다. 이렇게 되면(자) , 함께 붐을 타 버리자가 아닌가!
 



Ruby on Rails」입문
by Paul Adams  05 Sep 2005 (JP)


Page 3 : Ruby and Rails의 인스톨
--------------------------------------------------------------------------------
기존의 웹 서버의 구성에Rails를 짜넣으려면,CGI나 「FastCGI」을 경유해 「아파치」(Apache)상에서Rails를 달리게 하면 좋다. 그리고 ,Rails에는 웹 서버·소프트웨어의 「WEBrick」이 부속되어 있어 , 이것도 편리하게 여긴다. WEBrick(은)는Ruby으로 기술한 것으로 , 디폴트에서는 포토3000차례 경유로 브라우저로부터 액세스 할 수 있다. 이것은 ,Ruby on Rails(길기 때문에 지금부터RoR라고 쓰기로 하자)어플리케이션을 , 개발 머신상에서 테스트하는데 편리하다.

스스로 웹 서버를 관리하고 있는 스마트한 사람은 , 우선Ruby을 , 그리고 다음에Rails를 인스톨해 주었으면 한다. 「MySQL」이나 「PostgreSQL」을 이용한 데이타베이스도 필요하게 되므로 , 잊지 마세요. MySQL의 인스톨에 대해서는 , 「PHP/MySQL튜토리얼 --레슨1」을 참고에 부디. 그리고 ,Rails환경을 정돈하기 위한 자세한 설명이 ,공식 페이지의 인스톨 안내에 써 있으니까 , 읽어 보면 좋다. 더 이상은 바랄 수 없다고 정도 친절하고 자상함 정중하게 , 플랫폼별의 설명이 실리고 있다. 자기 부담의 서버가 아니고 , 호스팅 서비스를 사용하고 있는 경우 , 렌탈 서버의 세계에서는 ,Perl이나PHP(정도)만큼Rails은 일반적이지 않아서 , 각각 개별의 대응이 필요하게 될 것이다. 서비스업자에게Rails를 인스톨 하도록(듯이) 부탁하는 것도 좋아. 스스로Rails를 인스톨 해 , 생기는 문제에 스스로 대처해 나가는 것도 좋아. 그러한 귀찮음은 차치하고 우선 소지의 「윈도우즈」(Windows)기로Rails를 만져 보고 싶다고 하는 사람에게는 , 소프트웨어 개발의 베테랑으로 , 새로운 기술에도 항상 눈을 번뜩거릴 수 있고 있는 카트·힙브스씨가철저하게 설명해 주고 있으니 참고로 해 보면 좋겠다. 처음은 부속의 웹 서버로부터 시작해 , 나중에 실제로 사용하는 아파치 서버용으로 설정 다시 해도 괜찮을 것이다.

RoR(을)를 사용한다

방법은 어떻게 저것 , 일단RoR을 시스템에 인스톨 하면(자) , 나머지는 매우 간단하다. 시험삼아 기본적인 어플리케이션을 짜기로 하자. 북마크 관리 프로그램은 어떨까? 여기에서는 촉감의 부분을 해 볼 뿐(만큼)이니까 , 실제로 풀 기능 장비의 북마크 관리 프로그램을 짜고 싶은 것 같아 는 사람은 , 나쁘지만 타처를 맞으면 좋겠다. 나가 할 수 있는 것은 낚시를 가르치는 것만으로 , 낚시한 물고기를 훌륭한 요리로 짓는 것은 자네들의 일이 된다.

스톱 시계의 준비는 좋겠어? 사이트를 시작하는데 얼마나 시간이 걸릴까 재어 보기로 하자.



「Ruby on Rails」입문
by Paul Adams  05 Sep 2005 (JP)


Page 4 : 데이타베이스의 셋업
--------------------------------------------------------------------------------
우선 ,MySQL의 데이타베이스를 만들자. 이 데이타베이스를 사용해 ,Rails가 북마크를 보존하게 된다. 그런데 ,Rails는 데이타베이스에 관해서 조금 시끄럽다. 대부분의 경우 , 테이블의 프라이머리 키가 , 컬럼명 「id」으로 자동 인크리먼트(increment) 속성의 정수치를 격납하는 필드이며 , 게다가 테이블의 이름은 복수형 , 즉 「s」으로 끝나는 이름으로 하는 (분)편이 , 적당하다. 여기에서는 , 테이블의 이름을 「bookmarks」이라고 하자. Rails그리고 , 기르고 있는 거위를 정리하고 싶다고 사람에게는 공교롭게도님. 이 테이블에는 , 북마크의 것URL과 이름 , 거기에 북마크의 내용 설명을 거두고 싶다. 그러면 ,MySQL의 커멘드 라인·인터페이스를 사용해 데이타베이스를 작성하자.

mysql> CREATE DATABASE bookmarker;

그리고 그 중에 테이블을 작성해 내용을 설정한다.

mysql> USE bookmarker;
mysql> CREATE TABLE bookmarks (
-> id SMALLINT (5) NOT NULL auto_increment,
-> url VARCHAR (255),
-> name VARCHAR (100),
-> description VARCHAR (255),
-> PRIMARY KEY (id)
-> );

물론 , 비주얼·인터페이스를 사용할 수 있는 환경을 가지고 있다면 , 마우스를 사용해 , 좀 더 근사한 방식으로MySQL를 관리해도 상관없어.
 



「Ruby on Rails」입문
by Paul Adams  05 Sep 2005 (JP)


Page 5 : 어플리케이션의 작성
--------------------------------------------------------------------------------
그러면 마술을 시작하기로 하자. 어떤Rails어플리케이션을 만든다고 해도 , 데이타베이스의 준비를 할 수 있으면(자) , 시작으로 기본으로 되는 체제를 작성하지 않으면 안 된다. 새로운 디렉토리를 만들어 거기로 이동해 , 커멘드 라인에 마법의 말을 입력하자.

rails Bookmarker

그러자(면) ,Rails이 자동적으로 「Bookmarker」이라고 하는 이름의 디렉토리를 만들어 준다. 이 안에는 , 우리들이 지금 작성 도중 의 어플리케이션을 구성하는11의 서브 디렉토리가 들어가 있다. 조금 멈춰 서 ,Rails어플리케이션안이 어떻게 되어 있을까 들여다 보기로 하자.

$ ls Bookmarker
CHANGELOG README Rakefile app/ components/ config/ db/ doc/ lib/ log/ public/ script/ test/ vendor/

디렉토리public는 , 이 어플리케이션의 겉(표)의 얼굴이다. 즉 , 어플리케이션을 구성하는 디렉토리 중(안)에서 , 웹 서버가 액세스 하는 것은 여기만으로 된다. 이 디렉토리에는 , 브라우저와 어플리케이션이 사이를 주선하는 스크립트 외에 , 화상이나JavaScript,CSS의 파일을 치우기 위한 디렉토리도 들어가 있다.

디렉토리app에는 , 어플리케이션의 본체가 되는 부분이 막히고 있다. 조금전에 설명한 , 몇개의 요소도 이 안이다. 모델이라든가 뷰라든가는 이야기는 기억하고 있어?

ls Bookmarker/app
apis/ controllers/ helpers/ models/ views/

그리고 , 여기의controllers디렉토리에는 , 작성중의 어플리케이션을 움직이는Ruby의 코드가 , 한층 더models디렉토리에는 데이타베이스의 기술이 각각 들어가 있다. 그리고 디렉토리views안에 있는 것은 , 「.rhtml」의 확장자(extension)를 가진 템플릿 파일이다. 이 템플릿 파일은 , 각각의 메소드가 출력하는HTML파일의 기술을 제어한다. 어플리케이션이 가지는 메소드1개에 대해 , 대응하는 템플릿은 각각1개다.

그리고는이라고 하면(자) , 디렉토리log에는 로그 파일이 , 그리고 디렉토리doc에는 문서가 들어간다. 디렉토리script에 들어가 있는 것은 ,Rails을 이용할 경우에 이용하는 편리한 실행 가능 스크립트로 , 디렉토리config에는 설정 정보가 들어간다. 자 조속히 , 그 설정으로 옮기자.

「config/database.yml」파일은 「YAML」형식의 파일로 ,Rails에 데이타베이스의 정보를 전하기 위한 것이다. 이 파일을 텍스트 편집 프로그램으로 열려 , 전의 페이지로 설정한 데이타베이스를 읽어들이도록(듯이) 써 바꾸자.

development:
adapter: mysql
database: bookmarker
host: localhost
username: root
password: s3cr3t

다음에Rails부속의 툴의1개를 사용해 , 어플리케이션의 교통편을 생성한다.

$ ruby ./Bookmarker/script/generate scaffold Bookmark

모델은 머리 글자가 대문자이지만 , 콘트롤러는 그렇지 않다. 그렇지만 , 이유는 (듣)묻지 않고 보내라. 자신은 머리 글자가 소문자의 , 독창적인 원조 얼터너티브 밴드 「fIREHOSE」을 지렛대로 해 , 시너지(synergy)효과를 기대할 수 있는 엔터프라이즈·솔루션을 제공하는 어플리케이션을 만든다고 사람은 , 뭐 자기책임으로 해 보았으면 좋겠다.

이것으로 콘트롤러와 모델 , 거기에 몇개의 뷰가 생겼다. 다음에 ,Rails내장의 웹 서버WEBrick를 기동해 보자. 3000차례 포토 경유로 , 방금 「완성된(, 정말로! )」사이트를 체크할 수 있다. 만약을 위해 말하지만 ,WEBrick와의 사이에 파이어 월을 두지 않게.

$ ruby ./Bookmarker/script/server

소지의 브라우저로 「http://your.host.name:3000/bookmarks」에 액세스 해 보자. 「your.host.name」의 부분은 자신의 환경에 맞추고 써 바꾸자. 그것과 「bookmarks」은 의 가콘트롤러의 이름이니까. 그런데 그런데 그렇다면 , 어머 불가사의! 북마크 관리 프로그램이 움직이고 있는이 아닌가. 단1행 박은 것만으로 짜서 이루어진 교통편이었지만 , 벌써 북마크를 작성하거나 삭제 , 편집하는 기능이 갖춰지고 있다. 네 , 여기서 스톱 시계를 멈추자! 간단하다고 이야기를 납득할 수 있었는지? 그리고는 이것을 커스터마이즈 할 뿐이다.




「Ruby on Rails」입문
by Paul Adams  05 Sep 2005 (JP)


Page 6 : 어플리케이션의 커스터마이즈
--------------------------------------------------------------------------------
작성한 어플리케이션에는 북마크의 작성 , 편집 , 삭제등이라고 하는 기능이 갖춰지고 있어 , 그 기능은 모두 ,Ruby의 메소드로서app/controllers/bookmarks_controller.rb로 정의하고 있다. 결과는 ,models디렉토리에 있는.rhtml의 확장자(extension)를 가진 템플릿에 따라 표시한다. 이러한 파일을 커스터마이즈 해 나가면 , 표시 , 편집 , 삭제라고 하는 기본적인 기능 밖에 가지지 않는 데이타베이스의 프론트엔드를 , 태스크 관리 프로그램의 「Ta-da List」같은 것으로 해 갈 수가 있다. 이것이야말로 ,Rails어플리케이션 개발의 핵심이라고 해도 괜찮을 것이다. 여기에서는 우선 , 클릭하면(자) 대상URL으로 점프 하는 링크를 , 각 북마크에 추가하기로 하자. 그러기 위해서는 ,views디렉토리중에서list.rhtml를 찾아내 , 이것으로 변경을 더한다.

Ruby의.rhtml템플릿은 , 「매입형Ruby」으로 써 있다. 즉 ,<%=태그나<%태그를 사용해 ,Ruby의 코드를HTML문서에 묻고 있어. Ruby의 출력을 브라우저에 표시하는 경우에는<%=태그를 사용해 ,Ruby의 메소드를 실행하는 것만으로 굳이 표시하고 싶지 않은 경우에는<%태그를 사용한다. 거기서list.rhtml를 보면(자) , 다음과 같이 되어 있다.

<td><%= link_to 'Show', :action => 'show', :id => bookmark %></td>
<td><%= link_to 'Edit', :action => 'edit', :id => bookmark %></td>

상기의 코드는 , 데이타베이스의 테이블에 거둘 수 있었던 북마크 마다 실행한다. 그 때 ,Ruby의 「link_to」메소드를 사용해 , 각 북마크에 대해 ,show메소드와edit메소드를 호출하는 링크 태그를2개 생성한다. 북마크 대상의 페이지에 점프 하는 링크도 , 각각의 북마크 마다 표시하도록 , 여기에 코드를 추가하자.

<td><%= link_to 'Open', bookmark["url"] %></td>

이만큼으로 , 북마크의 각URL치를 타겟으로 한 링크를 만들어 준다. 텍스트 표시는 「Open」이 된다.

이번에 이 튜토리얼은 최종회이지만 , 안녕 하기 전에 좀 더 복잡한 예도 봐 두자. 북마크 관리 프로그램은 , 유저 자신이URL를 입력하게 되어 있다. 그러니까 , 링크로서 처리하기 전에는 ,URL이 「http://」으로 시작되어 있을까 정도의 체크가 , 적어도 필요하다. Rails(은)는 많이 있는 편리 기능의1개로서URL를 체크하는 구조를 갖추고 있다. models/bookmark.rb위에서 , 클래스 정의에 다음의 메소드 호출을 추가해 보면 좋겠다.

validates_format_of :url, :with => /^http\:\/\//, :message => "needs to begin with 'http'."

이렇게 해 두면 , 북마크 작성시에 , 메소드가 정규 표현과 대조해URL의 표기를 체크해 준다. URL하지만 「http://」으로 시작되지 않은 경우에는 , 약간의 에러 메세지를 표시한다. 「validates_format_of」메소드에 관해서는 ,Rails의 사이트에설명이 있는으로부터 참고에 부디.

이제 슬슬 마감 시간이 될 것 같다. 그리고는 , 각자 이 어플리케이션을 자꾸자꾸 닦아 가면 좋다. 거의 독학으로 완성되기 때문에 ,Ruby에 대한 공부도 계속하기를 원하는데. public/stylesheets/scaffold.css에 스타일 시트를 추가하는 것도 좋아 , 콘트롤러에 새로운 기능을 추가하는 것도 좋아. 데이타베이스·모델을 개량하거나Ajax의 북마크 렛을 채용하거나라고 기분이 향하는 대로 여러가지 해 나가면 좋지 않을까.

마지막 통계. Rails에는 , 기능을 기념하여 송신 버튼에 자동적으로 이름을 날리거나 하는 돌보기가 좋음이 있다. 한편의 것Ruby은 , 기분에 필요없는 메소드는 무엇으로 저것 고쳐 써 가능하다고 말하는 유연성을 가지고 있다. 이2개는 완전 무적의 콤비다. 거기에Ruby는 처리가 직관적이니까 , 어플리케이션의 교통편이 되는 기초의 작성 단계로부터 완성까지 , 즐기면서 단시간에 할 수 있다. 만약Rails을 , 프로젝트의 방식에 이치이치 트집을 잡는 난폭한 형도 생각하고 있다면 , 그것은 아마 ,Rails라고 너의 양쪽 모두가 , 좀 더 어른이 되지 않으면이라는 것(일)이 아닐까.


 


http://j2k.naver.com/j2k_frame.php/korean/hotwired.goo.ne.jp/webmonkey/2005/36/index4a_page6.html

신고
Posted by The.민군

1. RoR ActiveRecord

 

ActiveRecord는 , RoR에 대해 데이터 모델을 담당하는 O/R 매핑 체제입니다.

Martin Fowler가 소개한 O/R매핑 패턴에 유래합니다.

이 패턴은 아래와 같은 특징을 가지고 있습니다.

 

  • 1개의 테이블의 , 그것을 표현하는 1개의 오브젝트에 대응합니다.

  • 오브젝트가,  데이타베이스 접속 논리, 도메인 논리를 가진다


     
    RoR에 있어서 ActiveRecord는 Model 특징에 다양한 기능을 더하는 것으로, 현재의 어플리케이션 개발에
    참으로 좋은 면을 보여주고 있습니다.
    예를 들면 다음과 같은 기능입니다.
     
     
  • 테이블의 관련을 객체의 관련으로 표현

  • Compositon으로 구성된 클래스나, 상속 관계가 있는 클래스군을 1 개의 테이블에 매핑

  • 어느 레코드가 다른 레코드를 부모로서 가지는 테이블을, 오브젝트 트리에 매핑

  • 레코드 작성·갱신시의 값이나 참조 제약에 대한 선언적인 Validation
    사용자 삽입 이미지
     
     
     

    위의 데이터 모델을 ActiveRecord Class로 나타내었을 경우, 아래와 같이 됩니다.



    사용자 삽입 이미지
     
     

    위의 코드에선 몇가지 생각해야 될 RoR의 철학이 있습니다.

    복수를 나타내는 테이블의 한 Row,를 Model Class로 매핑합니다. 즉.

    비휘발성 데이타를 복수문자로 취급하고 휘발성 데이타를 단수문자로 취급하고 있지요.

    예를 들어서 Customer라는 클래스는 Order라는 객체와 1 대 N의 관계니 Customer의 relation에는

    has_many : orders 라는 order의 여러개수를 포함한 문자열 철학을 찾을 수 있습니다.

    또한 그러한 테이블과 매핑되는 단어에 "_id"를 붙여 자동으로 프라이머리 키가됩니다.

     

    N 대 N의 관계에서는 Item과 Service에 각각 "has_and_belongs_to_many : 다대다관계의 테이블이름" 의 relation관계를 설정해야합니다.

     

    이 때 , 주의 해야 할 부분이 N 대 N 의 관계입니다. 보통 N 대 N의 관계에서는 중간 Dependency논리를 두게 마련인데

    위의 설정에서는 그냥 N쪽에 N쪽의 복수문자열을 취하는 것을 볼 수가 있습니다.

    이는 RoR에서 자동으로 연결지어 주는 ActiveRecord의 기능때문인데요.

    위의 코드에서는 보이지 않는 테이블 "Items_Services"가 자동 생성되고 PrimaryKey는 복수의 order_id, service_id를 가지게 됩니다.

     

    참으로 DRY원칙에 충실하다라고 생각 하지 않으신가요?


    기존에 항상 접했던 일이지만 데이터를 DAO, 혹은 Handler로 조작을 하여 Model Pojo에 연관관리 하는구조에서 위의 ActiveRecord의 철학을 생각하니 왠지 흡족 스럽고 상큼합니다.

  • 신고
    Posted by The.민군

    script폴더안에는 레일즈 어플리케이션의 매니저,핼퍼,제너레이터 관련 파일들이 들어있다.



    사용자 삽입 이미지

    각 세부파일의 대해서 살펴보자.


    1. about파일

        레일즈 어플리케이션의 환경을 모니터 할 수 있다.

    C:\Documents and Settings\paradozz\myrapp>ruby script/about
    About your application's environment
    Ruby version                 1.8.5 (i386-mswin32)
    RubyGems version             0.9.0
    Rails version                1.1.6
    Active Record version        1.14.4
    Action Pack version          1.12.5
    Action Web Service version   1.1.6
    Action Mailer version        1.2.5
    Active Support version       1.3.1
    Application root             C:/Documents and Settings/paradozz/myrapp
    Environment                  development
    Database adapter             mysql


    2. breakpointer

       Simple Debugging을 할 수 있는 파일 - Java Bin Derectory의 jdb.exe와 같은 기능.

       rb파일에 breakpointer 구문을 넣고 이 명령을 실행하면 구문이 찍힌 코드에 디버깅을 시작할 수     있다.   자세한 설명은 레일즈 어플리케이션 구축시


    3. console

       rails session에서 작업할 수 있는 콘솔모드 .이곳에서 작성된 class나 function들은

       현재의 캐쉬에 저장되고 보여준다.

    C:\Documents and Settings\paradozz\myrapp>ruby script/console
    Loading development environment.
    >> def say_msg(name)
    >> return "Hello #{name}"
    >> end
    => nil
    >> say_msg("paradozz")
    => "Hello paradozz"
    >>


    4. destroy
        아래의 generate된 레일즈 모듈을 삭제한다.


    5. generate(파워풀)

        rails의 강점이자 다른 웹프레임워크에 없는 유일한 독자적 기능이라고 할 수 있다.

         재사용가능한 models,controllers, views, mailler,webservices를 generate한다.

        ( generate ) 사용명령어 다음 포스트로


    6. plugin

       레일즈에서 사용가능한 plugin설치와 plugin import명령어가 모니터된다.

       

    C:\Documents and Settings\paradozz\myrapp>ruby script/plugin

    Unknown command:

    Usage: plugin [OPTIONS] command

    Rails plugin manager.

    ...........생략.....................

     

    7.process

       cgi메시지를 on off 하는기능


    8. runner,server 한번씩 실행해보자 어떤 결과가 나올까?




    script의 중요한 파일 구조에 대해서 설명을 했다.


    위의 파일구조중 레일즈의 가장 빛나는 파일은 . generate파일이다.

    다음 포스트에서 generate의 파워풀한 사용법에 대해서 알아보겠다.


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

    ----------------- 하! 면! 된! 다!--------------------------------------------

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

    신고
    Posted by The.민군

    ruby on rails의generate command


    레일즈의 강력한 웹 어플리케이션 자동화 빌드 툴이다.

    레일즈프레임웍 위키나 블로그에서 항상 볼 수 있는 홍보용(?) 문구는

     

    "다른 언어보다 10배 빠른 생산력"이다.


    이미 레일즈로 구축을 해보신 분은 이런 문구가 절대로거짓말이 아니란것을느꼈을 것이다.

     

     

    그럼 generate 명령의 옵션과 도움말을 보자.

     

    명령 > ruby script/generate

     

    >ruby script/generate

    Usage: script/generate generator [options] [args]

    General Options:                  
        -p, --pretend                    Run but do not make any changes.
        -f, --force                      Overwrite files that already exist.
        -s, --skip                       Skip files that already exist.
        -q, --quiet                      Suppress normal output.
        -t, --backtrace                  Debugging: show backtrace on errors.
        -h, --help                       Show this help message.
        -c, --svn                        Modify files with subversion. (Note: svn must be in path)

     

    Installed Generators

      Builtin: controller, integration_test, mailer, migration, model, plugin, scaffold, session_migration, web_service

     

    More are available at http://rubyonrails.org/show/Generators
      1. Download, for example, login_generator.zip
      2. Unzip to directory C:\Documents and Settings\paradozz/.rails/generators/login
         to use the generator with all your Rails apps
         or to C:/Documents and Settings/paradozz/myrapp/generators/login
         to use with this app only.
      3. Run generate with no arguments for usage information
           script/generate login

     

    Generator gems are also available:
      1. gem search -r generator
      2. gem install login_generator
      3. script/generate login

     

    여러가지 generate관련된 도움말을 볼 수 있다.

     

    generate 명령 형식 > ruby script/generate generator [options] [ args]

     

     

     

     

     

    참고>

    명령창에

    > gem search -r generator

    를 실행하면 웹상에서 generators를 찾게된다.

    나열된 generotors에서 하나를 선택해(login_generator)인스톨을 하자.

    인스톨 방법은  gem install login_generator 다.

    인스톨이 되었으면 자신의 Application에 generate해야 한다.


    > script/generate login LoginName [options]


    위의 명령을 이해 할 수 없으면 그냥 넘어가자

    너무 성급한것도 죄다.

     

     

     

    신고
    Posted by The.민군

    레일즈의 scafflod는 model layer의 제너레이션을 교모히 다루는 툴이다.


    황당하다 라고 말할 수 밖에 없는..

    사용자 삽입 이미지
    DB Table에Products라는 테이블을 만들고

    ruby script/generate scaffold Product라는 명령을 실행하면 레일즈 프레임워크는

    Config의 database.yml을 참조하여 자동으로 Products라는 테이블을 찾아서

    ActiveRecord::Base 라는 클래스를 상속받는  Product 모델클래스를 만들게 된다.

    이것이 모델클래스다.

    아래와 같이

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

    classProduct < ActiveRecord::Base

    end

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

    라는 model Class로 Controller와 DB간의 매핑을 자동으로 해준다.

    이와같이 빈 클래스라도 그 기능은 막강하다.

     

    model class가 Product면 영문법상 복수의 단어에 매핑되는 테이블을 찾는다.

    Products라는 테이블을 찾아서 각 필드를 ActiveRecord에 넣고 자동으로 변수와 메소드를 만든다.

    그래서 Product클래스는 아무코드도 보이지 않는다.

    (코드가 필요하다면 코딩을 해야겠지만.).. ....이것이 어떻게 가능한가?

     

    java나 C# OOP언어와 같이 static한 언어에서는 이와 같은 자동화 알고리즘은 절대로

    흉내낼 수 없는 장점이다. 이것과 비스무리하게 동적으로 바이너리코드를 메모리에 올리는

    Reflect와 Instropection이 있지만 이것도 개발자가 원본코드를 만들어야 한다.

    하지만 레일즈는 개발자의 관여없이 자동으로 코드를 만들어 붙여버린다.

     

    -- 동적언어이기때문에 가능한 일이다.

     

     

    1.  scaffold명령 수행 순서

    사용자 삽입 이미지


    그림1


    정말 웃기지 않은가? 이것은 Ruby제작자의 말에 따르면
    "Ruby이기 때문에 가능한 일이지"
    라고 한다.
     
    내심 문자열 파싱이나 메타문자 프로그래밍위주의 개발자들에게 항상 찬사를 보내왔지만
     
    이와 같이"논리적 단어 개념"까지 까지 레일즈가 파싱을 하다니..
     
    (아니.정확하게 말하자면 레일즈가 아니가 루비다.)
    복수형을 단수형으로 바꾸는 이유는 설명하지 않도록 하겠다.
     
     
     
    앞으로 10배의 생산력의 놀라움은 아직도 많은 것인가?

     
    신고
    Posted by The.민군