What Should I do?


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

윈도우10 단축키 PDF 1페이지짜리

Window 10 Shortcuts for Korean 디자인하고는 거리가 먼 사람이라 만드느라 죽는 줄 알았네요. 윈도우11에도 일단 다 먹히는 걸로 생각되기에 10을 기준으로 만들었습니다. &nbsp; 1장짜리니 프린트해서 유리판아래 두시거나, 벽에 붙여 두시면 좋을 것 같습니다. &nbsp; 자주쓰지는 않지만 알아두면 좋은 것은 BOLD/Italic처리 해 두었으며, 빠진 단축키도 있지만 거의 안쓰거나, 동작을 정확히 파악하지 못한 녀석들 입니다. 또한, "복사/붙여넣기"같은 누구나 아는 것으로 판단되는 것은 지면상 빼버렸습니다. 되도록 분류별로 정리하려고 애를 썼는데 맞지 않는 부분도 있을 수 있습니다. 흑백프린터용으로 만들었으니, 흑백만 지원하는 레이저 프린터에서도 잘 출력됩니다. 필자가 칼라잉크를

fork() 사용법과 주의 사항

fork()함수는 자신의 프로세스를 복사해서 또 다른 자식프로세스를 만들어내는 것이다. 동작방식 fork()는 새로운 프로세스를 만든다. 새로운 프로세스를 만드는 것은 컴퓨터의 입장에서는 굉장히 느린 작업이다. Processing을 위한 context로 만들어야 하고, 메모리도 할당해야 하고, standard IO도 할당을 해야하는 등 시작을 위한 준비작업이 상당히 많다. 하지만 fork() 함수는 메모리를 스~윽 복사해서 context(*1)만 만들어 실행 시켜버리기 때문에 일일이 새로운 프로세스를 만드는 작업 중 일부만을 수행한다. 거의 thread를 만드는 것에 조금 더 추가되는 수준의 적은 부하만 발생하게 된다. linux가 발전하면서 처음에는 부하가 컸지만, 별별 테크닉들이 커널에 추가되면서 이 정

개 느린 복사 cp, 좀 빠르게 해보자.

리눅스에서 미친 듯이 사용하는 복사명령가 cp다. 너무 자주 쓰니 설명도 필요 없고, 리눅스를 쓰는 사람은 사용법을 달달외우기 까지 할 정도로 자주 쓰는 명령어다. 하지만... 이게 많은 갯수의 파일을 복사할 때는 속터진다. 드라이브의 구조상 SSD나 HDD나 어쩔 수 없는 부분이긴 하지만, 이 걸 피해 조금이라도 빠르게 복사하는 법을 한 외국인 칭구가 잘 정리를 해 놨다(에이~씨~ 복 받을 X, 옜다 복~). 링크는 맨 밑에 걸어 둘테니 영어가 편한 사람은 한번 가서 보기를 바란다. &nbsp; &nbsp; 빠른 복사 하기 다량의 파일을 복사할 때, 파일하나하나마다 접근시간(seek time)이 발생하게 된다. 파일이 저장된 위치로 가는 과정과 파일을 쓰기 위해 이동하는 과정에서 드는 시간이다. SSD