BLOG main image
분류 전체보기 (66)
excel.101 (0)
rewind (9)
(3)
(2)
목공 (3)
(3)
me2day (0)
The Ethereal Void (9)
코드 (12)
귀찮은것 (0)
Black Friday Deals Uggs
Black Friday Deals Uggs
steamboat springs colorado lod..
steamboat springs colorado lod..
Looca의 생각
loocaworld's me2DAY
vervain의 생각
vervain's me2DAY
143,888 Visitors up to today!
Today 9 hit, Yesterday 26 hit
daisy rss
tistory 티스토리 가입하기!
'코드'에 해당되는 글 12건
2013.10.22 17:20

개발할 때는 'manage.py runserver' 명령으로 테스트하고 작업하고 반복하느라 몰랐던, 실제 라이브 서버에 배포하고 나서야 안 몇 가지 사실들

  • manage.py 실행 시 unknown command 오류
    • 로컬/프로덕션의 셋팅이 나누어져 있을 경우, manage.py는 'DJANGO_SETTINGS_MODULE' 환경설정 값에 설정되어 있는 셋팅을 사용한다.
    • manage.py 의 실행가능한 명령들은 셋팅이 어떻게 구성되어 있느냐에 따라 달라지는데, unknown command 가 뜨는 대부분의 경우에는 바로 이 셋팅값이 잘못 구성되어 있을 경우가 대부분이다.
    • 셋팅파일을 구성이 제대로 되어 있는지 이중확인을 꼭하고, 그래도 문제가 된다면 명시적으로 '--settings' 옵션을 적용해 주는 것이 도움이 된다.
$ python manage.py collectstatic --settings=testapp.settings.production
  • static 파일 배포 문제
    • 보통은 개발 시 부터 모든 정적 리소스 (이미지, 스타일시트, 스크립트파일 등)이 분산되어 있지 않고 Django의 디렉토리 규칙에 따라 /testapp/static/ 이하에 모두 들어가 있는 경우에 많다. 하지만 라이브 서버에 배포할 경우 이런 파일들은 배포 전략에 따라 다른 서버나 혹은 특정 권한이 있는 디렉토리에 모여 있어야 되는데, 이럴 때를 위해 Django 에서는 collectstatic 이라는 명령어를 지원하고 있다.
  • 다중 settings 구성
    •  구글링을 통해 몇 가지 검색해 본 것 중에 제일 추천되는 방법은 /testapp/settings.py 대신 다음과 같이 구성하는 방법을 쓴다.
/testapp
  /settings
    /__init__.py
    /base.py -- 기본 셋팅파일
    /local.py -- 로컬용 셋팅파일
    /production.py -- 배포용 셋팅파일

* local.py

from testapp.settings.base import *


# 오버라이딩될 구성값

    • 이렇게 설정을 구성하고 manage.py를 실행할 때는 항상 '--settings=testapp.settings.local' 또는 '--settings=testapp.settings.production' 옵션을 붙여 실행하도록 한다.
    • wsgi.py 에 'DJANGO_SETTINGS_MODULE' 값도 바꿔주는 부분도 잊으면 안됨은 물론이고.
그 외에 아파치 연동 설정이라던가 기타 등등 굉장히 많은 헛짓과 구글링을 통해 얻은 사실들이 있지만, 일단 오늘은 여기까지 ...


저작자 표시 비영리 변경 금지
신고
Name
Password
Homepage
Secret
2013.02.01 18:41
  • CruiseControl.NET project : http://sourceforge.net/projects/ccnet/
  • 사용버젼 : 1.5.7256.1
  • 대상버젼 : 1.8.0.0 
  • 설치된 플러그인 : svnRevisionLabeller 
  • 가능하면 업그레이드는 zip 압축으로 받는다.
  • ccnet 중지
  • 만일을 대비해 ccnet이 설치된 폴더 /server/ 안에 모든 파일을 백업한다.
    • 로그용량이 클 경우 적당히 삭제
  • 업그레이드 zip 파일을 풀고 설정파일 (*.config)을 제외한 모든 파일 (*.exe;*.dll*, 그외 리소스 폴더)를 복사해서 덮어 쓴다.
  • ccnet 재가동

