비트 연산자를 통한 각 비트의 설정 값(1, 0) 얻어오기

int getAbit(unsigned short x, int n) 
{
 return (x & (1 << n)) >> n;
}

 

각 비트 값 설정

unsigned short setAbit(unsigned short x, int n, int value) 
{
 if (value == 1)
  return (unsigned short) (x | (1 << n));
 else
  return (unsigned short) (x & (~(1 << n)));
}

 

참조용 소스 업로드

 

TryIconAgent.zip

 

libcurl.lib 를 링크하여 사용하는 경우

 

error LNK2019: __imp__curl_global_init
error LNK2019: __imp__curl_global_cleanup
error LNK2019: __imp__curl_easy_cleanup
error LNK2019: __imp__curl_easy_perform
error LNK2019: __imp__curl_easy_setopt
error LNK2019: __imp__curl_easy_init

 

위와 같은 에러 메시지를 보게 될 수 있다.

 

이는 static lib를 사용하겠다는 명시를 하지 않아서 발생하는 에러로 CURL_STATICLIB 를 전처리기에 추가하거나 curl.h include 전에 #define 으로 선언해 주면 된다. 

MS-SQL 을 사용하다 보면 가끔 GMT 시간이 맞지 않을 경우가 있는데, SELECT Query를 수행할 때 시간 값을 적용해서 가져오는 방법이 있어 공유 하기로 한다.

CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, SEARCH_S_DATE), '+09:00'))

CONVERT, SWITCHOFFSET의 경우 MS-SQL에서 기본 제공되는 함수이고,

datetime, datetimeoffset의 경우 해당 함수에서 어떤 형식으로 변환 할 것인지 설정하는 매개변수 값이다.

 

자세히 살펴 보자면,

CONVERT(datetimeoffset, SEARCH_S_DATE)    // Date1

 

의 의미는 SEARCH_S_DATE라는 컬럼(이때 컬럼은 datetime이든 varchar이든 상관 없음)의 값을 datetimeoffset 형태로 변환한다는 뜻이고,

SWITCHOFFSET(..., '+09:00')    // Date2

 

는 시간 형태로 변환 된 값에 실제 원하는 값만큼 offset을 적용한다는 것이며(이때 도출되는 값의 형태는 맨 뒤에 +09:00가 항상 붙어 있음),

CONVERT(datetime, SWITCHOFFSET(...))    // Date3

 

의 뜻은 offset 적용 값을 지우고 일반적인 날짜 포맷으로 설정한다는 뜻이다.

최종적으로 실제 쿼리를 적용해 보면 다음과 같이 나옴을 알 수 있다.

 

 

 

최근 Database 입력 툴을 만들다 보니 많은 쿼리문을 배열로 묶어서 for문을 이용해 동작시키는 경우가 있어 2차원 배열을 쓰게 되었다.

 

TCHAR *pszQuery[] = {
	"", ""
};
int size;

// 배열 행의 개수
size = sizeof(pszQuery)/sizeof(pszQuery[0]);

// 배열 열의 개수
size = sizeof(pszQuery[0])/sizeof(pszQuery[0][0]);

// 배열 개수
size = sizeof(pszQuery)/sizeof(pszQuery[0][0]);

 

 

이상

 

 

IE의 경우 버전별로 같은 CSS 값이라도 다르게 표현되기도 하는데 이를 위해 버전 별로 값을 설정 할 수 있는 방법이 존재한다.

 

1. CSS 파일 가져올 때

 

<link href="{CSS파일}" rel="stylesheet" type="text/css" />
<!-- [if IE 7]<link href="{CSS파일}" rel="stylesheet" type"text/css" /><![endif]-->

 

if lt IE 7      : 7 제외하고 낮은 버전에서

if gt IE 7     : 7 제외하고 높은 버전에서

if lte IE 7    : 7 포함하고 낮은 버전에서

if gte IE 7   : 7 포함하고 높은 버전에서

 

2. STYLE 안에서 지정 할 때
.body { property:value; *property:value; _property:value;}

* : IE 7 이하

_ : IE 6 이하

 

 

1. 개요

C++/MFC 등의 프로젝트에서 OLE DB를 사용하여 MS-SQL에 직접 연결하고자 하는 경우 연결에 사용하는 문자열을 쉽게 작성하기 위한 방법

 

2. 방법

