5/16/2021

ESP-IDF Doxygen과 기존 Doxygen 비교

1. Doxygen 기반의 Document 구성 


기존 Doxygen 관련구성 

Doxygen Getting Started (전체구조)

Code 와 Comment

Markdown 문법

Doxygen Formulas (수학공식)

Table(HTML)

Graphs 와 Diagrams (Graphviz가 별도 필요)


1.1 ESP32/ESP-IDF Doxygen 전체구성설명 

ESP32의 Doxygen 구성이 잘 되어있으며, 곧바로 Github에서 hosting하는 것으로 보아 Doxygen 구성이 너무 좋아 
일단 각 개별구성의 역할만 파악하기로 했다. 

  • ESP-IDF Document 구성 분석 전 확인사항 
  1. Espressif에서 사용하는 Doxygen Style Guide(Code Convention) 
  2. 문서에 필요 Package (Doxygen 이외 UML or Diagram)
  3. Manual의 전체설명방법 및 구성
어떻게 보면 가장 중요한 곳은 Code convention이라고 생각할 수 있으며, 코드의 가독성과 협업을 위해서 
최소한으로 지켜야할 규칙이자 프로그래머의 기본매너로, 팀단위 혹은 여러사람과 협업하여 같이 일할 경우, 
특히 중요하다. 하지만, 국내회사들은 크게 신경쓰지 않으며, 규칙조차 없거나, 무시되는 경우가 태반이다.
솔직히 개인적으로 그런회사들은 별로 좋아하지 않는다. 


  • ESP-IDF의 Doxygen 구성에 필요한 Package들 

** shpinx_rtd_theme -> sphinx_idf_theme으로 수정하여 사용
** recommonmark  (Markdown 문법관련 설정, 현재 Project 중단)


ESP-IDF의 경우, 아래와 같이 Github 기반으로 Markdown 문서기반으로 작성되어 운영되어진다. 
그리고, 전체 Manual 구성이 쉽게 관리하는 구조이며, 물론 ESP-IDF 같이 종합적으로 작성을 위해서 좀 더 많은 Python구성(Sphinx) 설치했겠지만, 
문서작성 후 관리를 비롯하여 Web으로 쉽게 Hosting 되어지기까지 해서 너무 매력적이다. 

물론 Github에서 Page를 통해 Web Host도 가능할 것이지만, 아래의 주소는 달라 정확히 어떻게 하는지 아직 모르겠다. 
Github을 통해서 하는 것 같지가 않다. 

ESP-IDF Manual 

ESP-IDF Doxygen 

GitHub 의 Sphinx 


1.2 Sphinx/Breathe/Cmake/Doxygen 구성

ESP-IDF의 Doxygen구성을 이해하려면 어쩔수 없이 각 Python Package 와 각 Package의 역할과 
이에 결과물 및 관련소스들의 기능을 분석을 해야 할 것 같다. 
그리고, Python의 Package가 어떻게 사용되는지를 알아야 할 것 같다. 
현재 ESP-IDF의 Python은 3.x가 아님 주의 

  • Sphinx/Breathe/Doxygen 구성
  1. Python의 Sphinx Package가 가장 Main으로 구성되어 문서관리 작성 
  2. Sphinx의 Manaul은 RST or Markdown or HTML 방식으로 작성되어 관리 
  3. 이외 소스의 API는 Doxygen으로 연결되어짐 
  4. 아래 그림에는 없지만, Diagram 과 UML도 연결해서 할 걸로 생각 

https://indico.cern.ch/event/716909/contributions/2946822/attachments/1821901/2980311/The_sphinx-breathe-doxygen_combo.pdf


  • Sphinx 의 기본설명
Python에서 제공해주는 Sphinx Package인데, 손쉽게 문서작성이 가능하며, 편할걸로 생각되어진다. 
우선 RST/Markdown 으로 기본문서를 설정하여 작성하여 이를 구성한다. 


  • Sphinx의  Input Files 및 설정 
  1. *.rst 파일 (Markdown 형식으로 구성)
  2. conf.py

ESP-IDF의 Sphinx 기본구조 
각 구조를 보면, Sphinx 기반으로 ESP 내부에서 많이 고쳐서 사용하고 있음을 대충 알수 있다.


  • Sphinx/Breathe/Cmake/Doxygen 종합구성사용법 
  1. Sphinx의 부가적으로  Doxygen을 쉽게 사용하기위해서 사용하는 것으로 보임
  2. Breathe는 Sphinx의 확장기능으로 사용
  3. Cmake 와 Sphinx는 연결이 가능하여 이를 쉽게 Doxygen으로 연결해주는 것으로 보임
  4. 아래의 예제도 Github와 연결하여 Hosting 함 


