ASP.NET 에서 돌아가는 스케줄러 구현


루트에 Global.aspx 생성

public class Global : System.Web.HttpApplication

{

protected void Application_Start(object sender, EventArgs e)

{

StartScheduler();

}


...

...


//////////////////////////////////////////////////////////////////////////

// 스케줄러 소스 시작

private static DateTime whenTaskLastRan = DateTime.Now; // 마지막 스케줄러가 실행된 시간


private void StartScheduler()

{

ThreadStart tsTask = new ThreadStart(ScheduleTaskLoop);

Thread MyTask = new Thread(tsTask);

MyTask.Start();

}


static void ScheduleTaskLoop()

{

while (true)

{

DateTime oneDayAgo = DateTime.Now.AddDays(-1);


// 하루가 지났으면(새벽 4~ 6사이)

if ((whenTaskLastRan < oneDayAgo) && (4 <= oneDayAgo.Hour && oneDayAgo.Hour <= 6))

{

if(ScheduledTask())

whenTaskLastRan = DateTime.Now;

}

// 한시간 동안 Sleep

System.Threading.Thread.Sleep(TimeSpan.FromHours(1));

}

}


static bool ScheduledTask()

{

bool ret = false;

try

{

// DoSomething... 스케줄 걸 작업들.

ret = true;

}

catch (Exception e)

{

}

return ret;

}


// 스케줄러 소스 종료

//////////////////////////////////////////////////////////////////////////

}


}


1. MSSQL에서 CustomMemberShip Database 생성및 계정 추가


2. cmd 실행

cd C:\Windows\Microsoft.NET\Framework\v4.0.30319>

aspnet_regsql.exe


DB 이름 선택, 연결 하여 끝냄


3. web.config 설정


<configuration>

  <connectionStrings>

    <add name="ConnectionString" 

connectionString="server=SERVERNAME;

database=CustomMembership;uid=userid;password=userpassword;"/>

  </connectionStrings>

  <system.web>

<roleManager defaultProvider="CustomProvider" enabled="true">

<providers>

<add connectionStringName="ConnectionString" 

name="CustomProvider"

type="System.Web.Security.SqlRoleProvider" />

</providers>

</roleManager>


<membership defaultProvider="CustomMembershipProvider">

<providers>

<add name="CustomMembershipProvider"

type="System.Web.Security.SqlMembershipProvider"

connectionStringName="ConnectionString" />

</providers>

</membership>



참고 URL : http://blog.naver.com/PostView.nhn?blogId=knight50&logNo=80101563731&redirect=Dlog&widgetTypeCall=true

1. 빌드 & publish 
  


 


 d:\tmp\bak 로 소스 출력됨


2. 컴파일

aspnet_compiler.exe -p d:\tmp\bak -v / d:\tmp\bak1 -errorstack

 입력 d:\tmp\bak -->  출력 d:\tmp\bak1
 



  C:\> C:
  C:\>cd \Windows\Microsoft.NET\Framework64\v4.0.30319
  C:\Windows\Microsoft.NET\Framework64\v4.0.30319>aspnet_compiler.exe -p d:\tmp\bak -v / d:\tmp\bak1 -errorstack
  Utility to precompile an ASP.NET application
  Copyright (C) Microsoft Corporation. All rights reserved.

  C:\Windows\Microsoft.NET\Framework64\v4.0.30319>

3 배포
 d:\tmp\bak1 --> 웹사이트에 배포함.
 



스마트 에디터 2.1.1 다운로드

http://dev.naver.com/projects/smarteditor/download 


asp.net 프로젝트 생성(naver01로 생성했음) 첨부 파일 참고 


smartedtor2.1_aspnet_v2.zip



프로젝트 se 디렉토리에 복사.


/se/popup/quick_photo/FileUploader.aspx 생성및 작성


private string UploadDir = "/UploadFiles/"; // Upload dirctory


// 이미지 파일을 서버에 저장하고 저장한 정보를 클라이언트에 보내줌.

protected void Page_Load(object sender, EventArgs e)

