WebView2 0x8007139F ERROR_INVALID_STATE 처리 방법

CreateCoreWebView2Controller() 함수가실패하고 에러 코드로 0x8007139F 을 리턴하는 경우 온라인에서 해결방법을 추적하다 보면 다양한 방법의 대처법이 제시되고 있다.

그 모든 방법을 찾아 헤매면서 고생했지만 결국은 10여일간을 허송생활을 하면서 포기할 즈음 너무나 단순하게 원인과 해결 방법을 찾게 되었다.

나와 같은 경우가 발생하는 상황은 WebView2 를 생성하는 모듈과 실제 사용하는모듈이 다른 경우에 해당한다. 즉, WebView2 의 생성은 별도의 dll, exe, ocx 등에서 생성하고 메인 모듈에서 이 모듈을 로딩하여 WebView2를 메인 모듈의 자식으로 생성하는 경우이다.

이 경우 두개의 모듈에 적용된 DPI 설정이 다르면 위의 0x8007139f 에러가 발생한다.
해결 방법은 두개의 DPI 설정을 동일하게 해주는 것이다. 이 설정은

프로젝트의 속성 / 매니페스트 도구 / 모든 옵션(or 입력 및 출력) / DPI 인식 을 찾아서 설정한다.

아래 그림에서와 같이 DPI 인식을 동일하게 설정해주어야 한다.
단지, 이 설정을 동일하게 하는 것으로 위의 0x8007139f 에러가 사라지고 WebView2 가 정상적으로 생성된다.

Posted in Window Program | Tagged , , , | Leave a comment

wsl ubuntu에서 sshd 활성화 하기

wsl에 ubuntu를 처음 설치한 후에는 sshd 가 정상 동작하지 않는 것 같다. telnet 으로 접속하려 할 때 접속이 되지 않는다.

이를 해결하려면 openssh 를 아래와 같이 설치하면 된다.

sudo apt update
sudo apt upgrade

sudo apt purge openssh-server
sudo apt install openssh-server

설치 후 /etc/ssh/sshd_config 파일을 열고 아래 내용을 찾아 코멘트 처리를 해제한다.

Port 22
Protocol 2
PermitRootLogin no
AuthorizedKeysFile  .ssh/authorized_keys
PasswordAuthentication yes
PubkeyAuthentication yes
ChallengeResponseAuthentication no
X11Forwarding yes
UseDNS no

이제 ssh server를 재시작한다. 조금이라도 문제의 소지를 없애기 위하여 확실하게 재기동을 하게 한다.

sudo service ssh --full-restart
sudo service ssh restart
Posted in 리눅스 | Tagged , , | Leave a comment

wsl 에서 ubuntu 사용시 Window Folder Mount 하기

윈도우에서 사용하는 드라이브는 자동으로 ubuntu에서 /mnt/<드라이브> 로 설정된다. 따라서 C: 드라이브는 /mnt/c, D: 드라이브는 /mnt/d 로 설정된다.

윈도우의 폴더를 마운트하여 사용하려면 mount 명령을 사용하면 되지만 wsl에서는 윈도우 마운트가 늦게 활성화 되는지 보통의 방법으로 하면 fstab 에 추가되었어도 마운트 되지 않는다.

윈도우 실행시 fstab에 등록한 윈도우 드라이브의 폴더 경로 마운트를 활성화 하려면 /etc/wsl.conf 에 아래 내용을 추가해주고 wsl을 재기동해야 한다.

[automount]
enabled=true
mountFsTab=true

[boot]
systemd=true

wsl을 재기동하는 것은 wsl.exe --shutdown 을 실행하고 약 8~10초 정도 지난 후에 다시 실행하면 된다. 약간의 대기 시간을 주는 것은 윈도우가 wsl을 종료하는 시간을 주는 것이다.

참고로 /etc/fstab 에는 영구 마운트할 윈도우즈 경로 정보를 아래와 같이 설정한다.
아래는 c:/<Windows Path> 를 /ois로 마운트 하는 설정이다.

