김치볶음밥 레시피

밥 한공기
익은김치 2/3 주걱
참치캔 1/2주걱
물엿 1큰술
고춧가루 2/3큰술
다시다 2/3큰술

계란한개
깨소금 적당량


업체 점원이 이 볶음밥 대박이었다는데.. 정말이야?
Posted by hopi
,

헤드샷

재밌는 글 2011. 7. 18. 14:53
아무리 그래도 .. 머리를 ..


Posted by hopi
,

[본 글은 허락없이 다른곳에 올리실 수 없습니다]

오늘은 동영상 강좌 나갑니다. ^^

오늘 배울 부분은 바로 헬기를 조종하는데 있어 가장 기본적인 사이클릭/컬렉티브/쓰로틀 이 세 가지에 대해서 말씀을 드릴건데요.각 입력장치에 대해 필요한 게이지 (rotor rpm/blade angle/throttle rpm)에 대한것을 연관시켜서 알려드리도록 하겠습니다.
우선, 튜토리얼을 보기 전 사랑차 님의 아래 자료를 꼭 읽어주시기 바랍니다.

http://cafe.naver.com/dcstr/175
위 자료를 이해하셨다면 실제로는 제가 올린 영상을 굳이 볼 필요는 없다고 생각됩니다만, 그래도 봐두면 뭔가는 도움이 되겠죠. ㅎㅎ

처음 블랙샤크를 리얼모드로 운행 해 보시면 가장 당황 해 하시는 것이 조종이 왜 이렇게 어려운가 하는 것일텐데요.
이것은 헬기의 세 가지 입력장비가 헬기에 어떤 영향을 미치게 되는지에 대해서 잘 모르고 계시기 때문이라 생각합니다. 그래서 오늘의 강좌는 이 부분에 대한 이해를 돕고자 각 입력장치가 메인로터와 쓰로틀에 미치는 영향에 대해서알려드리고자 합니다.

이 강좌를 통해서 조금 더 잘 이해하게 되시길 바라며, 다음 강좌에서는간단하게 헬기에서의 스톨이 일어나는 원인과 복구하는 방법 등을 알려드리도록 하겠습니다.

대략 10분 가량 플레이 타임이 됩니다.
그럼..


link>http://youtu.be/pe3-ql_4i3I
Posted by hopi
,
[본 글은 허락없이 다른곳에 올리실 수 없습니다]

이번에도 즐거운 이론시간입니다. ^^ 유후~

참, 이 문서는 아래 사랑차님께서 올리신 NDB관련 내용에 대해 조금 더 쉽게 풀어 쓴 글이므로 링크 글을 반드시 읽어보시길 권해드립니다.
http://cafe.naver.com/dcstr/449

읽어보셨다는 가정 하에, 위 내용들에 대해 조금 더 쉽게 풀어서 설명 해 보도록 하겠습니다.

NDB / ADF
Non Directional Beacon / Automatic Direction Finder
VOR
VHS Omni (Directional) Range
위의 NDB나 VOR 등은 공항에 설치되어져 있는 것이고, ADF는 항공기에 설치되어져 있는 것이죠.

사실 군사용 비행기 등에는 보통 MFD등이나 GPS를 수신하는 MAP SYSTEM 이 갖춰져 있기 때문에 이러한 NDB/ADF VOR 등은 보조기기로써 활용 될 뿐입니다.
그 러나 어떤 교육 과정에서도 빼놓지 않고 반드시 이수해야 하는것이 이것인데.. 왜냐하면 특정한 상황에 의해 보조 장비를 이용해야 할 경우, 또는 위와 같은 시스템이 없는 비행기를 몰 경우 반드시 알아야 할 필수 코스이기 때문입니다.


일단 NDB와 VOR 두 가지의 차이를 쉽게 이해하자면 AM/FM의 차이라고 생각하면 됩니다.
NDB는 보다 먼 거리에서 수신이 가능하고 전파가 휘어짐이 가능하기에 산 너머에서도 어렴풋이 수신이 가능합니다.
반면 VOR은 VHS를 이용하기에 직선 거리로 장애물이 없을 때에만 수신이 가능합니다. 거리 또한 더 짧죠.
그러나 NDB의 경우 오차가 있으며 야간에는 그 정도가 더 심해지는 반면 VOR은 대부분 정확한 정보를 제공합니다.
VOR은 보통 DME를 짝으로 사용하여 거리측정 까지 해 주는 것이 보통입니다.

