'분류 전체보기'에 해당되는 글 744건

  1. 2009.11.17 [ss] isml(Live Smooth Steram)은 MediaElement에서는 작동이 안된다?
  2. 2009.11.17 [ss] 강제로 BitRate Change (Switching)
  3. 2009.11.17 [ss] Smooth Streamming Player Source
  4. 2009.11.17 [ss] 스무스 스트리밍을 시작하다.
  5. 2009.11.16 [잡담] cowon s9 와 s605
  6. 2009.11.11 [ps] 레지스트리 조작 부팅시 start-up 프로그램 지정
  7. 2009.11.11 [sc] 시스템 정보보기 하드웨어 정보까지, 시계 gui 표시
  8. 2009.11.11 [sc] sconfig 의 놀라운기능!!
  9. 2009.11.11 [sc] 서버코어 공유폴더 연결법 및 기타 정보들
  10. 2009.11.04 [ps] xml file control 하기
  11. 2009.11.03 [sql] appcmd 명령어 도움말
  12. 2009.10.28 [ps] powershell simplemenu, dictionary, array 사용법
  13. 2009.10.28 [ps] powershell 에서 app.cmd 파라미터를 넣을때 에러
  14. 2009.10.22 코딩 규칙을 알려주는 프로그램 ReSharper 단축키
  15. 2009.10.21 [site] 개발자 커뮤니티 새로운것?
  16. 2009.10.12 [ps] 폴더 존재여부 검사하기
  17. 2009.10.12 [sc] sql 2008 express 무인설치 성공(slient install)
  18. 2009.10.12 [sc] 서버코어 내가 찾아낸 정보들
  19. 2009.10.07 [ps] db 수동으로 붙이기
  20. 2009.10.07 [ps] 파워셀 기본문법 2
  21. 2009.10.07 [ps] 파워셀 기본문법
  22. 2009.10.07 [ps] 레지스트리 수정하기
  23. 2009.10.06 [ps] power shell 메뉴얼
  24. 2009.10.06 [ps] GUI 기반의 PowerSheel Tool (Quest PowerGUI)
  25. 2009.10.06 [ps] power shell 프로그램 실행하는 간단한 방법
  26. 2009.10.05 [기타] 프로그래밍 폰트 및 세팅 파일 내가쓰는거
  27. 2009.09.29 [wpf] 핑테스트 가능 코드
  28. 2009.09.25 개인컴퓨터에 TIme Server 구축하기(NTP Server) 1
  29. 2009.09.24 [wpf] about Thread Pool 1
  30. 2009.09.24 [wpf] Thread Event ManualResetEvent AutoResetEvent
Smooth Streaming2009. 11. 17. 09:25

현재 알아본 바에 의하면 맞다....


하지만 SmoothStreamingMediaElement로 했을때는 작동이 잘된다.....


MediaElement에서는 지원을 안하는거 같다....


하지만 또 bitrate status 그래프는 SmoothStreamingMediaElement에서는 지원을 안한다.


그래서 할수 없이 MediaElement를 써야하는데..... bitrate상황을 볼려면 ㅡ.ㅡ;;


아마 beta1이라서 나중에 지원을 해줄지도 ㅡ.ㅡ


그리고 MediaElement로 player 시킬때에는 꼭 Mainpage에 즉 처응에 실행하면 안되고


버튼을 만들어서 실행시켜야한다. 나중에 참고하자.....



Posted by 동동(이재동)
Smooth Streaming2009. 11. 17. 09:20

이거 찾느라 참 힘들었다....


내가 생각한 SetBitRage가 맞는것이다....


현재 내가 쓰는 Control은 예전부터 쓰던 MediaElement이고 


Smooth Streaming Devolopkit beta1 을 깔면 SmoothStreamingMediaElement를 얻을수 있다....


MediaElement랑 비슷하지만 좀더 기능이 많고 최적화 되어있다....


내가 한 뻘짓은 


private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
{
if (string.IsNullOrEmpty(InputBox.Text) == true)
return;

Uri uri = new Uri(InputBox.Text, UriKind.Absolute);

source = new AdaptiveStreamingSource();
source.MediaElement = Media;
source.ManifestUrl = new Uri(InputBox.Text);
//source.SetBitrateRange(MediaStreamType.Video, 100, 100);
//source.SetOfflinePlaybackBitrateInKbps(MediaStreamType.Video, 100);
source.PlayBitrateChange += new EventHandler<BitrateChangedEventArgs>(source_PlayBitrateChange);
source.StartPlayback();
GraphPanel.Children.Clear();
GraphPanel.Children.Add(source.StatisticsGraph);
}

이건 버튼을 클릭하면 Media라는 MediaElement에 ism영상을 보여주는것이다.


근데 SetBitrateRange를 위에서 보는거와 같이 설정해두었다


하지만 영상의 bitrate는 보이지 않았다. 이유는 player를 하기전에 세팅한거같아서 paenl에 add하고 넣어도 작동이 되지 않았다...


아 이 메서드가 아닌가? 싶어서 구글을 삿삿이 찾았지만 이 메소드를 쓴 사람이 전세계에 아무도 없었다....


하지만 버튼을 하나더 만들어서 플레이어 도중에 구현을 했더니


void xTestButton_Click(object sender, RoutedEventArgs e)
{
long minBitrate = 100;
long maxBitrate = 100;
source.SetBitrateRange(MediaStreamType.Video,minBitrate , maxBitrate);
MessageBoxResult messageBoxResult = MessageBox.Show("change bitrate" +minBitrate+" , " + maxBitrate);
}


작동이 잘되었다 아마 버그인가? 


아니면 내가 못한것일까?........


소스 :  [#FILE|SmoothStreamingSample.zip|pds/200911/17/37/|mid|0|0|pds15|0#]




Posted by 동동(이재동)
Smooth Streaming2009. 11. 17. 09:12


Microsoft Expression encoder 3에있다...


C:\Program Files\Microsoft Expression\Encoder 3\Templates\en\


현재는 3버전으로 나와서 저 경로 에 있다...



출처 : http://www.cynergysystems.com/blogs/page/michaelwolf/20090702

Posted by 동동(이재동)
Smooth Streaming2009. 11. 17. 09:11

사실 한지는 한 한달된거 같은데 현재 나온 모든 Smooth Streamming 자료를 찾아본듯하다....


현재 알고있는 자료는 음...


Smooth Streaming UI 만들기
http://silverlightsdk.net/37
http://blogs.iis.net/vsood/archive/2009/10/14/building-your-first-smooth-streaming-player.aspx
필요한거 smooth streaming player development kit안에있는 dll 이랑 pluginmssctrl.dll,smoothstreaming.dll

Slow Motion using the Smooth Streaming Media Element (SSME)
http://blogs.southworks.net/ejadib/category/smooth-streaming-media-element/

그리고 더 많이 알았지만 귀찬아서 안올려야지 나중에 올려야지


Posted by 동동(이재동)
세상사는 이야기2009. 11. 16. 13:25

사고 싶다....... s9는 현재 32gb 최저가가 32만원이고

s605는 52000원대(?)

이다. 총 대략 40만원은 깨질꺼 같다.


그래도 사고 싶은걸 어떡해ㅋㅋ


이제 내 pmp tavi도 정리하고 싶다~

Posted by 동동(이재동)
Power Shell2009. 11. 11. 11:12
##################################################################
# StartUpInstall - 이재동 - jdlee@innotive.com
#
# 부팅시 Install2를 자동으로 실행한다.
#
#################################################################

param
(
[string]$ParamOption
)

Function StartUpInstall
{
param([string]$ParamOption )
$RegStartUp= "HKLM\Software\Microsoft\Windows\CurrentVersion\Run"
if ($ParamOption -eq "/u")
{
Remove-ItemProperty $RegStartUp -Name Install
}
else
{
Set-ItemProperty $RegStartUp -Name Install -Value c:\setup\install2.bat
}
}

StartUPInstall $ParamOption




Remove-ItemProperty $RegStartUp -Name Install = regkey를 지우는것


Set-ItemProperty $RegStartUp -Name Install -Value c:\setup\install2.bat  = regkey 수정이나 추가할때 쓰인다.



startup 출처: http://blog.scorpiotek.com/2008/12/31/how-to-create-startup-items-on-server-core/

Posted by 동동(이재동)
Windows 2008 Server Core2009. 11. 11. 10:39

systeminfo  



control timedate.cpl  

이건 시계를 gui 로 보여주고 세팅가능가헤 해준다 


참조 : http://winnetworks.com/articles/WS2008-SvrCoreQCG-P2.asp 

Posted by 동동(이재동)
Power Shell2009. 11. 11. 10:33
1) SConfig.exe를 실행한다
그러면 다음과 같은 그림이 나타난다


여기서 4)configure Remote Management를 선택하기 위해 4를 입력한다. 그러면 다음과 같은 그림이 나타난다


여기서 각 항목을 선택하면 다음과 같은 기능이 실행되는 것이다.
1) Allow MMC Remote Management : 이것은 원격 컴퓨터에서 MMC 관리도구를 통하여 접속하도록 허용하는 것이다
a. Virtual Disk Service(VDS)를 구성하여 Auto Start 설정하기.
b. Virtual Disk Service 시작하기
c. 방화벽 설정에서 "Remote Administration"에 대하여 예외 설정함(즉, 방화벽은 ON이 상태에서 원격 관리로 접속하는 것은 허용하겠다는 뜻이다)
d. 방화벽 설정에서 "Windows Firewall Remote Management" 에 대하여 예외 설정함
e. 방화벽 설정에서 "Remote Volume Management" 에 대하여 예외 설정함
2) Enable Windows PowerShell : Windows PowerShell을 설치한다
a. .ps1 파워셀 스크립트를 실행할 수 있도록 구성함 (RemoteSigned)
b. DISM을 사용하여 [NetFx2-ServerCore] feature 설치함
c. DISM을 사용하여 [MicrosoftWindowsPowerShell] feature를 설치함
3) Allow Server Manager Remote Management : 원격 컴퓨터의 [서버 관리자]를 통하여 로컬 Server Core를 관리하도록 허용함
a. [Windows PowerShell]이 설치되어 사용 가능한지 확인한다
b. [ServerManager-PSH-Cmdlets] 및 [BestPractices-PSH-Cmdlets] feature를 설치한다
c. 아래의 PowerShell Script를 실행한다
PS C:\> Configure-SMRemoting.ps1 –force –enable
4) Show Windows Firewall Settings : 현재 방화벽 설정 상태를 확인한다

