태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.


'2008/03'에 해당되는 글 7건

  1. 2008/03/29 C++용 replace all
  2. 2008/03/15 윈도우 XP 테마 로얄 느와르 (Royal Noir)
  3. 2008/03/13 URL 상대 경로, 절대 경로 변환 클래스 (C#)
  4. 2008/03/12 포토샵 없이 만드는 이미지 패러디
  5. 2008/03/02 프로그래머를 위한, 프로그래머의 Consolas 폰트 (2)
  6. 2008/03/02 타이머에서 메시지 박스를 띄울때는 타이머를 중지 시키고 띄우자
  7. 2008/03/02 Multi Wallpaper Manager 오픈 소스 프로젝트로 런칭 (1)
2008/03/29 14:18

C++용 replace all

C++ STL의 string을 이용해서 구현한 replace all 함수입니다.

마지막 두줄의 assert를 보면 알 수 있듯이, 이 함수엔 문자열이 재귀적으로 치환되는 문제가 없습니다.

#include 
#include 
#include 

using namespace std;

string replaceAll(const string &str, const string &pattern, const string &replace)
{
	string result = str;
	string::size_type pos = 0;
	string::size_type offset = 0;

	while((pos = result.find(pattern, offset)) != string::npos)
	{
		result.replace(result.begin() + pos, result.begin() + pos + pattern.size(), replace);
		offset = pos + replace.size();
	}

	return result;
}

int main()
{
	assert(replaceAll("abcdefg", "bc", "de") == "adedefg");
	assert(replaceAll("abc\nabc\nabc", "\n", "") == "abcabcabc");
	assert(replaceAll("aaabbbaaa", "aaa", "1") == "1bbb1");
	assert(replaceAll("ababab ababab", "ab", "1") == "111 111");
	assert(replaceAll("abcdefg", "gf", "de") == "abcdefg");
	assert(replaceAll("aaa", "a", "aa") == "aaaaaa");
	assert(replaceAll("11aa11aa", "1", "11") == "1111aa1111aa");

	return 0;
}
Trackback 0 Comment 0
2008/03/15 09:42

윈도우 XP 테마 로얄 느와르 (Royal Noir)

MS에서 만든 윈도우 XP 테마인 로얄 느와르 (Royal Noir)입니다.

원래 Royal (윈도우 미디어 센터 에디션의 테마 프로젝트) 개발 중에 같이 만들어졌는데, 디자이너가 보기에 색감이 적절하지 않아서 나오지 않았다가, 누군가에 의해 유출된 테마입니다.

사용자 삽입 이미지

사용법:

다음 경로에 압축을 풉니다. “C:\windows\resources\themes\royale noir”
luna.msstyles를 더블 클릭합니다.
화면 배색에서 Noir를 선택합니다.
Trackback 0 Comment 0
2008/03/13 12:13

URL 상대 경로, 절대 경로 변환 클래스 (C#)

Url Resolver클래스는 아래와 같은 기능들을 가지고 있습니다.

상대경로를 절대경로로 변환
상위 경로로 이동
Base URL 구하기

상대경로를 절대경로로 변환하는 기능에 북마크, 쿼리는 고려하지 않았으며, 일반적인 경우에 모두 정상적으로 동작합니다.

참고자료:
URL Relative Syntax and Base URLs - http://www.tcpipguide.com/free/t_URLRelativeSyntaxandBaseURLs-3.htm

URL 상대경로의 처리 - http://ljh131.tistory.com/6

	public class UrlResolver
	{
		public static string GetBaseUrl(string url)
		{
			string baseUrl = url.Substring(0, url.LastIndexOf('/') + 1);

			return baseUrl;
		}

		// return false if base url is root reached
		public static bool GoUpOnePath(string baseUrl, out string newBaseUrl)
		{
			// 루트인지 체크 ('/' 개수가 3개이하면 중단)
			int searchIndex = 0;
			int count = 0;
			int currentIndex = 0;

			while (true)
			{
				currentIndex = baseUrl.IndexOf('/', searchIndex);

				if (currentIndex != -1)
					count++;
				else
					break;

				searchIndex = currentIndex + 1;
			}

			if (count <= 3)
			{
				newBaseUrl = baseUrl;

				return false;
			}

			// go up one
			int secondOfLastSlashIndex = baseUrl.LastIndexOf('/', baseUrl.Length - 2);
			newBaseUrl = baseUrl.Substring(0, secondOfLastSlashIndex + 1);

			return true;
		}

		/*
		 * based on http://www.tcpipguide.com/free/t_URLRelativeSyntaxandBaseURLs-3.htm
		 * this function NOT include bookmark, query and new scheme url
		 */
		public static string GetAbsoluteUrl(string baseUrl, string relativeUrl)
		{
			// baseurl의 마지막은 반드시 /임
			Debug.Assert(baseUrl.LastIndexOf('/') == baseUrl.Length - 1);

			string[] relativePaths = { "//", "/", "./", "../", ".." };
			bool resolveRelativePath = false;

			do
			{
				resolveRelativePath = false;

				foreach (string relativePath in relativePaths)
				{
					if (relativeUrl.IndexOf(relativePath) == 0)
					{
						resolveRelativePath = true;

						switch (relativePath)
						{
							case "//":	// 호스트 네임 지정
								baseUrl = "http://";
								break;

							case "/":	// 루트 지정
								while (GoUpOnePath(baseUrl, out baseUrl))
									;
								break;

							case "./":	// 현재 디렉토리. 무시
								break;

							case "../":	// 한단계 아래 디렉토리로 감. (더 이상 갈 수 없을때는 진행하지 않음.)
								GoUpOnePath(baseUrl, out baseUrl);
								break;

							case "..":	// 한단계 아래 디렉토리로 감. (../와 같음)
								GoUpOnePath(baseUrl, out baseUrl);
								break;
						}

						// remove relative path from url
						relativeUrl = relativeUrl.Substring(relativePath.Length);

						// reset loop
						break;
					}
				}
			} while (resolveRelativePath);

			return baseUrl + relativeUrl;
		}
	}
Trackback 0 Comment 0
2008/03/12 23:52

포토샵 없이 만드는 이미지 패러디

이미지에 글자를 자동으로 합성해주는 상당히 재미있는 사이트이다.

아래 이미지는 모두 이미지 패러디 사이트에서 만든것들.

http://imageparody.com/

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지

Trackback 0 Comment 0
2008/03/02 13:04

프로그래머를 위한, 프로그래머의 Consolas 폰트

프로그래머를 위한, 프로그래머의 폰트.

이름도 무려

Consolas Font Pack for Microsoft Visual Studio 2005

입니다.

Consolas, 11 point.
사용자 삽입 이미지

이렇게나 깔끔하고 미려한 Consolas폰트를 보자면 그동안 돋움체의 압박을 어떻게 감당해왔는지 의문입니다.

위의 사진에서는 11pt이지만 10pt가 가장 적절하더군요. 그럼 Consolas를 달고 즐겁게 코딩 해봅시다.

http://www.microsoft.com/downloads/details.aspx?familyid=22e69ae4-7e40-4807-8a86-b3d36fab68d3&displaylang=en
Trackback 0 Comment 2
2008/03/02 12:58

타이머에서 메시지 박스를 띄울때는 타이머를 중지 시키고 띄우자

아마 Win32API를 배울때 두번째로 배우는 가장 기본적인 MessageBox함수는 모달 다이얼로그이긴 하지만 타이머와 함께 사용하면 더 이상 모달이 아닌게 됩니다.

타이머 내에서 MessageBox를 호출하면 이전 메시지박스가 있던지 없던지에 상관없이 무조건 뜹니다. 즉 메시지박스가 수도없이 뜨게 되죠. 이를 막는 가장 간단한 방법은, 타이머를 일시 중지 시키는 겁니다. 물론 프로그램 로직에 영향을 미치지 않는 타이머일때만 사용가능하겠죠. 그게 아니라면 프로그램의 요구사항에 맞춰서 적절한 방법을 고안해야죠.

private DialogResult SafeMessageBox(string text, string caption, MessageBoxButtons buttons)
{
	DialogResult result;

	if(changeCycleTimer.Enabled)
	{
		changeCycleTimer.Stop();

		result = MessageBox.Show(text, caption, buttons);

		changeCycleTimer.Start();
	}
	else
	{
		result = MessageBox.Show(text, caption, buttons);
	}

	return result;
}
Trackback 0 Comment 0
2008/03/02 12:42

Multi Wallpaper Manager 오픈 소스 프로젝트로 런칭

듀얼 및 멀티 모니터를 위한 다중 바탕화면 관리 프로그램 Multi Wallpaper Manager를 오픈 소스 프로젝트로 전환하였습니다.

라이센스는 GPLv3이며 구글 코드에서 호스팅합니다.

http://code.google.com/p/multiwallpapermanager/


사용자 삽입 이미지
Trackback 0 Comment 1