말레이시아의 핸드폰 선불 요금제(Celcom)

Celcom의 후불 요금제는 한국의 것과 거의 유사하다. 요금제 마다 다른 양의 데이터가 제공되고 매달 요금을 지불한다. 다만 외국인들에게는 보증금(deposit) 500링깃을 추가로 요구하는데 이 돈은 후불 요금제를 종료하면 60일 이내에 수표나 계좌이체로 돌려준다. 이 때 번호를 유지한 채 요금제만 후불로 변경하는 것을 불가능하고 새로운 선불제 번호를 사야한다. 꼭 번호를 유지하고 싶다면 다른 통신사로 옮겼다가 다시 돌아오는 방법이 있다고 하는데, 시도해 보진 않았다.

반면 선불 요금제에는 보증금이 없다. 전화번호를 유지하기 위해 유효일을 구매하는데 하루에 RM1이다. 예를 들어 30일간 전화번호를 유지하고 싶다고 하면 RM30을 들여서 유효일을 구매하면 되고, 연장하고 싶으면 추가로 구매하면 된다. 연장하지 않으면 번호는 회수되어 추후에 재 판매된다.

선불 폰 번호들은 나쁜 짓에 쓰이다가 회수된 것들이 많아서 자칫 blacklsit에 오른 번호가 걸리면 내가 하지도 않은 짓들 때문에 제한을 받을 수 있다. 일전에 샀던 선불 번호가 Grab에 무슨 짓을 했는지 회원가입이 되질 않아서 한참 CS랑 메세지를 주고 받다가 결국 새 번호를 사야 했었더랬다.

선불 요금제 30일치를 한 번에 결제하면 무제한 인터넷과 3GB의 핫스팟 용량을 주는데, 주의할 점은 여기서 말하는 무제한 인터넷은 속도 제한 걸린 최대속도 2.5Mbps 짜리라는 점이다. 4G안테나 뜨고 2.5Mbps라니… 반면, 용량제한이 있는 3GB짜리 핫스팟은 이보다는 빠른 6Mbps 정도 속도이다. 핸드폰은 느려터지지만 핫스팟으로 연결한 랩탑은 2배이상 빠른 아이러니다.

2.5Mbps는 느려터진 저속이지만 추가로 1일 3일 5일 등 특정 기간동안 속도를 정상으로 풀어주는 유료 아이템(add-on)들이 있어서 추가 현질을 하면 약간 더 빠른 인터넷을 사용할 수 있다.

Android recovery image 빌드 설정

1. BoardConfig.mk 수정
TARGET_NO_KERNEL과 TARGET_NO_RECOVERY가 true로 설정되어 있다면 설정한다.

2. device.mk 수정
TARGET_PREBUILT_KERNEL관련 설정을 삭제한다.

3. AndroidBoard.mk 추가
Kernel build 될 때 참고되는 파일이므로 추가해 주고 KERNEL_DEFCONFIG등의 설정을 자신에 맞게 변경해 준다.

4. AndroidKernel.mk 추가
AndroidKernel.mk는 kernel build를 위한 makefile script이다.

5. defconfig file 경로변경
defconfig file이 참조될 수 있도록 kernel/$(ARCH)/configs 아래에 옮겨준다.

6. 상대경로 참조로 인한 compile error 수정
Android build에 포함된 kernel build는 상대 경로를 참조하는 경우 build error를 발생할 수 있다. 절대 경로 path를 주기 위해 절대 경로를 얻고 make command line에 이를 넘겨주는 부분을 추가해 준다.

Windows DLL loading 실패 디버깅

Windows programming 중에 DLL loading을 실패해서 오류가 발생하면 문제가 생겼다는 에러코드(0xc0000135)만 출력되고 어떤 것이 실패했는지 또 어느 곳을 찾아 봤는지에 대한 정보는 자세히 알려주지 않는다.

Windows SDK에 포함된 gflags.exe(Global Flags)를 이용하면 DLL loading에 대한 세부정보를 볼 수 있다. gflags.exe가 실행하는데 admin권한을 필요로 하기 때문에 관리자 권한으로 터미널을 띄우고 Windows SDK안에 포함되어 있는 gflags.exe를 다음과 같이 실행해서 세부 내역을 보고 싶은 실행파일의 이름과 sls(Show Loader Snaps) option을 명시 해준다.

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe -i <프로그램이름.exe> +sls
Current Registry Settings for <프로그램이름.exe> executable are: 00000002
    sls - Show Loader Snaps