1.3 Sphinx 기반으로 작성된 사이트의 다른 예 

상위 구조를 좀 더 알기 위해서 ESP32 , ESP-IDF 이외에도 이와 비슷한 구조를 가진 사이트들을 좀 찾아보았다. 

  • Sphinx/Breathe/Doxygen 구성 예-A  
Sphinx 기반으로 구성한 사이트들이며, Doxygen 연결하여 사용한다. 
Manual 구성은 보면 거의 비슷하며, 좌측이 Index 우측 Manual 구성이다. 

GitHub 사이트 
상위 구성된 부분은 아래의 doc에서 sphinx에서 만들어지는 것으로 추측되어지며, 손쉽게 모두 Github 기반으로 문서작성을 한다. 

  • Sphinx 구성 예-B 
Sphinx 기반으로 구성된 사이트로 추측되어지며, 다만 Github와 연동을 찾지를 못했다. 
Manual 구성을 보면 상위 거의 비슷하지만, Doxygen는 미제공한다. 


1.4  ESP32/ESP-IDF Sphinx 구성분석 

ESP32 역시 상위 Sphinx/Breathe/Doxygen 기반으로 구성하지만, blockdiag를 별도로 추가하여 구성하였으며, 
Graphviz는 이용하지 않는 것으로 보인다. 
경우에 따라 본인들이 수정하여, 사용하는 것으로 보이며, 보면 볼수록 참 세련되게 잘 구성했다. 

요즘 내가 좋아하는 구성으로 Github기반으로 구성하며, 문서도 이 기반으로 하려고 한다. 

  • ESP-IDF Python Package Requirement 
ESP32/ESP-IDF의 Python Package 구성 대충 보면 Version이 낮을 걸로 사용 

  • Sphinx 의 설정 (conf.py 와 *.rst)
Sphinx의 theme에 설정되어지고  설정은 conf.py 와 index.rst 구조로 구성  

  • Sphinx의 index.rst 세부분석 
Sphinx는 RST파일이 거의 Main으로 관리되어지며, Markdown도 지원한다. 
index.rst 의 경우, 좌측 Menu구성은 index.rst의 toctree로 구성  


  • ESP32 Document 전구조 
  1. build_docs.py : doxygen 을 이용하여 document 생성
  2. generate_chart.py : doxygen과는 관련없으며, chart 생성
Github에 Host되기 때문에 docs가 어떻게 구성이 되었는지 전체구조기반으로 보자 

  • ESP32 Document 설명 (Comment Style Guide)
Comment Style Guide 중심으로 다시 한번 보도록 하고 Doxygen 생성된 부분을 확인 
  
  • ESP32 Doxyfile 설정 
Doxyfile 부분의 설정부분은 왜 헤더파일은 넣었는지는 나중에 다시 봐야할 것 같으며, 자동으로 *.c 파일은 되는 것으로 추측 

이부분의 Python 과 같이 분석해야 할 것 같으며, 각 API Manual을 어떻게 하는지 봐야함 

  • Python Blockdiag 활용
Block Diagram을 손쉽게 작성하는데, 편한 것 같으며, ESP32의 경우 이를 기반으로 쉽게표현

Blockdiag 의 기본예제

blockdiag 와 sphinx 설정 


  • ESP32의 Blockdiag의  실사용예제들 
Blockdiag의 ESP32내부에서 사용되어지는 실제 *diag 예제들이며, 구성을 잘해서 좋다. 

상위 diag파일들을 아래 사이트에서 직접 구성확인 

  • Eng/Markdown 으로 기본구성 (*.rst)
최종결과물로 Markdown 도 호환은 되는 것으로 보이며, 이것으로 전체화면구성(index.rst)

  • ESP32의 그림파일들 과 기타파일 


2. ESP32/ESP-IDF Sphinx Document 와 Github Host 

Github기반으로 진행되기때문에, 최종결과물을 HTML로 안해도 되는 것으로 보이며, 이를 *.rst로 구성해서 하는 것으로 보이는 것으로 추측
실제로 내가 직접 구성을 해보면서 이해해야 제대로 알것 같다.
더불어 *.rst 파일들을 보면 구성들이 재미있게 구성되어 있는데, 이에 관련된 Markdown 문법도 세부적으로 알아야 할것 같다. 
특히 toctree 구성부분과 sphinx의 theme은 더 자세히 분석을 해봐야할 것 같다. 

  • ESP32 Github 와 Web Host  (현재 추측)
  1. Github기반으로 Hosting 하는 것으로 생각되며, 직접 고치는 것도 허용하며 영어와 중국어만 지원가능 
  2. PDF 다운로드도 지원가능 
  3. docs/en/index.rst  가 Main로 연결 (여러개의 index 파일로 구성)


