IT/컴퓨터 (26개의 글)

갤럭시북 이온2 램 추가 장착 방법 

2021. 02. 10 IT/컴퓨터 > 하드웨어
이전 포스트에 이어서.. 삼성 갤럭시북 이온2 간단 리뷰 (NT950XDA-K87AW)   갤럭시북 이온2를 다나와에서 검색해서 구매했는데, 이상한게 나머지 사양은 같고 램 8G인 제품과 16G 인 제품이 거의 30만원 가까이 차이가 나는것이다. 지금 하는 프로젝트가 다루는 파일들이 많아서 램 16G로도 약간 부족하고 32G는 되어야 원활하게 일을 할 수 있는데 32G 제품은 8G제품보다 70만원 이상 비싼 상태?!   다행인 것은, 갤럭시북 이온2 13인치는 기판 설계상 업그레이드가 불가능하다고 하는데, 15인치 모델은 내부에 공간이 있어 램을 1개, SSD도 1개 추가로 장착이 가능하다(NVMe M.2 타입). 보통 DIY로 내가 추가하려면 뜯기도 귀찮고 제품 손상 위험도 약간 있으니 가격차가 웬만하면 그냥 16G나 32G 모델을 사겠는데, 이번 경우에는 도저히 그렇게 할 수 없는 정도라 결국 본체는 8G 모델을 사고 램을 하나 더 샀다. 검색해보니 32G DDR4 램이 15만원정도라 넉넉하게 쓰려고 32G짜리를 샀다.   램을 2개 쓰는 경우 같은 용량이 아니면 오히려 게임에서 프레임 저하가 생기는 등 성능 저하가 있는 경우도 있다고 하는데 내 상황은 어차피 게임은 하지 않고 용량 자체가 중요한 경우라서 별 고민 없이 32G를 장착.   하부를 보면 네 귀퉁이에 고무로 패딩이 되어 있다. 우선 이 부분을 제거해야 한다.   이 부분이 잘 제거되지 않아 은행 보안카드 등으로 제거하는것을 추천하는 리뷰도 보았는데, 내 경우에는 그냥 손톱으로 잘 밀어서 빼니 빠졌다. 잘 안 되는 경우 날카롭지 않은 도구를 써서 제거하는것이 좋을 듯. 빼고 나면 나사가 있어 제거해 주어야 한다.   나사가 강하게 결합되어 잘 풀리지 않고 손상되는 경우도 있다고 하는것 같으니 홈에 딱 맞는 사이즈의 드라이버를 이용하는것이 좋을 것같다. 일반적으로 쓰는 드라이버는 약간 클것같고 흔히 쓰는 사이즈보다 약간 작은 사이즈가 필요하다.   나사를 제거하고 나면 뒷판을 분리해야 하는데, 뒷판이 얇아 힘을 잘못 주면 휘거나 부러질 수도 있을것같으니 조심해서 작업을 해야 한다. 본체를 비틀면 틈이 생긴다고도 하는데, 본체 자체에 변형이 생겨버리면 골때리는 상황이 될것같으니 개인적인 생각으로는 본체에는 힘을 주지 않는것이 좋을 것같다. 분해를 시작하기 좋은 부위는 힌지 바로 옆부분이다. 이 부분을 카드같은것으로 약간 들어올리면 조금 틈이 생기는데, 이 틈으로 살살 카드를 밀면서 비틀어서 분리를 시작해 나가면 좋은것같다.   반대쪽도 마찬가지로   결합부위는 상당히 튼튼하게 돼있어서 생각보다는 힘을 조금 더 줘야 딱! 하고 분리가 된다. 위의 힌지 부분부터 옆면으로 조금씩 진행해 나가서, 양 옆쪽 변을 분리하고 아래 변으로 진행하면 된다.   아랫변도 거의 분리되어 오른쪽 코너만 남은 상황이다. 아래 변도 조금씩 분리한 후 전체를 다 분리해주고 들어올리면 되는데, 윗변은 약간 접착성이 있는 물질로 열 배출을 위한 구리 파이프와 붙어 있는것 같았다. 무리하지 않을 정도로 힘을 주어 살살 들어올리면 분리가 된다.    뒷판을 분리한 후 내부 모습. 외장 그래픽카드가 있는 경우 쿨링팬이 2개라고 하는데, 내것과 같이 내장 그래픽만 있는 모델은 팬이 1개이고 나머지 팬 자리는 비어있다.   쿨링팬 오른쪽 아래에 -, + 표시와 함께 여러 가닥으로 연결된 선이 파워 케이블인데, 안전한 작업을 위해서는 이것을 분리하고 작업하는것이 합선(쇼트)의 위험을 방지할 수 있다고 한다. 하지만 내 경우에는 오히려 저걸 빼다가 망가뜨릴 위험이 더 큰것같아 충전 어댑터 선만 분리한 상태로 작업하였다. 이전에 다른 노트북에서 비슷한 작업을 하다가 선을 해먹었던 적이 있어서..    램 슬롯의 모습. 이온 1 모델에서는 방열판이 램 슬롯을 덮고 있다고 하는것 같은데, 이온2가 되면서 바뀐것인지 방열판은 없다. 방열판이 장착될 나사 구멍같은것도 없는걸 보니 이 모델에는 원래 없는것같긴 하다.   왼쪽 아래에는 NVMe 타입의 SSD가 하나 장착되어 있고, 그 옆으로 빈 슬롯이 있어 하나를 더 장착할 수 있게 되어 있다. SSD는 1TB로 여유가 있어 이번에는 SSD는 추가하지 않았다.   램은 삼성 DDR4 32G 제품으로 장착. 이걸 달아도 온보드로 16G 로 나오는 제품보다 더 싸다.   램 장착은 램 가운데 나 있는 홈을 기준으로 좌우를 잘 확인하고 아래부터 밀어 넣는다.   비뚤지 않게 아래부분이 잘 들어 갔으면 이제 윗 부분을 딸깍 소리가 날 때까지 지긋이 눌러서 체결해주면 된다.   이후 조립은 분해의 역순으로 하면 된다.   장착 후 윈도우 제어판을 확인해 보면 40GB가 정상적으로 인식되는 것을 확인할 수 있다.   조심스럽게 하면 크게 어려울 것은 없는데, 요즘 노트북들은 워낙 얇고 기판도 섬세해서 무리한 힘을 가하지 않도록 주의하면서 작업해야 할 것같다. 가능하면 또 뜯을 일은 없으면 좋겠는데, 나중에 SSD를 추가하게 될지는 모르겠다. 일단 넉넉한 램을 확보했으니 쾌적한 작업이 가능할듯!    

삼성 갤럭시북 이온2 간단 리뷰 (NT950XDA-K87AW) 

