NuPhy Air60 구매 및 사용 후기를 남겨봅니다. 다른 후기들은 다 Air75길래 포커 배열은 인기가 없나 했더니 와디즈 펀딩이 Air75였군요.

 

 

 

1. 서론

 

사실 이번 키보드 구매는 반쯤 충동적이었습니다. 때는 무려 한 달이 넘은 3월 말. 3월 31일 2주간 해외 출장을 앞두고 있었고 스트레스로 인한 지름신이 반쯤 올라왔을 때 메일이 옵니다.

 

 

아 이거다! 어차피 출장 가 있는 동안엔 못 받고 기다림도 줄고 포커 배열도 써봤고 이쁘고.. 충동구매로 결국 지르고 말았습니다.

 

 

옵션은 게이트론 적축, 커버 포함, 키캡 포함해서 총 약 120달러가 나왔으며 10달러 할인쿠폰에 배송비 약 20달러 포함해서 총 약 130달러가 나왔습니다. 환전 수수료가 얼만진 정확히 모르겠습니다만 약 17만 원의 비싼 몸값을 자랑합니다.

 

출장에서 복귀하고도 2주가 지나 주문한 지 한 달이 됐을 때쯤 통관 안내가 왔습니다. 통관 번호를 바로 입력했음에도 불구하고 2일 반을 잡혀있었습니다. 아이허브 같은 건 워낙 많아서 그런지 통관에 하루도 안 걸리던데..

 

 

그렇게 주문한 지 꼭 한 달 만인 4월 29일에 기다리던 키보드를 받아볼 수 있었습니다.

 

 

 

2. 본론

 

 

결국 받았습니다. 맨 위에 캐릭터가 그려져 있는 박스가 본품이고 아래의 박스가 커버이며 가장 위에 올라와 있는 게 키캡입니다. 

 

 

키보드 박스 정면에는 떡하니 캐릭터가 박혀있습니다. NyPhy F01로 봐선 첫 번째 마스코트 캐릭터로 보입니다. 근데 왜 홈페이지나 어딜 찾아봐도 저런 캐릭터가 NuPhy를 대표하고 있단 글이나 그림을 본 적이 없는 걸까요? 아무튼 우측 상단에는 포함된 키보드의 정보가 나와있습니다. 

 

 

박스 후면에도 키보드 정보와 키보드 레이아웃이 그려져 있습니다. 직구 배송 도중에 상자에 찍힘이 생긴 건 좀 마음이 아프네요.

 

 

박스를 뜯자마자 저를 반겨준 건 놀랍게도 한국어가 포함되어있는 기본 설명서였습니다. 사실 직구 제품인 데다가 한국엔 별로 알려지지 않은 제품이라 한국어로 설명이 되어 있단 것만으로도 놀랐습니다.

 

 

설명서엔 기본적인 FN키를 사용한 동작에 대해 설명하고 있습니다. 이 부분도 한 가지 아쉬운 점이라면 온라인 페이지에 설명되어있는 부분이 없어 동작을 확인하려면 이 설명서를 직접 확인해야 한다는 아쉬운 점이 있습니다. 왜 공식 홈페이지에 가이드 문서가 없는지 모르겠네요.

 

 

설명서 뒤에는 대문짝만 하게 NuPhy F01 캐릭터가 그려져 있습니다. 벽에 붙여두라는 건지 그냥 포스터예요.

 

 

심지어 스티커도 줍니다. 이것저것 다 껴주니까 좋긴 한데 이걸 어디에 쓸지는 고민이네요. 

 

 

드디어 본품이 보입니다. 박스 내 키보드 오른쪽엔 여러 가지 내용물이 함께 포장되어 있었습니다.

 

 

모코코가 귀엽게 맞이해 주네요.

 

 

공식 홈페이지의 내용물과 비교해보니 다 들어있는 것으로 보입니다. 키보드 키캡을 보면 기본 맥 키캡으로 껴있고 윈도우로 바꿀 수 있는 3개의 여분 키캡을 기본으로 줍니다. 키캡 풀러 반대쪽엔 스위치를 풀러도 함께 있고 여분의 청축 갈축 적축 스위치도 함께 줘서 테스트해보거나 교체할 수도 있습니다. 구성 참 알차고 좋은데 대체 저 20cm짜리 C to C 케이블은 왜 준 건지 모르겠습니다.

 

 

