전체 글 386

장고 어드민 무료 테마 Unfold 추천!

기본 장고 어드민 기본 장고 어드민은 예쁘지 않다. 이렇게 생겼다. 모서리도 다 직각이다. 너무 딱딱한 느낌이다. django-unfold Unfold 테마를 적용한 결과다. 기본 장고 어드민 형태를 유지하면서 세련되게 변경된 것을 볼 수 있다. 장고를 웹사이트로 변경해주는 무료 테마도 보이지만, 웹사이트로 쓰는 용도가 아니라 사내 어드민 용도라면 Unfold 테마로도 충분한 거 같다. unfold 적용 시 주의사항 장고 어드민 모델 추가 시 from unfold.admin import ModelAdmin 이용할 것! 기존 장고 from django.contrib.admin import ModelAdmin을 이용하면 안 된다. 그러면 예쁘지 않게 나타난다. 이렇게 보인다. User, Group 등 기본으..

pytest-BDD(Behavior-driven development) REST API 테스트 픽스처fixture 예

BDD(Behavior-driven development)란? BDD는 한국어로 번역하면 행위 주도 개발로, 소프트웨어 개발 방법론 중 하나다. 소프트웨어 기능을 사용자의 행위 중심으로 설명한다. 예를 들면 아래와 같다. Title: Returns and exchanges go to inventory. As a store owner, I want to add items back to inventory when they are returned or exchanged, so that I can sell them again. Scenario 1: Items returned for refund should be added to inventory. Given that a customer previously bou..

야근을 하게 만드는 회사, 야근이 기본인 회사를 최대한 빨리 나와야 하는 이유는?

시간이 지날수록 다른 회사로 갈 수 없고 벗어나기 어려워지기 때문이다. 왜 다른 회사로 갈 수 없을까?이직을 위해서 가장 필요한 것이 무엇일까? 시간이다. 이직을 위해서는 지금까지 작업한 것들을 포트폴리오로 정리도 해야 하고, 이력서도 다듬어야 하고, 구인공고도 찾아보고 지원도 하고 면접도 봐야 한다. 이 모든 것들을 위해서 가장 필요한 것은 바로 시간이다. 여유 시간이 없다면 이직할 수 없다. 야근을 하게 만드는 회사, 야근이 기본인 회사가 빼앗아 가는 것은?당연히 시간이다. 하루 종일 일하고 집에 와서 잠만 자고 다시 일하러 나가는 일상이 반복된다면? 시간이 없다. 주말에는 녹초가 되고, 밀린 집안일을 처리하느라 벅차다. 야근의 굴레에서 벗어나고 싶다는 생각은 스쳐지나가듯 할 수 있지만 실행에 옮길 ..

Q. 파이썬Python 기본 반올림 함수인 round(0.5)의 결과는?

A. 0이다. 중고등학교 수학시간에 배운 반올림 방식으로 생각하면 1이어야 할 거 같은데 0이 나온다. 그 이유는 파이썬 round는 우리가 수학시간 때 배운 사사오입 방식 4이면 내리고 5이면 올리는 게 아니라 오사오입 방식이기 때문이다. (참고: 반올림 위키백과)오일 때 버리고 그 다음 오는 올린다. 그래서 round(0.5) -> 0, round(1.5) -> 2가 된다. 결과가 짝수로 나온다. round(0.5) -> 0 round(1.5) -> 2 round(2.5) -> 2 round(3.5) -> 4로 가까운 짝수값이 나온다. 소숫점 첫째 자리에서 반올림해봐도 특이하다. round(0.01, 1) -> 0.0 round(0.05, 1) -> 0.1 round(0.15, 1) -> 0.1 ro..

Q. 깃허브github에서 깃플로git-flow와 스쿼시와 병합Squash and merge을 함께 쓰면 안 되는 이유는?

A. release 브랜치에서 main 브랜치로 PR(Pull Request) 요청할 때마다 충돌이 발생한다. 스쿼시와 병합Squash and merge이란?여러 커밋을 하나의 커밋으로 밀어넣어서(squash) 병합(merge)해주는 기능이다. 예를 들어서 feature 브랜치에서 develop 브랜치로 PR을 만들었다고 하자. feature 브랜치에서 작업한 커밋이 10개다. 스쿼시와 병합 기능을 쓰면 단 1개의 커밋으로 10개의 커밋이 합쳐져서 develop에 병합된다. 그래서 커밋 이력이 깔끔해진다. 충돌 예시 add hello title, add hello text란 두 커밋을 하고 feature/add_hello 브랜치에서 develop으로 PR을 만든 경우다. Squash and merge한 ..

개발 Dev/깃 Git 2023.10.11

Q. JOSM에서 한 점을 움직였을 때 여러 선이 한꺼번에 움직이는 원리는?

A. 점node에 id가 부여되어 있기 때문에 가능하다. 아래 그림처럼 한 점을 움직였을 때 해당 점과 관련된 여러 선이 한꺼번에 움직인다. 다른 편집툴은 보통 한꺼번에 움직이지 않는다. OSM 파일을 보면 아래와 같다. 4개의 점node와 2개의 선way로 이루어져 있다. 선way 정보는 변경이 없고, 점node의 좌표값이 변경되는 것이다.

