전체 글 155

Go in Windows - runtime.LockOSThread()

Go언어에서 IWebBrowser2 를 사용하는 프로그램을 만들었는데, 잘 실행되다가 갑자기 종료되는 현상이 있었다. 여러 가지 시도를 해봤는데 빈도의 차이가 있을 뿐 확실하게 해결되지 않았다. 10여일 간 검색과 시행착오를 반복한 끝에 드디어 답을 찾았다. 답은 바로 runtime.LockOSThread() 이다. IWebBrowser 사용 중에 Access violation(0xc0000005), Application hang(0xcfffffff) 등으로 비정상 종료되었는데 runtime.LockOSThread()를 main()에서 실행한 후에 해결되었다.

Go in Windows - Interface

Go언어에서 윈도 인터페이스를 구현하는 경우 매개 변수의 형식은 uintptr 또는 이와 같은 크기의 변수(int,uint,포인터)만 가능하다. HRESULT Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr ); 위의 경우를 Go언어에서 구현하면, 아래와 같은 형태가 된다. func Invoke(idMember int,riid *GUID,lcid uint,flags uint, dispParams *DISPPARAMS,varResult *VARIANT, excepInfo *EXCEPINFO..

Go in Windows - BSTR

Go언어에서 윈도 dll을 사용할 때 BSTR이라는 데이터 형식은 조금 다르게 처리해야 한다. BSTR은 uint16 값들의 배열을 가리키는 포인터로 생각할 수 있다. 한 가지 다른 점은 이 포인터 앞에 int32 값으로 문자열의 길이를 가지고 있다는 것이다. 이 때문에 BSTR을 Go언어의 *uint16으로 처리하는 경우 잘못된 메모리 접근(memory access violation)이 발생할 수 있다. 아래와 같은 코드는 제대로 동작할 수도 있고(길이값을 사용하지 않을 때), 아닐 수도 있다(길이값을 사용할 경우). func WrongBstr(s string) *uint16{ return syscall.StringToUTF16Ptr(s) } 대신에 윈도우의 SysAllocString 함수를 이용해야 ..

안드로이드폰 파일 싱크 프로그램

아이폰을 쓰다가 안드로이드폰으로 바꾸고 나서 불편했던 것 중에 하나가 사진을 컴퓨터로 옮기는 것이었다. 그래서 직접 만들어 봤다. 겸사겸사 Go언어도 공부했다. 그리하여 Go 언어를 공부하고서 처음 만든 프로그램. kfilesync [소스 파일] 컴퓨터에 핸드폰 연결하고 명령 프롬프트에서 kfilesync MTP0:\DCIM D:\Pictures 하면 끝. 혹시 필요한 분들이 있을까 하여 실행파일 공유합니다.

물리, 한의학을 만나다 - 머리말

나는 한의학을 좋아한다. 그중에서도 특히 사상체질에 관심이 많다. 뭔지 모르는 끌림이 있기 때문이다. 사랑하고도 비슷하다. 그런데 사랑하는 사람이 손가락질당한다면? 화가 나거나 슬퍼질 것이다. 사상체질은 상당히 유용한 체계이기는 하지만 완전하지는 않다. 그래서 공격도 많이 받고, 비과학적이라고 비판 받기도 한다. 지난겨울 사상체질에 대한 나의 이 불편한 감정을 해결해 보기 위해서 몇 가지 시도를 해보았다. 우리 몸을 보일러의 구조에 비유해서 체질을 설명해 보려 한 것이다. 나름의 성과가 있었지만 중간중간 설명이 깔끔하지 못한 부분이 있어서 아쉬웠다. 왜 설명이 깔끔하지 못한지 생각해보다가 우리 집이 떠올랐다. 나는 한옥을 리모델링한 집에 살고 있다. 기존 구조를 그대로 둔 채로 우리 가족이 필요한 대로 ..

잡동사니 2019.03.27

고혈압 - 누가 병든 것인가

건강 검진에서 혈압이 높아지면 병원에 간다. 병원에 가면 혈압을 낮춰주는 약을 처방해 준다. 그때부터 사람들은 혈압약을 달고 산다. 그럼 행복하게 오래오래 살까? 장기적으로 볼 때 혈압약으로도 혈압 조절은 잘 안 된다. 그러면 약을 바꾸거나 복용량을 늘려야 한다. 점차 다른 증상들이 나타나면 또 다른 약을 추가해야 한다. 약을 배가 부르도록 먹어야하는 시점이 온다. 무엇이 문제인가? 고혈압을 치료 대상으로 간주하는 것이 문제이다. 고혈압은 질병의 근원이 아니고 말단에서 나타나는 증상의 하나일 뿐이다. 혈액 순환이 잘 안되니까 몸이 살아보겠다고 혈압을 올리는 것이다. 그런데 이걸 막고 혈압을 낮추면? 필요한 곳에 피가 잘 돌지 못해서 다른 질병이 생긴다. 그럼 왜 고혈압을 질병으로 간주하는가? 누군가에게 ..

다둥이아빠 2018.07.06

네이버 뉴스의 낚시를 피하는 확장기능

말도 많고 탈도 많은 네이버 뉴스.그래도 습관적으로 뉴스를 볼 때 네이버 뉴스를 이용한다. 문제는 뉴스 제목만 있고 어느 언론사 기사인지 없는 링크들이 많다는 것이다.그런 기사를 클릭해보면 사용자를 낚기 위한 기레기 기사들이 꽤 있다. 이런 낚시를 피하기 위해서 간단한 브라우저 확장기능을 만들었다.확장기능을 설치하면 아래처럼 바뀐다. 마우스를 가져가면 링크의 설명 부분에 어느 언론사인지가 표시되고주의가 필요한 언론사는 빨간 상자로 한 번 더 표시된다. Naver News Ex (https://chrome.google.com/webstore/detail/naver-news-ex/anfbkggepilagpcoicojhcgbogbppmbh)

잡동사니 2018.07.03