후면 모습입니다. 마그네틱 풋을 부착하였고 반짝반짝한 백 플레이트가 맞이해 주고 있습니다.

 

 

동봉된 스위치와 키캡입니다. 기본 구성에 윈도우/맥 여분 키캡 주는 데는 꽤 본 것 같은데 여분의 스위치까지 주는 데는 드문 것 같습니다.

 

 

키보드 좌측 후면과 좌측 측면입니다. 좌측 측면에 C타입 포트가 있습니다. 유선 연결 및 충전을 진행할 수 있습니다. 스위치는 총 두 개로 윈도우/맥을 전환할 수 있으며 다른 하나는 키보드의 전원과 연결 방식을 담당합니다. 

 

 

연결을 해서 사용 중인 모습입니다. 좌상부 우상부 라이트는 FN키를 통해 색상을 변경할 수 있습니다. 좌측의 사진이 일반적인 사용의 모습이며 만약 CapsLock을 켠다면 우측의 사진처럼 좌상부의 라이트가 흰색으로 변합니다. 또한 블루투스로 연결하면 잠시 좌상부의 라이트라 파란색으로 표시됩니다.

 

 

다음은 키보드 커버입니다. 다른 키보드들과 달리 플라스틱 커버를 제공하지 않습니다. 대신 NUFOLIO V2라고 하는 별도의 전용 커버를 무료로 제공하고 있습니다. 언제 유료로 바뀔진 모르지만 무료로 제공해주는 제품도 INCLUDE를 선택해 주고 있으니 만약 구매하시는 분들은 반드시 INCLUDE를 선택해서 커버를 받아주세요.

 

 

오렌지빛의 케이스가 맞이해주고 있습니다. 품질은 꽤 괜찮아 보여요 무료 제공 케이스 수준은 한참 뛰어넘었습니다. 고급지고 맘에 들어요.

 

 

내부엔 부드러운 페브릭 소재로 되어 있고 제조사 이름이 음각되어있습니다. 키보드를 두는 하단부는 고무 패드 부분이 음각되어 딱 맞게 되어 있으며 자석으로 고정될 수 있게 디자인되었습니다.

 

 

전용 커버답게 딱 들어맞습니다. 다만 문제가 하나 있는데 기울기를 어느 정도 두고 쓰시는 분은 마그네틱 풋을 부착해서 사용하실 텐데 마그네틱 풋을 부착하면 전용 커버를 사용할 수 없습니다.

 

 

위 사진처럼 딱 맞는 핏을 자랑하는 전용 커버이기 때문에 우측과 같이 마그네틱 풋을 장착해 둔 경우엔 전용 커버를 사용할 수 없습니다. 다른데 들고 가려면 저 마그네틱 풋은 별도로 챙겨가서 쓰거나 기울기를 포기하고 써야 합니다.

 

 

키캡은 별다른 특징이 없습니다. Twilight 콘셉트의 키캡이 프리오더로 주문하면 10달러에 구매할 수 있다고 해서 그냥 껴서 구매하긴 했는데 블랙 콘셉트를 좋아하시는 분이면 바꿔 쓰셔도 될 것 같습니다.

 

 

 

3. 결론

 

그리 오랜 기간 사용한 것은 아니지만 그래도 회사에서 일주일 정도 사용한 느낌을 알려드리고자 합니다.

 

 

먼저 가장 빨리 와닿았던 건 저 오른쪽의 시프트입니다. 개발하면서 < > ? " : 와 같은 부호를 쓸 일이 많은데 기존 텐키리스 키보드에서는 오른쪽 시프트를 사용하는 게 습관이 되어 있던 터라 저 시프트를 사용할 때마다 심지어 지금도 위쪽 방향키를 누르곤 합니다. 엉뚱한 라인에 '가 찍히면서 빌드 오류가 나면 한숨부터 나옵니다.

 