여기까지 하면 설정파일이 문제가 있다는 시뻘건 메세지를 구경할 수 있다. (-_-)
svnRevisionLabeller가 업데이트 되면서

<pattern>{major}.{minor}.{revision}.{build}</pattern> 식으로 사용되던

중괄호가 다음과 같이 소괄호로 바뀌었기 때문

<pattern>(major).(minor).(revision).(build)</pattern> 으로 바꿔주면 정상적으로 돈다.


저작자 표시 비영리 변경 금지
신고
Name
Password
Homepage
Secret
2012.07.04 18:35

이런 저런 작업을 하다보면, 두 일자를 포함하는 날짜 혹은 기간 범위는 꽤 많이 쓰이는 것 중에 하나인데, 이게 이상하게도 닷넷 코어 부분에 포함이 되어 있지 않다. 외국 사이트에 가끔 찾아보면 Period 같은 클래스를 작성해서 사용하기도 하던데, 끌어다 쓰긴 좀 그렇고, 자주 사용되는 것 중에 하나라 아예 필요한 부분 부분 따로 라이브러리로 작성해두었다.


이름은 DateRange (...)


구구절절 쓰면 골치 아프니, 바로 코드로 ... 

다음과 같이 사용이 가능하다.


// 2012년 1월 1일 0시부터 2012년 12월 31일 0시까지
DateRange year2012 = new DateRange(2012);
Console.WriteLine(String.Format("{0} ~ {1}"), year2012.Start, year2012.End));
// 또는
Console.WriteLine(year2012);
// output: 2012-01-01 ~ 2012-12-31

// 2012년 3월 전체
DateRange month201203 = new DateRange(2012, 3);
// 기간이 만월인지? 
Assert.IsTrue(month201203.IsFullMonth); // true !

// 2010년 부터 2012년까지
DateRange year2010to2012 = new DateRange(new DateTime(2010, 1, 1), new DateTime(2012, 12, 31));

// 오늘 날짜를 기준으로 이번 주 범위를 반환한다. 주 시작은 일요일에서 토요일까지 -
// 이 부분은 문화권 마다 다르게 처리해줘야 되는데, 아직 그 부분은 미구현.
// 근데 이렇게 시간에 따라 변하는 값을 정적 속성으로 처리하는게 왠지 꺼름직해서 (디자인 상으로 그다지 좋지 않다.) 지울 예정 -_-
DateRange thisWeek = DateRange.ThisWeek;

// 특정일자, 년도를 기준으로 분기, 반기 범위
// 2012년도의 1분기
DateRange firstQuaterOf2012 = DateRange.GetQuater(2012, 1);

// 2012년도의 후기
// 지정된 날짜를 기준으로 해당 년도의 반기를 반환
DateRange lastHalfYearOf2012 = DateRange.GetHalfYearly(new DateTime(2012, 7, 1));

// 범위 조작
DateRange period1 = new DateRange(new DateTime(2010, 1, 1), new DateTime(2010, 1, 11));
// 기간 끝날짜를 월말로 확장한다.
period1.ToMonthEnd();
Console.WriteLine(period1.End);
// output: 2010-01-31

// 1월에 3개월을 더하면? 4월이다. 4월달의 범위를 반환.
DateRange period2 = period1.AddMonths(3); // start: 2010-04-01, end: 2010-04-30 (말일이 31일이 아니라 30일이다. 중요)

// 2010년에 1년을 더하면 2011년 범위를 반환.
DateRange period3 = period2.AddYears(1);  // start: 2011-04-01, end: 2011-04-30

// 기간 그대로 앞 뒤로 이동이 가능하다. 이때 각 시작, 끝 날짜에 TimeSpan 기간에 대한 Add, Substract 연산이 처리된다.
period3.ShiftForward(TimeSpan.FromDays(10)); // 10일 이전 범위
period3.ShiftBackward(TimeSpan.FromDays(5)); // 5일 이후 범위