2.1 Github의 Host 지원기능 

  •  이전에 내가 Github 기반으로 Host 한 테스트 예제 
  1. Github에서 Host를 하기위해서는 docs 폴더가 별도구성
  2. Setting->Pages 에서 설정한 후 Theme 도 별도 설정

  • 일반적인 Github의 Theme 기반구성 
 index.md 기반으로  Main 구성후 별도_config.yml 설정 

index.md 기반으로  Main구성  _config.yml 설정  (Github의 Theme) 

  • 상위와 다른점은 직접 HTML기반으로 구성 
docs/index.html 기반으로  Main구성  (ESP32도 이런식으로 구성)

5/09/2021

IoT 의 이해와 IoT OS 비교

1. IoT(Internet of Thing) 의 이해 및 MCU/MPU 비교   

이전에는 IoT에 사용되어지는 Chip에 대해서 크게 관심을 가지고 있지 않았는데, 최근들어 IoT기반의 MPU/MCU를 사용을 해보고 
관련 RTOS도 사용해보니, 이 기능들이 AP기반의 Linux/Android 만큼 복잡성을 가지지는 않지만, 점점 복잡해지고 다양해지고 있는 것 같다.

마치 2000년 초반의 임베디드 시스템을 다시보는 것 같은데, 다른 점이 있다면, 그 때와 다르게, 각 Chip 업체 or Cloud 업체 중심으로 각각의 솔루션들을 제공해주고 있다. 

  • IoT(Internet of Thing) 용어 및 구조 
IoT를 보면 Connection 즉, Internet과 연결이 유선/무선으로 되어지며, 각 센서중심의 데이타를 선처리를 하여, 각 Cloud / Server 통신하여 제어되는 구조이다.

  • Edge Computing 
보통 Cloud 기반으로 돌아가는 추세이며, Edge 즉 IoT 수준의 MPU에서 선처리기능을 한 후 세부 처리는 Cloud에서 처리하는 방식이다.

  • IoT에서 많이 사용되어지는 MCU/MPU
보통 MCU는 Mircocontroller 이며, 주로 8bit/16bit 단순 기능 Micom 말했는데, MPU라는 용어가 나오면서 IoT에서 많이 사용되어진다.
특히 ARM은 Coretex-M 기반으로 저전력 DeepSleep 가능하며, 다양한 Peripheral 지원하는 좋은 MPU들이 출시되어지며, MCU 성능의 기능이 아니다.
크게 보면, ARM 과 ARM이 아닌 것으로 MPU들은 나뉘어지며, 보통 ARM 계열이 성능이 좋은 것으로 보이며 사용하기도 쉽다. 

MCU(MicroController Unit)

MPU(MicroProcessor Unit)

MCU vs MPU

  • WIFI 지원되는 MCU/MPU
요즘 MCU/MPU가 혼용되어사용되어지므로, 구지 크게 구분을 할 필요까지는 없을 것 같으며, WIFI가 지원되는 MCU들을 알아보자.

ESP32의 경우 Tensilica기반의 Core사용하며, 이는 Cadence에서 만들었음   


2. IoT 의 OS 비교 

IoT에서 많이 사용되어지는 OS는 다음 3개로 보이는 것 같으며, OS 없이도 구현이 가능하므로, OS 사용여부는 개발의 복잡성에 따라 달라질 것 같다. 
  1. Zephyr : 최근부터 뜨기 시작한 OS
  2. FreeRTOS: 오래전 부터 제공한 RTOS이지만, 많은 Library들이 부족함 
  3. Mbed: ARM에서 제공하는 OS로, 다양한 Library와 개발에서 많이 사용되어지는 것으로 보임 

2.1 Mbed OS

  • 기본소개 
Cortex-M ARM기반의 MCU/MPU기반으로 무료로 제공해주는 Open OS 뿐만아니라, IDE인 Studio도 제공을 해주고 있다. 
Mbed는 RTOS로 RTX와 RTOS API를 포함하고 있다고 하는데, RTX가 포함이 되어야 RTOS로 동작이 가능하다고 한다.

  • 장점
ARM기반의 MPU/MCU에 제공되어지기 때문에, 안정적인 OS를 사용가능하며, TLS와 같은 보안라이브러리도 무료로 제공해주고 있다. 

  • 단점
ARM이외 Core , RISK-V , Tensilica 등은 지원불가능 
RTX기능을 사용하지 않으면, RTOS기능을 사용못하는 것으로 보임 

RTX의 기능 

Mbed OS bare metal profile
RTX를 포함하고 있지않아서 RTOS가 아니라고 하며, 일반 OS라고 함 

