2009년 2월 18일 수요일

[스크랩] USB 키보드에서 오른쪽 Ctrl 키가 동작하지 않을때

원본 URL: http://clien.career.co.kr/zboard/view.php?id=lecture&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=3575

제가 왼손 마우스를 쓰다보니 폴더나 파일을 복수로 선택하기 위해서는오른쪽 컨트롤키와 마우스 클릭을 같이 사용하는데 이번에 새로 들어온PC에서는 오른쪽 컨트롤 키가 동작하지 않는 문제가 있더군요.(OS는 XP 홈 에디션)PS/2 방식의 키보드에서는 키보드(3)을 선택하거나 한글103/106 키보드를선택하면 잘 동작했는데 USB 키보드에서는 대부분 장치관리자에서 101키가 기본인 "HID 키보드 장치"로 통일되어 있는것 같습니다. (실제로는 인스톨시 디폴트로 101키의 PS/2, USB 키보드 드라이버로 세팅되고 이 세팅값을 HID 키보드 장치 가 사용하는 것 같습니다)그러니 처음부터 USB 키보드로 설치한 PC에서 한글 키보드의 배열중일부가 동작하지 않아서 저처럼 오른쪽 ctrl이나 alt 등을 쓰지 못하는 분들의 사례가 있는것 같습니다. 반나절 정도 이런저런 키맵 프로그램등으로도 해결이 잘 안되던 차에우연히 비스타에 대한 자료가 있어서 혹시나 해서 XP에서 적용해 보았는데잘 되는군요.. 간단히 말해서 레지스터리를 수정하여 키보드를 다른 타잎으로 인식되게하는 방법입니다. keyboard.inf 파일을 참조하니 아마도 "i8042prt"의 세팅부분은 PS2/USB 표준 키보드의 종류를 변경하는 것 같더군요. 아래의 레지스터리 항목에서 네가지 값을 변경해주면 됩니다.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters

Korean 101-key Type 1 USB keyboard

*******************************************

Value name / Value type / Value data

*******************************************

LayerDriver / KOR REG_SZ / kbd101a.dll

OverrideKeyboardIdentifier / REG_SZ / PCAT_101AKEY

OverrideKeyboardSubtype / DWORD / 3

OverrideKeyboardType / DWORD / 8

Korean 101-key Type 2 USB keyboard

*******************************************

Value name / Value type / Value data

*******************************************

LayerDriver / KOR REG_SZ / kbd101b.dll

OverrideKeyboardIdentifier / REG_SZ / PCAT_101BKEY

OverrideKeyboardSubtype / DWORD / 4

OverrideKeyboardType / DWORD / 8

Korean 101-key Type 3 USB keyboard

*******************************************

Value name / Value type / Value data

*******************************************

LayerDriver / KOR REG_SZ / kbd101c.dll

OverrideKeyboardIdentifier / REG_SZ / PCAT_101CKEY

OverrideKeyboardSubtype / DWORD / 5

OverrideKeyboardType / DWORD / 8

Korean 103/106-key USB keyboard

*******************************************

Value name / Value type / Value data

*******************************************

LayerDriver / KOR REG_SZ / kbd103.dll

OverrideKeyboardIdentifier / REG_SZ / PCAT_103KEY

OverrideKeyboardSubtype / DWORD / 6

OverrideKeyboardType / DWORD / 8

변경할 값들은 다른 dll 파일과 세팅값을 참조하게 하는데 혹시 모르니 system32에 해당 dll 파일이 설치되어있는지 먼저 확인하는 것이 좋을것 같습니다. 저는 kbd103.dll 타잎으로 변경해서 사용중인데 잘 동작하는 것같습니다. (PC는 DELL의 SK-8115 키보드 모델을 사용하는 제품)

[스크랩] VM Ware에서 한글 전환 키가 제대로 동작하지 않을 때

vmware로 윈도우를 설치하게 되면, shift+space, alt로 일단 한글IME가 정상적으로 동작하는 지 확인한다. 대개는 오른쪽 ALT키가 한글키로 되어져 있다.그리고, /etc/vmware/config에 아래 설정파일을 적용해본다.

방법 1)
echo "xkeymap.keysym.Hangul = 0x0f2" >> /etc/vmware/config
echo "xkeymap.keysym.Hangul_Hanja = 0x0f1" >> /etc/vmware/config

