요즘 핫한 게임 팔월드. 친구들과 함께 즐기기 위해 전용 서버를 구축하며 발생한 시행착오와 구축 방법에 대해 정리합니다.

 

 

 

0. 준비

 

전용 서버를 구동할 PC 혹은 서버

** 전 Ubuntu 서버에 구축하였습니다. SteamCmd를 설치하는 방법부터 설명하오니 Windows를 사용하는 분은 "2. PalWorld Dedicated Server 설치"부터 읽어주시면 됩니다.

 

 

 

1. SteamCmd 설치

 

당연하지만 가장 먼저 스팀을 설치해야 합니다. 만약 GUI가 지원되는 PC라면 웹 브라우저를 열고 Steam 페이지로 들어가 Steam을 설치합니다.

 

만약 GUI를 지원하지 않으면 CMD를 설치해야 합니다.  다음 명령어로 steam이라는 유저를 생성(Steam 로그인 계정이 아닙니다.)합니다.

 

> sudo useradd -m steam
> sudo passwd steam

 

유저를 생성한 뒤 권한을 부여해야 합니다. 다음 명령어를 수행해 sudoers를 열어줍니다.

 

> sudo vi /etc/sudoers

 

이제 생성한 steam 유저에 권한을 부여합니다. " root ALL=(ALL:ALL:) ALL"를 찾아 그 아래애 다음과 같이 추가합니다.

...
root ALL=(ALL:ALL:) ALL
steam ALL=(ALL:ALL) ALL
...

 

다음엔 생성한 steam 유저로 로그인해 SteamCmd를 설치합니다.

 

> sudo useradd -m steam
> sudo passwd steam
> sudo add-apt-repository multiverse; sudo dpkg --add-architecture i386; sudo apt update
> sudo apt install steamcmd

 

 

 

 

2. PalWorld Dedicated Server 설치

 

먼저 Windows나 Ubuntu Desktop(GUI)를 사용한다면 Steam을 열고 라이브러리로 이동한 다음 " PalWorld Dedicated Server"를 설치하면 됩니다.

 

 

간단하게 PalWorld Dedicated Server 설치가 끝났습니다. "3. 서버 설정"으로 가서 나머지 글을 읽어주세요.

 

만약 Ubuntu Server(CLI)를 사용한다면 다음 명령어를 통해 PalWorld Dedicated Server를 설치해야 합니다.

 

> steamcmd +login anonymous +app_update 2394010 validate +quit
> cd ~/Steam/steamapps/common/PalServer
> ./PalServer.sh

 

./PalServer.sh 명령어를 수행하면 자동으로 전용 서버가 시작됩니다. 만약 다음과 같은 오류가 발생한다면 추가 명령어 수행이 필요합니다.

 

.steam/sdk64/steamclient.so: cannot open shared object file: No such file or directory

 

터미널에 위와 같은 오류가 있다면 다음 명령어를 수행해 줍시다.

 

> mkdir -p ~/.steam/sdk64/
> steamcmd +login anonymous +app_update 1007 +quit
> cp ~/Steam/steamapps/common/Steamworks\ SDK\ Redist/linux64/steamclient.so ~/.steam/sdk64/

 

이제 다시 ./PalServer.sh를 수행하면 정상적으로 서버가 구동됩니다.

 

** 참고: 다음과 같은 오류가 발생하는 것은 정상으로 서버 구동에 문제가 없습니다.

$ ./PalServer.sh
Shutdown handler: initalize.
Increasing per-process limit of core file size to infinity.
dlopen failed trying to load: steamclient.so with error: steamclient.so: cannot open shared object file: No such file or directory
[S_API] SteamAPI_Init(): Loaded '/home/ubuntu/.steam/sdk64/steamclient.so' OK. (First tried local 'steamclient.so')

 

 

 

 

3. 서버 설정

 

이제 다른 친구들이 내 서버에 접속할 수 있게 만들어야 합니다. 만약 자신이 퍼블릭 IP를 직접 사용하고 있다면 이 설명은 스킵하셔도 됩니다.

 

하지만 내 전용 서버가 공유기에 연결되어 있는 경우에는 포트포워딩이 필요합니다. 포트포워딩의 개념이나 원리에 대해서는 스킵하고 설정하는 방법에 대해서만 설명합니다.

 

먼저 크롬과 같은 웹 브라우저를 열고 http://192.168.0.1/의 주소(IPTime 공유기 기준)로 이동합니다.

 

 

보안 인증을 하고 로그인 한 뒤 관리도구 > 고급설정 > NAT/라우터 구성 > 포트포워드 설정으로 이동합니다.

 

 