멀티미디어 키 사용이 굉장히 불편합니다. 거의 못쓰다시피 하고 있습니다. 배열을 보면 아시겠지만 포커 배열 키보드는 F1~F12 키가 없습니다. 일반적으론 FN키와 숫자키의 조합으로 그 기능을 대신하고 있습니다. 사진으로 보이듯이 이 키보드에는 1부터 =까지에 멀티미디어 기능이 할당되어 있습니다. 그러면 이 기능을 어떻게 써야 할까요? 설명서에 나와있긴 하지만 멀티미디어 키를 사용하려면 무려 FN+TAB+F키를 눌러 전환 기능을 사용한 후에 FN키와 숫자키를 사용해 멀티미디어 기능을 사용할 수 있게 됩니다. 물론 다시 F1~F12를 사용하려면 FN+TAB+F키로 전환해줘야 합니다. 반쯤 없는 기능으로 생각하고 있습니다.

 

그 외에도 전용 프로그램이 없어 백라이트 및 측면 LED 조절이 까다롭다는 점도 들 수 있습니다. 프로그램이 있다면 GUI를 통해 편히 설정할 수 있겠지만 위의 설명서에서 보듯이 FN 키와 방향키 심지어 측면 LED는 FN키와 /키를 누른 채 방향키로 조절해야 합니다. 절전 모드 설정 역시 마찬가지고요. 절전모드를 설정/해제하게 되면 우측의 측면 LED가 두 번 깜빡이는데 X를 누르든 C를 누르든 두 번 점멸하고 맙니다. 현재 켜져 있는지 꺼져있는지는 알 수 없습니다. 모두 전용 프로그램이 있으면 바로 설정하고 설정을 다시 볼 수 있을 텐데 아쉬운 점 중 하나입니다.

 

블루투스는 FN+Q, W, E, R로 연결할 수 있습니다. 스위치는 무선으로 둔 채 사용하면 됩니다. 2.4G 리시버를 사용하는 경우에도 스위치를 무선으로 둔 채 사용하면 됩니다. 다만 무선으로 둔 채 내가 현자 리시버를 쓰고 있는지, Q에 저장된 기기에 연결되었는지, E에 저장된 기기에 연결되었는지는 구분할 수 없습니다. 이 부분은 당장 키보드를 사용하는 기기를 보면 알 수 있기에 딱히 불편하지는 않았습니다.

 

 

키감은 개인마다 느끼는 게 너무 다를 수 있기 때문에 직접 타건 해보는 걸 추천드리고 별도로 평가하진 않겠습니다. 다만 개인적으로는 이전의 씽크웨이 토체티 콜라보 제품의 저소음 적축 보단 소음이 좀 더 있지만 키감은 더 좋고 스위치가 더 짧아서 그런진 모르겠지만 키압도 더 낮게 느껴지는 기분이었습니다.

 

 

확실히 유선과 무선 리시버, 블루투스 모두 지원하는 것은 특히 강점이라고 생각합니다. 이전에 사용했던 Anne Pro 2도 유선과 블루투스만을 지원했고 블루투스에서의 키 씹힘과 입력 지연이 간간히 발생해 현재는 잘 사용하지 않고 있습니다. 약 일주일간 사용했지만 현재는 눈에 띄는 입력 지연이나 키 씹힘 현상은 보이지 않고 있습니다.

 

 

다만 다시 봐도 배송비 제외 130달러의 가격은 그 어떤 키보드와 비교하더라도 비싼 것은 사실입니다. 17만 원이면 레오폴드 키보드도 살 수 있을 가격으로 알고 있습니다. 다만 디자인과 포커 배열 및 다양한 연결을 지원하는 키보드임을 감안하면 키보드에 많~은 관심이 있는 일부 별난 사람들은 구매해볼 수 있는 독특한 키보드임에는 분명합니다.

 

일반 범용적인 목적으로는 특히 게임 유저들에겐 절대 추천할 수 없는 키보드지만 이쁘거나 특이한 키보드에 관심이 있고 책상을 넓고 깔끔하게 쓰고 싶다 뭐 이런 핑계를 찾고 키보드를 지르고 싶어 하시는 분들에겐 추천해 볼만한 키보드입니다.

 

 

 

 

 

 

반응형

 

입력받은 string 타입의 TransferSyntaxUid를 TrasnferSyntax 타입으로 변환하고 파일의 TransferSyntax와 비교하는 방법에 대해 알아봅니다.

 

 

 

1. Fo-DICOM NuGet패키지 설치

 

Nuget 패키지 관리자를 통해 사용할 프로젝트에 패키지를 설치합니다. 

 

 

프레임워크는 .Net 6을 사용했습니다.

 

 

 

