VMware 가상머신에서 실제 프린터를 연결하는 방법

공대생의 팁 2020. 7. 5. 16:10

 

 가상머신에서 작업하였던 내용을 출력하고자 할 때 이를 PDF로 변환하여 클라우드 등을 통해 호스트 운영체제에 연결된 프린터를 통해 자료를 출력할 수 있기에 굳이 가상머신에서 프린터를 바로 사용하는 경우는 흔치 않습니다.

 

 그런데 저의 경우 등본이나 가족관계증명서와 같이 각종 프로그램을 설치해서 접속해야 하는 경우가 있는데 이전에 ActiveX 시절과 같이 평소 쓸데없는 프로그램들이 설치되는 것을 원치 않아 가상머신을 통해 일을 처리하는 경우가 많습니다.

 

정부에서 ActiveX 사용을 금지하였으나 여전히 수많은 공공기관 및 은행은 보안을 빌미로 수많은 프로그램 설치를 강요합니다.

 

 심지어 어떤 경우는 가상프린터를 통한 증명서 발급을 금지하고 있어 실제 프린터가 연결되어야만 발급되는 경우가 있습니다. 이를 해결하기 위해 가상머신에서도 프린터를 사용할 수 있도록 설정하는 과정에 대해 여러분들께 설명을 드리고자 합니다.

 

1. 가상머신에서 프린터를 사용할 수 있도록 설정한다.

VMware를 실행하신 후 Player→File→Preference를 클릭합니다.
Change Settings를 클릭하여 관리자 권한을 획득합니다.
Enable virtual printers를 클릭하여 프린터 사용을 활성화합니다.
프린터를 USB에 연결한 다음 'Connect to a virtual machine' 메뉴를 선택한 후 OK를 클릭합니다.
자신이 연결한 프린터의 정보가 나타납니다. 확인후 OK 버튼을 클릭합니다.
프린터를 가상머신에 연결하면 다음과 같이 프린터가 연결된 것을 확인하실 수 있습니다.
다음으로 프린터 드라이버 설치를 위해 설정을 엽니다.
설정창에서 '장치'를 선택합니다.
'프린터 및 스캐너'를 선택하신 후 '프린터 또는 스캐너 추가'를 클릭한 후 잠시 기다립니다.
5분 정도 기다리면 '원하는 프린터가 목록에 없습니다.'라는 글자가 나타납니다. 이를 클릭해줍니다.
'수동 설정으로 로컬 프린터 또는 네트워크 프린터 추가'를 선택하신 후 '다음(N)'을 클릭합니다.
'기존 포트 사용(U)'에서 'USB용 가상 프린터 포트'를 선택하고 '다음(N)'을 클릭합니다.
처음 설치를 시도할 경우 'Windows 업데이트(W)'를 클릭합니다.
인터넷을 통해 프린터 드리아버를 찾는 과정입니다. 인터넷 환경에 따라 완료 시간이 제각각이며 약 30분 정도 소요됩니다.
업데이트가 완료되면 제조업체와 해당 업체의 프린터의 드라이버를 확인하실 수 있습니다. 자신의 환경에 맞는 드라이버를 선택하신 후 '다음(N)'을 클릭한 후 프린터 설치를 완료합니다.

 

 위와 같은 과정을 통해 여러분의 가상머신 환경에서도 실제 프린터를 통해 문서를 출력할 수 있게 됩니다!

300x250

컴퓨터에 USIM을 꽂아 통신사 데이터를 써보자! 3G LTE USB 모뎀 사용 후기

공대생의 팁 2020. 6. 3. 01:25

 

 스마트폰이 등장하기 전까지만 해도 휴대전화로 인터넷을 한다는 것은 매우 느린 환경의 통신사의 망을 통해 인터넷을 할 수 있지만 잠시만 사용해도 엄청난 요금울 부과했기 때문에 데이터를 사용하는 것 자체가 상당히 부담스러웠던 시절이 있었습니다. 그러나 아이폰의 도래로부터 스마트폰이 보급되면서 통신사는 무제한 요금제를 출시하면서 이제는 데이터를 부담 없이 쓸 수 있게 되었습니다. 또한 지하철 및 공공장소에 설치된 통신사의 와이파이를 통해 인터넷을 맘껏 즐길 수도 있지요.

 그러나 태블릿이나 노트북의 경우는 이야기가 다릅니다. 통신사의 와이파이는 해당 통신사의 USIM이 기기에 삽입되어 있어야 인터넷을 사용할 수 있습니다. 물론 몇몇 제품의 경우 USIM을 삽입할 수 있는 공간이 마련되어 있어 무선 환경에서 인터넷을 즐길 수 있지만 이전에 나온 물건들에서 이를 사용하는데 어려움이 있습니다.

 그 때 마다 생각해 보았던 것이 있었습니다. 혹시 USB를 통해 USIM을 삽입하여 인터넷을 사용할 수 있지 않을까 하는 생각이었죠. 물론 스마트폰의 테더링 기능을 통해 인터넷을 사용할 수 있지만 해외 및 국내의 몇몇 통신사의 경우 테더링을 사용할 시 추가 요금을 부과하는 정책이 있는 경우도 있습니다.

 혹시나 하는 마음에 인터넷을 찾아보니 역시 제 생각처럼 USB 모뎀이 판매되고 있던 것입니다!

 중국 선전에 위치한 TIANJIE라는 회사에서 제작한 LTE USB 모뎀을 보니 제가 원하던 그 기능을 지원함을 확인할 수 있었습니다. 화웨이에서도 이와 비슷한 상품을 판매하고 있었지만 화웨이의 안 좋은 소식들을 들어왔던 저에게 비록 중국산이지만 해당 회사의 제품을 구매해 보았습니다.

 주문한지 약 2주일만에 배송되었습니다. 가장 느린 배송을 선택해서 늦어도 1달내로 배송된다고 되있었는데 생각보다 빨리 왔더군요.
 그리고 사진만으로 봐소 몰랐는데 이 USB 모뎀으 크기가 생각보다 큽니다. 크기를 비교해보기 위해 LG X4와 같이 나란히 두어보았는데 확실히 큽니다.

 LTE USB 모뎀의 뒷면입니다. 이 부분을 통해서 USIM을 삽입할 수 있는 것으로 보입니다.

 뒷면을 개봉한 모습입니다. USIM 뿐 아니라 SD카드로 사용할 수 있는 것으로 보입니다.

 USIM을 삽입해 보았습니다. 가장 큰 USIM을 사용하기 때문에 표준 USIM 어댑터를 사용해서 꽃아줍니다. 이제 제 노트북에 USB 모뎀을 꽃아보았습니다.

 꽃자마자 다음과 같은 알림이 나타납니다. 생각보다 인식은 잘 되는듯 합니다.

 노트북에 꽃힌 LTE USB모뎀의 모습입니다. 통신사와 연결이 되지 않았을 경우 보시는 바와 같이 빨간색으로 뜹니다.

 USB를 열면 다음과 같은 파일들이 들어있습니다. Setup를 실행합니다.

 설치 과정은 매우 심플합니다. Install 버튼을 클릭합니다.

 Install 버튼을 누르시면 설치가 진행됩니다. 차분하게 기다리시면

 다음과 같이 설치가 완료됩니다. Finish 버튼을 눌러 설치를 완료합니다.