이제 위와 같이 PalServer에 대한 포트포워드 구성을 진행합니다. 최소 하나의 항목을 추가해야 합니다.

 

 

1. 규칙이름: 포트포워드 설정을 구성하는 이름입니다. 

2. 내부 IP 추소: 전용 서버가 설치된 PC의 IP 주소입니다. 만약 관리페이지를 전용 서버가 설치된 PC에서 들어갔다면 체크박스를 클릭해 간단하게 설정합니다.

3. 프로토콜: 해당 포트를 사용하는 프로토콜입니다. PalWorld는 기본적으로 UDP를 사용하는 것으로 알려져 있습니다  전 그냥 둘 다 활성화시켜놨습니다.

4. 외부 포트: 외부망에서 공유기로 접속할 때 사용하는 포트입니다. 포트포워드 설정에 겹치지 않게 적절하게 수정하셔도 됩니다.

5. 내부포트: 전용서버가 사용하는 포트입니다. PalWorld는 기본적으로 8211 포트를 사용합니다

 

** 참고: 내부포트 8211은 서버에서 사용하고 27015는 Query에, 25575는 RCON에 사용된다고 알려져 있습니다. 서버만 구동하는 데에는 8211 포트만 설정해도 서버는 구동됩니다. 

 

 

 

4. 게임 설정

 

이제 서버 설정이 끝났습니다. 이제 인게임 설정을 진행합시다. 내가 만든 서버가 공개되어 아무나 들어오게 하고 싶진 않습니다. 방정보와 비밀번호를 설정해 봅시다.

 

서버 설정파일은 다음에 위치하고 있습니다.

Windows: \Steam\steamapps\common\PalServer\Pal\Saved\Config\WindowsServer\PalWorldSettings.ini

Linux: ~/Steam/steamapps/common/PalServer/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini

 

서버 설정의 기본값은 다음에 위치하고 있습니다.

Windows: \Steam\steamapps\common\PalServer\DefaultPalWorldSettings.ini

Linux:  ~/Steam/steamapps/common/PalServer/DefaultPalWorldSettings.ini

 

DefaultPalWorldSettings.ini에 있는 내용을 복사해 PalWorldSettings.ini에 적용시키면 됩니다.

[/Script/Pal.PalGameWorldSettings]
OptionSettings=(Difficulty=None,DayTimeSpeedRate=1.000000,NightTimeSpeedRate=1.000000,ExpRate=1.000000,PalCaptureRate=1.000000,PalSpawnNumRate=1.000000,PalDamageRateAttack=1.000000,PalDamageRateDefense=1.000000,PlayerDamageRateAttack=1.000000,PlayerDamageRateDefense=1.000000,PlayerStomachDecreaceRate=1.000000,PlayerStaminaDecreaceRate=1.000000,PlayerAutoHPRegeneRate=1.000000,PlayerAutoHpRegeneRateInSleep=1.000000,PalStomachDecreaceRate=1.000000,PalStaminaDecreaceRate=1.000000,PalAutoHPRegeneRate=1.000000,PalAutoHpRegeneRateInSleep=1.000000,BuildObjectDamageRate=1.000000,BuildObjectDeteriorationDamageRate=1.000000,CollectionDropRate=1.000000,CollectionObjectHpRate=1.000000,CollectionObjectRespawnSpeedRate=1.000000,EnemyDropItemRate=1.000000,DeathPenalty=All,bEnablePlayerToPlayerDamage=False,bEnableFriendlyFire=False,bEnableInvaderEnemy=True,bActiveUNKO=False,bEnableAimAssistPad=True,bEnableAimAssistKeyboard=False,DropItemMaxNum=3000,DropItemMaxNum_UNKO=100,BaseCampMaxNum=128,BaseCampWorkerMaxNum=15,DropItemAliveMaxHours=1.000000,bAutoResetGuildNoOnlinePlayers=False,AutoResetGuildTimeNoOnlinePlayers=72.000000,GuildPlayerMaxNum=20,PalEggDefaultHatchingTime=72.000000,WorkSpeedRate=1.000000,bIsMultiplay=False,bIsPvP=False,bCanPickupOtherGuildDeathPenaltyDrop=False,bEnableNonLoginPenalty=True,bEnableFastTravel=True,bIsStartLocationSelectByMap=True,bExistPlayerAfterLogout=False,bEnableDefenseOtherGuildPlayer=False,CoopPlayerMaxNum=4,ServerPlayerMaxNum=32,ServerName="Default Palworld Server",ServerDescription="",AdminPassword="",ServerPassword="",PublicPort=8211,PublicIP="",RCONEnabled=False,RCONPort=25575,Region="",bUseAuth=True,BanListURL="https://api.palworldgame.com/api/banlist.txt")

 