라이센스는 Apache 2.0로 무료로 사용가능하며, ARM기반이라면 사용하기 편한 것으로 보인다.

Mbed OS 관련정보 


Mbed OS 6 전체구조


Mbed OS v6.0 Bare Metal 지원사항확인 

Mbed OS v6.0 Quick Guide

Mbed Source 

Coding Style (Code Convention)

Mbed CLI How to Install


2.2 FreeRTOS

  • 기본소개 
MCU/MPU기반으로 가장 많이 알려진 RTOS로 ARM이외에 다양한 Core들을 지원하고 있으다. 다만, 기능이 OS만 지원하다보니, 
실제사용시에는 각 Chip Vendor에서 별도로 제공해주지 않는 이상은 각 Library들이 많이 부족함을 느끼고 있다. 
물론 ESP32의 경우 FreeRTOS를 모든 것을 잘 제공해주고 있으며 안정적으로 잘 동작한다. 
하지만, 현재 AWS 기반으로 제공해주는 AWS FreeRTOS 와 ESP32 FreeRTOS는 조금 다르다. 
둘 다 OS이외에 부족한 Library들을 Mbed or OpenSource로 이를 보완하고 있지만, 
기본적으로 AWS FreeRTOS의 경우 동작이 좀 불안한 것 같다. 
최근에 AWS FreeRTOS 기반으로 프로젝트를 했는데, 메모리 Heap 관련문제가 꽤 있었는데, 점차 나아지리라고 생각되어진다.  

  • 장점
다양한 CPU 아키텍쳐를 지원가능하며, 여러 IDE에서 무료로 제공해주고 있어 많이 사용되어지고 있다. 
그리고 부족한 부분들은 현재 각 Chip Vendor 혹은 AWS에서 각 부분들을 채우고 보완하고 있다.

  • 단점
실제 RTOS로 사용해보면, 기존의 RTOS 사용해본사람도 사용하기가 쉽지 않으며, API도 좀 복잡하다. 
사실 복잡하기보다는 개인적으로 API가 별로 마음에 들지가 않는다. 
어쩔수 없이 사용하는 사람이 적응해야하는 법이지만, 항상 Vxwork나 다른 RTOS와 비교를 하게되어지는데, 개인적으로 API 별로다. 

  • FreeRTOS 공식 사이트와 소스 


  • AWS FreeRTOS 문서와 소스


2.3 Zephyr RTOS

  • 기본소개
현재 NXP기반으로 많이 사용되어지는 IoT OS로 가장 큰 장점의 Linux와 유사성이며 ARM이외의 Core 지원 될것이다. 
OS 개발이 Linux Foundation이어서 그런지 Device Tree도 지원되며, Linux 와 유사성이 많이 보이는 것으로 보인다. 
아직 사용해보지 못해서 뭐라고 말하지는 못하겠지만, 왠지 이 중심으로 갈 것 같기도 하다.

  • 장점
현재 사용해보지 못했지만, 사이트와 Manual만 보는 것만으로도, 앞으로 가장편하게 사용하게될 OS가 될 것 같으며, 다양한 기능들을 제공해줄 것 같다.
또한 FreeRTOS처럼 다양한 Core를 지원해주고 있어, 앞으로 대세가 이것으로 되지 않을까하고 생각한다.

  • 단점
아직 사용해보지 못해서 잘모르겠으나, FreeRTOS처럼 내부 버그가 많을 것으로 생각되어진다. 왜냐하면 예전의 Linux 초기가 많이 생각이 나서 그런부분은 사용자가 많이 고쳐가며 구현해야 할 것같다. 


Zephyr Project 공식사이트 와 Source 

NXP의 Zephyr 관련사이트 

Zephyr Project 

ESP32 Zephyr 

5/02/2021

ESP32 Backtrace 와 addr2line

1. ESP32의 Monitor 기능 

esp32 개발환경에서 제공해주는 idf.py -p /dev/ttyUSBx monitor , 즉 monitor 기능은 기본적으로 gdb option을 포함하고 있다. 
그래서, abort 시 backtrace가 가능한데, 이때 사용하는 기능이 addr2line 기능이며, 이는 각 Stack의 Address를 Code의 위치를 찾는다. 
기본기능으로 아래와 같이 addr2line을 이용하여 위치를 찾아주며, 이 정보는 stderr로 표시해주고 있다. 

  • ESP32가 Exception 이 발생할때 아래와 같이 Dump와 Backtrace 정보출력   