/mnt/c/<Windows Path> /ois auto nosuid,nodev,nofail,bind 0 0

Posted in 리눅스 | Tagged , , | Leave a comment

pymysql 모듈사용시 컬럼명으로 값 조회하는 방법

파이선에서 pymysql을 사용하는 경우 기본이 컬럼 인덱스에 의한 배열로 값이 리턴된다. 만약 컬럼명으로 값을 얻고 싶다면 리던값이 배열이 아닌 해쉬맵으로 리턴되게 해야 한다.

간단하게 아래와 같이 connect 를 요청할 때 ‘cursorclass=pymysql.cursors.DictCursor’ 를 추가하면 된다.

conn = pymysql.connect(host=hostname, user=username, passwd=password, db=database, port=port, use_unicode=True, charset='utf8', cursorclass=pymysql.cursors.DictCursor)
mycursor = conn.cursor()

mycursor.execute("SELECT * FROM tablename WHERE 1 LIMIT 1;")
result = mycursor.fetchone()
colval = result["colname"]
Posted in python | Tagged , | Leave a comment

Table click event에서 row, col 구하기

cell 에 이벤트 핸들러를 설정하고 핸들러에서 전달된 자신의 객체로 원하는 정보를 얻으면 된다.

var table = document.getElementById("myTable");
if (table != null) {
	for (var i = 0; i < table.rows.length; i++) {
		for (var j = 0; j < table.rows[i].cells.length; j++)
		table.rows[i].cells[j].onclick = function () {
			CellInfo(this);
		};
	}
}

function CellInfo(cell) {
	alert("col: "+", "+cell.cellIndex+", row: "+cell.parentNode.rowIndex+", text: "+cell.innerText);
}

아래는 테스트를 위한 예제 소스코드이다.

<!DOCTYPE html>
<html>
<style>
table, th, td {
  border:1px solid black;
}
</style>
<body>

<h2>테이블 클릭 핸들러 예제</h2>

<table id="myTable" style="width:100%">
  <tr>
    <th>회사명</th>
    <th>담당자</th>
    <th>연락처</th>
  </tr>
  <tr>
    <td>(주)잘나가</td>
    <td>연락해</td>
    <td>010-1234-1234</td>
  </tr>
  <tr>
    <td>막나가 주식회사</td>
    <td>잘받아</td>
    <td>010-0101-1212</td>
  </tr>
</table>

<p>마우스로 테이블의 셀을 클릭하면 셀의 행과 열 그리고 내용을 표시합니다.</p>

    <script type="text/javascript">

	var table = document.getElementById("myTable");
	if (table != null) {
		for (var i = 0; i < table.rows.length; i++) {
			for (var j = 0; j < table.rows[i].cells.length; j++)
			table.rows[i].cells[j].onclick = function () {
				CellInfo(this);
			};
		}
	}

	function CellInfo(cell) {
		alert("col: "+", "+cell.cellIndex+", row: "+cell.parentNode.rowIndex+", text: "+cell.innerText);
	}


  </script>
</body>
</html>
Posted in Web | Tagged , , , , | Leave a comment

HWND로 이미지 경로 구하기

윈도우 핸들만으로 실행 중인 프로그램의 경로를 구하는 방법이다.
전달되는 경로는 FullPath이다.
가끔 요긴하게 필요하다.

DWORD id;
GetWindowThreadProcessId(hWnd, &id); 

TCHAR szPath[MAX_PATH];
DWORD size = MAX_PATH;
HANDLE hProc = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, id);
QueryFullProcessImageNameW(hProc, 0, szPath, &size);
CloseHandle(hProc);
Posted in Window Program | Tagged , , | Leave a comment

WY500 관리기 조립하기

지금 살던 집에서 작은 집으로 옮기고 차액과 모아둔 자금을 바탕으로 다들 생각하는 그런 전원주택을 생각했지만 집값 상승과 양도세를 포함한 각종 세금의 증가, 그리고 자재비의 상승등으로 포기하고 농막같은 작은 집을 지었다.