설치 종료 후 프로그램을 실행하면 다음과 같은 창이 뜨면서 설정 초기화가 진행됩니다.

 

 프로그램 초기화가 되면 다음과 같은 화면이 나타납니다. 제 유심이 제대로 인식되지 않았는지 바로 연결되지는 않더군요. 톱니바퀴 버튼을 눌러 설정으로 넘어갑니다.

  Setting → Network connection → Network search 메뉴로 들어간 다음 'Manual search'를 선택하신 후 약 5분정도 기다리시면 다음과 같은 메뉴가 나타납니다.

 제가 사용하는 통신사가 KT 알뜰폰이다 보니 KT만 Available 상태가 되어있습니다. LTE는 4G, UMTS는 3G를 의미합니다.

 설정 메뉴에서 자신이 사용하고자 하는 통신 방식(LTE 혹은 3G)을 선택후 이름과 APN 주소를 입력합니다. Profile name은 자신이 식별할 수 있는 이름으로, APN은 자신이 이용하는 통신사에서 제공하는 APN주소를 입력합니다. 자신이 사용하는 통신사의 APN 주소에 대해서는 아래의 블로그를 통해 확인해주시기 바랍니다.

안드로이드 스마트폰 통신사별 APN 설정 방법
https://nemos.tistory.com/763

 

안드로이드 스마트폰 통신사별 APN 설정 방법 (SKT 3G, SKT LTE, KT 3G, KT LTE, U+ LTE)

안드로이드 스마트폰 통신사별 APN 설정 방법 (SKT 3G, SKT LTE, KT 3G, KT LTE, U+ LTE) 해외에서 구입한 안드로이드 스마트폰의 경우 국내에서 사용하기 위해 유심을 꼽아도 APN 정보가 제대로 입력되지 않

nemos.tistory.com

 

 

설정하신 후 첫 페이지로 돌아오시면 앞에서 설정하였던 각 메뉴들이 등장합니다. Connect 버튼을 누르면 연결됩니다.

 접속이 되는 순간 문자가 한 통 들어옵니다. 해당 프로그램을 통해 문제 송수신이 가능한 것으로 보입니다.

그래서 한 번 이 매니저 프로그램을 통해 문자 한 통을 전송해 보았습니다.

 놀랍게도 메시지가 정상적으로 수신되는 것을 확인할 수 있었습니다. 노트북에서도 인터넷을 확실하게 즐길 수 있는지도 확인해볼까요?

 연결 상태를 확인하니 다음과 같이 전화기 모양의 이모티콘이 나타는 것을 확인할 수 있었습니다. 운영체제 자체적으로 무선통신 환경을 제공해주는 것으로 보입니다.

3G가 연결되어 있을 때 초록색으로 점등되고

LTE가 연결될 때는 파란색으로 불이 점등됩니다.

 

※후기

 본연의 기능이 충실해서 자신의 노트북에 유심을 꽃아 인터넷을 사용하고자 하시는 분들께 추천드립니다. 다만 좀 더 좋은 성능의 강력한 기능을 원하신다면 돈 더 주고 화웨이와 같은 제품을 구매하시길 추천드립니다.

 

 혹시 리눅스(우분투) 혹은 USIM칩을 사용할 수 없는 Wifi 기반 안드로이드 기기에서 USB 모뎀을 사용해보고자 하시는 분들께서는 아래의 글을 참조해주시길 바랍니다.

 

https://elecs.tistory.com/391

 

Linux에 USIM을 꽂아 통신사 데이터를 써보자! 우분투에서 LTE USB 모뎀 사용방법

작년 모종의 사유로 인해 인터넷이 설치되지 않은 환경에서 인터넷을 사용해야 했었는데 사용하고 있는 요금제에서 테더링을 허용하지 않아서 처음부터 컴퓨터에서 USIM을 꽃아 컴퓨터에서 데

elecs.tistory.com

 

https://elecs.tistory.com/392

 

안드로이드 기기에 LTE USB 모뎀을 연결해서 무선 데이터를 사용하는 방법 [PPP widget 3]

 우연한 기회로 작년에 컴퓨터로 LTE 데이터를 사용할 수 있는 방법에 대해 포스팅을 하였던 적이 있었는데 지금까지도 이 글을 보러 와주시는 분들이 많았습니다. 저와 같은 고민을 하시던 분

elecs.tistory.com

 

300x250

Visual Studo Code로 SSH 접속시 비밀번호 입력이 반복적으로 나올때 해결방법

공대생의 팁 2020. 5. 16. 01:47


 인터넷을 통해 원격으로 소스코드를 수정하기 위해 Visual Studio Code에 Remote Development 확정설치를 하여 SSH 접속으로 서버 컴퓨터의 소스코드를 작성할 수 있습니다.

 혹시 Visual Studio Code에 SSH 확장 설치에 대해 자세히 알고 싶으신 분들께서는 아래의 포스팅을 통해 기본적인 환경을 구축해줍니다.


VS Code Remote 사용하기 - SSH 방식
https://noooop.tistory.com/entry/VS-Code-Remote-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-SSH-%EB%B0%A9%EC%8B%9D


 이렇게 VS Code에 SSH 방식의 원격 개발환경을 마련하는 과정에서 다음과 같은 문제점이 발생하였습니다.

분명 비밀번호를 입력하였음에도 다음의 화면과 같이 또다시 비밀번호를 요구하는 화면이 나타납니다. 물론 이 상황에서 다시 비밀번호를 입력해도 이러한 현상이 계속 반복되고 있었습니다.

 이 현상은 VS Code를 최신 버전으로 업그레이드 후 원격으로 SSH접속을 하는 과정에서 주로 발생하는 것을 확인할 수 있었습니다. 이 경우 서버에 있는 VS Code와 관련된 설정을 모두 지운 다음 다시 설치해야 접속이 원활해집니다.

 이를 해결하기 위해서는 서버측의 VS Code 설정 관련 자료가 저장되어 있는 .vscode-server 폴더를 삭제하여야 합니다. 다음과 같은 명령어로 서버에 접속하여 .vscode-server 폴더를 제거합니다.