이 렇듯 NDB는 거리가 멀 수록 오차가 존재하기에 Marker Beacon을 여러개 두어 멀리서 수신하는 비컨과 가까이서 수신하는 비컨을 별도로 구성하게 됩니다. 이것이 바로 Outer/Middle/Inner 비컨입니다. 블랙샤크에서는 Outer/Inner 두 가지만 수신이 가능하게 되어져 있습니다.

그럼 그림을 보실까요?


아래는 outer beacon입니다. V자 형으로 먼 거리를 송출하기에 적합합니다.



요건 Inner Beacon 사진입니다. 화질이 좋은넘 사진은 못구했네요.. ^^



Inner Beacon의 경우 활주로 거의 끝단에 설치되어져 있기 때문에, 만약 시계 상황이 너무 안좋아 활주로 확인이 거의 안될 때 이 Inner Beacon의 소리를 들었다면 아.. 이 주변에 이제 활주로가 있는거구나 라고 인지하시면 되겠습니다.

이 Black Shark에서 어느정도 재현을 잘 해놨냐면.. 요러한 Beacon도 맵에 존재한다는 사실입니다.



BS 소개자료에 보면 이에 대한 설명이 있죠.
In general, airfields are equipped with outer and inner NDB locator beacons for each end of every runway at 4000 m. and 1300 m. respectively. Some airfields are configured differently according to local conditions, such as sea or mountain proximity. Each beacon in the simulation is assigned its realistic frequency in the 150-1750 kHz range and Morse code ID. Additionally, each NDB locator beacon includes a co-located marker beacon operating at 75 mHz. The map also includes realistically placed independent NDBs with individual frequencies and IDs.

대충 발번역 해 보자면, 공항에는 이러한 비컨이 있는데, 시뮬레이션에도 이러한 것을 그대로 적용해서 실제와 같은 헤르쯔, 모르스 코드와 ID를 가진 NDB를 배치 해 두었습니다.. 라는 글입니다. 대단하죠? ^^

참, Black Shark에서 Outer/Inner를 선택하는 스위치가 있는건 다 아시죠? 이게 왜 존재하냐면.. 기기의 이상 유무를 점검하기 위해서라고 생각하시면 됩니다.
실기 시동 CheckList에 있을 것 같은데, ARK-22 패널에 보시면 선택하는/모르스 부호 소리를 선택이 가능하도록 되어져 있습니다.
시동시에는 보통 공항에서 이륙하는 경우가 많기 때문에 Outer/Inner를 두개 다 수신이 가능합니다.
선 택기에 모르스 부호를 수신하도록 한 후 Inner/Outer를 별도로 선택해서 두 개가 다 정상적으로 수신이 되는지 확인 한 후 이상이 없다면 Auto로 놓으시면 됩니다. 고장났다면 지상요원한테 쏼라쏼라 해 주면 되지 않겠습니까? ㅎㅎ

또 다른 사용법으로는, 사랑차님이 올려놓으신 글에 Beacon 관련한 도표가 있는데, 여기에 있는 코드를 확인해서 모르스 코드와 비교하면 자신이 원하는 NDB를 ARK-22를 통해 혹은 채널 변경을 통해 설정했는지에 대한 확인이 가능합니다.
보통 먼 거리에서 확인을 해야 하기에, Outer Beacon으로 놓고서 모르스코드를 대조 해 보면 됩니다.

참, 헬기를 띄워 공항을 벗어날 때 갑자기 헬기에서 뚜~뚜~뚜~ 하는 소리가 들릴텐데.. 요넘이 바로 비컨을 지나고 있다는 표시음입니다.


어쨌든 아날로그 HSI에 있는 RMI가 Radio Station 혹은 비컨을 가리킨다는 것에 대해서도 이해하셨을테고.. 그럼 이제 블랙샤크에서 활용하는 방법이 남았겠네요.

