반응형

전체 글 307

[NCP] Naver cloud platform 기초 학습 내용 정리 (입문)

NCP VPC 정의 VPC(Virtual Private Cloud)는 퍼블릭 클라우드 환경에서 사용할 수 있는 고객 전용 사설 네트워크임. 다른 네트워크와 논리적으로 분리되어 있어 IT 인프라를 안전하게 구축하고 간편하게 관리할 수 있음. 기존의 데이터 센터 네트워크와 유사하게 구현가능 기능 다른 네트워크의 간섭없이 완전히 분리된 네트워크 사용가능 VPC내부에 서브넷 생성 가능 Access Control을 통해 네트워크 접근을 제어하여 강력한 보안을 제공함. (ACG는 서버 단계의 접근을 제어하고 Network ACL은 서브넷 단계의 접근을 제어함) Cloud Connect와 Managed IPsec VPN을 통해 외부 네트워크와 안전하게 통신 가능 VPC내부에서 통신이 가능함. VPC Peering을 ..

is와 == 의 차이

나는 처음에 이 둘이 완벽하게 동일하다고 생각했다. 사건의 발달은 이러하다. 조건문을 써줄 일이 있었는데 != 을 is not 으로 명시해주었다. 이렇게 하면 읽는 사람이 좀 더 쉽게 읽을 수 있을거라고 나름 생각했다. 그런데 문제가 생겼다. 당연히 될거라고 생각했는데 정상 동작하지 않았다. 자 is 가 무엇일까에 대해서 검색해보면 해답을 찾을 수 있다. is 는 ==와 달리 값을 비교하는게 아니라 레퍼런스 즉 포인터를 비교한다. python 에서 변수는 내부적으로 데이터를 가리키는게 아니라 인스턴스 포인터를 가리킨다고 한다. 그러니 쉽게 말하면 is 연산자는 포인터(레퍼런스)를 비교하는 연산자이지 데이터를 비교하는 연산자가 아니라는 것이다. 그러니 주로 None 과 False, True 를 비교할때 사..

Docker 기초 공부자료

주말에 읽어보자구요 ~ https://tech.ktcloud.com/84?category=465864 도커를 공부하는 초보자를 위한 안내서 5편 - 도커 설치 및 명령어 실습 도커(Docker) 기초 다지기 - 도커 명령어 및 실습 앞선 포스트를 통해 도커가 무엇인지 공부했으니, 이제 실전에 돌입할 차례입니다. 도커 설치부터 핵심적인 명령어까지 실습을 통해 차근차근 알 tech.ktcloud.com

[Django] 10분이면 읽는 Django 기초 개념 정리 (입문자용)