2021. 02. 10 IT/컴퓨터 > 하드웨어
새로 산 삼성 갤럭시북 이온2 언박싱 및 간단 리뷰.   지금까지 HP 노트북 (HP Probook 4530s)을 사용했었는데 오래되어 새로 노트북을 사려고 알아보았다. 한 6-7년 되었나? 사실 Probook 4530s는 잘 만든 노트북이다. CPU를 i7으로 골랐었는데, 중간에 1TB짜리 SSD를 달고 램도 16G로 만들어 놓아서 아직까지도 대부분의 작업에 문제 없이 쓸 수 있다. 특히 키보드 만듦새가 훌륭해서 타이핑할때 만족도가 높았었다. 그래서 사실 새 노트북 살 핑계는 별로 없었지만.. 하지만 디스플레이 최대 해상도가 1366 x 768 인 것이 아쉽고, 2.6kg 정도로 무게가 제법 나가서 들고 다니기에 좀 어려운 점이 있었다. 최근에는 배터리가 많이 닳아서 밖에서는 오래 쓰기가 어렵기도 하고..그래서 집에 놓고 모니터를 하나 물려 서브 컴퓨터로 쓰기로 하고 새 노트북을 알아보게 되었다.   일단 난 화면은 무조건 15인치이다. 오래전에 13인치 노트북을 써 본적도 있는데 화면이 답답해 금방 잘 안 쓰게 되었다. 그 이후로는 무조건 15인치로 고르고 있다. 그 다음으로 고려한것은 무게이다. 사실 이전에 썼던 노트북들은 무게를 크게 고려하지 않고 뭐 그냥 들고 다니면 되지 하고 샀는데, 아무래도 무거우니 활용도가 떨어진다. 그런데 요즘 나오는 것들을 들어 보니 엄청 가벼운것이 아닌가? 그래서 1.5kg 이하 제품으로 검색을 해 보았다. 그랬더니 의외로 삼성 / LG 제품군만 남았는데, LG는 요즘 나오는 그램 노트북은 어떤지 모르겠지만 예전에(역시 7~8년 전) 사 보았던 제품은 내구성이 썩 좋지 않고 배터리가 부풀어올라 키보드 키 입력이 잘 안되는 등의 트러블을 겪은 기억이 있어 최종적으로 삼성 제품으로 결정하게 되었다.   그래서 고른 제품은 i7 프로세서가 달린 갤럭시북 이온2 (NT950XDA-K87AW). 상세 스펙은 공식 홈페이지에서 볼 수 있다. 내가 구입한 것은 판매업체에서 SSD를 1TB 짜리로 바꾼 제품이다. 인터넷을 통해 구입했고, 주문 이틀만에 빨리 배송되어 왔다.   박스는 흰색의 심플한 디자인이다. 요즘은 회사 불문 패키지 디자인이 많이 좋아졌다.    박스를 열면 본체와 충전용 어댑터, UFS / microSD 카드 슬롯을 열 수 있는 핀, 설명서 등이 들어 있다. 충전기는 요즘 다 그렇지만 100~240V 프리볼트라 해외에서도 콘센트 변환 어댑터만 있으면 사용할 수 있다. 리뷰에 따라서는 충전 중 본체에 전기가 흐르는 느낌이 든다고도 하는데, 개인적으로는 3일간 24시간 내내 물려놓고 쓰면서 그런 느낌을 받지는 못했다.   부직포 봉투 안에 들어 있는 본체를 꺼내 본다. 무광 흰색의 깔끔한 디자인이다. 크기는 대략 가로는 A4 용지보다 6~7cm 정도 길고, 세로는 1cm 정도 긴것같다. 두께는 1cm 조금 넘는정도. 외장 그래픽이 탑재된 모델은 1.26kg라고 하는데, 나는 노트북으로 게임은 하지 않아서 내장 그래픽 제품을 구매했다. 이 모델은 스펙상 1.19kg 인데, 확실히 가볍다. 한 손으로 들어도 부담없는 정도. 외부 재질은 마그네슘 합금이라고 하는데 금속보다는 오히려 고급 플라스틱같은 느낌? 금속재질이 손에 닿는 차가운 느낌을 싫어하는데 그런 느낌이 전혀 없어서 좋다.   힌지 부분은 빛에 비추면 살짝 무지개빛이 나도록 처리가 되어 있어 포인트를 더해 준다.   왼쪽 측면에는 전원 어댑터 단자, HDMI, 썬더볼트/USB-C 단자, 그리고 오디오 입출력 단자가 있다. 핸드폰 충전기를 이용해 USB-C 케이블로도 충전을 할 수 있다. HDMI 단자는 얇은 노트북들은 미니 HDMI단자가 달려 있어 불편한 경우도 있는데, 표준 규격 단자가 달려 있어 아무 HDMI 케이블이나 집어들고 연결하면 되니 편하다. 아래쪽에는 스피커가 있다. AKG 스피커로, 음질은 아무래도 크기상 저음부는 한계가 있지만 무난하게 들어줄 만한 정도.   오른쪽 측면에는 USB 3.0 단자 2개와 UFS / MicroSD 카드 슬롯, 스피커가 있다. 내장 SSD 슬롯도 하나 더 있어서 저장 용량 걱정은 없을듯.     펼치면 대략 이런 모양.   Core i7 스티커가 붙어 있고, 오른쪽 shift 키 옆으로 지문 센서가 있다. 지문 인식이 상당히 빨리 돼서 로그인이 신기하고 편하긴 한데, 지문 센서에 자꾸 기름이 묻는것같아 신경이 좀 쓰인다. 그리고 지문 센서때문에 오른쪽 shift 키의 가로 길이가 짧아져서 타이핑할때 에러가 종종 난다. 며칠 쓰니 적응이 되기는 했지만, 그냥 지문 센서는 저 인텔 스티커 옆같이 아예 다른곳으로 뺐으면 어떨까 싶다. 안 그래도 자리가 모자란 노트북 키보드인데.   펑션키와 Esc를 누르면 온라인 채팅 상담으로 연결된다고 하는데..저 스티커가 미관을 해치는것같아 뗄까 생각중이다. 떼고 나면 끈적이가 남는것은 아닐지   버튼을 눌러 보면 이런 앱이 뜨면서 상담센터로 연결되는듯하다. 다행히 바로 상담원이 나오는것은 아니고 간단한 가입 절차가 필요한 모양이라 더 진행해보지는 않았다.   덮개를 열어서 세우면 힌지 부분이 아래 사진처럼 내려가서, 노트북을 내려 놓으면 아래 부분이 약간 뜨게 되어 있다. 키보드 타건감과 발열 감소를 위한 통풍을 위한 디자인이라고 하는데, 좋은 아이디어인것 같기는 한데 반복 사용에도 버텨 줄지 약간 신경이 쓰이기는 한다.   아래 면에는 통풍을 위해 구멍이 2열로 쭉 뚫려 있다. 지금까지 3일 사용해본 결과, 게임은 아니지만 메모리랑 CPU에 제법 부하가 걸리는 상당히 헤비한 작업을 돌려 보았는데도 열감은 별로 느껴지지 않는다.   처음 전원을 켜면 충전이 필요하다는 표시가 나오고, 어느정도 충전 이후 사용하면 된다.   보통 노트북을 사면 잡다한 프로그램이 깔려 있고 대부분 체험판이거나 제약이 있어 실제 쓰지는 않게 되어 지저분한데, 그나마 이 노트북은 그런것은 덜한것 같다. 이것저것 깔려 있긴 한데, 주로 삼성 자체 앱들이라 돈내고 정식버전을 사라든지 하는 귀찮은 일은 안 시키는듯. 그런데 삼성 스마트폰과 연결된다는 Dex는 잘 작동하지 않는다. 폰의 문제인지 노트북의 문제인지 더 살펴봐야 할듯.   어두운 곳에 두면 키보드에 백라이트가 들어온다. 별것 아니지만 있으니까 그럴듯해 보인다. 디스플레이는 QLED 디스플레이로 화면이 아주 쨍하고 색감이 좋아서 사진 작업에도 좋았다. 아직 낮에 야외에서 사용해보지는 못했는데 타 노트북 대비 밝은 화면을 보여준다고 한다.   32인치 QHD 모니터도 하나 샀는데, 책상에서 쓸 때는 여기 물려 쓰니 시원하고 좋다.     오랜만에 새 노트북을 샀는데, 스펙과 무게, 디자인 모두 아주 만족스럽다. 실 사용을 더 해 보아야 장단점을 알 수 있겠지만 며칠 돌려본 결과 큰 단점이랄것은 없는것같다. 게임은 메인 컴퓨터로 하기 때문에 할 일이 없고 영상작업도 하지 않아서 모르겠지만, 기본적인 사무 작업 이외에 제법 부하가 걸리는 프로그래밍 용으로도 무리 없는 쾌적한 동작을 보여 준다.   램을 8G 모델을 선택했는데, 16G 모델과 가격차가 너무 나서 내가 직접 사서 끼우려고 일부러 8G모델로 선택했다. 램 끼우는것은 따로 사진을 찍어서 정리해 보겠다. -> 갤럭시북 이온2 램 추가 장착 방법  

