일상2009/06/19 11:04

A군은 이른나이에 경찰관이 되기 위해 경찰관 시험을 준비하고 경찰관이 된다.

지방의 농촌에 발령받은 A군은 부모님이 사시는 조금 큰 시골로 놀러를 가게된다.

거기에서 동네에서 자동차로 좁은 길을 가로막는 등 양아치 가족을 보게 된다.

동네사람들과 힘을 합쳐 양아치 가족을 무찌르려 자동차로 위협하지만 오히려 만대로 당하고

근처 경찰서에 끌려가는 신세가 된다.

거기서 경찰관증이 있는 것을 아는데, 경찰관증에 낙서가 여럿있다.

그걸로 경찰관들에게 혼나고 있었는데.. 잠에서 깻다.
저작자 표시 비영리 변경 금지
Posted by 꿍스
삽질2009/06/15 23:03

하루종일 삽질 삽질을 거듭하여 샘플정도로 간단하게 만들어 봤습니다.

CComPtr m_pImgFactory;
CComPtr image;
m_pImgFactory->CreateImageFromFile(filename, &image);

CComQIPtr pBitmap;
CComPtr pBitmapOps;

// 불러온 Iimage로 IBitmapImage 생성
m_pImgFactory->CreateBitmapFromImage(image, 0, 0, PixelFormatDontCare, InterpolationHintNearestNeighbor, &pBitmap);
pBitmap->QueryInterface(IID_IBasicBitmapOps, (void**)&pBitmapOps);
pBitmap.Release();

// 이미지 90도 회전
pBitmapOps->Rotate(90, InterpolationHintNearestNeighbor, &pBitmap);
image.Release();
pBitmapOps.Release();

pBitmap->QueryInterface(IID_IImage, (void**)&image);
		
// 인코딩 코덱 찾기
ImageCodecInfo * codecinfo;
UINT count;
CLSID clsid;
m_pImgFactory->GetInstalledEncoders(&count, &codecinfo);

for(UINT i = 0; i < count ; i++) {
	// JPEG 코덱 찾기
	if(wcscmp(codecinfo[i].MimeType, _T("image/jpeg")) == 0) {
		clsid = codecinfo[i].Clsid;
				
		break;
	}
}
free(codecinfo);

// 인코딩할 파일 저장
CComPtr pEncoder;
m_pImgFactory->CreateImageEncoderToFile(&clsid, _T("파일명"), &pEncoder);

// 인코딩할 이미지 싱크 생성
CComPtr pImgSink;
pEncoder->GetEncodeSink(&pImgSink);
// 기존의 이미지를 이미지 싱크로 보냄
image->PushIntoSink(pImgSink); 
pImgSink.Release();
// 인코딩 종료
pEncoder->TerminateEncoder();
pEncoder.Release();

 

회전 한 파일이 파일명으로 바로 저장됩니다.

저작자 표시 비영리 변경 금지
Posted by 꿍스
삽질2009/06/14 20:06
WindowsMobile 에서만 쓸수있는 SHLoadImageFile 이라는 함수가 있습니다. 이 함수는 편리하게 파일 이름만 넣으면 PNG, JPG, GIF등을 지원해서 편리하게 HBITMAP 형식으로 리턴해 줍니다. 하지만 파일 전체를 무조건 로드합니다.

http://msdn.microsoft.com/en-us/library/aa455003.aspx

윈도우즈 모바일 5 부터 사용할 수 있다고 하지만 그 전에도 undocumented function 으로 사용가능 했던 것 같습니다.(구글신 검색결과)


		// 사진 파일을 지정
		HBITMAP h = ::SHLoadImageFile(filename);
		if(h != NULL) {
			m_photoImage.Attach(h);
		}
		else {
			MessageBox(_T("사진 파일을 불러오지 못했습니다."), _T("Me2PocketUploader"), MB_ICONWARNING);
		}

