티스토리 툴바

블로그 이미지
관리자의 줄어가는 뇌세포를 대체하기 위한 블로그 로리시아

카테고리

분류 전체보기 (111)
Web 2.0 (2)
Book Review (9)
Private Info (0)
Programmin Info (78)
A.I (6)
Data (5)
Code Snippet (11)
Total29,514
Today6
Yesterday11


구글 이미지 검색의 결과 이미지들을 수집해주는 프로그램.  
소스코드는 정리 후 공개



 [0.1.0.1]
- 최초 publish 버전
- 대상 프레임워크를 .NET Framework 3.5 Client Profile 로 변경
- 변경된 구글 이미지 검색결과 소스코드 적용
- ProgressBar, Icon 적용
Posted by Programming nerd 로리시아
std::vector::erase() 함수가 호출되는 순간, 이전에 획득했던 iterator는 무효화 된다.


std::vector[int] v;
v.push_back(1);

std::vector[int]::const_iterator	iteNow = v.begin(), iteEnd = v.end();

for ( ; iteNow != iteEnd ; )
{
	if ( (*iteNow) == 1 )
	{
		iteNow = v.erase(iteNow);
	}
	else
	{
		iteNow++;
	}
}


위에서 iteEnd iterator는 무효화 되었기 때문에, operator!= 를 수행하다 비정상 작동을 한다. 아래와 같이 고친다.

std::vector[int] v;
v.push_back(1);

std::vector[int]::const_iterator	iteNow = v.begin();

while ( iteNow != v.end() )
{
	if ( (*iteNow) == 1 )
	{
		iteNow = v.erase(iteNow);
	}
	else
	{
		iteNow++;
	}
}
Posted by Programming nerd 로리시아
Character Set과 Encoding, CodePage
- Character Set: 문자의 집합.
- Encoding: 문자의 집합 + 어떻게 표현될지를 결정하는 정보
- CodePage: (=Encoding)

MBCS / DBCS
- DBCS: Double-byte Character Set. 1글자가 1~2Byte로 표현된다.
- MBCS: Multibyte Character Set(=Variable-width encoding). / CP-949, EUC-KR, Latin-1, ...

UCS2/UCS4, UTF-7/UTF-8
- UCS2: Universal Character Set. 1글자가 무조건 2Byte로 표현된다. UCS4는 4Byte로 표현된다.
- UTF-7/8: Unicode Transformation Format. 1글자가 1~4Byte로 표현된다.
           ASCII기반의 문자셋을 유니코드에 호환시키기 위해 제안됨.
           ASCII범위(U+0000 ~ U+007F)의 문자는 1바이트만으로 표현되어 ASCII를 변환하지 않고 사용 가능하다.

wchar_t 형식
- wchar_t는 8비트로 표현 불가능한 글자를 표현하기 위해 제안된 타입이다. 컴파일러나 OS환경에 따라 크기가 다르다.
- 특정 Character Set이나 Encoding에 종속되지 않는 타입이나, 현재 wchar_t로 표현하는 Character Set은 
   유니코드가 유일하다. (UCS-2, UCS-4, UTF-16, UTF-32)
- char에 표현되는 MBCS의 경우 한 글자가 몇개의 char 요소를 차지하는지 알 수 없는 반면, 
   wchar_t는 한 글자가 하나의 wchar_t 로 표현되어 쉽게 글자 수와 Offset 처리가 가능하다.

유니코드 문자열 리터럴(L"...")
- C표준에서, C 소스코드는 ASCII로만 작성하도록 되어있다. 이렇게 작성된 소스코드에서는 
  wide string literal을 사용할 수 없기 때문에, 문자열 리터럴 앞에 L 을 붙여 컴파일러에 해당 문자열 리터럴을 
  유니코드로 변환하여 처리하도록 요구할 수 있도록 되어있다.
- 위의 내용도 마찬가지로 컴파일러에 따라 구현이 달라지며, MSVC의 경우 OS의 로케일 정보에 따라 
  wide string literal을 변환하여 처리하도록 되어있다.
Posted by Programming nerd 로리시아
c:\>echo %date% --> 2010-10-20
c:\>echo %time% -->  9:06:51:65  // 오전일 경우, 앞의 문자열이 공백으로 들어온다.