from : http://clipmarks.com/clipmark/EB65ADB7-C709-4379-AA63-DAA581EE82A9/

방법 2)

xkeymap.keycode.209 = 0x071
xkeymap.keycode.210 = 0x072

from : [Tip] VMware에서 한글키 사용나의 경우는 방법 2)로 해결했는데, 설정값은 아래와 같이 변경했다.

xkeymap.keycode.209 = 0x072
xkeymap.keycode.210 = 0x071

기타 참고글 VMWare 에 키 매핑 기능이 있을까요? 한영키를 사용하고 싶습니다

원본 URL: http://www.xinublog.com/314

Office 2007/200 레지스트리 정책 설정에 의한 파일 차단

Microsoft Office 2007/2003 SP3 설치 후
이전 버젼의 Office File(또는 특정 파일 형식) Open 시 레지스트리 설정에 의해
이전 버젼의 파일(또는 특정 파일 형식)을 열 수 없닥 나오는 경우의
해결 방법

http://support.microsoft.com/kb/938810/

여러가지 해결방법이 나와있지만 Office 2003의 경우에는
Unblock/Restorore Registry파일을 사용하는 것이 가장 간편하고
안전하다.

즉, 파일 Open시 Unblock reg 파일을 실행하여 파일을 Open할 수 있도록
시스템 설정을 변경하고 파일 작업을 종료한 이후에는 Restore reg 파일을
실행하여 시스템 설정을 복구하여 의도되지 않은 감염된 파일을 Open하지
않도록 시스템을 유지하는 것이 안전할 것으로 생각된다.

2008년 12월 16일 화요일

비프스테이크

돈가스(포크 커틀릿)니,비후가스니(비프 커틀릿),함박(햄버거스테이크)을 한계로 삼는 이들에게 정통 양식당의 메뉴판은 야속한 존재가 아닐 수 없다.아무리 들쳐봐도 즐겨 먹는 양식 삼총사의 이름이 쉽사리 눈에 띄지 않을뿐더러 비프스테이크의 경우만 하더라도 부위별로 세밀하게 나뉘어져 다양한 이름으로 나열되어 있기 때문이다.갈비살로 만드는 립아이스테이크(rib eye steak)나 등심살로 만드는 설로인스테이크(sirloin eye steak),등심살과 안심살을 뼈에 붙은 상태로 잘라 구워내는 티본스테이크(T-bone steak)와 안심살을 뼈째 잘라 굽는 포터하우스스테이크(porterhouse steak)는 그래도 나은 편이다.섬유질이 없고 육질이 부드러워 텐더로인(tender loin)으로 불리는 안심에 이르면 사정은 더욱 복잡해진다.소 한 마리를 잡아봐야 고작 60cm의 길이에 가장 두꺼운 쪽의 직경이라야 12cm에 불과한 다듬이 방망이 모양의 것이 두 개가 나올 뿐인 안심은 놀랍게도 무려 6종의 스테이크로 세분되어 제공된다.안심의 부위별 명칭을 쇠머리쪽에서부터 차례대로 살펴보면 프티필레(petit filet)-필레미뇽(filet mignon)-투른느도(tournedos)-필레(filet)-샤토브리앙(Ch teaubriand)-테트(t te)의 순으로 이루어져 있다.국제화 시대엔 서양인의 주식인 비프스테이크에 관한 이만한 상식쯤은 최소한 지니고 있어야 하지 않을까? 더군다나 한국인은 지구 가족중 쇠고기를 부위별로 가장 철저하게 가려먹은 민족중의 하나가 아닌가.우리나라 사람들은 자고로 쇠고기를 쇠머리,장정(목),등심,채끝살,우둔,갈비,쐬악지,안심,홍두깨살(궁둥이),양지,업진(배),대접살,중치살,사태,차돌박이,제비추리,안꺼미로 세분해 먹었을뿐더러 양,간,곱창,염통,콩팥,선지(피)와 같은 내장은 말할 것도 없고 심지어 우랑,우신,우설(혓바닥)과 쟁반고기로 통하는 젖통살에 쇠꼬리(소꼬리탕),쇠발톱(우족탕)까지 가려먹었다니 놀라지 않을 수 없다.내친 김에 스테이크와 관련된 상식과 매너를 간추려 소개한다.첫째,샤토브리앙 등 안심은 주로 나이가 지긋한 이들이 즐기는 부위이다.최상등급의 고기일뿐더러 무엇보다 육질이 연하기 때문이다.둘째,티본스테이크나 뉴욕컷스테이크는 젊은이들에게 어울리는 야성적인 스테이크다.적당히 질길 뿐더러 지방이 맛을 돋우기 때문이다.셋째,세계 어디를 가더라도 뼈째 나오는 음식은 우리나라의 갈비와 티본스테이크가 고작일 정도로 드물다.비위가 약한 일본인(?)들이 뼈째 나오는 고기를 보면 충격을 받는다는 사실은 흥미롭다.넷째,스테이크를 먹을 때는 왼손에 든 포크로 고기를 고정시키고 오른손의 나이프로 고기의 결을 따라 잘라가며 먹으면 된다.스테이크를 왼쪽부터 먹는 것은 특별한 의미가 있는 것은 아니고 단지 왼손에 포크를 쥐고 있기 때문이다.다섯째,고기를 썰 때는 접시의 왼쪽부터 안쪽으로 잘라 들어가되,나이프 날(톱니) 부분으로 당기듯이 자르면 된다.여섯째,스테이크를 먹을 때는 아무리 편리성을 중시하더라도 고기를 한꺼번에 잘라 놓아선 안 된다.미리 썰어두면 고기가 쉽게 식을뿐더러 육즙이 흘러나와 맛이 떨어지기 때문이다./손일락(청주대 호텔경영학과 교수)