ABRIS 에서는 두 개의 RMI 지정이 가능합니다. 고로 하나는 보통 steer point를 지정하고 나머지 하나는 radio beacon을 지정 해 주어 노랑/빨강 지시선이 두 개를 가르키게 할 수 있으며 옵션 페이지에서 RMI 가 가리키는 것을 변경할 수 있습니다.
RMI는 ABRIS 의 ARC/HSI 페이지 두 곳에 모두 표시가 가능합니다.



아날로그 계기의 HSI는 노란색 바늘은 자주 보셨을테니 별도로 올리지 않겠습니다.


마지막으로.. 예전에 어떤분께서 올렸던 질문에 대한 답변을 드리며 이론은 여기서 마칠까 합니다.

Q) 가까운 공항으로 가고 싶은데.. 공항을 어떻게 찾아서 가야 하나요?

A)
1. waypoint에 지정된 공항일 경우에는 자동비행으로 설정하여 가시면 됩니다. (PVI-800의 공항선택도 가능합니다)
2. RMI가 지시하는 방향을 따라가면 됩니다.
3. ABRIS의 search 기능을 이용해서 공항/NDB/VOR을 찾아 이동하면 됩니다.

사실 답변이 너무 간단해서 초보자들이 활용하기는 쉽지 않을수도 있습니다. 이에 관련해서 동영상 tutorial을 별도로 올릴 예정이오니 그때 이 문서를 참고 해 주시면 되겠습니다.

ABRIS 의 서치기능이 참 괜찮은데.. 공항 찾기를 눌러 원하는 공항을 선택하고 'TO'만 누르면 바로 그곳으로 Flight Plan이 갱신됩니다. 어쨌거나 ABRIS 의 기본적인 사용법이나 ARK-22의 기본적인 사용법 등은 숙지하고 있는게 좋겠죠.


지루하셨을 텐데.. 끝까지 읽어주셔서 감사합니다.
언제나 그렇듯, 틀린내용이 보이면 꼭 지적해 주시길 부탁드립니다.

hopi

p.s 혹여나 궁금해 하시는 분들이 계실까봐...
사실 NDB, 즉 beacon과 Marker는 별개입니다만, 제가 같이 취급해서 글을 올렸는데요.
솔직히 같은 개념으로 봐도 크게 틀린것이 아니기에 올린 것이니 그냥 그러려니 하고 넘어가 주시면 감사하겠습니다. ^^


Posted by hopi
,

[본 글은 허락없이 다른곳에 올리실 수 없습니다]


HSI (Horizontal Situation Indicator) 활용강좌 – 1

자자.. 이론 공부시간입니다.
이론 편에서는 HSI에 대한 이론을, 그리고 다음 편에서는 실제 활용 편으로 HSI를 써먹는 동영상 튜토리얼강좌를 올려볼까 합니다.

사실, 매뉴얼이 정석이긴 합니다만..설명을 보고선 도대체 어떻게 써먹는건지 알 수가 없는 게 안타까운 현실이죠..
여기에서는, 매뉴얼 처럼 설명드리지 않고, 어떤 정보가 어떻게 활용되는지에 대해서만 되도록 쉽게 설명 드리도록 하겠습니다.

 

(요녀석이 바로 HSI입니다)

먼저 HSI 의 정의는 평면적으로 상황을 인식하는 도구 (Horizontal Situation Indicator) 입니다.
, 비행기를 위에서 바라본 평면 화면으로써, 곁눈질로 살짝 보기만 해도 한눈에 뭐가 어떤 상황인지를 알 수 있는 도구라 이거죠.
보병들한테 sitrep! (situation report) 이러면주루룩 상황 보고하는 것 마냥 말이지요.

그럼.. , 곁눈질로 HSI를 봤다 이거죠. 한눈에 무엇을 알 수 있는가!

1.    
현재의 진행방향
2.    가고자 하는 지점을 가리키는 지시자
3.    계획된 코스 (아날로그 바늘과 숫자 카운터 두개로 표시)
4.    
스티어포인트 까지의 거리
5.    라디오 스테이션의 방향.
6.    
측면 편차 지시자 (비행경로나 호버링 지점에대한)
7.    
수직 편차 지시자 (호버링 지점에 대한)