$ cd ~
$ rm -rf .vscode-server

 위와 같이 서버측의 해당 폴더를 삭제한 후 VS Code를 실행한 후 다시 서버에 접속해보시면 10분 이내의 설치 시간이 지난 후 기존처럼 접속하자마자 바로 사용할 수 있게 됩니다.

300x250

VMware에 설치된 Ubuntu에서 한영키 사용방법(20.04)

공대생의 팁 2020. 4. 30. 23:23


 2020년 4월이 되면서 우분투 LTS(장기지원)버전인 20.04 이 등장하였습니다. 데스크탑 버전의 디자인은 더욱 세련되어졌고, 설치 ISO도 어느덧 2.5GB에 육박하였습니다. 예전에 CD-ROM을 기준으로 700MB가 넘지 않으려 했다가 끝내 CD에도 담을 수 없는 크기가 되었을 때 설치에 애를 먹었던 때가 있었지만 오늘날처럼 초고속 인터넷이 발전된 시대에 광학매체인 CD도 거의 사용되지 않는 시대가 되었지요.


 새로 나온 버전을 사용해보기 위해 가상머신을 사용하곤 하는데 VMware를 사용할 때 마다 한영키가 먹히지 않던 것이 상당히 불편했습니다. 물론 Shift+Space를 통해 변환이 가능하지만 Windows 환경에서 한영키를 적극적으로 사용해왔던 저에겐 여전히 한영키가 중요했습니다.

 PC에 직접 설치했을 때엔 잘만 동작하던 한영키가 유독 VMware에 설치된 Windows에서는 한영키가 여전히 동작하는데 왜 Ubuntu에서는 유독 한영키가 먹히지 않는 것인가 찾아보니 VMware에 설치된 Ubuntu에서 한영키에 대한 keycode가 설정이 제대로 되고 있지 않아 발생하는 현상으로 보입니다.

 VMware에서 실행중인 Ubuntu에서 한영키 및 한자키를 사용할 수 있는 방법에 대해 단계별로 설명드리도록 하겠습니다.

1. Ubuntu 설치시 한국어로 설정

 우분투 최신판인 20.04의 경우 초창기판에서 처음부터 영어로 설치할 때 한국어를 설치하는게 번거로운 점이 있었습니다. 처음부터 한국어를 사용하고자 하시는 분은 설치 첫 단계에서 한국어를 선택해주세요.


2. 키보드 레이아웃 선택시 'Korean-Korean(101/104 key compatible)' 선택


 키보드 레이아웃 선택 단계에서 'Korean-Korean(101/104 key compatible)을 선택해주세요. 이 단계에서 한글 키보드를 사용하실 수 있습니다.


 3. 우측 상단의 키보드 선택에서 '한국어(Hangul)' 선택

 한국어(Hangul)모드에서 Shift+Space로 한영변환이 가능합니다.


4. 한영키 keycode 변환 스크립트 작성

 다음과 같은 파일을 생성해줍니다. 제목은 여러분들이 원하시는 대로 작성하셔도 됩니다.

$ vi hangul.sh

1
2
3
#!/bin/bash
setkeycodes 72 122
setkeycodes 71 123
cs


5. 스크립트 실행

 위에서 작성한 스크립트를 실행하여 한영키가 정상적으로 동작하는지 확인합니다.

$ chmod +x hangul.sh

$ sudo ./hangul.sh

 이제 여러분들의 VMware에 설치된 Ubuntu에서 한영키를 사용하실 수 있습니다. 잘 작동되는지 확인해봅니다.

$ xev


6. Systemctl을 통해 Ubuntu 부팅시에도 변경한 설정이 적용될 수 있도록 설정

 위에서 설정된 환경이 우분투를 항상 킬 때마다 자동으로 적용될 수 있도록 System의 서비스에 적용될 수 있도록 하겠습니다. 다음과 같이 서비스를 새로 등록해줍니다.

$ cd /etc/systemd/system/

$ sudo vi hangul.service

1
2
3
4
5
6
7
8
[Unit]
Description=Change Hangul keycode
 
[Service]
ExecStart=/스크립트가 설정된 경로/hangul.sh
 
[Install]
WantedBy=multi-user.target
cs

 이제 위에서 설정한 시스템 서비스를 등록합니다.

$ sudo systemctl enable hangul

$ sudo systemctl start hangul

이제 등록한 서비스가 정상적으로 동작하는지 확인합니다.

$ sudo systemctl status hangul

 여기까지 진행하셨다면 이제부터 Ubuntu를 실행하셨을 때 바로 한영키를 사용하실 수 있습니다!

300x250

Winsorization(윈저화)

공대생의 팁 2020. 3. 1. 00:00


 데이터를 활용하는 과정에서 다음과 같은 문제를 겪는 경우가 있습니다.

  • 상위 극한값(95%) 백분위를 효율적인 방법으로 나타내고자 한다. 약 600개의 변수를 가진 데이터셋을 가지고 있으며, 95% 백분위를 가진 600개의 모든 변수의 극한값을 없애고자 한다.
  • 95%와 5%로 "Winsorize"하기 위해 몇 가지 변수가 있다. 95% 백분위보다 큰 값을 가진 모든 관측지가 95% 백분위값을 가져가고, 5% 백분위보다 작은 값을 가진 모든 관측치가 5% 백분위값을 갖기를 원한다.

 프로그래머가 수백개의 변수의 극한값을 수정하고자 하는 것은 상당히 어려운 일입니다. 이러한 문제들 중 어느것도 Winsorization의 일반적인 정의를 충족시키지 못합니다. 데이터의 Winsorization은 과연 어떤 점을 말하는 것일까요?

 지정된 수의 극한값을 더 작은 데이터값으로 대체하는 과정을 윈저화(Winsorization) 또는 데이터 윈저라이징(Winsorizing)이라 합니다.

 윈저화는 극한값에 민감한 표본 평균을 "강화"하는 방법입니다. 원저화된 평균을 얻기 위해 데이터를 정렬하고 (k+1)번째로 가장 작은 값을 k번째로 가장 작은값으로 바꿉니다. 마찬가지로 (k+1)번째로 가장 큰 값을 k번째로 가장 큰 값으로 대체합니다. 이렇게 새로운 데이터셋의 평균을 윈저화된 평균(Winsorized mean)이라고 합니다. 데이터가 대칭 모집단에서 나온 경우 윈저화된 평균은 모집단 평균에 대한 편견이 없는 추청치라 할 수 있습니다.

 위 그림에서 위쪽 그래프가 원본 데이터, 아랫쪽이 윈저화된 데이터를 나타냅니다. 원본 데이터의 경우 x값이 -4에서 4 사이의 범위에 분포하여 있음을 보실 수 있습니다. 이 때 x=4일 때의 값은 연속되어 있지 않고 따로 떨어져 있어 outlier처럼 보일 수도 있습니다. 이러한 원본 데이터를 윈저화(Winsorization)하여 최저값을 -2로, 최대값을 2로 설정하고 극한값을 벗어나는 값들은 모두 극한값에 추가함으로서 윈저화된 데이터셋을 만듭니다.

 다음으로 윈저화의 특징에 대해 살펴보도록 하겠습니다

  • 윈저화는 대칭입니다. 어떤 사람들은 큰 데이터값만 수정하고자 합니다. 그러나 윈저화는 k번째로 가장 작은 값과 k번째로 가장 큰 값으로 이 극한값을 벗어나는 값들을 해단 k번째 값으로 대체하는 대칭 프로세스입니다.

  • 윈저화는 횟수를 기반으로 합니다. 상위 5%, 95%등 정량형에 근거한 값을 수정하고자 하는 경우가 있습니다. 그러나 정량형을 사용한다고 해서 대칭적인 과정이 되는 것은 아닙니다. \(k_1\)을 하위 5%보다 작은 값의 개수로 하고 \(k_2\)를 상위 5%보다 큰 값의 개수라고 합시다. 데이터에 반복되는 값이 보함되어 있는 경우 \(k_1\)은 \(k_2\)와 같지 않을 수 있으며, 이는 잠재적으로 한 쪽이 다른 쪽보다 더 많은 값으로 바뀜을 의미합니다.

 

