paperSelector.find("option:not(:selected)").each(function(){
$(this).attr("disabled",true);
});
// 선택안된 셀렉트 옵션 잠그기
if(advStudent.filter(':checked').val()==1){ //학생이면
tr_std.html(tr_std_html).fadeIn(150).css("background-color","#fffff");
}else{ // 학생이 아니면
tr_dis_reg.html(tr_dis_reg_html).fadeIn(150).css("background-color","#ffffff");
}
// 라디오 박스 체크된값 가져오기,
2015년 10월 29일 목요일
2015년 10월 27일 화요일
button줄바꿈
<input type="button" value="Really
Tall
 Button">
// this is not work on IE etc...
<input style="width:100px;white-space: normal;" type="button"
value="kkkkkk kkkkkkk kkkkkkkkk">
// it works perfectly.
// but it could not works that i want
<button style="width:250px;">Online Registration<br>(For International Participants</button>
// finally ... not bad.
// 하지만 overflow 시에는 직접 잘라줘야함.
// this is not work on IE etc...
<input style="width:100px;white-space: normal;" type="button"
value="kkkkkk kkkkkkk kkkkkkkkk">
// it works perfectly.
// but it could not works that i want
<button style="width:250px;">Online Registration<br>(For International Participants</button>
// finally ... not bad.
// 하지만 overflow 시에는 직접 잘라줘야함.
2015년 10월 18일 일요일
사용자이벤트
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
Type
// 이벤트 핸들러 생성
TMy1stEvent = procedure(PrvValue, CurValue: integer) of object;
// 값 변경 감시 클래스 정의 [사용자 이벤트 정의]
TWatchChangeValue = class
private
FOnChangeVal : TMy1stEvent;
public
procedure ChangeValue(PrvValue, CurValue: integer);
published
property OnChangeValue : TMy1stEvent read FOnChangeVal write FOnChangeVal;
end;
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
// 값 변경 감시 클래스 선언
WatchChangeValue : TWatchChangeValue;
// 이벤트 발생시 호출하는 함수 선언
procedure ChangeValue2(PrvValue, CurValue: integer);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
// 이벤트를 발생시키는 트리거 함수
WatchChangeValue.ChangeValue(edit1.Tag, StrToInt(edit1.Text));
if edit1.Tag <> StrToInt(edit1.Text) then
edit1.Tag := StrToInt(edit1.Text);
end;
// 이벤트 발생시 호출하는 함수
procedure TForm1.ChangeValue2(PrvValue, CurValue: integer);
begin
// 변경전 값과 변경후 값 표시
self.Caption := IntToStr(PrvValue) + '>>>' + IntToStr(CurValue)
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
// 이벤트 등록
WatchChangeValue := TWatchChangeValue.Create();
// 값 변경 이벤트가 발생되었을 때 호출할 함수 설정
WatchChangeValue.OnChangeValue := ChangeValue2;
end;
{ TWatchChangeValue }
// 이벤트 호출
procedure TWatchChangeValue.ChangeValue(PrvValue, CurValue: integer);
begin
if Assigned(OnChangeValue) then OnChangeValue(PrvValue, CurValue);
end;
end.
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
Type
// 이벤트 핸들러 생성
TMy1stEvent = procedure(PrvValue, CurValue: integer) of object;
// 값 변경 감시 클래스 정의 [사용자 이벤트 정의]
TWatchChangeValue = class
private
FOnChangeVal : TMy1stEvent;
public
procedure ChangeValue(PrvValue, CurValue: integer);
published
property OnChangeValue : TMy1stEvent read FOnChangeVal write FOnChangeVal;
end;
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
// 값 변경 감시 클래스 선언
WatchChangeValue : TWatchChangeValue;
// 이벤트 발생시 호출하는 함수 선언
procedure ChangeValue2(PrvValue, CurValue: integer);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
// 이벤트를 발생시키는 트리거 함수
WatchChangeValue.ChangeValue(edit1.Tag, StrToInt(edit1.Text));
if edit1.Tag <> StrToInt(edit1.Text) then
edit1.Tag := StrToInt(edit1.Text);
end;
// 이벤트 발생시 호출하는 함수
procedure TForm1.ChangeValue2(PrvValue, CurValue: integer);
begin
// 변경전 값과 변경후 값 표시
self.Caption := IntToStr(PrvValue) + '>>>' + IntToStr(CurValue)
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
// 이벤트 등록
WatchChangeValue := TWatchChangeValue.Create();
// 값 변경 이벤트가 발생되었을 때 호출할 함수 설정
WatchChangeValue.OnChangeValue := ChangeValue2;
end;
{ TWatchChangeValue }
// 이벤트 호출
procedure TWatchChangeValue.ChangeValue(PrvValue, CurValue: integer);
begin
if Assigned(OnChangeValue) then OnChangeValue(PrvValue, CurValue);
end;
end.
// 출처 Posted by 떡잎 http://wwwi.tistory.com/280
2015년 8월 28일 금요일
이미정의되어있습니다
error LNK2005: xxx already defined in MSVCRT.lib(MSVCR100.dll)
c/C++ > Code Generation > Runtime Library to Multi-threaded library (DLL) /MD
or Other
2015년 8월 26일 수요일
%출력형식
%c 문자
%C %c
%s 문자열
%p 포인터값 16진수
%d 10진수 부호있는 정수
%i %d
%u 10진수 부호없는 정수
%f 부동소수점 실수 소수 표현 무한수를 표현할 때 소문자 표현
%F %f 무한수를 표현할 때 대문자 표현
%e 부동소수점 실수 지수 표현
%E %e e 대신 E 로 출력
%g 크기가 작으면 %f, 크기가 크면 %e
%G 크기가 작으면 %f, 크기가 크면 %E
%x 16진수 정수 소문자 0 ~ 9,a,b,c,d,e,f
%X 16진수 정수 대문자 0 ~ 9,A,B,C,D,E,F
%o 8진수 정수
%n Print nothing, but write number of characters successfully written so far into an integer pointer parameter.
%% % 출력
%C %c
%s 문자열
%p 포인터값 16진수
%d 10진수 부호있는 정수
%i %d
%u 10진수 부호없는 정수
%f 부동소수점 실수 소수 표현 무한수를 표현할 때 소문자 표현
%F %f 무한수를 표현할 때 대문자 표현
%e 부동소수점 실수 지수 표현
%E %e e 대신 E 로 출력
%g 크기가 작으면 %f, 크기가 크면 %e
%G 크기가 작으면 %f, 크기가 크면 %E
%x 16진수 정수 소문자 0 ~ 9,a,b,c,d,e,f
%X 16진수 정수 대문자 0 ~ 9,A,B,C,D,E,F
%o 8진수 정수
%n Print nothing, but write number of characters successfully written so far into an integer pointer parameter.
%% % 출력
2015년 8월 19일 수요일
javascript-delay
setTimeout( function, mile second );
ex) setTimeout("helloworld()", 1000); // 1000 mile second == 1 second
일정시간 딜레이만 주려면 아래와 같은 함수를 만들어 사용하면 된다.
function delay(gap){ /* gap is in millisecs */
var then,now;
then=new Date().getTime();
now=then;
while((now-then)<gap){
now=new Date().getTime(); // 현재시간을 읽어 함수를 불러들인 시간과의 차를 이용하여 처리
}
}
ex) setTimeout("helloworld()", 1000); // 1000 mile second == 1 second
일정시간 딜레이만 주려면 아래와 같은 함수를 만들어 사용하면 된다.
function delay(gap){ /* gap is in millisecs */
var then,now;
then=new Date().getTime();
now=then;
while((now-then)<gap){
now=new Date().getTime(); // 현재시간을 읽어 함수를 불러들인 시간과의 차를 이용하여 처리
}
}
2015년 8월 11일 화요일
jquery-required
$("form").submit(function(e) {
var ref = $(this).find("[required]");
$(ref).each(function(){
if ( $(this).val() == '' )
{
alert("Required field should not be blank.");
$(this).focus();
e.preventDefault();
return false;
}
}); return true;
});
var ref = $(this).find("[required]");
$(ref).each(function(){
if ( $(this).val() == '' )
{
alert("Required field should not be blank.");
$(this).focus();
e.preventDefault();
return false;
}
}); return true;
});
2015년 8월 9일 일요일
JSP페이지이동
1)스크립트 이용
<% if (디비결과값) { %>
<script>location.href = "login.jsp"; </script>
<% } else { %>
<script>alert('정보없음'); window.history.back(); </script>
<% } %>
-----------------------------------------------------------------
2)response.sendRedirect
<% if (a == null) {
response.sendRedirect("admin.jsp");
} else {
response.sendRedirect("login.jsp");
}
%>
------------------------------------------------------------------
3)forward
<% if (a == null) { %>
<jsp:forward page="admin.jsp"/>
<% } else { %>
<jsp:forward page="login.jsp"/>
<% } %>
------------------------------------------------------------------
4)meta 태그 이용
<META http-equiv=refresh content="0;url=admin.jsp">
<% if (디비결과값) { %>
<script>location.href = "login.jsp"; </script>
<% } else { %>
<script>alert('정보없음'); window.history.back(); </script>
<% } %>
-----------------------------------------------------------------
2)response.sendRedirect
<% if (a == null) {
response.sendRedirect("admin.jsp");
} else {
response.sendRedirect("login.jsp");
}
%>
------------------------------------------------------------------
3)forward
<% if (a == null) { %>
<jsp:forward page="admin.jsp"/>
<% } else { %>
<jsp:forward page="login.jsp"/>
<% } %>
------------------------------------------------------------------
4)meta 태그 이용
<META http-equiv=refresh content="0;url=admin.jsp">
2015년 7월 14일 화요일
일반단축키
▷ Ctrl + Shift + Esc
- 작업관리자 실행
- 프로그램 오류로 인해 강제 종료가 필요할때 아마 가장 많이 여는 창이 아닐까 한다. 원래 Ctrl + Alt + Delete 를 이용해 여는것이 일반화
되어 있지만 윈7부터는 한손으로 아래의 단축키를 눌러 열 수 있다
▷ 윈도우키 + D
- 바탕화면 바로가기
▷ 윈도우키 + E
- 내컴퓨터 바로열기
▷ 윈도우키 + L
- 컴퓨터 로그 오프
▷ 윈도우키 + R
- 실행창 열기 (CMD 등을 실행 하기 위해 필요한것)
▷ 윈도우키 + U
- 제어판 실행
▷ 윈도우키 + P
- 듀얼모니터 설정
인터넷 익스플로러
▷ 윈도우키 + 방향키 (← or → )
- 창의 크기가 화면의 반으로 딱 나눠진다. 두개 이상의 인터넷 창을 이용할대 편리
▷ 윈도우키 + 방향키 (↑ or ↓)
- 창의 크기를 전체 화면으로 만들거나, 전체화면을 최소화 시킬 수 있다.
▷ Ctrl + T
- 새탭을 열어준다
▷ Ctrl + W
- 활성화 된 탭 만 닫아준다.
▷ Ctrl + N
- 새로운 익스플로러 창을 실행시켜준다.
▷ Ctrl + Shift + T
- 이전에 종료했던 웹 사이트를 불러온다. 실수로 종료했을때 유용한 단축키
델파이단축키
Delphi 단축키
Delphi 레퍼런스 / 2010/04/07 09:48
#1
< 델파이 단축키 모음 >
[찾기]
Ctrl + F Find
Ctrl + R Find and Replace
F3 Search Again
[화면이동]
F11 View Object Inspector
F12 Toggle Form/Unit
Alt + 0 View Window List
Ctrl + F12 View Unit
Shift + F12 View Form
Ctrl + PgUp/PgDown CodeEditor에서 현재페이지의 첫줄(PgUp), 마지막줄(PgDown)로 이동
[컴파일/실행]
Ctrl + F9 Compile
F9 Run
F7 Trace Into
F8 Trace Over
F5 Set Breakpoint
Ctrl + F5 Add Watch
Ctrl + F7 Evaluate/Modify
[블록관련]
Ctrl + Shift + U Unindent
Ctrl + Shift + I Indent
Ctrl + O, C Column Block Mode (또는 Alt키를 누른상태에서 Mouse를 드래그 해
도 컬럼블럭 설정이 가능, Shift + Alt + Arrow Key 를 사용해도 컬
럼블럭 설정)
Ctrl + O, K Line Block Mode
[키 매크로]
Ctrl + Shift + R Record
* 키매크로 작성순서 : -> <원하는키> ->
Ctrl + Shift + P Play
[Object Inpector]
Ctrl + Down Object Inpector 상단의 Object List ComboBox 열기
이 상태에서 Component Name을 키보드로 치면 Incremental Search 기
능Tab Property 와 Property Value 부분을 전환가능하며,
Property 쪽에 Cursor 가 위치한 상태에서 키보드를 치면
Incremental Search
[Code Insight]
Ctrl + Space Code Completion 기능
Ctrl + J Code Template 기능
Ctrl + Shift + Up/Down Object 의 Member function/procedure 의 선언부와 구현부를
이동
Ctrl + Shift + C Object 의 Member function/procedure 의 선언부와 구현부중
의 한가지를 코딩 한후 누르게 되면 나머지 선언부 또는 구
현부를 완성시켜줌
[기타]
Alt + F10 현재 위치에서 Popup-Menu 띄우기
Ctrl + Enter Code Editor 에서 현재위치의 단어로 File Open을 시도(기본 확장자
는 .pas) 하고 현재 Path 에서 그 파일을 찾지 못하면 File Open
Dialog를 띄움.
Alt + { or } Find Matching Brace( ‘(‘, ‘)’, ‘{‘, ‘}’, ‘[‘, ‘]’ )
#2
에디터에서 Ctrl + E 를 하면 increment Search 가 됩니다. Ctrl+E 를 눌루고 문자열을 입력해 보세요
Ctrl+L 을 해도 다시 찾기 또는 다시 바꾸기를 할수 있습니다.
Alt+F11 은 유닛을 Uses 할때 사용하면 됩니다.
Ctrl+K+W 를 하면 선택한 블럭을 저장할수 있습니다.
Ctrl+K+R 을 하면 캐럿위치에 파일을 읽어서 붙일수 있습니다.
Ctrl+Alt+B 를 하면 현재 프로젝트에 설정된 BreakPoint 를 편집할수 있구 그 라인으로 이동할수 있습니다.
#3
다시찾기 단축키.
ctrl+f로 찾은후, F3을 누르면 다시 찾기가 됩니다.
토큰으로 찾기 단축키
커서가 토큰에 위치시키고는 ctrl + alt + 화살표 위로 또는
아래로 하면 커서위치의 토큰과 가장 가까이에 있는 토큰을 찾아갑니다.
ctrl + 마우스 왼쪽 클릭 단축키
ctrl + 화살표 위
메소드 선언부바로가기
메소드선언부에서 ctrl+shift+화살표아래
메소드 구현부바로가기
메소드구현부에서 ctrl+shift+화살표위
GExperts의 클립보드 히스토리 사용.
Gexperts를 설치하셨다면 클립보드 히스토리가 있습니다. 델파이 에디터 편집기에서 사용한 복사내용 역사(?)가 등록됩니다.
GExperts의 IDE 메뉴 shortcut사용
델파이의 메뉴에 단축키를 설정하실 수 있습니다. 꽤나 유용합니다.
View-얼라이먼트 팔레트같은것을 shift+alt+p로 선언해 두시면 편할듯싶네요
GExperts의 Code Proofreader
철자수정 기능을 갖추고 있습니다.
특히 Dictionary탭의
Enable dictionary replament와
Enable compiler replament 체크를 하시게 되면
코딩이 수월해지며, Form또는 unit Edit1등이 짜증나게 됩니다.
컬럼블럭 선택 해제
선택: shift + alt + 화살표키하시면 컬럼열을 복사하실 수 있습니다.
해제: 그냥 편집창에서 마우스를 클릭하시면 해제됩니다.
또는 Ctrl+O+K를 하시면 해제됩니다.(이건 많은 분들이 모르시고 있더군요)
컴포넌트 이름은 알고 어떤 팔레트에 있는지 모를때
Alt + V + C를 하시고 컴포넌트 이름을 입력하셔서 찾으시면 됩니다.
델파이환경에서 unit을 제거했는데 dcu를 찾지 못할때..
델파이는 보통 컴파일시 변경된 파일만 체크하기 때문에 이런 문제가 나타날 수 있습니다.
그때는 Alt + P + B를 하시면 모두 빌드해서 에러를 잡으세요.
Project Group에서 여러 프로젝트를 한번에 빌드하기.
하나하나씩 컴파일 하지 마시고, Alt + P + E를 하시면 프로젝트 그룹내의 모든 프로젝트를 빌드하게 됩니다.
제가 애용하는 델파이의 기능이었으며, 이미 알고 있다고 가정한 것들은 제외했습니다.
(델6버전임.)
#4
폼 디자이너
Ctrl + 방향키(←↑→↓) : 컴포넌트 위치 이동
Shift + Ctrl + 방향키(←↑→↓) : 컴포넌트 위치 이동(빠르게)
Shift + 방향키(←↑→↓) : 컴포넌트 크기 변경
선택 후 ESC : Parent컴포넌트로 이동
오브젝트 인스펙터
Ctrl + ↓ : 컴포넌트 선택기 팝업
(팝업 후 알파벳 문자 입력하여 해당 컴포넌트로 이동 가능)
Alt + ↓ : Property Combo 선택기 팝업
(팝업 후 알파벳 문자 입력하여 해당 컴포넌트로 이동 가능)
Ctrl + Enter : 열거형 Property값을 다음 값으로 변경
+선택 후, ←,→ : 하위 Property펼치기,접기
Ctrl + Tab : Properties,Events탭 전환
..선택 + Ctrl + Enter : Property Editor 열기
Tab : Property Name/Value토글
소스코드 에디터
Ctrl + Enter : 현재위치의 단어로 File Open 시도
현재 Path 에서 찾지 못하면 Dialog
Ctrl + S : 파일 저장
Ctrl + F4 : 파일 닫기
Ctrl + Shift + C : Method/Procedure/Property자동생성
Ctrl + Shift + ↑(↓) : 선언부,구현부 상호간 이동
Ctrl + Shift + R : 키 매크로 레코딩
Ctrl + Shift + P : 키 매크로 실행
Ctrl + ←,→ : 이전 단어, 다음 단어
Ctrl + Shift + ←,→ : 이전 단어, 다음 단어까지 블럭
Ctrl + Home : 소스코드 맨 앞으로 이동
Ctrl + End : 소스코드 맨 뒤로 이동
Shift + Home : 현재 라인 맨 앞까지 블럭
Shift + End : 현재 라인 맨 뒤까지 블럭
Ctrl + PageUp : 현재 화면의 맨 윗줄로 이동
Ctrl + PageDown : 현재 화면의 맨 아랫줄로 이동
Ctrl + Shift + I(U) : 현재 라인에 들여쓰기(내어쓰기)
Shift + Alt + 방향키(←↑→↓) : 블록 사각형 지정 -> Ctrl + Backspace : 해제
Ctrl + KL : 캐럿이 Line Home에 있을 때, Line 블럭
Ctrl + T : 현재 위치에서 마지막 단어까지 삭제
Ctrl + I : 블럭 지정된 문자를 공백으로 변환
Alt + {, } : '{'괄호 앞,뒤에서 사용. 짝 찾기.
Ctrl + N : 다음 Line 맨 앞으로 줄바꿈
Ctrl + M : 줄바꿈
Alt + BackSpace : 실행 취소
Ctrl + E : 한 글자 찾기
Ctrl + ↑(↓) : 캐럿 고정 스크롤
Ctrl + F : 찾기
Ctrl + R : 바꾸기
코드탐색기
F2 : 이름 변경하기(Uses제외)
DoubleClick : 소스코드 탐색기의 해당 코드로 이동
Ctrl + Shift + E : 탐색기<->에디터 창 이동
코드 인사이트(Code Insight)
Ctrl + Space : 코드완성 마법사
Ctrl + Shift : 메소드 파라미터 팁
Ctrl + J : 코드 템플릿 사용
기타 기능
Alt + F10 : 현재 위치에서 Popup-Menu 띄우기
F11 : View Object Inspector
F12 : Toggle Form/Unit
Alt + 0 : View Window List
Ctrl + F12 : View Unit
Shift + F12 : View Form
Posted by ~ 정윤식
http://sshoking.tistory.com/entry/Delphi-%EB%8B%A8%EC%B6%95%ED%82%A4
Delphi 레퍼런스 / 2010/04/07 09:48
#1
< 델파이 단축키 모음 >
[찾기]
Ctrl + F Find
Ctrl + R Find and Replace
F3 Search Again
[화면이동]
F11 View Object Inspector
F12 Toggle Form/Unit
Alt + 0 View Window List
Ctrl + F12 View Unit
Shift + F12 View Form
Ctrl + PgUp/PgDown CodeEditor에서 현재페이지의 첫줄(PgUp), 마지막줄(PgDown)로 이동
[컴파일/실행]
Ctrl + F9 Compile
F9 Run
F7 Trace Into
F8 Trace Over
F5 Set Breakpoint
Ctrl + F5 Add Watch
Ctrl + F7 Evaluate/Modify
[블록관련]
Ctrl + Shift + U Unindent
Ctrl + Shift + I Indent
Ctrl + O, C Column Block Mode (또는 Alt키를 누른상태에서 Mouse를 드래그 해
도 컬럼블럭 설정이 가능, Shift + Alt + Arrow Key 를 사용해도 컬
럼블럭 설정)
Ctrl + O, K Line Block Mode
[키 매크로]
Ctrl + Shift + R Record
* 키매크로 작성순서 : -> <원하는키> ->
Ctrl + Shift + P Play
[Object Inpector]
Ctrl + Down Object Inpector 상단의 Object List ComboBox 열기
이 상태에서 Component Name을 키보드로 치면 Incremental Search 기
능Tab Property 와 Property Value 부분을 전환가능하며,
Property 쪽에 Cursor 가 위치한 상태에서 키보드를 치면
Incremental Search
[Code Insight]
Ctrl + Space Code Completion 기능
Ctrl + J Code Template 기능
Ctrl + Shift + Up/Down Object 의 Member function/procedure 의 선언부와 구현부를
이동
Ctrl + Shift + C Object 의 Member function/procedure 의 선언부와 구현부중
의 한가지를 코딩 한후 누르게 되면 나머지 선언부 또는 구
현부를 완성시켜줌
[기타]
Alt + F10 현재 위치에서 Popup-Menu 띄우기
Ctrl + Enter Code Editor 에서 현재위치의 단어로 File Open을 시도(기본 확장자
는 .pas) 하고 현재 Path 에서 그 파일을 찾지 못하면 File Open
Dialog를 띄움.
Alt + { or } Find Matching Brace( ‘(‘, ‘)’, ‘{‘, ‘}’, ‘[‘, ‘]’ )
#2
에디터에서 Ctrl + E 를 하면 increment Search 가 됩니다. Ctrl+E 를 눌루고 문자열을 입력해 보세요
Ctrl+L 을 해도 다시 찾기 또는 다시 바꾸기를 할수 있습니다.
Alt+F11 은 유닛을 Uses 할때 사용하면 됩니다.
Ctrl+K+W 를 하면 선택한 블럭을 저장할수 있습니다.
Ctrl+K+R 을 하면 캐럿위치에 파일을 읽어서 붙일수 있습니다.
Ctrl+Alt+B 를 하면 현재 프로젝트에 설정된 BreakPoint 를 편집할수 있구 그 라인으로 이동할수 있습니다.
#3
다시찾기 단축키.
ctrl+f로 찾은후, F3을 누르면 다시 찾기가 됩니다.
토큰으로 찾기 단축키
커서가 토큰에 위치시키고는 ctrl + alt + 화살표 위로 또는
아래로 하면 커서위치의 토큰과 가장 가까이에 있는 토큰을 찾아갑니다.
ctrl + 마우스 왼쪽 클릭 단축키
ctrl + 화살표 위
메소드 선언부바로가기
메소드선언부에서 ctrl+shift+화살표아래
메소드 구현부바로가기
메소드구현부에서 ctrl+shift+화살표위
GExperts의 클립보드 히스토리 사용.
Gexperts를 설치하셨다면 클립보드 히스토리가 있습니다. 델파이 에디터 편집기에서 사용한 복사내용 역사(?)가 등록됩니다.
GExperts의 IDE 메뉴 shortcut사용
델파이의 메뉴에 단축키를 설정하실 수 있습니다. 꽤나 유용합니다.
View-얼라이먼트 팔레트같은것을 shift+alt+p로 선언해 두시면 편할듯싶네요
GExperts의 Code Proofreader
철자수정 기능을 갖추고 있습니다.
특히 Dictionary탭의
Enable dictionary replament와
Enable compiler replament 체크를 하시게 되면
코딩이 수월해지며, Form또는 unit Edit1등이 짜증나게 됩니다.
컬럼블럭 선택 해제
선택: shift + alt + 화살표키하시면 컬럼열을 복사하실 수 있습니다.
해제: 그냥 편집창에서 마우스를 클릭하시면 해제됩니다.
또는 Ctrl+O+K를 하시면 해제됩니다.(이건 많은 분들이 모르시고 있더군요)
컴포넌트 이름은 알고 어떤 팔레트에 있는지 모를때
Alt + V + C를 하시고 컴포넌트 이름을 입력하셔서 찾으시면 됩니다.
델파이환경에서 unit을 제거했는데 dcu를 찾지 못할때..
델파이는 보통 컴파일시 변경된 파일만 체크하기 때문에 이런 문제가 나타날 수 있습니다.
그때는 Alt + P + B를 하시면 모두 빌드해서 에러를 잡으세요.
Project Group에서 여러 프로젝트를 한번에 빌드하기.
하나하나씩 컴파일 하지 마시고, Alt + P + E를 하시면 프로젝트 그룹내의 모든 프로젝트를 빌드하게 됩니다.
제가 애용하는 델파이의 기능이었으며, 이미 알고 있다고 가정한 것들은 제외했습니다.
(델6버전임.)
#4
폼 디자이너
Ctrl + 방향키(←↑→↓) : 컴포넌트 위치 이동
Shift + Ctrl + 방향키(←↑→↓) : 컴포넌트 위치 이동(빠르게)
Shift + 방향키(←↑→↓) : 컴포넌트 크기 변경
선택 후 ESC : Parent컴포넌트로 이동
오브젝트 인스펙터
Ctrl + ↓ : 컴포넌트 선택기 팝업
(팝업 후 알파벳 문자 입력하여 해당 컴포넌트로 이동 가능)
Alt + ↓ : Property Combo 선택기 팝업
(팝업 후 알파벳 문자 입력하여 해당 컴포넌트로 이동 가능)
Ctrl + Enter : 열거형 Property값을 다음 값으로 변경
+선택 후, ←,→ : 하위 Property펼치기,접기
Ctrl + Tab : Properties,Events탭 전환
..선택 + Ctrl + Enter : Property Editor 열기
Tab : Property Name/Value토글
소스코드 에디터
Ctrl + Enter : 현재위치의 단어로 File Open 시도
현재 Path 에서 찾지 못하면 Dialog
Ctrl + S : 파일 저장
Ctrl + F4 : 파일 닫기
Ctrl + Shift + C : Method/Procedure/Property자동생성
Ctrl + Shift + ↑(↓) : 선언부,구현부 상호간 이동
Ctrl + Shift + R : 키 매크로 레코딩
Ctrl + Shift + P : 키 매크로 실행
Ctrl + ←,→ : 이전 단어, 다음 단어
Ctrl + Shift + ←,→ : 이전 단어, 다음 단어까지 블럭
Ctrl + Home : 소스코드 맨 앞으로 이동
Ctrl + End : 소스코드 맨 뒤로 이동
Shift + Home : 현재 라인 맨 앞까지 블럭
Shift + End : 현재 라인 맨 뒤까지 블럭
Ctrl + PageUp : 현재 화면의 맨 윗줄로 이동
Ctrl + PageDown : 현재 화면의 맨 아랫줄로 이동
Ctrl + Shift + I(U) : 현재 라인에 들여쓰기(내어쓰기)
Shift + Alt + 방향키(←↑→↓) : 블록 사각형 지정 -> Ctrl + Backspace : 해제
Ctrl + KL : 캐럿이 Line Home에 있을 때, Line 블럭
Ctrl + T : 현재 위치에서 마지막 단어까지 삭제
Ctrl + I : 블럭 지정된 문자를 공백으로 변환
Alt + {, } : '{'괄호 앞,뒤에서 사용. 짝 찾기.
Ctrl + N : 다음 Line 맨 앞으로 줄바꿈
Ctrl + M : 줄바꿈
Alt + BackSpace : 실행 취소
Ctrl + E : 한 글자 찾기
Ctrl + ↑(↓) : 캐럿 고정 스크롤
Ctrl + F : 찾기
Ctrl + R : 바꾸기
코드탐색기
F2 : 이름 변경하기(Uses제외)
DoubleClick : 소스코드 탐색기의 해당 코드로 이동
Ctrl + Shift + E : 탐색기<->에디터 창 이동
코드 인사이트(Code Insight)
Ctrl + Space : 코드완성 마법사
Ctrl + Shift : 메소드 파라미터 팁
Ctrl + J : 코드 템플릿 사용
기타 기능
Alt + F10 : 현재 위치에서 Popup-Menu 띄우기
F11 : View Object Inspector
F12 : Toggle Form/Unit
Alt + 0 : View Window List
Ctrl + F12 : View Unit
Shift + F12 : View Form
Posted by ~ 정윤식
http://sshoking.tistory.com/entry/Delphi-%EB%8B%A8%EC%B6%95%ED%82%A4
2015년 4월 22일 수요일
PermGemSpace
출처: http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/memleaks.html
http://wiki.openmrs.org/display/docs/Out+Of+Memory+Errors
메모리 누수 leak 를 알게 되는 일반적인 방법 중 하나가 java.lang.OutOfMemoryError 에러 입니다. 이 에러는 Java 힙 heap 이나 힙의 특정 영역에 객체를 할당 할 수 있는 공간이 충분하지 않을 때 발생합니다.
PermGen space 라는 메시지는 permanent generation 이 가득 찬 상태라는 것을 알려줍니다. permanent generation 은 클래스와 메쏘드 객체가 저장되는 힙의 영역입니다. 어플리케이션이 많은 수의 클래스를 로드하면, -XX:MaxPermSize 옵션을 사용하여 permanent generation 의 크기를 증가시킬 필요가 있습니다.
톰캣 Tomcat 을 사용하다 이 에러를 보았다면 대체로 웹 어플리케이션을 너무 많이 Update 하거나 Reload 한 것이 원인입니다. 톰캣 과 JVM 은 웹 어플리케이션을 삭제하고 다시 생성할 때 할당한 모든 메모리를 해제하지는 않습니다. 톰캣을 여러 번 리로드하면 할당된 메모리가 바닥나서 동작하지 않게 됩니다.
톰캣에서 이 에러가 발생했을 때 해결 방법은 1. 톰캣을 재시작하는 것입니다. 2. 톰캣이 할당할 수 있는 메모리를 늘려줄 수도 있습니다. 이 방법은 에러 발생을 중지시키는 것이 아니라 톰캣을 재시작하기까지의 시간을 연장시킬 뿐입니다. 3. 메모리 누수가 발생하지 않도록 톰캣을 설정합니다.
Java Heap 크기 증가
커맨드라인으로 톰캣을 실행시킨다면 아래의 파라미터를 추가합니다.
-Xmx512m -Xms512m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:NewSize=128m
윈도우 서비스로 톰캣을 실행시킨다면 톰캣 모니터를 실행시키고, Tomcat -> Java -> Java Options 에 아래의 내용을 추가합니다.
-Xmx512m -Xms512m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:NewSize=128m
참고1: 복사해서 붙여넣기를 할 때 빈 공간이 추가되지 않도록 주의하십시오. 톰캣을 시작하지 못할 수 있습니다.
참고2: 64비트 버전의 톰캣을 사용한다면 레지스트리 HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\Tomcat5\Parameters\JavaJVM 을 변경해야 합니다.
리눅스 linux 나 유닉스 unix 환경에서 톰캣 tomcat 을 사용하시면 catalina.sh 파일의 상단에 아래의 문장을 추가해 주면 됩니다. 필요에 따라 서버의 swap 영역을 넓혀줍시다.
JAVA_OPTS="-Djava.awt.headless=true -server -Xms512m -Xmx1024m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC"
메모리 누수 방지 설정
conf/web.xml file 파일에서 jsp 서블릿 부분에 아래의 내용을 추가합니다.
<init-param>
<param-name>enablePooling</param-name>
<param-value>false</param-value>
</init-param>
http://wiki.openmrs.org/display/docs/Out+Of+Memory+Errors
메모리 누수 leak 를 알게 되는 일반적인 방법 중 하나가 java.lang.OutOfMemoryError 에러 입니다. 이 에러는 Java 힙 heap 이나 힙의 특정 영역에 객체를 할당 할 수 있는 공간이 충분하지 않을 때 발생합니다.
PermGen space 라는 메시지는 permanent generation 이 가득 찬 상태라는 것을 알려줍니다. permanent generation 은 클래스와 메쏘드 객체가 저장되는 힙의 영역입니다. 어플리케이션이 많은 수의 클래스를 로드하면, -XX:MaxPermSize 옵션을 사용하여 permanent generation 의 크기를 증가시킬 필요가 있습니다.
톰캣 Tomcat 을 사용하다 이 에러를 보았다면 대체로 웹 어플리케이션을 너무 많이 Update 하거나 Reload 한 것이 원인입니다. 톰캣 과 JVM 은 웹 어플리케이션을 삭제하고 다시 생성할 때 할당한 모든 메모리를 해제하지는 않습니다. 톰캣을 여러 번 리로드하면 할당된 메모리가 바닥나서 동작하지 않게 됩니다.
톰캣에서 이 에러가 발생했을 때 해결 방법은 1. 톰캣을 재시작하는 것입니다. 2. 톰캣이 할당할 수 있는 메모리를 늘려줄 수도 있습니다. 이 방법은 에러 발생을 중지시키는 것이 아니라 톰캣을 재시작하기까지의 시간을 연장시킬 뿐입니다. 3. 메모리 누수가 발생하지 않도록 톰캣을 설정합니다.
Java Heap 크기 증가
커맨드라인으로 톰캣을 실행시킨다면 아래의 파라미터를 추가합니다.
-Xmx512m -Xms512m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:NewSize=128m
윈도우 서비스로 톰캣을 실행시킨다면 톰캣 모니터를 실행시키고, Tomcat -> Java -> Java Options 에 아래의 내용을 추가합니다.
-Xmx512m -Xms512m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:NewSize=128m
참고1: 복사해서 붙여넣기를 할 때 빈 공간이 추가되지 않도록 주의하십시오. 톰캣을 시작하지 못할 수 있습니다.
참고2: 64비트 버전의 톰캣을 사용한다면 레지스트리 HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\Tomcat5\Parameters\JavaJVM 을 변경해야 합니다.
리눅스 linux 나 유닉스 unix 환경에서 톰캣 tomcat 을 사용하시면 catalina.sh 파일의 상단에 아래의 문장을 추가해 주면 됩니다. 필요에 따라 서버의 swap 영역을 넓혀줍시다.
JAVA_OPTS="-Djava.awt.headless=true -server -Xms512m -Xmx1024m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC"
메모리 누수 방지 설정
conf/web.xml file 파일에서 jsp 서블릿 부분에 아래의 내용을 추가합니다.
<init-param>
<param-name>enablePooling</param-name>
<param-value>false</param-value>
</init-param>
2015년 4월 16일 목요일
문자열길이체크
var len;
var str;
var textarea;
function getCheck(tagName,maxlen){ //tagName : TextArea의 id값 // maxlen : 체크할 최대byte수
len = 0;
textarea = document.getElementById(tagName);
str = textarea.value;
//str = document.getElementById(tagName);
for(var i=0; i<str.length; i++){
// charCodeAt에서 한글이 12592이상인걸로 알고있지만 아닐수도?(아스키코드 10진수..)
if(str.charCodeAt(i) >= 12592){ // 이부분에서 영문 숫자 조건줘서 변경 가능
len = len + 3; // 한글은 3바이트로 체크
}else{
len = len +1; // 한글 외에는 1바이트로 체크
}
if(len > maxlen){
alert("Is over "+maxlen+" characters.");
textarea.value = str.substring(0,i); // maxlen이상 입력할 수 없다
str = textarea.value; // 처리를해주어야 그만돈다
}
}
}
// 단순 길이 제한
onkeyup="getCheck(tagName,800)"
var len;
var str;
var textarea;
function getCheck(tagName,maxlen){ //tagName : TextArea의 id값 // maxlen : 체크할 최대byte수
len = 0;
textarea = document.getElementById(tagName);
str = textarea.value;
if(str.length>maxlen){
alert("Is over "+maxlen+" characters.");
textarea.value = str.substring(0,maxlen); // maxlen이상 입력할 수 없다
}
}
var str;
var textarea;
function getCheck(tagName,maxlen){ //tagName : TextArea의 id값 // maxlen : 체크할 최대byte수
len = 0;
textarea = document.getElementById(tagName);
str = textarea.value;
//str = document.getElementById(tagName);
for(var i=0; i<str.length; i++){
// charCodeAt에서 한글이 12592이상인걸로 알고있지만 아닐수도?(아스키코드 10진수..)
if(str.charCodeAt(i) >= 12592){ // 이부분에서 영문 숫자 조건줘서 변경 가능
len = len + 3; // 한글은 3바이트로 체크
}else{
len = len +1; // 한글 외에는 1바이트로 체크
}
if(len > maxlen){
alert("Is over "+maxlen+" characters.");
textarea.value = str.substring(0,i); // maxlen이상 입력할 수 없다
str = textarea.value; // 처리를해주어야 그만돈다
}
}
}
// 단순 길이 제한
onkeyup="getCheck(tagName,800)"
var len;
var str;
var textarea;
function getCheck(tagName,maxlen){ //tagName : TextArea의 id값 // maxlen : 체크할 최대byte수
len = 0;
textarea = document.getElementById(tagName);
str = textarea.value;
if(str.length>maxlen){
alert("Is over "+maxlen+" characters.");
textarea.value = str.substring(0,maxlen); // maxlen이상 입력할 수 없다
}
}
2015년 4월 13일 월요일
2015년 4월 10일 금요일
clob
[iBatis] Clob 사용하기
1. select 하기 (resultMap 이용)
select 문에서 resultMap을 사용한다.
그전에 앞서 resultMap을 셀럭트 하기전에 선언한다.
왜냐면 XML은 순차적으로 해석하기때문에... 먼저 해줘야 나중에있는놈이 쓸수있는거다.
<resultMap id="borderResultMap" class="java.util.HashMap">
<result property="seq" column="SEQ"/>
<result property="cont" column="CONT" jdbcType="CLOB" javaType="java.lang.String"/>
</resultMap>
<select id="selectBoard" parameterClass="java.util.HashMap" resultMap="borderResultMap">
SELECT SEQ, CONT FROM BOARD WHERE SEQ = #seq#
</select>
2 insert & update 하기
ㄱ.parameterMap을 이용 하는 방법
<parameterMap id="boardParamMap" class="java.util.HashMap">
<parameter property="seq"/>
<parameter property="content" jdbcType="CLOB"/>
</parameterMap>
<insert id="insertBoard" parameterMap="boardParamMap">
insert into(SEQ, CONT) VALUES(#seq#, #cont#)
</insert>
ㄴ.바로 사용 하는 방법 (사용해봄 :CLOB 만 붙여주니 동작함)
<insert id="insertBoard" parameterMap="boardParamMap">
insert into(SEQ, CONT) VALUES(#seq#, #cont:CLOB#)
</insert>
1. select 하기 (resultMap 이용)
select 문에서 resultMap을 사용한다.
그전에 앞서 resultMap을 셀럭트 하기전에 선언한다.
왜냐면 XML은 순차적으로 해석하기때문에... 먼저 해줘야 나중에있는놈이 쓸수있는거다.
<resultMap id="borderResultMap" class="java.util.HashMap">
<result property="seq" column="SEQ"/>
<result property="cont" column="CONT" jdbcType="CLOB" javaType="java.lang.String"/>
</resultMap>
<select id="selectBoard" parameterClass="java.util.HashMap" resultMap="borderResultMap">
SELECT SEQ, CONT FROM BOARD WHERE SEQ = #seq#
</select>
2 insert & update 하기
ㄱ.parameterMap을 이용 하는 방법
<parameterMap id="boardParamMap" class="java.util.HashMap">
<parameter property="seq"/>
<parameter property="content" jdbcType="CLOB"/>
</parameterMap>
<insert id="insertBoard" parameterMap="boardParamMap">
insert into(SEQ, CONT) VALUES(#seq#, #cont#)
</insert>
ㄴ.바로 사용 하는 방법 (사용해봄 :CLOB 만 붙여주니 동작함)
<insert id="insertBoard" parameterMap="boardParamMap">
insert into(SEQ, CONT) VALUES(#seq#, #cont:CLOB#)
</insert>
2015년 3월 31일 화요일
background
background: url(http://cdn9.pikicast.com/collection/7ebe16c1-6abd-4014-ab4e-d2609932d48b_20150331174833584.jpg) 50% 50% / cover no-repeat;
//그라디언트
background:linear-gradient(to bottom,#595959 0%,#4A4A4A 95%,#262626 99%,#262626 100%);
//그라디언트
background:linear-gradient(to bottom,#595959 0%,#4A4A4A 95%,#262626 99%,#262626 100%);
2015년 3월 29일 일요일
RF
RF 회로개념 잡기 - PART 10 ▶ Antenna (안테나)
RF가 가장 RF틱하게 만드는 물건이 과연 무엇인가에 대한 질문에 대해, 많은 분들이 아마 antenna(안테나)를 꼽으실 것 같습니다. 어떤 RF기기건, 무선을 이용한다는 관점에서 절대로 빠져서는 안되는 가장 눈에 띠이고 티 나는 물건이니까요. 안테나가 RF의 가장 대표적인 존재여서 그런지, 안테나라는 하나의 테마에 대해서만 논하려 해도 엄청나게 다양하고 많은 분량의 얘기가 오갈 수 있습니다. 종류도 무진장 다양하게 많고 구현방법도 여러 가지고 동원되는 기술도 다양하기 그지없습니다. 이 기초강의는 모든 안테나에서 공통적으로 적용되는 기본개념들을 포괄적으로 이해하는데 목적을 두고 있습니다. 아주 생기초적인 부분부터, 엔지니어라면 꼭 알아야 할 기본 개념까지 차근차근 정리하였으니 편안한 마음으로 읽어보세요. ^^ 안테나란? 아무리 RF에 R자도 모르는 일반인이라 해도, 솔직히 안테나라는 존재는 꽤 익숙할 것입니다. 최소한 전파를 쏘고 받는 부품이라는 거 정도는 누구나 아는 상식이지요. 안테나의 기호는 보통 아래와 같이 역삼각형 막대기를 많이 씁니다. 무선통신에서 신호가 전달되는 경로는, 유선의 선로가 아닌 자유공간(free space)입니다. 그냥 공기(air)라고 말하기엔 우주공간에서도 전자파를 쓰기 때문에 자유공간이란 말이 좀더 적합합니다. 그러한 자유공간에 신호를 뿌려주고, 또 그 뿌려진 신호를 잡아서 받는 것, 그 역할을 하는 최종단이 바로 안테나이죠. 이렇게 전압/전류로 표현되는 전기적 신호와 전기장/자기장으로 표현되는 전자기파를 서로 변환해주는 역할을 하는 것, 그것이 바로 안테나입니다. 안테나 외부의 전자기장의 변화와 안테나 도선상의 전기적 신호가 상호 연동함으로써, 대기중에 떠다니는 전자기파 신호를 전자기기가 감지하고, 또 그 역도 가능할 수 있는 것입니다. 안테나의 S파라미터 아래 그림에서 왼쪽은 Microstrip으로 구현된 Stepped impedance filter (LPF 형태)의 예입니다. 입력포트에 들어간 신호들은 이 구조를 지나면서 출력포트에서 특정 주파수만 걸러진 형태로 나오게 됩니다. 이 그림은 안테나의 원리를 규명하는 그림이기도 합니다. 안테나는 한마디로 끊어진 선로입니다. 더 이상 전기신호가 진행할 수가 없는 상태이므로, 일반적인 선로가 그렇게 된다면 open(개방)된 회로처럼 신호가 더 이상 갈 곳이 없어서 전반사해서 돌아오겠지요. 하지만 안테나는 그 끝단을 특정 주파수에서 공진하게 함으로써, 신호가 되돌아가지 않고 어떤 전자기장 형태의 에너지가 형성되어 외부로 뻗쳐나가도록 해줍니다. 그렇기 때문에 안테나는 기본적으로 포트가 입력포트하나뿐인 1 port device입니다. 그래서 안테나에서는 입력 반사계수를 의미하는 S11값만 보이며, 아래와 같은 공진 그래프 형태를 가지게 됩니다. 안테나의 공진 위에서 살짝 언급되었듯이, 안테나의 가장 근본적인 원리는 공진(resonance)으로 설명됩니다. 공진 강의에서 보셨듯이, 공진이란 구조적/전기적으로 주파수선택 현상을 가리키는 말로써, RF에서 가장 흔하게 사용되는 말입니다. 우선 쉬운 예로 dipole antenna와 monopole antenna의 예를 볼까요?
" 안테나의 싸이즈는 주파수에 철저히 의존한다 "= 파장이 짧아질수록 더 작게 공진기를 구현할 수 있다
안테나 무선통신의 원리 이렇게 전기적 신호를 전자기파로 변환해주는 안테나를 이용하여, 어떻게 무선 통신이 이루어질 수 있을까요? 단순히 송신안테나에서 전파를 쏘면 그 전파를 수신 안테나에서 받는 것처럼 생각될 수 있습니다. 주거니 받거니.. 물론 보기엔 마치 그렇게 보일 수도 있지만, 실제로 신호가 전달되는 메커니즘은 그렇게 주고 받는 식으로 설명되지 않습니다. 두 안테나 간의 전자기장 교류에 의한 신호전달이라는 메커니즘을 아주 원초적이고도 개념적으로 차근차근 이해해보도록 하겠습니다. 잘~ 보세요! Step 1 : 신호란? 우리가 '신호'라고 말하는 것은, 어떤 주기적 파동에너지에 정보가 실려있다는 의미입니다. Oscillator와 같은 주파수원 발진기에 의해 생성되는 파형은 아래와 같이 깨끗한 sine 파형이 됩니다. "음 깨~ 끗하군.. -_-; " 즉 누구나 알고 있는 그냥 sine파일뿐, 아무 정보가 없습니다. 그야말로 깨끗한 백지를 fax로 보내준 셈과 마찬가지죠. 에너지 낭비입니다- 우리가 '정보를 담는다'라고 말하는 것은, 이러한 깨끗한 sine파형을 정해진 형태로 찌그러트리거나 가변을 시키는 것을 말하게 됩니다. 그렇게 해서 서로가 정해진 룰에 의해 정상적인 sine파형을 변형시켜서 보내면, 받은 쪽에서는 그 룰에 의해 변형되어 수신된 파형의 의미가 무엇인지 해독해내게 되는 것이죠. 결국 진짜 정보를 담은 신호란, 변조과정을 통해 sine파형에 일정한 변형이 가해진 주기적 파동형태를 말합니다. 이점을 잘 기억해두시고 다음으로! Step 2. 쌍대성 (Reciprocal) 이말이 뭔말이냐면, 원래부터 안테나는 송신용과 수신용이 따로 구분되지 않는다 라는 것입니다. 즉 모든 안테나는 송신용이 될수도, 수신용이 될 수도 있다는 것입니다. 설계나 제작단계에서 송신용/수신용이 따로 구분되어 만들어지는게 아니라, 일단 특정 주파수에서 특성에 맞게 만들어진 안테나는 그걸 사용하는 사람이 송신단에 쓰면 송신용 안테나가 되고 수신단에 쓰면 수신용 안테나가 될 수 있다는 것입니다. 이 점은 안테나를 이해하는데 있어서 대단히 중요한 개념입니다. Step 3. 안테나 빔 (Antenna beam)" 이얍! 내 레이저빔을 받아랏~ " 어릴 때 울트라맨이나 태권V 흉내를 내면서 이런 장난을 치신 적이 있을 것입니다. 빔(beam)이란 말은 마치 레이저처럼 빛이 특정방향으로 쭉 나가는 듯한, 그런 형상을 지칭한다는 건 일반인도 다 알고 있는 사실이죠. 그리고 빛(light) 역시 주파수가 높은 전자기파의 일종입니다. 안테나에서 방사되는 전자기파(electromagnetic wave) 역시, 온사방으로 흩뿌려지듯이 퍼지는 것이 아닙니다. 어떤식으로든 특정 방향으로 빔을 형성하게 되며, 결국 안테나에서 빔이란 말은 안테나가 송수신이 가능한 특정한 전자기파 방향, 형상 또는 위치를 지칭하게 됩니다.
그리고 이러한 antenna beam은 특정한 방향성과 모양을 가지기 때문에, 그 형상을 빔패턴 (beam pattern) 또는 복사패턴(radiation pattern)이라고 부르게 됩니다. 이문제는 저 밑에서 더 자세히 다루게 될 것입니다.
Step 4. 무선통신의 원리위에서 언급한 신호의 변조 와 쌍대성의 원리에 기초하여 무선통신의 원리를 이해해보도록 하겠습니다. <그림 1> 멀리 떨어진 두 개의 시스템에서 동시에 똑같은 주파수의 전자기파를 방출하고 있다고 가정하였습니다. 현재 두 시스템은 둘다 깨끗한 sine파의 파동, 즉 정보가 없는 그냥 주파수신호를 전자기파 형태로 내보내고 있는 중입니다. 그리고 이 두시스템의 전자기파 에너지는 동일한 물리적 공간에서 동일한 주파수의 전자기장을 함께 형성하고 있는 중입니다. <그림 1> <그림 2> <그림 3> 빔패턴 (beam pattern) = 복사패턴(Radiation pattern) 저 위의 무선통신의 원리에서 설명하였듯이, 안테나에는 유효 전자기파 영역인 빔패턴(beam pattern, 또는 radiation pattern)이 존재합니다. 결국 특정 방향과 위치로 전자기파를 사용한다는 것이므로, 이것은 안테나의 방향성(directivity)이란 개념을 탄생시킵니다. 우선 모든 안테나 책에서 제일 먼저 언급되는 것으로 isotropic antenna라는 게 있습니다. 그것은 아래 그림과 같이 어떤 점전원(point source)처럼 되어, 위 아래 360도 전 방향으로 동그란 구처럼 전자기파가 사방으로 고루 퍼져 나가는, 무지향성 안테나를 의미합니다. 결국 실존하는 안테나는 구조적으로 어떤 '방향성'을 가지는 빔패턴을 가지게 되고, 또한 실제로도 대부분의 안테나는 특정 방향으로 신호를 보내야 하는 경우가 많습니다. 그래서 안테나마다 고유의 빔패턴 특성을 가지게 되며, 우리는 이러한 여러 빔패턴 특성을 가진 안테나 중 원하는 빔패턴을 가진 안테나를 선택하게 되는 것이죠. 아래에 3차원으로 표현된 빔패턴의 그림들을 표시하였습니다. 그런데 지구상에서 살고 있는 우리 인간의 입장에서, 안테나를 쓸 때 어떤 빔패턴이 유리할까요? 굳이 사방으로 고루 나가는 isotropic antenna가 필요하지 않습니다. 위(하늘), 아래(땅) 로는 별로 중요하지 않고, 지면을 따라 옆으로만 좍~ 퍼져서 잘 나가면 좋겠죠? 이렇게 수평방향으로만 고루 사방으로 퍼지는 빔패턴을 소위 omni-directional 하다고 합니다. 아래에는 대표적인 omni-directional 빔패턴을 가지는 dipole antenna의 빔패턴을 예시한 그림입니다. 안테나 이득 (Antenna Gain) & HPBW 안테나를 처음 접하는 분들이 제일 먼저 혼란스러워 하는 개념이 바로 안테나 이득입니다. 이득이라 함은 입력된 신호가 출력에서 더 커지는 경우를 말하는 것인데.. 안테나는 분명히 수동소자입니다. DC전원같은 것없이 그냥 안테나 입력에 외부에 내보내고 싶은 신호만 보내면 안테나가 공기중에 radiation시키는 것이지요. 안테나에서의 이득(antenna gain)은 이런 능동회로의 이득과 다른 문제이며, 입력신호에 대비하여 출력신호가 더 커진다는 의미의 이득이 아닙니다. 안테나 이득은, 방향성(directivity)로 인해 파생되는 상대적 이득을 의미하는 안테나만의 용어입니다. 안테나의 이득이란 최대전계 방향을 기준으로 isotropic한 복사패턴에 대비한 안테나 복사패턴의 비율을 의미합니다. 말로 표현하면 좀 거시기한데 그림으로 표시하면 아래와 같이 됩니다.
0 dBd = 2.15 dBi , dBi = dBd + 2.15
결국 안테나의 이득이 크다는 얘기는, 특정방향(즉 신호를 보내기 위한 방향)으로 더욱 샤프하게 전자파가 쏠린다는 의미입니다. 결국 안테나의 이득이 높다는 말은, 전자파를 전달하기를 원하는 특정방향으로 더욱 강한 전자파를 보낼 수 있다는 의미가 됩니다.그리고 이렇게 빔폭의 기준점으로, HPBW (Half Power Beam Width : 반전력 빔폭)라는 지표를 사용합니다. 안테나의 빔폭이 넓다, 좁다라는 걸 말할 수 있는 기준점이 있어야 할텐데 이것을 쉽게 표준화할 수 있도록 최대 빔방향의 전력을 기준으로 전력이 반 (10*log(0.5) = -3 dB)로 줄어드는 지점까지의 각도를 HPBW라고 정한 것입니다. 배열 안테나 (Array Antenna) 경우에 따라선 parabolic antenna 같은거 말고도 빔패턴을 더욱 샤프하게 만들어야 할 경우가 있는데, 이런 경우 하나의 안테나로는 부족한 경우가 많습니다. 이 경우 여러개의 안테나를 특정한 룰에 의해 배열하면, 각각의 안테나의 빔패턴이 합쳐져서 더욱 샤프하게 만들 수가 있습니다. (주 : Ansoft emsemble™ 의 예제 그림입니다.)
여기서 lobe(로브)란 말은 우리말로 엽(葉)이라고 해석됩니다. 무슨 말인지 더 모르겠죠? -.-;;
해부학 용어로 어떤 볼록 튀어나온 부분, 혹, 귓볼 뭐 그런 뜻이죠. 저 모양그대로 볼록한 그런걸 영어로 'lobe'라고 부른다고 하네요. 배열 안테나의 패턴에서는 원래 의도했던 제일 큰 빔패턴을 main lobe라 부르고, 그 이외에 얼결에 떨거지로 생기는 성분을 side lobe라고 부릅니다. 각 lobe의 사이인 null 각도에서는 안테나로서 역할이 안되는 지역이 됩니다. 언뜻 보면 side lobe는 전혀 필요없어 보여서 없애야 할 것처럼 보이지만, 경우에 따라선 side lobe를 절묘하게 이용하는 경우도 있으므로, side lobe를 조절하는건 설계자의 재량입니다.
안테나를 배열하는 대표적인 방법론 세가지를 아래에 표기해보았습니다.
어쨌거나 이러한 배열 안테나 형식으로 만들면 방향,크기 등을 사용자 임의로 결정할 수 있기 때문에, 군사용은 물론 이동체 위성신호 수신기, 기지국 안테나(특히 smart antenna)용 등 여러 용도로 많이 애용되고 있습니다. 안테나 배열방법과 수식에 대해선 각종 안테나 책에 자~알 나와있습니다. Polarization (편파) 안테나를 이용하여 송수신할 때 또 하나 기억해야 할 것이 바로 이 편파(polarization)입니다. polarization이란, 전자기파의 진행방향에 대한 E field의 극성 방향을 의미합니다. 안테나마다 고유의 편파형태를 갖고 있으며, 송수신 안테나끼리 서로 편파방향을 맞추는 문제는 중요한 문제이죠. 편파에는 크게 직선편파(Linear polarization)와 원형편파(Circular polarization)의 두가지가 있습니다. 아래에는 그중 직선편파의 두가지 형태를 나타낸 그림입니다. - 타이밍 조절로 한주파수에서 두 개 이상의 채널을 송수신할 수 있다. - 장애물 잡음에 강해서 건물투과성이 높고 다중반사간섭에 강하다. - 편파손실이 적다. EIRP & ERP (유효복사전력) 실무적인 관점에서, 안테나와 관련된 주요 factor중에 ERP(Effective Radiated Power) 또는 EIRP (Effective Isotropically Radiated Power)라는 개념이 나오게 됩니다. 이것은 무선기기의 유효출력의 개념으로써, 안테나 이득의 효과를 함께 고려한 유효 송신출력을 나타내는 수치입니다.
EIRP = Pt * Ga
즉, 송신기의 출력이 30dBm이고 안테나 이득이 8dB라면 EIRP는 30 + 8 = 38 dBm 이됩니다.(Pt : 송신기 출력, Ga : 안테나 이득) 실제로 안테나의 빔패턴은 목적지를 향해 최대의 이득을 가지는 형태를 가질 것이고, 그에 따라 목적지에서는 다른 지역보다는 더 큰 전력의 신호를 수신할 수 있게됩니다. 송신기의 출력은 단순히 사방으로 균일하게 나간다는 가정일 뿐 특정 방향의 개념이 들어있지 않지만, 실제로 송신기는 특정 방향으로 빔이 쏠리는 안테나 이득을 갖고 있지요. 그래서 EIRP처럼 송신기의 유효출력이라는 실질적인 개념의 규격이 존재하는 것입니다.
ERP = EIRP - 2.15 dB
안테나의 종류 안테나의 종류는 셀 수도 없을만큼 많지만, 일반적으로 사용되는 고주파 안테나 종류에 대해 간략하게 정리해보도록 하지요.
안테나는 오묘해... 안테나가 RF의 상징이듯이, 안테나 자체는 정말로 흥미로운 테마입니다. 지면(또는 모니터화면)의 한계상 이 글에서는 안테나에 대해 가장 기본적으로 이해하고 있어야 할 사항들에 대해서만 정리하였습니다. 특히 의도적으로 수식의 표현은 극히 자제하였는데, 수식부분은 각종 안테나 책에 잘 나와 있습니다. 안테나는 워낙 고전적인 분야라 어지중간한 최신자료를 찾기보다는, 고전의 명저를 보는게 훨씬 직접적으로 도움되는 경우가 많습니다. 안테나에 대해선 좋은 책들이 많은데, 그중 많은 분들이 권장하는 대표적인 안테나 기본도서 번역판 두권을 권해드립니다. 둘다 유~명한 책이며, 무엇보다 한글이니 이보다 더 좋을수가! ▶ 안테나 이론-해석과 설계 (Antenna Theory- Analysis and Design) Constantine A. Balanis / 이문수 외 / 미래컴 / 2001▶ 안테나 이론과 설계 (Antenna Theory and Design) Stutzman&Thiele/윤영중 외 5인 / 교보문고 << Back
Copyright by RF designhouse. All rights reserved.
|
피드 구독하기:
글 (Atom)