각각이 뭘 의미하는지 잘 보면 알 수는 있겠는데, 머리로 잘 이해가안됩니다.
적어도.. 저는 좀 그렇더라구요..^^

 

잠깐!
참고로 알아둘 것이 있는데 말이죠. Waypoint steer point의 차이점 아시나요?
Waypoint
는 비행계획으로 이루어진 리스트를 뜻하고 스티어포인트는현재 가고있는 웨이포인트의 한 지점을 의미합니다. 이해 하셨죠? 그러므로스티어포인트는 언제나 단 하나만 존재하는거죠.

여기까지 보고 이해하셨다면 의문이 하나 들겁니다.
? ABRIS MovingMap 화면 안에서 다 표현되는 정보인데, HSI가필요하나요??
. 이 질문을 하는 자체가 가장 중요하지요. 왜 존재하느냐!

여기 이유를 보겠습니다.

1.    
ABRIS만 믿고있었는데 이 486 똥컴을 쓰는데 이거 고장나면 어쩌시려구요.
2.    
GPS가 수신되지 않으면 말짱 꽝인 ABRIS.. (고로 HSINav Com과 연동됩니다)
3.    
디지털 정보를 읽는 것 보다 아날로그 계기가 순간 상황판단이 훨씬 좋습니다.
4.    
ABRIS, Navigation Computer가모두 작살났을 때 유일하게 동작하는 넘입니다.

이만하면 충분한 이유가 되었겠죠?

이전 강좌에서 설명드렸 듯, ABRIS는 여러 가지 이유로 인하여 PVI-800, Navigation Computer와 별도로 동작합니다. 실제 HSIHUD/ABRIS/PVI-800이 다 먹통일 때 유일하게 동작할 수 있는 넘이죠. (물론 waypoint에 대한 정보는 나가겠지만 말이죠)
우리나라를 예로 들어본다면, 군사분계선에서 열심히 뺑뺑이 돌면서 공격하다가대공포 몇발 쳐묵쳐묵 하고 위 세 시스템이 동시에 다 나갔다고 쳐보죠. 그럼 적어도 도망칠 때는 남쪽으로가야 하지 않겠습니까.
그러기에 HSI에는 수동으로 원하는 방향을 설정할 수 있는 니들이존재하기도 합니다.

여기까지가 기본적으로 HSI가 존재하는 이유를 볼 수 있겠구요.

실제로 활용을 할 때는 존재의 이유와는 또 다르겠죠.

활용점을 알아보자면

 

1.    공격모드 유지 시 HUD에 표시 안 되는 경로정보 등을 확인할 때 사용

2.    현재 스티어포인트 까지의 방향과 거리를 한눈에 볼 수 있다.

3.    DTA(Desired Track Angle)에대한 두 가지 참조점으로 비행계획에 복귀하기가 쉽다.

4.    호버링 시에 자신이 이동한 위치를 한눈에 파악이 가능하다.

5.    열악한 환경에서 시계 비행(VFR)이 아닌 계기비행(IFR) 을 할 때 착륙 등을 할 시에 필수적으로 활용된다.

 

이번 강좌에서는 1번부터 4번까지만설명을 드리고 5번은 별도의 강좌로 올려드리겠습니다.

5번 강좌를 보시려면 까페 매니저님이신 사랑차님이 올려두신 NDB (Inner/Outer), ADF 등을 설명해 놓으신 글을 한 번쯤 읽어보시면 좋을 것 같습니다.

다음 글에서 별도의 링크를 달아 드리겠습니다. (라지만, 사실 BS팁이 많지 않아서 금방 찾으실 수 있으시죠? ^^)

 

1/2번 공격모드 유지시활용/스티어포인트 정보 확인

당연히 스티어 포인트 까지의 헤딩(방향)과 거리를 한 눈에 볼 수 있으므로, ABRIS Flight Plan이나 Moving Map을 보는 것 보다 훨씬빠릅니다. 시뮬에서야 확대를 통한 정확한 정보 보기 혹은 듀얼 모니터를 활용한 정보보기가 가능하겠지만, 헬기 조종하면서 고개를 내려서 그 자글자글한 숫자가 가능한 ABRIS 를보기란 쉽지 않을거란 말이죠.