@echo off

set nowTime=%time: =0%  // %time% 값을 가져와, 공백을 0으로 치환
set hour=%nowTime:~0,2%  // nowTime 변수의 0~1번 문자열 substring
set min=%nowTime:~3,2%
set sec=%nowTime:~6,2%

set fileName=%date% %hour%-%min%-%sec%.log  // %date%와 위에서 만든 변수들을 합성
echo %fileName% --> 2010-10-20 09-06-51.log
Posted by Programming nerd 로리시아
자신을 실행시킨 부모 프로세스를 강제로 재시작 시키는 프로그램.

개발언어: C# (Visual Studio 2010), .NET Framework 2.0 필요.


< Source Code >



< ChangeLog >

[1.0.0.1]
- 실행 인자로 재시작 대기시간(ms)을 입력 받도록 구현
- 프로그램 아이콘 변경
- Bug Fix
   - 부모 프로세스의 정보를 알아올 수 없는 경우, 처리되지 않는 Exception이 발생하는 현상 수정

[1.0.0.0]
최초 배포판.
Posted by Programming nerd 로리시아

Virtual Serial Ports Emulator

Data / 2010/08/11 17:59
COM포트를 에뮬레이트 및 리다이렉트 해주는 프로그램.



Posted by Programming nerd 로리시아
증상: 음성 방송시, 사용자 접속 종료 시점에 클라이언트의 CPU점유율이 100% 까지 올라가면서 Freeze되는 현상
원인: 고정된 크기의 패킷을 받는 함수에서 소켓이 끊겼을 경우의 처리를 하지 않아 Infinite-Loop를 돌게 됨.

Buffer FixedSizeReceive(TcpSocket client, int size)
{
	int received = 0;
	unsigned char* buffer = new unsigned char[size];

	while ( received < size )
	{
		Buffer packet = client.Receive(size - received);
		memcpy(buffer + received, packet.GetBuffer(), packet.GetSize());

		received += packet.GetSize();
	}

	Buffer result(buffer, size);
	delete [] buffer;
	
	return result;
}
위의 코드를
Buffer FixedSizeReceive(TcpSocket client, int size)
{
	int received = 0;
	unsigned char* buffer = new unsigned char[size];

	while ( received < size )
	{
		Buffer packet = client.Receive(size - received);
		
		// 접속이 끊겼다면, 빈 버퍼를 반환한다.
		if ( packet.GetSize() == 0 )
		{
			delete [] buffer;
			return Buffer(0);
		}

		memcpy(buffer + received, packet.GetBuffer(), packet.GetSize());

		received += packet.GetSize();
	}

	Buffer result(buffer, size);
	delete [] buffer;
	
	return result;
}
로 수정
Posted by Programming nerd 로리시아
q={검색어}
http://www.google.co.kr/images?q=android

tbs=isz:{m|l|i} // 중간, 크게, 아이콘
http://www.google.co.kr/images?q=android&tbs=isz:m
http://www.google.co.kr/images?q=android&tbs=isz:l
http://www.google.co.kr/images?q=android&tbs=isz:i

tbs=isz:lt,islt:{qsvga|vga|svga|xga|2~70mp} // 크기 선택
http://www.google.co.kr/images?q=android&tbs=isz:lt,islt:qsvga : 400x300
http://www.google.co.kr/images?q=android&tbs=isz:lt,islt:vga : 640x480
http://www.google.co.kr/images?q=android&tbs=isz:lt,islt:svga : 800x600
http://www.google.co.kr/images?q=android&tbs=isz:lt,islt:xga : 1024x768
http://www.google.co.kr/images?q=android&tbs=isz:lt,islt:2mp : 1600x1200
http://www.google.co.kr/images?q=android&tbs=isz:lt,islt:4mp : 2272x1704
http://www.google.co.kr/images?q=android&tbs=isz:lt,islt:6mp : 2816x2112
http://www.google.co.kr/images?q=android&tbs=isz:lt,islt:8mp : 3264x2736
http://www.google.co.kr/images?q=android&tbs=isz:lt,islt:10mp : 3648x2736
http://www.google.co.kr/images?q=android&tbs=isz:lt,islt:12mp : 4096x3072
http://www.google.co.kr/images?q=android&tbs=isz:lt,islt:15mp : 4480x3360
http://www.google.co.kr/images?q=android&tbs=isz:lt,islt:20mp : 5120x3840
http://www.google.co.kr/images?q=android&tbs=isz:lt,islt:40mp : 7216x5412
http://www.google.co.kr/images?q=android&tbs=isz:lt,islt:70mp : 9600x7200