파이썬으로 영문 문자열 모든 대소문자 조합 구하기 

2020. 10. 23 IT/컴퓨터 > Python
홈페이지에 검색 기능을 구현하다 보니 한 가지 문제가 생겼는데, 영문 검색의 경우 입력한 키워드의 대소문자가 일치하지 않으면 검색이 되지 않는 것이었다. 예를 들어 글 제목을 검색할때 Hello 라고 검색하면 hello 라는 문자열이 들어 있는 경우에는 같은 단어인데도 검색이 되지 않는 식이다. 이런 동작은 바람직하지 않으므로 개선을 해 주고 싶었다. 물론 유저가 Hello, hello 두번 검색을 해 볼수도 있겠지만 꼭 첫글자만 대문자라는 법도 없고, 모든 경우의 수 (이 경우 2^5 = 32가지)를 사용자가 일일이 검색한다는것은 생각하기 어렵다. 따라서 입력한 키워드를 이용해 가능한 모든 영문 대소문자 조합을 만들고, 이를 모두 검색해서 일치하는 결과값이 있으면 표시해주기로 했다. 처음엔 for 반복문을 이용해서 구현해보려고 했지만 쉽지 않았다. 검색을 해 보니 다행히 파이썬은 itertools 라는 훌륭한 도구를 제공하고 있어 그것을 이용한 방법을 기술해 보겠다. 내용은 stack overflow의 아래 문답을 기초로 했다. https://stackoverflow.com/questions/11144389/find-all-upper-lower-and-mixed-case-combinations-of-a-string   일단 결론부터 써 보면   이렇게 하면    이렇게 'fox' 라는 단어의 각 글자를 대소문자로 조합한 결과를 모두 리턴받게 된다.   아래는 각 단계별로 하나하나 공부해 본 내용.   파이썬의 itertools 모듈에는 여러가지 조합을 만들어낼 수 있는 다양한 메서드를 제공하고 있는데, 내용이 많으므로 다른 것들은 생략하고.. product() 메서드에 대해서만 알아보면,  이 함수는 전달받은 임의의 개수의 인자에 대해서 각 인자의 원소들로 데카르트 곱(Cartesian product)을 구해 이를 튜플 형식의 원소를 가진 반복자로 반환해준다.   라고 써놓고 보니 오히려 더 복잡한데, 실제 동작을 보면 그렇게 어렵지는 않다. 데카르트 곱이라는것은 어떤 집합이 있을때 각 집합에서 원소를 하나씩 골라서 각각의 원소로 이루어진 쌍을 모두 구한다는 것이다.  즉 집합 A = {a,b}, 집합 B = {1,2,3} 이라고 할때 데카르트 곱을 A x B 라고 하면 결과는 A x B = {(a,1), (a,2), (a,3), (b,1), (b,2), (b,3)} 가 되는 것이다.   만약 집합 A, B, C 가 각각 A = {a, b}, B = {1,2}, C = {가,나} 라면 A x B x C 는 A x B x C = {(a,1,가), (a, 1, 나), (a, 2, 가), (a, 2, 나), ......... , (b, 2, 가), (b, 2, 나)} 가 될 것이다.   itertools.product() 메서드는 바로 이 동작을 하는 것이다. 즉 어떤 단어를 이루는 글자들의 모든 대소문자 조합을 구하려면, 글자 하나하나의 대소문자 쌍을 원소로 하는 집합들을 만들어 각 집합들에 대해 데카르트 곱을 구하면 되겠다. 원하는 단어가 'fox' 라면, (f, F), (o, O), (x, X) 세 집합의 데카르트 곱을 구하면 되는것이다.   위의 코드를 다시 한줄한줄 살펴 보면, 제너레이터 표현식을 이용해 fox라는 단어를 이루는 문자들의 대소문자를 원소로 갖는 튜플들을 생성해준다. 제너레이터를 리스트로 만들어 프린트해보면 원하는대로 각각의 글자의 대소문자 튜플들이 생성되어 있다.   튜플 언패킹을 이용해 제너레이터 안의 원소들을 itertools.product()에 전달해주면 각각의 원소들의 데카르트 곱을 구해준다. 프린트해보면 f, o, x 각각의 대소문자에 대한 8가지 조합을 모두 만들어준 것을 알 수 있다. 즉 위처럼 튜플을 언패킹해주는 것은 다음과 같은 동작이다.   이렇게 만들어진 letters 객체의 각 원소 튜플에서, 글자들을 join() 함수를 이용해 연결해주고, 즉 이렇게 조합된 단어들을 리스트 컴프리헨션을 이용해 리스트로 만들어 준다.     이렇게 해서 함수 리턴값으로 원래 단어에 대해 가능한 모든 대소문자 조합을 받아서, 사이트 검색시에 사용자가 무슨 단어를 입력했든지 대소문자 상관없이 검색해주는 기능에 이용하였다.   파이썬 반복자는 결과물이 바로 눈에 보이는것이 아니라 필요할때마다 하나씩 꺼내 쓰는 식이라 처음에는 직관적으로 이해하기가 어려운것같다. itertools 내의 함수들의 동작도 이와 관련되어 좀 머리가 아프지만 잘 이해하고 사용하면 복잡한 코딩을 피하고 요긴하게 쓸 일이 있을 듯하니 조금 더 공부를 해 봐야겠다.

Django 커스텀 manage.py 명령어 만들기 

