What Should I do?


2025년 달력입니다. 프린트해서 쓰세요.

A4용, A5용, B5용으로 만들었습니다. 심플하게 만들었으며, 다음 과 같은 특징이 있습니다. 24절기 표기 15일 단위 음력표기 초복, 중복, 말복 표기 2026년 1월 포함 A4용 2025 달력_A4.pdf 다운로드 A4용 입니다. 대부분의 가정용 프린터가 A4를 출력하기에 그냥 출력해서 쓰시면 됩니다. B5용 2025 달력_B5.pdf 다운로드 B5용지가 있으신분은 다음파일을 다운로드 하시면 됩니다. A4용지에 찍는 B5

VSFTP 서버 설정하기 - 참 할 것 많다.

VSFTP 서버 설정하기 - 참 할 것 많다. FTP - 모하는 거지.. FTP(File Transfer Protocol)은 단순히 서버와 파일을 주고 받기 위한 것이다. 파일을 주고 받기위한 것에만 특화되어 있다. 일단 이 글은 Unbuntu를 기존으로 설명하겠다. 설정파일은 당연히 다음의 경로에 존재한다. /etc/vsftpd.conf 이 파일을 루트사용자 권한으로 열어서 수정하면 된다. Active 모드 vs Passive 모드 ftp로 파일이 전송되는 과정은 다음과 같다. 사용자가 ftp서버에 접속하면(주로21번 포트) 이 포트로는 명령만을 주고 받는 역할을 한다. 실제 파일이 전송되는 것은 다른 포트를 사용하게 된다. Active모드는 클라이언트에서 포트를 열어 서버가 클라이언트에 접속해 파일을

javascript base64 js코드 - 그냥 만듬

javascript base64 js코드 - 그냥 만듬 이 글과 관련된 이전 글의 링크는 다음과 같다. 관심있는 사람은 한번 읽어보기를 바란다. Javascript Base64 한글 등 특수문자 처리 참내.. btoa, atob함수는 Uint8Array를 지원하기 전에 나온 것이라 한글 처리 등에 문제가 있다. 따라서, base64 인코딩/디코딩을 하기 위해서는 약간의 트릭을 써야 한다. escape함수를 통해서 처리하는 것이다. 하지만 escape함수가 deprecated되었기 때문에, 쓰기에는 좀 찜찜한 실정이다. 솔직히 escape함수를 사용하는 코드가 너무 많을 것이기에, 이 escape함수를 완전히 없애는 것이 가능할 지는 의문이지만, 그래도 찜찜하기는 마찬가지다. 이제 거의 모든 브라우저가 te

JS - 브라우저에서 이미지 포맷 변환하기

Canvas의 toBlob() 함수 Canvas Element에는 toBlob() 함수가 있다. 이 함수를 이용하면 jpeg, png, webp로 데이터를 받아올 수 있다. 굳이 서버에서 이미지를 변환할 필요가 없다. 이미지 포맷을 변환하는 프로그램을 간단히 만들 수 있으며, 서버로 보내기전에 webp로 바꾸어 전송하면 트래픽 사용량과 저장공간도 아낄 수 있다. 이 글에서는 이 변환하는 방법을 설명한다. 어떻게 동작하나? 이미지를 로드하고 canvas를 만들어 이미지를 그린다. 그리고 canvas의 toBlob을 이용해 이미지 포맷을 변경하는 것이다. 다음은 화면에 보이든, 서버로 보내든, 다운로드하든 필요한 작업을 하면 된다. 간단히 의미별로

<img> 태그의 decoding 속성 – 'load'이벤트가 끝이 아니었다.

load는 디코딩을 포함하지 않는다. 이미지를 서버에서 다운로드 받아오면 ‘load’이벤트가 발생한다. 이 것을 이용해서 이미지가 로드되었음을 확인할 수 있는 데, 이미지는 주로 압축이 되어있기 때문에 decoding을 거쳐 pixel단위의 데이터로 변경되어야 화면에 그릴 수 있다. 이 디코딩은 언제 실행되는 지가 궁금했는 데, decoding의 속성에 따라서 실제 decoding의 실행시점이 달라지게 된다. Decoding은 필요한 경우에만 실행된다. 실제 화면에 그리는 작업을 하지 않으면 decoding이 필요가 없기 때문에 브라우저는 이미지를 다운로드 받았다고 decoding을 하지 않는다. load이벤트가 발생했다고 즉시 화면에 그릴 수 있다는 뜻이 아니라는 것이다. 실제 decoding 일어