tbs=isz:ex,iszw:{width},iszh:{height} // 크기 지정
http://www.google.co.kr/images?q=android&tbs=isz:ex,iszw:100,iszh:100 : 100x100

tbs=ic:{gray|color|specific,isc:colorName} // 흑백, 칼라, 특정 칼라
http://www.google.co.kr/images?q=android&tbs=ic:gray
http://www.google.co.kr/images?q=android&tbs=ic:color
http://www.google.co.kr/images?q=android&tbs=ic:specific,isc:pink

tbs=itp:{face|photo|clipart|lineart} // 얼굴, 사진, 클립아트, 라인아트
http://www.google.co.kr/images?q=android&tbs=itp:face
http://www.google.co.kr/images?q=android&tbs=itp:photo
http://www.google.co.kr/images?q=android&tbs=itp:clipart
http://www.google.co.kr/images?q=android&tbs=itp:lineart

[ 예제 ] 키워드 'android' 이미지 중, 640x480 크기 이상의 클립아트 파란색 이미지
http://www.google.co.kr/images?q=android&tbs=isz:lt,islt:vga,itp:clipart,ic:specific,isc:blue
Posted by Programming nerd 로리시아
Html: http://www.whatismyip.com/
Automation Page: http://www.whatismyip.com/automation/n09230945.asp
Posted by Programming nerd 로리시아
TAG ip, LinK, Network
Posted by Programming nerd 로리시아
TAG API, C++, console
IP를 그룹/프로필 별로 관리하여 손쉽게 변경해주는 프로그램.

개발 언어: C# (Visual Studio 2008), .NET Framework 3.5 필요.
소스코드는 안정화 및 리팩토링 후에 공개.


< ChangeLog >

[1.0.0.0]

최초 배포판.
Posted by Programming nerd 로리시아
TAG C#, Utility

KeyShortcut

Programmin Info/개발 / 2010/06/15 18:43
지정된 시간동안 키보드가 눌렸을 경우 매핑된 프로그램을 실행시켜주는 유틸리티.

개발언어: C# (Visual Studio 2008), .NET Framework 3.5 필요
소스코드는 안정화 및 리팩토링 후에 공개.


< ChangeLog >

[1.0.0.1]

최초 배포판.
영문 윈도우XP에서 일부 UI가 비정상적으로 나옴.
Posted by Programming nerd 로리시아
TAG C#, Utility
참고: http://msdn.microsoft.com/en-us/library/w4ddyt9h.aspx

type time_t; 1970년 1월 1일 이후 지나간 초
struct tm; 년,월,일,요일,시간 정보

 
time_t time(time_t* timer); 시스템 타임 반환
tm* gmtime(time_t const* timer); time_t -> tm 변환
tm* localtime(time_t const* timer); time_t -> Local 기준 tm 변환


time_t _mkgmtime(tm* time) UTC 기준 tm -> time_t로 변환
time_t mktime(tm* time) Local 기준 tm -> time_t로 변환


char* asctime(tm const* ptr) tm -> 문자열 변환
char* ctime(time_t const* timer) time_t -> 문자열 변환


char* _strdate(char* dest); 시스템 날짜를 문자열로 반환
char* _strtime(char* dest); 시스템 시간을 문자열로 반환
size_t strftime(char* dest, size_t max, char const* format, tm const* time); 시간을 형식 문자열로 변환


struct _timeb; UTC시간(with ms), UTC<->Local 간 시간 차, SummerTime 정보
void _ftime(_timeb const* timer); _timeb 반환
void _tzset(); _ftime, localtime 함수에서 사용되는 시간 환경변수 설정

Posted by Programming nerd 로리시아
TAG C++, Time

ramdisk