Guru Meditation Error of type StoreProhibited occurred on core  0. Exception was unhandled.
Register dump:
PC      : 0x400f360d  PS      : 0x00060330  A0      : 0x800dbf56  A1      : 0x3ffb7e00
A2      : 0x3ffb136c  A3      : 0x00000005  A4      : 0x00000000  A5      : 0x00000000
A6      : 0x00000000  A7      : 0x00000080  A8      : 0x00000000  A9      : 0x3ffb7dd0
A10     : 0x00000003  A11     : 0x00060f23  A12     : 0x00060f20  A13     : 0x3ffba6d0
A14     : 0x00000047  A15     : 0x0000000f  SAR     : 0x00000019  EXCCAUSE: 0x0000001d
EXCVADDR: 0x00000000  LBEG    : 0x4000c46c  LEND    : 0x4000c477  LCOUNT  : 0x00000000

Backtrace: 0x400f360d:0x3ffb7e00 0x400dbf56:0x3ffb7e20 0x400dbf5e:0x3ffb7e40 0x400dbf82:0x3ffb7e60 0x400d071d:0x3ffb7e90

  • addr2line이용하여 추적가능 
Guru Meditation Error of type StoreProhibited occurred on core  0. Exception was unhandled.
Register dump:
PC      : 0x400f360d  PS      : 0x00060330  A0      : 0x800dbf56  A1      : 0x3ffb7e00
0x400f360d: do_something_to_crash at /home/gus/esp/32/idf/examples/get-started/hello_world/main/./hello_world_main.c:57
(inlined by) inner_dont_crash at /home/gus/esp/32/idf/examples/get-started/hello_world/main/./hello_world_main.c:52
A2      : 0x3ffb136c  A3      : 0x00000005  A4      : 0x00000000  A5      : 0x00000000
A6      : 0x00000000  A7      : 0x00000080  A8      : 0x00000000  A9      : 0x3ffb7dd0
A10     : 0x00000003  A11     : 0x00060f23  A12     : 0x00060f20  A13     : 0x3ffba6d0
A14     : 0x00000047  A15     : 0x0000000f  SAR     : 0x00000019  EXCCAUSE: 0x0000001d
EXCVADDR: 0x00000000  LBEG    : 0x4000c46c  LEND    : 0x4000c477  LCOUNT  : 0x00000000

Backtrace: 0x400f360d:0x3ffb7e00 0x400dbf56:0x3ffb7e20 0x400dbf5e:0x3ffb7e40 0x400dbf82:0x3ffb7e60 0x400d071d:0x3ffb7e90
0x400f360d: do_something_to_crash at /home/gus/esp/32/idf/examples/get-started/hello_world/main/./hello_world_main.c:57
(inlined by) inner_dont_crash at /home/gus/esp/32/idf/examples/get-started/hello_world/main/./hello_world_main.c:52
0x400dbf56: still_dont_crash at /home/gus/esp/32/idf/examples/get-started/hello_world/main/./hello_world_main.c:47
0x400dbf5e: dont_crash at /home/gus/esp/32/idf/examples/get-started/hello_world/main/./hello_world_main.c:42
0x400dbf82: app_main at /home/gus/esp/32/idf/examples/get-started/hello_world/main/./hello_world_main.c:33
0x400d071d: main_task at /home/gus/esp/32/idf/components/esp32/./cpu_start.c:254 

Backtrace는 2개의 Address로 구성되며, PC와 A1, 즉 , Arg라고 짐작 (세부내용은 ABI 참조해야함)

  • addr2line 이용하여 소스위치확인
$ xtensa-esp32-elf-addr2line -pfiaC -e build/PROJECT.elf ADDRESS  // 상위 Address 입력하면 각 소스위치파악 


  • ESP32 Exception이 발생할 경우 순서도 


GDB-Stub 사용

ESP32 Exception, Fatal Errors

monitor 관련내용

ESP32용 Backtrace Shell Script 


1.1 backtrace 와 addr2line 기본사용법 

backtrace는 Stack Trace라고도 하며, 기본적으로 함수의 Call Stack을 추적하는 방법을 말하며, 주로 사용되어지는 함수가 backtrace기능이다. 
이때 보조적으로 Code의 위치를 찾아주는 기능이 addr2line tool 이며, 이를 이용하여 쉽게 어디서 호출되어지는 분석이 가능하다. 

  • 기본설정 
GCC 로 Compile 시 반드시 -g 옵션 과 -rdynamic (동적 Library)

  • backtrace 함수와 addr2line 사용법 


1.2 addr2line 이용

ESP32는 기존의 Backtrace처럼 사용하지 않는 구조로 보이며, Backtrace가 아래와 같이 나오면 addr2line을 이용하여 쉽게 Source 위치 파악은 가능하다  