{

if (!IsPostBack)

{

HttpFileCollection uploadedFiles = Request.Files;

string callback_func = Request.Form["callback_func"];


// 다수의 파일을 다운로드 하여 파일을 저장함

for (int j = 0; j < uploadedFiles.Count; j++)

{

HttpPostedFile userPostedFile = uploadedFiles[j];


// 파일 내용이 있을경우

if (userPostedFile.ContentLength > 0)

{

string fileName = Path.GetFileName(userPostedFile.FileName);

string fileUrl = UploadDir + fileName; // 업로드 디렉토리 + 파일명.


// 파일 저장  (같은 파일명일경우 에러 처리 필요)

userPostedFile.SaveAs(Server.MapPath(fileUrl));


// 클라이언트에 저장한 파일 정보를 보내 줌

string returnUrl = string.Format("callback.html?callback_func={0}&bNewLine=true&sFileName={1}&sFileURL={2}",

callback_func, fileName, fileUrl);


Response.Redirect(returnUrl);

}


}

}

}



/se/popup/quick_photo/QuickPhotoPopup.js 수정

function callFileUploader (){

oFileUploader = new jindo.FileUploader(jindo.$("uploadInputBox"),{

sUrl: location.href.replace(/\/[^\/]*$/, '') + '/FileUploader.aspx', // FileUploader.aspx 경로


/se/popup/quick_photo/callback.html 수정

document.domain = location.protocol + "//" + location.host; // 자기 서버 URL



/Write.aspx 생성 및 작성

제일 상단 내용에 ValidateRequest="false" 추가.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Write.aspx.cs" Inherits="naver01.Write" %>

를 아래와 같이

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Write.aspx.cs" Inherits="naver01.Write" ValidateRequest="false" %>

나머지는 소스 참고.


web.config 설정 파일에 아래내용 추가

    <system.web>

<httpRuntime requestValidationMode="2.0" />

</system.web>



참고 URL

http://dev.naver.com/projects/smarteditor/tech/39360



환경 visual stodio 2010,  SmartEditor 2.1.1


smartedtor2.1_aspnet_v2.zip



cmd.exe 를 관리자 모드로 실행하고

서비스팩 제거
 DISM /online /Cleanup-Image /SpSuperseded
 

명령을 치면 서비스 팩 설치 시 만들어진 백업 파일을 제거합니다.
약 2G 용량을 확보하네요.

최대 절전모드 해제 - 데스크탑만 하세요. c:\hiberfil.sys 파일 삭제.
 powercfg -h off
참고 링크 : http://blog.naver.com/psy2993/90098898571

가상 메모리를 줄이기(메모리 4기가 이상시에만 추천함)
winkey + Break --> 고급 시스템설정 --> 성능설정 --> 고급 --> 가상메모리변경 --> 처음크기, 최대크기 512

참고 링크 : http://blog.naver.com/psy2993/90098898571


시스템보호기능 제거.
...
모니터 4:3 19인치 LCD가 고장나서 용산 전자 상가에 갔습니다. (기종은 pcbank pbm-980tvro)



수리비 3만원을 초과하면 그냥 새거 살려고 생각하고 갔습니다.

선인 상가 21동 1층에 구글 검색하면 나오는 하트 전자에 갈려고 했더니
어떤분이 가고 있어서 가격협상하기 힘들겠다 싶어서 포기하고 1층 LCD수리하는곳 아무곳이나 나오길래 갔더니 기본이 2만 5천원이고 인버터 등이 나갔으면 3만5천원까지 달라고 하더군요.

3만원 넘으면 생각해 보겠다고 하니 2층에 가보라고 해서 2층에 갔습니다.
2층에 알아본 딴 업체에 갈려고 했더니 모니터 수리하냐면서 붙잡는 용순이....
4만원 부르네요 ㅡ.ㅡ;;;

2층에 알아본 딴 업체 가다가 수리만 하는 업체들이 즐비한 곳을 발견하고 맨 처음 업체에 가격 물어보니....
2만 5천원에 고쳐준답니다.

모니터 분해해보고 인터버 고장 확인후 바로 교체하는데 생각으로는 으악 만원 더 올라가는거 아닌가 생각하고 좌절하고 있었는데...

15분도 안되서 수리 완료하고 수리비 2만 5천원 줬습니다 ^^//

그래서 그 상호를 알아왔죠 ㅎㅎ

인터넷 사이트도 없고 한 3~5평 정도 되는 조그마한 회사인것 같네요.

한솔컴퓨터 선인 21동 2층 229호 02-718-6798

그냥 수리 싸게 해서 올려놔봅니다^^


완전구현은 하지 않았습니다.
주석부분을 구현하면 됩니다.
구현부분은 어렵지 않은코드입니다.
private function copyDir(dirName:String, toDir:String):void
{
	var directory:File = new File(dirName);
	var contents:Array = directory.getDirectoryListing(); 
	for (var i:uint = 0; i < contents.length; i++) 
	{
		var f:File = contents[i] as File;
		if( f.isDirectory )
			copyDir(f.nativePath, toDir + "\\" + f.name);
		else
			copyFile(f, toDir); 
	}
}

private function copyFile(srcFile:File, toDir:String):void
{
	// 대상 디렉토리가 없으면 디렉토리 생성.
	
	// 대상 파일이 있으면 삭제.
	var newFileName:String = toDir + "\\" + srcFile.name;
	
	// 대상 파일이동 혹은 복사.
	
	trace("copy", srcFile.nativePath, newFileName);
}
	
protected function btnFileCopy_clickHandler(event:MouseEvent):void
{
	copyDir("d:\\tmp", "d:\\TT");
}

http://gleamynode.net/articles/1543/bash-here-context-menu-with-puttycyg
에서 bash-here.zip 다운로드

http://rapzzard.egloos.com/1851769
에서 dputty 다운로드

1. cygwin 설치 ( chere 패키지 필수 설치 )

2. 다운로드 받은 dputty를 c:\cygwin\bin에 압축풀기

3. bash-here.reg를 병합.

4. cygwin 한글 설정
 ~/.inputrc
 # Allow 8-bit input/output
set meta-flag on
set convert-meta off
set input-meta on
set output-meta on

~/.bashrc
 export LANG=ko_KR.UTF-8

5. dputty 실행후 기본설정 UTF-8 설정








끝)









마비노기 윈드밀러...
참으로 돈 안들고 그나마 어렵지 않아서 좋다^^

몇가지 주의 사항을 여기에 써본다.

1. 윈드밀 1랭.. 당연하다^^

2. 피통은 150~200 사이가 적당한것 같다.
 - 윈드밀을 사용하면 피 10%가 줄기 때문에 피통이 클수록 피가 줄어드는 것도 크기때문.
 - 건들렛이나 장갑류 접두에 냉혹한, 나머지 접미 도둑 인챈등으로 피통을 낮쳐준다.
 - 팔라 스킬 스피리트 오브 오더 F랭으로 두고(피통 늘어나는것 방지) 소드오브오더 1랭, 파워오브오더 1랭으로 올린다.
   팔라 지속 시간은 환생횟수와 관계가 있다  스트리트 오브 오더와는 전혀 관계가 없다.

3. 생명력 포션은 2개 좋류를 가지고 다니는것이 좋다. 30포션, 100포션

4. 생명력은 항상 80~90% 근처에 머물게 포션을 먹어준다.
 - 윈드밀을 몇번 사용하면 물약 몇개 먹어야하는지 알아 두자^^
 - 생명력이 급격하게 달경우 100포션을 먹어준다.(단축키 필수)
 - 생명의 포션을 약 5초 이상의 간격을 두면서 먹으면 포션 중독 방지 효과가 있다.

5. 팔라딘 스킬에서 스피리트 오브 오더는 F랭으로 묶어둔다. 이 스킬 랭크를 올리면 피통이 장난 아니게 늘어난다.
  그 이유는 이 랭크를 올리면 피통이 늘어나서 원드밀을 한번쓰면 10%의 피통 줄어드는데
   이게 상위 랭크로 갈수록 장난 아니다.
  ** 변신(팔라) 지속 시간은 환생횟수와 관계가 있다

6. 크리티컬은 30%만 채운다.
 - 윈드밀 스킬 사용시 상대방 보호 무시 효과때문에 마비노기 최대 크리티컬인 30%만 채운다.
 - 도둑인챈(대부부의 장비) + 거센 모자 정도면 충분하다.

7. 자동 윈드밀 타격법을 배운다.
 - 윈드밀 스킬을 시전 전에 캐릭터 근처 땅바닥을 클릭 한채로 스킬을 시전한다. (마우스는 계속 클릭상태중)
 - 윈드밀 스킬 시전중, 시전후에 윈드밀 범위를 벗어난 곳을 클릭하고 윈드밀 범위 안쪽으로 드래그한다.

8. 중요 스킬 단축키는 왼손에 모두 오게 바꾼다.
 - 기본단축키중 1, 2, 3, 4, 5, 6, 7, 8, 9, 0을 1,2,3,4,5,6,q,w,e,r,t 로 설정하고 전체 스킬창을 이에 맞게 바꿔준다.
 - z 단축키는 전체 스킬창으로(공격을 시작하기전 한번씩 눌러준 다음 공격을 하자)
 - Shift a,s,d,f -->펫소환, Alt + c 펫소환해제 Shfit + c 펫예교(이리와! 보다 훨씬 반응속도가 빠름)

압축해제 프로그램 제작 

  • 이제 압축 해제 프로그램을 제작해보자.
  • 여기서는 그냥 무압축된 zip파일을 해제해 보도록하겠다.
  • 앞서 3번째 강좌 ( http://fehead.tistory.com/164 )에서 zip localheader file을 이용한 파일 리스트 보기 소스를 기억하는가?
  • 거기 파일리스트를 출력하는 바로위에 아래 한줄만 추가해보자. 

        // 추가된소스 한줄
        unzip(filename, data, l.compressed_size);

        // 원래 소스
        printf("%s\tCompressed size:%u\t Uncompressed size:%u\n",
                filename, l.compressed_size, l.uncompressed_size);

  • 자 이제 위 내용을 main 함수위에 코딩하면된다. 

// 압축파일 해제

void unzip(const char * filename, const char * data, ulong size)
{
    // 파일을 연다.
    FILE *  file = fopen(filename, "w");
    if(file == 0)
    {
        perror("fopen:");
        return;
    }

    // 파일에 데이터를 쓴다.
    fwrite(data, 1, size, file);

    // 파일을 닫는다.
    fclose(file);
}



# 컴파일
$ gcc -o tunzip tunzip.challo


# 테스트를 하기 위해 임시 디렉토리 생성
$ mkdir tmp

# test.zip 파일과 방금 만든 프로그램을 임시 디렉토리로 복사.
$ cp test.zip tunzip tmp

# 임시 디렉토리로 이동
cd tmp
$ ls -l
합계 12
-rw-r--r-- 1 fehead users  334  8월 18 18:18 test.zip
-rwxr-xr-x 1 fehead users 6446  8월 18 18:18 tunziphallo

# 프로그램 실행
$ ./tunzip 
aa.txt  Compressed size:16       Uncompressed size:16
bb.txt  Compressed size:16       Uncompressed size:16

# 압축 풀린것 확인.
$ ls -l
합계 20
-rw-r--r-- 1 fehead users   16  8월 18 18:18 aa.txt
-rw-r--r-- 1 fehead users   16  8월 18 18:18 bb.txt
-rw-r--r-- 1 fehead users  334  8월 18 18:18 test.zip
-rwxr-xr-x 1 fehead users 6446  8월 18 18:18 tunzip

# 내용물 확인.
$ cat aa.txt
0123456789ABCDEF


  • 압축 해제 프로그램을 작성했다.. 와!!!
  • 몇 강좌후에 진짜 압축된 파일도 한번 압축해보자. 

  • 다음강좌는 파일을 무압축으로 zip파일을 만들어보는것을 해보도록하자.

     전체소스는 아래 첨부파일을 참고 하세요. 
    압축파일
     
    소스
     

+ Recent posts