2. 소스코드

 

소스코드는 아래와 같습니다. 주석을 같이 작성하였으니 설명은 주석을 참고해 주시기 바랍니다.

 

private bool CompareDicomTransferSyntaxSample(string dcmFilePath)
{
    DicomTransferSyntax dcmTransferSyntax, inputTransferSyntax;
    //  비교할 Explicit VR Little Endian TransferSyntaxUid를 string 타입으로 지정합니다. 
    string dcmTransferSyntaxUid = "1.2.840.10008.1.2.1";
    // string 타입의 TransferSyntaxUid를 사용해 DicomUID 타입으로 변환합니다.
    DicomUID dicomUID = DicomUID.Parse(dcmTransferSyntaxUid);
    // 변환한 DicomUID 타입의 TransferSyntaxUid를 DicomTransferSyntax 타입으로 변환합니다.
    inputTransferSyntax = DicomTransferSyntax.Query(dicomUID);
    try
    {
        DicomFile dicomFile = DicomFile.Open(dcmFilePath, FileReadOption.SkipLargeTags);
        // DicomFile내의 FileMetaInfo에서 파일의 TransferSyntax를 가져옵니다.
        dcmTransferSyntax = dicomFile.FileMetaInfo.TransferSyntax;
        // 두 값을 비교해 bool 타입을 리턴합니다.
        return inputTransferSyntax == dcmTransferSyntax;
    }
    catch (Exception ex)
    {
        // DICOM 파일 형식 오류.
        return false;
    }
}

 

 

 

 

 

 

반응형

'Trunk > DICOM' 카테고리의 다른 글