a. Netsh advfirewall show currentprofile 명령을 실행한다


출처: http://bloglee.egloos.com/5079789

Posted by 동동(이재동)
Windows 2008 Server Core2009. 11. 11. 10:11
관리자 계정 암호 변경
net user administrator *

관리자 그룹 확인
net localgroup administrators

admin 이라는 새 계정 만들기
net user admin * /add

서버의 계정 확인
net user

관리자 로컬 그룹의 admin 계정 추가 하기
net localgroup administrators /add admin

admin 계정 삭제하기
net user admin /delete

현재 컴퓨터 이름 확인
hostname

컴퓨터 이름 변경
netdom renamecomputer 현재 컴퓨터 이름 /newname:변경 할 컴퓨터 이름

지금 바로 Windows 다시 시작하기
Shutdown –r –t 0 또는 Shutdown /r /t 0

지금 바로 Windows 종료하기
Shutdown –s –t 0 또는 Shutdown /s /t 0

IP 및 DNS 정보 확인하기
ipconfig / all

현재 설정된 IP 초기화 하기
ipconfig/release

현재 네트워크 아답터 확인하기
netsh interface ipv4 show interface

IP 설정 하기
netsh interface ipv4 set address name="Local Area Connection" source=static address=XXX.XXX.XXX.XXX mask= XXX.XXX.XXX.XXX gateway= XXX.XXX.XXX.XXX
또는
netsh interface ipv4 set address name=2 source=static XXX.XXX.XXX.XXX XXX.XXX.XXX.XXX XXX.XXX.XXX.XXX
( IP, Subnet Mask, Gateway 순서)

DNS 설정하기
netsh interface ipv4 add dnsserver name="Local Area Connection" address=XXX.XXX.XXX.XXX index=1
또는
netsh interface ipv4 add dnsserver name=2 XXX.XXX.XXX.XXX index=2

도메인 조인하기
netdom join 현재 컴퓨터 이름 /domain:도메인 /userd:도메인 계정 /passwordd: *

Windows Server 2008 정품 인증하기
cd c:\windows\system32
cscript slmgr.vbs /? 옵션 확인
cscript slmgr.vbs –xpr Windows Server 2008 사용 만료기간 확인
cscript c:\windows\system32\slmgr.vbs –ipk XXXXX- XXXXX- XXXXX- XXXXX- XXXXX CD Key 입력
cscript c:\windows\system32\slmgr.vbs –ato Windows Server 2008 정품 인증

컴퓨터 고급 설정하기
Cscript Scregedit.wsf /? 옵션 확인
Cscript Scregedit.wsf /cli

[터미널 서비스 연결 네트워크 수준 높은 인증]
Cscript Scregedit.wsf /ar /v 현재 상태 확인
Cscript Scregedit.wsf /ar 0

[터미널 서비스 연결 네트워크 수준 낮은 인증]
Cscript Scregedit.wsf /cs /v
Cscript Scregedit.wsf /cs 0

[참고 : CredSSP-Credential Security Service Provider]http://technet2.microsoft.com/WindowsVista/en/library/6b6bf605-0b9f-45ed-9900-12aca2a0f2a21033.mspx?mfr=true

[ Firewall 설정]
netsh firewall set /?

원격관리 허용
netsh advfirewall set currentprofile settings remotemanagement enable

[커맨드 창이 닫혔을 경우 다시 실행 하기]
CTRL + DEL
RUN CMD

[네트워크 드라이브 연결하기]
net use z: \\아이피 또는 Netbios 이름\c$ /u:사용자 계정

[네트워크 드라이브 연결끊기]
net use z: /d

DNS 역할 설치 ( 대소문자 구분 )
start /w ocsetup DNS-Server-Core-Role

zone 생성
dnscmd . /zoneadd eldorado.com /primary /file eldorado.com /a hostmaster

DNS 역할 제거 ( 대소문자 구분 )
start /w ocsetup DNS-Server-Core-Role /uninstall

[기타 Server Role 설치]
start /w ocsetup DHCPServerCore
start /w ocsetup FRS-Infrastructure
start /w ocsetup DFSN-Server
start /w ocsetup DFSR-Infrastructure-ServerEdition
start /w ocsetup ServerForNFS-Base
start /w ocsetup ClientForNFS-Base
start /w ocsetup SIS

[기타 Server Feature 설치]
start /w ocsetup FailoverCluster-Core
start /w ocsetup NetworkLoadBalancingHeadlessServer
start /w ocsetup SUA <= X
start /w ocsetup Microsoft-Windows-MultipathIO <= X
start /w ocsetup Microsoft-Windows-RemovableStorageManagementCore
start /w ocsetup BitLocker
start /w ocsetup WindowsServerBackup
start /w ocsetup SNMP-SC

[해상도 설정 변경]
• HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Video\GUID\0000\DefaultSettings.XResolution
• HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Video\GUID\0000\DefaultSettings.YResolution

[색상 설정 변경]
• HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Video\GUID\0000\DefaultSettings.BitsPerPel
0x00000008 (8비트 - 256칼라), 0x00000010 (16비트 - 65535칼라), 0x00000018 (24비트), 0x00000020 (32비트)

[화면 보호기 설정]
기본적인 화면 보호기는 입력 없이 10분, 화면 보호기 동작 후엔 암호가 설정되는 모드가 기본 값입니다.
• HKEY_CURRENT_USER\Control Panel\Desktop\ScreenSaveActive - 0(사용 안함), 1(사용)
• HKEY_CURRENT_USER\Control Panel\Desktop\SCRNSAVE.EXE - 화면 보호기로 사용할 SCR 파일
• HKEY_CURRENT_USER\Control Panel\Desktop\ScreenSaverIsSecure - 화면 보호기 동작 후, 암호 설정 여부, 0(사용 안함), 1(사용)
• HKEY_CURRENT_USER\Control Panel\Desktop\ScreenSaveTimeOut - 화면 보호기 동작 시간(단위 초)

[기본 창, 바탕 화면 색깔]
만약 새롭게 생성하는 모든 사용자들에게 기본값으로 설정하기 위해서라면, HKEY_USERS\.Default\Control Panel에 설정합니다.
• HKEY_CURRENT_USER\Control Panel\Colors
• HKEY_CURRENT_USER\Control Panel\Desktop
Windows 색깔은 RGB 값으로 입력하셔야 합니다. "88 87 104"의 경우에는 회색(Gray)입니다.
Windows 색깔의 경우,
• ActiveBorder, ActiveTitle, GradientActiveTitle, TitleText - 활성 창의 제목
• InactiveBorder, InactiveTitle, GradientInactiveTitle, InactiveTitleText - 비활성 창의 제목
• Menu, MenuText, Scrollbar, GrayText, HiLight, HilightText, AppWorkSpace, Window - 창의 나머지에 대한 색깔
• Background의 경우에는 바탕 화면이겠죠?

[폰트와 크기]
• HKEY_CURRENT_USER\Control Panel\Desktop\WindowsMetrics
• 기타 잡다한 나머지들
• HKEY_CURRENT_USER\Control Panel\Desktop\DragFullWindows - 창 이동시 내용을 표시할지(1 - 사용, 0 - 사용 안함)
• HKEY_CURRENT_USER\Control Panel\Desktop\FontSmoothing - Font Smoothing (2 - 사용, 0 - 사용 안함 - 여기서는 1이 아니라 2가 동작 값입니다.)

[NumLock키에 대한 켜고/끄기]
HKEY_CURRENT_USER\Control Panel\Keyboard\InitialKeyboardIndicators (2 - on, 0 - off)

[키보드 재입력 시간]HKEY_CURRENT_USER\Control Panel\Keyboard\KeyboardDelay (0 - 짧음, 3 - 길게, Server Core 기본값 - 1)
[키보드 반복 속도]HKEY_CURRENT_USER\Control Panel\Keyboard\KeyboardSpeed (반복 속도 - 31이 가장 빠름(기본값))

[커서의 깜박임 설정]
HKEY_CURRENT_USER\Control Panel\Desktop\CursorBlinkRate (-1부터 200까지 -1의 경우 깜박임 기능 없애기)
마우스에 대한 각종 설정도 필요하시죠? 왼손잡이이신 분의 경우에도 마우스 설정을 바꾸셔야 하는데..

[마우스 왼손, 오른손 설정]
HKEY_CURRENT_USER\Control Panel\Mouse\MouseSwapButtons (0 - 오른손, 1- 왼손)

[마우스 속도에 대한 설정]
HKEY_CURRENT_USER\Control Panel\Mouse\MouseSpeed, HKEY_CURRENT_USER\Control Panel\Mouse\MouseTreshold1, HKEY_CURRENT_USER\Control Panel\Mouse\MouseTreshold2

[마우스 더블 클릭에 대한 설정]
HKEY_CURRENT_USER\Control Panel\Mouse\DoubleClickSpeed, HKEY_CURRENT_USER\Control Panel\Mouse\DoubleClickHeight, HKEY_CURRENT_USER\Control Panel\Mouse\DoubleClickWidth

[마우스 포인터 자국]
HKEY_CURRENT_USER\Control Panel\Mouse\MouseTrails (0 - 사용 안함, 1 - 사용)

[마우스 휠 스크롤]
HKEY_CURRENT_USER\Control Panel\Desktop\WheelScrollLines (0 - 사용 안함, 1 - 사용)
Posted by 동동(이재동)
Power Shell2009. 11. 4. 15:34