딱 두줄만 복사하면 됩니다. 줄 바꿈을 하시면 안됩니다. 줄바꿈을 하는 경우 설정이 무효화되어 이전 설정값으로 바뀌거나 기본 설정값이 사용됩니다.

(수정) 줄바꿈해도 적용 됩니다. 다만, 게임이 실행중일떄 설정을 바꾼 후 게임을 종료하게되면 기존 게임 설정으로 롤백됩니다. 미리 설정을 바꾸고 서버를 빠르게 재시작하려고 했는데 설정이 롤백되는것을 확인했습니다.

 

자세한 설정값은 공식 홈페이지(Optimize game balance, Settings)에서 확인 후 변경하시면 됩니다.

 

간단하게 방 이름과 암호만 바꾸려면 다음 값을 수정해 주시면 됩니다.

 

1. ServerName="Default Palworld Server" => 방 이름을 변경합니다.

2. ServerPassword="" => 방에 접속할 때 비밀번호를 설정합니다.

3. AdminPassword="" => 방에 접속 후 관리자 명령어를 사용할 떄 필요합니다.

 

관리자 명령어는 마인크래프트에서 tp 같은 명령어를 사용할 때 쓰는 것과 동일하다고 생각하시면 됩니다. 관리자 명령어는 공식 홈페이지(Commands)에서 확인하실 수 있습니다.

 

이제 서버를 구동합시다.

Windows: \Steam\steamapps\common\PalServer\PalServer.exe

Linux: ~/Steam/steamapps/common/PalServer/PalServer.sh

 

 

 

5. 접속: 암호가 있는 방에 IP로 접속하기

 

게임이 아직 얼리액세스이다 보니 전용서버에 암호와 함께 직접 접속하는 방법이 없습니다. 따라서 커뮤니티 서버에서 검색해서 게임에 접속하시거나 다음 방법을 사용하시면 됩니다.

 

* 커뮤니티 서버 검색 후 접속

 

 

가장 기본적인 접속 방법입니다. 방 이름을 검색해 접속하면 됩니다. 방을 선택하면 비밀번호를 입력하는 화면이 나와 비밀번호를 입력하고 접속하면 됩니다.

 

하지만 이 방법의 경우 전용 서버가 제대로 검색되지 않는 경우가 많이 발생합니다. 따라서 다음과 같이 접속하는 방법을 사용해서 비밀 방에 접속할 수도 있습니다.

 

* 직접 접속하기.

 

 

일단 그림과 같이 IP와 포트를 입력해 직접 접속합니다.

 

 

우린 암호를 입력하지 않았으므로 접속에 실패합니다. 다시 전용서버 화면으로 이동합니다. 이번에는 직접 IP를 입력하는 게 아니라 "최근 접속한 서버"를 클릭합니다.

 

 

그럼 방금 전에 접속시도한 서버가 보입니다. 이제 암호를 입력하고 접속해 게임을 즐기시면 됩니다.

 

 

 

 

 

 

반응형

 

DICOM 통신에 기본이 되는 PDU와 PDV에 대해 알아봅니다.

 

1. PDU - Protocol Data Unit

 

https://www.dicomstandard.org/current

 

위의 그림은 DICOM UL 중 A-ASSOCIATE-RQ PDU와 A-ASSOCIATE-AC PDU의 PDU 인코딩의 예시입니다.

 

PDU(Protocol Data Unit)는 계층 내의 피어 엔터티 간에 교환되는 메시지 형식입니다. PDU는 프로토콜 제어 정보와 사용자 데이터로 구성됩니다. PDU는 필수 고정 필드와 하나 이상의 항목 및/또는 하위 항목을 포함하는 선택적 가변 필드로 구성됩니다. 

 

정리하자면

* PDU는 네트워크 통신에서 데이터를 전송하는 데 사용되는 단위입니다.
* DICOM에서 PDU는 네트워크 상에서 DICOM 메시지를 나타내는 단위를 말합니다.
* PDU는 DICOM 메시지의 헤더 정보와 함께 전송되어야 합니다.
* DICOM 네트워크 프로토콜에서는 PDU가 통신의 기본적인 단위로 사용되며, 여러 종류의 PDU가 정의되어 있습니다.

 

 

 