몇년을 특별한 쉴공간 없이 농사를 지었는데 화장실과 하루만에 끝내야 해서 뜨거운 한낮에도 밭일을 해야 하는 것이 무척 힘들었다. 농사도 몇평 안되는 작은 규모외에는 안되고 결국 농막을 가져다놓기로 했는데 비슷한 금액으로 주택을 지을 수 있다고 하는 유혹에 그만 함정에 빠지고 말았다.

집자체는 농막과 비슷한 금액이지만 주택은 추가로 들어가는 것들이 너무 많다. 게다가 우리를 유혹한 설계사무소 임원이 ………….. 좋지 않았다.

어쨓거나 이제 주택도 완공되고 올해 농사를 지으려니 작은 관리기가 필요했다. 100여평정도를 예상하고 있어서 작은 관리기가 제격인 것 같아 알아 보았다. 주변에서는 로터리치는 것을 외부에 맡기는 게 좋다고 하지만 가격이 만만치 않다. 두번 로터리 치면 관리기 가격이 나오고도 남는다.

아무때고 편할 때 내 맘대로 사용할 수 있어서 관리기를 사기로 하고 인터넷에서 찾아보니 윈유 파워관리기 WY-500 이 원하는 용도와 가격 등에서 제일 좋았다. 가격을 낮추기 위해 미조립상태로 구입하기로 하고 조립 동영상등을 보니 할만하다고 생각된다. 블로그등에서도 빠르면 30분 느려도 2시간이면 다들 조립했다.

하지만 배송이 문제였다. 주말에만 내려가는데 배송은 날자나 시간을 지정할 수 없다. 사장님께 전화해서 문의하니 택배사와 이야기해서 주말에 배송되도록 해주신다고 하여 바로 주문을 했다. 그런데 금요일에 택배사에서 배송하겠다고 연락이 왔다. 무거워서 혼자 못내린다고 하던데 집에 아무도 없다 라고 했지만 토요일에 비예보가 있다고 굳이 금요일 배송하시겠다고 한다. 일반인들은 무거워 다루기 힘들지만 자기들은 요령이 있어서 쉽게 운반한다고 하며 금요일에 배송해 주셨다. 아무도 없는 집에 직접 문(전원주택이어서 정원문이 있다.)을 열고 들어가셔서 비맞지 않는 곳에 내려놓고 가셨다.

토요일에 관리기를 보고 싶은 마음에 서둘러 내려가 도착한 관리기를 보고 조립을 했다.
관리기는 두개의 상자로 배송이 되었다. 하나는 관리기이고 다른 한 상자에는 로터리와 출하증명서등이 들어 있었다.

조립은 아래의 순서로 진행했다.

  1. 포장해제
    조립을 위하여 포장을 해제하고 내부에 포개 넣어진 자재들을 정리해서 포장지를 바닥에 깔고 정리해 놓았다. 잘정리해 놓아야 조립할 때 편하게 하고 신속하게 조립할 수 있다. 하지만 미처 사진을 찍어 놓지 못해서 온라인에서 살짝 가져왔다. 저작권에 걸리면 …. ㅋㅋ
  1. 기어오일 주입
    기어오일 주입구를 보면 전용 깔대기가 없으면 주입하기 곤란한 위치에 있습니다. 마치 벽에 난 구멍에 주입해야하는 상황이죠. 그래서 생각 끝에 관리기를 운반틀에서 해체하기 전에 눕혀서 주입하는 것이 좋겠다고 생각했습니다.

소질이 없어서 잘 따른다고 했는데 ^^

옆으로 많이 흘렸습니다.

기어오일은 1리터를 구입했는데 다들어갔습니다. 박스에 첨부된 주의사항에는 950ml 를 넣으라고 했는데 한통이 다들어가더군요.

그런데 …