// 특정일자가 기간에 포함되는지 여부 확인
Assert.IsTrue(period1.Contains(new DateTime(2010, 1, 5))); // true !

// 기간의 각각 일자에 대한 반복처리
period1.ForEach(new Action(delegate(DateTime date)
{
// 1월 1일 부터 1월 31일까지 반복처리
}));

TimeSpan ts = period1.ToTimeSpan(); // 당연히 필요.

기능이 필요할때마다 그때 그때 확정했던 거라, 디자인이 좀 엉망이긴 하지만 ... 날짜 범위가지고 무식한 작업은  안하게 되었으니, 그걸로 만족. 구글코드에 당장 올리긴 힘들고, 일단 바이너리 파일만 사용하실 분은 첨부참조 ... (닷넷 프레임웍 2.0 이상이면 가능)



Vervain.Utils.Time.dll


Vervain.Utils.Time.XML


저작자 표시 비영리 변경 금지
신고
Name
Password
Homepage
Secret
2011.12.15 14:01
2년 전에 간단한 급여 계산 영역을 하나 구현할 일이 있었다. 이 전에 구현된 시스템이 있었는데, 좀 더 범용적으로 (간단하게 말하자면, 한국과 중국에 모두 사용 가능한) 사용 가능하도록 조정해야 되는 것이었다.

말이 조정이지 사실 다시 처음부터 작업을 했다.

일단, 급여는 기본급여와, 세액과 보험액을 계산하기 위한 부가 정보, 수당, 공제내역이 필요하다. 세금과  보험은 공제내역에 해당되고 수당에는 개별적으로 이 수당이 과세인지? 혹은 비과세인지, 혹은 과세액 범위가 있는지가 필요하다.

한국 같은 경우는 기본적으로 세금으로 소득세(갑근세)와 주민세가 있고, 보험에는 5대 보험이 적용된다. 중국도 한국과는 조금 다르지만, 기본적으로 소득에 대한 세금이 있고, 항목이 조금 다른 5대 보험이 있다.

이러한 차이 항목의 공통 분모를 추려내어 보면

하나. 개인의 급여명세(PayCheck)가 있다.
둘. 급여명세는 기본급여 정보와 수당(Allowance), 그리고 공제(Deduction)로 나누어진다.
셋, 세금(Tax), 보험(Insurance)는 공제로 포함된다.

상기 내역에 대한 항목을 추출해 본다.

* 급여명세 (PayCheck)
* 수당 (Allowance)
* 공제 (Deduction)
* 보험 (Insurance)
* 세금 (Tax)

급여명세 이후에 네가지 항목은 급여명세에서 사용자가 받게될 최종 급여액을 계산하는 개별항목으로 적용된다.

* 급여액 = (기본급여액) + (수당) - (공제 [일반, 세금, 보험])

개별 항목을 계산하기 위해서는 각 항목이 어떠한 방식으로 계산되는지에 대한 정보가 필요하다. 그리고 이 계산 정보를 사용하여 실제 급여항목들에 대해 각 항목에 대한 금액을 산출해줄 계산기가 필요하고!

한국에 필요한 계산기 (Calculator)

* 갑근세 계산기 : (매년 세법이 조금씩 바뀌므로 매년 수정이 필요하다.)
* 과세표준액 계산기 : (수당 항목 중에 과세액에 해당하는 내역들을 집산해서 과세표준액을 산정한다.)
* 주민세 계산기 : (갑근세의 %)

중국에 필요한 계산기

* 소득세 계산기 : (중국 소득세는 의외로 간단하다.)

보험에 대한 계산기

기본적으로 보험은 보험금액이 산정되는 기준액에 대한 보험요율로 산정되며, 가입자와 사용자 부담요율이 나워져 있고, 금액에 대한 상한, 하한 인자가 들어간다.