2. PDV - Presentation-data-value

 

PDV는 DICOM 메시지의 일부로, 특히 DICOM 데이터를 전송하는 데 사용됩니다. DICOM 메시지는 PDU (Protocol Data Unit)의 일부로 전송되며, PDU에는 여러 PDV가 포함될 수 있습니다. 

 

PDV는 실제 DICOM 데이터를 담고 있는 부분으로 다양한 종류의 PDV가 존재하고, 각 PDV 유형은 특정한 역할을 수행합니다.

 

정리하자면

* PDV는 PDU 내에서 실제 데이터를 포함하는 부분을 나타냅니다.
* PDU는 여러 PDV를 포함할 수 있습니다.
* PDV는 DICOM 메시지의 일부로, 실제 DICOM 데이터를 포함하고 있습니다.
* PDV는 PDU의 일부로 전송되어, 네트워크 상에서 DICOM 데이터의 전송을 담당합니다.

 

 

 

 

 

 

 

 

반응형

 

DICOM 태그를 다루던 중 태그 타입에 1C라고 적혀있는 걸 보고 문득 TagType의 정확한 정의가 궁금해져서 알아본 후 작성한 글입니다.

 

 

 

Data Element Type

 

 

DICOM에서 태그 타입 ‘1C’는 조건적으로 필수인 타입 1이지만 비어있거나 존재하지 않을 수 있는 타입 2가 포함된 데이터 요소입니다.

 

다른 말로 태그 타입 ‘1C’는 데이터 요소가 필수로 DICOM 객체에 나타나야 하지만 특정 환경이나 다른 연관된 태그의 값에 따라 값을 가지고 있지 않을 수 있는 태그 타입을 가리킵니다. 만약 연관된 데이터 요소가 특정 값을 갖는다면 ‘1C’ 데이터 요소는 반드시 값을 가져야 하지만 연관된 데이터 요소가 특정한 값을 갖지 않는 다면 ‘1C’ 데이터 요소는 값을 빈값으로 갖거나 태그가 없을 수 있습니다.

 

DICOM 표준에서는 세 개의 데이터 요소 타입을 정의하고 있습니다:

  • 타입 1: 값을 반드시 가져야 하는 필수 요소.
  • 타입 2: 다른 연관된 요소에 따라 값을 가질 수도 가지지 않을 수도 있는 조건적으로 필요한 요소
  • 타입 3: 값을 가질 수도 가지지 않을 수도 있는 선택적 요소.

 

'1C' 태그 타입은 유형 1과 유형 2의 조합으로, 특정 조건에서는 요소가 값을 가져야 하지만 다른 조건에서는 비어 있거나 존재하지 않을 수 있는 태그 타입입니다. DICOM 파일을 읽거나 쓸 때 '1C' 데이터 요소를 올바르게 처리하여 해당 요소에 대해 정의된 조건에 따라 데이터가 적절하게 해석되고 처리되도록 해야 합니다.

 

 

참조

https://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_7.4.html

https://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_7.4.2.html

https://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_7.4.3.html

https://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_7.4.5.html

 

 

 

 

반응형

 

 

 

DICOM 태그를 다루면서 종종 간과하는 사실 중 하나가 태그 값의 길이입니다.

 

DICOM 태그 값의 길이는 항상 짝수입니다. 

 

홀수 길이의 DICOM 태그 값에 대한 제한은 짝수 길이 값을 기반으로 하는 DICOM 데이터의 형식 및 구조 때문입니다. 

 

1. 길이가 짝수인 태그 값의 표준화를 통해 DICOM 데이터를 여러 시스템 및 소프트웨어 애플리케이션에서 효율적이고 일관되게 구문 분석하고 처리할 수 있습니다.

2. 모호하거나 호환되지 않는 데이터 형식으로 인해 발생할 수 있는 오류 및 상호 운용성 문제를 방지하는 데 도움이 됩니다.

3. 길이가 짝수인 태그 값을 사용하면 DICOM 데이터를 저장하고 전송하는 프로세스가 간소화됩니다.

4. 데이터를 고정 길이 필드로 보다 효율적으로 압축하고 컴퓨터에서 더 빠르게 처리할 수 있습니다.

 

따라서 이러한 제한은 DICOM내에서 데이터의 효율적이고 일관된 처리를 가능하게 하고 오류 및 상호 운용성 문제를 방지하는 데 도움이 됩니다.

 

 

 

 

 

반응형

 

 

 