2020. 10. 05 IT/컴퓨터 > Django
  장고 프로젝트에서 manage.py 를 이용해 프로젝트 관련 명령을 실행할 때가 있다. 등등 테스트용 서버를 띄우거나 models.py 내의 모델을 수정하고 새로 마이그레이션 하는 등의 작업을 manage.py 라는 파일을 통해 터미널의 커맨드 라인에서 입력해서 하도록 되어 있다.   (참고로 sub 커맨드 없이 그냥 python manage.py 만 실행해 보면 실행 가능한 sub커맨드들을 볼 수 있고, 각각에 대해서 help를 쳐서 사용법을 살펴볼수 있다.)   이렇게 장고에서 기본적으로 제공하는 커맨드들 이외에, 원하는 동작을 수행하는 sub 커맨드를 직접 작성할 수도 있다. 어떤 작업이 필요할 때 꼭 manage.py 를 통하지 않아도 파이썬 자체 명령으로 실행되는 별도의 파일을 만들어 실행할 수도 있지만, 이렇게 하면 기본적인 장고 설정들이 로딩되지 않기 때문에 프로젝트의 models.py 에서 사용하던 모델들을 불러와 데이터베이스와 연동된 작업을 하는것이 어렵다.  manage.py 를 통해 실행되는 커맨드들은 장고 환경을 자동으로 로딩해 주고 실행되기 때문에 Django shell 에서 작업하는것과 같이 프로젝트에서 사용하던 model 들을 별도의 복잡한 설정 없이 바로 import 해서 데이터베이스와 관련된 작업을 할 수 있어 편리한 점이 많다. (Django shell 을 띄우는 것은 python manage.py shell 명령으로 가능) 그래서 주로 데이터베이스에 항목들을 일괄 입력/수정하는 등의 작업이 반복적으로 필요할 때 이런 커스텀 커맨드들을 등록해 놓으면 편리하다. 이렇게 커스텀 커맨드를 등록해 놓으면 리눅스 환경에서 cron 을 이용해 반복적으로 해야 하는 일이 있을때도 커맨드 한 줄로 처리할수 있다.   커맨드를 만들려면 우선 등록된 app 디렉토리 아래에 management/commands 라는 디렉토리를 만들어 주어야 한다. manage.py 가 있는 프로젝트의 루트 디렉토리를 my_project/ 라고 하면  my_project/ 디렉토리 아래에 기존에 my_app/ 이라는 앱 디렉토리가 있고 그 디렉토리 안에 views.py, models.py, urls.py 등의 기본 파일들이 있을 것인데 그 아래에 management/commands 디렉토리를 만들어 주고, commands 디렉토리에 실행하고 싶은 커맨드를 my_command.py 식으로 만들어 주면 된다. 즉 안에 my_command.py 가 들어가는것이고, 이렇게 등록해주면 프로젝트의 root 디렉토리에서  와 같이 실행할 수 있다.   커맨드의 기본 형식은 다음과 같다.   BaseCommand 클래스를 임포트해주고 이를 상속받는 class Command 를 정의해준다. 커맨드 사용법을 문자열로 help 변수에 저장해주면  를 실행했을 때 해당 내용이 출력된다.   클래스 내의 handle() 메서드에 실행하고 싶은 동작을 일반 파이썬 함수로 작성해 주면 된다. 위의 경우  와 같이 실행되는 것을 볼 수 있다.     커맨드에 동작 옵션을 추가해줄 수 있다. 클래스 내에 add_arguments() 메서드를 정의해주면 된다.   저렇게만 써 놓으니 좀 막연한데, 간단한 예제를 작성해본다. my_app 앱 안의 models.py 에 사용자들끼리 주고받는 쪽지를 만들어주는 UserMessage 라는 모델이 정의되어 있고, 해당 모델로 생성된 사용자 쪽지들이 데이터베이스에 저장되어 있다고 가정하고 예시를 작성해 보겠다. 쪽지들은 읽으면 read 상태로 되고 따로 보관함에 보관할수 있는데, 보관함에 보관하지 않으면 unarchived 상태라고 가정한다.  이 중 읽은 쪽지를 일괄적으로 삭제하거나, 아니면 보관함에 보관되지 않은 쪽지들을 일괄적으로 삭제하는 커맨드를 작성하고 싶다고 해 본다. 우선    위의 커맨드는  와 같이 실행할 수 있고, 아무 옵션을 주지 않은 경우 특정 기간이 아닌 모든 쪽지에 대해 read 상태인 (즉 이미 읽은) 쪽지를 삭제하게 된다.   add_argument() 내에서 recent_range 로 지정된 인자는 위치 인자이므로 플래그 없이 바로 옵션의 값을 입력하면 된다. 이 경우 전체 쪽지 중 최근 30일간 작성된 쪽지들을 추려서 작업하게 된다.   이런 식으로 옵션과 그 값을 입력해 주면 unarchived, 즉 보관함에 보관되지 않은 쪽지는 모두 삭제한다.   특정한 여러 개의 인자들을 리스트로 전달해서 작업하는것도 가능하다.   이렇게 작성하면 지우고 싶은 메세지의 ID 를 지정해서 삭제해줄 수 있다 (여기서 ID는 데이터베이스에 저장된 순서대로 자동으로 붙는 번호이므로 사실 message의 ID를 알아내 지운다는것이 약간 현실적인 사용 례는 아닌것같지만 개념상 딱히 좋은 예가 당장 떠오르지 않아 이렇게 해 보았다. 특정 유저나 특정 단어가 들어간 쪽지를 삭제한다든지 하는 식으로 응용할수 있을듯)   이런식으로 여러 개의 숫자를 리스트로 전달해 일괄 처리하는것도 가능하다.   옵션들은 add_arguments() 메서드 안에 parser.add_arguments()를 통해 제한 없이 추가 가능하다.    다른 프로젝트에서 매주 업데이트되는 정보를 웹에서 크롤링해 와서 데이터베이스에 입력하는 작업을 하고 있는데, 이런식으로 커스텀 커맨드를 작성한 후 리눅스의 cron 으로 매주 한번씩 작업이 되게 하고 있다.    기타 자세한 내용은 Django 의 공식 문서를 참조하면 좋을 듯한데 아쉽게 아직 한글 번역은 되지 않은것같다.  공식 문서: https://docs.djangoproject.com/ko/3.1/howto/custom-management-commands/

Django GET 검색시 MultiValueDictKeyError 해결 

2020. 10. 03 IT/컴퓨터 > Django
간단한 Django 트러블슈팅 하나 포스트.   view 를 작성하다 보면 폼에서 GET 메소드를 이용하여 결과를 받아 처리해서 페이지를 표시해줄 일이 종종 있다. 주로 블로그의 글 등 어떤 object들의 검색 결과를 받아 표시해줄 때이다. 이때 GET 으로 전달된 파라미터가 있는 경우에는 해당하는 파라미터를 전달받아 필요한 처리를 해서 템플릿을 띄워 주고, 파라미터가 전달되지 않은 경우에는 기본 페이지를 보여주는 등의 처리를 하게 된다.   GET method로 폼을 제출하면 제출된 값들은 request.GET 객체에 딕셔너리 형태로 전달되게 된다 (정확히는 파이썬 딕셔너리가 아닌 장고 고유의 QueryDict 객체임).   예를 들어 블로그의 포스트를 검색하기 위한 다음과 같은 폼이 있다면    검색 버튼을 르면 각각 입력 필드의 name 인 post_search_type 과 post_search_keyword 를 key로, 사용자가 입력한 값을 value로 갖는 request.GET 객체가 생성된다. 예를 들어 option을 제목(title) 로 선택하고 'test' 라는 키워드로 검색을 한다고 할 때,  해당 작업을 처리하는 views.py 에서 request.GET을 출력해보자.   터미널에 다음과 같이 나올 것이다.   그래서 각각의 키에 해당하는 작업을 처리하기 위해서는 request.GET['post_search_type'] 혹은 request.GET['post_search_keyword'] 식으로 해당하는 값을 불러와서 처리를 해 주면 된다.     그런데 이 때 문제가, 폼에 아무 값이 전달되지 않고 페이지가 처음으로 로딩되는 경우, 혹은 query 값이 없이 url 을 통해 직접 페이지에 접근하는 경우에는 아직 QueryDict에 해당하는 key 값과 value가 생성되지 않은 상태이다. 이 상태에서 request.GET['post_search_type'] 또는 request.GET['post_search_keyword'] 의 값을 변수에 할당하려고 하면 다음과 같이 MultiValueDictKeyError 가 발생하게 된다.     (settings.py 에서 DEBUG = True 로 해 놓은 상태에서는 이렇게 에러 내용이 보이고, DEBUG = False 인 상태에서는 Internal Server Error (500) 으로 표시될 것이다.)   이를 방지하기 위해서 바로 QueryDict 의 키 값을 부르는 대신 다음과 같이 request.GET.get() 메서드를 이용할 수 있다.    이렇게 하면 get() 안에 전달한 키 값으로 QueryDict에 해당하는 key와 value 가 있는지 찾아서, key가 있는 경우에는 그 key의 value 값을 반환해주고, key를 찾지 못한 경우에는 에러를 일으키지 않고 None을 반환해 준다.  None이 반환된 경우에는 아직 검색 키워드가 입력되지 않은 상태임을 의미하므로 다음과 같이 기본 페이지를 로딩하는 등의 처리를 해 주면 되겠다.   프로젝트 진행중 잠깐 막혀서 고생한 내용이라 기록을 해 둔다.