다시 Visual studio로 돌아와서 프로그램을 실행하면 Output window에 DLL loading에 실패한 라이브러리의 이름과 시도해본 path들에 대한 세부정보가 표시된다.

8e9c:55d4 @ 621281687 - LdrpFindKnownDll - ENTER: DLL name: <실패하는 라이브러리>.dll
8e9c:55d4 @ 621281687 - LdrpFindKnownDll - RETURN: Status: 0xc0000135
8e9c:55d4 @ 621281687 - LdrpFindKnownDll - ENTER: DLL name: vccorlib140d_app.DLL
8e9c:55d4 @ 621281687 - LdrpFindKnownDll - RETURN: Status: 0xc0000135
8e9c:55d4 @ 621281687 - LdrpFindKnownDll - ENTER: DLL name: MSVCP140D_APP.dll
8e9c:55d4 @ 621281687 - LdrpFindKnownDll - RETURN: Status: 0xc0000135

이전 상태로 되돌리려면 옵션을 `-sls`로 변경해서 다시 한 번 gflgas.exe를 실행해 주면 된다.

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe -i ieproxytest.exe -sls
Current Registry Settings for ieproxytest.exe executable are: 00000000

말레이시아 회사생활 정리

회사에서 알려주는 자잘한 퇴사 체크리스트를 제외하고 크게 다음의 세가지가 완료되어야 한다.
1. 세금정산(tax clearance)
2. EP 취소
3. EPF 출금

2021년 10월 현재는 COVID-19의 여파로 공공기관들이 제한된 slot만을 운영하고 처리에 시간이 오래 걸린다는 점을 감안해서 될 수 있는 한 빨리 시작하는게 좋다. 이 외에도 인터넷과 후불 핸드폰 요금제를 위한 deposit, 로드텍스와 자동차 보험료 환급 등을 돌려 받는데 많게는 두세달 까지 시간이 소요되므로 은행 계좌는 당분간 계속 열어두는게 좋다.

사전 준비

회사에 이야기해서 터미네이션 날짜와 출국 날짜를 정하면 우선 비행편 부터 끊자, 여러 기관에서 출국일자에 대한 근거서류로 사용될 수 있다. 그리고 하드카피로 제출해야하는 문서들이 꽤나 있으니 프린트와 스캔을 할 수 있는 환경이 되는 것이 좋다.

• 출국 비행편
• 인터넷 등의 서비스 종료일자 지정
• 은행계좌 유지

Tax Clearance

회사에 CP21 문서를 요청하고 PCBII와 지난 3년간의 EA form 그리고 세금 면제를 위한 영수증들을 준비해 둔다. HASIL homepage에 가면 BE form을 찾을 수 있는데, 가장 최근 해의 양식을 다운로드 받아서 수기로 선을 긋고 해당 년도로 수정한 다음 내용을 작성한다. 준비된 서류는 가까운 LHDN branch를 방문해서 제출해야 하는데, 상황이 상황인지라 온라인 제출도 받고 있다. e-SPC를 통해 제출해야 하는 줄 알았는데, HR을 통해 LHDN에 물어봤더니 그냥 소프트카피들을 메일로 보내고 하드카피를 별도로 LHDN office로 보내면 방문할 필요 없이 접수를 해준다고 한다.

BE form의 영문버전은 참조용이며 반드시 말레이어버전을 작성해서 제출해야 함에 유의 해야한다.

안내에 따라 소프트카피들을 10MB이내로 압축해서 보내고 DHL로 하드카피를 사무실로 보냈다. 우편접수는 12시까지만 받는다고 해서 DHL에 시간을 지정해서 배달해달라고 했는데, 당연하게도 잘 받았다는 응답같은건 보내주지 않는다. DHL에서트래커를 보고 있다가 도착확인해달라고 메일을 보냈는데 이 또한 당연하게도 응답이 없다.

14 working day가 소요된다고 하는데, 주말과 공휴일을 빼면 대략 한달 정도된다. Tax agent에 물어보니 tax clearance가 완료되지 않은 상황에서도 출국은 가능하다고 한다. IRB의 블랙리스트에 오른 상태가 하니라면.

제출 서류
• CP21
• BE form(malay version)
• PCBII
• 3년치 EA form
• Traveling schedule
• 여권 scan
• 세금면제 영수증들

EP cancelation