바닥에 뭔가 흘러 내리는 것이 보입니다. 미처 생각을 못했는데 기어박스 윗부분에 숨구멍이 있더군요.

여기로 기어오일이 새고 있었습니다.후다각 오일 주입구를 막고 관리기를 세웠습니다.

다행이 구멍이 작아서 많이 새어 나오지는 않았네요.

결국 950ml 를 넣으라는 용량을 초과해서 1리터를 넣었더니 저 구멍으로 50ml 가 새어나온 것 같습니다. ㅎㅎ

저와 같은 실수를 하지 않으시려면 기어오일을 주입하기 전에 박스에서 포장테이프를 뜯어내 숨구멍을 막고 주입하세요.

아마도 기어오일이 새는일은 없을 것 같네요.

  1. 바퀴조립
    바퀴는 동영상을 보면 한사람이 보조로 도와주고 있습니다. 관리기를 잡아 주고 있는데 혼자 조립하는 경우에는 힘들 것 같네요. 더구나 기어오일을 주입한 상태라 자칫 너무 기울어지면 오일이 새어 나올 수도 있을 것 같습니다.
    그래서 꼼수를 부린 것이 관리기를 완전히 분리하지 않고 한쪽만 분리해서 바퀴를 조립했습니다.

바퀴는 무겁지 않습니다. 한손으로 가볍게 들 수 있습니다. 관리기도 혼자 들 수 있을 정도로 가볍습니다. 바퀴를 끼울 때 굴러가는 방향과 고정핀 구멍을 잘 살펴서 끼우시면 됩니다.

반대편은 이미 한쪽 바퀴를 끼운 상태여서 같은 방식으로 끼울 수 없습니다. 고정나사를 모두 풀고 아래 그림처럼 하시면 쉽게 됩니다. 이 때 관리기를 이동하면서 핸들과 핸들에 연결된 각종 선들에 주의하시기 바랍니다.

  1. 앞바퀴 조립
    바퀴 2 개 조립이 되면 이 상태에서 바로 앞바퀴를 조립합니다. 관리기 자세가 앞바퀴 조립하기 좋은 자세입니다. 이 때 스프링 고정핀을 사용하는 것이 앞쪽이고 너트로 고정이 관리기 쪽입니다. 이래야 로타리칠 때 스프링 고정핀만 빼고 바퀴를 쉽게 올려 고정할 수 있습니다. 주의하시기 바랍니다.
  2. 중심축 조립
    앞바퀴 조립이 끝나면 중심축을 조립합니다. 그냥 나사를 박으면 끝입니다.
  3. 기어박스 조립
    동영상을 보면 여기서 많이들 고생하시던데 저는 쉽게 조립했습니다. 라디오펜치나 플라이어 같은 공구는 꼭 필요합니다. 손가락만으로 좀 어렵습니다.
    숫자판과 기어 손잡이를 먼저 조립해 놓습니다.

숫자판이 붙어 있는 손잡이 연결대를 기어박스 상단에 고정합니다. 그리고 여기가 중요합니다.

휠을 잡고 좌측 그림처럼 기어 손잡이 연결하는 곳이보이도록 조정합니다. 이 때 벨트를 같이 잡으면 잘 돌아가지 않습니다.
정확하게 휠만 잡고 돌리면 쉽게 돌아갑니다. 만약 잘 안돌아 간다면 반대로 돌려보시면 쉽게 돌아 갈 겁니다.

이 상태에서 롱로우즈플라이어 등으로 고정핀을 삽입하고 좌측 그림처럼 방향을 잡아 줍니다.

이제 원안의 구멍으로 스프링 고정핀(R핀이라고도 함) 을 키워주면 됩니다.