Git config 설정하기 

2020. 09. 19 IT/컴퓨터 > 기타 프로그래밍
Git 을 사용하다가 새로운곳에 cloning 을 하거나 로컬 컴퓨터를 갈아 엎거나 하는 등의 경우에 git 환경을 새로 설정해 줘야 하는 경우가 생긴다. 가장 흔한 경우는 user.email과 user.name 이 지정되어 있지 않은 경우로, 명령을 실행하려고 하면 먼저 지정하고 나서 명령을 다시 실행하라는 메세지가 나오는 경우이다.   예를 들어  를 실행했더니 이런 메세지가 나오는 경우이다.   이런 경우에 일단 현재 설정을 확인하려면  라고 입력하면 아래와 같이 현재 config 정보가 나오게 된다.   없는 설정을 추가하거나 기존의 설정을 변경하려면 git config 명령 뒤에 설정하고 싶은 항목을 적어 주면 된다. --global 옵션을 붙이면 해당 사용자가 작업중인 모든 프로젝트에 해당 설정이 적용된다. 따로 --global 을 붙이지 않으면 자동으로 --local 옵션이 붙은것과 같이 되어 현재 작업중인 프로젝트에만 해당 설정이 적용된다.  시스템의 모든 사용자와 모든 저장소에 설정을 적용하려면 --system 옵션을 붙이면 된다.   user.name 과 user.email 이 설정되어 있지 않다면 위처럼 목록에 보이지 않는다. 설정을 위해 다음 명령어를 입력하면 된다. 특별한 경우가 아니면 보통 --global 로 설정하게 되는것같다. 설정하려는 항목의 내용을 따옴표 안에 적어 주어야 한다.   적고 나서 다시 설정 내용을 확인해 보면 와 같이 새로 설정한 user.name과 user.email 이 반영되어 있는것을 볼 수 있다.   설정되어 있는 내용을 지우려면 --unset 옵션을 이용하면 된다. 위와 같이 하고 다시 git config -l 을 해 보면 해당 정보가 삭제된 것을 확인할 수 있다(global 로 설정하지 않은 경우는 global 옵션을 적지 않아야 적용된다).

LG 43인치 모니터 43UN700 리뷰 