1. txt파일을 만드시고 이름을 XXXX.udl로 변경

2. 저장한 파일 더블클릭

3. 데이터 연결 속성-공급자 탭에서 Microsoft OLE DB Provider for SQL Server 선택

4. 연결탭에서 서버명과 암호 데이터베이스를 선택한 후 연결테스트

5. 연결테스트가 성공이라면 확인 버튼을 누른 후 실행한 파일을 텍스트 편집기로 읽기

 

[oledb]

; Everything after this line is an OLE DB initstring

Provider=SQLOLEDB.1;Persist Security Info=False;User ID=XXXX;Initial Catalog=XXXX;Data Source=XXXX

 

1. 개요

이클립스에서 JSP 개발을 완료 한 후 실제 톰캣 서비스에 배포하는 경우, class로 작성한 java 파일의 경로를 찾지 못하는 문제가 간혼 발생한다.

 

보통 웹 파일의 경우 [Tomcat 설치 경로]\webapps\ROOT\ 폴더가 웹 서비스의 최상위 루트 폴더가 되기 때문에 해당 경로 안에 웹 파일들을 집어 넣으면(ROOT\test.jsp -> http://localhost:8080/test.jsp) 익스플로러를 통해 접근이 가능하다.

 

하지만 대부분은 ROOT 폴더 하위에 서비스하고자 하는 폴더 명(ex: ROOT\project\ -> http://localhost:8080/project/home.jsp) 을 지정하여 해당 폴더 안에 웹 파일들을 배치하는 경우가 대부분 일 것이다.

 

이렇게 서비스 할 시, 흔히 Database 연동을 위해 따로 Class로 선언하여 JSP에서 호출하여 사용하는 경우가 많은데 실제 톰캣에 올려서 서비스 해 보면 DB 연동을 위한 Class 파일을 찾지 못하는 경우가 발생한다.

 

 

이를 해결 해 보도록 하자.

 

2. 원인

 

sun.boot.class.path :
<%=System.getProperty("sun.boot.class.path")%>

sun.boot.library.path :
<%=System.getProperty("sun.boot.library.path")%>

java.library.path :
<%=System.getProperty("java.library.path")%>

java.class.path :
<%=System.getProperty("java.class.path")%>

getClassLoader() :
<%=this.getClass().getClassLoader()%>

DocumentBuilderFactory :
<%=javax.xml.parsers.DocumentBuilderFactory.newInstance()%>

/javax/xml.parsers/DocumentBuilderFactory.class :
<%=this.getClass().getResource("/javax/xml.parsers/DocumentBuilderFactory.class")%>

SAXParserFactory :
<%=javax.xml.parsers.SAXParserFactory.newInstance()%>

/javax/xml/parsers/SAXParserFactory.class :
<%=this.getClass().getResource("/javax/xml/parsers/SAXParserFactory.class")%>

TransformerFactory :
<%=javax.xml.transform.TransformerFactory.newInstance()%>

/javax/xml/transform/TransformerFactory.class :
<%=this.getClass().getResource(	"/javax/xml/transform/TransformerFactory.class")%>

Servlet :
<%=application.getMajorVersion()%>.<%=application.getMinorVersion()%>

JSP :
<%=javax.servlet.jsp.JspFactory.getDefaultFactory().getEngineInfo().getSpecificationVersion()%>

ServerInfo :
<%=application.getServerInfo()%>

RealPath :
<%=application.getRealPath("/")%>

ContextPath :
<%=request.getContextPath()%>

totalMemory :
<%=Runtime.getRuntime().totalMemory()%>

maxMemory :
<%=Runtime.getRuntime().maxMemory()%>

freeMemory :
<%=Runtime.getRuntime().freeMemory()%>

 

 

 

위 소스코드를 복사하여 info.jsp 에 저장하고 서비스 하고자 하는 폴더 안(ROOT\project\info.jsp)에 넣은 뒤 익스플로러에서 호출(http://localhost:8080/project/info.jsp) 해 보도록 하자.

 

페이지가 열리면서 경로들이 나열되게 되는데 여기서 핵심은 RealPathContextPath 이다.

 

필자가 의도하기로는 root 하위에 project 폴더에서 웹 서비스가 실행되기를 기대하지만 실제 경로를 확인해 보면 root 폴더 상에서 서비스가 되도록 설정 되어 있다. 웹 파일들(image, jsp, html)은 root\project 폴더에 등록되어 있기 때문에 호출하면 표시는 되지만 실제 뒷단에서 동작하는 class 들을 ContextPath가 root 폴더로 설정되어 있기 때문에 jsp에서 class 파일들을 호출하지 못 한 것이다.

 

3. 해결

그렇다면 톰캣 서버가 내가 원하는 경로로 설정되도록 맞춰 주기만 하면 되지 않을까?

이를 위해서는 [Tomcat 설치 경로]\conf\server.xml 파일을 주목하자.

 

우리가 주목해야 할 부분은 <Host ...> 로 시작하는 테그의 안쪽이다.

<Host ...>

<Context docBase="실제 서비스 할 폴더의 절대경로(ex: C:/Tomcat/webapps/ROOT/project/)" path="웹에서 호출 할 경로(ex: /project)" reloadable="true" />

</Host>

 

위와 같이 Context 태그를 설정하여 주고 톰캣 서버를 재시작 한 뒤 아까의 info.jsp 를 호출하여 보자.

RealPath, ContextPath가 본인이 설정한 경로로 되어 있는가? 그렇다면 이제 익스플로러에서 웹을 호출해 보도록 하자.

 

정상적으로 서비스가 동작할 것이다(아마도?)

1. 개요

안드로이드의 마이크로 5핀 단자에 시리얼 통신 장비를 연결 한 후, 안드로이드에서 패킷을 전송하고 수신 받아 화면에 표시하는 예제이다.

 

 

SerialTester.zip

 

1. 개요

 

C/C++ Project 중에서 SNMP를 통해 장비의 정보를 얻어오는 기능이 있다

net-snmp(www.net-snmp.org)라는 Open 소스를 이용하면 되는데, 이 때 장비의 각 성능을 얻어오기 위해 필요한 OID가 있어야 하기에 따로 정리해 두도록 한다.

 

2. OID

 

CPU Statistics

Load
1 minute Load: .1.3.6.1.4.1.2021.10.1.3.1
5 minute Load: .1.3.6.1.4.1.2021.10.1.3.2
15 minute Load: .1.3.6.1.4.1.2021.10.1.3.3

 

[CPU]
percentage of user CPU time: .1.3.6.1.4.1.2021.11.9.0
raw user cpu time: .1.3.6.1.4.1.2021.11.50.0
percentages of system CPU time: .1.3.6.1.4.1.2021.11.10.0
raw system cpu time: .1.3.6.1.4.1.2021.11.52.0
percentages of idle CPU time: .1.3.6.1.4.1.2021.11.11.0
raw idle cpu time: .1.3.6.1.4.1.2021.11.53.0
raw nice cpu time: .1.3.6.1.4.1.2021.11.51.0

 

[Memory Statistics]

Total Swap Size: .1.3.6.1.4.1.2021.4.3.0
Available Swap Space: .1.3.6.1.4.1.2021.4.4.0
Total RAM in machine: .1.3.6.1.4.1.2021.4.5.0
Total RAM used: .1.3.6.1.4.1.2021.4.6.0
Total RAM Free: .1.3.6.1.4.1.2021.4.11.0
Total RAM Shared: .1.3.6.1.4.1.2021.4.13.0
Total RAM Buffered: .1.3.6.1.4.1.2021.4.14.0
Total Cached Memory: .1.3.6.1.4.1.2021.4.15.0

 

[Disk Statistics]

The snmpd.conf needs to be edited. Add the following (assuming a machine with a single ‘/’ partition):

disk / 100000 (or)

includeAllDisks 10% for all partitions and disks

The OIDs are as follows

 

Path where the disk is mounted: .1.3.6.1.4.1.2021.9.1.2.1
Path of the device for the partition: .1.3.6.1.4.1.2021.9.1.3.1
Total size of the disk/partion (kBytes): .1.3.6.1.4.1.2021.9.1.6.1
Available space on the disk: .1.3.6.1.4.1.2021.9.1.7.1
Used space on the disk: .1.3.6.1.4.1.2021.9.1.8.1
Percentage of space used on disk: .1.3.6.1.4.1.2021.9.1.9.1
Percentage of inodes used on disk: .1.3.6.1.4.1.2021.9.1.10.1

System Uptime: .1.3.6.1.2.1.1.3.0

+ Recent posts