DICOM Modality Worklist (MWL)은 의료 영상에서 환자 정보 및 검사 요청을 병원의 방사선 정보 시스템(RIS)이나 병원 정보 시스템(HIS)에서 가져와 CT, MRI, X-ray 및 초음파 등의 영상 장비에 표시하는 표준 프로토콜입니다.

 

HIS(병원 정보 시스템), RIS(방사선 정보 시스템) 및 EMR/EHR 솔루션은 환자 인구 통계 및 검사 일정 정보의 마스터 인덱스를 제공합니다. Modality Worklist는 환자 주문, 검사 요청 및 환자 이름, ID, 검사 유형 및 일정 정보와 같은 관련 정보 목록을 제공합니다.

 

Modality worklist는 필요한 환자 데이터와 검사 세부 정보를 검색하기 위해 모달리티 워크리스트에 액세스 할 수 있으며, 이를 통해 수동 입력의 필요성을 제거합니다. MWL이 없으면 양식은 환자 건강 관리 정보(PHI)를 가져와 양식에 수동으로 입력해야 합니다. 이 프로세스는 추가 수작업과 인적 오류의 위험을 초래할 수 있습니다.

 

DICOM Modality Worklist를 사용하면 방사선과 기술자는 올바른 환자에게 올바른 검사를 수행하고 참조 의사나 환자 치료에 참여하는 기타 의료 전문가로부터 특정 지시사항이나 특별 요청 사항을 볼 수 있습니다. 모달리티 워크리스트는 작업 흐름 및 효율성을 향상시키고 검사 지연을 줄이며 환자 안전을 향상시킬 수도 있습니다.

 

 

 

References:

DICOM Modality Worklist

DICOM Modality Worklist & MPPS

 

 

 

반응형

 

윈도우 11 업그레이드 이후 Explorer에서 우클릭 시 "더 많은 옵션 표시"를 기본값으로 변경하는 방법에 대해 알아봅니다.

 

 

 

변경된 기본 컨텍스트 메뉴

 

 

윈도우 11로 업그레이드 되면서 많은 기본 UI들이 변경 되었습니다. 다양한 기능이 사용하기 편하게 변경 되었으나 파일 익스플로러의 컨텍스트 메뉴는 다양한 옵션을 사용하기 더 불편해 졌습니다.

 

 

 

항상 "더 많은 옵션 표시"로 변경하기

 

명령창에서 레지스트리를 건드려줘야 합니다. 먼저 명령창, 파워쉘 혹은 터미널을 열어줍니다.

 

 

이후 다음 명령어를 수행해 줍니다.

 

reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve

 

 

이제 변경내용을 바로 파일 익스플로러에 반영시켜주기 위해 파일 익스플로러를 재시작해 줘야 합니다. 작업관리자를 열어 다음 작업을 수행하거나 명령창에 다음 명령어를 수행합니다.

 

 

또는

 

 taskkill /f /im explorer.exe

 

 

이후 정상적으로 파일 익스플로러가 종료되었다면 다음과 같이 다시 시작시켜 줍니다.

 

 

또는

 

explorer

 

 

이후 익스플로러가 실행된 뒤 우클릭 하면 정상적으로 "더 많은 옵션 표시"가 기본값으로 적용된 것을 확인할 수 있습니다.

 

 

 

 

 

 

 

 

출처: How-To: Disable new context menu, Explorer command bar

 

How-To: Disable new context menu, Explorer command bar

No 3rd-party apps or patches or whatever, just a simple registry value. Restart Explorer shell to take effect. **Disable new context menu:** ...

www.reddit.com

 

 

 

반응형

맥에서 포트 5000번이 이미 사용 중이라는 메시지를 해결하는 방법에 대해 알아봅니다.

 

 

 

현상.

 

 

docker-compose를 사용하려고 하는데 뭐 킨 것도 없는데 5000번 포트가 사용 중이라는 메시지가 뜹니다.

 

 

 

원인.

 

 

실제로 5000번 포트를 사용하고 있는 것을 확인해보니 "제어센터" 프로세프가 5000번 포트를 점유 중입니다.

 

찾아보니 맥에서 몬트레이 업그레이드 "AirPlay수신 모드"가 자동으로 켜지는데 이 기능이 5000번 포트를 점유한다고 합니다.

 

 

 

수정.

 

환경 설정에서 다음과 같은 메뉴로 이동합니다.

 

 

해당 설정에서 AirPlay 수신 모드를 꺼주면 이제 5000번 포트를 사용할 수 있습니다.

 

 

 

 

 

반응형

 

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.
    }
}

 

 

 

 

 

 

 

 

반응형

+ Recent posts