Backtrace:0x40090677:0x3ffe3710 0x40090c89:0x3ffe3730 0x400955fa:0x3ffe3750 0x400da8f2:0x3ffe37c0 0x400da9f0:0x3ffe37e0 0x400ec484:0x3ffe3800 0x400ec516:0x3ffe3840 0x400ec651:0x3ffe3870 0x400ec6e4:0x3ffe38a0 0x400daa13:0x3ffe38c0 0x400db275:0x3ffe38f0 0x400db4fa:0x3ffe3920 0x400d8deb:0x3ffe3a70 0x400d978c:0x3ffe3a90 0x40090cf9:0x3ffe3ac0 

$ xtensa-esp32-elf-addr2line 0x40090677 -e ./build/demos  
$ xtensa-esp32-elf-addr2line 0x40090c89 -e ./build/demos 

1.3 이외 Tool 사용 

  • Linux Kernel 처럼 map 분석 
Symbol Table 과 Linker Script Section 과 Library 비롯하여 모든 기본정보 확인
$ cat ./build/demos.map    
// Discarded input sections     (Linker Scirpt 의 Section 과 상대주소 파악 ) 
// Memory Configuration         (실제 Memory 영역과 Attribute로 x/r/w 확인 ) 
// Linker script and memory map (Linker Scirpt 와 같이 절대주소 파악 )
// Cross Reference Table        (Symbol Table로 Symbol의 사용여부 확인가능)

  • readelf 로 Library 분석 및 ELF 분석 
각 Library 및 ELF Format 관련정보 확인 
$ xtensa-esp32-elf-readelf -a ./build/esp-idf/app_trace/libapp_trace.a    //Build 내에서 사용하는 ESP-IDF Library 분석 (-a 전체정보)  
$ xtensa-esp32-elf-readelf -h ./build/esp-idf/app_trace/libapp_trace.a                           //ELF 기본정보확인 (Endian/Entry Point/Machine)   
$ xtensa-esp32-elf-readelf -s ./build/esp-idf/app_trace/libapp_trace.a | grep function           //library Symbol Table 확인   
$ xtensa-esp32-elf-readelf -S ./build/demo                          //Linker Script Section 확인   

5/01/2021

Coding Interview 자료 수집

1. Cracking Coding Interview 자료 수집 

매번 코딩연습을 한다고만 생각만 하고, 잘 실행을 하지 않았는데, 이번에 다시 외국 좋은회사에서 제안이 와서 다시 인터뷰를 준비한다. 
매번 자료구조 와 알고리즘 부분의 이해는 하지만, 구현방법을 까먹고 하는데, 나의 머리가 좀 나쁜것 같으며, 연습을 지속적으로 계속해야 할 것으로 보인다.


Cracking-Coding-Interview 6판 

관련예제들 

이 책이 벌써 6판이라니, 세월 진짜 빨리 간다. 

1.1 Google Interview 및 다른 Interivew 자료수집

아참 구글은 이번에는 이제 초대장에서 Google Hangout이 아닌 Google Meet를 이용하여 보기 시작하였는데, 이전 인터뷰와 다르게 좀 신선한 것 같다. 
이제 구글 인터뷰는 포기하기로 했으며, 머리만 아퍼서 간단히 영어인터뷰만 보고 추가 인터뷰는 포기했다. 
(정확히 말하면, 마침 포기하는데, 갑자기 진행을 안한다고 한다)

더불어 외국계 유명헨터헌터 소개로 다른 반도체회사들도 인터뷰를 진행했는데, 직접 인터뷰 혹은 요즘 MS Teams를 이용하여 인터뷰를 보는데, 
이제 영어면접은 거의 없어지는 것 같은 추세로 가는 것으로 보인다.

요즘따라 가는회사마다 회사경영이 불안하며, 인터뷰를 붙고도 여러번을 고민을 하는데, 가급적이면, 자택근무가 가능한 곳이면 너무 좋겠다.
최근들어 제주도에 살면서 근무하는 엔지니어를 지켜보았는데, 개인적으로 너무 부러우며, 나도 자택근무로 근무하는 곳이면 너무 좋겠다.

Global Plaform 회사 인터뷰자료 


2. Code interview 연습사이트 

  • Coderbyte
최근에 갑자기 Interview 보자고 해서 알게된 사이트로 Hackerrank와 좀 다른 구성을 가지지만, 무료의 기능이 한정적임 

Google Interview Kit 


  • Hackerrank 변화 
한참 동안 안 찾았는데, 최근에 가보니 사이트가 너무 많이 변경이 되어 관련부분들을 별도로 다 링크함 

Hackerrank의 Interview 준비 Kit 제공 

Hackerrank의 Contests로 여러 Interview 

ESP32 OpenOCD 및 Python 관리

1. ESP32 OpenOCD 와 GDBGUI 재시도