Data / 2010/06/10 18:04

리부팅 없이 램디스크를 잡아주는 프로그램. Freeware.
Posted by Programming nerd 로리시아

MSN의 백신 경고가 보기 싫을 때, 환경설정에서 등록하여 사용한다.
위 프로그램의 소스코드는 다음과 같다.
Posted by Programming nerd 로리시아

더보기


  VS2008 까지는, 종속성이 있는 프로젝트에 Project Dependencies 기능을 사용하여 간단하게 종속성을 추가하면
자동으로 Link까지 되었지만, VS2010 에서는 C++의 MSBuild 지원(.vcxproj)을 위해 동작이 변경되었다.

기존의 Project Dependencies 와 같이 설정하는 방법은 아래와 같다.


1. Project Dependencies...(프로젝트 종속성) 메뉴가 아닌 References...(참조) 메뉴 클릭



2. 중앙 하단의 Add New Reference... 버튼 클릭


3. 참조할 프로젝트를 선택하고 OK버튼 클릭


참고: http://social.msdn.microsoft.com/Forums/en/vcprerelease/thread/3bb7fe8d-42d8-4a54-aa75-5ae523d5868b

Posted by Programming nerd 로리시아
1. JDK 설치. [ http://java.sun.com/javase/downloads/index.jsp ]

2. Eclipse 설치. [ http://www.eclipse.org/downloads/ ]

3. Android SDK 설치. [ http://developer.android.com/sdk/index.html ]

4. ADT Plugin for Eclipse 설치.
   (1) Eclipse > Help > Install new software... 선택

   (2) Add.. 버튼을 누르고, Name에 아무거나, Location에 https://dl-ssl.google.com/android/eclipse/ 입력

   (3) Developer Tools 에 Check 하고, Next 버튼 클릭

   (4) Eclipse 재시작 후, Android SDK 설치 폴더를 지정한다.

5. 버전별 Android SDK 설치
   (1) Windows > Android SDK and AVD Manager 클릭

   (2) Available Package 선택 후, CheckBox에 체크 한 후에 Install Selected 버튼 클릭


6. AVD(Android Virtual Devices) 설정
   (1) Android SDK and AVD Manager의 Virtual Devices 선택 후, New.. 버튼 클릭

   (2) Name에 아무거나, Target을 Android 2.1 - API Level 7, Size는 64 MiB로 설정하고 Create AVD 버튼 클릭

   (3) 생성된 AVD를 선택하고, Start 클릭

   (4) Launch 버튼을 클릭하면 Android Emulator 구동


P.S) Android SDK 경로중에 한글이 포함되면 안된다.

P.S) AVD정보는 기본적으로 "C:\Documents and Settings\사용자명\.android" 에 생성된다. 이 때, 사용자명이
       한글일 경우 Virtual Device를 Launch 시에
      [Emulator]emulator: ERROR: bad config: virtual device directory lacks config.ini
       같은 메세지가 나오면서 Launch가 실패한다. 이 경우, Android SDK가 설치된 폴더로 이동하여
      \\android sdk\tools> Android move avd -n "생성한 AVD명" -p "이동할 경로"
       로, 한글이 들어가지 않은 경로로 AVD 정보를 이동시켜주면 정상 Launch 된다.
Posted by Programming nerd 로리시아

위의 코드에서 우리가 일반적으로 기대하는 결과는

이다. 하지만, 실제로 실행해보면 위 코드의 결과는

로 출력된다. Disassembly 코드를 살펴보면,

2~4행 처럼, 기본 타입만을 인자로 받는 생성자(foo(int))를 rValue로 사용하는 복사 생성자 foo(foo const&); 를
호출하지 않고, 바로 foo(int); 으로 컴파일러가 코드 최적화를 하는 것으로 보인다.

마찬가지로, C++0x 에서 추가된 rValue Reference Move Constructor도 foo(foo&&) 가 호출 되지 않는다.
Posted by Programming nerd 로리시아
1. "auto" keyword
  - C#의 "var" keyword와 같은 동작. 컴파일 타임에 타입을 결정해준다.


2. "static_assert" keyword.
  - 컴파일 타임에 상수 조건 검사를 실행하고, 실패하면 컴파일러 에러로 출력한다.


3. 우측 값 참조(R-Value Reference)


4. Lambda Expression


5. decltype


6. "nullptr" keyword
  - null pointer의 정확한 타입 추론을 하기 위해 NULL을 대체하는 키워드.
Posted by Programming nerd 로리시아

XmlSerializer

Code Snippet/C# / 2010/04/27 15:40
XmlSerializer를 사용하여 환경설정이나, 정보 컨테이너를 간단하게 Xml로 읽기/쓰기가 가능하다.
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;

namespace CS
{
    public class Person
    {
        // Attribute의 이름을 지정
        [XmlAttribute("Name")]      public string Name;
        [XmlAttribute("Age")]       public int Age;
        [XmlAttribute("Address")]   public string Address;

        // Xml에 포함시키지 않을 필드 지정
        [XmlIgnore]                 public int CreditCardNumber;
    }

    [XmlRoot("PersonList")]   // XmlRoot 이름 지정
    public class PersonList
    {
        // Element 이름 지정. Generic이 아닌, Array 타입으로 반환하는 Property나 Field여야 한다.
        [XmlElement("Person")]  
        public Person[] Persons
        {
            get { return mPersonList.ToArray(); }
            set { mPersonList = new List<Person>(value); }
        }

        public void Add(Person p)
        {
            mPersonList.Add(p);
        }

        public static void Save(PersonList list)
        {
            using (var writer = new StreamWriter("Persons.xml"))
            {
                var serializer = new XmlSerializer(typeof(PersonList));
                serializer.Serialize(writer, list);
            }
        }

        public static PersonList Load()
        {
            using (var reader = new StreamReader("Persons.xml"))
            {
                var serializer = new XmlSerializer(typeof(PersonList));
                return serializer.Deserialize(reader) as PersonList;
            }
        }

        [XmlIgnore]
        private List<Person> mPersonList = new List<Person>();
    }

    class Program
    {
        static void Main(string[] args)
        {
            // PersonList 생성
            var list = new PersonList();
            
            // Person 추가
            list.Add(new Person()
            {
                Name = "이근영",
                Age = 27,
                Address = "Dalaran",
                CreditCardNumber = 12345
            });

            // 저장
            PersonList.Save(list);

            // 읽기
            var loadedList = PersonList.Load();
        }
    }
}
Posted by Programming nerd 로리시아
    public class Base : IDisposable
    {
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing)
        {
            // Dispose가 반복 호출되는지 확인한다.
            if ( disposed )
            {
                return;
            }

            disposed = true;

            if (disposing)
            {
                // Managed Object 제거
            }
            
            // Unmanaged Object 제거
            // Field에 null 대입.
        }

        ~Base()
        {
            Dispose(false);
        }

        private bool disposed = false;
    }

    public class Derived : Base
    {
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                // Managed Object 제거
            }

            // Unmanaged Object 제거
            // Field에 null 대입.

            base.Dispose(disposing);    // 부모 클래스의 Dispose 호출
        }

        // 상속 클래스는 소멸자나 IDisposable.Dispose()를 구현하지 않는다.
    }