HTTPS의 통신이 안전한 이유, 동작원리

간단한 네트워크 통신 네트워크 통신은 정말 간단한 방식으로 동작한다. 클라이언트에서 "DATA" 라고 글자를 보내면 이 글자 그대로 서버는 받게 된다. 물론 서버의 주소와 데이터의 크기는 얼마인지 하는 추가정보적인 내용이 더 필요하지만, 이 "DATA"라는 글자는 네트워크 중간에서 그냥 "DATA"라고 보이게 된다. 아주 당연한 이야기다. 아무런 보안작업을 하지 않으면 아이디와 비밀번호, 신용카드번호같이 민감한 정보가 네트워크상에서 떠돌아 다니게 되고 이를 중간에서 가로채는 것은 아주 쉬운일이다. 이 날라다니는 내용을 암호화할 필요가 있다. 알아야할 보안 알고리즘 HTTPS는 4가지의 알고리즘을 알아야 한다. 수학적인 문제는 수학자들이 증명까지 해놓았기 때

Access Token과 Refresh Token - 이건 모야? - PHP

목차 JWT 토큰 이해하기- PHP 커스텀 JWT 토큰 - PHP Access Token과 Refresh Token - 이건 모야? - PHP 뭐하는 건가? 두가지의 주된 목적이 있다. 하나는 사용자의 편의성을 위한 것이고, 또 하나는 토큰한개만으로는 보안상 문제가 발생할 수 있기 때문이다. 토큰이 탈취된 경우 수많은 문제가 발생하게 된다. 따라서 탈취의 가능성을 줄이기위한 방법이다. 사실상 토큰이 탈취된 개념은 새션을 사용한 방식에서 세션키가 탈취된 것과 차이가 없다. SSL/TLS를 적용해야하는 이유기도 하며, 탈취를 막기위해 XSS공격을 막기위해 js코드를 치밀하게 만들 필요가 있는 이유다. 다른 스마트폰을 분실하는 경우 등의 물리적인

커스텀 JWT 토큰 - PHP

목차 JWT 토큰 이해하기- PHP 커스텀 JWT 토큰 - PHP Access Token과 Refresh Token - 이건 모야? - PHP 커스텀 토큰 기본적으로 JWT의 구조는 RFC7519에 정의해 놓았지만, xxxxx.yyyyyyy.zzzzzz 식으로 구조를 확정해 놓은 것은 아니다. 단지 서명을 빼내기 위해 "."이 한개 이상 있어야 되고, 보안 규칙에서 최소한 지켜야 할 것과, 권장되는 서명알고리즘을 기술할 뿐이다. 따라서 거의 마음대로 바꿔도 이 규칙에 위배되지는 않는다. 단지 관리하에 두지 않는 다른 서버와의 소통을 위해 이 방법을 사용할 뿐이다. 쉽게 말해서 다른 회사와 통신할 때 같은 규칙을 써야 하니까 이렇게 범용적인 형태를 이용하는

JWT 토큰 이해하기 - PHP