이 건은 직접하지 않고 회사와 계약된 agent가 처리해 주었는데 이민국이 제한된 slot만을 운영하고 있어서 곧바로 처리되지 못할 수도 있다. 출국 비행기표와 여권을 보내 주었는데 대략 이틀 정도 지나서 완료 되었다는 연락을 받았다.

돌려받은 여권에는 EP page에 수기로 expiary date이 출국날짜로 수정되어 있고, 출국일정에 대한 메모가 남겨져 있다.

EPF 출금신청

회사로 부터 EPF 기여내역과 퇴사 레터를 받으면 진행 할 수 있다. 또한 실물 여권이 없으면 부가 서류가 필요하므로, EP 취소가 완료되고 여권을 돌려받은 상태에서 진행하는게 수월하다. 회사 HR담당자의 이야기로는 서류 미비는 대부분 제출할때 걸러지고 제출이 완료된 후에 서류 문제로 출금신청이 거부되거나 연기된 적은 지금까지 없었다고 한다.

말레이시아 시민권자가 아니면 온라인 제출을 할 수 없으니 방문하고자 하는 지점에 appointment를 온라인으로 신청하고 방문해야 한다. 한가지 주의할 점은 9K AHL문서를 작성할 때 “Foreign worker”가 아닌 “Expatriate”을 선택해야 한다는 점이다.

처리기간은 공식적으로 21 working days라는데 의외로 3일 만에 통장으로 입금되었다(금요일 신청 화요일 입금). 만약의 경우 출국일까지 처리가 안되어도 출국은 가능하다.

제출 서류
• KSWP 9K AHL.
• 여권번호 페이지 사본.
• Termination letter.
• Member contribution verification form by employer.
• (실물 여권 지참)

OpenVINO python을 이용한 inference 예제

OpenVINO를 이용해서 TensorFlow(Keras)로 training한 모델로 추론(inference)을 수행하는 간단한 예제를 작성해 보았다.

TensorFlow model을 freeze하기

Training된 모델을 model optimizer에 넣기 전에 freeze시켜야 하는데, output_node_names를 입력하라는 오류 메세지가 계속 뜬다면 제대로 freezing을 수행했는지 확인해 보는게 좋다. 알아보기 쉽게 하기 위해 입출력 layer에 ‘name=’ parameter로 다음과 같이 이름을 지정해 주었다.

model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28), name='input'),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(10, activation='softmax', name='output')
])

그러면 layer의 이름들을 출력할 때 다음과 같이 나온다. 전체 MINST model training과 freezing 과정은 이 CoLab에 적어 두었으니 참조.

------------------------------------------------------------
Frozen model layers:
x
sequential/input/Const
sequential/input/Reshape
sequential/dense/MatMul/ReadVariableOp/resource
sequential/dense/MatMul/ReadVariableOp
sequential/dense/MatMul
sequential/dense/BiasAdd/ReadVariableOp/resource
sequential/dense/BiasAdd/ReadVariableOp
sequential/dense/BiasAdd
sequential/dense/Relu
sequential/dropout/Identity
sequential/output/MatMul/ReadVariableOp/resource
sequential/output/MatMul/ReadVariableOp
sequential/output/MatMul
sequential/output/BiasAdd/ReadVariableOp/resource
sequential/output/BiasAdd/ReadVariableOp
sequential/output/BiasAdd
sequential/output/Softmax
Identity
------------------------------------------------------------

모델 옵티마이저(mo-tf.py)

Freeze된 모델을 다운로드 받은 후에 TensorFlow용 model optimizer인 mo-tf.py를 실행 시키면 model을 나타내는 xml file과 weight값을 저장하는 bin file이 생성된다. 이 때 training된 모델은 입력 shape을 [-1, 28, 28]로 알고 있기 때문에 음수가 아닌 값을 넣어 달라는 에러가 생긴다. –input_shape parameter를 다음과 같이 적어준다.

/opt/intel/openvino_2021/deployment_tools/model_optimizer/mo_tf.py --input_model ./model/mnist_model/frozen_graph.pb  --input_shape [28,28]

OpenVINO를 이용한 inference

Model optimizer가 수행되었다면 이제 xml file을 이용해 model을 load하고 inference를 수행하면 된다. 다음은 Training 후 freezing과 model optimization이 수행된 XML file을 이용해서 inference를 수행하는 간단한 코드이다.

출력결과

$ python3 ./infer_mnist.py ./model/mnist_model/frozen/frozen_graph.xml

        Model path= ./model/mnist_model/frozen/frozen_graph.xml 
        Device= CPU
Accuracy: 0.9789 (hit: 9789/ miss: 211)