Posted by Programming nerd 로리시아

or




0. 서두
0.1 C++의 문제점
0.2 C++는 시대에 뒤 떨어진 프로그래밍 언어 일까요?
1. C++0x에 대해서
1.1 C++의 새로운 표준 C++0x
1.2 Visual C++의 이전 버전과의 호환성
1.3 Visual C++ 9와 Visual C++ 10
2. auto
2.1 정적 언어와 동적 언어의 차이
2.2 C#의 var
2.3 C++에서 STL(표준 템플릿 라이브러리)를 사용할 때 불편한 점
2.4 컴파일 타임 때 타입을 정하는 'auto'
2.5 auto를 사용한 예제
2.5.1 지역 변수로 사용
2.5.2 클래스 정의에 사용
2.5.3 STL에서 사용
2.6 핵심 요약
3. static_assert 
3.1 assert와 #error
3.2 assert와 #error를 사용할 수 없을 때
3.3 static_assert의 형식
3.4 static_assert 사용예
3.4.1 프리프로세스 지시어 대체
3.4.2 템플릿에서 사용
3.4.3 변수의 크기 조사
3.5 핵심요약
4. 우측값참조(RValue Reference) 
4.1 C++98/03에서의 실수
4.2 좌측 값(LValue)과 우측 값(RValue)
4.3 좌측 값 참조와 우측 값 참조
4.4 Move semantics
4.5 Move 생성자와 Move 대입연산자
4.6 Move semantics에 의한 성능 향상
4.7 move 생성자와 move 대입연산자 사용 예
4.8 std::move
4.9 VC 10에서의 STL과 우측 값 참조
4.10 우측 값 참조를 사용할 때 주의할 점
4.11 우측 값 참조와 좌측 값 참조의 함수 오버로드
4.12 우측 값 참조는 우측 값이 아니다
4.13 Perfect Forwarding
4.14 핵심요약
5. 람다(lambda) 
5.1 C#과 람다
5.2 C++에서 STL 알고리즘을 사용할 때 불편했던 점
5.3 C++에서의 람다 사용법
5.3.1 문법
5.3.2 람다를 변수에 대입
5.3.3 람다를 함수의 인자로 사용하기
5.3.4 람다의 파라미터
5.3.5 반환 값 넘기기
5.4 캡쳐
5.5 클래스에서 람다 사용
5.6 STL의 find_if에서 람다 사용
5.7 람다 식을 STL 컨테이너에 저장
5.8 람다를 반환하 는함수
5.9 람다에서의 재귀
5.10 핵심요약
6. decltype 
6.1 템플릿 프로그래밍 시 문제
6.2 decltype 사용하기
7. nullptr 
7.1 nullptr이 필요한 이유
7.2 nullptr 구현 안
7.3 nullptr 사용 방법
7.4 nullptr의 올바른 사용과 틀린 사용예
8. 참고
Posted by Programming nerd 로리시아
[ 이미지 & 아이콘 ]

