2021의 게시물 표시

한컴 한글 문서 작성 시 곧은 따옴표 고정하기

이미지
 한컴2020 프로그램을 사용하면 한글과 영어 입력에 따라 따옴표의 모양이 다릅니다.  한글, 영문 상관없이 모두 곧은 따옴표로 나오게 하기 위해서는 입력기 환경 설정에서 현재 글자판, 제 1 글자판, 제 2 글자판 을 '윈도우 입력기'로 설정하면 됩니다.  해당 창 단축키는 Alt + F2 입니다.

Node.js로 윈도우 바로가기 실행

 Node.js의 child_process.spawn을 사용해 외부 프로그램을 실행할 때 실행파일의 바로가기를 사용하려고 합니다.  하지만, 바로가기 파일을 그냥 호출하면 오류가 발생합니다. 그때는 아래 코드와 같이 'shell: true'옵션을 설정해야 합니다. // Node.js v14.x const { spawn } = require('child_process'); spawn('C:/Users/my/Desktop/Program.lnk', args, { shell: true });  윈도우 바로가기의 파일 확장자인 '.lnk'를 꼭 붙여야 하며, 실행시 인자값이 없는 경우는 args에 null을 넣으면 됩니다.  관련된 질문 페이지 :  https://stackoverflow.com/questions/41497183/spawning-a-lnk-windows-shortcut-with-node-js-gives-unknown-error  child_process.spawn 공식 문서 :  https://nodejs.org/dist/latest-v14.x/docs/api/child_process.html#child_process_child_process_spawn_command_args_options

브룩(Brook) 어댑터 배터리 교환