2008년 10월 8일 수요일

블로그 게시 테스트

블로그게시테스트

2008년 8월 1일 금요일

Unix Domain Socket

Unix Domain Socket(이하 UDS) 는 socket API를 수정없이 이용며,
port 기반의 Inernet Domain Socket에 비해서 로컬 시스템의 파일시스템을
이용해서 내부프로세스간의 통신을 위해 사용한다는 점이 다르다고 할수 있다.

ls 를 이용해서 통신을 위해서 만들어진 파일을 보면 다음과 같은 모습을
보인다.

[yundream@localhost tmp]$ ls -al

srwx------ 1 root nobody 0 12월 14 21:16 .fam_socket

보면 파일타입에 "s" 가 붙어 있는걸 알수 있으며, 파일사이즈가 0으로 되어 있는
걸 알수 있다. 왜냐하면 FIFO와 마찬가지로 메시지가 파일로 쌓이지 않고
커널로 전달되어서 커널에서 처리하기 때문이다.

파일을 통해서 통신을 하며, 커널내부에서 메시지를 관리한다는 점에서
FIFO와 매우 유사한면을 보여주지만, FIFO와는 달리 양방향 통신이 가능하다는
특징을 가지고 있다. 그러므로 다중의 클라이언트를 받아들이는 서버/클라이언트
모델을 만들기가 매우 쉽다.

또한 Inet 소켓을 통한 외부통신에 비해서 2배 이상의 효율을 보여준다라는
장점을 가지고 있다.

많은 경우 약간 복잡한 내부프로세스간 통신을 해야된다고 했을때 UDS을 많이
사용한다. INET 계층에서의 통신이 TCP/IP 4계층을 모두 거치는것과는
다르게, UDS 은 어플리케이션 계층에서 TCP 계층까지만 메시지가 전달되고,
다시 곧바로 어플리케이션 계층으로 메시지가 올라가게 된다. TCP/IP 계층에 대한
자세한 내용은 TCP/IP 개요(2)를 참고 하기 바란다.

위에서 INET 소켓보다 2배이상의 효율을 가진다고 했는데,
4계층의 레이어를 모두 거쳐야하는 INET 소켓에 비해서 단지 2개의 레이어만
사용한다는 점도 그 이유중 하나로 작용한다.

쏘쓰 코드는 다중연결서버 만들기(1)의 zipcode_multi.c 와
셈플로 알아보는 소켓프로그래밍(1)의 zipcode_cli.c 를 사용하도록할것이다.

예제: zipcode_local.c

1.

#include
#include
#include
#include
#include
#include
#include
#include

