object Suit extends Enumeration {
   val Clubs, Diamonds, Hearts, Spades = Value

   implicit class SuitValue(suit: Value) {
      def isRed = !isBlack
      def isBlack = suit match {
         case Clubs | Spades => true
         case _              => false
      }
   }
}


참고링크
https://stackoverflow.com/questions/4346580/how-to-add-a-method-to-enumeration-in-scala

Seq[Future[Seq[SomeClass]의 값을 Future[Seq[SomeClass]]의 형태로 재가공(Squash) 할 필요가 있다.

이런경우 아래와 같이 사용할수 있다.

var after = Future.sequence(before).map(x => x.flatten)

 

 

참고링크

'Scala' 카테고리의 다른 글

Scala Enumeration에 method 추가하기  (0) 2022.05.13

소스 코드 https://github.com/yu-young-hoon/csharp_ddns_sender

실행 파일 ddns_setting.zip



 간단하게 DNSZi의 관리 프로그램을 따라해보고 약간 아쉬운 점이 있었는데


 첫번째로 로그인 기능과 로그인 정보 저장 기능

 사실 로그인이라기 보다는 아이디와 ddns 세팅의 인증키로 올바른 값인지 체크해주는 기능이지만

 기존 프로그램에서 아이디와 ddns 세팅키를 저장해줘서 컴퓨터를 재부팅 할때 마다 인증키를 찾아보지 않아도 되서 편리했었다.


 두번째로 Dynamic DNS 호스팅 목록 가져오기

 DDNS로 설정해둔 호스트의 경우 목록을 가져오고 이외의 목록은 표시해주지 않는 기능과 부가적으로 이전에 세팅해두었던 업데이트 목록을 저장해두는 기능이 있었다.


 세번째로 위에 기능을 적용하면서도 내가 사용하려는 기능에 비해 4개의 탭을 왔다갔다 하며 로그를 보고 설정하는게 답답해서 한페이지였으면 좋겠다는 생각을 했다.


 이런 기능들을 추가 하기 위해서 API를 확인 해볼 필요가 있었는데 아쉽게도 공개된 API 목록이 없었기 때문에 Wireshark로 사용되는 API의 URI와 Parameter를 확인해 보았다. 



 기존 프로그램은 총 4개의 API를 GET Mathod를 통해 사용하고 있었고 debug=ok라는 파라메터를 통해 로그를 받아 볼수 있었다.

 auth의 경우 아이디와 세팅의 인증키로 올바른 값인지 확인하는 기능

 get의 경우 DDNS으로 설정한 호스팅 목록을 가져오는 기능

 ip의 경우 whatismyip 사이트 처럼 외부에서 바라보는 내 컴퓨터의 Public IP를 확인해주는 기능

 set의 경우 DDNS로 설정한 호스트를 업데이트 하는 기능으로 ip 파라메터를 통해 임의 값을 지정 할 수도 있었다.


 set API 경우 IP를 임의로 지정할 필요 없이 파라메터를 생략한다면 ip API에서 나오는 내 컴퓨터의 Public IP로 지정이 되고 임의 IP를 지정해서 설정하는 것은 DNSZi 홈페이지에도 가능한 기능이고 필요 없기 때문에 생략 하였다.


 get API를 통해서 나오는 값은 XML 형식의 데이터로 status를 제외한 값은 cdata-section으로 감싸져 있었고 도메인 자체의 DDNS의 경우 "@" 값이 record로 나왔다.

 request로 불러들인 값을 C#의 기본 XmlDocument로 파싱하고 Json 형식으로 변환해서 사용하려고 하였지만

 ddns 태그의 반복을 파싱하지 못하고 Document가 미완성 되서 생성 되었다.

 문자열 정규식을 통해서 Matche된 DDNS태그 덩어리를 가져오고 해당 Matche의 원하는 cdata-section의 값을 Group으로 가져와서 처리하였다.

 DDNS 태그 덩어리가 없는 auth API와 set API의 경우는 파싱이 잘 진행되어서 그대로 사용할수 있었다.




 기존 프로그램과 같이 로그의 경우 msg 태그의 값을 그대로 찍어 주었고

 로그인 정보와 선택된 호스팅 목록 저장 기능은 yaml 파일에 저장하는걸로 간단히 구현해 보았다.



 심심하기도 하고 필요하기도 해서 간단하게 만들어 본다고 했지만 모양이 너무 안예쁘게 나온것 같다. 로그를 하루마다 파일로 빼서 저장하거나 Clear하는 기능은 나중에 추가해 봐야겠다. 시간 설정 부분의 경우 보기도 안 좋고 기존 프로그램의 기본값인 5분이면 충분하다는 생각으로 설정하였다.


 X 버튼을 눌러도 종료되지 않고 작업표시줄에 Notify Icon을 표시해서 더블 클릭하면 다시 보이도록 하였고 

 Notify Icon 우클릭해서 종료를 하게 하였다.


 IP의 경우 랜선을 뽑거나 네트워크가 끊겼을 경우는 네트워크 오류 메세지가 출력 되도록 했고 랜선을 다시 꼽거나 네트워크가 정상이 되었을때는 다시 정상으로 갱신된다.

 IP 값을 지정하거나 서버에서 불러온 값으로 갱신하는것이 아니라 DNSZi가 내컴퓨터를 외부에서 바라보는 IP로 되도록 파라메터를 넣지 않았기 때문에 IP값이 잘못된 값이 들어갈 경우는 없을 것 같다.



 추후 심심할때 해볼것 기록

 - Log 파일로 출력, Log Clear

 - 컴퓨터 재부팅시 자동 실행

 - 버튼 여러번 눌리는거 막기

 - 이쁘게 바꿔보기

DNSZi는 무료로 dns제공 및 DDNS까지 지원해준다.

DDNS 관리 서비스 프로그램 까지 지원 해주었는데 

더 이상 프로그램은 지원해주지 않는다고 해서 아쉬워서 대충이나마 직접 만들어 보았다.


아이디와 인증키를 넣으면 자동으로 호스트 목록이 갱신되는 기능이 있는데

API를 알수가 없어 기능을 넣을수 없었다. API리스트는 아니더라도 저 API만 이라도 있으면 좋으련만 ㅠㅠ



사이트에 나와있는데로 */5 * * * * /usr/local/bin/curl -s 'http://ddns.dnszi.com/set.html?user=YYYYYYY&auth=XXXXXXX&domain=algodico.com&record=*'

형식을 따라 request만 해주면 갱신은 끝나고 debug=ok랑 캐싱을 막아보려고 파라메터를 하나더 넣어서 보내봤다.





테스트 해본결과 잘되긴 하는데 ip가 바뀌는 시점에도 적용이 되는지 장기간 테스트를 해봐야 할것같다.

암시적으로 선언된 변수를 사용하거나 읽기 전용(const)속성에 값을 할당하거나 확장할 수 없는 개체에 속성을 추가할 수 없고 구문 오류에 에러를 출력해주어 좀더 엄격한 코드를 작성하게 해준다,

windows는 기본적으로 개행을 \r\n, 리눅스나 맥은 \n으로 처리한다.

기본 설정에서 git은 개행의 차이를 감지해서 변화가 없는 파일까지 modified로 잡힐 때가 있다.

이런 문제를 피하고 싶을때 git을 설치하고 처음으로 아래 명령어를 실행 시켜주면 개행 문자를 통일할수 있다.


1.git config --global core.eol lf

line ending을 LF로 처리 한다.


2.git config --global core.autocrlf input

line ending을 LF로 처리 한다.


3. git config --global core.autocrlf true

check out, check in 할때 crlf를 LF로 바꿔서 저장, LF를 crlf로 변환하여 불러오기를 한다.


윈도우즈 일경우 1,3번 맥과 리눅스일 경우 1번과 2번을 사용하면 좋다.

npm install --global --production windows-build-tools

윈도우즈에서 서드파티모듈 빌드에 필요한 내용을 설치하는 방법으로 간단하게 msbuild error를 해결할 수 있다.

nodejs에서 서드파티 모듈을 설치하고 GIT이나 SVN으로 버전관리를 하는 경우

서드파티 모듈을 관리 하는 2가지방법이 있다.


1. npm install --save [서드파티모듈]

첫번째로 서드파티 모듈을 npm으로 설치할때 --save옵션을 주게 되면

package.json의 dependencies에 서드파티 모듈의 정보가 쌓이게 된다.

{

  "name": "",

  "version": "1.0.0",

  "description": "",

  "main": "index.js",

  "scripts": {

    "test": "echo \"Error: no test specified\" && exit 1"

  },

  "repository": {

    "type": "git",

    "url": ""

  },

  "author": "",

  "license": "ISC",

  "dependencies": {

    "body-parser": "^1.15.2",

    "cors": "^2.8.1",

    "ejs": "^2.5.5",

    "express": "^4.14.0",

    "formidable": "^1.0.17",

    "lwip": "0.0.9",

    "mongoose": "^4.7.6"

  }

}

버전 관리를 할때는 node_modules을 제외하고 커밋한 후에 다른 곳에서 개발을 할때는 npm install을 통해 

dependencies의 서드파티모듈을 다운받아 개발을 진행하면 된다. 하지만 이럴경우 dependencies의 서드파티 모듈의 버전 정보가 정확히 기입되어 있어야 서드파티 모듈의 버전이 달라져서 생기는 오류를 피할수있다.

예를들어 ejs: ">=2.5.5"라고 되어있다면 2.5.5이상의 버전을 받기 때문에 만약 상위 버전으로 업데이트가 되었고 호환되지 않는다면

에러가 발생할수도있다.


2. npm install --ignore-script

두번째로  서드파티 모듈을 npm으로 설치할때 --ignore-script옵션을 주게 되면 빌드 되지 않은 형태로 node_modules에 다운로드 되게된다.

버전 관리를 한때는 node_modules를 포함하여 커밋을 하고 다른 곳에서 개발을 할때는 npm rebuild를 통해

빌드가 필요한 모듈을 빌드하여 개발을 진행할 수 있다. 이 경우 서드파티 모듈을 다운받을 필요가 없기때문에 인터넷이 되지 않는곳에서 유용하게 사용할수있고 서드파티 모듈의 버전이 달라 지는 경우가 없기때문에 버전 관리 툴을 통해 새로운 환경에서 개발할때 에러 발생 없이 작업을 진행할 수 있는 장점이 있다.

git config --system core.longpaths true
git remote add origin https://github.com/user/repo2.git

+ Recent posts