2020. 09. 04 IT/컴퓨터 > 하드웨어
오늘은 하드웨어 간단 리뷰를 해본다. LG 43인치 모니터 43UN700.   원래 24인치 모니터인 Dell U2412M 을 2대 연결해서 하나는 가로, 하나는 세로로 놓고 썼는데, 코딩에 취미를 붙이다 보니 여러 개의 파일을 왔다갔다 하면서 편집할 일이 많아 좀 더 큰 모니터가 있으면 좋겠다는 생각이 들었다.   한참을 고민하다가 LG 43인치 모니터를 구매했다. 국내에는 LG제품 말고도 중소기업 제품도 많이 나와 있어 선택지가 다양한것 같던데, 현재 해외 거주중이라 현지에서는 선택할수 있는 제품이 제한적이었다. 국내 중소기업 제품 정도의 가격대를 가진 제품은 아예 없고, LG가 그나마 필립스나 Dell 등의 다른 제품에 비해서 저렴해서 선택하게 되었다. 디스플레이로는 원래부터 LG가 유명하기도 하고..약 75만원 정도의 가격대인데 결론적으로는 가격 대비로도 상당히 만족스러운 제품이다.   혹시 큰 화면 모니터 구입을 고민중인 분이라면 고민하지 말고 하루라도 빨리 구입하시라고 권해드린다. 나는 몇달동안 지켜보다가 샀는데, 시간이 지나도 가격은 별로 떨어지지 않는 것같고 사용할 수 있는 날만 줄어들 뿐이라는것. 산 지 몇달 지났는데 아마존 기준으로 가격이 오히려 더 올랐다.   한 화면에 여러 개의 프로그램 창을 열어놓고 왔다갔다 작업하니 상당히 쾌적하다. 단점은 엔터테인먼트를 너무 즐기게 된다는것. 유튜브나 넷플릭스 보는것도 훨씬 재미있어진다. 큰 화면으로 하니 게임도 재미있어져서 많이 하게 되고..그리고 또 단점은 4K로 게임을 돌리려다 보니 업그레이드가 필요해진다. 그래픽카드도 사게 되고, 파워도 750으로 바꾸고, 이왕 하는것 CPU와 메인보드도 갈아버리고....결국 단계적으로 컴퓨터를 갈아 엎게 되었다. 이건 딴얘기고.   배송된 박스의 크기에 일단 한번 압도당하고 시작한다. 엄청난 크기의 박스를 들고 가는 순간부터 뭔가 만족스러운 느낌이 든다.   구성품은 다음과 같다. 먼저 모니터 본체.  무게가 상당하다. 스탠드 제외 본체 무게는 13.8kg 라고 되어 있는데, 성인 남자라면 무리없이 들 수 있을 정도지만 워낙 크기가 크기 때문에 떨어뜨리거나 부딪히지 않게 조심해야 할 듯.   스탠드 부품들. 나사들이 큼직큼직해서 조립은 쉽게 된다. 이 모니터는 스위블 (좌우 각도 조절), 피벗 (화면을 가로 세로로 돌리는것) 및 높낮이 조절은 되지 않고, 틸트 (화면 상하 각도 조절) 만 된다. 약간 아쉬운 점이지만 43인치 모니터를 피벗해서 쓸 일은 없을 듯하고, 움직이는 부분을 많이 만들면 그만큼 가격도 올라갈테니 이해할만하다.   HDMI, DP 케이블, 전원코드가 하나씩 들어 있다. 케이블 버전은 따로 표기되어 있지 않아 확인하지 못했다.   리모콘이 들어있다. 처음엔 리모콘을 쓸 일이 많이 있을까 생각했는데 화면 모드 전환 혹은 입력 기기 선택등 기능을 모니터를 건드리지 않아도 쉽게 조절할 수 있어 편리하다. 리모콘을 쓰지 않는 경우에는 설정 버튼이 본체 가운데 아래쪽에 달려 있어서 사용할수 있는데 역시 불편하다.   입출력 단자는 HDMI 4개 (1.4 2개, 2.0 2개), DisplayPort 1.4 1개, USB-C 1개, USB 3.0 2개가 있고 헤드폰 단자도 있다. 본체에서 USB-C 케이블로 USB-C 단자에 연결해서 USB 3.0 단자들을 허브로 쓸 수 있다.  USB-C 단자는 최대 60W 까지 전원 공급이 가능해서, 노트북을 이 단자에 연결하면 화면 출력도 가능하고 충전까지 충분히 된다고 한다.   박스 표기상 크기가 108cm 라고 되어 있는데 대각선 길이이고, 대략 가로 95cm, 세로 55cm 정도가 된다.   설치 후의 모습. 오른쪽의 모니터가 24인치 Dell 모니터이다. 사진이 작아서 느낌이 잘 오지 않지만 실제로 책상에 앉아 43인치 화면을 보면 아주 시원한 느낌이 든다. 가운데 띄워져있는 배경화면 파일이 1920 x 1080 이니 대략 크기가 가늠이 되실듯. 설치할 때 한 가지 팁이 있는데, 모니터를 바로 놓지 말고 A4 용지를 깔고 놓으면 좋다. 스탠드 받침 부분에 고무 패딩이 되어 있는데 이걸 그냥 책상에 바로 놓으면 모니터의 무게가 상당해서 고무가 책상에 거의 들러 붙듯이 되어 모니터 방향 바꾸기가 너무 어렵게 된다. 들어서 방향을 바꾸어야 되는데 스탠드 포함하면 무게가 17.5kg 이라.. 그리고 장시간 놔뒀다가 들어 올리려고 하면 아마 고무가 쩍 떨어지면서 손상되지 않을까 우려도 되고. 그래서 스탠드 아래에 A4 용지를 깔고 그 위에 모니터를 올려 놓았다. 너무 휙휙 돌아가 혹시 책상에서 모니터가 떨어지는 사태가 발생하지 않을까 염려했지만, 딱 적당한 정도의 압력을 유지하면서 필요할 때는 방향을 쉽게 바꿀 수 있어 그대로 쓰고 있다. 스위블 기능이 없어도 별 문제 없겠다.   에너지 등급은 중간정도라고 하는듯.    스포츠 경기를 보거나 콘서트 영상을 보면 몰입감이 장난 아니다. 인터넷 서핑이나 코딩 등 작업을 할 때의 거리에서 보면 너무 화면이 커서 오히려 좀 어지러운 느낌도 들어 약간 의자를 뒤로 빼고 보게 된다.   얼마 전 나온 플라이트 시뮬레이터를 하고 있는데, 사운드 빵빵하게 켜고 플레이하면 실제 콕핏에 들어가 비행기를 모는 느낌이 난다. 코로나바이러스로 여행도 못 가는데 약간의 대리만족이 된다. 원래는 효율적인 작업을 하려고 샀는데 어쩐지 엔터테인먼트 용으로 더 많이 활용하게 되는것같다..   물론 코딩도 한다. 코드를 큰 화면에 띄워 놓으니 왔다갔다 하면서 편집하기도 좋고, 옆의 모니터에 브라우저를 띄워 놓으면 바로바로 결과 확인하기도 좋아서 작업 능률이 상당히 올라간다. 창을 3개 정도로 분할해서 쓰면 딱 좋은것같다.   그런데 처음에는 24인치 모니터 4개를 합쳐놓은 크기로 생각했는데 실제 써 보니 그것보다는 아주 약간 작다. 픽셀 피치가 Dell 24인치 모니터의 경우 0.27mm 인데, 43UN700은 0.2451mm 이라고 한다. 그래서 43UN700에서는 글자 크기가 24인치 모니터의 대략 91% 정도의 크기가 된다. 글자가 작아 처음에는 좀 어색하고 불편했는데 1~2주 지나니 적응이 된 것같다.     리모콘으로 여러 가지 영상 모드를 쉽게 전환할 수 있다. 캡쳐가 다소 무성의하게 되었는데.. Reader 모드로 해 놓으면 눈이 편해서 장시간 작업하기에 좋다. 안티 글레어 코팅이 되어 있어 반사도 거의 없다. 기타 vivid, cinema, FPS, RTS 모드가 있고 HDR Effect 라는 모드가 있는데, PS4 등 HDR 컨텐츠를 지원하는 기기에 연결할 때는 HDR모드를 사용하면 좋다고 한다. 그냥 일반적인 상황에서는 HDR 모드로 해 보니 색감이 약간 부자연스러운것같아서 딱히 쓰지는 않고 있다.  FPS, RTS 모드도 각각의 게임 장르에 특화되어 있다고 한다. 저 모드와 별개로 어두운 곳을 밝게 보여주는 다크 맵 모드도 별도로 설정할 수 있어 게임시에 어두운 곳의 적이 잘 보이게 할 수도 있다. 요즘은 주로 혼자 하는 게임을 하고 게임을 할 때도 대부분 cinema 모드로 해서 저 모드들이 확실히 이점이 있는지는 잘 테스트해보지 못했다. 대체로 무리 없이 게임하는데 문제 없지만, 주사율이 60Hz 라 FPS 게임등을 할 때는 144Hz 등 전문 게임용으로 나온 모니터보다는 살짝 거슬리는 느낌이 있다는것같기도 하다.   모니터에 스피커가 내장되어 있는데, 잠깐 켜 보니 영화감상이나 게임 등 간단하게 쓰기에는 추가 스피커 구입을 하지 않아도 무난한 정도인 것같다. 원래 스피커는 따로 쓰고 있어서 처음 테스트 후에는 쓰지는 않고 있다.   PBP (Picture by Picture), PIP (Picture in Picture) 라는 기능을 지원하는데, PBP는 화면을 2등분 혹은 4등분해서 각각을 하나의 모니터처럼 쓸 수 있게 해 주는 기능이고, PIP는 화면 안에 작은 별도의 화면을 띄워 주는 기능이다. PBP를 하면 마우스는 전체 화면을 보통때처럼 왔다갔다 하면서 쓸 수 있는데, 각각의 분할된 화면 안에서 창 최대화 버튼을 누르면 전체 모니터에 꽉 차게 최대화되는 것이 아니라 분할된 여러 개의 공간 중 현재 창이 위치한 공간에만 꽉 차게 최대화가 된다.  그런데 게임도 했다가 인터넷도 했다가 코딩도 했다가 하면서 자꾸 PBP 모드를 바꾸려니 불편하고, 4분할 한다고 창을 4개만 쓰는것도 아니라서 그냥 통으로 전체 화면을 쓰면서 그 안에서 프로그램 창을 막 띄우고 그때그때 필요한대로 창 크기를 바꾸는게 더 편하다. 그래서 PBP는 결국 잘 쓰지는 않게 되는 기능인것같다. 취향 차이일 수 있겠지만 그냥 큰게 최고다. 리모콘으로는 위에서 보는것처럼 2, 4분할만 가능한데, OnScreen Control 이라고 LG에서 제공하는 자체 소프트웨어를 설치해서 이용하면 더 다양하게 분할할 수도 있다 (3분할, 6분할, 8분할 등도 가능). 그런데 역시 안쓴다..   지금까지 약 3개월정도 사용했는데 최근에 돈주고 산 물건 중에서 만족도가 가장 높은것같다. 화면 전환이 빠른 게임은 잘 하지 않아서 모르겠지만 웹서핑, 코딩 및 사진 편집 등 모든 작업의 효율이 올라가고 게임이나 영화감상시에도 항상 쾌적한 느낌이 든다. 아직 4K영상이 많지는 않지만 유튜브에서 4K 콘서트 영상같은것을 띄워놓고 가까이서 보면 현장에 실제로 있는 느낌마저 든다. 주식투자 할때도 HTS를 43인치 전체 화면을 쓰니 차트같은것 여러개 띄워놓고 보기도 좋고..   사실 아주 기술적인 디테일은 사실 잘 모르기도 하고 좀 둔한 편이라 그런 내용에 대해 리뷰하기는 어렵지만, 일반적인 용도로 쓰기에는 모든 면에서 쾌적함의 정도가 달라지므로 아주 만족스럽다. 다른 리뷰를 보면 뭐 자잘한 불편사항이 있다고 되어 있기도 한데 개인적으로는 쓰면서 불편한점이 전혀 없어 뭐라 평하지는 못하겠다. 다행히 불량화소도 하나도 없는것같고..대화면 모니터 구매를 고민 중인 분이라면 이 제품을 구매하셔도 후회 없으실듯.

