320x100

VSCode 사용한 단축키 v0.1 (lastUpdated: 2022.09.08)

Posted on 2022. 9. 28. 14:15
Filed Under Programming/개발환경+도구

▼ 사용한 단축키

1) Terminal창: Ctrl + `

2) Bookmark(Extension: bookmark 설치필요): 

  • Bookmarks: Toggle - 해당 코드 북마크 생성/취소★
  • Bookmarks: Toggle Labeled - 해당 코드를 라벨화하여 생성/취소 ★
  • Bookmarks: List - 현재 파일에 생성된 북마크 리스트 확인 ★
  • 해당 명령어를 입력하면 또 입력창이 뜹니다. 입력창에 라벨 이름을 정하면 액티브 바에도 해당 라벨로 북마크를 확인할 수 있습니다. (북마크 정리에 유용)
  • Bookmarks: Clear - 현재 파일에 생성된 모든 북마크를 제거
  • Bookmarks: Jump to Next - 다음 북마크로 이동
  • Bookmarks: Jump to Previous - 이전 북마크로 이동
  • (정보출처: https://velog.io/@m2nja201/Visual-Studio-CodeVS-Code-북마크책갈피-생성하는-법)

 

 

 

반응형

[java] 자료형, x진수 표현법

Posted on 2021. 9. 18. 16:56
Filed Under Programming/Java

▼기본 자료형(primitive data type)

자료형의 표현범위는 [2의 N승 - 1] (부호 표현용 1비트 제외)

java - 기본 자료형(primitive data type)

 


public static void main(String[] args) {
	//▼정수(decimal)
	int num = 10;		// 10진수
	int bNum = 0B1010;	// 2진수(binary): 0B+XXXX (32비트중 앞자리는 자동0)
	int oNum = 012;		// 8진수: 0+XXXX
	int xNum = 0XA;		// 16진수: 0x+XXX        
	long lNum = 12345678900L; //뒤에 L(또는 l)을 붙여서 리터럴(literal)을 8바이트/long으로 지정
	
	//▼실수(real number) 
	// - 소수점 표현 방식에는 부동 소수점 방식(Floating-Point Number Representation, IEEE 754)
	//   과 고정 소수점 방식(Fixed-Point Number Representation)이 있음. java는 부동 소수점 방식.
	double dNum = 3.141592;	//실수 리터럴은 기본형이 double
	float fNum = 3.141592F;	//뒤에 F(또는 f)를 붙여서 리터럴을 4바이트/float형으로 지정
	
	System.out.println(num);
	System.out.println(bNum);
	System.out.println(oNum);
	System.out.println(xNum);
	System.out.println(lNum);
	System.out.println(dNum);        
	System.out.println(fNum);
}
---------------
Output:
10
10
10
10
12345678900
3.141592
3.141592

 


// 자바의 부동 소수점 오차 예시
// - 소수점 표현 방식에는 부동 소수점 방식(Floating-Point Number Representation, IEEE 754)
//   과 고정 소수점 방식(Fixed-Point Number Representation)이 있음. java는 부동 소수점 방식.
public void fixedPointDoubleError() {
	double dnum = 1;

	for(int i = 0; i<10000; i++) {
		dnum = dnum + 0.1;
	}
	System.out.println(dnum);
}
---------------
Output:
1001.000000000159

▼자바의 문자형

- 표현은 전세계 공통인 UNICODE, 인코딩 방식은 UTF-16 (2바이트)

반응형

[java] HttpURLConnection - GET/POST

Posted on 2021. 8. 6. 13:23
Filed Under Programming/Java


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.codehaus.jettison.json.JSONObject;

//▼HTTP Reqeust GET/POST 샘플 코드
private String charsetName = "UTF-8";

//	Open API 호출 테스트 샘플
public String testGET() throws Exception 
{
	//JSONObject obj = new JSONObject();
	String baseUrl = "http://data.ex.co.kr/openapi/restinfo/restWeatherList?key=0759277880&type=json&sdate=20210507&stdHour=12";	
	String resultJSON = "{}";
	try {
		URL url = new URL(baseUrl);
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setDoOutput(true);
		conn.setRequestMethod("GET");
		conn.setRequestProperty("Content-type", "text/html; charset="+charsetName);
        
//		conn.setRequestProperty("Authorization", "Basic 암호화한인증키");
//		conn.setRequestProperty("Accept","*/*");
//		conn.setRequestProperty("Accept-Language","ko");
//		conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
//		conn.setRequestProperty("User-Agent","Mozilla/4.0");
//		conn.setRequestProperty("Host", "서버IP:포트");
//		conn.setRequestProperty("Connection","Keep-Alive");
//		conn.setRequestProperty("Cookie", "바사삭~쿠키");
//		
//		conn.setDoOutput(true);
//		conn.setDoInput(true);
//		conn.setUseCaches(true);        
		
		//conn.setDoInput(true); 
		System.out.println(((HttpURLConnection)conn).getRequestMethod());

//			OutputStreamWriter osw = new OutputStreamWriter(conn.getOutputStream(), "utf-8");
//			osw.flush();	
		
		int httpResponseCode = conn.getResponseCode();
		BufferedReader rd;
		if(httpResponseCode >= HttpURLConnection.HTTP_OK && httpResponseCode &lt;= HttpURLConnection.HTTP_MULT_CHOICE) {
			rd = new BufferedReader(new InputStreamReader(conn.getInputStream(), charsetName));
		} else {
			rd = new BufferedReader(new InputStreamReader(conn.getErrorStream(), charsetName));
		}
		StringBuilder sb = new StringBuilder();
		String line;
		while ((line = rd.readLine()) != null) {
			sb.append(line);
		}
		rd.close();
		conn.disconnect();
		
		resultJSON = sb.toString();
	} catch (IOException e) {
		e.printStackTrace();
	}
	
	return resultJSON;
}		

public String testPOST() throws Exception
{
	String baseUrl = "http://my-json-server.typicode.com/smallwitch/apitest/posts";	
	String result = "{}";
	JSONObject jsonObj = new JSONObject();
	try {
		URL url = new URL(baseUrl);
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setDoOutput(true);
		conn.setRequestMethod("POST");
		conn.setRequestProperty("Content-type", "application/json");
		
		OutputStreamWriter osw = new OutputStreamWriter(conn.getOutputStream(), charsetName);
		jsonObj.put("id", 100);
		Date date = new Date();
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
		jsonObj.put("title", dateFormat.format(date));
		System.out.println("input: "+jsonObj.toString());
		
		osw.write(jsonObj.toString());
		osw.flush();
		
		int httpResponseCode = conn.getResponseCode();
		BufferedReader rd;
		if(httpResponseCode >= HttpURLConnection.HTTP_OK && httpResponseCode &lt;= HttpURLConnection.HTTP_MULT_CHOICE) {
			rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
		} else {
			rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
		}
		StringBuilder sb = new StringBuilder();
		String line;
		while ((line = rd.readLine()) != null) {
			sb.append(line);
		}
		rd.close();
		conn.disconnect();
		
		result = sb.toString();
	} catch (IOException e) {
		e.printStackTrace();
	}
	
	return result;
}

반응형

jackson - ObjectMapper 정리 [계속..]

Posted on 2021. 7. 23. 10:44
Filed Under Programming/Java

배경: jackson 1.9 이하 버전에서 필요해짐.

출처: 직렬화&역직렬화


public class Coordinates {
    byte red;

    @JsonProperty("r")
    public byte getR() {
      return red;
    }

    @JsonProperty("red")
    public void setRed(byte red) {
      this.red = red;
    }
}
///////
Coordinates obj = new Coordinates();
obj.setRed((byte) 5);

ObjectMapper mapper = new ObjectMapper();
System.out.println("Serialization: " + mapper.writeValueAsString(obj));

Coordinates r = mapper.readValue("{\"red\":25}",Coordinates.class);
System.out.println("Deserialization: " + r.getR());

///////결과:
Serialization: {"r":5}
Deserialization: 25


public static Map<String, Object> objectToMap(Object obj) {
	ObjectMapper objectMapper = new ObjectMapper();
//	objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
//	objectMapper.configure(Feature.AUTO_DETECT_FIELDS, true);
	
    // value=null일때 처리
	objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
		@Override
		public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
			jgen.writeString("");
		}
	});
	
    // key=null일때 처리
	objectMapper.getSerializerProvider().setNullKeySerializer(new JsonSerializer<Object>() {
		  @Override
		  public void serialize(Object value, JsonGenerator jgen, SerializerProvider serializers) throws IOException, JsonProcessingException {
			  jgen.writeFieldName("null");
		  }
	});
	
	@SuppressWarnings("unchecked")
	Map<String, Object> map = objectMapper.convertValue(obj, Map.class);
	return map;
}


 

반응형

[Java] 클래스 속성명으로 객체 속성값 설정하기

Posted on 2021. 7. 19. 13:34
Filed Under Programming/Java


Customer classObj = new Customer();
System.out.println("[Before] classObj.contractId2 = "+classObj.getContractId2());
Field field;
try {
	field = classObj.getClass().getDeclaredField("contractId2");
	field.setAccessible(true);
	field.set(classObj, "설정값");
} catch (Exception e) {
	e.printStackTrace();
	
}
System.out.println("[After] classObj.contractId2 = "+classObj.getContractId2());
반응형

API요청&응답 받아오기 - HttpURLConnection 사용법

Posted on 2021. 6. 9. 15:42
Filed Under Programming/Java

 


// HttpURLConnection 객체 생성.
HttpURLConnection conn = null;
 
// URL 연결 (웹페이지 URL 연결.)
conn = (HttpURLConnection)url.openConnection();
 
// TimeOut 시간 (서버 접속시 연결 시간)
conn.setConnectTimeout(CONN_TIMEOUT * 1000);
 
// TimeOut 시간 (Read시 연결 시간)
conn.setReadTimeout(READ_TIMEOUT * 1000);
 
// 요청 방식 선택 (GET, POST)
conn.setRequestMethod(GET);
 
// Request Header값 셋팅 setRequestProperty(String key, String value)
conn.setRequestProperty("NAME", "name"); 
conn.setRequestProperty("MDN", "mdn");
conn.setRequestProperty("APPID", "appid");
 
// 서버 Response Data를 xml 형식의 타입으로 요청.
conn.setRequestProperty("Accept", "application/xml");
 
// 서버 Response Data를 JSON 형식의 타입으로 요청.
conn.setRequestProperty("Accept", "application/json");
 
// 타입설정(text/html) 형식으로 전송 (Request Body 전달시 text/html로 서버에 전달.)
conn.setRequestProperty("Content-Type", "text/html");
 
// 타입설정(text/html) 형식으로 전송 (Request Body 전달시 application/xml로 서버에 전달.)
conn.setRequestProperty("Content-Type", "application/xml");
 
// 타입설정(application/json) 형식으로 전송 (Request Body 전달시 application/json로 서버에 전달.)
conn.setRequestProperty("Content-Type", "application/json");
 
// 컨트롤 캐쉬 설정
conn.setRequestProperty("Cache-Control","no-cache");
 
// 타입길이 설정(Request Body 전달시 Data Type의 길이를 정함.)
conn.setRequestProperty("Content-Length", "length")
 
// User-Agent 값 설정
conn.setRequestProperty("User-Agent", "test"); 
 
// OutputStream으로 POST 데이터를 넘겨주겠다는 옵션.
conn.setDoOutput(true);
 
// InputStream으로 서버로 부터 응답을 받겠다는 옵션.
conn.setDoInput(true);
 
// Request Body에 Data를 담기위해 OutputStream 객체를 생성.
OutputStream os = conn.getOutputStream();
 
// Request Body에 Data 셋팅.
os.write(body.getBytes("euc-kr"));
 
// Request Body에 Data 입력.
os.flush();
 
// OutputStream 종료.
os.close();
 
// 실제 서버로 Request 요청 하는 부분. (응답 코드를 받는다. 200 성공, 나머지 에러)
int responseCode = conn.getResponseCode();
 
// 접속해지
conn.disconnect();

출처: [이용범의 잡다한 개발이야기]

 

반응형

파일읽어서 String 얻기(File,InputStreamReader,BufferedReader)

Posted on 2020. 11. 25. 18:02
Filed Under Programming/Java


//파일읽어서 String 얻기
public String getZoneFileToString(String filePath)
{
	if (filePath == null || "".equals(filePath)) {
		System.out.println("파일경로 입력바람 오바!!");
//		throw new AssertionError();
		return null;
	}

	StringBuffer strBuffer = new StringBuffer();
	InputStreamReader inputStReader = null;
	BufferedReader reader = null;
	String line = null;
		
	File file = new File(filePath);
	if(!file.exists()){
		System.out.println("해당 파일경로의 파일이 없음!!");
		return null;
	}
	try {
		
		inputStReader = new InputStreamReader(new FileInputStream(file), "euc-kr");
		reader = new BufferedReader(inputStReader);
		
		while (true) {
			line = reader.readLine();
			if (line == null) {
				break;
			}
			strBuffer.append(line);
			strBuffer.append("\n");
		}
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		try {
			if (reader != null) reader.close();
			if (inputStReader != null) inputStReader.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	return strBuffer.toString();
}

반응형

Windows 10의 OpenSSH 설치 실패시

Posted on 2019. 9. 2. 14:56
Filed Under Programming/개발환경+도구

1) Windows 10에서 OpenSSH Server/Client 를 설치 가능

2) 설치방법: 시작 > 앱 > 설정 > 앱 및 기능 > [선택적 기능 관리] > [기능 추가] 

   > OpenSSH Server/Client 설치

3) 설치진행은 되지만 메뉴가 없어서 [선택적 기능 기록 보기]를 확인하니 설치 실패

4) 구글링해서 해결

https://social.technet.microsoft.com/Forums/ie/en-US/ef10f8eb-fee0-4cde-bb01-52d1db2ea347/win10-1709-add-feature-fails-with-error-0x800f0954?forum=win10itprogeneral

▼보고 해결한 댓글

...더보기

Had the same issue with clean Windows 10 Ent in domain. Here is the fix:
1. regedit
2. HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU
3. UseWUServer -> 0
4. net stop wuauserv && net start wuauserv from cmd
Hope this helps.

- itezlo

5) 댓글대로 레지스트리 변경 및 Windows Update 서비스 재시작하고 설치하니 성공함.

 

6) 의심되는 원인

  윈도우10 버전별로 Open SSH 가 약간씩 다르다고함.

  #시작메뉴 > PC설정 > 시스템 > 정보

윈도우10 버전 정보 확인하기

 

 

- END -

반응형

아스키 코드(ASCII CODE) 테이블

Posted on 2014. 2. 11. 17:59
Filed Under Programming/Basic

반응형

FTP active모드와 passive 모드?

Posted on 2011. 8. 19. 18:04
Filed Under Programming/Network


FTP 의 Active 모드와 Passive 설명▼
http://blog.naver.com/geeksblog/20028104462

Linux/Windows passive 모드 설정 방법▼
http://lovelgw.nepc.name/Blog/73
반응형

[CVS] Tag 달기

Posted on 2011. 5. 30. 14:31
Filed Under Programming/개발환경+도구


1) 릴리즈 마다 Tag 달기
REL_{version} 또는 REL_{날짜}

2) 버그 수정 전/후에 달기
DEBUGPRE_
DEBUGPOST_

♣ 참고: http://blog.naver.com/j6040148/120017798790


 

반응형

간단한 스크립트 만들기 예.

Posted on 2010. 7. 15. 15:28
Filed Under Programming

OracleInstant Client 정보를 찾던중
어떤 분이 관련 환경변수를 설정해주는 스크립트를 작성한 것을 보았다.
스크립트 샘플▼



vbs가 뭘까?

vbs는 wscript (Windows script host)에 의해 실행.
http://www.microsoft.com/downloads/details.aspx?familyid=47809025-D896-482E-A0D6-524E7E844D81&displaylang=en
Windows Script 5.7 for Windows XP

오호!

<첨부출처: http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=45&MAEULNO=18&no=401>


 

반응형

[CVS] CVS 서버 IP/도메인 변경시 대처하는 방법 [펌글]

Posted on 2010. 3. 5. 19:37
Filed Under Programming/개발환경+도구

<출처: http://dolba.net/tt/k2club/entry/How-To-Relocated-CVS-Server>

혼자 개발을 하는 프로젝트가 많이 있지만, 회사 데스크탑과 노트북 그리고 집에서 일을 하는 경우 집에 있는 데스크탑의 각각의 프로젝트를 동기화 시키기 위해 CVS를 사용하고 있다.

CVS를 이용함으로써, 3개의 데스크탑과 노트북에서 동일한 소스를 가지고 작업을 할 수 있게 되는데, 서버 아이피가 고정 아이피인 경우에는 그럴일이 드물겠지만, 유동 아이피를 사용한다던가 혹은 서버 아이피/도메인이 어떤 사정에 의해 변경되었을때는 Commit/Update 작업이 되지 않아 상당히 골머리를 썩게 한다.

TortoiseSVN의 경우에는 "Relocate" 메뉴를 지원한다고 하는데, (관련 링크 : http://junho85.tistory.com/10)
사용자 삽입 이미지

이미지 출처 : http://junho85.tistory.com/10



내가 사용중인 CVS에서는 저런 메뉴는 보이지도 않는다.

결국 이런 경우에는 다시 checkout 을 하거나 CVS/Root 파일내에 아이피 정보를 모두 수정 해 주어야 한다.

:pserver:cvsid@변경전 아이피:/var/repo:pserver:cvsid@변경후 아이피:/var/repo 로...

뭐 이걸 일일이 수작업으로 변경하는 일은 프로젝트의 규모가 크지 않은 경우라면 관계없지만, 프로젝트 규모가 큰 경우에는 수정해야할 "root" 파일의 갯수만 해도 수백개가 된다. 결국 매번 저런 작업을 한다는것은 무리라는 얘기...

그래서 리눅스에서는 perl 스크립트를 이용하여 변경작업을 하여주고,
find ./ -name "Root" -exec perl -pi -e 's/변겅전IP/변경후IP/g' {} \;

윈도우에서는 AcroEdit나 기타 파일 내용 바꾸기가 가능한 툴을 이용해서 변경 작업을 해주면 된다.

하지만!!!!! CVS 서버 주소의 변경이 빈번하게 일어나는 일이 아니기때문에 저런 형태로의 대응 방법도 괜찮겠지...

저 방법보다 좀더 깔끔한 방법을 소개하고자 한다. 현재 본인이 사용하고 있는 방법인데 굉장히 편하다.

자 그 방법에 대해 알아보도락 하자.

1. C:\Windows\System32\Drivers\Etc 폴더를 보면 "hosts"라는 파일이 존재하는데 해당 파일을 약간만 수정해줌으로써, CVS 서버에 관해 좀더 유연한 대처를 할 수 있게 된다.

해당 파일의 내용을 살펴보자.
# Copyright (c) 1993-1999 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

127.0.0.1       localhost

위의 내용에서 보면 127.0.0.1 / localhost 라는 내용을 볼 수 있는데, 127.0.0.1이라는 아이피 주소를 localhost라는 영문명(도메인명)으로 별명을 지어주는 역할을 할 수 있다.

2. 이를 이용하여 저 hosts 파일에 아래의 내용을 넣어보자.

192.168.0.100             my_cvs_server

이후에 CVS 서버에 새로운 모듈을 만들거나 CheckOut / Commit / Update를 수행할때 아래와 같이

:pserver:cvsid@my_cvs_server:/var/repo  의 형태로 하게 되면 서버 아이피가 바뀔때마다 hosts 파일만 손봐주면 손쉽게 CVS를 이용할 수 있게 된다.

애초에 CVS 서버 주소를 "my_cvs_server" 나 기타 자신이 좋아하는 영문 이니셜등으로 하자라는 얘기!!!
반응형

2/10 iPhone 세미나 요점

Posted on 2010. 2. 11. 10:59

보호되어 있는 글입니다. 내용을 보시려면 비밀번호를 입력하세요.

SVN 호스팅 사이트 3곳 - 유무료 [펌]

Posted on 2010. 1. 6. 10:44
Filed Under Programming/개발환경+도구

출처: http://trend21c.tistory.com/768
Subversion(SVN)은 소프트웨어 버전 관리 시스템입니다.

소프트웨어 개발에 있어서 버전관리가 필요한 가장 큰 이유는 팀프로젝트의 경우 공동작업을 하기 때문입니다.

버전관리프로그램을 사용하면 다음과 같은 장점이 있습니다.


1. 개발 버전과 릴리즈버전이 섞이지 않고 쉽게 관리 할 수 있다.
2. 소스를 잘못 수정하더라도 기록이 남고 되돌리기가 쉽다.
3. 소스의 수정, 추가, 삭제 등의 기록이 남고 변경사항이 추적 가능하다.
4. 별도의 소스 코드 백업을 하지 않아도 된다.

가장 널리 사용되고 있는 CVS도 역시 버전관리프로그램의 하나 입니다.

버전관리 프로그램에 대한 설명은 이쯤에서 마치도록 하고

버전관리 프로그램에 대한 자세한 내용은 이곳에서 상세히 알아보실수 있습니다.



소프트웨어 개발에 있어서 많은 도움을 주는 SVN.
그런데 SVN이 설치하기에는 초보 서버관리자에게 있어서 그리 만만한 일이 아닙니다.
또한 SVN을 설치할 서버가 없는 경우도 더러 있고요.
그럴 경우에 소프트웨어 공동 개발을 위해서 SVN 호스팅 서버를 사용하게 될 일이 있습니다.

이에 SVN 호스팅 3곳을 소개합니다.



1. assembla (http://www.assembla.com/)

가장 일반적으로 사용되는 유료서비스모델은
$49/월 - 40명 - 10개의 저장소 - 5GB
입니다.


2. XP-Dev (http://www.xp-dev.com/)

무료서비스의 경우 200MB의 공간과 2개의 비밀프로젝트를 개설가능합니다.
하지만 SSL이 적용되지 않습니다.
가장 인기있는 유로모델은

$15/월, $144/년 4GB - 저장소무제한 - 사용자무제한 입니다.
관련: XP-DEV에서 무료 SVN 호스팅 받기




3. Unfuddle (http://unfuddle.com/)

무료로 200MB의 용량과 1개의 프로젝트 공간(2명까지 사용가능)을 줍니다.
역시나 무료서비스의 경우는 SSL이 적용되지 않습니다.
중간급의 유료모델이

$24/월 - 2GB - 10개프로젝트 - 20명 입니다.
반응형

삼각함수를 쉽게 배워봅시다. #6 - 나도 삼각함수 그래프를 유도 할 수 있다!

Posted on 2009. 7. 3. 11:41
Filed Under Programming/설계+분석+이론

<출차: http://blog.naver.com/azu016/110045274891 >

1. 일단 삼각함수의 sin, cos, tan 에 대해 생각해 봅시다.

 길고 어렵게 설명하지 않겠습니다. 그런만큼 수학적으로 설명이 애매하거나 오류가 있을 수도 있겠지요.

가볍게 설명한다는 취지이고, 또 제 전공이 수학관련이 아닌만큼 애매한 설명이 있더라도 이해 부탁드립니다.

여기 단위원(반지름이 1인 원)이 있습니다.

 

이 단위원의 반지름을 기준으로 삼각형을 그렸을때

라는 것은 다들 알고 계시죠?

아마 이 내용을 읽고 계시는 분들이라면 이것쯤은 다 알고 계실것으로 판단됩니다.

그럼 지금부터 이 내용을 알고 계신다는 전제 하에 설명을 시작하도록 하겠습니다.

 

지금부터 우리 할 일은 바로 이 박스안에 그림을 채워 넣는 일 입니다.

 

2. sin 그래프를 생각해보자.

 

앞서 보셨겠지만, sin은 어떻습니까? 분모는 1로 고정이 되어있고 분자는 y값이었죠? y값인 주황색 선에 주목하세요!

일단 1사분면인 0 ~ π/2 사이를 생각해 봅시다. 맨 처음에 세타(Θ)값은 0˚에서 출발하겠지요.

0˚ 일때는 y값이 존재하나요? 존재하지 않죠? 왜 존재하지 않냐구요?

각도가 없을테니 검은색 반지름선과 파란색 x축과 겹쳐 질 것 아니겠습니까? 그러면 주황색의 y값은 존재할까요? x축과 겹쳐있는데??

그림을 그리며 상상해보세요 ^^; 일단 y값이 0이라는 것을 알 수 있습니다. 그러면 sin 0˚는 0/1 = 0 이라는 것을 알게 되겠지요.

맨 처음에 시작하는 값은 0˚의 0이라는 값으로 시작합니다. 이제 점점 세타값인 각도에 변화를 줍시다.

각도를 크게 만들수록... 즉 세타값이 올라가면 올라 갈 수록 y값이 어떻게 되나요?
일단 y값이 x축보다 위에 있는 것을 보니 +값 인 것을 알 수 있네요. 그리고 막대기가 점점 길어진다는것. 값이 증가한다는것을 의미하죠?

 

자 그러면 생각해 봅시다.  0˚ ~ 90˚ 구간. 분모는 1로 고정이 되어있는데.. 세타값을 늘리면 늘릴수록 y값(주황색선)이 어떻게 됩니까?

+값인데 그 값이 점점 커짐을 알 수 있습니다. 그리고 그렇게 증가해서 90˚가 되었을때 y값이 얼마가 되나요?

바로 반지름과 똑같은 1이 된다는 것을 알 수 있습니다. 그러면 우리가 아까 채워야 하는 박스안을 이렇게 채울 수 있겠지요?

0 → π/2까지 증가 할 수록 값은 0 → 1로 점점 커지고 있으니까 아래와 같이 박스를 채울 수 있겠지요? ㅋ

자. 0도와 π/2사이인 1사분면에 대해서는 분석이 끝났습니다. 그렴 2사분면인 π/2부터 π까지를 또 분석해 볼까요?

역시 sin값의 정의는 분모는 1. 분자는 y. 그러면 2사분면에서도 아까와 마찬가지로 y값이 어떻게 변화하는지만 찾아내면 두번째 칸도

자연스럽게 그림을 그려 나갈 수가 있겠지요? 자 그럼 다시 생각해 봅시다. 맨처음에 0이었던 y값이 점점 오르고 올라서 1이 되었습니다.

그럼 2사분면에서의 시작값은 1이 되겠지요. 각도가 증가 할 수록 어떻게 될까요? 직접 선을 따라 그려보시면 아시겠지요?

y값인 주황색선은 x축 위에 있으니까 +값이긴 한데.. 그 절대값이라 할 수 있는 길이가 점점 짧아지고 있습니다.

그 길이가 짧아져서 결국 각도가180˚ 파이(π)값이 되면 다시 0으로 돌아옴을 알 수 있습니다.. 그럼 상자에도 그림을 채울 수가 있겠지요.

π/2도 → π까지 증가 할 수록 값은 1 → 0로 점점 작아지고 있으니까..

여기까지 이해가 되신거면 이제 다 따라오신겁니다. ㅎㅎ;; 3사분면 4사분면도 그대로 따라하시면 되겠습니다.

스스로 한 번 삼각형을 그려보세요. 3사분면은 어떻게 되나요? y값의 주황색선 그래프의 막대기가 길어지나요? 짧아지나요?

길어지고 있지요? 길어지긴 하는데.. 그 방향이 어디인가요? 바로 x축보다 아래로 증가하고 있다는 것 알 수 있나요?

그렇다면 x축 아래에 있으니까 -값이면서 막대기가 길어진다.. 즉 '마이너스값'이 '증가' 한다는 것을 알 수 있습니다.

π/2도 → 3π/2까지 증가 할 수록 막대기가 길어집니다. 막대기가 길어진다는건 값이 커진다는 의미!!

근데 그 방향이 어디다? 마이너스다! 즉 마이너스값이 점점 커지고 있으니까..

자 이제 다 채웠습니다!! 여기까지 이해 하셨다면 이제 4사분면 그리기도 쉽게 하실 수 있으실 겁니다. 자 4사분면 그리기는 숙제~

해설만 해드릴께요. y값(주황색선)이 점점 작아지고 있지요? 결국 어디로 돌아옵니까? 다시 0으로 돌아오는 것을 알 수 있지요?

 

 

이렇게 sin곡선을 그려보았습니다. 어때요? 어려운 부분이 있었나요?

cos곡선 tan곡선도 위와 같은 방식으로 유도를 해 나가시면 되겠습니다.

 

cos곡선 같은경우에도 똑같습니다. 분모는 1로 고정이 되어있는데 아까와는 다르게 분자값만 x값으로 바뀐거 뿐이지요.

그럼 아까와 같이 똑같이 그릴 수 있겠지요? sin 에서는 y였던것이 cos에서는 x로 바뀐것 과 다름 없으니까요.

맨처음 x값은 1로 시작해서 세타값이 점점 커지면 커질수록 x값이 점점 어떻게 되나요? 점점 작아지고 있다는 것을 알 수 있지요?

1사분면의 경우 cos값의 경우 1로 시작해서 0으로 끝난다는 것을 알 수 있습니다.

2사분면의 경우 각도가 커지면 커질수록 파란색 x값의 길이가 길어지는게 보이시나요? 안보이신다구요?

아까 sin 그래프를 설명했을때 쓰던 그림을 보세요 ㅎㅎ; 이제 2사분면에서 각도가 커지면 커질수록 파란색선이 길어지는게 보이시죠?

근데 그 길어지는 값이 어떤가요? 점점 왼쪽으로 커진다는것은.. 무엇을 의미할까요? 바로 마이너스. 음수값이 커진다는 것이죠.

그러면 2사분면의 첫번째 값은 0으로 시작해서 -1로 끝난다는거 알 수 있나요?

3사분면은 각도가 커질수록 x값이 작아지고 있지요. -1에서 0으로 이동.

4사분면은 각도가 커질수록 x값이 커지는데.. 그 커지는 방향이 오른쪽이죠. +방향입니다.

이를 종합하면..

와 같은 그림을 그리실 수 있으실 겁니다. ^^;

 

 

 

tan 그리기가 어렵다고 느끼시는 분들이 많으실거 같은데요..

역시 같은 방법입니다.. 각 사분면에서 x값과 y값이 어떻게 변화하는지는 잘 캐치해 보세요 ^^;

중요한 것은 이것 입니다. 이 두가지만 생각하세요.

 

1. x값 또는 y값의 막대기가 길어지고 있느냐 짧아지고 있느냐. (절대값)

2. x값, y값이 어디에 몇 사분면에 위치하느냐. (부호) -> ex) 2사분면 x값은 -, y값은 +    3사분면 x값은 -, y값은 -

 

이 두가지를 생각하며 아래에 있는 탄젠트 그래프에 그려진 실선을 따라 그림을 잘 생각해 보세요.

그러면 그림이 이렇게 나오실 겁니다.^^;

사실은 박스 위로도 선이 계속 증가해야 하지만 이해를 돕기위해 구간을 1 ~ -1만 잡았습니다.

이해를 돕기 위해 각 사분면 별로 색깔을 구별했습니다. 1사분면은 파란색, 2사분면은 녹색, 3사분면은 빨간색, 4사분면은 주황색입니다.

각 사분면 별로 그림이 저렇게 나올겁니다. 이렇게 보니까 그림이 뭔가 아니다 싶다구요?

이렇게 보니까 이해가 되시나요? 점선으로 표시된 부분이 그래프를 그리면서 생략된 부분입니다. 원래는 계속 그래프가 이어져 나가겠죠.

이 그림을 통해서 왜 tan 주기가 π인지도 알 수 있습니다. 그렇죠? 4개의 정사각형의 그림(0 ~ π까지)이 계속 반복되고 있다는 것.

보이시죠? 안보이세요? 파란색선이랑 초록색선이랑 한 묶음, 빨간색선이랑 주황색선이랑 한 묶음이잖아요... 이제 이해 되셨죠?

주기라는 의미를 정확히 알고 계신다면 그 부분까지도 파악 하셨으로 것으로 생각됩니다.


반응형

VisualSVN (for VS2003, 2005, 2008) 사용기간 만료 해제

Posted on 2009. 7. 1. 11:38
Filed Under Programming/개발환경+도구

http://www.visualsvn.com
Last Version 1.7.3

다시 깔아도 구매안내 창이 뜬다.
아래 레지스트리 키(VisualSVN) 삭제하고 재설치하면 사용기간이 리셋된다.

[HKEY_LOCAL_MACHINE\SOFTWARE\VisualSVN\VisualSVN]
"License"="p::@p:;;<><<::C;?B?:A?m?;"


※ 재설치하지 않고도 되는지 다음에 테스트해보자!

반응형

[LOG] 로그 남기기 메시지 유형

Posted on 2009. 6. 19. 13:01
Filed Under Programming/Basic


“second data reading failed. cause = [IOException message=“socket read failed.”]peer=“10.10.10.13” port=1234  auth=“base23” thread=32”
반응형

StarUML

Posted on 2009. 6. 17. 16:35
Filed Under Programming/개발환경+도구

StarUML
http://staruml.sourceforge.net/

Screenshot
Screenshot: Class Diagram


반응형

[펌] 초간단 TinyXml 사용 방법

Posted on 2009. 6. 16. 15:25
Filed Under Programming/Basic

초간단 TinyXml 사용 방법

TinyXML: http://www.sourceforge.net/projects/tinyxml


작성자
:
최흥배 ( jacking75@gmail.com )
문서 최종 수정일 : 2004.10.09

 

--- 예제로 사용 될 xml 문서

<?xml version="1.0" encoding="euc-kr"?>

 <MAJAK>

 <LOBBY_CONTROL>

 <OptionIndex="1125"X="697"Y="3"W="18"H="15">로비옵션</Option>

 <WindowHideIndex="1160"X="732"Y="3"W="18"H="15">숨기기</WindowHide>

 <LobbyChangeIndex="1027"X="32"Y="40"W="116"H="40">로비나가기</LobbyChange>

 <EnterRoom Index="1033" X="152"Y="40" W="116"H="40">방들어가기</EnterRoom>

 <MakeRoom Index="1011"X="276"Y="40" W="116" H="40">방만들기</MakeRoom>

 <RoomInfo Index="1015" X="398" Y="40" W="116" H="40">관전자정보</RoomInfo>

 

 <RoomList Index="1002" X="28" Y="94" W="507" H="257">방리스트</RoomList>

 <UserList Index="1037" X="568" Y="102" W="216" H="233">유저리스트</UserList>

  

<FindText Index="1090" X="603" Y="360" W="87" H="20">유저찾기입력</FindText>

 <IDFind Index="1091" X="693" Y="360" W="20" H="18">ID 찾기</IDFind>

  

<IsWhisper Index="1088" X="717" Y="357" W="12" H="10">귓속말설정</IsWhisper>

 <IsInvite Index="1089" X="717"Y="373" W="12" H="10">초대설정</IsInvite>

  

 

<ChatInput Index="1035" X="34" Y="500" W="416" H="18">채팅입력</ChatInput>

 <Charging Index="1005" X="461" Y="498" W="60" H="20">신고</Charging>

 <Banner Index="2000" X="10" Y="536" W="545" H="44">배너</Banner>

  

<QuickStart Index="1084" X="573" Y="550" W="100" H="24">바로시작</QuickStart>

 <FullScreen Index="1172" X="677" Y="550" W="100" H="24">전체화면</FullScreen>

 <Windowed Index="1173" X="677" Y="550" W="100" H="24">화면</Windowed>

 <Avata X="577" Y="420" W="56" H="111">아바타</Avata>

 </LOBBY_CONTROL>

 <ROOM_CONTROL>

 <GAME_BTNIndex="7000"X="706"Y="0"File=".\\data\\Gbtn_Capture.spr">화면캡쳐</GAME_BTN>

 <GAME_BTNIndex="7001"X="729"Y="2"File=".\\data\\Gbtn_WndMin.spr">숨기기</GAME_BTN>

 <GAME_BTNIndex="7003"X="773"Y="2"File=".\\data\\Gbtn_WndClose.spr">나가기</GAME_BTN>

 <GAME_BTNIndex="7004"X="640"Y="509"File=".\\data\\Gbtn_Entry.spr">참여</GAME_BTN>

 <GAME_BTNIndex="7005"X="640"Y="509"File=".\\data\\Gbtn_Observe.spr">관전</GAME_BTN>

 <GAME_BTNIndex="7017"X="682"Y="509"File=".\\data\\Gbtn_ObserveInfo.spr">관전자정보</GAME_BTN>

 <GAME_BTNIndex="7006"X="745"Y="509"File=".\\data\\Gbtn_Option.spr">설정</GAME_BTN>

 <GAME_BTNIndex="7007"X="640"Y="539"File=".\\data\\Gbtn_Invite.spr">초대</GAME_BTN>

 <GAME_BTNIndex="7008"X="689"Y="539"File=".\\data\\Gbtn_112.spr">신고</GAME_BTN>

 <GAME_BTNIndex="7009"X="738"Y="539"File=".\\data\\Gbtn_Out.spr">방 나가기</GAME_BTN>

  

<GAME_BTNIndex="7010"X="172"Y="578"File=".\\data\\MajakBtn_Bbong.spr">뽕</GAME_BTN>

 <GAME_BTNIndex="7011"X="213"Y="578"File=".\\data\\MajakBtn_Jji.spr">찌</GAME_BTN>

 <GAME_BTNIndex="7012"X="254"Y="578"File=".\\data\\MajakBtn_Kkang.spr">깡</GAME_BTN>

 <GAME_BTNIndex="7013"X="295"Y="578"File=".\\data\\MajakBtn_Rich.spr">리치</GAME_BTN>

 <GAME_BTNIndex="7014"X="336"Y="578"File=".\\data\\MajakBtn_Cheumo.spr">츠모</GAME_BTN>

 <GAME_BTNIndex="7015"X="377"Y="578"File=".\\data\\MajakBtn_Rone.spr">론</GAME_BTN>

 <GAME_BTNIndex="7016"X="418"Y="578"File=".\\data\\MajakBtn_Pass.spr">패스</GAME_BTN>

 <GAME_BTNIndex="7018"X="266"Y="400"File=".\\data\\Gbtn_Start.spr">게임시작요청</GAME_BTN>

  

<GAME_BTNIndex="7019"X="190"Y="478"File=".\\data\\MaJakResult_Btn.spr">결과창의OK</GAME_BTN>

 </ROOM_CONTROL>

 <ROOM_LAYOUT>

 <USERINFO_POSNUM="0"X="12"Y="32">왼쪽상단</USERINFO_POS>

 <USERINFO_POSNUM="1"X="514"Y="32">오른쪽상단</USERINFO_POS>

 <USERINFO_POSNUM="2"X="563"Y="557">오른쪽하단</USERINFO_POS>

 <USERINFO_POSNUM="3"X="62"Y="562">왼쪽하단</USERINFO_POS>

 </ROOM_LAYOUT>

 </MAJAK>

 ----------

  

1. TinyXml을 사용 할려면

 

- 먼저 TinyXml 라이브러리를 다운 받은 후 빌더를 해야된다. 빌더를 할 때는 이 라이브러리를 사용할 프로젝트가 싱 쓰레드인지 멀티 쓰레드 인지에 따라서 tinyXml쓰레드 옵션을 설정 후 빌드를 해야된다.

 - 빌드가 끝나면 사용할 프로젝트에서 lib파일을 링크 시킨다.

 - tinyxml.h, tinyxml.cpp, tinyxmlerror.cpp, tinyxmlparser.cpp를 프로젝트 폴더에 포함시킨다.

 - 위 파일 중 tinyxml.h파일만 소스에서 include 하면 된다.

 - 사용할 프로젝트가 만약 mfc 프로젝트로 stdafx 파일을 사용한다면 tinyxml.cpp, tinyxmlerror.cpp, tinyxmlparser.cpp 의 상단에 #include stdafx.h를 입력해야 된다.

 - TinyXml을 사용한 후 따로 delete로 지울 필요는 없다( 즉TiXmlNode* node; 이렇게사용된것들..).

  

2. xml 파일 읽기

 - TiXmlDocument doc( "MaJak_Para.xml" );

doc.LoadFile();

  

- TiXmlDocument m_XmlDoc;

  if( m_XmlDoc.LoadFile("MaJak_Para.xml" ) == false )

       return ERR_LOADXML;

  

3. 노드의 이동

 - 루트에서시작하여바로 Option 노드로이동할려면

TiXmlNode* node = doc.FirstChild("MAJAK")->FirstChild("LOBBY_CONTROL")->FirstChild( "Option" );

 - 루트에서 LOBBY_CONTROL노드로이동할려면

node = doc.FirstChild();

node = node->NextSibling();

 int Pos = 1

for( i = 0; i < Pos; ++i )

{

    node = node->FirstChild();

} 

여기에서 Pos 2하면 LOBBY_CONTROL노드의첫번째자식까지이동한다.

 - LOBBY_CONTROL 노드에있는상태에서노드의자식LobbyExit노드로바로갈려면

node = node->FirstChild( "LobbyExit" ); 
-노드의값을볼려면 node->Value()하면문자가나온다.

 - 도큐먼트의 top 레벨의기준으로해서자식노드로이동할려면

 count = 0;

for( node = doc.FirstChild();

      node;

      node = node->NextSibling() )

{

    count++;

}

 

// 아래서위로이동할려면

count = 0;

 for( node = doc.LastChild();

    node;

    node = node->PreviousSibling() )

{

    count++;

}

  

// 이터레이터를사용

count = 0;

for( node = doc.IterateChildren( 0 );

      node;

      node = doc.IterateChildren( node ) )

{

     count++;

}

  

4. 노드의애트리뷰트값을얻기

 - 현재노드에서모든자식노드의애트리뷰트값을얻을려면다음과같이한다.

 

node = node->FirstChild();

CONTROL_RECT ControlRect;

TiXmlElement* elem;

 

while( node != NULL )

{

    elem = node->ToElement();

    elem->Attribute( "Index", &ControlRect.index )

    elem->Attribute( "X", &ControlRect.x );

    elem->Attribute( "Y", &ControlRect.y );

    elem->Attribute( "W", &ControlRect.w );

    elem->Attribute( "H", &ControlRect.h );

 

    node = node->NextSibling();

}

 Attribute 리턴값으로애트리뷰트값의문자형을얻을있다.

  

 

- 애트리뷰트이동방법

// 노드의애트리뷰트에서마지막애트리뷰트까지이동

count = 0;

 for( element = todoElement->FirstChildElement();

      element;

      element = element->NextSiblingElement() )

{

     count++;

}

 

5. 애트리뷰트를 얻을 수 있도록 노드 대신 element를 얻는 방법

node = node->FirstChild();

TiXmlElement* Rootelem = node->NextSiblingElement( _strNodeName );

TiXmlElement* elem = Rootelem->FirstChildElement( _strSubNodeName );

elem->Attribute( "Index", &iIndex );

 

6. 애트리뷰트의첫버째속성과다음속성을얻는방법

 

TiXmlAttribute* Attribut;

Attribut = elem->FirstAttribute()

  

// 정수스트링을얻을있다.

Attribut->IntValue();
Attribut->Value();

  

// 다음애트리뷰트값을얻을렴ㄴ

Attribut = Attribut->Next();

 


<출처: http://jacking.springnote.com/pages/2844150>
<글주인블로그: http://blog.naver.com/jacking75>

반응형

About

by 쑤기c

반응형