윈저화의 장점

  • 평균과 표준 편차와 같은 기존의 통계는 극단적인 값에 민감합니다. 윈저화의 목적은 극한값의 영향을 줄임으로서 기존의 통계로도 충분히 해석할 수 있게 해주는 것입니다.

  • 윈저화는 각 변수와 모든 변수를 확인하는 것이 불가능할 때 수천개의 변수들을 자동으로 처리하는데 사용되기도 합니다.

  • 윈저화된 통계을 기존 통계와 비교하면 오염된 데이터를 포함하거나 꼬리가 길어 모델에서 특별한 처리가 필요할 수 있는 변수를 확인할 수 있습니다.


참고자료:https://blogs.sas.com/content/iml/2017/02/08/winsorization-good-bad-and-ugly.html


300x250

ROS 환경에서 ASUS Xtion2 설치방법&문제 해결방법

공대생의 팁 2020. 2. 10. 20:55


 기존에 Xtion 카메라를 사용하여 Visual-SLAM을 사용하던 제게 기회가 생겨 Xtion2 카메라를 사용해보게 되었습니다. 바로 USB를 연결하여 사용해보려 하였는데 추가적인 드라이버가 필요한 듯 보입니다.


 먼저 아래의 사이트에 접속하셔서 Xtion 2의 드라이브를 다운로드 받습니다.

https://www.asus.com/kr/3D-Sensor/Xtion-2/HelpDesk_Download/

 사이트에 접속하신 다음 자신의 운영체제에 해당하는 메뉴를 선택하시면 자신의 운영체제에 맞는 드라이버가 나타납니다. 다운로드를 클릭한 다음 압축을 풀어줍니다.

Linux 64비트를 기준으로 다음과 같은 구성의 파일이 들어있습니다. 다음으로 드라이버를 설치해봅니다.

$ sudo ./install.sh

 여기까지 진행하셨다면 거의 대부분의 상황에서는 Xtion2 카메라를 바로 사용하실 수 있습니다. 그러나 컴퓨터의 환경에 따라 드라이버가 인식되지 않는 경우가 발생합니다. 이 경우 다음과 같이 드라이버를 수동으로 설치해줍니다.

$ sudo cp ASUS/Xtion2/lib/libSenDuck.so /usr/lib/openNI2/Drivers/

 컴퓨터를 재부팅하신 다음 Xtion2 카메라를 다시 연결해보면 카메라가 정상적으로 동작하는 것을 확인하실 수 있습니다.


참고자료: http://blog.naver.com/rlackd93/221234397375


300x250

Generalized Estimating Equations(일반화 추정 방정식)

공대생의 팁 2020. 1. 3. 23:42


 피험자 그룹에서 반복 측정(반응[Response] 및 공변량[Covariate])한 결과를 관찰한다고 가정해봅니다. 이러한 공변량을 기반으로 각각에 대한 예상 반응 모델링을 하고자 할 때 아래와 같은 몇 가지 경우가 있습니다.

  • ■ 몇 가지 통제된 식단 중 하나를 각 사람들 개별로 할당하고 시간이 지남에 따라 콜레스테롤 수치를 측정

  • ■ 시간의 경과에 따라 얻은 값과 어떤 변수의 관계 연구

  • ■ 아이를 갖는 것이 여성의 노동력 참여 가능성에 미치는 영향 결정

 위와 같이 (반복해서 측정하여 얻은) 패널 데이터가 갖는 장점은 시간적 차이가 없고 관찰할 수 없는 개인 간의 차이를 제어할 수 있다는 점입니다. 개인당 다중 관측치를 갖는 것은 개인 내 변화를 기초로 추정치를 산출할 수 있게 합니다.

 이러한 위의 경우들을 분석하는데 가장 쉬운 방법은 공변량이 결과에 적층 효과(Additive effect)를 미치는 데이터에 선형 모델을 적합화하는 것입니다. 변수가 선형 관계가 아닌 다른 것에 영향을 받는 경우(관심의 반응이 확률인 경우) 일반화 선형 모델(Generalized Linear Model)이 더 적합할 것입니다. GLM에는 다음과 같은 식이 있습니다.

$$Y_i = \mu_i + \varepsilon_i, \qquad g(\mu_i) = X_i'\beta$$

 여기서 개별 \(i\)의 경우 \(Y_i\)는 반응, \(X_i\)는 공변량, \(\beta\)는 계수의 벡터, \(\varepsilon_i\)는 임의의 오차, g는 가능한 반응 집합에서 공변량의 선형 함수에 사상되는 연결 함수(Link function) 입니다.

 매개변수를 추정하고 GLM을 추론하기 위해서는 오류가 독립적이고 동일하게 분포되어 있다고 가정해야 합니다. 패널 데이터의 경우, 각 개인에 대한 관찰은 상관관계가 존재하기 때문에 이는 명백히 사실이 아닙니다.

 한 가지 가능한 해결책은 모델 피팅에 피험자별 임의 효과(Random effect)를 포함하는 것입니다. 이 방법은 GLMM(Generalized Linear Mixed Model)이라고 부릅니다. GLMM은 모수적 가정(Parametric assumption)을 필요로 합니다.

 일반화 추정 방정식(Generalized Estimation Equation)은 이를 처리하기 위한 비모수적 방법(Nonparametric assumption)입니다. GEE의 아이디어는 모든 피험자에 대해 평균을 내고 대상 내 공분산 구조를 잘 예측하는 것입니다. 데이터가 특정 분포에서 생성되었다고 가정하는 대신 공변량과 반응 사이의 관계를 설명하기 위해 반복적으로 최선의 \(\beta\)를 선택하기 위해 모멘트 가정을 사용합니다.

 주의사항: GLMM과 GEE에 대한 결과물 해석은 다르다는 점을 유의 바랍니다.