Nginx 에서 www 도메인을 루트 도메인으로 연결하기 

2020. 07. 12 IT/컴퓨터 > 네트워크
  이전 글에서 DigitalOcean 에 올린 프로젝트에 나의 도메인을 연결해 보았다. DigitalOcean 에 나의 도메인 연결하기   원래 인터넷 초창기에는 world wide web, 즉 www. 가 붙은 도메인이 공식 주소인 경우가 많았는데, 요즘은 사이트 공식 주소에 www. 가 붙어 있으면 좀 촌스럽고 시대에 뒤떨어졌다고 생각하는 분위기인 듯하다. 대개 사람들이 사이트 이름을 기억할때 www. 를 붙여서 기억하지 않기 때문에 인터넷 주소 창에 windybay.net 과 같이 루트 도메인 (naked domain, root domain 또는 bare domain 등으로 부른다) 을 쳐서 접속하지 www.windybay.net 으로 들어오는 경우가 잘 없는 듯.   하지만 www.windybay.net 으로 접속하는 경우도 있을 수 있는데, 이때 리디렉션 설정을 따로 해 놓지 않았다면 페이지가 뜨지 않기 때문에 , 사용자들이 사이트가 다운된 것으로 잘못 생각할 수 있을 것이다. 이런 일은 사이트 홍보에 도움이 되지 않기 때문에 www. 로 들어오는 트래픽을 루트로 안내해 주는 설정을 해 주면 좋겠다.   다른 호스팅 업체들의 경우 잘 모르겠는데 godaddy에서는 기본적으로 루트 도메인이 기본으로 되어 있고 digitalOcean에서도 바로 루트로 연결이 가능하기 때문에 루트 도메인 사용에 문제는 없다 (다른 업체의 경우 www. 도메인이 기본이고 루트로 연결하는 것이 까다로워서 애를 먹기도 했었다). www 로 들어오는 연결을 루트로 연결해 주는 방법도 여러가지가 있는데, 일관성이나 사이트 홍보 (SEO, search engine optimization) 측면에서 권장되는 방법은    서비스하고 싶은 도메인을 결정한 다음 (www. 에 컨텐츠를 둘 것인지 아니면 루트 도메인에 둘 것인지) 다른 쪽으로 들어오는 연결을 전부 내용이 들어 있는 도메인으로 돌려 주는 것   이 좋다고 한다. 즉 여기서는 루트 도메인에 모든 컨텐츠가 올라가 있고, www. 에는 아무 내용은 없고 www. 로 들어오면 자동으로 루트로 가도록 서버에서 설정해 주는 것이다 (반대로 www. 에 올려놓고 루트로 들어온 연결을 www. 로 돌려줄수도 있겠지만). 이를 영구 리디렉션 (permanent redirection) 또는 301 리디렉션 (301 redirection) 이라고 한다. 301은 요청된 리소스가 영구적으로 다른 곳으로 이동되었다는 HTTP 응답 상태 코드이다.   전반적인 내용은 다음 글을 참고했다. https://www.digitalocean.com/community/tutorials/how-to-redirect-www-to-non-www-with-nginx-on-ubuntu-14-04   우선 DigitalOcean 계정의 Networking 패널에 들어가서 등록한 도메인을 누르면 DNS 레코드를 작성할 수 있는데, 이전 글에서 A 레코드에 @ 를 입력해서 루트 도메인이 Droplet 의 IP 로 연결되도록 해 주었다.  이번에는 A 레코드에 www 를 입력해서 www.windybay.net 으로 들어오는 연결을 역시 droplet 의 IP 주소로 연결되도록 해 주자 (즉 A 레코드가 2개 생기는데, HOSTNAME을 하나는 @, 하나는 www 로 입력해주고 WILL DIRECT TO에는 똑같이 Droplet의 IP를 입력해주면 된다.) 아마 DigitalOcean 이 아닌 다른 호스팅 업체도 DNS 편집은 대동소이할 것으로 생각된다.     그리고 나서 이전에 작성했던 Nginx 서버 블록을 열어서 내용을 추가해 주어야 한다. shell에 접속해 다음 명령어로 서버 블록을 추가해 주자. (참고: 최초 서버 블록 설정은 DigitalOcean에 Django 프로젝트 배포하기 (3) 도메인 연결시 서버 블록 설정은 DigitalOcean 에 나의 도메인 연결하기)   기존의 설정이    와 같이 되어 있을 것인데, 여기에 따로 www.windybay.net 으로 들어오는 연결에 대한 설정을 추가해 주는것이다. 기존의 내용은 건드리지 말고, 추가로 다음 블럭을 입력해준다.   이렇게 하면 www.windybay.net 으로 들어오는 연결과 그 하위 url 들이 모두 windybay.net으로 돌려지게 된다. 참고로 위의 서버 블록에서 request_url 아니고 request_uri 이다. 처음에 request_url 로 했다가 안돼서 한참 삽질했으므로 정확히 입력하자.   이후  로 서버를 재시작시켜 주면 설정이 적용된다.   설정이 제대로 적용되었는지 확인해보려면   과 같이 www. 가 붙은 주소를 입력했을때 301 Moved Permanently 라는 응답이 오면 잘 된 것이다. (참고로 위의 주소를 입력할때 아직 https 설정을 하지 않은 경우에는 http로)   이렇게 정상적으로 301 응답이 오는 경우 브라우저에서도 www.windybay.net 을 입력하면 정상적으로 컨텐츠가 보이며 주소는 www 가 없는 주소로 연결된 것을 확인할 수 있다.   만약 컨텐츠가 www.도메인 에 올라가 있고 루트 도메인으로 들어오는 연결을 www. 로 돌리고 싶은 경우에는 위 서버 블록의 내용에서 www와 루트 도메인의 자리만 서로 바꿔 주면 된다.

DigitalOcean 에 나의 도메인 연결하기 

