인기글
-
[Docker-compose] 실행 중인 컨테이너 로그 확인 방법
실행 중인 모든 서비스의 로그를 확인 하는 방법 docker-compose logs -f -t 실행 중인 특정 컨테이너 로그 확인 하는 방법 docker-compose logs -t -f logs 옵션 설명 -no-color : 단색 출력을 생성 -f, -follow : 로그 출력을 따라감 -t, -timestamps : 타임 스탬프 표시 -tail = "all" 각 컨테이너의 로그 끝부터 표시
-
[STM32] UART DMA 이슈
개요 STM32-NUCLEO-F401RE 기반으로 UART DMA 설정 방법을 설명 한다. CubeMX 환경 CubeMX UART2 환경 샘플 코드 및 이슈 아래와 같이 UART로 RX 데이터를 수신하면 HAL_UARTEx_RxEventCallback이 호출되고, 해당 Callback이 UART2로 부터 발생 되었으면 ConsoleUartRxEventCallBack이라는 Custom 함수를 호출하도록 구현 하였습니다. void ConsoleUartRxEventCallBack(uint8_t *data, uint16_t size) { if( TwRingBufferFreeSpace(&CONSOLE_RX_RING_BUFF_OBJ) < size) { TRACE_WARN("Buffer Overflow. Need F..
-
[Windows]$WINDOWS.~BT, $WINDOWS.~WS, $WinREAgent 폴더
$WINDOWS.~BT 폴더 $WINDOWS.~BT 폴더는 윈도우 7또는 윈도우 8에서 예전 무료 업그레이드 기간 동안 윈도우 10으로 업그레이드 했을 경우 이전 운영체제의 정보를 보관하기 위한 폴더이다. 일반적으로 이전 운영체제의 부팅 정보나 드라이버 정보, 파티션 정보등을 보관하고 있다. 이전 운영체제의 모든 파일들을 통채로 보관하고 있는 Windows.old 폴더와 $WINDOWS.~BT 폴더는 이전 운영체제로 복구하고자 할 경우에 가동되는 하나의 세트라고 볼 수 있다. $WINDOWS.~WS 폴더 윈도우7 업그레이드를 통해 윈도우10으로 버전을 올린 경우, 상위 윈도우 버전으로 업그레이드 시 필요하나 파일을 임시적으로 다운로드 하고 실행하는 임시 파일들을 보관 하고 있는 폴더이다. $WinREAg..
-
[C#, Winform]Password 입력 항목 구현
아래 사진과 같이 패스워드를 입력 했을 때, * 모양으로 암호화 하기 위한 기능 구현에 대해 설명 한다. private void checkBox_Vdv261VisiblePassword_CheckedChanged(object sender, EventArgs e) { if( checkBox_Vdv261VisiblePassword.Checked == true ) { textBox_V2icpPassword.PasswordChar = default(char); } else { textBox_V2icpPassword.PasswordChar = '*'; } }
-
[C#, Winform]checkedBoxList 항목 중 하나만 선택 하는 방법
아래 그림과 같이 CheckBoxList를 선택 했을 때, 다른 CheckBoxList들은 선택 해제 되기 원하는 경우, 이를 구현하기 위한 방법을 설명한다. 구현 방법 private void checkedListBox_CertificateType_ItemCheck(object sender, ItemCheckEventArgs e) { for (int i=0; i< checkedListBox_CertificateType.Items.Count; ++i) { if(i != e.Index) { checkedListBox_CertificateType.SetItemChecked(i, false); } } } Default로 0 Index 선택하기 public partial class Main : Form { pub..
-
HTTP 기본 인증 ( Basic authentication )
기본 인증(Basic authentication)의 예 서버가 사용자에게 인증 요구를 원할 때, 서버는 401 Unauthorized 응답과 함께 WWW-Authenticate 헤더를 포함해서 클라이언트에게 전송한다. 이 정보에는 클라이언트가 어떻게 인증해야 할지 포함되어 있고, 위 예시에서는 Basic 인증을 요청 한다. 해당 메시지를 받은 클라이언트는 서버에게 인증 메시지를 보낼 수 있다. 위 그림에서는 서버가 Basic 인증을 요청 했기 때문에, 인토딩(BASE64)된 비밀번호와 그 외 인증 파라미터들을 Authorization 헤더에 담아서 메시지를 보낸다. 성공적으로 완료되면 서버는 정상적으로 200 OK 코드를 반환한다. 추가적인 인증 알고리즘에 대한 정보는 Authentication-Info..
-
[윈도우]원격 데스크탑 오디오 설정 방법
회사에 있는 미니 PC와 블루트스 스피커를 이용하여, 회사 분위기 업을 위한 음악 DJ를 하고 있다. AnyDesk를 사용해서 원격으로 미니 PC를 제어 했는데, 너무 빈번한 접속으로 인해 AnyDesk 무료 버전 사용이 금지 되었다. 이런 이유로 미니 PC를 윈도우 원격 데스크탑으로 연결하니, 미니 PC의 소리가 블루투스 스피커에서 들리지 않는다. 부랴 부랴 원인을 찾으니 원격 데스크탑의 원격 오디오 설정 문제로 보인다. 해결 방법 해결 방법으로는 아래 그림과 같이 설정하면 된다.
-
[STM32] UART Baudrate Change 기능 구현
개요 STM32에서 UART를 사용하여 LCD를 제어 하는 어플리케이션을 구현 하는 중, UART Baudrate를 어플리케이션이 동작하는 동안 동적으로 변경해야 할 필요가 있어 해당 함수를 구현함 ( 참고로 해당 함수는 STM32F407VGTX 기반 보드에서 동작 ) UART Baudrate 변경 함수 STM32의 LL(Low-Level)라이브러리를 사용하여 구현 STM32F407VGTX MCU의 UART6는 PCLK2 클럭을 사용하여 아래와 같이 구현 UART번호에 따라 해당하는 PCLK클럭을 파라미터로 사용해야 함 UART_HandleTypeDef huart6; void HAL_UART6_SetBaudRate(uint32_t baudRate) { LL_RCC_ClocksTypeDef rcc_cloc..
최근 작성된 글
-
리눅스 usb-serial latency 값 줄이기
JIG에서 UART 메시지를 이용하여 Target MCU의 펌웨어 업데이트 하는 기능이 있습니다. Target MCU에 펌웨어 업데이트 시간을 줄이기 위해 MCU에서 지원하는 최대 baud_rate로 설정하고 리눅스에 설정되어 있는 usb-serial 장치의 latency_timer 값을 1로 설정 하였다. usb-serial/devices/latency_timer란 usb-serial 장치에서 데이터 전송을 얼마나 자주 할 것인지를 결정하는 설정 입니다. 이 값은 USB 버스에서 장치가 데이터 패킷을 보내는 빈도를 조절 합니다. 예를 들어, 'latency_timer'가 낮은 값으로 설정되어 있다면, 시스템은 더 자주 데이터를 보내게 되어 실시간성이 좋아 지지만 전체 처리량은 감소 할 수 있습니다. 반..
-
[OCPP Gateway] TW_OCPP
TW_OCPP란 전기차 충전소 관리 시스템(EV Charging Station Management System, 이하 Central System)과 충전소(Charge Point)간의 통신을 중계하는 장치 입니다. OCPP는 전 세계적으로 널리 사용되는 개방형 프로토콜로, 다양한 제조업체의 충전소와 관리 시스템 간에 호환성을 제공 합니다. 용어 정리 Central System Charge Point를 관리하고, 사용자가 해당 Charge Point를 사용할 수 있는지 여부를 인증하는 정보를 가지고 있는 중앙 시스템(Central System) Charge Point Charge Point는 전기차를 충전할 수 있는 물리적 시스템이다. Charge Point는 하나 이상의 충전 커넥터를 가짐 CSMS(Ch..
-
[django] 마이그레이션 롤백 하는 방법
기존 데이터를 유지하면서 django migrate로 마이그레이션 문제를 해결하기 위한 방법을 정리 합니다. 마이그레이션이 충돌되거나 문제가 발생 했을 때, 아래와 같은 명령으로 롤백 할 수 있습니다. 특정 migration_name에 지정된 스키마 형태로 마이그레이션 수행 $ python manage.py migrate [app_name] [migration_name] 만약 모든 마이그레이션을 롤백 하려면 아래 명령 수행 $ python manage.py migrate [app_name] zero
-
라즈베리파이, 오렌지파이 SD 카드 깨짐 문제
제품 개발을 하던 중, 보드의 전원이 갑자기 차단하면 보드의 SD 카드의 파일이 깨지는 현상이 있었습니다. 아마 보드 입장에서 프로그램이 동작하면서 파일 시스템의 파일들을 Write 하는 도중에 전원이 차단되어 파일이 깨지는 것으로 보입니다. 해결 방법 임시 해결 방법일 수 있으나, 아래와 같이 fstab 파일에 sync 옵션을 추가 하는 방법이 있습니다. $ sudo vi /etc/fstab UUID=73379811-91e8-4483-8aff-7d4bc3cca9f6 / ext4 defaults,sync,noatime,commit=600,errors=remount-ro 0 1 UUID=5BC1-359C /boot vfat defaults 0 2 tmpfs /tmp tmpfs defaults,nosuid ..
-
[쿠버네티스] CPU 점유율 메모리 사용량 확인, HPA 설정
쿠버네티스에서 사용하는 POD들의 CPU 점유율과 메모리 사용량을 확인 하는 방법과 Autoscaling을 위한 HPA 설정 방법을 정리 하였습니다. POD CPU 점유율과 메모리 사용량 확인 현재 사용 중인 pod의 CPU 점유율과 메모리 사용량을 확인하는 명령은 아래와 같습니다. CPU의 100m는 0.1 core를 의미 합니다. 메모리의 116Mi는 116Mbytes를 의미 합니다. kubectl top pods -n C:\>kubectl top pods -n testx-dev NAME CPU(cores) MEMORY(bytes) tx-msa-device-service-dev-8496684c75-bzph2 208m 116Mi tx-msa-fe-backend-service-dev-666555767d-..
-
[쿠버네티스] Helm 차트의 Resource와 Autoscaling
쿠버네티스에 Deployment를 위한 설정 중 Resource와 Autoscaling에 대해 정리 합니다. Resources 파드에 할당할 CPU와 메모리 리소스의 최소, 최대 한계를 정의 파드가 사용 할 수 있는 리소스의 양을 제한하여, 리소스의 과도한 사용을 방지하고, 다른 파드와의 리소스 경쟁을 최소화 하는데 도움을 줌 Resources 설정 예제는 아래와 같습니다. resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m" requests 파드가 시작될 때 요청하는 리소스의 양 이 값을 기반으로 쿠버네티스 스케줄러는 파드를 적절한 노드에 배치 limits 파드가 사용할 수 있는 리소스의 최대 한계 이 한계..
-
[pyinstaller] 바이러스, 트로이 목마 문제 해결
pyinstaller를 사용하여 패키징 할 때, 멀웨어로 인식되는 문제를 해결한 방법을 정리 하였습니다. 문제 pyinstaller를 사용하여 python 프로그램을 패키징 할 때 아래와 같은 에러가 발생 하고 Windows Depender에서는 트로이목마 파일이 있다면서 에러를 출력 하였다. File "c:\Workspace\venv_phoenixon\lib\site-packages\PyInstaller\building\build_main.py", line 1071, in main build(specfile, distpath, workpath, clean_build) File "c:\Workspace\venv_phoenixon\lib\site-packages\PyInstaller\building\bui..
-
[PySide2] TextEdit의 textChanged 이벤트를 받아 개행 문자 삭제
Example Code TextEdit에서 입력된 값이 변경될 때 마다 이벤트를 받아 개행문자가 있는지 확인하고 삭제하는 예제입니다. TextEdit에 수정된 문자열을 입력하면서도 이벤트가 발생 할 수 있기 때문에 아래와 같이 무한루프를 방지하기 위한 코드를 추가 하였습니다. from PySide2.QtWidgets import QApplication, QTextEdit, QVBoxLayout, QWidget class MyWidget(QWidget): def __init__(self): super().__init__() # 레이아웃 설정 self.layout = QVBoxLayout(self) # QTextEdit 위젯 생성 및 레이아웃에 추가 self.text_edit = QTextEdit() sel..