피험자별 vs 전인원 평균

 GEE는 인구 평균 효과(Population average)를 추정합니다. 아래의 두 시나리오를 생각해봅니다.

● 시나리오1: 당신은 의사이고 스타틴 약이 당신의 환자가 심장마비에 걸릴 확률을 얼마나 낮출 수 있는지 알고 싶다.
● 시나리오2: 당신은 보건소 공무원이고 심장마비 위험에 처한 모든 사람들이 그 스테틴 약을 복용한다면 심장마비 사망자수를 줄일 수 있는지 알고싶다.

 첫 번째 시나리오에서는 각 개별 확률을 알자 합니다. 두 번째 시나리오는 전체 인구에 대한 예측에 관심을 두고 있습니다. GEE는 두 번째 시나리오에서 추정할 수 있지만 첫 번째 시나리오에서는 알 수 없습니다.

GEE의 기초

 GEE는 인구 평균 모델 매개변수와 이들의 표준 오류를 추정합니다. GEE에 대한 가정은 GLM에 대한 가정과 비슷합니다.

  • 1. 응답 \(Y_1, Y_2, ... , Y_n\)은 상관관계가 있거나 무리를 이룬다.
  • 2. 연결함수 g에 의해 설명된 공변량과 반응의 변환 사이에는 선형 관계가 있다.
  • 3. 피험자 내의 공분산에는 몇 가지 구조("working 공분산")가 있다.
  • ● 독립성(시간 경과에 따른 관찰은 독립적)
  • ● 교환가능(시간 경과에 따른 모든 관측치에는 동일한 상관 관계가 있음)
  • ● 비정형(모든 시점 간의 상관관계는 다를 수 있음)

 GEE에 맞추기 위해 이러한 working 공분산 구조 중 하나를 선택해야 합니다. GLM과 마찬가지로 GEE는 반복적으로 최소 가중치를 조정하여 가중치로 작용하는 공분산 행렬을 연결합니다. 가중 최소 제곱 문제는 등식 추정식(Eponymous estimating equation)입니다. 만약 최대 가능성(Maximum likelihood)에 익숙하다면, 이 방정식을 Score function(log-likelihood의 1차 미분값)이라고 생각할 수 있습니다. 이 함수는 \(\beta\)의 최적 선택시 0과 같습니다.

 데이터 생성 과정(선형성)에 어떤 구조를 적용하더라도 분포를 완전히 특정하지 않습니다. \(\beta\)추정은 순전히 최적화의 연습입니다.


공분산이 잘못 정의되어 있는 것이 걱정된다면?

 β를 추정하기 위해서는 공분산 구조를 선택해야 하지만, 만약 β가 올바르게 나타나지 않는다면 어떻게 해야할까요?

 추정 방정식은 실제로 첫 번째 경우를 기준으로 하기 때문에 \(\beta\)는 Working 공분산 구조가 잘못되었다 하더라도 일관되게 추정될 수 있을것입니다. 그러나, 이로부터 계산된 표준 오차는 잘못될 것입니다. 이 문제를 해결하기 위해서는 견고성(Robustness)을 위해Huber-White의 "샌드위치 추정기(Sandwich estimator)"를 사용하여 GEE를 사용합니다. 샌드위치 분산 추정기의 기본 개념은 아이디어는 경험적 공분산을 사용하여 기본 공분산에 근사화하는 것입니다.

 그렇다면 왜 Working 공분산을 지정해야할까요?

1. 통계 효율(Statistical efficiency)
2. 샌드위치 견고성(Sandwich robustness)는 표본이 큰 특성값

  그렇다면 항상 샌드위치 추정기를 사용해야만 할까요?

 아닙니다. 만약 아래와 같은 경우가 생길 경우 그렇지 않습니다.

1. 독립된 피험자의 수가 반복되는 측정치의 수보다 훨씬 적을때
2. 설계의 균형이 맞지 않을때(반복되는 측정치의 수가 개별로 다른 경우)

장점

● 최대우도측정(Maximum Likelihood Estimation)에 비해 계산이 단순합니다.
● 분포에 대한 가정이 없습니다.
● 상관 구조가 잘못 정의되어 있더라도 추정치는 일치합니다.(평균 응답에 대한 모델이 올바르다고 가정하였을 때)

한계

● 우도 기반 방법(Likelihood-based method)은 통상적인 통계적 추론에 사용할 수 없습니다. GEE는 준우도 방법(Quasi-likelihood method)입니다.
● GEE는 단지 추정 절차일 뿐이므로 모델 선택을 수행하는 방법이 명확하지 않습니다. 적합도 측정은 쉽게 구할수가 없습니다.
● 피험체에 특정된 측정을 할 수 없습니다.

GEE의 확장

● GEE2: 2차 연장
    ○ 여기서 소개한 GEE의 버전은 GEE1입니다.
    ○ 아이디어: 공분산을 연구하기 위한 더 복잡한 방정식을 사용합니다.

● 대체 로지스틱 회귀(Alternating Logistic Regression) (Carey, Zeger, and Diggle(1993)): 다른 조건으로 결과 모델링
    ○ 아이디어: 모델 연결에 상관관계 대신 로그 Odd ratio를 사용합니다.

GEE에 대한 심화학습

● 첫 번째 평균공분산(준우도 접근법)
샌드위치 추정기(Sandwich estimator)를 사용하여 공분산의 설정 오류(misspecification) 방지
인구 평균 효과(Population-averaged effects) 모델링
● 대상 내 의존성이 관찰되지 않거나 알려지지 않은 경우 유용성
● 여전히 대상 독립성을 가정(공변량에 따라 조건화됨)


참고자료: https://rlbarter.github.io/Practical-Statistics/2017/05/10/generalized-estimating-equations-gee/

300x250

Surrogate model(대체 모델)

공대생의 팁 2019. 11. 6. 12:56


 Surrogate model(대체 모델, 근사수학모델)이란 자동차 충돌 실험과 같이 제한된 계산 비용이 많이 드는 시뮬레이션을 기반으로 복잡한 시스템의 수많은 입출력 특성을 실제 모형과 유사하게 만드는 것을 목적으로 하는 소형 확장 분석 모델을 일컫는 말입니다.


 Surrogate model은 시뮬레이션 모델의 복잡한 동작을 흉내낼 수 있으며, 이러한 특성은 설계 자동화, 매개변수 분석, 우주 탐사에 관한 설계, 최적화 및 민감도 분석등에 사용될 수 있습니다.


 Surrogate model은 또한 meta model(메타 모델), response surface model(RSM, 반응표면분석법), 에뮬레이터, auxiliary model(보조 모델), repro-model(복제 모델)이라고도 부릅니다.