또한 공격모드일 때 HUD에서 얻지 못하는 경로 정보등을 HSI를 통해 신속히 확인이 가능합니다.

 

1번/2번 즉 현재 이동하고자 하는 스티어포인트를 확인하기 위해선 다음의두 개를 보면 됩니다.




위의 내용에 의하면, 다음 스티어포인트를 가려면 오른쪽 방향으로 조금틀어야 하고 거리는 130km가 남았다는 얘기지요.

 

그럼 3번 자료로 활용, 즉 DTA 에 대한 내용을 확인하기 위해 봐야 할 정보는 다음과 같습니다.


위의 DTA 숫자값은 웨이포인트 A에서 B로 이동한다고 했을 때 A와 B를 잇는 선이 북쪽 방향을 기준으로 몇 도인지를 나타내는 숫자입니다. (설명을 약간 수정하였습니다)

 

이게 뭐가 중요하냐 할 수도 있지만, Waypoint를 설계할 때대공포를 피하기 위해서 waypoint 트랙을 세심히 설정했다면 트랙을 벗어나면 바로 다이 하는 거아니겠습니까.

그래서 autopilot DH(Desired Heading)으로 갈 것인지, 아니면DT(Desired Track)을 따를 것인지 설정하는 버튼이 있는 것이죠.

(실제 유저 제작 미션에 보면 비행경로 이탈하지 말라고 경고를 많이 하곤 하더군요)


물론 이러한 DTA 정보는 ABRIS에서확인 하는게 훨씬 더 직관적이긴 합니다.

다만, 현재 상황을 인식하기 위해서는 윗쪽의 두 숫자와 노란색 점만확인하면 대충 어느방향으로 가야 되겠구나.. 트랙에서 내가 얼마나 벗어나 있구나 하는게 한눈에 확인가능하기에 상황 인식에 정말 좋은 자료라고 할 수 있죠.

 

4, 호버링 시 참조점확인하기

먼저 그림을 확인 해 봅시다.


바로 가운데에 있는 요놈을 기준으로 선이 직각으로 그어져 있는데요.

실제 비행기 시뮬을 다뤄보신 분들께서는 ILS (InstrumentLanding System)를 바로 상상 하실텐데, 헬기에선 일반적인 활용방법이 약간 다릅니다.

 

요 두 녀석은 두 가지 활용모드가 있는데요.

1.    호버링 시 참조점 확인

2.    경로 비행 시 DT (Desired Track) 확인

 

일단 호버링이 시작될 시 동그라미는 호버링이 시작 된 시점의 지점을 의미합니다.

, 위의 화면을 통해 보자면 호버링 시작 지점에서 왼쪽 위로 치우친상태라는 것입니다.

주의 할 것은 화면에서 지칭한 지점이 헬기의 지점이 아니라 반대로 이동해야 한다는 것. 즉 헬기를 뒤로 움직이면 수평바가 위로 올라올테고 헬기를 오른쪽으로 움직이면 수직바가 왼쪽으로 이동해서 가운데지점으로 가게 될 겁니다.

 

(참고! 호버링 시 위참조점 위치에서 너무 멀어지게 되면 Autopilot Damper(Heading, Yaw, Bank)등이 다 꺼져버리는 수가 있으니 이 계기를 자주 참조하시고 주의하세요)

 

사실, 이 호버링 참조점 편차 정보가 HSI에서 가장 많이 활용되는 정보라고 보시면 됩니다.

헬기 기동 상 가장 중요한 기동 중 하나가 바로 호버링이니까요.

실제로 이 정보도 HUD에서 간략하게 표현되긴 합니다만, 공격모드로 들어가는 순간 확인 할 방법이 없어지기 때문입니다.

 

두 번째로 얘기드렸던 DT를 확인하기 위한 값은 호버링 모드가 아닌상태에서 Autopilot 모드가 DT일 때에만 작동을 합니다. DH일 때에는 그냥 가운데에 위치하게 되죠. 이건 금방 이해 되시죠?

 