-encoding UTF8 이거 앞에 붙여야 에러가 안난다 꼭 인코딩을 신경쓰자



[xml] $XmlContent = Get-Content "c:\web.config" -encoding UTF8


echo $XmlContent.configuration.'system.serviceModel'.services.service.host.baseAddresses.add

echo $XmlContent.configuration.'system.serviceModel'.services.service.endpoint.address


이렇게 xml을 불러올올수 있고 노드를 찾아가면 된다. 만약 " . "이 있을경우 ' '로 묶으면 된다...


저렇게 되면 해당 노드값을 출력할수 있다.


수정및 저장은

$XmlContent.configuration.'system.serviceModel'.services.service.host.baseAddresses.add.baseAddress = "http://172.16.10.99:21000/MessageService.svc"
$XmlContent.configuration.'system.serviceModel'.services.service.endpoint.address = "net.tcp://172.16.10.99:20000/MessageService.svc"
$xmlContent.Save("c:\web.config")


머 이렇게 save를 하니까 잘되었다 하지만 인코딩이 좀 이상하다 확인해보아야할 부분이다.


powershll xml control에 대한 정보는 여기서 많이 얻을수 있다.

http://powershell.com/cs/blogs/tobias/archive/2009/02/02/xml-part-2-write-add-and-change-xml-data.aspx

Posted by 동동(이재동)
Windows 2008 Server Core2009. 11. 3. 17:16
http://www.wssplex.net/TipnTech.aspx?Seq=438
Posted by 동동(이재동)
Power Shell2009. 10. 28. 10:53
powershell simple menu

http://www.blkmtn.org/powershell-a-simple-menu

dictionary 사용

http://devcentral.f5.com/weblogs/Joe/archive/2008/12/29/powershell-abcs---g-is-for-generics.aspx


array 사용


http://blogs.sybase.com/powerbuilder/2009/07/powerscript-array-enhancement/

또 다른 hashtable 사용법(serer core 버전에서 위의 dictionary가 안되서 이걸썼다)


http://mow001.blogspot.com/2006/09/powershell-learn-about-hashtable_07.html


사용은 했지만 정리하기 귀찮아서 찾아낸 사이트만 적는다..
Posted by 동동(이재동)
Power Shell2009. 10. 28. 10:51

Failed to process input: The parameter 'Site'].ftpServer.security.ssl.controlChannelPolicy='SslAllow'' must begin with a / or - (HRESULT=80070057).


머 이런 에러가 자꾸 나와서 보았더니 " 나 ' 문제 였다.......


왜냐하면 cmd에서는 되기때문이다.. 그래서 배치파일로만 돌렸는데.......


c:\Windows\System32\inetsrv\appcmd.exe set site "MessageService" -+bindings.[protocol='net.tcp',bindingInformation='20000:172.16.10.25']


이게 있으면 

c:\Windows\System32\inetsrv\appcmd.exe set site MessageService "-+bindings.[protocol='net.tcp',bindingInformation='$IP']"


이렇게 바꾸어야한다 자세히 보면 -+bindings 에 보면 " 가 있다.........


와  powershell는 왜이렇게 해야하지?


저 실행문을 덕분에 배치파일이 아닌 powershell에서 사용할수 있었다.... 


참조 사이트 : http://blogs.iis.net/robert_mcmurray/archive/2008/10/02/appcmd-80070057-errors-when-configuring-site-level-settings.aspx



Posted by 동동(이재동)
좋은 프로그램2009. 10. 22. 20:06

ReSharper 야알꺼고 단축키를 보자



http://www.jetbrains.com/resharper/documentation/help20/Options/shortcuts.html


여기서 다운받을수 있다.