https://www.esteco.com/modefrontier/method-selecting-surrogate-models-crashworthiness-optimization


 교통사고와 같이 의도치 않은 상황에서 운전자가 생존할 수 있는 방법을 연구하기 위해서는 차량의 충돌을 분석하여 이를 통해 운전자의 생존률을 높이는 방법을 찾는 것은 매우 중요합니다. 그러나 차량 한 대의 가격은 매우 비싸기 때문에 수많은 차량들을 이용하여 충돌 실험을 하게 될 경우 엄청난 양의 비용이 필요합니다. 만약 Surrogate model을 설계하여 이를 활용한다면 해당 모델로 만들어진 차량을 시뮬레이션으로 반복적으로 사용할 수 있게 되고 실제 차량을 사용하여 발생하는 비용을 최소화 할 수 있습니다. 또한, surrogate model을 사용함으로서 얻게 되는 최적화된 솔루션을 개발하여 실제 차량에 적용한다면 더 좋은 결과를 얻을 수 있을 것입니다.


 

https://www.oreilly.com/radar/ideas-on-interpreting-machine-learning/


 인공지능을 해석함에 있어 surrogate model은 매우 중요한 모델입니다. 2019년 현재 시점에서 인공신경망을 해석하기에는 매우 어렵습니다. 너무나도 많은 매개변수(Parameter)들이 있고 이들의 변화를 사람의 눈으로 파악하기엔 변수가 너무나 많기 때문입니다.

 이러한 인공신경망 모델을 해석하기 위해 입력값을 의사결정트리 혹은 선형모델에 대입하여 surrogate model로 만들어 해당 인공신경망 모델의 특성을 최대한 이해하는 용도로 사용할 수 있습니다.

 



참고자료: http://sumo.intec.ugent.be/surrogates

300x250

VirtualBox에 안드로이드 설치 도중 부팅이 멈출 때 해결방법

공대생의 팁 2019. 10. 21. 14:42


 한동안 안드로이드와는 거리를 두고 지내던 도중 종종 관련 질문이 들어와서 최신 버전인 Oreo를 VirtualBox에 설치를 아래와 같은 방식으로 시도해 보았었습니다.


안드로이드 버추얼박스(VirtualBox)에 설치하기


 제가 안드로이드를 설치하려 하였던 환경은 아래와 같습니다.


Host OS버전: Ubuntu 16.04

VirtualBox 버전: 6.0.14

Android 버전: 8.1(Oreo)


 위와 같은 환경에서 링크에서 제공하는 설치 방법대롤 하였으나 아래와 같이 화면이 멈추면서 더이상 진행이 되지 않고 있었습니다.


 Trusted GRUB now loading 'Android-x86 8.1-r2'

 Progress: Detecting Android-x86... found at /dev/sda1

X86_64:/ #



정황상 안드로이드가 설치된 파티션을 찾아내어 이를 불러오는 것 까지는 성공한 것 같으나 현 상황에서 알 수 없는 이유로 화면이 더이상 나올 수 없는 상황으로 추정됩니다.


 이를 해결하기 위해 VirutlaBox에서 설정→디스플레이로 접근하신 다음 아래와 같이 나왔을 때 'VBoxVGA'를 선택해줍니다.



 위에 표시도니 VBoxVGA로 설정하신 후 다시 안드로이드를 실행해보시면 아래와 같이 부팅이 정상적으로 동작하고 있는 것을 확인하실 수 있습니다!



300x250

Canon MG2990 시리즈 USB 연결 설치방법

공대생의 팁 2019. 10. 11. 02:03

 

 이사를 하면서 통신사에서 제공하는 공유기를 사용하게 되었는데 호환이 잘 안되는 것 같아 USB로 연결하여 설치해 보았습니다. 이번에 공유기를 통해 무선으로 설치하는 방법을 다루어 본 적이 있었는데 혹시 무선 설치가 안되시는 분들을 위해 이렇게 USB 유선 연결 설치 방법도 소개해 드려볼까 합니다.

 

 혹시 공유기가 프린터 근처에 있고 무선으로 여러 대의 기기를 사용하고 계신 분이라면 제가 이전에 작성하였던 무선 설치 방법을 참고해 주시기 바랍니다.

 

    Canon MG2900 시리즈 무선 프린터 설치방법

 

 

※설치하시기 전에 반드시 프린터와 컴퓨터와 USB를 빼주세요.

 

1. 아래의 사이트에 접속하여 '드라이버 통합 설치파일'을 다운로드 받습니다.(Windows 기준)

http://www.canon-bs.co.kr/person/download.aspx?no=3588&category1=2

 

 

2. 다운로드 받은 파일을 실행하면 아래와 같은 화면이 나옵니다.

 

 

3. '다음' 버튼을 누르면 아래와 같이 드라이버 설치 준비를 합니다.

 

 

4. 프린터 연결 방법을 선택합니다. 여기서는 'USB 연결'을 선택해 보겠습니다.

 

 

5. 사용자의 거주지를 선택합니다.

 

 

6. 자신이 거주하는 국가를 선택해줍니다.

 

 

7. 맨 위에 있는 'MP Drivers'를 설치해줍니다.(기본으로 선택이 되어있음)

 

 

8. '예' 버튼을 클릭해주세요.

 

 

9. '예' 버튼을 클릭해 주세요.

 

 

10. 인터넷을 통해 설치 파일을 받는 과정입니다. 잠시 기다려줍니다.

 

 

11. 다음과 같은 화면이 나오면 이제 컴퓨터와 프린터를 USB로 연결해줍니다.

 

 

 MG2990 프린터의 경우 USB 꽃는 곳은 다음과 같이 뒷부분 오른쪽에 위치해 있습니다.

 프린터에 연결되는 USB는 TypeB 형식으로 일반적인 프린터에서 자주 사용하는 방식입니다.

 

 

12. 프린터를 연결하고 프린터의 전원을 키면 아래와 같이 컴퓨터와 프린터가 연결되었음을 확인하실 수 있습니다.

 

 

13. 기다리시면 컴퓨터에 드라이버가 자동으로 설정이 됩니다.

 

 

14. 프린트 헤드 정력 과정입니다. 만약 프린터를 처음 사용하는 경우라면 실행 버튼을 눌러 안내가 나오는 대로 진행하시면 됩니다.

 

 

15. '다음' 버튼을 누르시면 프린터의 설치가 완료됩니다! 이제 프린터를 자유롭게 사용하실 수 있게 되었습니다!

 

 

16. '끝내기' 버튼을 눌러 설치 프로그램을 종료합니다.

 

 

 

300x250

