Aug 31
alonesOS & Tools Google Talk Tips & Tricks, GTalk, 구글, 구글 톡
프락시 정책 등으로 인해서 구글 톡으로 네트워크에 연결할 수 없을 경우는 아래와 같이 실행 옵션에 “/nogaiaauth”를 파라미터로 주면 된다.
※ 실행 아이콘에 속성을 보면 나오는 다이얼로그에서…
“C:\Program Files\Google\Google Talk\googletalk.exe” /nogaiaauth
부팅 시에도 위 파라미터를 적용하기 위해서는
시작 -> 실행 에서 regedit를 입력해서 아래 레지스터리에 있는
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
구글 톡의 값에 ‘/autostart’ => ‘/nogaiaauth’ 로 변경한다.
“/nogaiaauth” 은 아래와 같이 GAIA 인증을 사용하지 않겠다는 설정이다.
- /plaintextauth: uses plain authentication mechanism instead then Google’s GAIA mechanism. Used for testing the plain method on Google’s servers.
- /nogaiaauth: disables GAIA authentication method. The same as above.
이와 같이 구글 톡 시작 시 설정할 수 있는 파라미터들을 보면 다음과 같다.
- /nomutex: Open more than 1 Gtalk.
(이 옵션을 주면 하나 이상의 구글 톱을 띄울 수 있다)
- /autostart: Check the registry settings to see if Gtalk
needs to be started. If the “Start automatically with Windows” option
is unchecked, it won’t start.
- /forcestart: Similar to /autostart, but forces Gtalk to start.
- /S upgrade: Used when upgrading Google Talk
- /register: registers Google Talk in the registry, including the GMail Compose method.
- /checkupdate: check for newer versions
(이 것도 유용한 것 같다. 새 버전을 체크해주는 것)
- /plaintextauth: uses plain authentication mechanism instead then Google’s GAIA mechanism. Used for testing the plain method on Google’s servers.
- /nogaiaauth: disables GAIA authentication method. The same as above.
- /factoryreset: set settings back to default.
- /gaiaserver servername.com: uses a different GAIA server to connect to Google Talk. Used for debug purposes only, there are no other known GAIA servers.
- /mailto email@host.com: send an email with Gmail
- /diag: start Google Talk in diagnostic mode
- /log: probably has something to do with the diagnostic logging
그리고 아래는 구글 톡의 인스턴스 창 (챗팅 창)에서 사용할 수 있는 여러 가지 유용한 tip이다.
Line Break
Hold SHIFT and hit ENTER
Bold text
To bold your text, put an asterisk (*) before and after content. [Example] *these will be bold*
Italic text
To italic your text, put an asterisk (_) before and after content. [Example] _these will be italic_
아래 세 개의 단축 키는 아주 유용한 것 같다.
Switch between chat windows
Hold CTRL, click on I will cycle you through each chat window
Minimize chat window
ALT + ESC minimize chat window. (For Gmail talk, it only work when chat window is a popup)
Restore chat window
WINDOWS + ESC will restore your Gtalk from minimized mode.
Ref:Google Gtalk tips and tricks
Aug 31
alonesProgramming Eclipse, Java, mfc, RCP, win32, 개발 IDE, 이클립스
저는 작년 어느 즈음부터 이클립스 (Eclipse) 기반 vs MFC와의 갈등을 경험하게 되었습니다.
어찌 어찌 하다 개발 프로젝트의 언어 및 전체적인 방향을 결정에 큰 영향을 줄 위치에 있게되었습니다. 아무튼..
저는 주로 C/C++과 MFC에 익숙했고 (그래서 평범하겠죠?) 이클립스도 1년여 동안 IDE로 사용을 해본 경험도 있긴했습니다. 이클립스를 1년 정도 쓰다 다시 Visual Studio 환경으로 오니 황무지에 낙타 한마리와 동행하는 느낌이 들긴했지만 어느 새 적응이 되었습니다.
(그래도 STL와 code guru, code project, devpia가 있는데 왜 Rich한 Java가 부럽냐라고 반론을 제기하는 사람이었습니다)
어찌되었던 작년 가을 정도와 올해 초 그리고 지금 (세 번이군요) 이클립스 기반이냐 MFC와 Win32기반이냐로 의견이 분분하고 신중한 결정을 내려야 하는 계절이 있었고 지금도 그러고 있습니다.
이클립스 편 – Eclipse
단적으로 이클립스로 가야한다는 쪽의 주장을 들어보고 분석해보면 아래와 같습니다.
■ 막강한 Plugin Model과 RCP
손쉽게 Eclipse Plugin으로 component 기반 개발 (CBD)를 할 수 있음
(이 것은 단순히 DLL을 이용해서 잘 만든 윈도우즈 기반 프로그램을 훨 씬 뛰어넘는 수준이겠죠)
그리고 3.2부터인가 나온 RCP (Rich Client Platform)는 IBM의 같은 프로젝트인 OSGi Framework 위에서 환상적인 많은 것들을 제공하고 있습니다.
■ Rich Environment
수 많은 Powerful한 Plugin (TPTP나 여러 가지…)을 비록한 유용한 지원 도구를 사용할 수 있음
■ OS Indenpendent (including GUI throught JVM, SWT, JFace)
무엇보다도 OS Independent할 수 있음
(저희 과제는 다양한 OS환경을 고려해야 했습니다. 다양한 OS에 올라가야 하는 것은 아니었지만)
특히 SWT와 JFace의 Look and feel은 swing과는 비교도 할 수 없을 것입니다.
그리고 Eclipse의 배포 정책에는 여러 다양한 환경 (OS를 포함한)을 지원하고 있습니다.
의 이유로 주창을 했고
Win32 및 MFC
C/C++로 GUI가 있는 호스트 부분은 MFC와 Win32로 가야한다는 쪽의 주장과 분석을 들어보면 아래와 같습니다.
■ JVM이 필요 없음
최소한 윈도우만 고려한다면 JVM을 위해 JRE를 설치하지 않아도 된다
(이상한 나라의 엘리스 처럼 들릴 수도 있고 민감한 부분으로 인식할 수도 있는 문제인 것 같습니다)
※ 물론 VC6.0 이상은 .net framework을 설치해야하겠죠?
■ 빠르다
(Eclipse가 속도가 개선되었다고 하지만 JVM으로 여러 OS를 고려해야 하고 Windows 경우는 JNI를 통해서 system control을 해야 하며 Eclispe 및 Eclipse RCP (Rich Client Platform) 자체가 lazy binding이라 Win32와 MFC를 따라 올 수는 없습니다.
■ Eclipse로 간다면, JNI를 사용해야 하는 경우가 있다.
가끔 Win32 api를 이용해야 하는 경우 JNI를 이용해야 하는데, 이 것은 한 프로그램이 이질 언어도 작성됨으로써 디버깅이 힘들게 되고 Eclipse의 OS Independency를 잡는 경우도 있습니다.
(물론 linux로 간다면 JNI DLL의 내용을 porting하면 되겠죠)
■ 많은 것들을 핸들링할 수 있다.
흔히들 (GUI이든 engine이든) MFC와 Win32를 이용해서 (돌아가든, 바로가든) 불가능 한 것은 거의 없다 라고 합니다.
※ 하지만 이 것은 잘 생각해봐야할 문제인 것 같습니다. OS Independent하니 Eclipse 기반으로 가는 것은 어느 정도 한계를 가질 수 있습니다. 하지만, 정말 그렇게 인터페이스나 기능을 고쳐야하는게 맞는지 잘 생각해봐야 할 것입니다.
■ 유지 보수할 인력들이 더 많다.
저희 회사의 경우는 Eclipse 기반 개발자 보다는 아닌 개발자가 더 많았습니다.
※ 이 문제는 단순히 Java를 할 수 있는 인력이 아니겠죠? C++을 잘한다해도 MFC를 배워야겠지만 Eclipse는 더 많은 것을 (RCP 등을 제대로 사용하려면) 이해해야할 것입니다.
※ 위에서 거론한 것 보다 더 많은 장.단 점이 있을 것이고 거론 한 것들도 잘 못 될 수도 있을 것입니다.
그리고 위의 문제는 많은 논쟁점을 가지고 있고 어떤 프로젝트냐에 따라 장점이 단점으로 단점이 장점으로 변경될 것입니다.
중요한 것은 프로젝트 (개발한 소프트웨어?)에 무엇이 맞는지 (버릴 것과 얻을 것을 생각해서) 심사숙고해서 검토해야 할 것입니다.
단순히 많은 세계적인 소프트웨어 (JBuilder, OSGi, ClearQuest, 기존 C/C++을 위한 도구들도)들이 Eclipse 기반의 플러그인이나 RCP 모델로 간다고 해서 무작정 따라가는 것은 맞지 않을 것입니다.
Aug 28
alones내 생각들 wikipedia, 대한민국, 위키피디아, 일본어, 한국어
어디서 봤는지 기억이 나지 않는데 블로그의 작성 언어 중 2위가 일본어라는 말을 듣고 (사실인지 아닌지는 모르겠다) 동료와 이야기 하다. 위키피디아에서 “일본어”를 검색하게 되었다.
그런데 한글 위키피디아의 일본어 검색 결과 페이지에서 별로 마음에 들지 않는 카테고리와 내용이 있었다.
내용은 아래와 같다.
=======================================================================================
http://ko.wikipedia.org/wiki/%EC%9D%BC%EB%B3%B8%EC%96%B4
한글 위키피디아에서 “일본어” 검색 결과
일본어의 지위
일본어는 사실상 일본의 공용어이기는 하나 일본 법률상의 공식공용어는 아니다.
언어사용자는 일본외에도 미국의 캘리포니아, 하와이, 캐나다, 멕시코, 서유럽(영국, 프랑스, 독일, 포르투갈, 몰타), 동유럽의 폴란드, 러시아, 라트비아, 남아메리카(아르헨티나, 브라질), 기타 아시아지역, 대한민국, 조선민주주의인민공화국, 태평양 연안국가(팔라우, 미크로네시아, 괌, 북마리아나 제도, 마셜 제도)와 중화민국, 중화인민공화국, 타이, 인도네시아, 필리핀등지에 언어인구가 있다.
=======================================================================================
언어 사용자 분포에서 일본의 침략 덕인지 여러 환태평양의 나라들이 거론되어있다. 그리고 나이 많으신 분들이 간혹 일본어를 하시는 것을 본적도 있을 것이다.
근데 왜!! 일본어의 지위 라는 제목 아래 각 나라들이 예전에 지배를 받은 것을 (또는 침략을 받은 것을) 강조라도 하듯이 열거 해놓았느냐는 것이다!!
한국어 위키피디아의 다른 언어들은 어떻게 되었는지 확인해보았다.
한국어, 중국어, 프랑스어, 심지어 영어에 대한 위키피디아 페이지에서 “OOO 어의 지위” 라는 카테고리는 어디에도 표기되어 있지 않다. (내가 찾아 본 언어들은)
일본어 위키피디아도 아니고 영어 위키피디아도 아닌 – 그렇다고 그런 언어의 위키피디아는 괜찮다는 말은 아니다 – 한국어 위키피디아에 왜 일본어에만 “일본어의 지위” 라는 카테고리를 두었는가?!
마치 한 때 주위의 모든 나라를 굴림했다는 야만적 역사를 찬양이라도 하듯이!!
분명 번역기로 위키피디아를 돌렸다고 해도 수정 작업을 했을 것인데 말이다!!
그런데 더욱 개탄 스러운 것은 영어 위키피디아에서 Japanese language를 검색 해보면 놀랍게도 “지위”라는 말은 찾을 수 없다. 대신 아래와 같이 지역 분포를 뜻하 Geographic distribution이라는 카테고리가 매칭 된다!!
=======================================================================================
http://en.wikipedia.org/wiki/Japanese_language
영문 위키에서 “Japanese language” 검색 결과
Geographic distribution
Although Japanese is spoken almost exclusively in Japan, it has been and is still sometimes spoken elsewhere. When Japan occupied Korea, Taiwan, parts of the Chinese mainland, and various Pacific islands during and before World War II, locals in those countries
were forced to learn Japanese in empire-building programs. As a result,
there were many people in these countries until the 1970s, who could
speak Japanese in addition to the local languages. Japanese emigrant
communities (the largest of which are to be found in Brazil)
frequently employ Japanese as their primary language. Approximately 5%
of Hawaiians speak Japanese and Japanese ancestry is the largest single
ancestry in the state (over 24% of the population). Japanese emigrants
can also be found in Peru, Argentina, Australia (especially Sydney, Brisbane, and Melbourne), the United States (notably California (1.2% of the population has Japanese ancestry) and Hawaii), and the Phillippines (particularly in Davao and Laguna). Their descendants (known as nikkei 日系,
literally Japanese descendants), however, rarely speak Japanese
fluently. There are estimated to be several million non-Japanese
studying the language as well; many schools, both primary and
secondary, offer courses.
According to The World Factbook by the CIA, Angaur state of Palau is reported to have Japanese as one of three official languages as well as Angaur and English [1]. The state is the only place in the world where Japanese is the de jure official language, in case the report is true. However, another report tells that the official languages in Angaur are Palauan and English, just like other states in the republic. [2] Whichever the case, the number of active Japanese speakers in the state is zero, according to the census in 2005. [3]
=======================================================================================
원문일 것 인 (아닐 수도 있겠지만) 영문 위키피디아에도 “일본어의 지위” 라는 표현을 쓰지 않았는데, 대한민국을 위한 한국 위키피디아에 왜 “일본어의 지위”라는 표현을 쓰는가!!
그리고 대한민국을 한글 위키피디아에서 찾아보라.
한글의 그 오묘한 표현력을 남용해서 참 기분 나쁘게 대한민국의 독립을 기술해두었다.
=======================================================================================
http://ko.wikipedia.org/wiki/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD
“대한민국” 검색 결과
제2차 세계 대전 중 일본 제국의 패망으로 찾아온 해방을 계기로 1948년 8월 15일에 대한민국 정부를 수립하였다.
=======================================================================================
Aug 27
alonesProgramming/C/C plus plus c/c++, CAloFileMonitor, file handling, file monitor, win32, Win32 API Programming, Windows Programming
에디터에서 연 파일이 외부에서 수정된 것을 감지하고 사용자에게 알려주기 위해,
파일의 최종 수정 시간이 변경되는 것을 모니터링하는 class를 win32 api로 만들어봤습니다.
최신 내용은 위키에서 볼 수 있습니다.
(※ 코드도 위키에서 보기가 편할 것입니다. 코드 부분은 가로가 너무 길어져서 개행을 좀 시켜서 입니다.)
- initial version: 2007.08.27
목차
-
- 1 Background
- 2 만들고 싶은 파일 변경 모니터
- 3 만들어 간 과정
-
- 3.1 디렉토리 변경 감지 – FindFirstChangeNotification()
- 3.2 변경 감지 하기
- 3.3 지정한 디렉토리 내에 변경이 감지되면 원하는 파일의 변경 확인
- 3.4 그외
- 4 CAloFileMonitor
-
- 4.1 CAloFileMonitor.h
- 4.2 CAloFileMonitor.cpp
- 4.3 Usage
- 5 Binary
- 6 Reference
1 Background #
에디터 (editor) 프로그램에서는 현재 열고 있는 파일이 에디터가 아닌 외부에서 변경되었을 때, 변경을 감지하고 사용자에게 현재 열고 있는 파일이 외부에서 변경되었으니 다시 열것인지를 물어보는 기능이 필요할 것이다.
이런 기능이 없다면 외부에서 변경된 내용을 무시하고 현재 내용으로 파일을 덮어 써 버릴 위험이 있다. Editplus나 UltraEdit, Visual Stduio, SourceInsight 등 대부분 우리가 알고 사용하고 있는 에디터 프로그램들을 이런 기능을 제공하고 있다.
본인의 경우는 만들고 있던 프로그램이
Scintilla open source를 이용해서 에디터 기능을 제공하고 있었는데, 이와 같은 이슈가 있어서 파일 변경을 감지하는 class를 win32 api를 이용해서 만들게 되었다.
(-_-;; 예전에 만든 것인데 글 쓰기의 압박으로 이제 관련 글을 올려 본다)
2 만들고 싶은 파일 변경 모니터 #
디렉토리가 아닌 특정 파일을 지정해서 그 파일의 변경 (last-write time의 변경)을 모니터링하고 변경 시
지정한 function pointer를 호출해서 알려주는 (notify) class로 아래와 같은 멤버 함수를 제공할 것이다.
/** @brief set file monitor, file path and call-back funtion */
bool SetFileMonitor(std::string filePath, PFnFileChanged pFn);
//
3.1 디렉토리 변경 감지 – FindFirstChangeNotification() #
애석하게도 (내가 아는 바로는) 파일 변경을 직접 모니터링 하는 win32 api는 없는 것 같다. (Visual Stduio 2005의 managed c++ 등에서는 어떤지 모르겠지만)
그래서 디렉토리 및 디렉토리 내의 파일의 변경을 감지하는 FindFirstChangeNotification()을 사용했다. FindFirstChangeNotification
()는 지정한 디렉토리에 대해서 디렉토리를 포함한 하부 디렉토리 및 파일에 대한 변경 (이름, 속성 수정, 삭제, 생성 등등
거의 대부분의 변경)을 모니터링할 수 있는 handle을 생성하고 이 handle을 이용해서 wait function (e.g.
WaitForMultipleObjects())이 변경에
대한 감지를 할 수 있다.
HANDLE WINAPI FindFirstChangeNotification(
LPCTSTR lpPathName,
BOOL bWatchSubtree,
DWORD dwNotifyFilter
);
//
3.2 변경 감지 하기 #
FindFirstChangeNotification()으로 생성한 변경 감지 handle의 signal을 기다리기 위해서 wait function 중
WaitForMultipleObjects()을 사용했다.
WaitForSingleObject()를 사용할 수도 있겠지만 뒤에 나오는 모니터링 종료를 위한 sinnal을 이용해서 여러 개의 signal object를 기다리는
WaitForMultipleObjects()를 사용했다.
DWORD WINAPI WaitForMultipleObjects(
DWORD nCount,
const HANDLE* lpHandles,
BOOL bWaitAll,
DWORD dwMilliseconds
);
//
물론 한 변 변경을 감지하고 계속 변경을 감지하기 위해서 (loop 등에서)
FindNextChangeNotification()을 사용했다.
3.3 지정한 디렉토리 내에 변경이 감지되면 원하는 파일의 변경 확인 #
FindFirstChangeNotification()은 디렉토리 하부에 있는 어떤 파일의 변경 (last-write time 변경)에도 signal을 보낸다. 그래서 일단
FindFirstChangeNotification
()로 만든 handle에 의해서 wait function이 signal을 받으면 지정한 파일의 last-write time을
체크 해서 모니터링을 처음 시작했을 대와 변경되었는지 확인한다.
즉, 어떤 파일이 변경되었는지 모르니 원하는 파일이 변경되었는지 확인하는 것이다.
이 것을 위해 GetFileAttributesEx()를 사용했다.
예전에
GetFileTime 또는 GetFileAttributesEx를 이용한 파일의 최종 수정 시간 구하기 에서 GetFileAttributesEx()에 대해서 설명했었다.
파일의 최종 수정 시간을 확인하기 위해서 GetFileTime()을 이용할 수도 있겠지만, 이 함수를 사용하기 위해서는 파일을 GENERIC_READ 모드로 열어야하고, FindFirstChangeNotification() 함수를 함께 이용해서 파일의 변경을 확인할 때 access violation이 발생할 수 있어서 GetFileAttributesEx()을 이용했다.
- 일단 파일 변경 모니터링을 변경하기 시작하면 wait function으로 인해서 block 되기 때문에 thread로 모니터링을 했다.
- 모니터링을 종료하고 싶을 때는 wait function에 종료 signal을 보냈다. 그래서 WaitForMultipleObjects()를 사용했다.
- 원하는 파일의 최종 수정 시간이 변경되었을 경우는 지정된 function pointer를 호출했다.
4 CAloFileMonitor #
위의 방식대로 구현된 지정된 파일의 최종 수정 시간 변경을 모니터링하는
CAloFileMonitor class는 아래와 같다.
4.1 CAloFileMonitor.h #
/**
* @file AloFileMonitor.h
* @brief CAloFileMonitor class
* @author alones
* @date initial version: 2007.08.22
* @brief
* http://alones.byus.net/moniwiki/wiki.php/boyer_moore?action=show
*/
#ifndef __ALO_FILE_MONITOR_H__
#define __ALO_FILE_MONITOR_H__
#include "windows.h"
#include <string>
// function pointer for call-back when changed
typedef void (*PFnFileChanged)();
/**
* @brief monitor file changed
*/
class CAloFileMonitor
{
// attributes
public:
std::string m_filePath; /**< file to monitor */
_WIN32_FILE_ATTRIBUTE_DATA m_fileAttData;
/**< directory contain the file to monitor */
std::string m_dirPath;
/**< call-back when file changed */
PFnFileChanged m_pFnFileChanged;
// operations
public:
/** @brief set file monitor, file path and call-back funtion */
bool SetFileMonitor(std::string filePath, PFnFileChanged pFn);
/** @brief start monitor */
bool Start();
/** @brief stop monitor */
bool Stop();
};
#endif //__ALO_FILE_MONITOR_H__
//
4.2 CAloFileMonitor.cpp #
/**
* @file AloFileMonitor.cpp
* @brief CAloFileMonitor class
* @author alones
* @date initial version: 2007.08.22
* @brief
* http://alones.byus.net/moniwiki/wiki.php/boyer_moore?action=show
*/
#include "AloFileMonitor.h"
/** @brief set file monitor, file path and call-back funtion */
bool CAloFileMonitor::SetFileMonitor(std::string filePath, PFnFileChanged pFn)
{
if( filePath.size() == 0 || pFn == NULL)
return false;
int nPos = filePath.rfind("\\");
if( nPos == -1 )
{
nPos = filePath.rfind("/");
if( nPos == -1)
return false;
}
// set dir path
m_dirPath = filePath.substr(0, nPos+1);
// set file path
m_filePath = filePath;
// get last-write time of the file
GetFileAttributesEx(
m_filePath.c_str(),
GetFileExInfoStandard,
(void*)&m_fileAttData);
// set function pointer
m_pFnFileChanged = pFn;
return true;
}
HANDLE dwChangeHandles[2];
DWORD WINAPI thFnMonitor(LPVOID lpParam);
DWORD WINAPI thFnMonitor(LPVOID lpParam)
{
CAloFileMonitor* pMonitor = (CAloFileMonitor*)lpParam;
if( pMonitor == NULL)
return 0;
DWORD dwWaitStatus;
_WIN32_FILE_ATTRIBUTE_DATA fileAttData;
// Watch the C:\WINDOWS directory for file creation and
// deletion.
dwChangeHandles[0] = FindFirstChangeNotification(
pMonitor->m_dirPath.c_str(), // directory to watch
FALSE, // do not watch the subtree
FILE_NOTIFY_CHANGE_LAST_WRITE); // watch file name changes
if (dwChangeHandles[0] == INVALID_HANDLE_VALUE)
{
DWORD dError = GetLastError();
ExitProcess(GetLastError());
}
dwChangeHandles[1] = CreateSemaphore(
NULL, // no security attributes
0, // initial count
1, // maximum count
NULL); // unnamed semaphore
if( dwChangeHandles[1] == NULL)
return 0;
// Change notification is set. Now wait on both notification
// handles and refresh accordingly.
while (TRUE)
{
// Wait for notification.
dwWaitStatus =
WaitForMultipleObjects(2, dwChangeHandles, FALSE, INFINITE);
switch (dwWaitStatus)
{
case WAIT_OBJECT_0:
// check the file is changed
// Retrieve the file times for the file.
GetFileAttributesEx(
pMonitor->m_filePath.c_str(),
GetFileExInfoStandard,
(void*)&fileAttData);
if( CompareFileTime(
&fileAttData.ftLastWriteTime,
&pMonitor->m_fileAttData.ftLastWriteTime) != 0 )
{
(*pMonitor->m_pFnFileChanged)();
pMonitor->m_fileAttData = fileAttData;
}
// A file was created or deleted in C:\WINDOWS.
// Refresh this directory and restart the
// change notification. RefreshDirectory is an
// application-defined function.
if ( FindNextChangeNotification( dwChangeHandles[0]) == FALSE )
return 0;
break;
case WAIT_OBJECT_0 + 1:
return 0;
break;
default:
return 0;
}
}
return 0;
}
/** @brief start monitor */
bool CAloFileMonitor::Start()
{
DWORD dwThreadId;
HANDLE hThread;
hThread = CreateThread(
NULL, // no security attributes
0, // use default stack size
thFnMonitor, // thread function
this, // argument to thread function
0, // use default creation flags
&dwThreadId); // returns the thread identifier
return true;
}
/** @brief stop monitor */
bool CAloFileMonitor::Stop()
{
if (!ReleaseSemaphore(
dwChangeHandles[1], // handle to semaphore
1, // increase count by one
NULL) ) // not interested in previous count
{
return false;
}
::Sleep(100);
return true;
}
//
“C:\\test.log” 이라는 파일이 변경되면 void
FileChanged() 함수가 호출되는 예제이다.
#include "stdio.h"
#include <iostream>
#include "windows.h"
#include "AloFileMonitor.h"
int gChanged;
/* @brief this function will be changed
* when the file's last-write time is changed
*/
void FileChanged()
{
++gChanged;
std::cout<<"file changed - "<<gChanged<<std::endl;
}
void main()
{
gChanged = 0;
CAloFileMonitor monitor;
// set the file
monitor.SetFileMonitor("C:\\test.log", FileChanged);
// start the monitor
monitor.Start();
// 3번의 변경을 체크
while( gChanged < 3)
{
::Sleep(100);
}
printf("after 3 times changed, stop the monitor\n");
monitor.Stop();
std::cout<<"Test program has been finished\n";
}
//
5 Binary #
의의
CAloFileMonitor class와 usage가 있는 Visual Studio 6.0 project이다.
Aug 26
alonesGoogle Google, 구글
블로그 스킨을 교체하면서 구글 애드센스를 새로 달았는데 우측 프레임의 광고를 달고 확인 후, 상단의 추천 광고를 달고 확인을 하려는 순간 블로그가 메인 페이지 로딩이 안되었습니다. (정확히는 아주 시간이 많이 걸렸습니다.)
(8월 25일 10시 경이었던 것 같습니다)
파이어폭스의 상태 확인 창 (제일 아래에 있는)을 보니 구글 애드센스 코드를 받아온다고 전체 페이지 로딩이 지연되고 있었습니다.
구글 리더와 구글 애드센스 페이지를 접속을 해보니 예상대로 접속이 지연되고 있었습니다.
※ 그리고 요즘은 가끔 구글 노트도 로딩 시 시간이 걸리거나 일시적으로 로딩이 되지 않는 것 같습니다.
물론 몇 분 동안 일어난 (제 컴퓨터에서만 그랬는지는 모르겠지만) 일이지만, 등골이 오싹한 상상을 할 수 있었습니다.

나의 모든 정보가 구글의 디비에 있고 네트워크를 통해서 접근하고 수정하고 있는데, 만약 구글이 문을 닫거나 네트워크가 끊어져버리면 어떻게 될까요?
회사와 집의 즐겨 찾기가 일치하지 않아 구글 툴바와 툴바의 즐겨 찾기를 사용하기 시작했고,
컴퓨터를 포맷하고 (백업하지 않아서) 날아가버린 OneNote의 정보에 좌절하면서 구글 노트를 사용하기 시작했고,
회사와 집의 RSS Reader의 sycn. 맞추기가 귀찮아서 구글 리더를 사용하고
블로그와 위키 사이트 분석을 위해서 구글 Analytics를 사용하고
Outlook 일정을 구글 캘린더로 옮기고
친구와 같이 작성하는 문서는 구글 Docs를 이용하고
용돈이라도 좀 벌어 볼려고 구글 애드센스를 달고..
어느 제 컴퓨터들의 (회사, 집 등) 데이터들이 구글을 통해 웹으로 이동해버렸습니다.
시간이 지나 구글이 점점 성장할 수록 많은 양질의 서비스를 제공할 것이고 그에 따라 우리의 정보들은 점점 구글의 데이터 베이스에 쌓일 것이고 그로 인해 우리는 구글에 (자신도 모르게) 종속될 것입니다.
우리가 모이면 도시가 될 것이고 도시가 모이면 국가가 될 것입니다.
그리고 국가가 모이면 세계가 되겠지요?
그런 날이 멀지 않게 느껴집니다.
그런 어느 날, 사고든 고의든 구글이 잠시라도 서비스를 중단한다면…
중동의 국가들이 석유를 가지고 세계 경제를 좌지우지 하는 것 이상의 일이 발생하지 않을까요?
(정보 사회라고 하지않습니까..)
공룡 M$를 대항하던 작고 신선한 다윗이었던 구글이, 머지 않아 전세계를 지배하는 외계인이 될지도 모를 것 같습니다.
※ 구글에 비하면, Standalone의 컴퓨터 (하드웨어적인)를 장악한 MS는 귀여울 뿐입니다.
Older Entries