'기타 TIP'에 해당되는 글 9건
- 2009.08.01 Microsoft Visual C++ 2005 & 2008 재배포 가능 패키지 다운로드 페이지...
- 2009.03.26 Transmute, 웹브라우저간 북마크 변환 프로그램
- 2009.03.26 IE8 InPrivate Browsing & Chrome Incognito mode(시크릿 모드) 단축아이콘 설정
- 2008.05.09 자바를 이용한 네이버 OpenAPI 사용... 2
- 2006.10.03 리네이머 일련번호...
- 2006.05.04 요일 구하기... 2
- 2006.05.04 윤년 구하기...
- 2006.04.30 데이터 교환(Swap) 방법...
- 2006.04.28 아스키 코드표
OpenAPI에 대한 기본적인 사용법은 네이버 OpenAPI 홈페이지에 잘 나와있고 이 글에서는 자바를 이용해서 XML문서를 파싱하는 부분만 간략히 정리한다.
네이버 OpenAPI 서비스관련 페이지는 http://openapi.naver.com/ 이고 예제소스에서는 간단한 이미지검색 API를 다룬다.
기본적으로 네이버 OpenAPI는 http://openapi.naver.com/search URL에 get 방식을 이용해서 각종 변수와 값을 설정해 준 후 요청을 한다.
그리고 요청에 대한 결과를 RSS형식의 XML문서로 넘겨주는데 이것을 파싱해서 원하는 정보를 얻을 수 있다.
위의 과정을 간단히 자바코드로 나타내면 아래와 같다.
네이버 OpenAPI 페이지에서 결과화면(XML)을 보면서 소스코드를 보시면 한결 이해가 쉬울 것이다.
// 1. 질의 URL String queryURL; queryURL = "http://openapi.naver.com/search?key=test&query=go&target=image"; // 2. 질의요청 URL url = new URL(queryURL); URLConnection connection = url.openConnection(); InputStream is = connection.getInputStream(); // 3. 질의결과 받기 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(is); // 4. 파싱 Element root = doc.getDocumentElement(); if("rss".equals(root.getNodeName())) { Node channel = root.getFirstChild(); NodeList nodelist = channel.getChildNodes(); Node totalNode = nodelist.item(4); Node displayNode = nodelist.item(6); // channel node 전체 순회 for(int i=0; i<nodelist.getLength(); i++) { // channel node중 item node만 처리 Node item = nodelist.item(i); if("item".equals(item.getNodeName())) { NodeList itemList = item.getChildNodes(); Node title = itemList.item(0); Node link = itemList.item(1); Node thumbnail = itemList.item(2); Node sizeheight = itemList.item(3); Node sizewidth = itemList.item(4); } } }
우선 위 소스의 결과를 간략히 설명하면 32~36라인에 있는 5개의 Node 변수에 이미지검색 API의 결과인 5개의 정보가 들어간다.
주석 기준으로 간단히 소스를 설명하며 아래와 같다.
1. 우선 OpenAPI 사용을 위한 주소를 단순히 문자열 변수에 넣는다.(예제 소스에서는 key값을 그냥 test로 했지만 실제로는 발급받은 key값을 사용해야한다.)
2. 설정된 URL을 통해서 질의를 하고 결과를 스트림으로 받는다.
3. 스트림으로 받은 결과를 DOM객체로 표현한다.
4. 마지막으로 하나씩 파싱해가면서 원하는 정보를 얻는다.
소스를 보면 최상위 노드인 rss부터 시작해서 하위노드로 이동하면서 원하는 정보를 얻는데 "root.getElementsByTagName" 등의 메소드를 통해서 원하는 정보를 바로 접근할 수도 있다.
이번학기 프로젝트 중 OpenAPI를 사용하는 부분이 있어서 급하게 공부한 것을 정리한 것으로 내용중 잘못된 정보가 있을 수 있습니다.
또한 대부분의 소스는 http://mashupkorea.com/ 에서 2007년 경진대회 참가 작품 중 신현우님이 "사전(자바기반 애플리케이션)"을 참고하였습니다.
- 참고 사이트 -
네이버 OpenAPI : http://openapi.naver.com/
네이버 OpenAPI 공식 카페 : http://cafe.naver.com/openapi.cafe
소스 참조 : http://mashupkorea.com/ 사전(자바기반 애플리케이션) / 개발자: 신현우
예전에 급조해서 만든 리네이머에서 일련번호 관련 소스이다...
여기서 일련번호란 사용자가 변경할 파일명을 "File ## Name ###" 이라고 입력한다면..."File 01 Name 001", "File 02 Name 002", "File 03 Name 003" 형식으로 번호가 증가되는 것을 의미한다...
파일명 중간에 임의의 일련번호 기호인 '#'을 넣어도 위와 같이 일련번호가 생성되는 방법으로 구현하느라 머리 좀 썼다...머 일련번호가 보통 파일명 끝에만 붙지만 중간에 넣어도 작동되게 한 이유는....알씨에서 파일명 일괄변경 할때 저런것도 되길래 나도 그냥 해봤다 ㅡㅡ;
알고리즘(?)의 기본 원리는 별거 없다...그냥 사용자가 일련번호 기호를 포함한 변경할 파일명을 전부 입력했다면 그냥 문자열 길이만큼 루프를 돌면서 문자 하나씩 비교를 한다..
일반 문자이면 결과변수에 값을 넣고 만약에 '#'이라면 연속되는 '#'의 갯수를 파악해서 CString클래스의 Format() 함수를 이용해서 일련번호를 만든후 이 값을 결과변수에 넣었다...
이 간단한거를....하루죙일 생각해서야 만들었다...
더 큰 문제(?)는 루프를 너무 많이 돈다...초기에 한번만 반복하고 이후에는 숫자만 바꿔주면 될듯한데 도저히 방법이 안 떠오른당 ㅡㅡ;
아래는 리네이머에 있는 일련번호 관련 풀소스이다...
리스트컨트롤에 있는 데이터 갯수만큼 반복문을 돌면서 하나씩 이름을 바꾸는거다...
파일명 변경후에는 원본 파일의 확장자를 따로 파싱해서 붙여버리는 형식이다...
막코딩하다가 만들어진 알고리즘이라 주석을 심하게 달아놓음 ㅡㅡ;
void CRenamerDlg::OnEnChangeEditRename() { // 입력한 형식데로 파일명 변경...일련번호 포함 UpdateData(TRUE); CString strData = m_strRename; // 사용자가 입력한 변경할 파일명 CString strTmp = _T(""); // 파일명 변경에 필요한 임시 변수 CString strResult = _T(""); // 최종적으로 변경할 파일명 int nTotalCnt = 1; // 일련번호 카운터 int nLength = 0; // 각각의 일련번호 자릿수 char ext[32]; // 파일경로에서 확장자만 따로 저장 // 리스트컨트롤에 있는 모든 데이터에 대해 반복... for(int i=0; i<m_listCtrl.GetItemCount(); i++) { // 변경할 파일명의 길이만큼 반복... // 기본 로직은 일반 문자열과 일련번호인 #을 구분해서 // strResult에 계속 저장... for(int j=0; j<strData.GetLength(); j++) { // 한 문자씩 불러와서 # 문자인지 여부 판단 // # 문자인경우 연속적으로 몇개 붙어있는지 판단 // 연속적으로 붙어있는 갯수가 곧 일련번호의 자리수 // 예 Test ### -> Test 001 if(strData.GetAt(j) == '#') { while(strData.GetAt(j) == '#') { nLength++; // #문자 갯수 증가 j++; // 연속된 문자 판단위해 다음 문자로 이동 } // while문 내에서 j값을 통해 다음 문자로 이동후에 비교를 하므로... // while문 탈출후 다시 위의 for문으로 돌아가면... // 다음, 다음 문자로 이동하므르로 문자 하나가 비교가 안되기에 // j값 1 감소시킴 j--; // 일련번호 완성 strTmp.Format("%0*d", nLength, nTotalCnt); nLength=0; // strResult에 일련번호 데이터 추가 strResult += strTmp; } else { // strResult에 단순 문자값 추가 strResult += strData.GetAt(j); } } // 이곳까지오면 변경할 확장자가 없는 파일명 완성 // 리스트컨트롤의 0번 칼럼은 Drag & Drop를 이용 데이터를 추가할때 // 각 파일의 절대경로가 들어가 있음... // 이 정보 이용 각 파일의 확장자를 얻어올 수 있음... // 위에서 얻은 변경할 파일명과 원본 파일의 확장자를 합쳐서... // 변경할 파일명 최종 완성 _splitpath(m_listCtrl.GetItemText(i, 0), NULL, NULL, NULL, ext); strResult+=ext; // 변경할 파일명을 3번 칼럼에 삽입 m_listCtrl.SetItem(i, 3, LVIF_TEXT, strResult, NULL, NULL, NULL, NULL); strResult.Empty(); nTotalCnt++; } }
일단 현재의 달력은 거의 모든 나라에서 사용하는 "그레고리력"입니다. 또한, 그레고리력에서 1년 1월 1일은 월요일이라고 하는 군요...
그리고 요일을 구하는 방법은 1년 1월 1일부터 원하는 날짜까지의 모든 일수를 더하고 나서 그 값을 7로 나눴을때의 나머지로 계산을 합니다.
7로 나눴을때 나머지가 0이면 일요일, 1이면 월요일, ...., 6이면 토요일입니다.
그럼 이제부터 모든 일수를 더하는 방법을 알려드리겠습니다...
2005년 5월 12일을 예로 들어서 알려드리겠습니다.
일단 주의할 점이 2005년 5월 12일은 2005년이 지나고 5개월이 지나고 12일이 지난것이라고 생각될 수도 있는데 이것은 잘못된 생각입니다....
2005년이 지나고 5개월이 지나고 12일이 지난 날짜는 2006년 6월 12일이겠죠...
다시 말하면 2004년이 지나고 4개월이 지나고 12일이 지난 날짜가 2005년 5월 12일이죠....
다음으로 넘어가서 일단 연도의 모든 일수를 구하는 방법을 알려드리겠습니다...
단순히 생각하면 위의 예를 기준으로 2004년이 지나간것이고 1년은 365일이니까 (2004년*365일)이 모든 일수겠죠....그러나 여기에서 윤년을 따져줘야 합니다....
(2004년*365일) 중에서 윤년인 경우는 2월이 하루가 더 많으니 윤년인 경우를 계산해서 그 일수를 더해주면 되겠죠...(윤년 계산방법은 아래 글에 있습니다...)
그럼 일단 1년 1월 1일부터 2004년 12월 31일까지의 모든 일수는 구해졌습니다....
이제 월을 구해보겠습니다....
위에서 말씀드렸듯이 5월달이라는 것은 4개월이 지났다는 뜻이니까 1~4월의 모든 일수를 더하면 되겠죠...(=31+28+31+30)
이 경우에도 역시 윤년이라면 +1을 해줘야겠죠....
월까지 구했다면 위에서 구한 연도의 모든 일수랑 월의 모든 일수를 더한후에 마지막으로 일수(12일)를 더합니다.(일수는 그냥 더하면 됩니다...)
그럼 원하는 날짜까지의 모든 일수가 구해집니다....
그 다음에는 7로 나누고 나머지를 구해서 요일을 따져주면 되겠죠....
아래에 수치적으로 계산을 한번 해보겠습니다.
예 : 2005년 5월 12일
연도 = (2004년*365일) + (2004/4) - (2004/100) + (2004/400)
= 731460+ 501- 20.04 + 5.01
= 731460+ 501- 20+5(소수부분 버림)
= 731946일
월 = 1월~4월 = 31+28+31+30 = 120일
일 = 12일
총 일수 = 732078일
결과 : 732078 % 7 = 4 => 목요일
연도 구하는 부분에서 [+ (2004/4) - (2004/100) + (2004/400)] 이부분은 윤년을 계산후 처리하는 부분입니다.
아래 글 보시면 윤년에 대해서 아시겠지만 간략히 설명하면 (연도*365)일 해서 나온 총 일수에다가 일단 모든 윤년(=2004/4)을 더합니다.
그 다음에 (연도/100 = 2004/100)은 윤년이 아니기에 빼버려주고요....마지막으로 (연도/400 = 2004/400)는 또 다시 윤년이므로 더해줍니다...
이렇게 함으로써 특정날짜의 요일을 구할 수 있습니다....
// 윤년 구하는 간단한 프로그램 소스 #include<iostream> using namespace std; void main() { int year; cout << "년도를 입력하세요 : "; cin >> year; if((year%4==0 && year%100!=0) || year%400==0) cout << "윤년\n"; else cout << "평년\n"; }
- 윤년 구하는 방법 -
특정연도를 4로 나누었을때 나누어 떨어지면 그 해는 일단, 윤년.
그러나 100으로 나누었을때 나누어 떨어진다면 4로 나누어 떨어진다고 해도 그 해는 평년.
그리고 마지막으로 400으로 나누어 떨어진다면 100으로 나누어 떨어진다고 해도 윤년.
1. 임시변수를 사용한 일반적인 방법.
swap(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
2. XOR 연산을 이용한 방법.
swap(int a, int b)
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
3. 더하기 연산을 이용한 방법
swap(int a, int b)
{
a = a + b;
b = a - b;
a = a - b;
}
10진수 |
16진수 |
8진수 |
2진수 |
ASCII |
10진수 |
16진수 |
8진수 |
2진수 |
ASCII |
0 |
0×00 |
000 |
0000000 |
NULL |
64 |
0×40 |
100 |
1000000 |
@ |
1 |
0×01 |
001 |
0000001 |
SOH |
65 |
0×41 |
101 |
1000001 |
A |
2 |
0×02 |
002 |
0000010 |
STX |
66 |
0×42 |
102 |
1000010 |
B |
3 |
0×03 |
003 |
0000011 |
ETX |
67 |
0×43 |
103 |
1000011 |
C |
4 |
0×04 |
004 |
0000100 |
EOT |
68 |
0×44 |
104 |
1000100 |
D |
5 |
0×05 |
005 |
0000101 |
ENQ |
69 |
0×45 |
105 |
1000101 |
E |
6 |
0×06 |
006 |
0000110 |
ACK |
70 |
0×46 |
106 |
1000110 |
F |
7 |
0×07 |
007 |
0000111 |
BEL |
71 |
0×47 |
107 |
1000111 |
G |
8 |
0×08 |
010 |
0001000 |
BS |
72 |
0×48 |
110 |
1001000 |
H |
9 |
0×09 |
011 |
0001001 |
HT |
73 |
0×49 |
111 |
1001001 |
I |
10 |
0×0A |
012 |
0001010 |
LF |
74 |
0×4A |
112 |
1001010 |
J |
11 |
0×0B |
013 |
0001011 |
VT |
75 |
0×4B |
113 |
1001011 |
K |
12 |
0×0C |
014 |
0001100 |
FF |
76 |
0×4C |
114 |
1001100 |
L |
13 |
0×0D |
015 |
0001101 |
CR |
77 |
0×4D |
115 |
1001101 |
M |
14 |
0×0E |
016 |
0001110 |
SO |
78 |
0×4E |
116 |
1001110 |
N |
15 |
0×0F |
017 |
0001111 |
SI |
79 |
0×4F |
117 |
1001111 |
O |
16 |
0×10 |
020 |
0010000 |
DLE |
80 |
0×50 |
120 |
1010000 |
P |
17 |
0×11 |
021 |
0010001 |
DC1 |
81 |
0×51 |
121 |
1010001 |
Q |
18 |
0×12 |
022 |
0010010 |
SC2 |
82 |
0×52 |
122 |
1010010 |
R |
19 |
0×13 |
023 |
0010011 |
SC3 |
83 |
0×53 |
123 |
1010011 |
S |
20 |
0×14 |
024 |
0010100 |
SC4 |
84 |
0×54 |
124 |
1010100 |
T |
21 |
0×15 |
025 |
0010101 |
NAK |
85 |
0×55 |
125 |
1010101 |
U |
22 |
0×16 |
026 |
0010110 |
SYN |
86 |
0×56 |
126 |
1010110 |
V |
23 |
0×17 |
027 |
0010111 |
ETB |
87 |
0×57 |
127 |
1010111 |
W |
24 |
0×18 |
030 |
0011000 |
CAN |
88 |
0×58 |
130 |
1011000 |
X |
25 |
0×19 |
031 |
0011001 |
EM |
89 |
0×59 |
131 |
1011001 |
Y |
26 |
0×1A |
032 |
0011010 |
SUB |
90 |
0×5A |
132 |
1011010 |
Z |
27 |
0×1B |
033 |
0011011 |
ESC |
91 |
0×5B |
133 |
1011011 |
[ |
28 |
0×1C |
034 |
0011100 |
FS |
92 |
0×5C |
134 |
1011100 |
\ |
29 |
0×1D |
035 |
0011101 |
GS |
93 |
0×5D |
135 |
1011101 |
] |
30 |
0×1E |
036 |
0011110 |
RS |
94 |
0×5E |
136 |
1011110 |
^ |
31 |
0×1F |
037 |
0011111 |
US |
95 |
0×5F |
137 |
1011111 |
_ |
32 |
0×20 |
040 |
0100000 |
SP |
96 |
0×60 |
140 |
1100000 |
. |
33 |
0×21 |
041 |
0100001 |
! |
97 |
0×61 |
141 |
1100001 |
a |
34 |
0×22 |
042 |
0100010 |
" |
98 |
0×62 |
142 |
1100010 |
b |
35 |
0×23 |
043 |
0100011 |
# |
99 |
0×63 |
143 |
1100011 |
c |
36 |
0×24 |
044 |
0100100 |
$ |
100 |
0×64 |
144 |
1100100 |
d |
37 |
0×25 |
045 |
0100101 |
% |
101 |
0×65 |
145 |
1100101 |
e |
38 |
0×26 |
046 |
0100110 |
& |
102 |
0×66 |
146 |
1100110 |
f |
39 |
0×27 |
047 |
0100111 |
' |
103 |
0×67 |
147 |
1100111 |
g |
40 |
0×28 |
050 |
0101000 |
( |
104 |
0×68 |
150 |
1101000 |
h |
41 |
0×29 |
051 |
0101001 |
) |
105 |
0×69 |
151 |
1101001 |
i |
42 |
0×2A |
052 |
0101010 |
* |
106 |
0×6A |
152 |
1101010 |
j |
43 |
0×2B |
053 |
0101011 |
+ |
107 |
0×6B |
153 |
1101011 |
k |
44 |
0×2C |
054 |
0101100 |
' |
108 |
0×6C |
154 |
1101100 |
l |
45 |
0×2D |
055 |
0101101 |
- |
109 |
0×6D |
155 |
1101101 |
m |
46 |
0×2E |
056 |
0101110 |
. |
110 |
0×6E |
156 |
1101110 |
n |
47 |
0×2F |
057 |
0101111 |
/ |
111 |
0×6F |
157 |
1101111 |
o |
48 |
0×30 |
060 |
0110000 |
0 |
112 |
0×70 |
160 |
1110000 |
p |
49 |
0×31 |
061 |
0110001 |
1 |
113 |
0×71 |
161 |
1110001 |
q |
50 |
0×32 |
062 |
0110010 |
2 |
114 |
0×72 |
162 |
1110010 |
r |
51 |
0×33 |
063 |
0110011 |
3 |
115 |
0×73 |
163 |
1110011 |
s |
52 |
0×34 |
064 |
0110100 |
4 |
116 |
0×74 |
164 |
1110100 |
t |
53 |
0×35 |
065 |
0110101 |
5 |
117 |
0×75 |
165 |
1110101 |
u |
54 |
0×36 |
066 |
0110110 |
6 |
118 |
0×76 |
166 |
1110110 |
v |
55 |
0×37 |
067 |
0110111 |
7 |
119 |
0×77 |
167 |
1110111 |
w |
56 |
0×38 |
070 |
0111000 |
8 |
120 |
0×78 |
170 |
1111000 |
x |
57 |
0×39 |
071 |
0111001 |
9 |
121 |
0×79 |
171 |
1111001 |
y |
58 |
0×3A |
072 |
0111010 |
: |
122 |
0×7A |
172 |
1111010 |
z |
59 |
0×3B |
073 |
0111011 |
; |
123 |
0×7B |
173 |
1111011 |
{ |
60 |
0×3C |
074 |
0111100 |
< |
124 |
0×7C |
174 |
1111100 |
| |
61 |
0×3D |
075 |
0111101 |
= |
125 |
0×7D |
175 |
1111101 |
} |
62 |
0×3E |
076 |
0111110 |
> |
126 |
0×7E |
176 |
1111110 |
~ |
63 |
0×3F |
077 |
0111111 |
? |
127 |
0×7F |
177 |
1111111 |
DEL |
출처 : http://www.jasko.co.kr/lesson/ascii.html
다른 사이트 : http://www.lookuptables.com