int main(int argc, char **argv)
{
int server_sockfd, client_sockfd;
int state, client_len;
pid_t pid;
FILE *fp;
struct sockaddr_un clientaddr, serveraddr;
char buf[255];
char line[255];

if (argc != 2)
{
printf("Usage : ./zipcode [file_name]\n");
printf("예 : ./zipcode /tmp/mysocket\n");
exit(0);
}

memset(line, '0', 255);
state = 0;

if (access(argv[1], F_OK) == 0)
{
unlink(argv[1]);
}

// 주소 파일을 읽어들인다.

client_len = sizeof(clientaddr);

if((fp = fopen("zipcode.txt", "r")) == NULL)
{
perror("file open error : ");
exit(0);
}

// internet 기반의 스트림 소켓을 만들도록 한다.

if ((server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
{
perror("socket error : ");
exit(0);
}

bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sun_family = AF_UNIX;
strcpy(serveraddr.sun_path, argv[1]);

state = bind(server_sockfd , (struct sockaddr *)&serveraddr,
sizeof(serveraddr));

if (state == -1)
{
perror("bind error : ");
exit(0);
}

state = listen(server_sockfd, 5);

if (state == -1)
{
perror("listen error : ");
exit(0);
}

printf("accept : \n");

while(1)
{
client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr,
&client_len);

printf("test test\n");

pid = fork();

if (pid == 0)
{
if (client_sockfd == -1)
{
perror("Accept error : ");
exit(0);
}

while(1)
{
memset(buf, '0', 255);

if (read(client_sockfd, buf, 255) <= 0)
{
close(client_sockfd);
fclose(fp);
exit(0);
}

if (strncmp(buf, "quit",4) == 0)
{
write(client_sockfd, "bye bye\n", 8);

close(client_sockfd);

fclose(fp);

break;
}

while(fgets(line,255,fp) != NULL)
{
if (strstr(line, buf) != NULL)
write(client_sockfd, line, 255);

memset(line, '0', 255);
}

write(client_sockfd, "end", 255);

printf("send end\n");

rewind(fp);
}
}
}

close(client_sockfd);
}
}

다음은 클라이언트 프로그램이다.

예제: zipcode_cli_local.c

#include
#include
#include
#include
#include
#include
#include
#include

int main(int argc, char **argv)
{
int client_len;
int client_sockfd;
FILE *fp_in;
char buf_in[255];
char buf_get[255];
struct sockaddr_un clientaddr;

if (argc != 2)
{
printf("Usage : ./zipcode_cl [file_name]\n");
printf("예 : ./zipcode_cl /tmp/mysocket\n");
exit(0);
}

client_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

if (client_sockfd == -1)
{
perror("error : ");
exit(0);
}

bzero(&clientaddr, sizeof(clientaddr));

clientaddr.sun_family = AF_UNIX;

strcpy(clientaddr.sun_path, argv[1]);

client_len = sizeof(clientaddr);

if (connect(client_sockfd, (struct sockaddr *)&clientaddr, client_len) < 0)
{
perror("Connect error: ");
exit(0);
}

while(1)
{
printf("지역이름 입력 : ");

fgets(buf_in, 255,stdin);

buf_in[strlen(buf_in) - 1] = '0';

write(client_sockfd, buf_in, 255);

if (strncmp(buf_in, "quit", 4) == 0)
{
close(client_sockfd);
exit(0);
}

while(1)
{
read(client_sockfd, buf_get, 255);

if (strncmp(buf_get, "end", 3) == 0)
break;

printf("%s", buf_get);
}
}

close(client_sockfd);

exit(0);
}

기존의 INET 버젼의 프로그램과 비교해 보면 고작 3줄 정도만 수정되었음을
알수 있을것이다. 단지 소켓 구조체가 sockaddr_un 으로 바뀌고,
AF_INET 대신 AF_UNIX 를 그리고 port 번호대신에 파일명을 사용했음을
알수 있다.


나머지의 모든 코드는 INET 코드와 완전히 같다. 그러므로
Unix Domain Socket 를 사용하면 Inet Domain Socket 와 코드 일관성을
유지할수 있으며, 동일한 기술을 사용해서 프로그래밍을 할수 있다.


또한 다른 대부분의 IPC 설비들이, 범용적으로 사용하기에는 부족한 여러가지
단점들을 가진반면(단방향 이거나, 읽기만 가능하다거나, 제어하기가 어려운)
UDS는 매우 범용적인 IPC 로써 사용가능하다라는 장점을 가지고 있다.


실제로 X 서버 같은경우에 외부에서의 접근시에는 INET 연결을 내부에서의
연결을 위해서는 UDS 를 사용한다. 이밖에도 mysql, pgsql, KDE, Gnome 과 같은

대부분의 서버프로그램이 내부통신을 위해서 UDS 를 사용한다.