OpenOCD를 이용하여, TCL/GDB를 연결하여 기본동작이 되는 것 까지는 확인이 되지만, 나의 목적인 GDBGUI를 사용하는 것에는 실패를 하였기 때문에, 
이부분에 대해서 다시 시도를 함 

이전 ESP32 OpenOCD 와 GDB 구성 참조 

ESP32 OpenOCD JTAG 관련내용 
 

이전에 이해가 되지 않는 부분이 gdb를 실행하는데, python library 2가 필요로 하는 것이 이해가 되지 않았다. 
그래서, 현재 Ubuntu 20.04에서 Python3.8 사용하지만, 별도로 Python2.7기반으로 변경한 후 다시 virtual env를 만들어 테스트를 해보려고 한다. 


1.1  Python의 Version 관리 

Python은 Python2.7과 Python 3.x Version으로 나누어 볼수 있겠으며, pip2 와 pip3도 별도로 나누어 볼 수 있겠다. 
동시에 사용하고자 한다면, 별도로 각각 설치를 해주고,  /usr/bin/python에 link를 만들어주면된다.

  • Ubuntu 20.04의 Python 현재 상태 확인 
우선 나의 Python의 상태를 확인을 해보면, python3만 지원되며, python은 링크가 없다. 

$ ll /usr/bin/py*
-rwxr-xr-x 1 root root    7813  3월 13  2020 /usr/bin/py3clean*
-rwxr-xr-x 1 root root   12120  3월 13  2020 /usr/bin/py3compile*
lrwxrwxrwx 1 root root      31 12월 15 22:18 /usr/bin/py3versions -> ../share/python3/py3versions.py*
lrwxrwxrwx 1 root root       8 12월 15 22:18 /usr/bin/pydoc3 -> pydoc3.8*
-rwxr-xr-x 1 root root      79  1월 28 00:41 /usr/bin/pydoc3.8*
lrwxrwxrwx 1 root root      12 12월 15 22:18 /usr/bin/pygettext3 -> pygettext3.8*
-rwxr-xr-x 1 root root   21535  1월 28 00:41 /usr/bin/pygettext3.8*
-rwxr-xr-x 1 root root     372  4월  6  2020 /usr/bin/pyjwt3*
lrwxrwxrwx 1 root root       9 12월 15 22:18 /usr/bin/python3 -> python3.8*
lrwxrwxrwx 1 root root      16  3월 13  2020 /usr/bin/python3-config -> python3.8-config*
-rwxr-xr-x 1 root root     384  3월 28  2020 /usr/bin/python3-futurize*
-rwxr-xr-x 1 root root     388  3월 28  2020 /usr/bin/python3-pasteurize*
-rwxr-xr-x 1 root root 5486384  1월 28 00:41 /usr/bin/python3.8*
lrwxrwxrwx 1 root root      33  1월 28 00:41 /usr/bin/python3.8-config -> x86_64-linux-gnu-python3.8-config*
lrwxrwxrwx 1 root root      10  3월 13  2020 /usr/bin/pyvenv -> pyvenv-3.8

$ python  //python command로는 동작안되며, python3 만 되며, 아래와 같이 별도의 package를 설치하라고 함

Command 'python' not found, did you mean:

  command 'python3' from deb python3
  command 'python' from deb python-is-python3
  
$ pip

Command 'pip' not found, but there are 18 similar ones.  
  