2020. 07. 11 IT/컴퓨터 > Web Development
  이전 글들에서 프로젝트를 배포하는데 성공했는데, 사실 아직 이 단계에서는 우리가 흔히 보는 도메인이 아닌 IP 주소로밖에 접속할 수 없는 상태이다. 하지만 그런 상태로는 서비스를 할 수 없으니 도메인을 연결해주자.    DigitalOcean에 Django 프로젝트 배포하기 (1) DigitalOcean에 Django 프로젝트 배포하기 (2) DigitalOcean에 Django 프로젝트 배포하기 (3)   도메인은 한국에도 여러 업체가 있지만 언제부턴가 godaddy.com에서만 구매하고 있다. Gabia에서 구매한 적도 있는데, 내가 설정을 잘못 한것인지 모르겠지만 www 가 붙지 않은 도메인을 기본으로 쓰고 싶은데 잘 안 되어서 이것저것 해보다가 godaddy 로 갈아타게 되었다. 개인적으로는 DigitalOcean 과도 깔끔하게 연동이 잘 되어 만족하면서 사용중.   일단 domain 을 구입하면 도메인 관리를 DigitalOcean 에서 하기 위해서 네임서버를 바꿔 주어야 한다. DigitalOcean 의 계정에 접속후 Networking 패널로 가 준다.     여기서 연결하고 싶은 도메인을 입력해 준다.   그후 도메인의 네임서버를 digitalocean의 서버로 변경해 주어야 한다. godaddy 의 도메인 관리 창에 가 보면 DNS(Domain Name System) 설정을 해 줄 수 있는 버튼이 있는데 그걸 눌러 준다.      GoDaddy 자체에서 도메인을 연결해주기도 하는 모양이지만 그렇게 하면 DigitalOcean 에서 직접 관리할수 없는것같으니 그렇게 하지 않고 수동으로 네임서버를 입력해주자.   기본으로 설정되어있는 네임서버를 바꾸기 위해 change 버튼을 눌러 준다.   네임서버를 직접 입력할 수 있는 칸이 나오는데, 아래의 3개를 입력해 준다. 디폴트는 네임서버 쓸 수 있는 칸이 2개밖에 없는데 오른쪽 아래의 Add Nameserver 를 눌러서 하나 더 입력하면 된다. ns1.digitalocean.com ns2.digitalocean.com ns3.digitalocean.com     이렇게 네임서버를 바꿔 주면 도메인에 관련된 설정을 DigitalOcean 쪽에서 해 줄 수 있게 된다. 네임서버 변경은 시간이 좀 걸릴 수 있다. 대개는 1~2시간 내에 처리되는 것 같지만 공식적으로는 하루이틀까지도 걸릴 수 있다고 하는것 같다.   도메인이 DigitalOcean 의 네임서버에 연결되면 그 도메인이 우리 프로젝트의 IP로 연결되도록 DNS 레코드를 작성해 주어야 한다. 다시 DigitalOcean 의 계정으로 돌아와서 Networking 탭에서 연결해준 도메인을 클릭해 보면 여러 가지 DNS 레코드를 작성할 수 있는 탭이 보이는데, 이 중 A 레코드를 작성해 주면 된다.   도메인을 입력하면 바로 연결되게 하려면 (예를 들어 windybay.net) A 레코드에 @ 라고 입력해주고 'WILL DIRECT TO' 에 프로젝트의 IP 주소를 입력하면 된다. DigitalOcean 의 경우에는 Droplet 마다 IP 주소가 있으니 그것을 copy 해 주면 된다. 옆에 TTL 이라는 설정이 있는데 서버의 캐시 등과 관련된 설정이라고 한다. 일단 당장은 기본값인 3600으로 놔두면 될 것 같다. 이렇게 하면 windybay.net 으로 접속하면 프로젝트의 IP로 연결되게 된다. 하지만 홈페이지가 보이는 것이 아니고 nginx 기본 화면이 보일 것이다. 아직 nginx가 windybay.net으로 들어온 요청을 프로젝트 내의 디렉토리들로 연결할 수 있게 설정이 되지 않아서 그렇다.   도메인이 nginx 가 가리키는 디렉토리로 연결되게 하기 위해서는 서버 블록을 수정해 주어야 한다. 이전에 작성했던 서버 블록을 수정해 주자. (위에서 마지막 windybay는 각자 작업중인 프로젝트 이름으로 바꾸어야 한다)   이전에 작성했던 서버 블록에서 server_name이 droplet의 IP 주소로 되어 있을것인데, 이것을 새로 연결한 domain 으로 바꾸어 준다.     그리고 마지막으로 django 프로젝트의 settings.py 의 ALLOWED_HOSTS 에 도메인을 명기해 주어야 프로젝트에서 도메인 연결을 허용하게 된다.   이렇게 설정하면 windybay.net 에 프로젝트가 연결되어 홈페이지가 정상적으로 보이게 된다.   만약 이렇게 해도 정상적으로 보이지 않는다면 서버에 캐시로 저장된 이전 설정이 남아 있는 경우일 수 있다. 그 경우에는 shell에서 nginx 와 gunicorn 을 재시작하면 새로운 설정을 적용해줄 수 있다.   www.windybay.net 으로 들어오는 트래픽을 windybay.net 으로 리디렉션해주는 것도 설정을 해 주려고 하는데 내용이 길어지는것 같아 검색 편의를 위해 별도의 포스팅으로 정리하기로..

Git 덮어쓰기, .gitignore 새로 반영하기 등 

2020. 06. 24 IT/컴퓨터 > 기타 프로그래밍
  프로젝트를 처음으로 github 저장소에 올리는 법 앞 포스트에 이어서..개발 하다보면 가끔 한번씩 꼭 하게 되는 일들인데 커맨드가 가물가물한것들 정리.   원격 서버에서 git pull 할 때 매번 아이디와 암호를 물어봐서 귀찮을 때가 있다. 특히 혼자 개발하는 서버라면 다른 사용자도 없으니 그냥 아이디와 암호를 저장해주면 편한것 같다. 위의 명령을 수행하면 저장된 credential 정보를 이용해서 인증이 자동으로 처리된다. store 명령을 이용하면 다시 설정을 바꿀 때까지는 계속 정보가 저장된 상태가 유지된다. 만약 일정 시간만 로그인 절차를 생략하고 싶다면 store 대신 cache로 하면 된다.   이렇게 해주면 default 시간 값 (15분이라고 함) 동안은 아이디와 암호를 물어보지 않는다. 특정한 시간을 지정해주려면 --timeout 옵션을 사용해서 초 단위로 지정해 주면 된다.     해당 프로젝트 뿐 아니라 모든 git 환경에 전역으로 적용시키려면 --global 옵션을 추가해주면 된다.     프로젝트 저장소에 필요 없는 캐시나 데이터베이스 파일/폴더 등은 .gitignore 파일에 포함시켜 주면 push 할때 올라가지 않는다. 그렇지만 이미 한번 push 해서 원격 저장소에 저장된 파일을 프로젝트에서 제거해야 할 때가 있다. 이럴 때는 그냥 .gitignore 에 적어 주기만 해서는 해결이 되지 않는다. 일단 .gitignore 에 추가해 주면 해당 파일들은 변경사항이 있어도 새로 push가 되지는 않지만, 이미 push 해버린 버전이 원격 저장소에서 지워지지 않는 문제가 있다. 원격 서버에서 pull 할때 문제가 생기기 쉽다. 이럴때는 아래의 명령으로 원격 저장소에 저장된 파일을 다 지워 주고, 새로 모든 파일을 staging 해 준다음 push 를 해 줘야 깔끔하게 제거된다.   cached 다음에 한칸 띄고 마침표, git add 다음에도 한칸 띄고 마침표 를 꼭 적어줘야 한다.   개발하다 보면 너무 오래 커밋하지 않고 이것저것 파일들을 건드리다가 뒤죽박죽이 돼서 손을 쓸수 없는 지경이 되는 경우가 있다. 일단 꼭 한가지 일을 해결하고 나면 커밋을 해서 개발 단계를 명확히 구분을 해 주는 습관을 들이는게 중요하겠다. 하지만 어쨌든 손쓰기 힘든 지경이 돼서 잘 작동하던 원격 저장소의 버전으로 그냥 모든걸 덮어 씌우고 싶게 될 때가 분명히 생긴다. 그때는 아래 명령어를 이용한다. 브랜치 이름이 master가 아니라면 해당하는 branch 이름을 적어줘야 한다. 이렇게 하면 로컬에서의 변화는 전부 무시되고 원격 저장소에 올라가 있는 버전이 덮어 씌워진다.   또 가끔 쓰게 되는 명령어가 있으면 업데이트해 보겠음.
  • 1 (current)
  • 2
  • 3