, 여기까지입니다.

 

사실 정보들이 HUD나 ABRIS 에 있으므로 HSI는 찬밥신세이긴 한데, 이걸 잘 활용하면 굉장히 유익하다는 걸 아실 수 있을겁니다.


쉽게 쓰고자 했는데 이 자료가 조금이나마 BS를 즐길 수 있는데 도움이 되길 진심으로바래봅니다.

만약 틀린 내용이 있으면 댓글로 말씀 주시면 바로 수정하도록 하겠습니다.

 

그럼

Posted by hopi
,
간단하게 영상으로 만들어 보았다.
미션은.. 싱글 미션에 포함된 courier 미션을 토대로 동영상을 제작하였으니 참고할 것.


Posted by hopi
,

권과장이 만들어 둔 함수.
microsoft에서 제공 해 준대로 쓰려면 헷갈리고 불편해서.. 사용하기 편하도록 만들어 둔 거당..


	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 작성 : 2008-09-11 CROWBACK
	// 수정 : 2008-09-17 CROWBACK
	//        64비트 Windows 2008 버전을 잘못 읽어오던것 수정됨.
	// 
	// 윈도우의 버전 정보를 읽어오는 클래스.
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	class CWindowsVersion
	{
	public:
		typedef enum
		{
			eWindows32,
				eWindows95,
				eWindows98,
				eWindowsME,
				eWindowsNT,
				eWindows2000,
				eWindowsXP,
				eWindows2003,
				eWindowsVista,
				eWindows2008,
				eWindowsUnknown
		} eOsType;
		
		typedef enum
		{
			Bit32,
				Bit64,
				ArchUnknown
		} eOsArch;
		
	public:
		CWindowsVersion();
		void CheckVersion();
		const char* GetTypeString(eOsType type);
		const char* GetArchString(eOsArch arch);
		
	public:
		eOsType	m_Type;
		eOsArch	m_Arch;
		char	m_SubType[512];
		UINT	m_Build;
		char	m_ServicePack[512];
	};
	




typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);

CWindowsVersion::CWindowsVersion()
{
	m_Type			= eWindowsUnknown;
	m_Arch			= Bit32;	
	m_Build			= 0;
	m_SubType[0]	= 0;
	m_ServicePack[0]= 0;

	CheckVersion();
}

const char* OsTypeStriung[] = 
{
	"Windows Win32",
		"Windows 95",
		"Windows 98",
		"Windows ME",
		"Windows NT",
		"Windows 2000",
		"Windows XP",
		"Windows 2003",
		"Windows Vista",
		"Windows 2008",
		"Windows Unknown"
};

const char* OsArchStriung[] = 
{
	"32bit",
		"64bit",
		"Unknown"
};

const char* CWindowsVersion::GetTypeString(eOsType type)
{
	if( type < eWindows32 && eWindows2008 < type)
		return OsTypeStriung[eWindowsUnknown];
	return OsTypeStriung[type];
}

const char* CWindowsVersion::GetArchString(eOsArch arch)
{
	if( arch < Bit32 && Bit64 < arch)
		return OsTypeStriung[ArchUnknown];
	return OsArchStriung[arch];
}