여기부터는 제가 사진을 하나도 안찍었네요. ^^ 사실 쉽게 쉽게 넘어가서 그냥 조립이 다 되어 버렸습니다. ^^

  1. 손잡이 조립
    손잡이는 조립자체는 별거아니지만 케이블 정리가 중요합니다. 선들이 걸리적 거리지 않게 잘 정리하고 고정용 플라스틱이 있는데 이 것으로 잘 고정해야 합니다. 특히, 스탑스위치 배선은 중간에 커넥터로 연결되어 있는데 이게 방수용으로 작은쪽이 긴쪽의 속으로 들어가서 고정이 되어야 비를 맞아도 내부에 물이 스며들지 않습니다. 누전 보다는 물이 들어가면 녹이나서 접촉불량이 되면 시동이 안걸리거나 자꾸 꺼지겠죠.
  2. 흙받이 조립
    흙받이는 굵은 나사 3개씩 좌우로 박아서 고정합니다. 이 때 처음부터 고정하지 마시고 헐겁게 박아만 놓은 후에 흙받이 고정대를 가는 나사 4개로 고정한 후에 흙받이 나사도 고정해 주시면 조립이 훨씬 쉬워집니다.
  3. 엔진오일/에어크리너 오일 주입
    엔진오일은 600ml 넣으라고 되어 있는데 넘치기 직전까지 넣으나 한 800ml는 들어가는 것 같습니다. 남은 것으로 에어클리너의 바닥에 한칸 가득 채우고 좌우로 기울여서 다른 칸에 바닥에 깔리도록 했습니다. 이 것은 먼지를 흡착하는 용도이기 때문에 많이 채울 필요 없습니다. 오히려 많이 채워서 스펀지에 묻으면 공기 흡입만 나빠집니다.
  4. 휘발류 주입
    가득 채웠습니다. 배부르게 먹고 일잘하라고 ㅎㅎㅎ
  5. 시운전 ^^

시운전하기 전에 먼저 기어를 중립에 놓아야 합니다. 처음 기어레버를 움직이면 안움직일 수 있습니다.
이 때는, 기어박스에 붙어 있는 휠을 손으로 살짝 돌린 후에 기어레버를 움직이면 각 단계마다 딸깍, 딸깍하면서 걸리는 느낌이 있습니다.
이렇게 중립에 기어를 놓고 시운전을 시작합니다.

스탑스위치를 ON 으로 하고, 악셀레바를 최저상태에 놓고 연료코크를 우측으로 밀어 주고 쵸크 레바를 좌측으로 밀고 리코일스타트를 당기자 한번에 바로 시동이 걸리네요.
악셀을 당기자 엔진이 굉음을 내면서 왕왕댑니다. 일 잘할 것 같습니다.

기대하지 않았지만 엔진소리가 경쾌하니 기대가 됩니다.
올해 농사는 벌써 풍년입니다. ㅎㅎ

Posted in 미분류 | Tagged , , | Leave a comment

Notepad++ 에서 바이너리가 포함된 문자열 찾거나 바꾸기

바이너리가 포함된 문자열을 찾거나 변경하려면 정규표현식을 사용해야 한다.

바이너리 문자는 16진수로 ‘\x##’ 으로 표현한다.

아래는 “0xA91998” 을 “1998” 로 바꾸는 장면이다.

Posted in 컴퓨터일반 | Tagged , , , , | Leave a comment

VC2019 로 python-2.7.18 컴파일하기

VC2019 를 사용하여 python-2.7.18을 컴파일하려면 아래와 같은 절차로 일부 파일을 수정해야 합니다.

  1. posixmodule.obj : error LNK2019: __imp____pioinfo__PyVerify_fd 함수에서 참조되는 확인할 수 없는 외부 기호
    Python-2.7.18\Modules\posixmodule.c 의 _PyVerify_fd() 를 아래와 같이 수정