[DICOM] DICOM Tag 값의 길이에 대해  (0) 2023.03.08
[DICOM] MWL: Modality Worklist  (0) 2023.02.18
[C#|FO-DICOM] DICOM 파일을 로드 해 태그 추출하기.  (0) 2022.05.03
[DCMTK] MEPG2와 프레임  (0) 2022.05.03
[DICOM] VR PN: PersonName  (0) 2021.10.19

 

FO-DICOM을 사용해 C#에서 DICOM 파일을 로드하고 태그를 추출하는 방법에 대해 알아봅니다.

 

 

 

1. Fo-DICOM NuGet패키지 설치

 

Nuget 패키지 관리자를 통해 사용할 프로젝트에 패키지를 설치합니다. 

 

 

프레임워크는 .Net 6을 사용했습니다.

 

 

 

2. 소스코드

 

소스코드는 아래와 같습니다. 주석을 같이 작성하였으니 설명은 주석을 참고해 주시기 바랍니다.

 

private void GetDicomTagSample(string dcmFilePath)
{
    string modalityCode;
    try
    {
    	// Open DICOM File.
        DicomFile dicomFile = DicomFile.Open(dcmFilePath, FileReadOption.SkipLargeTags);
        // Load DICOM tags to DicomDataSet.
        DicomDataset ds = dicomFile.Dataset;
        try
        {
        	//Get Modality tag from the DicomDataSet.
            modalityCode = ds.GetString(DicomTag.Modality);
        }
        catch (DicomDataException ex)
        {
            // The dataset does not contain tag.
        }
    }
    catch(Exception ex)
    {
        // Invalid DICOM file.
    }
}

 

 

 

 

 

 

 

 

반응형

 

어느 날 프로토타입 제작을 위해 VS2022에서 새로운 클래스를 생성했는데 기본 한정자가 public에서 internal로 변경되었는지 internal로 생성이 되더군요. 이 기회에 C#에서 사용하고 있는 액세스 한정자에 대해 알아보고 정리해 둡니다.

 

 

 

1. 액세스 한정자 - Access Modifiers

 

모든 형식과 형식 멤버에는 접근성 수준이 있습니다. 접근성 수준은 어셈블리 또는 다른 어셈블리의 다른 코드에서 사용할 수 있는지 여부를 제어합니다. 어셈블리는 단일 컴파일에서 하나 이상의. cs 파일을 컴파일하여 만든. dll 또는. exe입니다. 선언할 때 형식 또는 멤버의 액세스 가능성을 지정하려면 다음과 같은 액세스 한정자를 사용합니다.

 

쉽게 설명하면 한 클래스에서 다른 클래스의 멤버 변수나 함수에 접근할 때 그 접근이 가능한지 여부를 결정짓는 게 액세스 한정자입니다.

 

 

 

2. 액세스 한정자의 종류

 

C#에서 액세스 한정자는 6가지가 있습니다. 6가지는 다음과 같습니다.

  • public: 형식 또는 멤버는 동일한 어셈블리 또는 이를 참조하는 다른 어셈블리의 다른 코드에서 액세스 할 수 있습니다. 형식의 public 멤버에 대한 액세스 가능성 수준은 형식 자체의 액세스 가능성 수준에 의해 제어됩니다.
  • private: 형식 또는 멤버는 동일한 클래스 또는 구조체의 코드에서만 액세스 할 수 있습니다.
  • protected: 유형 또는 멤버는 동일한 클래스 또는 해당 클래스에서 파생된 클래스의 코드에서만 액세스 할 수 있습니다.
  • internal: 동일한 어셈블리의 모든 코드에서 형식 또는 멤버에 액세스 할 액세스 할 수 있지만 다른 어셈블리에서는 액세스 할 수 없습니다. 즉, 내부 형식이나 멤버는 동일한 컴파일의 일부인 코드에서 액세스 할 수 있습니다.
  • protected internal: 형식 또는 멤버는 선언된 어셈블리의 모든 코드에서 또는 다른 어셈블리의 파생 클래스 내에서 액세스 할 수 있습니다.
  • private protected: 포함하는 어셈블리 내에서 선언된 클래스에서 파생된 형식에서 형식 또는 멤버에 액세스할 수 있습니다.

해당 기능을 표로 정리하면 다음과 같습니다.

 

 

 

더욱더 자세한 내용은 다음 페이지를 참고하시면 좋습니다: Access Modifiers (C# Programming Guide)

 

Access Modifiers - C# Programming Guide

All types and type members in C# have an accessibility level which controls whether they can be used from other code. Review this list of access modifiers.

docs.microsoft.com

 

 

 

 

 

 

 

반응형

 

 

 

DICOM 영상의 프레임 정보를 추출하다 에러가 발생해 원인을 확인하다 찾아본 내용을 정리해 둡니다. 영상처리에선 어찌 보면 기본적인 내용일 수도 있지만 혹시 제가 겪은 문제와 유사한 경험을 하시는 분들에게 도움이 되었으면 합니다.

 

 

 

1.  문제: Offset 정보 추출 실패

 

시작은 DICOM 영상의 offset 정보를 추출하는 것으로부터 시작되었습니다. 영상을 정상적으로 로드해왔으나 DcmPixelSequence에서 getItem을 해오는 과정에서 이상한 현상이 발생하였습니다.

 

 

 

2. 현상

 

해당 영상을 Weasis로 오픈해 TransferSyntax를 확인한 결과 MPEG2 영상으로 확인되었습니다.

DICOM 영상의 TransferSyntax

DICOM 파일에서 영상만 추출해 ffmpeg로 모든 프레임을 추출한 결과 총 360장의 프레임을 추출할 수 있었습니다. 따라서 내부 로직에서 프레임의 개수는 360이 되어야 한다고 추측하고 있었습니다.

영상에서 추출해낸 프레임

하지만 DCMTK 디버그 결과 첫 번째 프레임에서 모든 영상의 크기만큼의 바이트를 불러오고 두 번째 프레임에선 null을 리턴하고 있었습니다.

추출한 MPEG2 영상의 파일 크기
첫번째 오프셋 추출 정보.

위의 사진에서 확인하듯이 첫 번째 오프셋에서 모든 길이를 다 가져오고 있었으며 아래의 사진에서 볼 수 있듯이 두 번째 오프셋에서는 NULL값을 확인할 수 있었습니다.

두번 째 오프셋 추출 정보.

 

 

 

3. 원인: MEPG2

 

확인 후 결론부터 말씀드리자면 해당 동작은 정상이었으며 DCMTK와 MPEG2의 특징을 잘 이해하지 못한 제가 오류로 인식하고 있던 상황이었습니다.

 

https://forum.dcmtk.org/viewtopic.php?p=9897#p9897 

 

how to extract frames from DICOM "Mpeg2 Main Profile @ Main Level" file - DICOM @ OFFIS

All other questions regarding DCMTK Moderator: Moderator Team Ro2a Posts: 9 Joined: Fri, 2010-09-17, 17:14 #1 Post by Ro2a » Tue, 2010-09-21, 00:24 Hello I want to develope a programe using VS c++ and dcmtk that can load a dicom file which has the followi

forum.dcmtk.org

위 링크의 답변을 인용해 보자면 다음과 같습니다.

 

For compressed pixel data you have to use the DcmPixelSequence class due to the internal structure of the compressed PixelData element. This gives you acccess to the included offset table (empty for MPEG2) and all frames. However, for MPEG2 there is only a single "frame" containing all MPEG2 data as a blob. You won't be able to access individual frames with DCMTK because DCMTK does not know how to decompress MPEG2 data and hence is not able to find out where a specific frame begins.

So you have to get the complete MPEG2 data, and then decompress it using another library. I will post an example how to do that soon in the wiki and reference here in the forum topic.

 

DCMTK에서 MPEG2의 오프셋 정보를 얻기 위해선 MPEG2 영상의 BLOB 데이터를 로드해 온 뒤 FFMPEG와 같은 외부 라이브러리를 사용해 압축을 풀고 난 뒤에야 오프셋 정보 추출을 시도할 수 있었습니다.

 

 

 

기반 지식이 얼마나 중요한지 다시 깨달아 가는 문제였습니다. 오늘도 하나 더 배우고 갑니다.

 

 

 

 

 

반응형

 

Cannot load Counter Name data because an invalid index '' was read from the registry. 오류가 발생한 경우 해결하는 방법에 대해 알아봅니다.

 

 

 

1. 현상

 

C# 프로그램을 실행하는데 "Cannot load Counter Name data because an invalid index '' was read from the registry."와 같은 에러가 발생하며 실행되지 않습니다.

 

 

 

2.  수정

 

cmd를 열어 다음 명령어를 수행합니다.

lodctr /r

 

해당 명령어를 수행했을 때 만약 다음과 같은 에러가 발생하면 다시 한번 수행해 줍니다.

ERROR: UNABLE TO REBUILD PERFORMANCE COUNTER SETTING FROM SYSTEM BACKUP STORE. ERROR CODE IS 2

 

다시 동일한 명령어를 수행하면 다음과 같이 정상적인 메시지가 출력됩니다.

 

프로그램을 다시 실행시키면 정상적으로 수행되는 것을 확인할 수 있습니다.

 

 

 

 

 

반응형

 

Windows에서 정말 자주 쓰고 있지만 옵션 때문에 매번 찾아보고 있어서 포스팅하는 글.

 

xcopy /s /Y C:\__Dev\FOLDER_A C:\__Dev\FOLDER_B

 

xcopy를 이용한 간단한 명령어로 파일을 복사할 수 있다.

/s: Directory와 Subdirectory 모두 복사한다.

/Y: 중복되는 파일이 있으면 자동으로 덮어 쓴다.

 

더 상세한 옵션은 다음 페이지에서 확인하자.

https://www.computerhope.com/xcopyhlp.htm

 

MS-DOS and Windows command line xcopy command

Xcopy command help for MS-DOS and the Windows command line. Includes xcopy command availability, syntax, switches, and examples.

www.computerhope.com

 

 

 

 

 

 

반응형

 

 

Java에서 Actual and formal argument lists differ in length 에러가 발생한 경우 해결 방법에 대해 알아봅니다.

 

 

 

1. 어노테이션 처리 활성화 

 

 

IntellJ의 설정 > 빌드, 실행, 배포 > 어노테이션 프로세서 > 어노테이션 처리 활성화를 체크 해 줍니다.

 

 

 

2. Lombok Gradle 디펜던시 확인.

 

스프링 부트 설정에서 Lombok을 추가한 경우 build.gradle에 Lombok이 다음과 같이 추가되어 있는 경우가 있습니다.

 

 

이 경우 위와 같은 에러가 발생할 수 있으니 Maven Repository로 이동해 Lombok을 검색해 다음과 같이 변경해 줍시다.

 

 

 

 

3. Gradle 설정 변경

 

IntelliJ의 설정 > 빌드, 실행, 배포 > 빌드 도구 > Gradle로 이동해 다음과 같이 설정을 변경하고 저장해준다.

 

 

 

이제 빌드하면 정상적으로 빌드 되는것을 확인할 수 있습니다.

 

 

 

 

 

반응형

'Programming > JAVA' 카테고리의 다른 글

[Lombok] Gradle 빌드시 Cannot find symbol 오류  (0) 2022.06.30

 

앞서 작성한 code-server에 HTTPS를 적용해 보도록 하겠습니다. 이번 글에선 certbot의 nginx옵션 이용해 인증서를 발급받고 적용해 보도록 하겠습니다.

 

편의를 위해 code-server 설치와 nginx를 통한 역방향 프록시 설정에 대한 설명은 스킵하도록 하겠습니다.

 

 

 

01. code-server 설치 및 역방향 프록시 설정.

 

다음 글을 참고하여 code-server를 미리 준비합니다: https://smoh.tistory.com/456

 

[Ubuntu] 아이패드에서 code-server로 코딩 공부 해보기.

아이패드에서 프로그래밍 공부를 해보고자 여러 어플을 찾아봤습니다. 파이썬 같은 경우는 적당한 유료 어플이 있었지만 VSCode와 같은 무료면서 강력한 기능을 가진 어플은 없었습니다. 다양한

smoh.tistory.com

 

** 위 글에선 예시를 위해 AWS의 EC2를 사용하였습니다만 현재는 관리하는 서버에 code-server를 옮겨둔 상태입니다.

** NGINX를 통한 역방향 프록시 설정 방법은 별도로 설명하지 않습니다.

 

 

 

02. CERTBOT 설치.

 

만약 apt 같은 OS 패키지 관리자를 사용하여 설치된 Certbot 패키지가 있는 경우 기존 Certbot은 제거해야 합니다. 다음 명령어로 Certbot을 제거해 주세요.

sudo apt-get remove certbot

 

이제 snap을 사용해 최신 Certbot을 설치해 줍니다. 다음 명령어로 snap을 사용해 Certbot을 설치합니다.

sudo snap install --classic certbot

 

설치가 완료되면 다음 명령어를 실행해 certbot 명령을 실행할 수 있는지 확인합니다.

sudo ln -s /snap/bin/certbot /usr/bin/certbot

 

이제 다음 명령어를 수행해 인증서를 발급받습니다.

sudo certbot certonly --nginx

 

만약 nginx에 여러 개의 사이트가 등록되어 있으면 위의 그림처럼 리스트가 나열됩니다. 발급을 원하는 사이트의 번호를 입력합니다. 만약 입력하지 않는 경우 모든 사이트가 선택됩니다. 

 

이제 인증서 발급이 완료되었습니다. 인증서의 위치는 /etc/letsencrypt/live/사이트명 폴더에 저장됩니다.

 

 

 

03. NGINX 설정 변경.

 

다음 명령어를 통해 nginx의 설정 파일을 엽니다. 전 별도 설정 파일에 server 설정을 관리하고 있습니다. 설정 파일 이름은 사용자에 따라 다릅니다.

sudo vi /etc/nginx/conf.d/my-server.conf

 

설정 파일을 열고 다음과 같이 설정을 추가합니다.

#/etc/nginx/conf.d/my-server.conf
#code-server
server {
  listen 80;
  server_name your.domain.here;
  location / {
    proxy_pass http://localhost:{PORT};
    proxy_set_header Host $host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection upgrade;
    proxy_set_header Accept-Encoding gzip;
  }
  listen [::]:443 ssl ipv6only=on;
  listen 443 ssl;
  ssl_certificate /etc/letsencrypt/live/your.domain.here/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/your.domain.here/privkey.pem;
  include /etc/letsencrypt/options-ssl-nginx.conf;
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

 

이제 다음 명령어로 nginx 서비스를 재시작합니다.

sudo service nginx restart

 

접속해서 확인해 봅시다.

 

 

도메인에 접속하면 https가 정상적으로 적용된 것을 확인할 수 있습니다.

 

 

 

 

 

 

반응형

 

 

아이패드에서 프로그래밍 공부를 해보고자 여러 어플을 찾아봤습니다. 파이썬 같은 경우는 적당한 유료 어플이 있었지만 VSCode와 같은 무료면서 강력한 기능을 가진 어플은 없었습니다.

 

다양한 방면으로 찾아보던 중 Code Server라는 기능을 사용하면 웹 브라우저에서 VSCode의 기능을 이용할 수 있다고 하여 사용하는 방법에 대해 포스팅합니다.

 

 

 

1. Code server란?

 

Run VS Code on any machine anywhere and access it in the browser.

* Code on any device with a consistent development environment
* Use cloud servers to speed up tests, compilations, downloads, and more
* Preserve battery life when you're on the go; all intensive tasks run on your server

🔔 code-server is a free browser-based IDE while Coder, is our enterprise developer workspace platform. For more information, visit Coder.com

 

사실상 마지막 줄이 핵심입니다. code-server은 무료입니다!

 

https://github.com/coder/code-server

 

GitHub - coder/code-server: VS Code in the browser

VS Code in the browser. Contribute to coder/code-server development by creating an account on GitHub.

github.com

 

자세한 내용은 깃 허브에서 확인하실 수 있습니다.

 

 

 

2. Code server 설치 서버 요구 사항.

 

우선 Ubuntu 서버를 미리 준비합니다. 서버 스펙의 요구사항은 다음과 같습니다.

  • 1 GB of RAM
  • 2 CPU cores

전 이 글에서 AWS EC2의 Free tier를 사용한 우분투 서버를 사용합니다.

 

 

 

3. Code server 설치.

 

code-server를 설치하는 데는 다음과 같은 세 가지 방법이 있습니다

  • 대부분의 프로세스가 자동화된 설치 스크립트를 사용하는 방법.
  • 수동으로 설치하는 방법.
  • 클라우드 업체에 원버튼으로 배포하는 방법.

 

저는 가장 처음 방법인 설치 스크립트를 사용해 설치를 진행해 보도록 하겠습니다. 

 

SSH를 사용해 우분투 서버에 접속합니다. 접속 후 다음 명령어를 수행해 설치를 미리 테스트해 봅니다.

curl -fsSL https://code-server.dev/install.sh | sh -s -- --dry-run

위와 같이 드라이 런의 결과를 미리 확인해 볼 수 있습니다.

 

이제 진짜 설치를 진행해 보도록 합니다. 다음 명령어를 수행해 주세요.

curl -fsSL https://code-server.dev/install.sh | sh

설치가 완료되면 다음 명령어로 서버 부팅 시 서비스가 시작될 수 있게 만들어 준 뒤 code-server를 확인해 줍니다.

sudo systemctl enable --now code-server@ubuntu
code-server -h

** @뒤는 유저의 이름을 적절히 변경해 넣어 주셔야 합니다.

 

이제 설정 파일을 수정해 봅시다.

 

 

 

4. 설정 구성.

 

설정 파일은 ~/.config/code-server/config.yaml입니다. 다음 명령어로 설정 파일을 열어줍니다.

sudo vi ~/.config/code-server/config.yaml

파일을 열면 기본 설정 파일은 다음과 같습니다.

외부에서 접속 가능하도록 하기 위해서 127.0.0.1을 0.0.0.0으로 변경하고 포트도 원하시면 변경해 주시면 됩니다.

비밀번호는 자신이 편한 값으로 수정해 주시거나 외울 수 있다면 그래도 쓰시면 됩니다.

cert 옵션은 자체 인증 서버를 사용해 https 통신을 할 때 사용합니다. 우선 그대로 두고 넘어가도록 하겠습니다.

 

설정 파일 변경이 완료되었다면 다음 명령어를 사용해 code-server를 재시작해 줍니다.

sudo systemctl restart code-server@ubuntu

이제 code-server에 접속해 봅시다.

 

 

 

5. 접속 확인.

 

처음 접속하면 다음과 같은 화면을 확인할 수 있습니다.

 

설정에서 변경한 암호를 입력해 줍시다.

이제 맘껏 사용하시면 됩니다!

 

다음 글을 참고하시면 HTTPS 설정을 진행할 수 있습니다: https://smoh.tistory.com/457

 

[Ubuntu] Certbot(Nginx)을 이용해 code-server에 https 적용하기.

앞서 작성한 code-server에 HTTPS를 적용해 보도록 하겠습니다. 이번 글에선 certbot의 nginx옵션 이용해 인증서를 발급받고 적용해 보도록 하겠습니다. 편의를 위해 code-server 설치와 nginx를 통한 역방향

smoh.tistory.com

 

 

 

 

 

 

반응형

+ Recent posts