용량이 큰(실험 결과 1Mbyte 정도) 이상의 파일을 SHLoadImageFile로 로드하면 무조건 NULL이 리턴되었습니다. 

GetLastError로 조사해도 핸들이 잘못되었다는 메시지만 출력합니다. 어리 둥절했던 것은 에뮬레이터에서는 불러오다가 못불러오다가 했습니다. 생각해보니 메모리 용량 때문인거 같습니다. JPG파일 200kb 정도라도 실제 BITMAP으로 디코딩 될때의 메모리 점유는 3Mbyte에 육박 했습니다. 그래서 구글신께 여쭈어서 찾고 찾은것이 Windows CE의 Image API 입니다.

IImagingFactory의 CreateImageFromFile http://msdn.microsoft.com/en-us/library/aa452215.aspx , 로 얻은 IImage 인터페이스의 GetThumbnail함수로 썸네일을 바로 가져왔습니다. 큰 이미지 파일이라도 썸네일로 크기에 맞가 가져오므로 부담이 적습니다. 그래서 메모리 사용량도 상당히 줄었습니다.

저는 WTL을 사용해서 프로그래밍 했기 때문에ATL의 편리한 CComPtr이나 CComQIPtr등 COM이용에 편리한 클래스를 사용 했습니다.

#include 
#include 
#include 

CComPtr m_pImgFactory;
CComPtr m_pImage;
RECT m_photoRect;

// ImageFactory 생성
m_pImgFactory.CoCreateInstance(CLSID_ImagingFactory);

CComPtr image;
m_pImgFactory->CreateImageFromFile(filename, &image);

// 썸네일 생성	
if(image->GetThumbnail(m_photoRect.right - m_photoRect.left, m_photoRect.bottom - m_photoRect.top, &m_pImage) == S_OK) {
	m_photoFilename = filename;
	InvalidateRect(NULL); // OnPaint
}

// 지정된 DC와 영역에 그림을 그림
::GetWindowRect(GetDlgItem(IDC_PHOTO), &m_photoRect);
m_pImage->Draw(hDC, &m_photoRect, NULL);