[#FILE|20_DefaultKeymap.pdf|pds/200910/22/37/|mid|0|0|pds15|0#]

Posted by 동동(이재동)
좋은사이트2009. 10. 21. 16:08

http://www.gosu.net/


근데 가입해야함 난 안할래 .ㅠ.ㅠ

Posted by 동동(이재동)
Power Shell2009. 10. 12. 15:16
function CopyFiles
{
if (test-path $OriginalPath)
{
echo "The folder exists2"
}
}

Posted by 동동(이재동)
Windows 2008 Server Core2009. 10. 12. 14:22
#Install SQLServer 2008
$path = ".\2008X64\"
#$path= ".\Install_File\"
#$FullPath=$path+"SQLEXPR_x64_ENU.exe"
$FullPath = $path + "setup.exe"

#나중에 함수로 뺄것 password 등등
$SQLSVCACCOUNT = "administrator" #windows account
$SQLSYSADMINACCOUNTS ="administrator" #windows account
$SQLSVCPASSWORD = "inno1029#" #windows account password
$AGTSVCACCOUNT = "NT AUTHORITY\Network Service" 
$SAPWD = "inno1029#" #sa password

& $FullPath /q /ACTION=Install /FEATURES=SQL /INSTANCENAME=SQLEXPRESS /SECURITYMODE="SQL" /SQLSVCACCOUNT=$SQLSVCACCOUNT /SAPWD=$SAPWD /SQLSYSADMINACCOUNTS=$SQLSYSADMINACCOUNTS /SQLSVCPASSWORD=$SQLSVCPASSWORD /AGTSVCACCOUNT=$AGTSVCACCOUNT

powershell로 짰는데 이건 머 /qs 가 보여지면서 까는건데 안되서 /q만 했더니 성공했다...


참고 : http://msdn.microsoft.com/ko-kr/library/ms144259.aspx#Accounts


Posted by 동동(이재동)
Windows 2008 Server Core2009. 10. 12. 14:20
Rename server
C:\netdom renamecomputer oldname /NewName:newname

http://www.nimsgern.pe.kr/blogs/nims/archive/2008/01/11/windows-server-2008-server-core.aspx
어드민 패스워드 리셋 

net user administrator <new_password>

ip 세팅

netsh interface ipv4 show interface

netsh interface ipv4 set address name=2 static 10.0.0.1 255.255.255.0 10.0.0.1

netsh interface ipv4 set dnsserver name=2 static 10.0.0.1 primary

폴더 공유
폴더를 하나만들어서 
net share sharename=c:\sharefolder /GRANT:ADMINISTRATOR,FULL
/GRANT는 권한이다
삭제는
net share sharename c:\sharefolder /DELETE


방화벽해제
netsh advfirewall firewall set rule group="Remote Desktop" new enable=yes
이렇게 하면 원격데스크탑 포트가 해제 된다.
방화벽 전체 해제
netsh firewall set opmode disable

iis 설치
start /w ocsetup IIS-WebServerRole  

asp.net 설치
start /w ocsetup WAS-NetFxEnvironment  
start /w ocsetup IIS-ISAPIExtensions  
start /w ocsetup IIS-ISAPIFilter  
start /w ocsetup IIS-NetFxExtensibility  
start /w ocsetup IIS-ASPNET  

설치 해제
선택적 기능을 제거하려면 start /w ocsetup에 해당 역할 이름과 /uninstall 스위치를 사용합니다.(안됨)

iis site list보기
appcmd list site

실행중인 서비스 나열
net start 

net 설명서
http://whatisthat.co.kr/7

모든 설치할수 있는 서비스 나열
oclist

재시작
shutdown /r /t 0

web site start and stop
http://mvolo.com/blogs/serverside/archive/2008/02/25/Starting_2C00_-stopping-and-recycling-IIS-7.0-Web-sites-and-application-pools.aspx

wen site add, delete, modify
add 
C:\Windows\System32\inetsrv>appcmd.exe add site /name:www.serverinfo.pe.kr 
/bindings:"http/*:80:" /physicalPath:"C:\inetpub\wwwroot"

modify
C:\Windows\System32\inetsrv>appcmd.exe set site "www.wssplex.net" /id:300

delete
C:\Windows\System32\inetsrv>appcmd.exe delete site "www.serverinfo.pe.kr"
http://www.wssplex.net/TipnTech.aspx?Seq=437

powershell 설치
1. Enables the NetFx3-ServerCore feature: start /w ocsetup NetFx3-ServerCore 
2. Enables the PowerShell feature: start /w ocsetup MicrosoftWindowsPowerShell


초기 로그온시 powershell로 바로 로그인되도록하는 스크립트 실행
파워셀안에서 이것을 수동으로 설정한후 
Set-ExecutionPolicy Unrestricted; 

Set-StartShellToPowershellAtServerCore.ps1 스크립트를 실행시킨다.


rmdir /s 는 하위 폴더 파일까지 삭제
카피하기
xcopy "iCONTROL DATABASE" "c:\iCONTROL SERVER" /s/e



server core 설치 옵션 단계별 가이드
http://technet.microsoft.com/ko-kr/library/cc753802(WS.10).aspx

sql 설치
http://www.nullsession.com/2009/06/02/sql-server-2008-on-server-core-2008-r2/

http://msdn.microsoft.com/ko-kr/library/ms144259.aspx
필수
/FEATURES
/INSTANCENAME
/AGTSVCACCOUNT
/AGTSVCPASSWORD
/ASSVCACCOUNT
/ASSVCPASSWORD
/ASSYSADMINACCOUNTS
/SECURITYMODE
/SAPWD
/SQLSVCACCOUNT
/SQLSVCPASSWORD
/ISSVCACCOUNT
/ISSVCPASSWORD


자기사신알기
whoami

start taskmanager
taskmgr


원격접속 허용(http://drewh70.wordpress.com/category/technology/microsoft/windows-server/windows-server-2008/server-core/)
C:\windows\system32\cscript C:\windows\system32\scregedit.wsf /AR /v 0

timezone and Server core 정품 인증
http://www.informit.com/articles/article.aspx?p=1245848&seqNum=3


장치관리자 원격에서 접근하는 방법

http://blogs.technet.com/koalra/archive/2008/01/15/server-core-tip.aspx

servercore 원격관리
http://www.hanulrang.com/30

ui 지원 server core
http://www.smart-x.com/?CategoryID=168&ArticleID=86&sng=1

-sql 연결 수동으로 하는법(쿼리를용?) (sqlcmd.exe를 이용하자)http://secretcoffee.tistory.com/36
c:\program files (x86)\sql server\90\tools\binn에 있다.
참고 : http://msdn.microsoft.com/en-us/library/ms165673.aspxRename server
C:\netdom renamecomputer oldname /NewName:newname

http://www.nimsgern.pe.kr/blogs/nims/archive/2008/01/11/windows-server-2008-server-core.aspx
어드민 패스워드 리셋 

net user administrator <new_password>

ip 세팅

netsh interface ipv4 show interface

netsh interface ipv4 set address name=2 static 10.0.0.1 255.255.255.0 10.0.0.1

netsh interface ipv4 set dnsserver name=2 static 10.0.0.1 primary

폴더 공유
폴더를 하나만들어서 
net share sharename=c:\sharefolder /GRANT:ADMINISTRATOR,FULL
/GRANT는 권한이다
삭제는
net share sharename c:\sharefolder /DELETE


방화벽해제
netsh advfirewall firewall set rule group="Remote Desktop" new enable=yes
이렇게 하면 원격데스크탑 포트가 해제 된다.
방화벽 전체 해제
netsh firewall set opmode disable

iis 설치
start /w ocsetup IIS-WebServerRole  

asp.net 설치
start /w ocsetup WAS-NetFxEnvironment  
start /w ocsetup IIS-ISAPIExtensions  
start /w ocsetup IIS-ISAPIFilter  
start /w ocsetup IIS-NetFxExtensibility  
start /w ocsetup IIS-ASPNET  

설치 해제
선택적 기능을 제거하려면 start /w ocsetup에 해당 역할 이름과 /uninstall 스위치를 사용합니다.(안됨)

iis site list보기
appcmd list site

실행중인 서비스 나열
net start 

net 설명서
http://whatisthat.co.kr/7

모든 설치할수 있는 서비스 나열
oclist

재시작
shutdown /r /t 0

web site start and stop
http://mvolo.com/blogs/serverside/archive/2008/02/25/Starting_2C00_-stopping-and-recycling-IIS-7.0-Web-sites-and-application-pools.aspx

wen site add, delete, modify
add 
C:\Windows\System32\inetsrv>appcmd.exe add site /name:www.serverinfo.pe.kr 
/bindings:"http/*:80:" /physicalPath:"C:\inetpub\wwwroot"

modify
C:\Windows\System32\inetsrv>appcmd.exe set site "www.wssplex.net" /id:300

delete
C:\Windows\System32\inetsrv>appcmd.exe delete site "www.serverinfo.pe.kr"
http://www.wssplex.net/TipnTech.aspx?Seq=437

powershell 설치
1. Enables the NetFx3-ServerCore feature: start /w ocsetup NetFx3-ServerCore 
2. Enables the PowerShell feature: start /w ocsetup MicrosoftWindowsPowerShell


초기 로그온시 powershell로 바로 로그인되도록하는 스크립트 실행
파워셀안에서 이것을 수동으로 설정한후 
Set-ExecutionPolicy Unrestricted; 

Set-StartShellToPowershellAtServerCore.ps1 스크립트를 실행시킨다.


rmdir /s 는 하위 폴더 파일까지 삭제
카피하기
xcopy "iCONTROL DATABASE" "c:\iCONTROL SERVER" /s/e



server core 설치 옵션 단계별 가이드
http://technet.microsoft.com/ko-kr/library/cc753802(WS.10).aspx

sql 설치
http://www.nullsession.com/2009/06/02/sql-server-2008-on-server-core-2008-r2/

http://msdn.microsoft.com/ko-kr/library/ms144259.aspx
필수
/FEATURES
/INSTANCENAME
/AGTSVCACCOUNT
/AGTSVCPASSWORD
/ASSVCACCOUNT
/ASSVCPASSWORD
/ASSYSADMINACCOUNTS
/SECURITYMODE
/SAPWD
/SQLSVCACCOUNT
/SQLSVCPASSWORD
/ISSVCACCOUNT
/ISSVCPASSWORD


자기사신알기
whoami

start taskmanager
taskmgr


원격접속 허용(http://drewh70.wordpress.com/category/technology/microsoft/windows-server/windows-server-2008/server-core/)
C:\windows\system32\cscript C:\windows\system32\scregedit.wsf /AR /v 0

timezone and Server core 정품 인증
http://www.informit.com/articles/article.aspx?p=1245848&seqNum=3


장치관리자 원격에서 접근하는 방법

http://blogs.technet.com/koalra/archive/2008/01/15/server-core-tip.aspx

servercore 원격관리
http://www.hanulrang.com/30

ui 지원 server core
http://www.smart-x.com/?CategoryID=168&ArticleID=86&sng=1

-sql 연결 수동으로 하는법(쿼리를용?) (sqlcmd.exe를 이용하자)http://secretcoffee.tistory.com/36
c:\program files (x86)\sql server\90\tools\binn에 있다.
참고 : http://msdn.microsoft.com/en-us/library/ms165673.aspx
Posted by 동동(이재동)
Power Shell2009. 10. 7. 16:06
아 바보같이 , 를 안써서 삽질했다.......

sqlcmd를 이용하면 server core에서 나 머 다 가능하다..

#attach db
$path = 'c:\Program Files (x86)\Microsoft SQL Server\90\Tools\Binn\'
$id = "sa"
$pass = "inno1029#"
$excuteFileName = "SQLCMD.EXE"
$dbName = "iCONTROL Data"
$dbMdfFileName = "C:\iCONTROL Server\iCONTROL Database\iCONTROL_Data.mdf"
$dbLDFFileName = "C:\iCONTROL Server\iCONTROL Database\iCONTROL_Data_log.LDF"

$fullPath = $path+$excuteFileName
& $fullPath -S '127.0.0.1,1433' -Q "sp_attach_db '$dbName', '$dbMdfFileName', '$dbLDFFileName'"
Posted by 동동(이재동)
Power Shell2009. 10. 7. 11:38

 Windows PowerShell

구글링: Windows PowerShell

 

 http://blogs.msdn.com/powershell/archive/2007/11/06/the-community-technology-preview-ctp-of-windows-powershell-2-0.aspx

http://www.microsoft.com/downloads/details.aspx?displaylang=ko&FamilyID=845289ca-16cc-4c73-8934-dd46b5ed1d33

 

온라인 세미나

https://msevents.microsoft.com/CUI/WebCastRegistrationConfirmation.aspx?culture=ko-KR&RegistrationID=1296409903&Validate=false

소개

 http://qaos.com/article.php?sid=2532

파워셀 제공 명령어 설맹

http://qaos.com/article.php?sid=2533

 구문 설명.

 http://www.eldorado29.com/entry/Windows-PowerShell-%EA%B5%AC%EB%AC%B8

사용설명서

http://itka.kr/zbxe/?mid=oswindows&sort_index=readed_count&order_type=desc&page=3&document_srl=997

 

 

도움말.

get-help <cmdlet 이름> -detailed

get-help Get-Command

get-help get-command -detailed

get-help get-command -full

get-help get-command -examples

get-help get-command -parameter totalcount

 

 

 실행권한세팅

Set-ExecutionPolicy RemoteSigned
Set-ExecutionPolicy Unrestricted

 

s로 시작하는 프로세스보기

Get-Process [s]*

 PS HKLM:\> Get-Process | Group-Object processname

PS HKLM:\> Get-Process powershell | format-list modules, handles

 PS HKLM:\> Get-Process powershell | format-list *

 

 

PS HKLM:\> Get-Process | Sort-Object id

 PS HKLM:\> Get-Process | Sort-Object id -descending

 

레지스트리접근

CD hklm:  // HKEY_LOCAL_MACHINE          hkcu: // HKEY_CURRENT_USER

dir

cd SYSTEM

 

레지스트리 값가져오기 쓰기

PS HKLM:\> Get-ItemProperty SOFTWARE/Microsoft/windows/CurrentVersion/Run

Set-ItemProperty HKLM:/Example -name hello value 1

 

 텍스트 파일 가져오기.

Get-Content c:\a.txt

 

 

PS C:\> $text = "asdf ;lalksdfj"
PS C:\> Set-Content c:\a.txt $text
PS C:\> Get-Content c:\a.txt
asdf ;lalksdfj

 

XML

PS C:\> Get-Content c:\h.xml
<?xml version='1.0' encoding='euc-kr'?>
<jGame DOC_TYPE='APP'>
</jGame>

 

PS C:\> [xml]$hello = Get-Content c:\h.xml
PS C:\> echo $hello.jGame

DOC_TYPE
--------
APP

 

 

int, string 

 PS C:\> [int]$i="1"
PS C:\> $i +1
2

 

 PS C:\> [string]$s="1"
PS C:\> $s + 1
11

 

COM사용

 

 PS C:\> $ie = New-Object -comobject "internetexplorer.application"
PS C:\> $ie | Get-Member -MemberType method


WMI

 

PS C:\> Get-WmiObject win32_processor

PS C:\> Get-WmiObject win32_bios

PS C:\> Get-WmiObject win32_physicalmemory

 

 

 

  

 

get-service | get-member

 

. cmdlet 가져오는 개체 유형을 확인하려면 파이프라인 연산자(|) 사용하여 "get" 명령의 결과를 Get-Member 명령으로보내면 됩니다. 예를 들어 다음 명령은 Get-Service 명령에 의해 검색된 개체를 Get-Member 보냅니다.

 

 

 

PS R:\bin\ps1> get-service schedule | format-list -property *


Name                : Schedule
CanPauseAndContinue : False
CanShutdown         : False
CanStop             : False
...       :

 

PS R:\bin\ps1> get-service schedule | format-table -property *

 

Name     CanPause CanShutd  CanStop DisplayN Dependen MachineN ServiceN Service Service  Status Service Site
         AndConti      own          ame      tService ame      ame      sDepend Handle             Type
              nue                            s                          edOn
----     -------- --------  ------- -------- -------- -------- -------- ------- -------  ------ ------- ----
Schedule    False    False    False Task ... {}       .        Schedule {RpcSs} Safe... Stopped ...cess

 

 

 

PS R:\bin\ps1> ipconfig | findstr "Address"

        IP Address. . . . . . . . . . . . : 192.168.2.215

 

별칭 만들기

set-alias gh get-help

set-alias np c:\windows\notepad.exe

remove-item alias:ls

function bootini {notepad c:\boot.ini}

 

 

Windows 프로그램 사용

PS> $env:path += ";newdirectory"

$env:path += ";C:\Program Files\Windows NT\Accessories"

get-psdrive

 

 

 

 

프로필 만들기

test-path $profile

new-item -path $profile -itemtype file -force

notepad $profile

 

 Out-* Cmdlet사용하여데이터리디렉션

Get-Process | Out-File -FilePath C:\temp\processlist.txt
 PS> Get-Process | Out-Host -Paging | Format-List
 PS> Get-Process | Format-List | Out-Host -Paging
PS> Get-Command | Out-Null
 Get-Command Get-Command | Out-Printer -Name "Microsoft Office Document Image Writer"

S> Get-Process | Out-File -FilePath C:\temp\processlist.txt -Encoding ASCII

 

 

PS> Get-Command | Out-File -FilePath c:\temp\output.txt

Get-Command | Out-File -FilePath c:\temp\output.txt -Width 2147483647

Get-Location

 Set-Location -Path C:\Windows -PassThru

 

최근 위치 저장  다시 불러오기(Push-Location  Pop-Location)

 Get-Location

 

스택에 현재 위치를 올려놓은 다음 Local Settings 폴더로 이동하려면 다음과 같이 입력하십시오.

Push-Location -Path "Local Settings"

 Pop-Location -PassThru

 

항목 실행(Invoke-Item)

 Invoke-Item C:\WINDOWS

 Invoke-Item C:\boot.ini

 

 

NET  COM 개체 만들기(New-Object)           

 New-Object -TypeName System.Diagnostics.EventLog

New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application

 $AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application

 

New-Object -ComObject WScript.Shell

New-Object -ComObject WScript.Network

New-Object -ComObject Scripting.Dictionary

New-Object -ComObject Scripting.FileSystemObject

 

$ie = New-Object -ComObject InternetExplorer.Application

$ie.Visible = $true

 $ie.Navigate("http://www.microsoft.com/technet/scriptcenter/default.mspx")

$ie.Document.Body.InnerText

$ie.Document.Body | Get-Member

 $ie.Quit()

 $ie = $null

Remove-Variable ie

 

 

 액셀

$xl = New-Object -ComObject Excel.Application -Strict
$xl.Visible =  $true

 

 

컴퓨터의 IP 주소 표시

Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName . | Select-Object -Property IPAddress

 

출처 : http://mech12.springnote.com/pages/1112272

'Power Shell' 카테고리의 다른 글

[ps] 폴더 존재여부 검사하기  (0) 2009.10.12
[ps] db 수동으로 붙이기  (0) 2009.10.07
[ps] 파워셀 기본문법  (0) 2009.10.07
[ps] 레지스트리 수정하기  (0) 2009.10.07
[ps] power shell 메뉴얼  (0) 2009.10.06
Posted by 동동(이재동)
Power Shell2009. 10. 7. 11:35
기본명령형식 : cmdlet(command-let)
정규식 표현, 파이프 연결가능

명령어의 도움말 : Get-Help 명령어 // o : -full = 도움말 전체




스크립트실행 보안해제 
PS > Set-ExecutionPolicy RemoteSigned
PS > Set-ExecutionPolicy Unrestricted // 공유폴더에 위치한 서명안된 스크립트 실행



변수지정
PS > $변수명 = 내용
PS > [변수타입]$변수명 = 내용 // 변수타입 지정 : xml, int, char, string ...
변수명은 영문 및 한글, 숫자로만 된 이름도 가능

배열사용
@으로 배열을 표현. 변수에 저장해야 함. 참조는[참조]형식
PS > $ar = @(1,1,1,1,)
PS >echo $ar[0]

PS > $ar = @((1,1,1,1,),(2,2,2,2,))
PS > echo $ar[0][0]

산술,증감,할당 연산은 기존 언어와 거의 똑같음.

주석은 #

비교연산자
-eq =
-ne !=
-gt >
-ge >=
-lt <
-le <=

논리연산자
!
-not !
-and &
-or |

조건문(if, elseif, else)
반복문(for, foreach, while, do while, do until, continue, break)
분기문(switch)
기존의 언어와 거의 똑같음. 비교연산자만 주의
foreach($value1 in $array) // array내용 순서대로 value에 대입하면서 반복

함수만들기 
functin 함수명
{
함수내용
}

함수호출은 함수명. 매개변수는 공백으로 구분

매개변수(스크립트, 함수)
$args변수안에 배열로 저장됨

반환값(스크립트, 함수)
return 반환값

명령행 실행시 주의사항(스크랩트 예외)
조건문, 반복문, 분기문, 함수등을 사용할땐 해당 구문을 한줄로 작성해야 한다.({}포함)
명령이 여러개일경우, ;으로 구분한다.

스크립트를 변수에 저장한뒤 실행할수 있음
PS > $변수 = {스크립트}
PS > &$변수



디렉토리 명령어 : ls, dir

레지스트리 접근(레지스트리 내용은 디렉터리와 동일하게 접근)
HKEY_LOCAL_MACHINE : cd HKLM:
HKEY_CURRENT_USER : cd HKCU:

레스스트리 읽기, 쓰기
PS > Get-ItemProperty 키이름
PS > Set_ItemProperty 위치 -name 키이름 -value 키값



프로세스 출력
PS > Get-Process 

출력결과 그룹화 : 명령 Group-Object 오브젝트

출력결과 속성선택 : 명령 Format-List 속성, 속성 // o : * = 모든속성 출력

출력결과 정렬 : 명령 Sort-Object 정렬오브젝트 // o : -descending = 큰 순서 정렬)



파일 읽기
PS > Get-Content 파일명

파일 쓰기 
PS > Set-Content 파일명 쓸내용

xml파일을 읽어 xml변수에 넣으면 엘리먼트를 구조체처럼 조작할수 있음
PS > [xml]$변수명 = Get-Content 파일명
PS > echo $변수명.엘리먼트

COM메소드 호출예(explorer)
PS > $ie = New-Object -ComObject "InternetExplorer.Application"
PS > $ie = | Get-Member -MemberType Method
PS > $ie.Navigate("웹페이지주소")
PS > $ie.Visible = &true

WMI사용
PS > Get-WmiObject 요소

'Power Shell' 카테고리의 다른 글

[ps] db 수동으로 붙이기  (0) 2009.10.07
[ps] 파워셀 기본문법 2  (0) 2009.10.07
[ps] 레지스트리 수정하기  (0) 2009.10.07
[ps] power shell 메뉴얼  (0) 2009.10.06
[ps] GUI 기반의 PowerSheel Tool (Quest PowerGUI)  (0) 2009.10.06
Posted by 동동(이재동)
Power Shell2009. 10. 7. 11:34
내가 만든 소스는

#Setting Reg for SQL TCP/IP connection
$regTCPEnablePath = "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Tcp"
Set-ItemProperty $regTCPEnablePath -Name Enabled -Value 1
$regTCPPortPath = "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Tcp\IPAll"
Set-ItemProperty $regTCPPortPath -Name TcpPort -Value 1433

#결과값을 저장해놓는다
$viewResult = Get-ItemProperty $regTCPEnablePath 

#restart sql server service
net stop "SQL SERVER (SQLEXPRESS)"
net start "SQL SERVER (SQLEXPRESS)"


방법은 머 이렇다.
레지스트리 접근(레지스트리 내용은 디렉터리와 동일하게 접근)
HKEY_LOCAL_MACHINE : cd HKLM:
HKEY_CURRENT_USER : cd HKCU:

레스스트리 읽기, 쓰기
PS > Get-ItemProperty 키이름
PS > Set_ItemProperty 위치 -name 키이름 -value 키값


Posted by 동동(이재동)
Power Shell2009. 10. 6. 18:53
Posted by 동동(이재동)
Power Shell2009. 10. 6. 18:52
GUI 기반의 PowerSheel Tool (Quest PowerGUI)


다운은 여기서

'Power Shell' 카테고리의 다른 글

[ps] 파워셀 기본문법 2  (0) 2009.10.07
[ps] 파워셀 기본문법  (0) 2009.10.07
[ps] 레지스트리 수정하기  (0) 2009.10.07
[ps] power shell 메뉴얼  (0) 2009.10.06
[ps] power shell 프로그램 실행하는 간단한 방법  (0) 2009.10.06
Posted by 동동(이재동)
Power Shell2009. 10. 6. 18:49
$xFilePath = "D:\nexusfile\"

$excute = $xFilePath + "x.exe"

&$excute

머 이렇게 하면 excute함수가 실행된다 & 붙여야되는것을 몰랐던것이다... ㅋㅋ


아 참고로 아귀먼트가 있으면

$excute = "notepad.exe"
$arg = "readme_ko.txt"

&$excute $arg

이런식으로 하면 된다... 바보 같이 

$excute = "noepad.exe readme_ko.txt" 이렇게 해서 실행하면 안된다.

'Power Shell' 카테고리의 다른 글

[ps] 파워셀 기본문법 2  (0) 2009.10.07
[ps] 파워셀 기본문법  (0) 2009.10.07
[ps] 레지스트리 수정하기  (0) 2009.10.07
[ps] power shell 메뉴얼  (0) 2009.10.06
[ps] GUI 기반의 PowerSheel Tool (Quest PowerGUI)  (0) 2009.10.06
Posted by 동동(이재동)
기타2009. 10. 5. 19:51
일단 내가 쓰는건 별루 없다. 폰트랑 ctrl+shift+w누르면 탭 다 닫기는거 밖에...

폰트는 머  1등인 Bitstream Vera Sans Mono, Consolea 머 이런거 다 써밨지만

이게 제일깔끔한거 같다 

evny code R에서 크기 10 나도 사이트보고 안것임
ㅋㅋ

다운로드는 여기서랑

[#FILE|EnvyCodeR-PR7.zip|pds/200910/05/37/|mid|0|0|pds15|0#]

여기는 그냥 혹시나 링크 깨질까바 ㅋㅋ


[#FILE|Exported-2009-10-05.vssettings|pds/200910/05/37/|mid|0|0|pds17|0#]

그리고 이건 내세팅 혹시나 몰라서 저장
Posted by 동동(이재동)
wpf2009. 9. 29. 13:59
내가 만들었지만 간단하다.. 닷넷에서 ping 클래스를 지원해주기 때문이다.
장비가 꺼졌는지 확인을 위해서 만들었다... ㅋㅋ

 private bool MachinePingTest(string ip)
        {
            Ping pingSender = new Ping();
            PingReply reply = pingSender.Send(ip);
            if (reply.Status == IPStatus.Success)
                return false;
            else
                return true;
        }
Posted by 동동(이재동)
기타2009. 9. 25. 11:10
ntp install for window
http://www.meinberg.de/english/sw/ntp.htm

NTP Server 만들기
http://support.microsoft.com/kb/816042

time server 다시시작
net stop w32time && net start w32time

time server와 현재 컴퓨터와 시간 동기화(http://dongjo.tistory.com/95)
w32tm /stripchart /computer:[ip]
ex) w32tm /stripchart /computer: [ip]

time server setting
net time/setsntp:[ip] 
ex)net time/setsntp:172.16.30.99

프로그램을 찾기는 했는데 그냥 레지 건들여서 하는게 낳다고 판단해서 레지로 했다.......

레지로 만들고 time server를 세팅하고 껏다켰다 하니까 되더라 ㅋㅋ

기본적으로 포트는 123을 쓴다.... 참 귀찮았나보다 포트정하기 ㅋㅋ 


일단 밑에는 붙여넣기~

그리고 밑에 다 따라할필요 없이 4번까지만 해두 된다.. 3번까지만 해두 될지두?????

외부 시간 원본을 사용하도록 Windows 시간 서비스 구성

외부 시간 원본과 동기화하도록 내부 시간 서버를 구성하려면 다음과 같이 하십시오.
  1. 서버 유형을 NTP로 변경합니다. 이렇게 하려면 다음과 같이 하십시오.
    1. 시작실행을 차례로 누르고 regedit를 입력한 다음 확인을 누릅니다.
    2. 다음 레지스트리 하위 키를 찾아 누릅니다.
      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters\Type
    3. 오른쪽 창에서 Type을 마우스 오른쪽 단추로 누른 다음 수정을 누릅니다.
    4. 값 편집에서 값 데이터 상자에 NTP를 입력한 다음 확인을 누릅니다.
  2. AnnounceFlags를 5로 설정합니다. 이렇게 하려면 다음과 같이 하십시오.
    1. 다음 레지스트리 하위 키를 찾아 누릅니다.
      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config\AnnounceFlags
    2. 오른쪽 창에서 AnnounceFlags를 마우스 오른쪽 단추로 누른 다음 수정을 누릅니다.
    3. DWORD 값 편집에서 값 데이터 상자에 5를 입력한 다음 확인을 누릅니다.
  3. NTPServer를 설정합니다. 이렇게 하려면 다음과 같이 하십시오.
    1. 다음 레지스트리 하위 키를 찾아 누릅니다.
      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer\Enabled
    2. 오른쪽 창에서 Enabled를 마우스 오른쪽 단추로 누른 다음 수정을 누릅니다.
    3. DWORD 값 편집에서 값 데이터 상자에 1을 입력한 다음 확인을 누릅니다.
  4. 시간 원본을 지정합니다. 이렇게 하려면 다음과 같이 하십시오.
    1. 다음 레지스트리 하위 키를 찾아 누릅니다.
      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters\NtpServer
    2. 오른쪽 창에서 NtpServer를 마우스 오른쪽 단추로 누른 다음 수정을 누릅니다.
    3. 값 편집에서 값 데이터 상자에 Peers 를 입력한 다음 확인을 누릅니다.

      참고 Peers 는 컴퓨터가 타임스탬프를 얻는 피어 목록의 자리 표시자이며, 이 목록은 공백으로 구분됩니다. 표시되는 각 DNS 이름은 고유해야 하고 각 DNS 이름 끝에 ,0x1을 추가해야 합니다. 각 DNS 이름 끝에 ,0x1을 추가하지 않으면 5단계에서 변경한 사항이 적용되지 않습니다.
  5. 폴링 간격을 선택합니다. 이렇게 하려면 다음과 같이 하십시오.
    1. 다음 레지스트리 하위 키를 찾아 누릅니다.
      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient\SpecialPollInterval
    2. 오른쪽 창에서 SpecialPollInterval을 마우스 오른쪽 단추로 누른 다음 수정을 누릅니다.
    3. DWORD 값 편집에서 값 데이터 상자에 TimeInSeconds 를 입력한 다음 확인을 누릅니다. 

      참고 TimeInSeconds 는 폴링 간격으로 설정할 초의 자리 표시자입니다. 권장 값은 900(십진수)입니다. 이 값은 15분마다 폴링하도록 시간 서버를 구성합니다.
  6. 시간 수정 설정을 구성합니다. 이렇게 하려면 다음과 같이 하십시오.
    1. 다음 레지스트리 하위 키를 찾아 누릅니다.
      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config\MaxPosPhaseCorrection
    2. 오른쪽 창에서 MaxPosPhaseCorrection을 마우스 오른쪽 단추로 누른 다음 수정을 누릅니다.
    3. DWORD 값 편집의 단위 상자에서 10진수를 선택합니다.
    4. DWORD 값 편집에서 값 데이터 상자에 TimeInSeconds 를 입력한 다음 확인을 누릅니다. 

      참고 TimeInSeconds 는 1시간(3600)이나 30분(1800)과 같은 적당한 값의 자리 표시자입니다. 폴링 간격, 네트워크 상태 및 외부 타임 원본에 따라 값을 선택합니다.
    5. 다음 레지스트리 하위 키를 찾아 누릅니다.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config\MaxNegPhaseCorrection
    6. 오른쪽 창에서 MaxNegPhaseCorrection을 마우스 오른쪽 단추로 누른 다음 수정을 누릅니다.
    7. DWORD 값 편집의 단위 상자에서 10진수를 선택합니다.
    8. DWORD 값 편집에서 값 데이터 상자에 TimeInSeconds 를 입력한 다음 확인을 누릅니다. 

      참고 TimeInSeconds 는 1시간(3600)이나 30분(1800)과 같은 적당한 값의 자리 표시자입니다. 폴링 간격, 네트워크 상태 및 외부 타임 원본에 따라 값을 선택합니다.
  7. 레지스트리 편집기를 종료합니다.
  8. 명령 프롬프트에서 Windows 시간 서비스를 다시 시작하도록 다음 명령을 입력한 다음 Enter 키를 누릅니다.
    net stop w32time && net start w32time

Posted by 동동(이재동)
wpf2009. 9. 24. 19:40

이번에는 ThreadPool에 대해서 소개할까 합니다혹시 이 부분에 대해서 잘 알고 계신가요아마 잘 알고 있다 보다는 ~들어는 봤고대충 무엇인지는 알아!”라고 답 하시는 분들이 많을 것이라고 대략 추측해봅니다그런데이번에는 대충 무엇인지는 알아!” 보다는 좀 더 자세하고세밀한 부분을 설명하고자 합니다.

솔직히 말씀 드리면본인이 이 ThreadPool에 흥미를 가져 소개하려고 할 때에참고하던 자료 중에 제가 좋아라 하는Jeffery Richter가 쓴 MSND Magazine  Article이 있더라구요. Jeffery Richter의 글은 MSDN 등에 잘 언급되지 않은 내용들을 깊숙이잘 소개하기로 나름 유명하신 분이며또한 .Net 분야에 상당히 내공이 깊어 많은 분들로부터 인정 받고 있기 때문에참고하지 않을 수 없었습니다그래서 이번 소개 글은 이 Article의 번역 본이라기 보다는번역본을 조금 더 이해하기 쉽게 또는 읽기 쉽게 소개하고자 하는 글이니 이점 참고하시기 바랍니다.

그럼 이제 대략 이 글에 대한 앞선 설명을 드렸으니이제부터 한번 시작해 보겠습니다.

 

여러분은 이번 주제인 ThreadPool이 왜 생겨났는지에 대한 내용을 혹시 들으신 적이 있으신가요혹은 ThreadPool이 어떤 기능을 수행하는지 잘 알고 계시나요이 질문에 대해서 정확히 아시는 분은 이 후의 글은 pass하셔도 상관 없겠습니다.

Jeffery Richter에 의하면 Microsoft는 수년 전부터(지금으로부터 따지면 상당히 오래 전에…) Thread가 개발자로 하여금 얼마나 잘 사용되어 지고 있는지 연구했다고 합니다그래서 이 결과를 분석하기 위해 조사를 시작했는데그 결과는 많은 개발자 들이 어플리케이션에서 발생하는 단일 작업을 처리하기 위해 새로운 쓰레드를 생성하고 작업이 완료되는 시점에서 생성된 쓰레드를 종료 시키는 일들이 빈번하게 발생하는 거였습니다.

 

그래서 Microsoft는 생각했답니다이미 생성된 쓰레드는 종료시키지 않고 다만 상태를 중지 시킨 후에 다음 요청이 들어오면 중지된 상태의 쓰레드를 다시 활성화 시켜 재사용 하도록 말이죠.

그렇지 않을 경우에어플리케이션에서 발생하는 작업을 처리하기 위해 쓰레드를 생성할 때 OS 레벨에서는 kernel 객체의 초기화그리고 쓰레드에서 사용되는 stack 메모리의 할당 및 초기화, Windows 운영 체제가 새로운 쓰레드가 생성 될 때 로드 된 assembly에게 DLL_THREAD_ATTACH라는 메시지를 보내기 위해 메모리에 로드 된 페이지의 손실 발생..  등등의 비 효율적인 일들이 벌어집니다.

그리고 나서 쓰레드가 동작을 완료하게 되면그때서야 여기에 할당 된 stack 메모리와 kernel 개체의 자원이 모두 해제됩니다.

이런 동작들을 통한 쓰래드의 생성과 소멸은 당연히 많은 오버헤드를 가져오게 됩니다.

 

이런 연구의 결과로 Microsoft Thread Pool을 만들게 되었고처음으로 Windows 2000에 적용이 되었습니다또한 .Net Framework 팀이 CLR을 설계할 당시에도 그들은 이 Thread Pool을 CLR 안에 탑재하기로 했답니다그 결과로 .Net Framework를 통한 managed 어플리케이션은 Thread Pool의 장점을 그대로 사용할 수 있게 되었을 뿐만 아니라 어플리케이션이 동작하는 운영 체제가 굳이 Windows 2000이 아닌 Windows 98과 같은 하위 버전일지라도 managed 어플리케이션은 Thread Pool을 사용해서 쓰레드를 관리하게 됩니다.

 

CLR이 초기화 될 때, ThreadPool은 아무런 Thread도 생성해서 가지고 있지 않습니다어플리케이션이 실행될 때 필요한 쓰레드를 ThreadPool에 요청하면 ThreadPool은 그때서야 새로운 쓰레드를 하나 생성하고 어플리케이션에 할당합니다그 이후부터 쓰레드가 작업을 완료하게 되면 바로 종료하지 않고 ThreadPool에 다시 반환되어 중지 상태로 ThreadPool에 머물게 됩니다.

그리고 또 다시 어플리케이션으로부터 쓰레드 요청이 들어오면이번에는 새로운 쓰레드를 생성하는 것이 아니라ThreadPool에 의해 중지 상태에 있는 쓰레드를 활성화 시켜 재사용하도록 합니다이런 프로세스는 많은 오버헤드를 감소시킬 수 있습니다.

그런데 이번엔 조금 다른 경우를 한번 생각해 보죠어플리케이션이 ThreadPool에 의해 재사용되는 쓰레드를 사용하기 위해서오랫동안 단위 작업(task)들을 계속해서 큐(queue)에 쌓게 된다면 이것은 매 작업마다 쓰레드를 할당해서 처리하는 경우 보다 성능 면에서는 느릴 수 밖에 없을 것입니다.

 

하지만 이 경우는 어플리케이션이 실행되는 동안 ThreadPool에 생성되어 있는 쓰레드를 계속해서 재사용하기 때문에발생할 수 있는 엄청난 오버헤드를 감소시킨다는 잇점이 있습니다.

그런데 어플리케이션이 큐에 쌓여 있는 작업들을 각각의 쓰레드를 이용해서 처리하는 것 보다 빠르게 실행시키게 하려면, ThreadPool에 더 많은 쓰레드를 추가로 생성하면 될 것 같지만이렇게 새로운 쓰레드를 추가로 생성한다면 오버헤드가 증가되는 결과는 뻔 할 것입니다그렇겠죠?

그러나 어플리케이션은 자신이 실행되는 동안 처리해야 하는 모든 작업을 완료하기 위해우리 의생각과는 다르게 단지 몇 개의 쓰레드만을 요청하기 때문에 별로 문제 될 것이 없다고 합니다이런 점으로 미루어 봤을 때, ThreadPool을 사용하게 됨으로써 어플리케이션의 성능은 전반적으로 향상된다는 결론을 내릴 수 있습니다.

 

그런데위에서 한 말처럼 ThreadPool에 여러 개의 쓰레드를 생성해서 사용했다고 치죠.

만약 어플리케이션이 처리해야 할 작업의 수가 줄어 든다면, ThreadPool에 있는 여러 개의 쓰레드 들은 어떻게 될까요쓸 일도 없는데쓰레드를 종료시키지 않고 보관하고 있다면 이건 분명 리소스 낭비 밖에 안 될 것입니다실제 그렇다면~문제입니다.

하지만 이러한 문제도 이미 Microsoft는 고려했다고 합니다이러한 경우, ThreadPool은 휴면 상태에 있는 쓰레드를 약 40초 동안 유지하고 있습니다그리고 40초가 경과했는데도 어플리케이션이 쓰레드를 요청하지 않아계속해서 정지 상태에 있어야 한다면, ThreadPool은 이러한 조건을 만족하는 쓰레드를 종료시켜 버린다고 합니다.

이렇게 됨으로써, stack 메모리와 kernel 생성에 소비되었던 리소스는 해제되어 사용 가능한 리소스가 더 늘어나게 됩니다.

 

그런데 ThreadPool을 설명하는 원문 글에서 Jeffery Richter는 쓰레드가 유휴 상태로 유지되는 40초라는 시간은 어느 문서에도 명시되어 있지 않는 시간이라고 이야기 합니다나중에 확인되면 수정한다고 하네요.(대략 개념을 정리하는데 도움을 주기 위해 사용된 수치 같습니다.)

 

이 글의 원문은 MSDN Magazine 2003년도 6월에 실린 “The CLR’S Thread Pool”이란 제목의 글이며주소는 아래에 적습니다이 글에는 이런 내용을 기반으로 몇 가지 더 설명하는 글이 있으며예제도 같이 포함되어 있는데이 내용은 다음에 전해 드리기로 하겠습니다이번에는 살짝 개념만 이해하고 계시면 될 것 같네요그럼 저는 여기서 이만 마치겠습니다.

감사합니다. ^o^v

 

*원문 글

http://msdn.microsoft.com/msdnmag/issues/03/06/NET/

Posted by 동동(이재동)
wpf2009. 9. 24. 16:31

지난 시간에는 식사하는 철학자 문제와 뮤텍스에 대해서 소개했으며, 이번에는 뮤텍스의 나머지 부분에 대해서 알아보자. 그전에 이벤트에 대해서 알아보자. 

이벤트 지금까지 살펴본 모니터나 뮤텍스는 하나의 쓰레드가 공유 데이터를 액세스하는데 유용하지만, 여러 개의 쓰레드가 서로의 실행을 방해하지 않으면서 쓰레드간에 메시지를 주고 받으려면 어떻게 해야할까? 

이런 경우를 생각해보자. A 쓰레드가 작업이 끝나면 이 사실을 전달받은 B 쓰레드가 작업을 시작한다. 두 쓰레드간에 데이터를 공유할 필요도 없고, 동기화를 사용할 필요도 없다. 이와 같은 작업을 파이프 라인으로 물이 흘러가는 것과 같다고 해서 pipe-lined execution이라고도 한다. 이 경우에는 단지 대기중인 쓰레드에게 작업이 끝난다는 사실만을 전달해주면 된다. 이런 경우에 이벤트를 사용한다.

 

이벤트는 신호상태(Signaled)와 비신호상태(Non-Signaled) 두 가지 상태를 갖고 있다. 신호상태와 비신호상태라는 것은 마치 등이 하나뿐인 신호등과 같다. 신호등에 대기중인 쓰레드는 등이 켜지지 전(non-signaled)에는 대기하고, 신호등이 켜지면(signaled) 가던 길을 계속 갈 수 있게된다. 신호 메커니즘에 대한 보다 자세한 글은 지난 글을 참고하기 바란다. 

이벤트는 두 가지 종류가 있다. 하나는 AutoReset 이벤트이며 다른 하나는 ManualReset 이벤트이다. 이들 각각의 이벤트는 실제로 닷넷에서 AutoResetEvent와 ManualResetEvent 클래스로 구현되어 있다. 이들 클래스의 생성자는 다음과 같다.
  public ManualResetEvent(bool initialState);  public AutoResetEvent(bool initialState);
initialState는 true나 false를 사용할 수 있으며, 이벤트의 초기상태를 신호상태로 할 것인지, 비신호상태로 할 것인지를 지정한다. 대부분의 경우에 false를 사용한다. 

먼저 AutoResetEvent를 사용하는 방법에 대해서 살펴보자. 이벤트를 생성하려면 다음과 같이 한다. 

여기서는 각각의 작업 3개에 대해서 3개의 이벤트를 생성한다.
  public AutoResetEvent areStep1 = new AutoResetEvent(false);  public AutoResetEvent areStep2 = new AutoResetEvent(false);  public AutoResetEvent areStep3 = new AutoResetEvent(false);
위 예제에서는 false를 사용하기 때문에 비신호상태로 선언한다는 것을 알 수 있다. 비신호상태라는 것은 신호가 될 때까지 신호등 앞에서 기다린다는 의미로 해석하면 된다. 즉, 처음부터 이벤트는 대기상태가 된다. 필자는 쓰레드들의 각각의 작업이 Step1 → Step2 → Step3으로 수행되기를 원한다. 또한 이들 각각의 작업은 데이터를 공유하지 않으며, 단순히 대기중인 쓰레드에게 작업이 끝났다는 사실만을 알려주기 위해 이벤트를 사용한다. 다음은 Step1에 대한 함수이다.
  public void Step1()  {    Console.WriteLine("Processing Step1");    Thread.Sleep(3000);    areStep1.Set();  }
먼저 화면에 Step1을 처리중이라는 메시지를 출력한다. 그리고 실제로 어떤 작업을 수행하는 함수가 들어가야하지만 여기서는 간단히 어떤 작업을 처리하는 것을 에뮬레이트하기 위해 Thread.Sleep(3000)을 사용하여 3초간 처리중인 것처럼 하였다. 처리가 끝나면 areStep1.Set()을 사용하여 첫번째 이벤트 areStep1을 신호상태로 변경한다. areStep1이 신호상태로 바뀐 것을 감지하고 작업을 수행하는 쓰레드는 Step2이다. 이제 Step2는 어떻게 Step1의 쓰레드가 이벤트를 신호상태로 바꾼 것을 알고, 작업을 처리하는지 살펴보자.
  public void Step2()  {    areStep1.WaitOne();    Console.WriteLine("Processing Step2");    Thread.Sleep(1000);    areStep2.Set();  }
가장 중요한 부분인데, areStep1.WaitOne()이라고 되어 있다. 즉, 첫번째 이벤트 areStep1이 신호상태가 될 때까지 기다린다는 것을 의미한다. 즉, 쓰레드가 처리하는 어떤 곳에서든지 areStep1이 신호상태가 되면 그것을 감지하고 대기중인 쓰레드를 잠에서 깨우는 역할을 하는 부분이다. Step2에서도 Thread.Sleep(1000) 대신에 DoPerformStep2()와 같이 어떤 함수를 사용할 것이지만 여기서는 작업을 에뮬레이트하기 위해 간단히 Thread.Sleep()을 사용하였다. 마찬가지로 작업이 끝난 다음에 이벤트 areStep2를 신호상태로 변경하여 다른 쓰레드들에게 알린다. Step3은 Step2와 동일하며, 단지 대기중인 이벤트만 다르다. 

이에 대한 전체 소스는 다음과 같다.
이름 : event01.csusing System;using System.Threading;public class AppMain{  public AutoResetEvent areStep1 = new AutoResetEvent(false);  public AutoResetEvent areStep2 = new AutoResetEvent(false);  public AutoResetEvent areStep3 = new AutoResetEvent(false);  public void Step1()  {    // do something    Console.WriteLine("Processing Step1");    Thread.Sleep(3000);    areStep1.Set();  }  public void Step2()  {    areStep1.WaitOne();    Console.WriteLine("Processing Step2");    Thread.Sleep(1000);    areStep2.Set();  }  public void Step3()  {    areStep2.WaitOne();    Console.WriteLine("Processing Step3");    areStep3.Set();  }  public void DoTest()  {    Thread thread1 = new Thread(new ThreadStart(Step1) );    Thread thread2 = new Thread(new ThreadStart(Step2) );    Thread thread3 = new Thread(new ThreadStart(Step3) );    Console.WriteLine("Thread 1, 2, 3 are started");    thread1.Start();    thread2.Start();    thread3.Start();}  public static void Main()  {    AppMain ap = new AppMain();    ap.DoTest();  }}
위에서는 AutoResetEvent를 살펴보았다. AutoResetEvent와 ManualResetEvent의 차이점은 여러분이 짐작하고 있는 것처럼 이벤트의 상태가 자동으로 초기화되느냐 그렇지 않느냐의 차이다. 위의 예제에서 Step2를 처리하는 쓰레드는 이벤트가 신호상태가 되기를 대기한다. 신호상태가 되면 이벤트는 쓰레드를 통과시키고 다시 자동으로 비신호상태가 된다. 따라서 직접 Reset()을 사용할 필요가 없다. 반면에 ManualResetEvent는 한 번 신호상태가 되면 다시 Reset()을 명시적으로 호출하여 비신호상태로 만들때까지 계속 신호상태를 유지한다. 

참고로 Main()에서 두 개의 인스턴스를 생성하여 실행해보도록한다.
  public static void Main()  {    AppMain ap = new AppMain();    ap.DoTest();    AppMain ap2 = new AppMain();    ap2.DoTest();  }
이와 같이 변경한 다음에 실행해보면 두 인스턴스의 각각의 쓰레드들이 병렬적으로 실행된다는 것을 알 수 있을 것이다.(전부 몇 개의 쓰레드가 실행중인지 확인하고 싶다면 Thread.Sleep()의 시간을 충분히 늘려놓은 다음에 7회에서 작성한 WinTop을 이용해서 몇 개의 쓰레드가 실행중인지 확인해보는 것도 좋을 것이다) 또는 다음과 같이 Main()을 수정하고 실행해본다.
  public static void Main()  {    AppMain ap = new AppMain();    ap.DoTest();    ap.DoTest();  }
즉, 특정 작업이 Step1 → Step2 → Step3으로 병렬적으로 실행되는데 좋다는 것을 알 수 있을 것이다. 대용량의 데이터 다섯 개를 동시에 1M씩 메모리로 읽어들이고, 1M씩 계산하고, 처리된 결과를 저장하는 것과 같은 단계별 작업이 필요하다면 최소한 3개의 쓰레드가 이벤트를 통해서 신호를 주고 받으면서 작업할 수 있을 것이다.(이 경우에 공유 데이터가 없다는 사실에 유의한다.) 

수동 이벤트에 대해서 알아보기 위해 위 예제를 ManualResetEvent를 사용하도록 변경해보자.
  public ManualResetEvent mreStep1 = new ManualResetEvent(false);  public ManualResetEvent mreStep2 = new ManualResetEvent(false);  public ManualResetEvent mreStep3 = new ManualResetEvent(false);
ManualResetEvent 역시 AutoEventReset과 동일한 생성자를 갖는다. 여기서도 마찬가지로 세 개의 이벤트를 모두 비신호상태로 둔다. Step1은 다음과 같이 변경한다.
  public void Step1()  {    mreStep1.WaitOne();    mreStep1.Reset();    Console.WriteLine("Processing Step1");    Thread.Sleep(3000);    mreStep1.Set();  }
WaitOne()으로 이벤트가 신호상태가 되기를 기다리는 코드를 추가하였다. AutoResetEvent와 달리 신호상태에서 하나의 대기 쓰레드를 통과시킨 다음에 자동으로 비신호상태가 되지 않으므로 Reset()을 호출하여 명시적으로 비신호상태로 전환한다.
이름: event02.csusing System;using System.Threading;public class AppMain{  public ManualResetEvent mreStep1 = new ManualResetEvent(false);  public ManualResetEvent mreStep2 = new ManualResetEvent(false);  public ManualResetEvent mreStep3 = new ManualResetEvent(false);  public void Step1()  {    mreStep1.WaitOne();    mreStep1.Reset();    Console.WriteLine("Processing Step1");    Thread.Sleep(3000);    mreStep1.Set();  }  public void Step2()  {    mreStep1.WaitOne();    mreStep1.Reset();    Console.WriteLine("Processing Step2");    Thread.Sleep(1000);    mreStep2.Set();  }  public void Step3()  {    mreStep2.WaitOne();    mreStep2.Reset();    Console.WriteLine("Processing Step3");    mreStep3.Set();  }  public void DoTest()  {    Thread thread1 = new Thread(new ThreadStart(Step1) );    Thread thread2 = new Thread(new ThreadStart(Step2) );    Thread thread3 = new Thread(new ThreadStart(Step3) );    thread1.Start();    thread2.Start();    thread3.Start();    Console.WriteLine("Thread 1, 2, 3 are started");  }  public static void Main()  {    AppMain ap = new AppMain();    ap.DoTest();  }}
위 코드를 컴파일하고 실행하면 아무것도 실행되지 않는다는 것을 알 수 있다. Step1에서도 mreStep1.WaitOne()으로 첫번째 이벤트 mreStep1이 신호되기를 기다리고 있기 때문이다. 따라서 DoTest를 다음과 같이 수정한다.
  public void DoTest()  {    Thread thread1 = new Thread(new ThreadStart(Step1) );    Thread thread2 = new Thread(new ThreadStart(Step2) );    Thread thread3 = new Thread(new ThreadStart(Step3) );    thread1.Start();    thread2.Start();    thread3.Start();    mreStep1.Set();    Console.WriteLine("Thread 1, 2, 3 are started");}

이벤트를 신호상태로 만들어준다. 컴파일하여 실행하면 AutoResetEvent를 사용한 것과 차이가 없을 것이다.(내부적으로는 어떻든간에 말이다) 

여기서는 AutoResetEvent와 ManualResetEvent 모두 하나의 이벤트만을 기다리도록 하였다. 그러나 멀티 쓰레드 프로그램에서 어떤 종류의 작업은 동시에 일어나야하는 경우도 있다. AutoResetEvent는 여러 개의 쓰레드가 하나의 작업을 처리하기 위해서 메시지를 주고 받는데 유용하며, ManualResetEvent는 여러 개의 쓰레드가 동시에 여러 개의 작업을 처리하기 위해서 메시지를 주고 받는데 유용하다. 예를 들어서, 사용자가 워드 파일을 읽어들였을 때, 문서에 있는 단어수를 세는 쓰레드가 하나, 문서를 화면에 표시하는 쓰레드가 하나, 맞춤법을 검사하는 쓰레드가 하나, 인쇄를 하는 쓰레드가 하나. 이렇게 4개의 쓰레드가 문서를 읽어들이는 시점에 동시에 발생해야한다면 ManualResetEvent를 사용하도록 한다. 

일반적으로 ManualResetEvent는 Set()을 호출하고 바로 Reset()을 호출하는 것이 대부분이기 때문에 Pulse()와 같은 메소드를 갖고 있어야하겠지만(Win32에서는 그렇다!) 닷넷에서는 이런 종류의 Pulse()는 없다. 따라서 필요하다면 자신이 만들어쓰도록 한다. 이러한 Pulse()는 Monitor 클래스에서 볼 수 있다.(Pulse나 PulseAll에 대해서는 MSDN을 참고한다) 

마치며 

뮤텍스와 이벤트가 무슨 관계가 있을까?라고 생각하는 분들도 있을 것이다. 이벤트가 뮤텍스의 소유권에 대한 상태를 알린다고 하면, 쓰레드들간에 이벤트를 주고 받음으로써 뮤텍스의 소유권을 넘겨 받을 수 있다는 것을 생각할 수 있을 것이다. 다음에는 이벤트와 뮤텍스를 이용하는 것에 대해서 살펴보도록 하자. 끝으로 다음에는 식사하는 철학자 문제를 이벤트(배고픔)와 뮤텍스(포크)를 사용해서 풀어보도록 하자.
살펴본 클래스들에 대해서 정리하는 시간을 갖게 될 것이다. [소스다운] cs_thread09_source.zip

Posted by 동동(이재동)