Windows 10 Internet Explorer 11 에서 Adobe flash가 실행되지 않을때 해결방법

공대생의 팁 2019. 8. 26. 13:31

 

 해당 내용의 글은 Windows 10의 2019년도 버전에서만 유효하며 2021년 현재 해당 방법으로 더이상 플래시 플레이어를 실행하실 수 없습니다. 만약 2021년 이후에도 Flash Player를 사용하고자 하시는 분은 아래의 포스팅을 통해 문제를 해결해주시기 바랍니다.

 

https://elecs.tistory.com/379

 

 

 2020년 말부터 Chrome 웹브라우저가 Adobe에서 제공하는 Flash Player 지원을 종료한다고 하였습니다. 인터넷 초창기에 벡터 방식을 사용하여 저용량으로 고용량의 동영상보다도 고화질로 화면에 표현할 수 있다는 점 때문에 Flash는 상당히 많이 사용되었습니다.

 그러나 인터넷 속도가 점점 향상되면서 2019년 오늘날에는 유튜브와 같은 고화질 동영상을 무리없이 다운로드 받아 실시간으로 재생할 수 있는 환경이 만들어지면서 고도의 연산을 필요로 하는 Flash는 오늘날의 인터넷 환경에서는 빠른 속도를 요구하는 웹브라우저에도 어울리지 않게 되면서 점차 사용이 줄어들고 있는 상황입니다. 최근에 제작되는 사이트들도 다양한 디바이스 환경에서 접속되는 것을 대비하기 위해 반응형 사이트를 제작하기에 Flash를 사용하는 것은 더더욱 어려워졌습니다.

 

 그럼에도 아직까지 우리나라에서는 Flash가 사용되는 사이트들이 아직까지 존재하고 있습니다. Flash가 점점 퇴출되어가는 과정에서도 우리나라의 환경에서는 웹브라우저의 Flash 지원 종료는 조금은 불편하게 느껴지는 것은 사실입니다. 티스토리 또한 Flash를 사용하지 않는 새로운 웹에디터를 제공함으로서 (비록 새로운 에디터의 장단점을 떠나서) Flash의 의존에서 점차 멀어져 가고 있는 상황에서 말이지요. 이러한 우리나라의 인터넷 환경에서 Flash가 실행되지 않을 때 이를 해결하는 방법에 대해 다루어보겠습니다.

 

 먼저 아래의 링크를 클릭하셔서 Flash Player를 활성화합니다.

 

 

IE(Internet Explorer) 어도비플래시플레이어 설치 및 활성화 방법 안내