Image API의 IBasicBitmapOps인터페이스(http://msdn.microsoft.com/en-us/library/ms939536.aspx)를 사용하면


Grouping Methods
Color Control AdjustBrightness

AdjustContrast

AdjustGamma

Manipulation Clone

Flip

Resize

Rotate


이런 것들을 할 수 있네요. 나중에 해봐야 겠습니다. +_+
저작자 표시 비영리 변경 금지
Posted by 꿍스
일상2009/06/11 16:02
외출을 하고 나서 다시 집에왔는데 문이 그냥 열려 있는 것입니다. 이리저리 알아보다가 결국 도어락이 문제 였습니다.

문을 닫으면 문이 잠겨야 하는데 문이 안잠기는 겁니다.


그래서 수동으로 돌려서 잠그려고 하니 중간에 걸려서 더이상 돌아가지 않더군요.

그래서!!! 분해를 시작했습니다. 뒤 부분을 나사로 풀어서 제거 한 후 도어락이 잠그기 위해 돌리는 홀을 수동으로 돌리니 역시나 중간에 걸려서 안돌아 갔습니다. 아래 사진에서 빨간 테두리 부분입니다.


앞 부분도 제가 하고 잠금 뭉치 부분을 풀었습니다.


잠금 뭉치를 풀었더니 잠김부분의 걸쇠 부분이 걸리는 것입니다. 무언가 발라져서 굳은거 같은데 그부분을 때어내고 식용유를 뿌려서 부드럽게 동작하도록 했습니다.


이제 다시 조립을 해야하는데 잠금 뭉치 부분의 나사하나를 잃어벼러서 급하게 집에서 나사를 뒤져서 비슷한 것을 맞췄습니다.


이젠 아주 잘됩니다.!!! 크크크크큭 이상 도어락 수리기 였습니다.

저작자 표시 비영리 변경 금지
Posted by 꿍스
삽질2009/06/08 20:37

Me2PocketUploader 윈도우즈 모바일 버전을 개발하면서 마블(이전은 인텔)의 PXA시리즈 CPU에서는 잘 동작하는 기능이 퀄컴의 MSM시리즈(MSM7200)칩에서는 의도하지 않은 동작을 하였습니다. 어차피 둘다 태생은 ARM 아키텍처 이지만 말입니다. 그것도 무적전설님이 알려주기 전까지는 몰랐습니다.
문제의 코드는 다음과 같습니다.
		// 댓글 닫기
		if(setCloseComment) {
			m_HTTP->AddGetData("close_comment", "true");
		}

 

setCloseCommnet 값이 BOOL값이라 BOOL값은 또 int로 정의되어 있기에 저렇게 작성했었는데, 퀄컴의 MSM CPU에서는 계속 댓글이 닫히는 문제가 생기는 것입니다. setCloseCommnet값이 FALSE라도 실행이 되어버렸던 것이지요. 전 이문제를 단순히 CPU의 아키텍처가 틀려서 라고 생각을 하고 있다가, 다음과 같이 명확하게 TRUE값을 검사했습니다.

		// 댓글 닫기
		if(setCloseComment == TRUE) {
			m_HTTP->AddGetData("close_comment", "true");
		}

 

잘 되는군요... 문제는 역시 저의 코딩 버릇이었습니다. 좀더 명확한 코드를 작성하도록 노력해야겠습니다.!! 테스트 해주신 무적전설님 감사합니다.

저작자 표시 비영리 변경 금지
Posted by 꿍스
TAG C, IF, msm7200, PXA, WM
삽질2009/05/29 21:02
http://sourceforge.net/project/shownotes.php?release_id=680959&group_id=109071

- changed version number
- updated CPL link in headers
- fixed warning for _vstprintf
- added wizard setup programs for VS2008

WTL 8.1이 출시 되었네요.

다운로드는 : http://sourceforge.net/project/showfiles.php?group_id=109071&package_id=321560&release_id=680959

WTL 개발을 쉽게 해주는 WtlWiz, WTL Helper 가 2008 용으로 나왔으면 좋겠습니다. ( 이것때문에 2005를 아직 쓰고 있어요!! )

WTL Helper 는 코드 프로젝으에 소스가 공개되어있어서 2008용으로 어느 용자분깨서 바꾸어 주신게 있지만, WTL Helper와 궁함을 맞추는 WtlWiz는 소스가 공개되어있지 않아서 2008용이 없네요.

http://salos.narod.ru/eng/WtlWiz/WtlWiz.html : 제작자 홈페이지, 바쁘신듯 업데이트가 없네요.
저작자 표시 비영리 변경 금지
Posted by 꿍스
TAG WTL
일상2009/05/19 10:43
면도날이 다 되어서 옥션에서 두세트에 2만원이길래 저렴하다고 생각하여 주문 했습니다.

면도를 해도 깔끔하게 되지도 않고 한 두세번 사용하다보니 코팅부분이 벗겨졌습니다.


제가 주문했던 면도날의 포장입니다. 저와 같은 피해를 받지 않으셨으면 합니다.




세상에 면도날도 짝퉁이 나올줄이야. 정말 면도도 안되고 얼굴에 상처도 잘 납니다.

질레트코리아에서는 짝퉁과의 구분법에 대한 정보를 제공하고, 짝퉁 근절에 대한 노력해 했으면 합니다.
저작자 표시 비영리 변경 금지
Posted by 꿍스
일상2009/04/30 16:20


매운것을 잘못먹는 탓에 여러 모임에서 식사를 할때 곤란함을 겪는 경우가 많습니다. 찜닭만 해도 매워서 헥헥 거리니까요.

아예 어떤 모임에서는 매운것을 못먹는 것을 아는지라 알아서 배려를 해줍니다.

그러던 중 아는 땡초를 간식으로 먹는 동생이 매운것을 먹으면 스트레스가 풀린다길래 저도 매운것으로 쌓인 스트레스도 풀고, 매운것도 더 잘먹어 보기 위해 땡초에 도전했습니다.

물론 땡초를 그냥 씹어먹는다는 소리는 아닙니다. 라면을 끊일때 땡초를 한개정도 썰어서 넣고 매운 라면도 먹어보고 했습니다.

삼양라면의 '간짬뽕', 이라면이 대박입니다. 진짜 맛있습니다. 매운것만 빼면요. 진짜 땀을 흘리면서 헥헥 거리면서 먹었습니다. 그래도 이건 약과입니다. 신라면에 땡초 하나를 썰어서 넣었는데, 진짜 죽는줄 알았습니다.

한 한달정도 라면에 땡초, 파, 마늘을 넣어서 먹었습니다. 그러다가 몇일 매운걸 안먹다가 또 먹었더니 하루종일 속이 쓰립니다. ㅜㅜ 예전에 불닭을 먹을때 보단 덜하지만 속이 쿡쿡 찌르는게 아주 죽을 맛입니다.

아 역시 매운걸 먹는건 타고나는 걸까요? 언제쯤 땡초를 그냥 우걱우걱 씹어먹을 수 있을려나...
저작자 표시 비영리 변경 금지
Posted by 꿍스
삽질2009/04/22 07:11

CakePHP의 paginator는 굉장히 훌륭합니다. ㅠ_ㅠ 번거로운 페이징 작업을 아주 간단하게 해주죠.

필요해서 리스트에서 번호를 보여줄때 순서대로 번호를 매기는 것을 방법을 생각했습니다.
$paging = $paginator->params();
$vid = intval($paging['count']) - (intval($paging['page']) - 1) * intval($paging['options']['limit']);

foreach ($datas as $data):

....

    $vid--; 
endforeach;

View에서 paginator->params([Model]) 을 호출하면 paginator의 옵션과 설정된 값들을 배열로 리턴합니다.

그중에서 전체글수, 현재 페이지, 각 페이지당 글 수를 가져와서 간단한 연산을 통해 현재 페이지의 처음 번호를 구해옵니다.

여기서부터 하나씩 싹싹 빼가면 순서대로 번호가 매겨집니다.
저작자 표시 비영리 변경 금지
Posted by 꿍스
삽질2009/04/19 12:24


ERROR 1140: Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns isillegal if there is no GROUP BY clause


SUM, COUNT, AVG, MIN, MAX 등의 함수와 일반 컬럼을 동시에 사용하기위해서는 GROUP BY 절이 필요합니다. 다음과 같은 SQL도 동일한 에러를 발생시킵니다.


SELECT owner, COUNT(*) FROM pet;


하지만 GROUP BY를 사용하면 각 그룹별로 나누어서 보여주기 때문에, 전체행에 대한 여러 값을 구할 수가 없습니다. 이럴 때는 GROUP BY NULL 을 사용해서 그룹을 만들지 않고 모든 행을 연산할 수 있습니다.


SELECT
COUNT( DISTINCT `Data`.data_id ) AS `used`,
(SELECT COUNT(*) FROM works WHERE place = `Data`.charge_place AND fstate = '신청접수' ) AS `applied`
FROM `users` AS `User` LEFT JOIN
(SELECT `Data`.id as data_id, charge_uid, charge_place, partner_uid, partner_place, fstate, sstate FROM works AS `Data` LEFT JOIN `work_loans` AS `DataLoan` ON `Data`.id = `DataLoan`.data_id WHERE 1=1 ) AS `Data` ON `User`.uid = `Data`.charge_uid
WHERE `User`.role IN ('bm', 'b')
GROUP BY NULL

저작자 표시 비영리 변경 금지
Posted by 꿍스