본문 바로가기

전체 글840

Windows ] 원격 데스크톱 연결 시 파일 전송하기 원격 데스크톱 연결에서 옵션 표시 클릭 로컬 리소스 - 로컬 장치 및 리소소스 - 자세히... 클릭 드라이브 - 연결할 드라이브 체크 이렇게 설정한뒤 원격 데스크톱 연결한다. 원격지 Host PC의 파일 탐색기 - 내 PC에 접근하면 Guest PC의 드라이브에 접근할 수 있다. 이후 파일 복사 붙여넣기를 통해 서로 전송하면 된다. 2023. 11. 17.
랜카드 2개 사용시 각기 다른 용도로 사용하도록 라우팅 경로 설정하기 랜카드를 2개 사용하더라도 외부망과 연결될 디폴트 게이트웨이는 1개만 지정 가능하다. 이때 아래 링크의 방법을 사용하여 랜카드1은 외부통신에 사용하고, 특정 IP 또는 특정 IP 대역에 접속시 랜카드2를 사용하도록 설정할 수 있다. 라우팅 테이블 출력 route print 인터페이스 메트릭(랜카드 우선순위) 설정 라우팅 값 추가 // 특정 IP에 접속시 특정 게이트웨이 사용 route add 111.111.111.111 mask 255.255.255.255 192.168.1.1 -p // 특정 IP 대역 접속시 특정 게이트웨이 사용 route add 111.111.111.0 mask 255.255.255.0 192.168.1.1 -p -p 옵션을 주면 재부팅을해도 적용된다. 참고 : https://www.. 2023. 11. 16.
공유기 간의 IP 충돌문제 해결 iptime 공유기는 기본적으로 내부 IP주소를 192.168.0.1로 사용하는데, 동일 외부망과 연결된 다른 공유기가 이미 해당 내주 IP주소를 사용중이라면 "내부 네트워크와 동일한 대역의 ip주소가 검출되었습니다"라는 오류가 뜬다. 이 경우 공유기 설정창에 들어가 고급 설정 - 내부 네트워크 설정 화면에서 내부 IP주소를 192.168.x.1 등 다른 주소로 설정해주면 해결된다. 2023. 11. 15.
MFC ] PeekMessage() / GetMessage()와의 차이 PeekMessage()와 GetMessage() 함수는 Windows 시스템 메시지 큐에서 메시지를 가져오는 함수이며, 동일한 4개의 매개변수를 갖는다. BOOL PeekMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg ); lpMsg: MSG 구조체에 대한 포인터로, 함수 호출 이후 메시지 정보가 채워진다. hWnd: 메시지를 확인할 창 또는 윈도우 핸들. 일반적으로 nullptr로 설정하면 어떤 윈도우에서든 해당 메시지를 확인한다. wMsgFilterMin: 확인할 메시지 범위의 최소 값으로 WinUser.h에 정의되어 있다. wMsgFilterMax: 확인할 메시지 범위의 최대 값으로 Wi.. 2023. 11. 14.
Win32 API ] 메시지 루프 C언어를 처음 배우고 콘솔환경에서 프로그래밍을 하다가 윈도우 프로그래밍을 시작하면 어디가 프로그램의 시작점이고 어디서부터 순차적으로 명령이 실행되는 것인지 알지 못해 당황하는 경우가 적지 않다. 콘솔과 달리 윈도우 환경에서는 사용자가 발생시키는 이벤트에 대한 메시지를 처리하는 방식으로 프로그램이 수행되고 이를 메시지 기반(또는 이벤트 기반) 프로그래밍이라고 한다. 메시지란? 사용자나 시스템에 의해 발생된 일체의 변화에 대한 정보를 말한다. ex. 마우스 왼쪽 버튼 클릭, 키보드 누름, 윈도우 최소화 등 이런 이벤트가 발생하면 윈도우 시스템에 존재하는 메시지큐에 메시지가 쌓이고, 애플리케이션에서는 윈도우시스템 메시지큐에서 메시지를 가져와서 특정 메시지 발생시 어떠한 일을 수행할 것인가에 대한 처리 루틴을 .. 2023. 11. 13.
클라이언트에서 서버로 ping은 되는데 connect가 안될 때, 방화벽 확인 서버의 방화벽 인바운드 규칙 목록을 확인해보도록 하자 방화벽 방화벽은 다양한 규칙 및 정책을 기반으로 네트워크 트래픽을 필터링하고 차단하는데 사용된다. 인바운드 규칙, 아웃바운드 규칙 방화벽 규칙은 인바운드와 아웃바운드 규칙으로 나뉜다. 인바운드 규칙은 외부에서 내부로 들어오는 트래픽을 제어하고 아웃바운드 규칙은 내부에서 외부로 나가는 트래픽을 제어한다. Windows Defender 방화벽의 기본설정은 보안을 위해 인바운드 트래픽은 모두 차단하고, 외부 서비스를 자유롭게 사용할 수 있게 하기 위해 아웃바운드 트래픽은 모두 허용하는 경향이 있다. 때문에 서버-클라이언트 통신이 안된다면 클라이언트 방화벽 아웃바운드 규칙보다 서버의 방화벽 인바운드 규칙을 먼저 들여다볼 필요가 있다. 방화벽 규칙 설정 요소 .. 2023. 11. 12.
Excalibur systems DAS-429UNET/RTx & Mystic ARINC-429 multi-channel adapter for USB or Ethernet equipped computers ARINC429 to USB 컨버터로 429통신장비를 테스트해볼 수 있는 제품이다.마이크로 5핀 usb 케이블이 2개 필요하다. 하나는 PWR에 연결하고, 하나는 데이터통신선인데 hub나 연장케이블을 쓰지 않고 PC에 바로 연결하도록한다.    홈페이지 회원가입 후 Software Tools(driver) 설치, 회원가입 시 비밀번호는 6자 미만으로 해야한다.  https://www.mil-1553.com/arinc-429-708-664 ARINC-429 / 708, 664p7 & Ethernet | Downloads | Support | Excalibur SystemsARINC.. 2023. 11. 11.
SPI interface ARINC 429 Transceiver IC, HI-35850 데이터시트 분석 HI-35850 datasheet 분석 TMS320F28388D DSP 사용 기준으로 작성되었다. Features ARINC specification 429 compliant3.3V or 5.0V logic supply operationDrop-in replacement for Holt’s HI-3585 with improved SPI host interface (12 MHZ)Read multiple receive FIFO messages with a single SPI Opcode (New)On-chip analog line driver and receiver connect directly to ARINC 429 busProgrammable label recognition for 256 labels32.. 2023. 11. 10.
인천 영종도, 실미도, 월미도 차박지(주차장) 정보 인천 영종도 왕산 해수욕장 주차 왕산 해수욕장 근처에 공영주차장 규모가 커서 주차 걱정은 없다. 단 해변과는 조금 떨어져있어 5분정도 걸어가야한다. 공영주차장의 주차요금은 1박에 4천원이고, 취사 가능한 사설 주차장을 찾는다면 근처에 1박에 만원하는 곳이 여럿 있다. 단, 해변을 바라보는 자리 경쟁은 치열한 것 같다. 맛집 을왕리 해수욕장 근처에 지금식당이란 곳에서 식사를 했는데 만족했다. 특히 이탈리안 해물탕이 봉골레 조개찜 느낌이나고 맛있었다. 사진은 네이버의 식당소개 페이지에서 가져왔다. 실미 유원지 입장, 주차, 캠핑 요금 예를들어 대인 2명에 텐트를 안치고 당일 주차만하면 7,000원이고, 텐트를 친다면 12,000원이다. 대인 2명이서 1박 캠핑을 한다면 16,000원 + 4,000원인 20,.. 2023. 11. 9.
TMS320F28388D ] SPI high-speed mode TMS320F2838x에서 지원하는 최대 SPI Clock speed는 기본적으론 12.5MHz인데 High-speed mode를 사용하면 50MHz까지 가능하다. High-speed mode를 사용하기 위한 제약사항과 사용 방법을 알아보자. 먼저 연결 시 특정 핀 구성을 따라야만한다. 칩에 SPI 모듈이 4개있는데 각 SPI는 아래 GPIO핀 먹스 옵션을 사용해야만 High-speed SPI를 사용할 수 있다. 그리고 capacitive load 때문에 High-speed mode는 single master에 single slave 연결만 지원한다. Reference : https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c.. 2023. 11. 8.
C#, WinForms ] tabControl의 탭 부분 색상 변경 tabControl의 DrawMode 속성을 OwnerDrawFixed로 설정하고 DrawItem 이벤트 핸들러를 연결 private void Form1_Load(object sender, EventArgs e) { //... tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed; tabControl1.DrawItem += new DrawItemEventHandler(tabControl1_DrawItem); //... } 이 부분은 GUI를 통해서도 가능하다. DrawItem 이벤트 핸들러는 각 탭 버튼을 그릴 때 호출된다. e.Index는 현재 탭 버튼의 인덱스로 현재 그려지고 있는 탭 버튼이 어떤 탭 페이지에 해당하는지 확인할 수 있다. e.Bounds는 현재 탭버.. 2023. 11. 7.
MFC ] 특정 컨트롤에 포커스 설정하기 1. 다이얼로그 생성시 특정 컨트롤을 포커스된 상태로 두는법 리소스뷰에서 서식 - 탭 순서를 클릭하면 현재 설정된 탭순서(Tab키 눌렀을 때 이동되는 순서)가 표시되는데 컨트롤을 순서대로 클릭하여 탭순서를 재배치 할 수 있다. 포커스된 상태로 둘 컨트롤을 첫번째 순서로 설정하면 된다. 2. 코드에서 포커스 옮기기 컨트롤 객체가 있다면 바로 .SetFoucs() 함수를 사용하면 되지만 컨트롤 객체가 없는 다이얼로그 상의 컨트롤을 조작하려면 GetDlgItem() 함수를 사용하면 된다. GetDlgItem() 함수는 컨트롤의 ID를 통해 다이얼 로그 상 컨트롤을 식별하는 데 사용되며 컨트롤의 핸들 CWnd*를 반환한다. 이 핸들을 사용해 컨트롤을 조작할 수 있다. CWnd* GetDlgItem(int nID.. 2023. 11. 6.
Git, TortoiseGit ] 커밋 메시지 수정하기 최근 커밋의 메시지 수정하기 1. 터미널로 하는 방법 git commit --amend -m '수정할 메시지' 2. Tortoisegit으로 하는방법 우클릭 commit을 누르고 Amend Last Commit 에 체크한 후 수정하면 된다. 이전 커밋의 메시지 수정하기 이때는 터미널 명령어를 사용하게 더 간편한다. 먼저 git rebase 명령에 대해서 알아야 한다. git rebase는 기존 커밋 히스토리를 변경하거나 정리하기 위해 사용되는 명령어인데 git rebase -i 와 같이 -i(interactive) 옵션을 사용하면 커밋 메시지를 수정할 수 있다. 1. 먼저 $ git reflog 명령 또는 GUI 툴로 메시지를 수정하려는 커밋이 몇번째 위치해있는지 확인한다. 2. 만약 수정하려는 커밋이 .. 2023. 11. 4.
윈도우에서 문자열 표현 형식, LPSTR, LPCSTR, LPWSTR, LPCWSTR, LPTSRT, LPCTSTR 윈도우에서는 문자열 처리를 위해 char*, wchar_t*, TCHAR*를 쓰기보다 다음과 같은 표현을 사용하고 있다. LP : Long Pointer의 약자 C : const의 약자 STR : string의 약자로 null terminated 된 캐릭터 배열을 의미한다. W : wide char의 약자로 유니코드를 의미한다. T : TCHAR의 약자로 프리컴파일 옵션에 따라 유니코드 문자(wchar_t) 또는 ANSI 문자(char)로 형변환되는 자료형을 의미한다. LPSTR : char* LPCSTR : const char* LPWSTR : wchar_t* LPCWSTR: const wchar_t* LPTSTR : TCHAR* LPCTSTR : const TCHAR* 2023. 11. 3.
시스템 종료와 관련된 윈도우 메시지 WM_QUERYENDSESSION, WM_ENDSESSION 다이얼로그 종료시 WM_CLOSE 메시지가 전달되지만, 다이얼로그 종료 전 윈도우가 먼저 종료된다면 WM_CLOSE 메시지는 전달되지 않는다. 따라서 응용프로그램이 윈도우 종료 시 수행해야할 작업이 있다면, WM_QUERYENDSESSION, WM_ENDSESSION 메시지 처리를 통해 가능하다. WM_QUERYENDSESSION 시스템 종료 확인 메시지. 윈도우에선 시스템 종료 또는 로그오프 시 WM_QUERYENDSESSION 메시지를 모든 윈도우에 전송하고, 응용프로그램은 이 메시지를 받아서 준비작업을 수행한 뒤 TRUE를 반환하거나 종료를 취소하기 위해 FALSE를 반환할 수 있다. 만약 모든 응용프로그램이 TRUE를 반환하면 WM_ENDSESSION 전송 단계로 넘어간다. WM_ENDSESSIO.. 2023. 11. 2.
아웃룩 메일 예약 발송 하는법 홈 - 새로 만들기 - 새 전자 메일 메일 편집창의 옵션 - 기타 옵션 - 배달 지연 속성 창에서 배달 옵션 - 다음 날짜 이후에 배달 체크, 예약 발송할 날짜와 시간 지정한 후 닫기 이후 보내기를 누르면 예약발송된다. 2023. 11. 1.
Win32 API ] 이벤트 / CreateEvent, SetEvent, ResetEvent Windows 프로그래밍에서 이벤트를 생성하고 다루는 함수인 CreateEvent, SetEvent, ResetEvent 와 이벤트 대기 함수인 WaitForSingleObject 를 사용해서 스레드 간 통신 또는 동기화를 수행할 수 있다. CreateEvent() CreateEvent 함수는 이벤트 객체를 생성한다. 이벤트 객체는 signaled, non-signaled 상태가 있는데 SetEvent 함수를 통해 이벤트 신호를 보내거나 WaitForSingleObject 함수를 통해 이벤트 신호를 받을 수 있다. HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCTSTR.. 2023. 10. 31.
RS-422, RS-485 통신에서 GND 연결은 필요한가? 결론: GND 연결없이도 통신이 될 순 있지만 잠재적 통신 오류나 IC 손상을 피하기 위해 GND 연결이 필요하다. https://www.sealevel.com/support/why-do-i-need-to-connect-a-ground-line-when-using-rs-422-or-rs-485-communications/ Why do I need to connect a ground line when using RS-422 or RS-485 communications? - Sealevel By connecting the ground wire, you avoid potential communication problems. Learn more. www.sealevel.com 2023. 10. 29.
윈도우 소켓 ] 소켓과 연결된 원격 호스트의 IP주소와 Port번호 가져오기, getpeername() getpeername() int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen); sockfd: 정보를 얻고자 하는 소켓의 파일 디스크립터 addr: 원격 호스트 주소 정보를 저장할 sockaddr 구조체 포인터. 주로 struct sockaddr_in 변수를 만들고 (struct sockaddr*)로 캐스팅하여 사용함 addrlen: 구조체의 크기를 나타내는 변수 주소, sizeof 연산자 사용 사용 예시. struct sockaddr_in serverAddr; socklen_t addrLen = sizeof(serverAddr); // 연결된 원격 호스트 정보 얻기 if (getpeername(sockfd, (struct sock.. 2023. 10. 28.
Git ] reset 옵션 차이, soft, mixed, hard git reset --soft : 커밋 기록을 지우고 인덱스(staging area)와 working directory의 파일시스템은 변경하지 않고 유지하려면 soft 옵션을 사용한다. git reset --mixed : HEAD는 해당 commit ID를 가르키고 인덱스도 초기화되지만 working directory는 그대로 유지한다. git reset --hard :인덱스를 지우고 working directory의 추적된 모든 파일을 reset할 커밋 당시의 상태로 되돌리려면 hard 옵션을 사용한다. $ git reset --hard ebbbca3 $ ls a.txt b.txt c.txt $ git reset --soft ebbbca3 $ ls a.txt b.txt c.txt d.txt e.txt .. 2023. 10. 27.
Win32 API ] waitForSingleObject, waitForMultipleObjects waitForSingleObject() 이 함수는 다양한 유형의 핸들에 대한 대기 및 감시를 지원한다. 핸들이 신호를 보낼 때까지 또는 타임아웃이 발생할 때까지 블록되며, 해당 이벤트가 발생하면 반환된다. DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds ); hHandle: 대기하려는 핸들(이벤트, 뮤텍스, 세마포어 등) dwMilliseconds: 밀리초 단위 대기 제한 시간, 0을 사용하면 바로 반환하고 INFINITE를 사용하면 무한 대기한다. DWORD 리턴값 WAIT_OBJECT_0(0): 대기가 성공적으로 종료된 경우. 대상 핸들이 스레드인 경우엔 스레드가 종료된경우, 대상 핸들이 뮤텍스인 경우엔 뮤텍스 락을 획득한 경우, 대상.. 2023. 10. 14.
.gitignore 자동생성 웹서비스 https://gitignore.io/ gitignore.io Create useful .gitignore files for your project www.toptal.com 위 사이트에서 개발환경과 언어를 입력하면 .gitignore 스크립트를 자동생성해준다. 2023. 10. 13.
Windows ] 계정 비밀번호 없이 원격 데스크톱 연결 사용하기 1. 먼저 Windows 키 + I 로 설정 - 계정 - 로그인 옵션 - 비밀번호 - 변경 을 눌러 현재 설정된 비밀번호 삭제 현재 암호를 입력하고 다음창에서 아무것도 누르지 않은채 다음을 누르면 비밀번호를 삭제할 수 있다. 2. Windows 키 + R - "secpol.msc" 입력 - 로컬 보안 정책 실행 3. 로컬정책 - 보안 옵션 - "계정: 콘솔 로그온 시 로컬 계정에서 빈 암호 사용 제한" 정책 더블 클릭 후 사용 안함으로 변경함 4. 이후 원격 데스크톱 연결에서 컴퓨터와 계정명을 입력하여 연결하고 비밀번호 없이 확인을 누르면 접속가능하다 참고로 연결설정 - 다른 이름으로 저장을 누르면 현재 로그온 설정을 .rdp 파일로 저장할 수 있는데 나중에 이 파일을 더블클릭해 쉽게 연결할 수 있다. .. 2023. 10. 12.
hrping ] ping(네트워크 응답시간) μs 단위로 측정하기 ping은 주어진 호스트에 ICMP (Internet Control Message Protocol) 패킷을 보내고 호스트가 이 패킷에 응답할 때까지 걸리는 시간을 측정하는 것을 말한다. ping 명령은 네트워크의 성능을 평가하고 호스트 간의 연결 상태를 확인하는 데 유용하게 사용될 수 있다. hrping은 고급 ping 도구로 윈도우의 ping 명령어보다 더 많은 옵션과 정보를 제공하는 프리웨어이다. 윈도우의 ping 명령은 응답시간이 milliseconds 단위로 표시되는데 hrping을 사용하면 microseconds 단위의 응답시간을 측정할 수 있다. 다운로드 링크 : https://www.cfos.de/en/ping/ping.htm Ping Utility hrPING v5.07 - cFos Sof.. 2023. 10. 11.
서해안 무료 차박지, 충남 서산 벌천포 해수욕장 가는길에 들른 왜목마을 해수욕장 여기는 벌천포 해수욕장보다 규모가 큰 해수욕장이라 사람이 많고, 조개가 잘잡히는지 해루질하는 사람도 꽤 보였다. 주차는 해안가에 하기는 어렵고 조금 떨어진 넓은 공영주차장에 할 수 있다. 벌천포 해수욕장에 도착해서 차박한 곳 토요일에 가니 차들이 많아서 거의 끝까지 들어가서야 주차할만한 공간을 찾았다. 저 너머로 보이는게 공단인데 저녁에 보니 꽤 감성있다. 아래 노란색으로 칠해둔곳이 주차할 수 있는 공간이다. 분리수거장과 화장실은 2군데 있어서 관리는 잘되는 느낌이었고, 샤워실은 있는데 운영을 하는지는 모르겠다. 모기가 많으니 모기기피제를 꼭 가져가야한다. 그리고 아래 사진의 벌말포차에서 닭갈비랑 해물라면을 먹었는데 정말 맛있었다. 특히 반찬이 많이나오고 한정식집 반찬 같.. 2023. 10. 10.
고해상도 타이머 QueryPerformanceFrequency, QueryPerformanceCounter 윈도우 운영체제에서 시스템의 경과 시간을 측정하는 데 사용되는 함수로 GetTickCount()와 GetTickCount64()가 있다. 이 함수는 시스템 부팅 이후 경과한 밀리초(ms)단위의 시간을 반환하며 주로 시간 간격을 측정하는 데 사용된다. GetTickCount() 함수는 32비트 부호없는 정수 타입으로 시간을 반환하며, 시스템이 부팅된 이후 49.7일이 지나면 오버플로우가 발생되므로 64비트 부호없는 정수로 시간을 반환하는 GetTickCount64()를 대신 사용하는 것이 권장된다. 다만 이 함수의 해상도는 일반적으로 10밀리초에서 16밀리초 범위의 시스템 타이머의 해상도로 제한되기 때문에, 조금더 고해상도 타이머가 필요하다면 QueryPerformanceFrequency(), QueryP.. 2023. 10. 9.
C++ ] mutex, lock_guard mutex mutex(뮤텍스)란 다중 스레드 환경에서 공유 데이터에 대한 동시 접근을 제어하기 위해 사용하는 동기화 기법 중 하나이다. mutual exclusion의 약자로 여러 스레드가 동시에 접근하지 못하도록 lock 하는 기능을 제공한다. mutex 사용 예시 #include #include #include using namespace std; mutex myMutex; int sharedVariable = 0; void incrementSharedVariableWithMutex(int iterations) { for (int i = 0; i < iterations; ++i) { myMutex.lock(); // 뮤텍스를 잠근다. // 공유 데이터에 대한 안전한 업데이트를 수행한다. ++share.. 2023. 10. 8.
C++ ] 인라인 함수 인라인 함수란? 보통 일반함수를 사용할 때는 함수의 선언은 헤더파일에 하고 정의는 소스파일에 분리한다. 하지만 함수를 헤더파일에 정의하고 inline 키워드를 사용하면 인라인 함수로 만들 수 있다. inline 키워드를 사용하면 컴파일러는 해당 함수를 호출하는 곳에 직접 인라인 함수 코드를 삽입한다. 이렇게 하면 보통 일반함수를 헤더에 정의했을 때 발생하는 오류인 함수 정의가 여러번 중복된다는 오류를 피할 수 있다. 인라인 함수 사용이 효과적인 경우 보통 인라인 함수는 함수 코드 크기가 작고 간단할 때 가장 효과적이다. 인라인 함수가 너무 크거나 빈번하게 호출되는 경우 해당 인라인 함수 코드가 함수 호출 부분에 삽입되기 때문에 코드 크기가 커져 메모리 사용량이 증가하고 캐시 효율성을 낮출 수 있다. 인라.. 2023. 10. 7.
C++ ] 연속된 메모리 공간에 저장되는 벡터의 메모리 재할당 빈도 C++의 std::vector는 동적 배열로 구현되어 있어, 내부적으로 메모리를 할당하고 관리하는데 요소를 연속된 메모리 공간에 저장하는 것을 보장한다. 때문에 데이터에 접근할 때 빠른 속도를 제공하고, C스타일 배열 접근 방식을 써서 효율적으로 사용할 수도 있다. vector에 요소를 계속 추가하면 vector는 내부적으로 메모리를 다시 할당하고 복사해 옮기는 작업을 수행하는데 이를 재할당이라고 한다. 재할당은 vector의 현재 capacity(용량)와 size(크기)를 비교하여 추가 요소를 수용하기 부족하다고 판단되는 경우 발생할 수 있다. 메모리 재할당은 비용이 높은 작업이고 벡터가 자주 재할당되면 성능이 저하될 수 있기 때문에 이를 최소화하기 위해 reserve()를 사용하여 용량을 예약하는 방.. 2023. 10. 6.
Visual Studio ] 코드 접기, 펼치기 단축키 Ctrl + M + O : 현재 파일 접기 Ctrl + M + L : 현재 파일 펼치기 Ctrl + M + P : 현재 파일 펼치고 outlining도 없애기 Ctrl + M + M : 현재 커서가 있는 섹션 접기 또는 펼치기 2023. 10. 5.