/* This function emulates what the windows CRT does to validate file handles */
int
_PyVerify_fd(int fd)
{
#if 1
    return _get_osfhandle(fd) &gt;= 0;
#else
    const int i1 = fd &gt;&gt; IOINFO_L2E;
    const int i2 = fd &amp; ((1 &lt;&lt; IOINFO_L2E) - 1);

    static int sizeof_ioinfo = 0;

    /* Determine the actual size of the ioinfo structure,
     * as used by the CRT loaded in memory
     */
    if (sizeof_ioinfo == 0 &amp;&amp; __pioinfo[0] != NULL) {
        sizeof_ioinfo = _msize(__pioinfo[0]) / IOINFO_ARRAY_ELTS;
    }
    if (sizeof_ioinfo == 0) {
        /* This should not happen... */
        goto fail;
    }

    /* See that it isn't a special CLEAR fileno */
    if (fd != _NO_CONSOLE_FILENO) {
        /* Microsoft CRT would check that 0&lt;=fd&lt;_nhandle but we can't do that.  Instead
         * we check pointer validity and other info
         */
        if (0 &lt;= i1 &amp;&amp; i1 &lt; IOINFO_ARRAYS &amp;&amp; __pioinfo[i1] != NULL) {
            /* finally, check that the file is open */
            my_ioinfo* info = (my_ioinfo*)(__pioinfo[i1] + i2 * sizeof_ioinfo);
            if (info-&gt;osfile &amp; FOPEN) {
                return 1;
            }
        }
    }

  fail:
    errno = EBADF;
    return 0;
#endif
}
  • python-2.7.18\externals\tk-8.5.19.0\xlib\X11\X.h
    windows.h를 추가
#define X_PROTOCOL	11		/* current protocol version */
#define X_PROTOCOL_REVISION 0		/* current minor version */
/* patched, include "windows.h" first to avoid conflict macro */
#ifdef _WIN32
#   define WIN32_LEAN_AND_MEAN
#   include <windows.h>
#   undef WIN32_LEAN_AND_MEAN
#endif
  • Python-2.7.18\PCbuild\tcltk.props
    VC9 를 VC13으로 수정
    <BuildDirTop Condition="$(TclMachine) != 'IX86'">$(BuildDirTop)_$(TclMachine)</BuildDirTop>
    <!-- This completely breaks building Tix for any toolset but v90 and should be fixed -->
    <BuildDirTop>$(BuildDirTop)_VC13</BuildDirTop>
  </PropertyGroup>
</Project>

이제 컴파일을 하면 정상적으로 완료됩니다.
만약 컴파일이 안되면 아래 절차를 따라 하시면 됩니다.

  1. PCBuild 로 이동
  2. get_externals.bat -c 실행하여 externals 폴더에 외부 파일을 다운로드 함
  3. pcbuild.sln 을 열고 솔루션 정리 후 솔루션 빌드
  4. 빌드 실행 중에 externals folder에 tcltk 폴더가 생성되면 정상적으로 컴파일이 수행됨

Posted in Window Program | Tagged , , | Leave a comment

Ubuntu 20.04 raspberry pi2 에 wifi 설치하기

라즈베리파이 구버전이 있어서 간단한 용도로 사용하려고 우분투를 설치하고 준비가 마무리될 무렵 사용환경이 랜이 없어서 wifi 를 사용해야 한다. 그런데 마침 집에 역시나 예전에 구입했던 IPTIME N100mini 가 있어서 이걸 사용하기로 하고 USB 에 꽂아 보았다.

역시 우분투도 버전이 올라가니 기본으로 랜카드를 인식해 준다. 하지만 wifi는 잡히지 않는다.

아래와 같이 사용설정을 해주어야 한다. 구글링해보면 드라이버를 설치하라거나 복잡한 과정들이 나열되지만 그것들은 다 예전 버전의 우분투에서 필요했던 것 같다.

ifconfig -a 로 확인해보면 무선랜은 인식이 되고 있다. 아래는 다양한 방법으로 무선랜을 확인한 내용이다.

/etc/network/interfaces 를 수정하는 방법도 동작이 되지 않는다.