Posted by Programming nerd 로리시아
3. TortoiseSVN & Language Pack: http://tortoisesvn.net/downloads
Posted by Programming nerd 로리시아

Process 이름과 경로를 입력받아, Process가 종료되면 재시작 시켜주는 프로그램.
개발언어: C# (Visual Studio 2008), .NET Framework 2.0 필요.



Posted by Programming nerd 로리시아
Posted by Programming nerd 로리시아

환경 설정 파일 모음

Data / 2010/03/31 10:23
Visual Studio 2008 Team Setting:

AcroEdit Lua Syntax Highlight:

SlickEdit 15.0 Setting:

Posted by Programming nerd 로리시아
private static string strConvert(string source, string target, string str)
{
    Encoding eSource = Encoding.GetEncoding(source);
    Encoding eTarget = Encoding.GetEncoding(target);

    MemoryStream ms = new MemoryStream();
    StreamWriter sw = new StreamWriter(ms, eSource);
    StreamReader sr = new StreamReader(ms, eTarget);

    sw.Write(str);
    sw.Flush();

    sr.BaseStream.Position = 0;
    string ret = sr.ReadToEnd();

    sr.Close();
    sw.Close();
    ms.Close();

    return ret;
}
Posted by Programming nerd 로리시아
main 함수 시작 지점에 넣어준다.
Posted by Programming nerd 로리시아
using System.Net;
using System.Linq;
using System.Net.NetworkInformation;

namespace Utility
{
    public static class IpAddress
    {
        static bool IsMyIpAddress(string address)
        {
            var find = from item in NetworkInterface.GetAllNetworkInterfaces()
                       from unicastAddress in item.GetIPProperties().UnicastAddresses
                       where unicastAddress.Address.ToString() == address
                       select unicastAddress;

            return (0 < find.Count());
        }
        static string GetNetworkAdapterName(string address)
        {
            var find = (from item in NetworkInterface.GetAllNetworkInterfaces()
                        from unicastAddress in item.GetIPProperties().UnicastAddresses
                        where unicastAddress.Address.ToString() == address
                        select item.Name).Take(1);

            return (find.Count() == 0) ? string.Empty : find.ElementAt(0);
        }
    }
}
Posted by Programming nerd 로리시아

최근에 달린 댓글

최근에 받은 트랙백

글 보관함