void CWindowsVersion::CheckVersion()
{
	OSVERSIONINFOEX osvi;
	SYSTEM_INFO si;
	PGNSI pGNSI;
	BOOL bOsVersionInfoEx;
	
	ZeroMemory(&si, sizeof(SYSTEM_INFO));
	ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
	
	// Try calling GetVersionEx using the OSVERSIONINFOEX structure.
	// If that fails, try using the OSVERSIONINFO structure.
	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi);
	if( !bOsVersionInfoEx )
	{
		osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
		if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) 
			return;
	}
	
	// Call GetNativeSystemInfo if supported
	// or GetSystemInfo otherwise.
	pGNSI = (PGNSI) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo");
	if(NULL != pGNSI)
		pGNSI(&si);
	else 
		GetSystemInfo(&si);
	
	switch (osvi.dwPlatformId)
	{
		// Test for the Windows NT product family.
	case VER_PLATFORM_WIN32_NT:
		{
			// Test for the specific product.
			if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 )
			{
				if( osvi.wProductType == VER_NT_WORKSTATION )
					m_Type = eWindowsVista;
				else
					m_Type = eWindows2008;
			}
			
			if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )
			{
				if( GetSystemMetrics(SM_SERVERR2) )
					m_Type = eWindows2003, strcat(m_SubType, "R2 ");
				else if( osvi.wProductType == VER_NT_WORKSTATION && si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
					m_Type = eWindowsXP, m_Arch = Bit64;
				else
					m_Type = eWindows2003;
			}
			
			if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )
				m_Type = eWindowsXP;
			if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
				m_Type = eWindows2000;
			if ( osvi.dwMajorVersion <= 4 )
				m_Type = eWindowsNT;
			
			// Test for specific product on Windows NT 4.0 SP6 and later.
			if( bOsVersionInfoEx )
			{
				// Test for the workstation type.
				if ( osvi.wProductType == VER_NT_WORKSTATION && si.wProcessorArchitecture!=PROCESSOR_ARCHITECTURE_AMD64)
				{
					if( osvi.dwMajorVersion == 4 )
						strcat(m_SubType, "Workstation 4.0 ");
					else if( osvi.wSuiteMask & VER_SUITE_PERSONAL )
						strcat(m_SubType, "Home Edition ");
					else
						strcat(m_SubType, "Professional ");
				}
				// Test for the server type.
				else if ( osvi.wProductType == VER_NT_SERVER || osvi.wProductType == VER_NT_DOMAIN_CONTROLLER )
				{
					if((osvi.dwMajorVersion==5 && osvi.dwMinorVersion>=2) || osvi.dwMajorVersion >= 6)
					{
						if ( si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 )
						{
							if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
								strcat(m_SubType, "Datacenter Edition "), m_Arch = Bit64; 
							else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
								strcat(m_SubType, "Enterprise Edition "), m_Arch = Bit64; 
						}
						else if ( si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 )
						{
							if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
								strcat(m_SubType, "Datacenter Edition "), m_Arch = Bit64; 
							else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
								strcat(m_SubType, "Enterprise Edition "), m_Arch = Bit64; 
							else
								strcat(m_SubType, "Standard Edition "), m_Arch = Bit64; 
						}
						else
						{
							if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
								strcat(m_SubType, "Datacenter Edition "); 
							else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
								strcat(m_SubType, "Enterprise Edition "); 
							else if ( osvi.wSuiteMask & VER_SUITE_BLADE )
								strcat(m_SubType, "Web Edition "); 
							else
								strcat(m_SubType, "Standard Edition "); 
						}
					}
					else if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==0)
					{
						if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
							strcat(m_SubType, "Datacenter Server "); 
						else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
							strcat(m_SubType, "Advanced Server "); 
						else
							strcat(m_SubType, "Server "); 
					}
					else  // Windows NT 4.0 
					{
						if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
							strcat(m_SubType, "Server 4.0, Enterprise Edition "); 
						else
							strcat(m_SubType, "Server 4.0 "); 
					}
				}
			}

			// Display service pack (if any) and build number.
			if( osvi.dwMajorVersion == 4 && lstrcmpi( osvi.szCSDVersion, TEXT("Service Pack 6") ) == 0 )
			{ 
				HKEY hKey;
				LONG lRet;
				
				// Test for SP6 versus SP6a.
				lRet = WOW::RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009"), 0, KEY_QUERY_VALUE, &hKey );
				if( lRet == ERROR_SUCCESS )
					strcat(m_ServicePack, "Service Pack 6a"), m_Build = osvi.dwBuildNumber & 0xFFFF;
				else // Windows NT 4.0 prior to SP6a
					strcat(m_ServicePack, osvi.szCSDVersion), m_Build = osvi.dwBuildNumber & 0xFFFF;
				WOW::RegCloseKey( hKey );
			}
			else // not Windows NT 4.0 
				strcat(m_ServicePack, osvi.szCSDVersion), m_Build = osvi.dwBuildNumber & 0xFFFF;
			break;
		}
		
		// Test for the Windows Me/98/95.
	case VER_PLATFORM_WIN32_WINDOWS:
		{
			if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
			{
				m_Type = eWindows95;
				if (osvi.szCSDVersion[1]=='C' || osvi.szCSDVersion[1]=='B')
					strcat(m_SubType, "OSR2 ");
			} 
			
			if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
			{
				m_Type = eWindows98;
				if ( osvi.szCSDVersion[1]=='A' || osvi.szCSDVersion[1]=='B')
					strcat(m_SubType, "SE ");
			} 
			
			if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
			{
				m_Type = eWindowsME;
			} 
			break;
		}
		
	case VER_PLATFORM_WIN32s:
		{
			m_Type = eWindows32;
			break;
		}
   }
}

