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)속성에 값을 할당하거나 확장할 수 없는 개체에 속성을 추가할 수 없고 구문 오류에 에러를 출력해주어 좀더 엄격한 코드를 작성하게 해준다,

+ Recent posts