Q. OSM 파일을 GeoJSON으로 변환하면 어떻게 바뀔까?

A. GeoJSON 데이터가 Feature로 바뀐다. osm을 GeoJSON으로 바꿔주는 파이썬 팩키지 osm2geojson을 활용해서 바꿔보자. 코드는 아래와 같다. 예제 코드를 그대로 활용하고 결과인 json을 파일로 저장한 코드다. import codecs import json import osm2geojson with codecs.open('sample.osm', 'r', encoding='utf-8') as data: xml = data.read() geojson = osm2geojson.xml2geojson(xml, filter_used_refs=False, log_level='INFO') with open("result.json", "w") as f: json.dump(geojson, f) ..

JOSM을 데이터베이스에 저장한다면 어떻게 설계해야 할까?

JOSM 구조 그대로 설계할 수 있을 거 같다. 예제 JOSM의 출처는 https://learnosm.org/ko/josm/start-josm/ 다. node node는 위 예처럼 lat, lon 좌표값을 갖고 있고, 태그들을 갖고 있다. 또 태그는 id가 없다. 태그의 경우 shop, shoes를 하나 만들고 계속 쓰기보다는 node에 종속된 느낌이다. node : tag = 1 : n 관계로 표현할 수 있다. 위 내용을 통해서 node 테이블이 필요하고, tag 테이블이 필요하다는 것을 알 수 있다. 테이블 node { id int [pk] created_at timestamp coordinates geometry[Point] } 테이블 node_tag { node_id int [pk] k varch..

JOSM 주요 용어Terminology 살펴보기

JOSM을 제대로 사용하려면 JOSM에서 사용하는 주요 전문 용어를 살펴볼 필요가 있다. JOSM Wiki 첫 소개에 전문 용어부터 나온다. 용어는 총 5가지다. Node, Way, Relation, Area, Tag. 하나씩 원문과 함께 살펴보자. Node A Node is a point. 노드는 하나의 점이다. Way A way is a line connecting multiple nodes. Way, therefore, is a general term for series of joined nodes, not just for roads or ways in reality. 길은 여러 노드들을 연결하는 하나의 선이다. 그래서 길의 실제의 도로나 경로만을 뜻하는 것이 아니라 연결된 노드의 연속을 일반적으로..

Q. JOSM이란?

A. 자바로 만들어진 OpenStreetMap(OSM) 무료 확장 가능한 에디터다. 공식 홈페이지 설명은 다음과 같다. JOSM is an extensible editor for ​OpenStreetMap (OSM) for ​Java 8+.It supports loading GPX tracks, background imagery, and OSM data from local sources as well as from online sources and allows to edit the OSM data (nodes, ways, and relations) and their metadata tags. 출처: josm.openstreetmap.de OSM 에디터 중에서 기능이 많고, 가장 좋은 거 같다. 아래는 오..

Q. GeoJSON이란? GeoJSON을 이루는 객체 종류는?

A. GeoJSON은 다양한 지리 데이터 구조를 인코딩하기 위한 형식이다. geojson.org 에 나온 영어 원문 정의는 아래와 같다. GeoJSON is a format for encoding a variety of geographic data structures. 출처: geojson.org 원문 설명을 보자. GeoJSON supports the following geometry types: Point, LineString, Polygon, MultiPoint, MultiLineString, and MultiPolygon. Geometric objects with additional properties are Feature objects. Sets of features are contained b..

깃모지gitmoji를 표로 한눈에 정리!

깃모지gitmoji란? Carlos Cuesta가 정리한 깃Git용 이모티콘이다. 커밋 메시지 맨 앞에 이모티콘을 사용한다. 아래 예를 보면 📄 Update LICENSE라고 커밋 메시지를 쓴 게 예이다. 깃모지 표 이모티콘 이모티콘 예약어 영어 뜻 한국어 번역 🎨 :art: Improve structure / format of the code. 구조 / 코드 포맷 개선 ⚡️ :zap: Improve performance. 성능 개선 🔥 :fire: Remove code or files. 코드나 파일 제거 🐛 :bug: Fix a bug. 버그 수정 🚑️ :ambulance: Critical hotfix. 긴급한 수정(핫픽스) ✨ :sparkles: Introduce new features. 새로운 기능..

개발 Dev/깃 Git 2023.10.03

PostgreSQL에 PostGIS 플러그인 설치해서 DBeaver로 간단히 실습해보기

설치 도커를 이용한 설치 postgis 플러그인까지 설치된 postgis 도커 이미지가 존재하므로 바로 사용해서 도커에서 실행할 수 있다. 물론 postgres 도커 이미지를 실행한 뒤 postgis 플러그인을 따로 설치할 수도 있다. 아래 예와 같은 도커 명령어로 도커 이미지 설치 및 실행할 수 있다. POSTGRES_PASSWORD=password로 비밀번호는 password가 된다. docker run --name postgis-container -e POSTGRES_PASSWORD=password -p 5432:5432 -d postgis/postgis DBeaver로 접속해보면 아래처럼 잘 접속이 된다. 아래 예처럼 postgis에 접속하면 테이블이 이미 존재한다. spatial_ref_sys ..