혹 조금이나마 도움이 되었다면 http://crowback.tistory.com 이곳에 감사인사 한 마디 정도 남기도록 하장.. ^^
Posted by hopi
,
그동안 해야지 해야지.. 하면서도 귀찮아서 못하고 있던 syntax highlighter 기능을 적용시켜 보았다..

샘플코드!
__int64 Gen_FileList(char* srcdir, vFilelist* flist, int *filecount)
{
	*filecount = 0;
	char buf[1024] = {0};
	strcpy_s(buf, srcdir);
	strcat_s(buf, "\\*");
	HANDLE hFind;
	WIN32_FIND_DATA ffd;
	__int64 TotalBytes = 0;

	hFind = FindFirstFile(buf, &ffd);
	if(hFind == INVALID_HANDLE_VALUE)
	{
		K4LOG(LOG_TRACE, "Gen_FileList:디렉토리가 존재하지 않습니다.");
		return -1;
	}

	do
	{
		if(!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
		{
			FILEDATA fdata;

			fdata.filesize.LowPart = ffd.nFileSizeLow;
			fdata.filesize.HighPart = ffd.nFileSizeHigh;

			memset(fdata.fullpath, 0, MAX_PATH);
			memset(fdata.filename, 0, MAX_PATH);

			strcpy_s(fdata.fullpath, srcdir);
			strcpy_s(fdata.filename, ffd.cFileName);
			
			flist->push_back(fdata);
			(*filecount)++;
			TotalBytes += fdata.filesize.QuadPart;	// 추후 계산할 때 사용하도록
		}
	}while(FindNextFile(hFind, &ffd) != 0);
	
	FindClose(hFind);
	return TotalBytes;
}
뭐.. 샘플코드라고 하긴 했지만.. 폴더 내의 파일 리스트를 작성하는 샘플코드이므로.. 추후에 잘 활용 해 보도록 하자. 이번 프로젝트에서 아주아주 요긴하게 잘 쓰고 있다. 잘 나와야 할텐데.. ^^
Posted by hopi
,
나노 스튜디오 세 번째로 만든 곡

만드는 내내 무척이나 재미있었다. 근데 막판에 급체하는 바람에 곡을 듣기만 해도 그때 기억이 떠올라 급하게 마무리 지어버렸음... 쩝..

어쨌든 괜찮은 곡인 것 같음. 자칭.. ㅎㅎㅎㅎㅎ

light by ihopi

즐감
Posted by hopi
,
윈도우 명령에서 guidgen 등을 사용하면 UID를 구할 수 있다는건 알만한 사람들은 알 것이고..

프로그램에서 이걸 구현하려면... 다음과 같이 하면 된다.

#pragma comment(lib, "Rpcrt4.lib") 
#include 

typedef struct _GUID
{
  DWORD  Data1;
  WORD   Data2;
  WORD   Data3;
  BYTE   Data4[8];
} GUID;

typedef GUID UUID; 
{
    UUID uuid;
    if(UuidCreate(&uuid) == RPC_S_OK)
    {
        char *sz = NULL;
        if(UuidToString(&uuid, (BYTE**)&sz) == RPC_S_OK)
        {
            AfxMessageBox(sz); //"6B29FC40-CA47-1067-B31D-00DD010662DA" 등등..
            RpcStringFree((BYTE**)&sz);
         }
    }
}
Posted by hopi
,