ubuntu@ubuntu:~$ ifconfig -a
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.3.45  netmask 255.255.255.0  broadcast 192.168.3.255
        inet6 fe80::ba27:ebff:feb8:f4fe  prefixlen 64  scopeid 0x20<link>
        ether b8:27:eb:b8:f4:fe  txqueuelen 1000  (Ethernet)
        RX packets 2112  bytes 2744366 (2.7 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1127  bytes 105436 (105.4 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 110  bytes 8688 (8.6 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 110  bytes 8688 (8.6 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4098<BROADCAST,MULTICAST>  mtu 1500
        ether 90:9f:33:e9:eb:71  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ubuntu@ubuntu:~$ lsusb
Bus 001 Device 004: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN Adapter
Bus 001 Device 003: ID 0424:ec00 Microchip Technology, Inc. (formerly SMSC) SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Microchip Technology, Inc. (formerly SMSC) SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

ubuntu@ubuntu:~$ sudo lshw -C network
  *-usb:0
       description: Ethernet interface
       product: SMSC9512/9514 Fast Ethernet Adapter
       vendor: Microchip Technology, Inc. (formerly SMSC)
       physical id: 1
       bus info: usb@1:1.1
       logical name: eth0
       version: 2.00
       serial: b8:27:eb:b8:f4:fe
       size: 100Mbit/s
       capacity: 100Mbit/s
       capabilities: usb-2.00 ethernet physical tp mii 10bt 10bt-fd 100bt 100bt-fd autonegotiation
       configuration: autonegotiation=on broadcast=yes driver=smsc95xx driverversion=22-Aug-2005 duplex=full firmware=smsc95xx USB 2.0 Ethernet ip=192.168.3.45 link=yes maxpower=2mA multicast=yes port=MII speed=100Mbit/s
  *-network DISABLED
       description: Wireless interface
       physical id: 2
       bus info: usb@1:1.5
       logical name: wlan0
       serial: 90:9f:33:e9:eb:71
       capabilities: ethernet physical wireless
       configuration: broadcast=yes driver=rtl8192cu driverversion=5.4.0-1042-raspi firmware=N/A link=no multicast=yes wireless=IEEE 802.11

최종적으로 성공한 방법은 NetPlan을 사용한 방법이다. 단순히 설정 파일을 수정하고 다시 적용하면 된다. 한번 rebooting 이 필요하다.

먼전 아래와 같이 환경 파일을 수정한다.

ubuntu@ubuntu:~$ vi /etc/netplan/50-cloud-init.yaml
# This file is generated from information provided by the datasource.  Changes
# to it will not persist across an instance reboot.  To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
        eth0:
            dhcp4: true
            optional: true
    version: 2
    wifis:
        wlan0:
            optional: true
            access-points:
                "SSID를 기록":
                  password: "비번을 기록"
            dhcp4: true

여기서 중요한 것은 들여 쓰기이다. 들여쓰기가 잘못되면 apply 를 할 때 에러가 표시된다. 특히 password는 SSID 보다 더 들여 쓰기를 해야 한다.

이제 수정한 내용을 적용한다.

sudo netplan apply

이제 재기동 한번 하면 자동으로 wifi 가 연결된다.

ubuntu@ubuntu:~$ ifconfig -a
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.3.45  netmask 255.255.255.0  broadcast 192.168.3.255
        inet6 fe80::ba27:ebff:feb8:f4fe  prefixlen 64  scopeid 0x20<link>
        ether b8:27:eb:b8:f4:fe  txqueuelen 1000  (Ethernet)
        RX packets 97  bytes 10966 (10.9 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 71  bytes 12322 (12.3 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 88  bytes 6664 (6.6 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 88  bytes 6664 (6.6 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.3.46  netmask 255.255.255.0  broadcast 192.168.3.255
        inet6 fe80::929f:33ff:fee9:eb71  prefixlen 64  scopeid 0x20<link>
        ether 90:9f:33:e9:eb:71  txqueuelen 1000  (Ethernet)
        RX packets 50  bytes 15038 (15.0 KB)
        RX errors 0  dropped 1  overruns 0  frame 0
        TX packets 17  bytes 2478 (2.4 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
Posted in 리눅스 | Tagged , , , , , | Leave a comment