이를 토대로 보험 정보(InsuranceInfo)를 구성한다.

* 사용자 부담요율
* 가입자 부담요율
* 보험 유형
* 상한액
* 하한액

이러한 인자에 사용자의 보험액 계산에 대한 부가정보를 넣어주면 계산되는 계산기를 만들어 주고, 이 보험 정보를 토대로 공통적인 보험액 계산을 해주는 계산기를 구현한다.

그리고 마지막으로 사용자 수식 계산기 하나, 이는 사용자가 특정 계산이 필요할 경우를 위해 구현한다. 수식문에 대한 처리는 NCalc 라이브러리를 사용했다.

여기까지 하면 급여명세(PayCheck)에 대해 각각 계산기가 계산 정보 (혹은 보험 정보)를 가지고 명세를 계산하게 된다. 사용자에게 필요한 것은 지역에 대한 로케일 설정, 그리고 사용하는 수당항목, 공제항목 설정이다. 이를 기반으로 계산을 수행하게 되는데 여기서 한가지 문제가 있다.

예를 한국 같은 경우, 주민세는 소득세액의 몇%를 기준으로 산정하고, 세액도 과세표준액을 기준으로 산정해야 된다. 고로 특정 계산기가 어떤 계산기 보다 우선적으로 처리되어야 할 순위가 필요하다.

이를 위해 계산기 전체 목록을 반환할 때 계산기를 사전 정렬한다.

음 여기까지 하면 명세에 대한 계산 부분이 정리가 된다. 계산기-명세 계산 부분은 Visitor 패턴으로 구현했고, 보험 정보는 따로 따로 제공자를 두어 지역 로케일에 따라 필요한 보험 정보를 잘 묶어서 관리하도록 처리했다.

차후에 세법이나 보험 정책이 바뀌면 해당 보험 정보나 계산기만 조정해 주면 되고, 필요할 경우, 계산기 정보와 기타 파트는 모두 다른 라이브러리로 분리 가능하도록 처리해 놨다.

뭐 더 필요한게 있을려나?
저작자 표시 비영리 변경 금지
신고
Name
Password
Homepage
Secret
2011.12.15 13:09
사내 프로젝트 관리 시스템으로 Redmine을 사용한지 벌써 3년이 넘어간다. 처음에 0.8.x 버젼에서 시작해서 약 세번정도 업데이트하여 현재 1.2.2 버젼을 사용 중이다.

거의 대부분의 기능을 활용하면서 쓴거 같은데, 요즘엔 사후관리 (추정/실제 시간) 부분은 거의 사용하지를 않고 있다. 이 부분에 대한 정확한 통계에 대한 리뷰가 없어서 그럴 듯.

초기에는 trac이나 Basecamp+잡것 연동 에도 기웃거려 봤지만, 이젠 사실 Redmine 하나면 충분하고, 가끔 간단하게 혹은 다른 개발 외 협업이 필요한 경우는 Trello 라는 대쉬보드형 협업 툴이 있으니 뭐 이걸로 사용하는 것도 좋다. Trello 사용 후에는 구글 할일 목록을 사용하는 빈도도 거의 없어졌다.

필요한 기능은 거의 다 기본으로 있고 (이슈 트랙킹, 위키, 게시판 등등), 그 외 잡다하게 필요한 것들 (자동화된 문서 게시 등등)은 플러그인 형태로 충분히 연동 가능하니, 그냥 이 우물 안에서 계속 놀게 된다.

그래도 뭐 새로운 툴이 나오면 계속 기웃거리겠지. 
저작자 표시 비영리 변경 금지
신고
BlogIcon 지돌스타 | 2012.01.18 20:20 신고 | PERMALINK | EDIT/DEL | REPLY
저희도 레드마인을 쓰고 있습니다.
개발외에 마케팅, 기획, 디자인 이쪽 관련 실무자도 잘 사용하나요?
Name
Password
Homepage
Secret
2009.06.28 20:41
물론 방법론적으로나, 유지보수 측면에서 FormEx<TClass> : System.Windows.Forms.Form (혹은 UserControl)와 같은 디자인은 그다지 좋은 디자인 방법은 아니지만, 간혹 사용해야 될 경우가 있다.