↑↑위 링크를 클릭해주세요

 

 

 만약 위의 링크대로 하였지만 여전히 실행이 되지 않을 경우 아래의 방법을 참고해주시길 바랍니다.

 

 

 

 

 2019년 8월 현재 Flash Player로 서비스를 제공하는 사이트들 중 하나인 더존 세금계산서(https://www.bill36524.com)를 Windows 10 운영체제에서 Internet Explorer 11로 접속한 후 로그인을 하게 되면

 

 

 

 

 

 

 위의 화면과 같이 '어도비 플래시 플레이어 꼭 설치 하셔야 합니다!'라는 경고문구와 함께 플래시를 설치할 것을 요구하고 있습니다.

 

 

 

 

 

 

 

 그러나 Windows 10에서 부터는 Internet Explorer 11에는 이미 Flash Player가 포함이 되어있기 때문에 별도의 설치를 하지 않더라도 Flash Player를 실행할 수 잇어야 합니다. 이는 Flash Player를 사용하려는 사이트에서 호환성에 문제가 발생히여 실행이 되지 않는 것으로 추측됩니다.

 

 

 

 

 

 혹시 인터넷 익스플로러의 버전 문제 때문일 가능성이 있어 Internet Explorer를 다른 버전으로 설치하려고 시도하였으나 Windows 10에서는 Internet Explorer가 기본프로그램으로 설정되어 있기 때문에 삭제할 수 없으며 게다가 이전 버전으로 다운그레이드를 시키는 것도 사실상 불가능합니다.

 

 그렇다면 Windows 10에서 Internet Explorer의 이전 버전을 실행할 수 있는 방법은 없을까요? Internet Explorer 11에서는 이전 버전의 환경에서 사이트에 접속할 수 있도록 하는 에물레이션 모드가 존재하여 11 이하의 버전의 환경에서 웹브라우저를 사용할 수 있습니다.

 

 Internet Explorer 11을 실행하신 다음 'F12'버튼을 누르시면 아래의 화면과 같이 개발자도구창이 나타납니다.

 

 

 

 

개발자도구창이 나타나면 메뉴에서 '에뮬레이션'을 클릭합니다.

 

 

 

 

에뮬레이션 창을 클릭하면 다음과 같은 창을 보실 수 있습니다. 위의 메뉴 중 '문서 모드'를 보시면 11(기본값)이라 적혀있는 부분을 보실 수 있습니다. 이는 해당 사이트를 Internet Explorer 11 모드에서 접속중이라는 의미입니다.

 

 

 

 

문서 모드에서 버전이 적혀있는 부분을 클릭하시면 11 이외의 모드를 선택할 수 있습니다. Internet Explorer 10 버전 모드에서 해당 사이트에 접속하고 싶다면 '10'을 선택해줍니다.

 

 

 

 

 

에뮬레이션 모드로 문서 모드를 11 이하의 버전으로 설정하여 접속하게 되면 이전과 같이 Flash Player를 설치해달라는 창이 나오지 않고 곧바로 플래시가 실행된 창이 나타나는 것을 확인하실 수 있습니다.

 

 

 

 

300x250

C++에서 Boost ASIO를 사용하여 TCP 동기화(Blocked) 통신 프로그래밍

공대생의 팁 2019. 7. 21. 19:58

 지난 포스팅에서 C++에서 제공하는 Boost 라이브러리의 통신 라이브러리인 ASIO를 사용하여 비동기 통신 프로그래밍을 하는 방법에 대해 소개를 하였던 적이 있었습니다.



C++에서 Boost ASIO를 사용하여 TCP 비동기(Unblocked) 통신 프로그래밍

https://elecs.tistory.com/314


 서버-클라이언트 통신 시스템을 구축하던 도중 Java에서 사용하던 객체 통신 프로그래밍 방식이 상당히 편했던 기억이 있어 이를 C++에서도 편하게 사용할 수 있는 방법을 찾았던 것이어서 이를 정리하였던 글이었는데 생각보다 많은 분들께서 도움을 받으셨다는 답변을 받았습니다.


 그래서 이번에는 ASIO 통신 프로그래밍에서 다룰 만한 내용으로 동기화(Synchronization, Blocked) 프로그래밍 방식에 대해 이야기 해보고자 합니다.





 위 그림은 ASIO 프로그래밍의 동기화 통신 방식의 흐름도를 나타낸 것입니다. 이전 포스팅에서 다루었던 비동기화 통신 방식과는 달리 동기화 통신은 상대로부터 response를 대기하는 과정이 추가됩니다.

 비동기 모드의 경우 Handler를 등록해두면 response의 수신 여부와 관계 없이 서버는 프로그램의 동작을 멈추지 않고 별개의 동작을 수행할 수 있습니다. 반면 동기화 통신의 경우 상대방의 response가 들어오고 나서 동작하는 방식이므로 서로가 통신이 확인이 되었는지의 여부를 확인할 수 있다는 장점이 있습니다.


 먼저 프로세스는 socket에 자신의 IP 정보를 기록한 후 이를 io_service(Boost 1.66 버전 이후는 io_context)를 통해 운영체제 커널에 정보를 등록합니다. 이후 운영체제가 다른 컴퓨터로부터 응답을 수신하게 되면 이를 프로세스의 socket에게 전달하고 프로세스는 전달 받은 정보를 가공하는 방식으로 통신이 이루어집니다.


자세한 내용은 아래의 소스코드를 통해 알아보도록 하겠습니다.



 프로그램을 실행하기에 앞서 자신의 컴퓨터에 Boost 라이브러리를 설치합니다. Ubuntu를 기준으로 다음과 같이 실행합니다.


$ sudo apt install libboost-all-dev



 이제 어러분의 컴퓨터에는 Boost 라이브러리가 설치되었습니다. 다음으로 아래의 소스코드를 작성해줍니다.


sync_server.cc


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include<cstdlib>
#include<iostream>
#include<boost/asio.hpp>
 
using namespace std;
using boost::asio::ip::tcp;
 
class session
{
public:
    session(tcp::socket& sock)
    //boost 1.66이후 (Ubuntu 18.10 이후) 버전의 경우 io_context를 사용
    //session(boost::asio::io_context& io_service)
    : socket_(sock){
        start();
    }
 
    void start(){
        try{
            while(1){
                boost::system::error_code error;
                size_t length = socket_.read_some(boost::asio::buffer(data_), error);
                if(error == boost::asio::error::eof){
                    //클라이언트로 부터 정보를 모두 받았으므로 종료한다.
                    break;
                }else if(error){
                    throw boost::system::system_error(error);
                }
                cout << "Message from client: " << data_ << endl;
                boost::asio::write(socket_, boost::asio::buffer(data_, length));
            }
        }catch(exception& e){
            cerr << "Exception in server: " << e.what() << endl;
        }
    }
 
    tcp::socket& socket(){return socket_;}
 
private:
    tcp::socket& socket_;
    enum { max_length = 1024 };
    char data_[max_length];
};
 
class server
{
public:
    server(boost::asio::io_service& io_service, short port)
    //boost 1.66이후 (Ubuntu 18.10 이후) 버전의 경우 io_context를 사용
    //server(boost::asio::io_context& io_service, short port)
    : io_service_(io_service), acceptor_(io_service, tcp::endpoint(tcp::v4(), port))
    {
        while(1){
            //boost 1.66이후 (Ubuntu 18.10 이후) 버전의 경우 io_context를 사용
            //new session(acceptor_.accept());
 
            //sever의 소켓 생성
            tcp::socket sock(io_service);
            //client로부터 접속 대기
            acceptor_.accept(sock);
            new session(sock);
        }
    }
private:
    boost::asio::io_service& io_service_;
    //boost 1.66이후 (Ubuntu 18.10 이후) 버전의 경우 io_context를 사용
    //boost::asio::io_context &io_service_;
    tcp::acceptor acceptor_;
};
 
int main(int argc, char* argv[]){
    try{
        if(argc != 2){
            cerr << "Usage: server <port>" << endl;
            return 1;
        }
        boost::asio::io_service io_service;
        //boost 1.66이후 (Ubuntu 18.10 이후) 버전의 경우 io_context를 사용
        //boost::asio::io_context io_service;
        server s(io_service, atoi(argv[1]));
 
    }catch(exception& e){
        cerr << "Exception: " << e.what() << endl;
    }
 
    return 0;
}
cs



sync_client.cc


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include<cstdlib>
#include<iostream>
#include<boost/asio.hpp>
 
using boost::asio::ip::tcp;
using namespace std;
 
class client
{
public:
    client(boost::asio::io_service& io_service,
    //client(boost::asio::io_context& io_service,
    const string& host, const string& port) : socket_(io_service)
    {
        tcp::resolver resolver(io_service);
        //서버에 접속을 시도한다.
        boost::asio::connect(socket_, resolver.resolve({host, port}));
 
        string msg = "Hello, world!";
        size_t msg_length = msg.length();
 
        //서버로 데이터를 전송
        boost::asio::write(socket_, boost::asio::buffer(msg, msg_length));
 
        char reply[max_length];
        //서버로부터 데이터를 수신
        size_t reply_length = boost::asio::read(socket_, boost::asio::buffer(reply, msg_length));
        cout << "Reply is: " << reply << endl;
        
    }
 
private:
    tcp::socket socket_;
    enum { max_length = 1024 };
};
 
int main(int argc, char* argv[]){
    try{
        if(argc != 3){
            cerr << "Usage: client <host> <port>" << endl;
            return 1;
        }
 
        //boost 1.66이후 (Ubuntu 18.10 이후) 버전의 경우 io_context를 사용
        //boost::asio::io_context &io_service;
        boost::asio::io_service io_service;
        client c(io_service, argv[1], argv[2]);
 
    }catch(exception& e){
        cerr<<"Exception: " << e.what() << endl;
    }
 
    return 0;
}
cs



CMakeLists.txt


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
cmake_minimum_required(VERSION 3.0)
add_compile_options(-std=c++11)
 
project(asio_sync)
find_package(Boost REQUIRED system)
find_package(Threads)
 
include_directories(${Boost_INCLUDE_DIR})
 
add_executable(client
    sync_client.cc
)
 
add_executable(server
    sync_server.cc
)
 
target_link_libraries(client
    ${Boost_LIBRARIES}
    ${CMAKE_THREAD_LIBS_INIT}
)
 
target_link_libraries(server
    ${Boost_LIBRARIES}
)
cs



Linux 환경에서 다음과 같이 프로그램을 컴파일합니다.


$ mkdir build

$ cd build

$ cmake ..

$ make


 이제 우리가 만든 프로그램을 실행하여봅니다.



Server

1
2
$ ./server 2222
Message from client: Hello, world!
cs



Client


1
2
$./client 127.0.0.1 2222
Reply is: Hello, world!
cs



 축하합니다! 이제 여러분들도 Boost 라이브러리의 ASIO를 사용하여 동기화 통신 프로그래밍을 만들 수 있게 되었습니다!

300x250