7월 1주차에 급하게 Django 를 써야할 상황이 생겨서 이틀간 Django를 압축적으로 학습할 일이 생겼다. 그간 학습한 내용들을 간단하게 정리하도록 하겠다. 개인적으로 빠르게 학습하면서 (빠르게라기 보다는 급하게가 맞겠다.) 적은 내용들이라 다소 형식이 올바르지 못하더라도 필요한 내용들만 압축해서 정리해놓았다. 목차: 서버 구동 및 초기 설정 MTV 패턴 view (HTTP request, HTTP resposne) model (클래스 필드에 대하여, CharField, IntegerField, EmailField) DB migration, migrate DB 엔진 설정 (Mysql 연동 방법) Model api 사용법 (장고 기본 지원 ORM 사용법 - insert, select, update, ..

HTTP에서 PUT과 PATCH의 차이

HTTP요청에서 PUT과 PATCH라는게 존재하는 것을 알고 있었는데 여태 둘이 같은 기능을 한다고 오해하고 있었다. 그러다가 Django를 학습하던 중 이 두가지를 구분해서 사용하는 예제를 보았고 분명 차이가 있다고 생각해서 오늘 찾아보았다. (생각보다 중요한 차이였다. 계속 모르고 있었다면 위험했다.) 우선 둘다 update를 한다는 점에서는 같다. 특정 객체를 디비에 밀어넣을때 내가 전달한 값으로 업데이트를 해서 넣는다는 점에서는 같다. 하지만 이 동작에서의 미묘한 차이가 있다. PUT의 경우에는 업데이트를 할때 모든 값을 업데이트한다. 즉 모든 필드에 대해서 업데이트를 진행한다는 얘기다. PATCH는 내가 전달한 값에 대해서만 업데이트한다. 전달한 필드에 대해서만 업데이트를 진행한다. 즉 만약 P..

[Django] Django에서 AbstractUser의 password 암호화, User모델 확장

Django를 사용해서 서비스를 개발 중이라고 가정하자. 우리는 보통 서비스를 만들때 User 모델을 정의하게 된다. 사용자 비밀번호, 아이디, 이름, 이메일, 가입날짜 등등을 이 모델안에 정의하게 된다. 그런데 이것만 가지고는 Django의 장점을 활용하기엔 부족하다. 그래서 Django에서는 User모델을 확장할 수 있게 도와준다. 확장을 해야 진짜 Django의 간편함을 누릴 수 있다. 어떻게 확장할까? 바로 상속을 통해서 가능하게 해준다. User모델을 정의하고 나면 우리는 AbstractUser를 상속받게 할 수 있다. 그리고 AbstractUser 안에는 username, password, email 등등의 기본적인 필드들이 존재한다. 미리 정의되어 있다. 그리고 우리는 상속을 통해 그 필드들..

[Django] Fatal error in launcher: Unable to create process using 에러 발생

djangorestframework-simplejwt를 install 하려는 와중에 pip에서 계속 문제가 발생했다. Fatal error in launcher: Unable to create process using 한참을 찾아보고 PATH값도 다시 수정해주는 작업을 했지만 소용이 없었다. 그리고 정말 간단한 해답을 찾았다. 내가 하려던건 pip install djangorestframework-simplejwt 였는데 이걸 아래처럼 입력해주면 해결된다. python -m pip install djangorestframework-simplejwt 명령어 앞에 python -m 을 붙여주면 된다. 아마 vscode 혹은 python 설치경로 지정에서 문제가 있엇던듯한데 굳이 그걸 설정을 바꿔가면서 하기보..

leetcode - 1337. The K Weakest Rows in a Matrix - python3

재밌는 문제를 찾았다. 그리고 최근에 느낀거지만 Leetcode 에서 submit 을 하면 성능과 메모리가 어느정도 되는지 나오는데 그걸 줄여보려고 코드를 바꾸려고 했던 적이 많다. 근데 확실해진건 이걸 기준으로 성능, 메모리 최적화를 하긴 어렵다는 것이다. 그 이유는 그 결과가 항상 다르기 때문이다. 즉 그냥 근사치 정도가 아니다. 90퍼센트 효율이 뜨던 코드가 갑자기 10퍼센트 효율이 뜨는 경우도 있다. 그래서 그냥 이런 성능이랑 메모리 효율성을 따지기 보다 그냥 코드만 보기좋게 다듬는 연습을 하는게 더 낫다는 생각이 들었다. 그런데 마침 오늘 꽤 괜찮은 문제를 발견했고 최대한 코드를 줄여보려고 노력을 했는데 list comprehension의 한계에서 막혔다. 즉 list comprehension ..

Exception has occurred: TypeError argument should be integer or bytes-like object, not 'str'

최근 새롭게 만들고 있는 프로젝트에서 암호화와 관련된 작업을 하는 와중에 Exception has occurred: TypeError argument should be integer or bytes-like object, not 'str' 라는 예외를 만날 수 있었다. 간단하게 해결할 수 있는 에러이다. 파이썬에서 bytes와 str은 아래와 같은 관계가 성립한다. str -> 디코딩 -> bytes bytes -> 인코딩 -> str 그러므로 encode를 해주던, decode를 해주던 utf-8로 해주면 된다는 소리다. 나 같은 경우는 RSA 키로 만든 public key와 private key가 결과물이 bytes 로 나왔는데 그걸 슬라이싱하려다가 발생한 오류였다. 아래 코드를 보면 알겠지만 exp..

LeetCode - 1037. Valid Boomerang 솔루션 - python

꽤 쉬운문제라고 생각하고 풀었는데 생각치 못한 부분에서 막혀서 답지를 보고 푼 문제이다. 참고로 블로그에 기록해두는 이유는 답지를 보고 풀었는데 거기서 꽤 많은 점을 배울 수 있었기 때문이다. 아래는 문제 링크이다. 꽤 간단한 문제이다. https://leetcode.com/problems/valid-boomerang/ 자 그렇다면 내가 처음 접근한 오답을 먼저 보자. (이 코드 안봐도 된다. 아예 틀리기도 했고 너무 부실하다. ) class Solution: def isBoomerang(self, points: List[List[int]]) -> bool: points = sorted(points) last_point = points[-1][0] for i in range(1, 3): if points..

leetcode 961. N-Repeated Element in Size 2N Array 솔루션

이 문제는 어려운 문제가 아니다. 굉장히 쉬운 문제다. 그냥 지문 그대로 옮겨서 구현만 하면 되는 문제다. 그런데 문제를 풀어낸 솔루션에서 굉장히 재미난 동작을 발견했다. 파이썬 언어차원에서의 동작인것 같은데 처음에는 왜 이렇게 동작하나 의아했는데 꽤나 재밌다는 생각이 들어서 따로 뽑아서 블로그에 정리하고자 한다. 우선 문제 링크는 아래와 같다. 슥 봐도 쉬운 문제임을 알 수 있을 것이다. https://leetcode.com/problems/n-repeated-element-in-size-2n-array/ 그런데 중요한건 문제를 어떻게 풀었냐가 아니다. 문제를 풀어낸 과정에서의 코드 몇줄에서 발생한 신기한 동작이다. 내 솔루션은 아래와 같다. from collections import defaultdi..

IntelliJ: Abnormal build process termination Error with

오늘 갑자기 클라쪽에서 수정사항이 있어서 급하게 인텔리를 켜서 작업을 할려고 했는데 IntelliJ: Abnormal build process termination Error with 이와 같은 에러가 발생했다. 아예 Run이 작동하지 않았다. 딱봐도 인텔리 자체의 오류거나 내 윈도우에서 뭔가 이것저것 진행하면서 jdk 경로가 바뀌었거니 하고 생각하고 있었는데 다행히도 명쾌한 해결법을 찾아서 현재는 해결했다. 인텔리에서 File -> Project Structure -> Project Settings -> Project 여기까지 들어오면 아래와 같은 창이 나올 것이다. 여기서 Language level 만 바꿔주면 된다. 자이제 여기서 Language level 을 java 8 로 맞춰주면 된다. 나는 ..

X-AUTH-TOKEN 으로 보내지 않을 경우 JWT로직은 에러가 난다.

어제 안드로이드 쪽을 맡고 있는 친구랑 API 요청을 맞춰보던 중에 자꾸 UserDetails 로 String conversion 이 일어나지 못했다는 classcast Exception 이 발생했다. 이상하다 싶었다. 분명 내가 postman 에서 테스트할때는 전혀 문제 없었는데 친구가 안드로이드쪽에서 요청을 보낼때만 에러가 발생했다. 그리고 그 근본 발생지도 시큐리티 코어쪽에서 로그가 찍혀있어서 잔뜩 겁을 먹고 있었다. (시큐리티 코어를 아직 잘 모른다. 아니 사실 거의 모른다... ) 이것 저것 해보다가 도저히 해결이 안되서 그냥 모든 지점마다 Breakpoint 마냥 전부다 Print 로 찍어보면서 정확히 어디가 문제인지 전부 찍어봤는데 확실히 문제가 되는 지점을 찾았고 거기서 뭔가 이상한 점을 ..

Swagger 사용할때 반드시 주의할 점!! - @ApiModel 의 value는 겹치면 안된다.

오늘 모처럼 빨간날이라 쉬던 와중에 같은 팀원으로부터 api 에 전달해야할 정보가 뭔가 이상하다는 카톡을 받았다. 급히 swagger api spec 에 접속해서 확인해보니 정말 뭔가 이상했다. api 명세를 보니 Dto 객체를 전달받아서 그 Dto 를 통해서 이것저것 작업을 수행해줘야 하는데 어째 api spec 에 명시된 필드들이 Dto에 있는 필드들보다 더 많은 필드들이 존재했다. 이 Dto에서는 이런 필드를 정의해준적이 없는데 어디서 나온 필드들일까? 하고 생각했다. 그런데 그 필드들은 어디선가 많이 본듯한 필드인 것을 직감했다. 먼저 결론부터 말하겠다. Swagger 어노테이션을 사용하면서 @ApiModel 라는 어노테이션에 해당 네임을 적어주는 기능이 존재한다. 그런데 만약 다른 도메인 객체 ..

leetcode 696 - count binary substring - python

최근에 리트코드를 풀고 있는데 696 문제에서 막혀서 수십분 정도를 낭비했다. 이후에 discuss에 있는 솔루션 중 하나를 참고했는데 코드가 너무 이뻐서 올려둔다. class Solution(object): def countBinarySubstrings(self, s): """ :type s: str :rtype: int """ #Using the map function to find the combined length of 0 and 1 that are cut apart L = list(map(len, s.replace('01', '0 1').replace('10', '1 0').split(''))) #Because it is limited that only 0 and 1 can be next to ..

Go language 스터디 내용 정리

올해 초 겨울방학에 프로젝트에 지쳐서 숨돌릴겸 Rust와 Go 언어에 대해서 잠시 알아볼 시간을 가졌는데 그중 Go 언어는 노마드 코더님의 무료 강의를 보면서 notion에 내용을 정리했다. 4개월 정도 이전에 했던 스터디 내용이라 강의가 업데이트해서 강의내용이랑은 다른 내용이 있을 수도 있지만 내용 자체는 기본기 다지기에 좋을것 같아서 다시 보면 좋을 듯 싶어 업로드했다. go 언어란 무엇일까? 09년 구글의 로버트 그리즈머, 홉 파이크, 켄 톰슨이 개발했다. 고 루틴이 있다. → 멀티스레드 매커니즘이지만 자체적인 스케줄러에 의해 관리되는 경량 스레드이고 os에서 관리하는 경량 스레드보다 더 경량이다. 일급객체로 정수와 실수와 같은 데이터 타입과 동급으로 취급한다. channel을 통해 동시성을 지원한..

인텔리제이 폴더 생성시 Flat 으로 생성될 경우

인텔리제이에서 폴더를 생성하는 와중에 폴더가 자꾸 . 을 기준으로 깊이들어가면서 생성되는 문제가 발생했다. 나는 그냥 수평으로 폴더를 추가해주고 싶었는데 그렇게 되지 않았다. 해결방법은 간단하다. project 창에서 마우스 오른쪽 클릭 -> Tree Appearance -> Compact Middle Packages 설정해제 이렇게 해주면 문제가 사라진다.

Gbps 와 GBps 의 차이

계산문제를 풀 일이 있어서 이것저것 풀어보는 중이었는데 도무지 안풀리는 문제에서 막혀서 거진 30분은 소비했다. 자꾸 말도 안되는 숫자가 나와서 뭔가 이상하다는 낌새를 느꼈다. 보통 숫자들은 딱 들어맞는데 계산결과가 틀어지는 이유는 십중팔구 단위에 있다고 생각했다. 내가 단위에 대해서 뭔가 실수했거나 단위 변환에 있어서 숫자를 틀렸거나 아니면 애초에 단위 변환 과정 자체에 오해가 있다는 생각을 하게 되었다. 그리고 이러한 고민들이 맞았다는 것을 곧 알게 되었다. Gbps 와 GBps 를 보자면 슬쩍 보면 정말 비슷하다. 별생각없이 그냥 풀면 틀리기 쉽다. Gbps 는 gigabit per second 이다. GBps 는 gigabyte per second 이다. 완전히 다른 내용이다. 아래 그림을 참고해..

[C언어] 환경변수를 출력하는 envp의 미스터리한 동작 발견. 이유가 대체 뭘까요? <extern char ** environ;> (1)

야밤에 치킨을 먹고 쉬던 와중에 친구에게 연락이 왔다. 그리고 친구와 오랜만에 c 코드를 잠깐 살피게 되었다. 간단한 코드인데 어떻게 제출할지가 살짝 애매해서 고민하고 있었다. 방법을 찾으려고 이것 저것 건드려보면서 30분은 떠든것 같다. 그러다가 굉장히 납득하기 어려운 동작을 하는 코드가 탄생했다. 아무리 생각해도 이해가 가지 않는 동작이라 조금만 더 살펴볼까 한다. 분명 우리가 모르는 무언가가 있을 것이라고 생각하고 이리저리 살펴봤는데도 그럼에도 불구하고 신기한 코드이다. 이제부터 설명을 하도록 하겠다. 우선 우리의 목적은 간단하다. /usr/bin/env 는 환경변수를 모두 출력시키는 동작을 한다. 그리고 우리는 그 환경변수에 ENV1=value1, ENV2=value2 라는 path 또한 추가해서..

C and C++/C 2022.04.13

요즘 근황 2022-04

최근 그냥 저냥 지내고 있다. 바쁘게 보내고 있다. 뭔가 해답을 찾은것 같다. 이야기를 나눠보고 싶은 분이 계셨다. 생판 모르는 분이었는데 어찌되었든 친분과는 별개로 생판 모르는 분이더라도 물어보고 싶은게 있었다. 용기를 내서 개인적인 연락처를 받아서 정말 많은 질문을 했다. 혹 무례하게 보이진 않았을까 걱정했는데 정말 친절하게 답변을 해주셨다. 말씀 하나하나가 큰 도움이 되었다. 거기서 뭔가 답을 찾았다. 비유하자면 내가 정한 답안이 오지선다안에는 있기는 한건지 확인한것 같은 느낌이다. 그조차도 큰 도움이 되었다. 언제나 핵심은 그럼에도 불구하고 스스로 잘 하는 것이다. 꾸준히 그리고 천천히 나아가는건데 비단 운동이나 학문이나 연습이나 기록이나 뭐가 되었든 미시적이든 거시적이든 모든 과정에는 꾸준히 그..

Thinking/Deep 2022.04.10

[Bouncy-Castle] 자바 암호화 라이브러리 Bouncy-Catsle 을 사용해보자.

spring boot 로 새로운 프로젝트를 진행하고 있다. (프로젝트 github주소: https://github.com/yuny0623/2Hash) 암복호화 api 들을 만들려고 하는 중인데 새로운 기능을 추가할까 싶어서 무얼할까 고민해보다가 .pem 파일로 key 들을 만들어서 사용자에게 주는건 어떨지 고민하고 있었다. (사실 지금 api 를 만든다는 것 자체가 모순적이긴 하다. 서버에서 제공한다는게 모순적이다. 클라이언트에서 직접 만들고 본인이 사용한다면야 믿고 쓸 수 있겠지만 서버에서 private key 를 만들어서 준다는 것 자체가 살짝 치명적인 단점이라는 생각이 든다. 어쨋든 일단은 학습 목적이라 만들어볼까 한다. ) pem 키와 관련된 라이브러리가 있는데 그게 바로 Bouncy - Cats..

[RSA] javax.crypto.IllegalBlockSizeException: Data must not be longer than 245 bytes 에러 발생

데이터 교환을 암복호화를 써서 하는 api 를 개발중인데 갑자기 위와 같은 에러가 발생했다. (사실 금요일이라 뭔가 엉뚱한게 땡겼다. 그래서 뜬금없이 암복호화를 만들어보기로 했다. 근데 잘안된다. 완전 막힘. ) javax.crypto.IllegalBlockSizeException: Data must not be longer than 245 bytes 무슨 말이냐면 즉 Data 는 245 바이트보다 길어서는 안된다는 이야기다. 역시나 변환하려고 하는 데이터가 좀 길다 싶었는데 이런 에러가 터지게 되었다. 이렇게 놓고 보니까 에러가 안나는게 오히려 이상한것 같기도 하다. 해결방법은 간단하다. 그냥 공개키는 키 교환에만 사용하고 데이터는 대칭키를 사용해서 암복호화하는 것이 가장 좋을 것 같다. 즉 전자서명에..

[Springboot & Intellij] 9.png 나인패치 이미지란? 9Patch image

springboot 어플리케이션을 작성 중에 신기한 걸 발견했다. 이미지들이 레포에 올라가지 않게 하기 위해서 gitignore에 이미지형식을 적어주고 있었는데 png 를 작성할때마다 자꾸 9.png 라는 양식으로 자동완성이 되었다. 그런데 9.png ? 들어본적도 없고 이런 이름을 자동완성을 시켜준다는게 상당히 이상하게 느껴졌다. 다른 의미있는 이름으로 자동완성시켜준다면 어디선가 쓰겠거니 하겠는데 9.png 라고 하는 의미없는 네이밍이 신기하게 느껴졌다. 그래서 검색해보니 아마 이게 맞을지는 모르겠지만 안드로이드에서 사용하는 나인패치 이미지와 연관성이 있을것이라고 결론내렸다. 이외에는 9.png 와 관련된게 딱히 없었다. (검색창에 springboot 나인패치 이미지 or springboot 9.png..

[AWS] EC2를 사용하지 않을 경우 Elastic Ip / 탄력적 ip에서 과금 발생

아침에 일어나서 메일을 확인하는데 AWS로부터 처음보는 내용의 이메일이 도착했다. 요금이 발생했다는 이메일이었다. 모두 프리티어를 사용하고 있는 중인데 왜 요금이 발생할까 싶어서 AWS에 로그인해봤다. 결제대시보드에 아래와 같은 청구서를 확인할 수 있었다. 프리티어를 사용중인데 요금이 발생했다니 의아했다. AWS로 들어가서 확인해보니 Elastic Ip 즉 탄력적 ip에서 요금이 발생하고 있었다. 왜 여기서 요금이 발생할까에 대한 궁금증이 생겼는데 순간 예전에 블로그에서 읽었던 내용이 스쳐지나갔다. (사실 위에 과금 고지문을 잘 보면 0.005 per elastic ip address not attached to running instance per hour 라는 문구를 확인할 수 있다. 즉 말 그대로 ..

[springboot]cannot deserialize from Object value (no delegate- or property-based Creator) 에러 발생

스프링 부트로 만든 어플리케이션을 테스트하던 도중에 cannot deserialize from Object value (no delegate- or property-based Creator) 라는 에러를 만났다. api 를 호출하면서 어떤 Dto를 전달해주는데 그 사이에서 형식이 맞지 않았던 혹은 전달이 잘못되었든 어딘가에 문제가 생겼을 것이라고 추측하였다. 해결방법은 아주 간단하다. 아래는 내가 api로 전달하고자 했던 Dto 이다. (해결한 모습이다.) 위와 같이 Dto를 선언해줌으로써 해결할 수 있었다. 원래 해결되기 이전에는 @NoArgsConstructor 어노테이션이 없었다. 왜 이 어노테이션이 없으면 에러가 발생할까? jackson library가 빈 생성자가 없는 모델을 생성할 줄 모르기 ..

[JPA사용중] TransactionRequiredException: Executing an update/delete query 에러 발생/ 트랜잭션이란?

굉장히 간단한 에러이다. 근데 로직이 틀린게 아닌데 왜 에러가 날까 싶을거다. update나 delete 구문을 실행할때 @Transactional 어노테이션을 달아주지 않으면 발생하게 되는 에러이다. 이렇게 @Transactional 을 달아주면 에러가 나지 않는다. @Transactional 이 하는 기능도 굉장히 직관적인데 디비를 공부했다면 트랜잭션이 무엇인지 알것이다. 기억을 더듬어보자. @Transactional 은 이 어노테이션이 붙은 메서드의 경우 메서드가 포함하고 있는 작업 중에 하나라도 실패할 경우 전체 작업을 취소한다는 뜻이다. 전체 작업을 취소한다? 데이터베이스를 배웠다면 기억이 날텐데, 우리가 B라는 사람에게 돈을 보냈는데 갑자기 중간에 은행이 번개를 맞아서(ㅋㅋ) 실제로 내가 보낸..

반응형