'開發 - Computer'에 해당되는 글 63건
- 2010.11.15 [HTML, Javascript] members of IMG object
- 2010.11.08 Child process의 콘솔 상태를 감시하는 클래스
- 2010.11.04 바탕화면과 프로그램 그룹에 단축 아이콘을 만드는 VBScript
- 2010.10.26 Developer Guidelines - Intel AppUp developer program
- 2010.10.07 UTF-8 URL Decode to MFC CString
- 2010.07.29 iPhone 개발자 팀 멤버의 인증서 발급 과정
- 2010.06.14 C에서 함수의 다형성 사용하기
- 2009.11.17 NS-2의 802.11...불편한 진실
- 2009.11.09 네트워크 시뮬레이터
- 2009.11.08 NS-2 랜덤 시드값 변경
// Copyright(C)2010 All Rights Reserved by Junseok Oh
//
// author: Junseok Oh
// email: batt22@naver.com, swolf22@nate.com, batt842@gmail.com
// 08.Nov.2010
//
// This source code is free to deploy and modify.
// You don't need to keep this license header.
// An acknowledgement is not required.
// Because it's simple. :-)
class ChildProcess {
public:
ChildProcess() :
m_bInit(FALSE),
m_hOutputRead(INVALID_HANDLE_VALUE),
m_hOutputWrite(INVALID_HANDLE_VALUE),
m_hInputRead(INVALID_HANDLE_VALUE),
m_hInputWrite(INVALID_HANDLE_VALUE),
m_hErrorWrite(INVALID_HANDLE_VALUE),
m_nShowCmd(SW_SHOWNORMAL),
m_doMonitor(FALSE),
m_nMaxSilentPeriod(5000),
m_bMonitorResult(TRUE),
m_bVerbose(FALSE),
m_hReadActionEvent(INVALID_HANDLE_VALUE)
{
HANDLE hOutputReadTmp, hInputWriteTmp;
SECURITY_ATTRIBUTES sa;
// Set up the security attributes struct.
sa.nLength= sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
// Create the child output pipe.
if (!CreatePipe(&hOutputReadTmp,&m_hOutputWrite,&sa,0))
return;
// Create a duplicate of the output write handle for the std error
// write handle. This is necessary in case the child application
// closes one of its std output handles.
if (!DuplicateHandle(GetCurrentProcess(),m_hOutputWrite,
GetCurrentProcess(),&m_hErrorWrite,0,
TRUE,DUPLICATE_SAME_ACCESS))
return;
// Create the child input pipe.
if (!CreatePipe(&m_hInputRead,&hInputWriteTmp,&sa,0))
return;
// Create new output read handle and the input write handles. Set
// the Properties to FALSE. Otherwise, the child inherits the
// properties and, as a result, non-closeable handles to the pipes
// are created.
if (!DuplicateHandle(GetCurrentProcess(),hOutputReadTmp,
GetCurrentProcess(),
&m_hOutputRead, // Address of new handle.
0,FALSE, // Make it uninheritable.
DUPLICATE_SAME_ACCESS))
return;
if (!DuplicateHandle(GetCurrentProcess(),hInputWriteTmp,
GetCurrentProcess(),
&m_hInputWrite, // Address of new handle.
0,FALSE, // Make it uninheritable.
DUPLICATE_SAME_ACCESS))
return;
// Close inheritable copies of the handles you do not want to be
// inherited.
if (!CloseHandle(hOutputReadTmp))
return;
if (!CloseHandle(hInputWriteTmp))
return;
m_bInit = TRUE;
}
~ChildProcess()
{
if(!m_bInit)
return;
CloseHandlesForParent();
CloseHandlesForChild();
}
void SetInfomation( LPCTSTR szCmdLine, LPCTSTR szWorkingDirectory, int nShowCmd )
{
if(!m_bInit)
return;
_tcscpy_s( m_szCmdLine, MAX_PATH, szCmdLine );
_tcscpy_s( m_szWorkingDirectory, MAX_PATH, szWorkingDirectory );
m_nShowCmd = nShowCmd;
}
void SetMonitorPolicy( BOOL doMonitor, long nMaxSilentPeriod, BOOL bVerbose=FALSE )
{
if(!m_bInit)
return;
m_doMonitor = doMonitor;
m_nMaxSilentPeriod = nMaxSilentPeriod;
m_bVerbose = bVerbose;
}
BOOL CreateProcess()
{
int nResult = 0;
DWORD ExitCode = 0;
LPTSTR szWorkingDirectory = NULL;
STARTUPINFO si;
PROCESS_INFORMATION pi;
if( _tcslen(m_szWorkingDirectory)>0 )
szWorkingDirectory = m_szWorkingDirectory;
ZeroMemory(&si, sizeof(STARTUPINFO));
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW ;
si.hStdInput = m_hInputRead;//GetStdHandle(STD_INPUT_HANDLE);
si.hStdOutput = m_hOutputWrite;//GetStdHandle(STD_OUTPUT_HANDLE);
si.hStdError = m_hErrorWrite;//GetStdHandle(STD_ERROR_HANDLE);
si.wShowWindow = m_nShowCmd;
nResult = ::CreateProcess( NULL, m_szCmdLine, NULL, NULL, TRUE, CREATE_NEW_CONSOLE|CREATE_SUSPENDED, NULL, szWorkingDirectory, &si, &pi );
CloseHandlesForChild();
if( m_doMonitor )
CreateThread( NULL, 0, DoMonitorThread, (LPVOID)this, 0, NULL);
CreateThread( NULL, 0, ReadChildProcessConsoleThread, (LPVOID)this, 0, NULL);
ResumeThread( pi.hThread );
m_bMonitorResult = TRUE;
if (nResult==TRUE)
{
while( WaitForSingleObject( pi.hProcess, 100 )==WAIT_TIMEOUT && m_bMonitorResult )
{};
}
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandlesForParent();
return nResult&m_bMonitorResult;
}
private:
void DoMonitor()
{
if(!m_bInit)
return;
m_bMonitorResult = TRUE;
m_hReadActionEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
while( WaitForSingleObject( m_hReadActionEvent, m_nMaxSilentPeriod )==WAIT_OBJECT_0 )
{}
// Timeout or process terminated
m_bMonitorResult = FALSE;
CloseHandle( m_hReadActionEvent );
m_hReadActionEvent = INVALID_HANDLE_VALUE;
}
static DWORD WINAPI DoMonitorThread( void* p )
{
((ChildProcess*)p)->DoMonitor();
return 0;
}
void ReadChildProcessConsole()
{
if(!m_bInit)
return;
const int nBufferSize = 256;
CHAR lpBuffer[nBufferSize+1];
DWORD nBytesRead;
while(TRUE)
{
if (!ReadFile(m_hOutputRead,lpBuffer,nBufferSize,&nBytesRead,NULL) || !nBytesRead)
{
if (GetLastError() == ERROR_BROKEN_PIPE)
break; // pipe done - normal exit path.
}
if(m_bVerbose)
{
lpBuffer[nBytesRead] = '\0';
fputs( lpBuffer, stdout );
}
if( m_hReadActionEvent!=INVALID_HANDLE_VALUE )
SetEvent( m_hReadActionEvent );
}
}
static DWORD WINAPI ReadChildProcessConsoleThread( void* p )
{
((ChildProcess*)p)->ReadChildProcessConsole();
return 0;
}
void CloseHandlesForParent()
{
if(!m_bInit)
return;
if( hOutputRead!=INVALID_HANDLE_VALUE )
{
CloseHandle(hOutputRead);
hOutputRead = INVALID_HANDLE_VALUE;
}
if( hInputWrite!=INVALID_HANDLE_VALUE )
{
CloseHandle(hInputWrite);
hInputWrite = INVALID_HANDLE_VALUE;
}
}
void CloseHandlesForChild()
{
if(!m_bInit)
return;
// Close pipe handles (do not continue to modify the parent).
// You need to make sure that no handles to the write end of the
// output pipe are maintained in this process or else the pipe will
// not close when the child process exits and the ReadFile will hang.
if( hOutputWrite!=INVALID_HANDLE_VALUE )
{
CloseHandle(hOutputWrite);
hOutputWrite = INVALID_HANDLE_VALUE;
}
if( hInputRead!=INVALID_HANDLE_VALUE )
{
CloseHandle(hInputRead);
hInputRead = INVALID_HANDLE_VALUE;
}
if( hErrorWrite!=INVALID_HANDLE_VALUE )
{
CloseHandle(hErrorWrite);
hErrorWrite = INVALID_HANDLE_VALUE;
}
}
private:
BOOL m_bInit;
HANDLE m_hOutputRead, m_hOutputWrite;
HANDLE m_hInputRead, m_hInputWrite;
HANDLE m_hErrorWrite;
TCHAR m_szCmdLine[MAX_PATH];
TCHAR m_szWorkingDirectory[MAX_PATH];
int m_nShowCmd;
BOOL m_doMonitor;
BOOL m_bMonitorResult;
BOOL m_bVerbose;
int m_nMaxSilentPeriod;
HANDLE m_hReadActionEvent;
};
int _tmain(int argc, _TCHAR* argv[])
{
BOOL bResult = FALSE;
ChildProcess childProcess;
childProcess.SetInfomation( _T("netstat"), _T(""), SW_SHOWNORMAL );
childProcess.SetMonitorPolicy( TRUE, 4000, TRUE );
bResult = childProcess.CreateProcess();
}
set fso = CreateObject("Scripting.FileSystemObject")
strDesktop = WshShell.SpecialFolders("Desktop")
strPrograms = WshShell.SpecialFolders("Programs")
strProgramGroup = strPrograms & "\Group"
strCurrFolder = fso.GetParentFolderName(WScript.ScriptFullName)
set oShellLinkDesktop = WshShell.CreateShortcut(strDesktop & "\MyApplication.lnk")
oShellLinkDesktop.TargetPath = strCurrFolder & "\MyApplication.exe"
oShellLinkDesktop.WindowStyle = 1
oShellLinkDesktop.Hotkey = ""
oShellLinkDesktop.IconLocation = strCurrFolder & "\MyApplication.exe, 0"
oShellLinkDesktop.Description = "MyApplication"
oShellLinkDesktop.WorkingDirectory = strCurrFolder
oShellLinkDesktop.Save
If (fso.FolderExists(strProgramGroup)=False) Then
fso.CreateFolder(strProgramGroup)
End If
set oShellLinkPrograms = WshShell.CreateShortcut(strProgramGroup & "\MyApplication.lnk")
oShellLinkPrograms.TargetPath = strCurrFolder & "\MyApplication.exe"
oShellLinkPrograms.WindowStyle = 1
oShellLinkPrograms.Hotkey = ""
oShellLinkPrograms.IconLocation = strCurrFolder & "\MyApplication.exe, 0"
oShellLinkPrograms.Description = "MyApplication"
oShellLinkPrograms.WorkingDirectory = strCurrFolder
oShellLinkPrograms.Save
원문: http://appdeveloper.intel.com/en-us/article/developer-guidelines
Intel AppUpSM developer program
Developer Guidelines
Submitted by Community Admin on 14 Sep 2009
아래는 인텔 AppUpSM 개발자 프로그램을 위한 개발 가이드라인과 제출 요구사항의 개요입니다.
Application/Component Requirements Summary
l 코드는 Validation Guidelines 문서의 표준을 만족시켜야 합니다.
l 개발을 가속하고 Validation Process 중에 거부되는 위험을 줄이기 위해, Developer Catalog에 있는 컴포넌트의 사용을 권장합니다.
l 오픈소스 애플리케이션을 제외하고, Intel AppUp 개발자 프로그램 SDK을 사용해야 합니다.
l SDK와 함께 제공되는 API 지시사항에 부합하게 GUID를 사용하시오.
l 코드를 제출하기 전에 면밀히 검사하시오. Mobiln* OS를 위해 개발을 한다면, Moblin.org에서 구할 수 있는 Moblin 준수 테스팅 도구를 사용하시오.
l 애플리케이션을 제출할 때, 제출 지시사항을 따르고, 제출 양식에 적절하고 정확한 정보를 적어 제출하시오.
Validation Requirements
몇몇의 ‘하시오’와 ‘하지 마시오’는 성공적인 검증(Validation) 작업을 준비하는데 도움이 될 것입니다. 검증 작업에 대해 더 자세한 정보를 원한다면, Validation Guidelines와 Validation Process 문서를 보고, Application Readiness Checklist 또는 Component Readiness Checklist를 보시오.
애플리케이션:
l 다른 회사들의 트레이드 마크들의 사용 권한을 갖고 있는지 보장하시오.
l 애플리케이션을 배포할 권한이 있는지 보장하시오. 오픈소스 애플리케이션만 소스코드를 제출해야 합니다.
l 애플리케이션이 제대로 인스톨되고 동작하며 깨끗하게 제거되는지 보장하시오.
l UI가 깨끗하고 일관성 있는지 보장하시오.
l 애플리케이션을 제출할 때 적절히 평가하고, 제출 양식에 모든 요구 기준을 포함시키시오.
l 다른 소프트웨어나 네트워크에 해를 끼치는 동작을 허용하지 마시오.
l 사용자의 명시적인 동의 없이 개인 정보를 요구하거나 이용하는 동작을 허용하지 마시오.
l 불쾌한 컨텐츠를 포함시키지 마시오.
l 앱스토어 외부의 판매나 업그레이드, 구매유도를 위한 팝업이나 광고를 포함시키지 마시오.
컴포넌트:
l 라이센스 문서를 첨부하시오.
l API를 기술하시오.
l 컴포넌트의 추가 테스트를 위한 적절한 정보를 첨부하시오.
How We Test
1. 설치 패키지가 올바른 형식인지 검사합니다.
2. 패키지를 설치합니다.
3. 애플리케이션에 우리의 검증 표준 테스트를 합니다.
4. 깨끗한 제거를 확인하기 위해 애플리케이션을 제거합니다.
네트워크 시뮬레이터
Network Simulators
키워드: Networks simulators, 네트워크 시뮬레이터, NS-2, NS2, OPNET, GloMoSim, TOSSIM, NetSim
네트워크 시뮬레이터(Network Simulators)
네트워크 시뮬레이터는 실제 동작을 관찰하지 않고, 네트워크의 동작과 영향을 예측하고 분석하기 위한 장치 또는 소프트웨어다. 엔지니어는 이를 이용해서 DDoS와 같이 실제 일어나기 어려운 상황을 구성하거나, 대량의 센서 노드와 같이 비싼 실험 환경을 에뮬레이트하여 그 영향을 예측한다. 특히 새로운 네트워크 프로토콜을 테스트하거나, 기존의 프로토콜에 대한 환경의 영향을 테스트하는데 주로 사용한다.
현상을 검증하는 데는 수학적 분석, 실제 측정, 시뮬레이션 세 가지 접근 방식이 있다. 이 방식을 평가하는 기준은 현실성, 비용, 구현의 세 가지를 든다. 시뮬레이션은 이 세 가지 기준으로 봤을 때, 세 가지 방식 중에서 평균적으로는 가장 우수하다. 또한 시뮬레이션 방식은 연속 시간, 이산 시간, 이산 이벤트 방식으로 나눌 수 있는데, 대부분의 시뮬레이터가 이산시간 이벤트 방식을 이용한다.
일반적인 네트워크 시뮬레이터는 넓은 범위의 네트워크 기술을 포함하고, 노드와 링크를 기본 단위로 하여 복잡한 환경을 구축한다. 계층적인 네트워크 환경을 구성할 수도 있고, PC, 허브, 브릿지, 라우터, 무선 노드, 광케이블, 동축케이블 등의 구성요소를 사용할 수도 있다. 시뮬레이터의 구성요소는 일반적으로 스케쥴러, 프로토콜, 노드, 링크, 패킷으로 이루어져 작은 네트워크부터 대형 네트워크까지 유연하게 구성할 수 있다. 일부 시뮬레이터는 초대형 네트워크 환경을 지원하기도 하고, 어떤 시뮬레이터는 특정 네트워크 장비를 CPU 명령어 단위까지 에뮬레이션하여 아주 미세한 관찰을 가능하게 해주기도 한다.
네트워크 시뮬레이터의 종류
l NS-2 (The Network
Simulator -2)
NS-2는 연구용으로 개발된 오픈소스 시뮬레이터다.
현재 연구용으로는 가장 많이 사용되고 있으며, 다양한 분야의 인력들의 참여로 인해 성능과
품질이 우수하고, 다양한 기능을 지원한다. 이산 이벤트 시뮬레이션
방식을 사용하였고, 유무선을 모두 지원하고, 패킷 단위로
동작하며, 필요한 대부분의 프로토콜 레이어를 구현하였다. 오픈소스답게
기능과 네트워크 구성요소들이 철저히 모듈화되어 있어 일반 사용자도 기능을 수정하거나 새로운 프로토콜을 추가하기가 쉽다. 현재 NS-3 버전까지 나와있지만 아직까지 훨씬 많은 사람들이 NS-2를 사용하고 있다. 유닉스 환경의 대부분의 OS 플랫폼을 지원하고, 시뮬레이션 환경 구성에는 TCL이라는 스크립트 언어를 사용하며, NAM(NS AniMator)나 XGraph 같은 시각화 도구를 제공한다.
l OPNET
OPNET은 최초의 상업 네트워크 시뮬레이터로써,
현재도 상용 분야에서 가장 높은 점유율을 차지하고 있다. OPNET은 객체 지향적 모델링을
지원하며, 프로세스 모델링, 노드 모델링, 장비 모델링, 네트워크 모델링의 흐름을 따른다. 또한 잘 짜여진 FSM(Finite State Machine)은
세부단계까지 제어가 가능해 거의 모든 상황을 재현할 수 있다. OPNET은 기능 제약 또는 분야에 따라
여러 버전이 존재하며, 자유도가 높은 버전은 모델링 할 수 있는 구성요소들의 소스 코드를 완전히 개방하여
사용자의 자유도를 최대로 보장하고 있다. 또한 현존하는 거의 모든 프로토콜을 지원하며, 표준장비의 라이브러리를 제공하고, 시뮬레이션 환경 개발에서 분석까지의
전 과정을 GUI 도구를 통해서 편리하게 할 수 있다. 이는
대부분의 윈도우 플랫폼과 솔라리스 플랫폼을 지원한다.
l GloMoSim
GloMoSim은 대형 시뮬레이션 환경을 위해 개발되었다. 이는 병렬 컴퓨팅을 위한 이산 이벤트 컴퓨팅 시뮬레이터인 Parsec을
이용하여 개발하였다. 다른 시뮬레이터와 유사하게 OSI 계층에
따라 프로토콜을 모듈화하여 개발하였으며, 현재는 무선 네트워크만 지원한다.
l TOSSIM
TOSSIM(TinyOS Simulator)은 센서 네트워크에 사용하는 못(Mote)의 OS인 TinyOS를
에뮬레이션하여 어플리케이션의 동작과 하드웨어의 영향을 분석하는 소프트웨어이다. 이는 엄밀한 네트워크
시뮬레이터의 범주에서는 벗어난다. 이는 OS가 CPU에 내리는 명령 하나까지 에뮬레이션 하기 때문에 매우 정밀한 분석이 가능하다.
l NetSim
NetSim은 분석 도구가 아니라 네트워크 설정을 학습하기 위한 시뮬레이션 소프트웨어이다. 사용자와 상호작용을 위해 시뮬레이션은 실시간으로 이루어진다. 전송
프로토콜, MAC 프로토콜, 라우팅 프로토콜은 물론이고 스위치, 라우터, AP 등의 장비를 시뮬레이션할 수 있다.
참고자료
OPNET Modeler and Ns-2: Comparing the Accuracy Of Network Simulators for Packet-Level Analysis using a Network Testbed
http://privatewww.essex.ac.uk/~fleum/weas.pdf
The Network Simulator - ns-2
OPNET Technologies
GloMoSim
http://pcl.cs.ucla.edu/projects/glomosim/
TOSSIM
이 문장 하나로 간단히 시뮬레이션 전체의 랜덤 시드를 변경할 수 있다.