$ pip3 list
Package                 Version             
----------------------- --------------------
appdirs                 1.4.4               
apturl                  0.5.2               
bcrypt                  3.1.7               
blinker                 1.4                 
Brlapi                  0.7.0               
Brotli                  1.0.9               
certifi                 2019.11.28          
chardet                 3.0.4               
Click                   7.0                 
colorama                0.4.3               
command-not-found       0.3                 
cryptography            2.8                 
cupshelpers             1.0                 
dbus-python             1.2.16              
defer                   1.0.6               
distlib                 0.3.1               
distro                  1.4.0               
distro-info             0.23ubuntu1         
dnspython               2.1.0               
duplicity               0.8.12.0            
entrypoints             0.3                 
eventlet                0.25.2              
fasteners               0.14.1              
filelock                3.0.12              
Flask                   0.12.5              
Flask-Compress          1.9.0               
Flask-SocketIO          2.9.6               
future                  0.18.2              
gdbgui                  0.14.0.2            
gevent                  1.5.0               
gevent-websocket        0.10.1              
greenlet                0.4.16              
httplib2                0.14.0              
idna                    2.8                 
itsdangerous            1.1.0               
Jinja2                  2.11.3              
keyring                 18.0.1              
language-selector       0.1                 
launchpadlib            1.10.13             
lazr.restfulclient      0.14.2              
lazr.uri                1.0.3               
lockfile                0.12.2              
louis                   3.12.0              
macaroonbakery          1.3.1               
Mako                    1.1.0               
MarkupSafe              1.1.0               
monotonic               1.5                 
netifaces               0.10.4              
oauthlib                3.1.0               
olefile                 0.46                
paramiko                2.6.0               
pexpect                 4.6.0               
Pillow                  7.0.0               
pip                     20.0.2              
pipx                    0.12.3.1            
protobuf                3.6.1               
pycairo                 1.16.2              
pycups                  1.9.73              
pygdbmi                 0.10.0.0            
Pygments                2.8.1               
PyGObject               3.36.0              
PyJWT                   1.7.1               
pymacaroons             0.13.0              
PyNaCl                  1.3.0               
pyRFC3339               1.1                 
python-apt              2.0.0+ubuntu0.20.4.3
python-dateutil         2.7.3               
python-debian           0.1.36ubuntu1       
python-engineio         3.14.2              
python-socketio         4.6.1               
pytz                    2019.3              
pyxdg                   0.26                
PyYAML                  5.3.1               
reportlab               3.5.34              
requests                2.22.0              
requests-unixsocket     0.2.0               
screen-resolution-extra 0.0.0               
SecretStorage           2.3.1               
setuptools              45.2.0              
simplejson              3.16.0              
six                     1.14.0              
systemd-python          234                 
ubuntu-advantage-tools  20.3                
ubuntu-drivers-common   0.0.0               
ufw                     0.36                
unattended-upgrades     0.1                 
urllib3                 1.25.8              
usb-creator             0.3.7               
virtualenv              20.4.3              
wadllib                 1.3.3               
Werkzeug                0.16.1              
wheel                   0.34.2              
xkit                    0.0.0   
  
$ which python

$ sudo apt install python2 //별도 python2.7 설치 후 호환성때문이지 다시 확인     

$ ll /usr/bin/py*
-rwxr-xr-x 1 root root    7813  3월 13  2020 /usr/bin/py3clean*
-rwxr-xr-x 1 root root   12120  3월 13  2020 /usr/bin/py3compile*
lrwxrwxrwx 1 root root      31 12월 15 22:18 /usr/bin/py3versions -> ../share/python3/py3versions.py*
-rwxr-xr-x 1 root root    4124  3월 13  2020 /usr/bin/pyclean*
-rwxr-xr-x 1 root root   11895  3월 13  2020 /usr/bin/pycompile*
lrwxrwxrwx 1 root root       8  3월 13  2020 /usr/bin/pydoc2 -> pydoc2.7*
-rwxr-xr-x 1 root root      79  3월  8 22:02 /usr/bin/pydoc2.7*
lrwxrwxrwx 1 root root       8 12월 15 22:18 /usr/bin/pydoc3 -> pydoc3.8*
-rwxr-xr-x 1 root root      79  1월 28 00:41 /usr/bin/pydoc3.8*
lrwxrwxrwx 1 root root      12  3월 13  2020 /usr/bin/pygettext2 -> pygettext2.7*
-rwxr-xr-x 1 root root   22082  3월  8 22:02 /usr/bin/pygettext2.7*
lrwxrwxrwx 1 root root      12 12월 15 22:18 /usr/bin/pygettext3 -> pygettext3.8*
-rwxr-xr-x 1 root root   21535  1월 28 00:41 /usr/bin/pygettext3.8*
-rwxr-xr-x 1 root root     372  4월  6  2020 /usr/bin/pyjwt3*
lrwxrwxrwx 1 root root       9  3월 13  2020 /usr/bin/python2 -> python2.7*
-rwxr-xr-x 1 root root 3674216  3월  8 22:02 /usr/bin/python2.7*
lrwxrwxrwx 1 root root       9 12월 15 22:18 /usr/bin/python3 -> python3.8*
lrwxrwxrwx 1 root root      16  3월 13  2020 /usr/bin/python3-config -> python3.8-config*
-rwxr-xr-x 1 root root     384  3월 28  2020 /usr/bin/python3-futurize*
-rwxr-xr-x 1 root root     388  3월 28  2020 /usr/bin/python3-pasteurize*
-rwxr-xr-x 1 root root 5486384  1월 28 00:41 /usr/bin/python3.8*
lrwxrwxrwx 1 root root      33  1월 28 00:41 /usr/bin/python3.8-config -> x86_64-linux-gnu-python3.8-config*
lrwxrwxrwx 1 root root      10  3월 13  2020 /usr/bin/pyvenv -> pyvenv-3.8
lrwxrwxrwx 1 root root      29  3월 13  2020 /usr/bin/pyversions -> ../share/python/pyversions.py*

$ sudo ln -s /usr/bin/python2 /usr/bin/python

python package