목차 JWT 토큰 이해하기- PHP 커스텀 JWT 토큰 - PHP Access Token과 Refresh Token - 이건 모야? - PHP 머리아프다. JWT라는 것을 구현하면서 정말 많은 생각을 해야 한다는 것을 알게 되었다. 단순해 보이지만 민감한 정보를 다루기 때문에 문제가 발생할 수 있는 상황에 다 대처할 수 있도록 구현하는 것은 쉽지 않았다. 필자가 이 작업을 하면서 평생동안 열손가락안에 들만큼 생각을 많이하게 만들었다. 아직도 머리가 아프다.ㅠㅠ 아~. JWT는 Json Web Token의 약자다. 어감이 좀 이상하지만 "잣"이라고 읽는다. 대체 왜 쓰는 건가? 세션을 이용하여 사용자를 파악 방식은 사용자가 페이지를 열거나 이동할 때마다 사용자정보를 DB서버 같은 곳[이후

안드로스튜디오에서 외부 JAVA소스 폴더 링크하는 법

android { .... .... sourceSets { main.java.srcDirs += 'src/main/&lt;YOUR DIRECTORY&gt;' } } build.gradle 파일의 android 부분에내용을 추가 한다. 여러개를 넣을경우 sourceSets { main { java.srcDirs = [ '/src/man&lt;YOUR Directory&gt;', 'c:/myjavapack/classes' ] } } &nbsp; build.gradle file의위치는 app 밑에 있는 것이다.(최상위가 아니다.) &nbsp; 이렇게 하고 sync하면 자동으로 프로젝트에 추가 된다.

복호화(PHP) : aes256 cbc openssl

이전에 포스트한 (C/C++)버전의 PHP버전이다. 하지만 이글을 바로 읽는 독자가 있을 수 있으니...&nbsp; 명령줄에서 다음과 같이 암호화 작업을 했다면 $ openssl enc -e&nbsp;-aes-256-cbc -in plain.txt -out encrypted.data -k "my_password" 이렇게 생성된 파일을 복호화하는 코드를 작성해 보자. 실제 위의 명령줄은 문제가 많지만, 처음 openssl을 접하는 사용자는 위의 명령을 통해 암호화작업을 많이 하게 될 것이다. 그러다 보니, 이 문제많은 방식에서 다른 방식으로 변경할 경우 일단 복호화작업을 해야 하니, 복호화 프로그래밍도 익힐 겸 복호화하는 코드를 생성해보자. 저장된 파일의 구조는 이전 포스트에서도 언급했듯이 다음의

복호화(C/C++) : aes256 cbc openssl

명령줄에서 다음과 같이 암호화 작업을 했다면 $ openssl enc -e&nbsp;-aes-256-cbc -in plain.txt -out encrypted.data -k "my_password" 이렇게 생성된 파일을 복호화하는 코드를 작성해 보자. 실제 위의 명령줄은 문제가 많지만, 처음 openssl을 접하는 사용자는 위의 명령을 통해 암호화작업을 많이 하게 될 것이다. 그러다 보니, 이 문제많은 방식에서 다른 방식으로 변경할 경우 일단 복호화작업을 해야 하니, 복호화 프로그래밍도 익힐 겸 복호화하는 코드를 생성해보자. 저장된 파일의 구조는 이전 포스트에서도 언급했듯이 다음의 구조를 가진다. 검은색 부분에 "Salt__"(8bytes)가 있으며, 이어서 실제 Salt값(노란색)이 8bytes가 따라온다

명령줄 : aes256 cbc openssl

openssl을 설치하고 암호화작업을 하기위해 인터넷을 뒤져보면 다음과 같이 암호화와 복호화를 할 수 있다. 암호화 하기 $ openssl enc -e -aes-256-cbc -in plain.txt -out encrypted.data 이 명령어를 이용하면 중간에 비밀번호를 묻게되는 데, 이 때, 비밀번호를 입력하면 암호화가 된 파일이 생성되게 된다. 복호화 하기

간단한 TGA파일 구조

가장 간단한 이미지 포맷이 필요한 상황이 발생했다. BMP포맷이 있지만, 어쩌다 TGA라는 포맷이 꽂혀서 좀 찾아 보기로 했다. 구조와 순서 TGA 구조와 순서 영역 크기 설명 1. Tga Header 18바이트 이미지의 주된 정보 2. Image ID 가변 Header의 첫 바이트[idLength]에 이 크기를 지정한다. 주로 사용하지 않는다. 3. ColorMap Data 가변 Palette 이미지를 사용할 경우만 존재하며, Palette Color값이 저장된다. 4. Pixel Data 가변 이미지 픽셀 정보를 담는다. 헤더의 정보에 따라 RLE압축으로 데이터를 넣

Exif 썸네일 추출 C코드

Jpeg 파일에서 썸네일을 추출해보기로 했다. 일단 기본이 되는 함수를 만들어 보자. // You must call exif_data_unref(return value ) if return value is not null. ExifData* JpegExif_GetThumbnail( const char* pszJpegFilePathName ) { ExifData* ret = nullptr; ExifLoader *loader = exif_loader_new(); ExifData *ed = nullptr; if( !loader ) { return nullptr; } exif_loader_write_file( loader, pszJpegFilePathName ); ed = exif_loader_get_data(lo

Image Rotation In C

Image Rotation In C 이미지를 회전시킬 일이 생겼다. 마음대로 회전되는 것은 필요가 없었고, 90, 180, 270도만 회전되는 것을 만들어야하는 상황이지만 그냥 다 만들기로 했다. 괜히 했다..ㅠㅠ 회전은 중학교때 배운 행렬의 회전공식을 이용하여 만들면 된다. 수학자들이 이미 너무 잘 풀어놓았으니 가져다 쓰기만 하면된다. [회전공식] x' = x cos(t) - y sin(t) y' = x sin(t) + y cos(t) 역함수도 있는 데, 회전을 거꾸로하면[-값으로 넣으면] 역함수의 결과와 같기 때문에 굳이 역함수를 쓸일은 없었다. 그래도 필요한 사람이 있을 수 있으니 넣어는 둔다. [회전의 역함수] x = x' cos(t) + y' sin(t) y = -x' sin(t) + y'

BiLinear Interpolation Of Image in C

구글을 뒤져서 다음의 코드를 찾아 냈다. https://gist.github.com/folkertdev/6b930c7a7856e36dcad0a72a03e66716 오랜동안 살아있는 링크로 알고 있지만, 혹시나 언제 지워질지 모르니 복사를 해 둔다. /// Sources: // // - https://chao-ji.github.io/jekyll/update/2018/07/19/BilinearResize.html void bilinear_interpolation(float *data, uint32_t input_width, uint32_t input_height, uint32_t output_width, uint32_t output_height, float *output) { float x_ratio, y_ra

윈도우 11 동영상(음악)있는 폴더만 들어가면 느려지는...

아.. 뭐 이런 어의 없는 상황이 발생했다.. 언젠가부터.. 이주일정도된 듯한데.. 동영상이 있는 폴더나 음악파일이 큰 폴더만 들어가면 느려지는 현상이 발생했다. SSD속도를 계산해보더라도 하드웨어적인 문제는 아닌 것으로 추측이 된다. 그렇다면 윈도우가 일일이 파일을 다 읽어서 파일을 분석하느라 느려진다는 것인데, 필자의 경우 음악파일이 3~5시간짜리들이 있는 데, 이 녀석들이 처리되느라 느려지는 듯 했다. 게다가 같은 폴더에 4K영상까지 있으니 들어갈때마다 하세월이었다. 이 걸로 짜증을 내고 있다가 한가지 방법을 알게 되었다. &nbsp; 일당 해당하는 폴더에서 오른쪽을 클릭하여 속성창을 연다. &nbsp; 속성창이 뜨면 사용자 지정으로 가서 [다음에 대해 이 폴더 최적화]를 일반항목으로 바꾼다. 일반항목

VC 디스크 드라이브 목록 구하기

단순 드라이브 목록 단순히 드라이브목록만 구하려면 다음과 같이 할 수 있다. &nbsp; 방법1 - GetLogicalDrives List1 - 루트목록1 void DiplayDrives1() { DWORD drives = GetLogicalDrives(); for (int i = 0; i &lt; 26; i++) { if ( drives &amp; ( 1 &lt;&lt; i ) ) { wprintf(L"%c\n", L'A' + i ); } } } bit의 위치가 SET되으면 그 드라이브가 존재한다는 뜻이다. 만약 5번째 비트가 SET되어 있다면, ABCD(E)F.. 중 E드라이브가 있다는 뜻이 된다. 대부분의 상황에서 이 방법은 잘 작동한다. 사용법은 단순하지만, 이 방법은 26번의 루프를 돌아야 될 뿐만

VC 드라이브 볼륨 시리얼번호등 정보 알아내기

디스크와 볼륨은 다른 것이다. volume의 시리얼번호만으로 대부분의 상황에 대응이 가능하니 이 글에서는 Disk의 시리얼번호가 아니고 볼륨의 시리얼번호를 다룬다. 함수명은 GetVolumeInformation으로 드라이브이름, 파일시스템형태, 기본정보를 알아낼수 있습니다. VC에서 GetVolumeInformationW까지 치고 [F1]누르면 MS의 함수명세를 볼 수 있다. GetVolumeInformation BOOL GetVolumeInformationW( [in, optional] LPCWSTR lpRootPathName, [out, optional] LPWSTR lpVolumeNameBuffer, [in] DWORD nVolumeNameSize, [out, optional] LPDWORD lpVol