Q. 래빗엠큐RabbitMQ에서 큐Queue와 메시지Message 중 어떤 것이 메모리를 더 많이 차지할까?

A. 큐 1개가 메시지 1개보다 약 700배 정도 더 차지한다. RabbitMQ는 Docker로 설치 및 실행했다. 2 core, 메모리는 4GB 큐를 하나도 만들지 않았을 때 136 MiB, CPU 사용량도 1% 미만이었다. 큐를 30000개 추가했을 때 메모리 사용량 약 1400GiB 증가 이 상태에서 아래 코드로 큐를 30000개 추가했다. import time import requests from requests.auth import HTTPBasicAuth rabbitmq_server = 'http://localhost:15672' rabbitmq_user = 'guest' rabbitmq_password = 'guest' def create_queue(name): vhost_name = '%2..

Q. 주피터 노트북Jupyter Notebook에서도 sentry를 쓸 수 있을까?

A. 그냥 사용하면 작동하지 않는다. 주피터 노트북 매직 명령어로 등록하면 사용할 수 있다. sentry 에러 모니터링 툴 사용법을 보고 프로젝트까지 모두 만들자. 예제 코드 실행 시 오류 모니터링 실패 예제 코드 그대로 주피터 노트북에서 실행해보자. 센트리 이슈에 에러가 추가되지 않는다. 매직 명령어 등록 매직 명령어 등록이 필요하다. jupyter notebook 파일이 있는 곳에 아래 코드로 sentry_magic.py 란 파일에 만들자. sentry_dns 에는 당연히 자신의 Project 것을 입력해야 한다. from IPython.core.magic import register_cell_magic import sentry_sdk sentry_dns = "https://61542d0d570096..

인공지능 AI 2023.09.02

sentry 에러 모니터링 툴 사용법

sentry란? 에러 모니터링 및 애플리케이션 성능 모니터링(Application Performance Monitoring, APM) 툴이다. 더 좋고 유명한 Datadog이 있지만 워낙 비싸기 때문에 많은 회사들이 sentry를 쓴다. 사용법 계정 생성 사용법은 아주 간단하다. 우선 sentry.io 가입한다. 구글 계정이나 깃허브 계정을 사용하는 것이 편하다. 가입 중에 Organization을 입력해야 한다. 적당한 것을 입력하자. 프로젝트 추가 다 끝났으면 이런 화면이 나온다. Create Project를 누르자. 프로젝트를 만들어야 사용할 수 있다. 필요한 플랫폼을 선택하면 된다. 예시로 파이썬을 골랐다. Create Project를 누르고 framework를 선택하면 끝. Skip 해도 된다...

백엔드 Back-end 2023.09.02

Visual Studio Code 원격 개발 기능으로 서버 접속해서 파이썬 파일 실행, 디버깅 하는 방법

Visual Studio Code 설치 https://code.visualstudio.com/ 여기서 내려받을 수 있다. 내려받아서 설치하자. 실행하면 아래와 같은 화면이 나타난다. 네모가 4개 있는 아이콘이 익스텐션 아이콘이다. 그것을 누른 뒤 검색창에 remote를 누르고 Remote Development를 설치하자. SSH 접속 설정 F1키를 누르자. 아래처럼 최상단에 Remote-SSH: Open SSH Configuration File... 을 클릭한다. 기본 값인 가장 맨 위의 /.ssh/config를 누른다. 아래처럼 파일이 생성된다. 입력 내용에 맞게 입력하면 된다. 내 로컬 AI 서버 접속 설정 정보 예는 다음과 같다. private key를 이용해서 접속하는 경우 아래 예처럼 Ident..

파이참 원격 개발 기능으로 서버 접속해서 파이썬 파일 실행과 디버깅 하는 방법

원격 개발Remote Development이 필요한 상황 백엔드 개발의 경우 개발할 때 로컬에서 주로 개발하므로 원격 개발이 그리 많이 필요하지 않다. 하지만 인공지능 개발을 하다보면 원격 개발 기능을 자주 사용하게 된다. 로컬 컴퓨터에 GPU 성능이 좋지 않아 딥러닝 코드를 실행시키는 것조차 어려운 경우가 많기 때문이다. 그래서 본인 노트북에서 고성능 GPU가 달린 컴퓨터로 접속해서 원격 개발하는 경우가 많다. 파이참PyCharm 원격 개발Remote Development 파이참PyCharm을 실행하면 아래와 같은 화면이 나온다. 아쉽지만 원격 개발은 PyCharm Pro만 지원이 된다. Remote Development를 누르고 SSH를 누르자. SSH 접속 화면이다. 접속 방법 로컬 서버 예 같은 ..