문제는 코드 자체가 아니라 디자인타임에서 Generic Form이 정상적으로 표시되지 않는 문제가 있는 것.
이럴 때는 다음과 같은 방법으로 살짝 IDE를 속일 수 있다.

#FormEx.cs
/* Base Class */
public partial class FormEx<TClass> : System.Windows.Forms.Form
{
} 

#FormCustomEx.cs
/* 마지막으로.. : ) */
public partial class FormCustomEx : FormCustom
{
} 

/* 여기서 상속을 받아.. */
public partial class FormCustom : FormEx { }

약간 IDE Hack에 가깝지만, 간혹 유용한 경우가 있다. 

refs::
저작자 표시 비영리 변경 금지
신고
Name
Password
Homepage
Secret
2007.11.28 20:13
뭐 관심이 있는 사람만 관심이 있을 뚱딴지같은 내용.

호출 스택입니다.

오래 전에 지뢰 찾기를 만들어 본적이 있었습니다. 기본적으로 빈 칸을 눌렀을 때, 주변에 연계된 모든 빈 공간이 열리는 부분은 현재 칸을 중심으로 팔방이 빈 공간인지를 조사해가며 열어나가면 되는데, 여기서 재귀 호출을 할 때 게임 영역이 일정 수준 이상이 되면, 스택 오버플로우가 일어나더군요.. 그래서 아래와 같은 테스트 코드를 작성하였습니다.

var sc = 0;
try
{
	(function recursive_stack_test()
	{
		recursive_stack_test(++sc);
	})();		
}
catch (e) 
{
	document.writeln("stack count -> " + sc);
}
 

현재 브라우져에서 위의 테스트를 누르면 결과가 나옵니다.. 몇몇 다른 블로그에서 확인한 결과 값과 조금 씩 다른데 그 현상에 대한 기록을 조사해 보았습니다.

먼저 IE의 경우에는 Eric Lippert에 따르면..
function context에 진입할 때마다 새로운 "activation" frame이 JScript 스택에 쌓이게 된다. 이 JScript 스택은 힙영역에 위치하기 때문에 그다지 문제가 되지 않지만, 이와 동시에 새로운 인터프리터의 사본도 생성되어 시스템 스택영역에 위치하게 되는데, 이는 수 백 바이트 정도를 차지하며, 가용한 시스템 스택의 크기가 1,000,000 Bytes 라고 할 때 순식간에 이 용량을 소비하게 된다..
라고 하였습니다. 직접 실시한 브라우져마다 테스트 결과는
  • Internet Explorer 6 : 900~1200
  • Internet Explorer 7 : 1700~
  • FireFox 2.0.0.4 : 1000 (1001) (!) 고정
  • FireFox 3.0b2pre : 245160 (Wow)
  • Opera 9.24 : 3300+
  • Safari 3.0.4 : 499 (500)
FireFox의 경우 1000 (fencepost 1001)에서 고정되는 현상은 버그질라에 많이 올라와 있습니다. 위에 3.0에 보시면 아시겠지만, 이미 버그 처리되어 수정된 사항입니다.

Safari의 경우 원래 제한이 100(fencepost)이었습니다. 몇몇 웹 어플(gmail 같은..)데서 "Maximum call stack size exceeded" 에러가 버그 리포팅되어 수정된 현재가 500입니다. (근데 이것도 모자르지 않나요?)