이미지
 브룩(Brook) 어댑터를 닌텐도 스위치에 사용하고 있습니다.  마이크로 5핀을 사용하는 xbox one 컨트롤러에 결합하여 사용하는 물건입니다.  오래된 물건이라 며칠 전부터 충전 선을 뽑으면 1~2분 있다가 전원이 나가버리더군요.  인터넷을 검색하니 배터리 교환이 가능한 것 같아서 저도 시도해 봤습니다.  분해는 간단해서 양옆에 나사만 돌리면 됩니다.  조심스럽게 분해를 하면, 기존 배터리가 나옵니다. 적힌 내용은 IP652540 3.7V 800mAh 2.96Wh LB  입니다.  크기를 재보니 무언가 어중간한 수치입니다. 검색하면서 보니까 이름에 있는 652540이라는 숫자가 정해진 치수 같더군요.  65는 두께로 0.1mm 단위로 6.5mm, 25는 1mm 단위로 25mm, 40은 1mm 단위로 40mm입니다.  배터리의 어디를 가로로 봐야 하는지 모르겠지만 전선이 붙어있는 기판이 있는 부분을 위로 향하고 봤을 때, 두께 6.5mm, 가로 25mm, 세로 40mm 배터리를 찾으면 됩니다.  요즘은 취미로 작은 장치를 만드는 사람들이 많아서 그런지 ‘리튬폴리머 배터리’를 검색하면 다양한 크기를 팔고 있더군요.  하지만 해외는 같은 크기가 있는 것 같은데, 국내는 찾지 못했습니다.   해외 물건은 배송 기간도 그렇고, 뭔가 불안하기도 해서 용량은 작아도 국내에서 비슷한 크기의 배터리를 찾아봤습니다.  좀 찾아보니 602540 550mAh 제품을 찾았습니다. ( https://smartstore.naver.com/powerland/products/2466362502 )    3.7V 전압은 같고,  550mAh라 기존에 있던 800mAh보다 40% 정도 용량이 작네요.  250쯤이라고 생각했는데, 지금 보니 무시할만한 수치는 아니군요. 그래도 그냥 샀습니다. 비슷한 크기에 다른 용량은 못 찾았고, 국...

PHP에서 종료 태그를 빼는 이유

 '<?php'로 시작하는 PHP 파일에서 종료 태그인 '?>'를 생략하는 것은 단순히 편하기 때문이 아닐까 생각했습니다.  문득 정확한 이유가 있을까 찾아보니, 좀 더 명확한 이유가 있었습니다.  종료 태그를 넣은 다음에 실수로 공백이나 줄 바꿈이 추가되면 뜻하지 않은 문제가 발생할 수 있기 때문에 이를 방지하기 위함이라고 합니다.

PHP에서 JSON 변환시 빈 객체 만들기

 PHP에서 JSON형식으로 '{}'값을 반환해야 하는 상황이 생겼습니다.  지금까지 연관배열을 사용해 JSON을 만들었는데, 아무것도 들어있지 않은 값은 '[]' 형태의 배열이 반환됩니다.  찾아보니 JSON으로 변환 할 때 '{}'를 만들기 위해서는 'new stdClass()'로 빈 객체를 넣어주라고 합니다. $empty = []; echo json_encode($empty); // "[]" $empty = new stdClass(); echo json_encode($empty); // "{}"

윈도우에서 권한 문제로 폴더가 삭제되지 않을 때

검색해서 찾은 페이지 링크. https://syuda.tistory.com/146

PHP로 카페24 앱을 만들었을 때 hmac 검증하기

 PHP를 사용하여 카페24 쇼핑몰에 사용되는 앱을 만들고 있습니다.  앱의 관리자 페이지를 접근할 때 사용자 인증을 해야 하는데, 카페24의 페이지를 거쳐서 접근하는 사람만 앱의 관리 페이지에 접근할 수 있게 하는 방식입니다.  쉽게 말해서 카페24가 제공하는 버튼을 눌러 들어와야 내가 만든 서버에 로그인이 됩니다. 때문에 사용자가 정확한 경로로 접근 했는지 확인을 해야 합니다. 그 방법으로는 요청 파라미터 값으로 들어오는 hmac 값을 검증하는 게 있습니다. ( 개발자 문서 )  PHP를 사용해 검증하는 소스를 다음과 같이 만들었습니다. $hmac = $_GET['hmac']; $key = [SECRET_KEY]; $url = [REQUEST_URL]; // 주소에서 쿼리 문자 분리. // URL인코딩 되어있는 요청받은 그대로의 주소를 가지고 추출한다. $query = parse_url($url, PHP_URL_QUERY); $query = substr($query, 0, strrpos($query, '&')); // 해시값 생성. $hash = base64_encode(hash_hmac('sha256', $query, $key, true)); $pass = ($hmac === $hash);  쿼리 문자열은 파라미터를 가공해 만들지 말고, 요청 URL을 통으로 얻어 앞 부분과, 뒤쪽 hmac 부분을 제거한 다음에 사용하는 것을 추천합니다.  요청 URL은 URL 인코딩이 되어 있습니다. hmac 부분이 빠진 쿼리 문자열은  URL 인코딩된 그대로 해시값을 만들어야 합니다. 다만 생성된 해시값과 비교할  hmac 값은 URL 디코딩된 값을 사용해야 합니다.

라라벨 컨트롤러에서 Validation 오류 메세지 발생하기

 라라벨에서는 컨트롤러에서 유효성 검사를 통과하지 못하고 되돌아왔을 때, 해당 페이지가 오류를 표시할 수 있는 적절한 코드로 되어있다면 검사를 통과하지 못한 대상에 무엇이 문제인지 표시할 수 있습니다.  제가 알고 싶었던 것은, '원하는 때에 원하는 내용으로 유효성 메시지를 표시하는 방법'이었습니다. 그래서 이와 관련된 내용을 찾았고, 찾은 내용은 아래 링크입니다. [ stack overflow ]  방법은 소스코드 내에서 'Illuminate\Validation\ValidationException' 오류를 원하는 메시지로 생성하여  throw 하면 됩니다. use Illuminate\Validation\ValidationException; ... throw ValidationException::withMessages([ 'file' => ['파일 오류'] ]);  예시로 적은 위 코드는 유효성 검사를 해야 하는 항목 중에서 이름이 file로 지정된 요소에 '파일 오류'라는 메시지를 전달합니다.

HTML 의 이벤트 이름은 어떻게 적어야 하는가?

 Vue3 를 사용하다보면 템플릿에서 임의로 이벤트를 만들어야 하는 경우가 있습니다.  이벤트 이름을 정할 때 띄어쓰기는 어떻게 처리하나 고민했지만 다행이 Vue3 가이드에서 이와 관련된 내용을 찾을 수 있었습니다. ( 링크 )  HTML은 대소문자를 구분하지 않으며, 'v-on' 이벤트리스너는 항상 자동으로 소문자 변환하기 때문에 카멜 표기법(camelCase)이나 파스칼 표기법(PascalCase)은 의미가 없다고 합니다. 거기다 이벤트의 이름은 템플릿 내에서 별도의 변수로 사용되는 경우가 없기 때문에 케밥 표기법(kebob-case) 사용을 권장한다고 합니다. <input type="text" @my-change-event="onClick">

PHP 로 FTP 업로드 시 디렉토리와 파일은 만들어지는데 용량이 0인 경우

 PHP를 사용해 외부 FTP 서버에 파일을 업로드 하려고 합니다.  아래 코드와 같은 흐름으로 작성을 했지만, 크기가 0인 파일만 만들어지고 데이터는 올라가지 않네요. // Error code. $ftpConn = ftp_connect($ftpHost, $ftpPort); ftp_login($ftpConn, $Id, $password); ftp_put($ftpConn, $file, $path, FTP_BINARY)); // timeout ftp_close($ftpConn);  찾아보니 FTP 서버의 환경에 따라서 '수동모드'를 작동해야 한다고 합니다. 'ftp_pasv()' 함수로 해당 설정을 할 수 있는데, 값을 true로 설정해도 업로드가 안되는 것은 여전했습니다. // Error code. $ftpConn = ftp_connect($ftpHost, $ftpPort); ftp_pasv($ftpConn, true); ftp_login($ftpConn, $Id, $password); ftp_put($ftpConn, $file, $path, FTP_BINARY)); // timeout ftp_close($ftpConn);  결국 답을 찾았습니다. 어이없게도 코드의 순서가 잘못되어 있었습니다. 'ftp_login()' 이후에 해당 옵션을 설정해야 정상적으로 작동을 합니다. $ftpConn = ftp_connect($ftpHost, $ftpPort); ftp_login($ftpConn, $Id, $password); ftp_pasv($ftpConn, true); // 로그인 다음에 설정해야한다. ftp_put($ftpConn, $file, $path, FTP_BINARY)); ftp_close($ftpConn);

이유를 알고 싶지 않을 정도의 노력

 잘 써진 글을 보고 있으면 어떻게 이렇게 쓸 수 있을까 의문이 든다. 단어 하나하나는 나도 알고 있는 것들이 대부분인데 내가 적는 것과는 너무나 다른 모양이다.  잘 써졌다는 것은 알겠지만 왜 그런지 모르겠는 답답함, 그 이유를 찾아 배우기에는 너무 많은 노력이 필요하다.  이유가 궁금하지만, 그것을 알기 위해 노력하기는 싫다. 지금처럼 다른 사람의 글을 읽고 부러워 하는 정도의 노력만 들이고 싶다.  사람들이 물어보는 것을 선호하는 이유는 그것이 상대적으로 쉽기 때문이다. 나도 마찬가지다. 누군가 그냥 말해줬으면 하고 생각한다.

나쁜 일이 많을 때 복권을 사야 하지 않을까?

 지금까지 좋은 꿈을 꾸었거나, 날씨가 좋거나, 특별한 날에는 복권을 샀다.  문득, 좋은 일이 있을 때 복권을 사는 게 맞는 건가 의구심이 든다. 그런 행운이 연속적으로 올 확률이 얼마나 되겠는가? 좋은 일이 한 번 왔으면 그 뒤는 평범하거나 나쁠 확률이 높지 않을까? 오히려 나쁜 일이 연속으로 일어난 다음에는 좋은 일이 일어날 확률이 높지 않을까?  수학적으로 본다면 그딴 거 다 의미 없는 게 맞겠지만, 그래도 복권을 산다면 앞으로는 나쁜 일이 있을 때 사야겠다는 생각을 해봤다.

커피에 물을 타나, 물에 커피를 타나

 커피믹스를 탈 때, 커피에 물을 타는 것과 물에 커피를 타는 것을 구분하는가? 둘을 구분하는 사람과 그렇지 않은 사람이 있을 때 나는 전자에 속한다.  무엇이 다른가 물어본다면 솔직히 말해서 타는 행위 말고는 딱히 할 말이 없다. 근본적인 차이점이 있을 수 있지만 잘 모르겠다.  둘을 구분한다고 커피 맛이 다른 것도 아니니 오히려 구분하지 않는 게 삶이 편안할 수 있겠다는 생각도 든다.

git을 처음 깔았을 때 설정해야 하는 전역 옵션

 git을 처음 깔았을 때 설정해야 하는 값을 적어봅니다. # 사용자 이름과 이메일 저장. git config --global user.name "name" git config --global user.email "email@email.com" # 메인 브런치 이름 변경. (master를 사용하지 않는 방향으로 바뀌고 있다.) git config --global init.defaultBranch main # 줄바꿈 문자 관리. (윈도우와 리눅스의 설정값이 다르다.) git config --global core.autocrlf true #윈도우 git config --global core.autocrlf input #리눅스  core.autocrlf는 줄바꿈 문자를 설정하는 옵션입니다. 저장소에 저장할 때 줄바꿈 문자를 통일하기 위한 설정입니다. 윈도우에서는 true 값을 설정하여 저장시에는 LF로 변환, 불러올 때는 CRLF로 변환 되도록 합니다. 리눅스에서는 input 값을 설정하여 저장시에는 LF로 변환, 불러올 때는 변환없음으로 처리합니다. 결과적으로 저장소에는 LF 줄바꿈 문자만 들어가게 됩니다.

Vue.js 같은 종류의 이벤트 여러 개 등록하기

 Vue.js 를 사용하여 하나의 이벤트에 두 개 이상의 핸들러 등록이 필요한 경우 아래와 같이 쉼표로 구분하여 등록이 가능합니다. <button @click="onClickA(), onClickB()" type="button"> </button>  주의사항으로  핸들러를 등록할 때는 변수형이 아니라 실행문으로 처리해야 합니다.  이렇게 실행문 형태로 핸들러를 등록 할 때 내부에서 이벤트 인자값이 필요한 경우에는 아래와 같이 '$event'를 인자로 추가하면 됩니다. <button @click="onClickA($event), onClickB($event)" type="button"> </button>

오큘러스 퀘스트 2 렌즈(안경) 맞추기

이미지
 이번에 오큘러스 퀘스트2를 구매했습니다.  당연하다는 듯이 같이 사용할 액세서리도 알아보고 있었는데, 주요 관심은 헤드 스트랩에 있었습니다. 안경을 쓰는 처지에서 안경알 가이드도 생각했지만, 조금 불편해도 지금 사용하고 있는 안경으로 충분히 대처가 될 거로 생각했습니다. 지금 보면 안경을 쓰고 있다면 스트랩 보다는 안경알과 가이드가 더 필수라 생각합니다.  VR 안경은 공식 사이트에서도 구매할 수 있다고 하지만 대부분 알리 같은 데서 가이드를 따로 구매하고, 동네 안경점에서 안경알을 맞추는 것 같았습니다.  하지만 저는 중국에서 오는 배송기간도 싫었고, 동네를 돌아다니며 렌즈 가공 여부를 알아보러 다니기도 귀찮았습니다. 그래서 같이 파는 곳을 찾아다녔고 주문해서 택배로 배송해 주는 곳을 찾았습니다. 아이프린팅 센터 라는 네이버 쇼핑몰이고 ( https://smartstore.naver.com/eyeprinting ), 상품 중에 ‘오큘러스 퀘스트2 도수가이드 / 안경가이드 / 클립 (자석형)’이라는 제품이었습니다. ( https://smartstore.naver.com/eyeprinting/products/5277891234 )  기본으로는 도수가 없는 렌즈를 포함할 수 있는데(VR 렌즈 보호용) 도수를 넣기 위해서는 쇼핑몰에서 바로 살 수 없고, 전화나 카카오톡으로 별도 문의 후 구매가 가능합니다.  저는 카카오톡을 이용해 구매 문의를 했으며 구매 시 필요한 정보는 1. 양 눈의 도수 2. PD 정보( 양쪽 동공의 거리 ), 3. 오큘러스 퀘스트2의 IPD 설정값 입니다.  1, 2번 시력 정보는 안과에 가서 안경 처방전을 받으면 됩니다. 안경 처방전 받으러 왔다고 하면 시력검사를 하는데 2021년 3월 10일 기준으로 저는 만 원 정도 들었습니다. PD 값을 요청하지 않으면 측정 안 해주는 곳도 있다고 하니 꼭 요청해야 합니다. (처방전이라고 해서 약국 처방전 생각했는데 그냥 명함 정도의 작은 ...