기본적으로 FireFox 3.0b2pre를 제외하고는 상황에 따라서는 고정된 재귀 호출 스택 제한을 고려해야 됩니다. 특히 Safari의 경우는 문제가 좀 있죠. :(

참고가 되셨으면 합니다.
신고
BlogIcon 랜덤여신 | 2008.09.20 12:24 신고 | PERMALINK | EDIT/DEL | REPLY
자바스크립트에도 콜스택 제한이 있었군요. 재밌네요.

방금 파이어폭스에서 테스트해보니 3000이 나오는군요. 구글 크롬이 9358, 사파리는 여전히 499네요.
karl | 2012.06.07 15:15 신고 | PERMALINK | EDIT/DEL | REPLY
지금 현재 브라우져 별로 눌러본 결과
사파리는 58252 나오네요..
크롬은 8939, 오페라는 32614, IE는 40146 나옵니다.
참고가 되는 분이 계셨으면 좋겠네요..
Name
Password
Homepage
Secret
2007.08.29 11:23
[System.Threading.Timer] 만약에 특정 시간에 어떠한 작업을 수행할려고 하면 어떻게 해야 될까? 기본적으로 프레임워크상에 Timer Class를 제공하기 때문에 우리는 그다지 크지 않은 노력을 통해 이를 사용할 수 있다. 하지만, 간혹 가다 이러한 Timer를 잘못 사용하는 경우가 있다.

서두에 밝힌 것처럼 매일 "오전 09:00"에 특정 작업을 수행하고 싶다고 할 경우, 어떠한 사람들은 Timer를 사용하여 매 초, 혹은 일정 주기 간격으로 시간을 확인하는 작업을 수행하여 현재 시간과 특정 작업이 일어나야 될 시간을 비교하여 시간이 지났거나, 같을 경우 작업을 실행한다. 하지만 이는 낭비이다. 유저에게 특정 간격으로 Notify를 줄 필요성이 없다면 굳이, 주기적인 Timer를 다시 주기적으로 실행되도록 할 필요는 없다. 이는 꼭 "역전"이라고 표기해야 될 것을 "역전앞"이라고 표기하는 것과 마찬가지이다.

이러한 "낭비"를 없애기 위한 간단한 방법은 간단하게 dueTime을 계산해 주는 방법이 있다.

현재 시간이 09:00이고 특정 작업이 실행되어야 할 시간이 10:00라면 1시간을 dueTime으로 넣어주면 원하는 시간에 특정작업이 한번 실행된다. 만약 24시간 주기로 특정 시간에 특정 작업을 해야 된다면, Timer의 실행 주기를 24시간을 넣어주면 된다.

public delegate void stCallBackDelegate();

    public class ScheduledTimer
    {
        private Timer _timer;

        public ScheduledTimer() { }

        public static TimeSpan GetDueTime(TimeSpan A, TimeSpan B)
        {
            if (A < B)
            {
                return B.Subtract(A);
            }
            else
            {
                return new TimeSpan(24, 0, 0).Subtract(B.Subtract(A));
            }
        }

        public void SetTime(TimeSpan _time, stCallBackDelegate callback)
        {
            if (this._timer != null)
            {
                // Change 매서드 사용 가능.
                this._timer.Dispose();
            }

            TimeSpan Now = DateTime.Now.TimeOfDay;
            TimeSpan DueTime = GetDueTime(Now, _time);
 
            this._timer = new Timer(new TimerCallback(delegate(object _callback)
            {
                ((stCallBackDelegate)_callback)();
            }), callback, DueTime, new TimeSpan(24, 0, 0));
          }
    }
기본적으로 TimeSpan 클래스는 "시간의 길이"를 나타낸다. 즉 9시간에 24시간을 더하면 33시간, 1일 9시간이 된다. DateTime.Now.TimeOfDay는 해당 날짜의 0시부터 현재 시간까지의 길이를 돌려준다. 즉 TimeSpan 클래스를 사용하면서 착각해서는 안되는 부분은 9시간에 24시간을 더하면 24시간 주기로 다시 9시가 될 것이라는 생각이다. 우리가 원하는 스캐쥴러는 이러한 방식이 필요하다. 즉 현재 시간이 오전 11시이고, 특정 작업이 실행되어야 할 시간이 이미 지난 시간이 오전 9시라면, 지연되어야 할 시간은 22시간이다.

작업 예약 시간이 현재 시간보다 나중이면 간단하게 현재 시간에서 예약 시간을 빼면 지연되어야 할 시간이 계산된다. 하지만 반대로 예약 시간이 이미 지난 시간이면, 마이너스 시간 길이가 나오는데, 이를 dueTime에 넣어주면 Timer는 Disable상태가 되어 버린다. 고로 위와 같은 방법으로 지연시간을 계산하여야 한다.
신고
BlogIcon 도아 | 2007.10.08 11:00 신고 | PERMALINK | EDIT/DEL | REPLY
제 블로그에 답글을 달아 주신 분들(http://offree.net/entry/Greetings-Reply )을 순회하고 있습니다. 소중한 댓글 감사합니다.

그런데 주 관심사가 프로그래미인 것 같습니다.
BlogIcon slimes | 2007.11.05 11:33 신고 | PERMALINK | EDIT/DEL | REPLY
네.. :) 관심사는 아니고 업에 가깝습니다.
go2by | 2009.02.18 10:14 신고 | PERMALINK | EDIT/DEL | REPLY
좋은 글 감사합니다.
덕분에 제가 하려는 작업을 쉽게 끝낼 수 있었네요..

그런데 위 함수 GetDueTime에서 잘못된 부분이 있는 듯 하여 글 남깁니다.
A > B 일 경우,
return new TimeSpan(24, 0, 0).Subtract(A.Subtract(B)); 가 맞지 않나요?
B.Subtract(A)의 결과는 음수이고 그 앞의 Subtract와 만나게 되면 결국 24시간을 "더하게" 될텐데요..
예를 들어, 현재 시각이 09시 이고 작업시각이 매일 02시라면,
기존 식으로는 1.07의 결과값이 나오므로 아마도 최초 작업시각은 다음날 16시가 될 것입니다.
하지만 제가 말씀드린 식으로 처리하면 17의 결과값이 나오므로 원하는 시각에 작업이 시작되겠죠..
BlogIcon 엔돌슨 | 2009.06.06 10:35 신고 | PERMALINK | EDIT/DEL | REPLY
this._timer = new System.Windows.Forms.Timer(new TimerCallback(delegate(object _callback)
코드의 일부중 이게 맞나요?
모호하다고해서 선언을했는 데요..

이런 알고리즘이 필요한데 이해는 대략되는 데 소스 보고도 구현이 안되네요.
컴파일지 오류가나요.

오류 1 '4'개의 인수를 사용하는 'Timer' 메서드에 대한 오버로드가 없습니다.

아마도 모호한거 때문에 그런거 같아서 변경을 했는 데 오버로드 오류가 나네요..
BlogIcon 엔돌슨 | 2009.06.06 11:46 신고 | PERMALINK | EDIT/DEL | REPLY
using System.Threading; 를 사용하니 되네요 몰랐습니다 ^^
| 2009.06.06 12:57 | PERMALINK | EDIT/DEL | REPLY
비밀댓글입니다
BlogIcon slimes | 2009.06.21 22:39 신고 | PERMALINK | EDIT/DEL
시간 길이는 TimeSpan으로 지정해 주시면 됩니다. (#21)
그리고 두번째 인자로 callback 함수에 대한 대리자를 지정해 주시면 되는데, 소스 #01 라인에 보시면 아시겠지만, stCallBackDelegate는 인자가 없는 delegate입니다.

public void _callback() {
지정 시간이 지난 뒤 처리될 작업
}..

new stCallBackDelegate(_callback) 이렇게 넣어주시면 되겠습니다.
nanumoku | 2013.01.08 19:22 신고 | PERMALINK | EDIT/DEL | REPLY
#17에

return new TimeSpan(24, 0, 0).Subtract(A.Subtract(B));

이게 맞을 듯 한데....
kuroko314 | 2013.03.28 11:05 신고 | PERMALINK | EDIT/DEL | REPLY
돌려보니 17 번째 라인
return new TimeSpan(24, 0, 0).Subtract(B.Subtract(A));

return new TimeSpan(24, 0, 0).Subtract(A.Subtract(B));
이렇게 바뀌어야 맞네요
Name
Password
Homepage
Secret
2007.08.29 09:36
간혹가다 두 개의 독립된 Process간의 통신이 필요한 경우가 있다. 기본적으로 .NET Remoting을 통해 구현을 할수도 있겠지만, 좀 더 간단한 구현을 원할 경우에는 Process 클래스에서 제공하는 표준 입출력 Redirection을 통해 두 개의 프로세스간에 메세지를 교환할 수 있다.

ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "Program.exe";
psi.RedirectStandardOutput = true;
psi.UseShellExecute = false;

Process TargetProgram = new Process();
TargetProgram StartInfo = psi;
TargetProgram.OutputDataReceived += 
new DataReceivedEventHandler(TargetProgram_OutputDataReceived);

TargetProgram.Start();

//대상 프로세스의 표출 출력을 읽어들인다.
TargetProgram.BeginOutputReadLine();

void TargetProgram_OutputDataReceived(object sender, DataReceivedEventArgs e)
{    
    if (!String.IsNullOrEmpty(e.Data))
    {
         Console.WriteLine(e.Data);
    }
}
// "Program.exe"
Console.WriteLine("Hello :)");
반대의 경우로 송신을 원할 경우에는 대상의 표준 입력을 재설정하고, 표준 입력 스트림에 메세지를 송신하면 된다.
TargetProgram.StartInfo.RedirectStandardInput = true;
StreamWrite sw = TargetProgram.StandardInput;
myStreamWriter.WriteLine("Hello ;)");
신고
BlogIcon 최익필 | 2010.02.21 17:34 신고 | PERMALINK | EDIT/DEL | REPLY
이렇게 정보를 인터넷에 올려 주셔서 감사합니다.
요기나게 사용했습니다.

수고하세요.
G군 | 2014.06.22 00:42 신고 | PERMALINK | EDIT/DEL | REPLY
저 상태에서 따로 주소를 설정해서 다른 폴더에 있는 프로세스에는 적용할 수 없나요?

직접 적용을 시켜봤는데 파일을 찾을 수 없다는 말만 뜨네요. 위에 있는 설정을 제외하고 주소와 이름만을 가지고 실행시킬때는 아무런 문제가 없었는데;;;
Name
Password
Homepage
Secret
2007.08.08 11:05
System Wake-up Events

원래의 목적은 SetSuspendState를 통해 Standby 상태로 진입시켜 놓고 Wake up Event를 발생시켜 활성상태로 복귀시키는 것이 목적이었다. MSDN에서는 Waitable timer를 통해 이러한 과정을 진행시키는 내용을 명기해 놓았고, 몇몇 자료에서 .NET 환경에서 Waitable timer는 System.Threading.Timer와 대응하기 때문에 이를 통해 Wake up Event를 발생시킬수 있다고 나와있으나, System.Threading.Timer도 API의 Waitable timer도 Standby 상태에서 자동으로 활성상태로 복귀시켜주지 않았다.

일단 주 목적은 모니터를 끄는 것이었기 때문에, 시간 관계상 SendMessage를 통해 모니터를 제어하는 수준에서 처리 하였다.
const int WM_SYSCOMMAND = 0x0112;
const int SC_MONITORPOWER = 0xF170;

const int MONITOR_ON = -1;
const int MONITOR_OFF = 2;
const int MONITOR_STANBY = 1;

[DllImport("user32.dll")]
private static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);

/* ... Turn Off ... */

SendMessage(this.Handle.ToInt32(), WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF);

신고
BlogIcon 싱찬's | 2007.08.19 20:25 신고 | PERMALINK | EDIT/DEL | REPLY
잘 보고 갑니다.
Name
Password
Homepage
Secret
prev"" #1 #2 next

티스토리 툴바