도커의 모든 컨테이너를 삭제하는 커맨드이다. 


docker ps -a -q |  xargs docker rm -f




docker ps-a -q의 경과가 빈다면 파이프 다음 커맨드를 실행하고 싶지 않다면

--no-run-if-empty를 추가한다.




docker ps -a -q |  xargs --no-run-if-empty docker rm -f


Posted by 김용환 '김용환'





두브르부니크는 아름답다.



성벽 투어를 하거나 old ciy를 하다 보면 산 하나에 올라가고 싶은 마음이 드는데

스르즈 산이다.




보통 old city 위에 위치한 케이블 카 센터에서 왕복 티켓을 사서 케이블 카를 타고 다닌다. 길어야 5분 정도 걸린다.




개인적으로 이런 산은 높지 않아서 자신이 있었지만... 

특히 두부르부니크를 지켜낸 크로아티아인의 마음을 느끼고 싶었다.


스르지 산에 올라가로 결정한다.


여름이라 굉장히 덮다.

걸어 올라갈 때는 시원한 음료수를 챙겨 가길 바란다. 목이 많이 마르다.

늦은 오후, 밤에는 절대 등산, 하산 하지 않길 바란다.
(길을 밝히는 등이 없다. 

참고로 등이 있는 부다페스트 시타델라도 엄청 무섭다...
스르지산은 아무 등도 없으니 늦은 오후에는 도전하지 않길 바란다)



스르지 산을 올라가는 길은 하나인데, 잘못 갈 수 있다.




올라가는 방법은 아래 지도를 참고 한다. 그냥 old city에서 올라가면 길이 없을 수 있다.




무척 대고 올라간지라 나는 이상한 곳으로 올라갔다.





잘못 간길이라... 포기할까 했는데..

가다 보니, 내가 온 길로 외국인 일행이 걸어와서. 물어보니 방향을 알려주었다.

(위험하다고 생각되면 바로 되돌아가 가길 바란다. 위에 소개한 안전한 길로 가길 바란다. 

걷는 것이 힘들 수 있으니 케이블 카도 좋은 방법이다.) 


걷는 사람이 거의 없긴 하지만, 도움 받으면서 산 입구에 도착했다.





산행 길을 시작한다. 





점점 아름다운 두부르부니크가 나온다. 

정말 아름답다.. 정말 아름답다.

고향 두브르부니크를 보호한 크로아티아인의 마음이 느껴진다.




걸어서 올라가니, 아름답니다. 

더운 여름날.. 정말 뜨거운 여름 날이지만 행복하다.


순례길 같다. 



스르스산에 드디어 올라갔다. 아름답다. 




스르지 산 반대편은 보스니아-헤르체코비나 땅이다. 구글 지도를 보며 자세히 길을 보면 철책도 보인다. 






Posted by 김용환 '김용환'



bash에 for each 문을 curl과 결합할 수 있다. 


for i in {1..10}; do

  curl -X GET "http://localhost/api/v1/orders/$1" -H "accept: application/json;charset=UTF-8"

done



수 천개의 파일에 매개 변수를 넣어 확인하려면 {1..10} 대신 $(cat file)으로 변경만 하면 된다.


for i in $(cat file); do

  curl -X GET "http://localhost/api/v1/orders/$i" -H "accept: application/json;charset=UTF-8" 

  sleep 1

done





Posted by 김용환 '김용환'


엄청 많은 암호화된 단어를 저장한 수 백개의 단어를 한번에 java 코드에서 복호화하고 싶다. 


awk로 특정 데이터를 뽑아냈다.


MDBlOTVkMTZhMzNiNjRjZjI2MTg2ZGFiOTBiMjdmMWY

...

ZTM1ZDAyYTA2NjhhMzVlZjhmZmJhZTA0M2JlZmQ2NDg

MWRjODkzM2Q5MWI1NzdiNjRkOTVmOWU4OTNjYjgyMDc



이럴 때는 아래와 같은 sed 커맨드를 사용한다. replace(s)를 사용해 앞과 뒤에 쌍따옴표(")를 붙이고 중간에 기존 단어를 사용하게 한다. 



$ sed 's/^/\"/; s/$/\"/' file

"MDBlOTVkMTZhMzNiNjRjZjI2MTg2ZGFiOTBiMjdmMWY"

...

"ZTM1ZDAyYTA2NjhhMzVlZjhmZmJhZTA0M2JlZmQ2NDg"

"MWRjODkzM2Q5MWI1NzdiNjRkOTVmOWU4OTNjYjgyMDc"



배열로 복호화하기 때문에 , 를 맨 앞에 넣는다.


$ sed 's/^/,\"/; s/$/\"/' bb


, "MDBlOTVkMTZhMzNiNjRjZjI2MTg2ZGFiOTBiMjdmMWY"

...

,"ZTM1ZDAyYTA2NjhhMzVlZjhmZmJhZTA0M2JlZmQ2NDg"

,"MWRjODkzM2Q5MWI1NzdiNjRkOTVmOWU4OTNjYjgyMDc"



맨 앞의 , 만 빼면 되니 배열로 쉽게 코딩할 수 있다. 



String[] encrypteds = new String[] { "MDBlOTVkMTZhMzNiNjRjZjI2MTg2ZGFiOTBiMjdmMWY"

.. ,"ZTM1ZDAyYTA2NjhhMzVlZjhmZmJhZTA0M2JlZmQ2NDg"
,"MWRjODkzM2Q5MWI1NzdiNjRkOTVmOWU4OTNjYjgyMDc"

Arrays.stream(encrypteds) .map(enc -> decryptAES(enc)) .forEach(System.out::println);

};


Posted by 김용환 '김용환'

두브르부니크 old city 에서 집시에게서 지갑과 돈을 모두 잃어버렸다. 

다행히 여권은 찾았고 두브르부니크 여행시 알면 좋을 내용이 있다.



두브르부니크에는 크로아티아 경찰 외에 외국 경찰들이 있다. 워낙 많은 사건/사고들이 많은 지라 여러 국가 경찰(제가 들은 분들은 미국, 영국, 프랑스, 이탈리아 )들이 있는데. 특히 한국 경찰, 2분이 3주마다 돌아가서 지켜주고 있다.


처음에 현지인의 도움을 받아 경찰서에 가서 크로아티아 경찰, 한국 경찰 분들의 도움을 받아 신고했지만, 아직까지 범인들을 찾지 못했지만 여권은 찾아서 다행이었다.


하나 비바 카드 덕택에 잘 돌아왔습니다. 씨티 카드 만큼 훌륭한 카드였다. 조금 돈을 넣어두었는데. 유용하게 사용했다. ATM이 있는 곳이라면 돈을 뺄 수 있다. 정말 old city에는 ATM 기기가 많다.



두브르브니크에서 여권을 잃어버려면 지리적인 부분(중간에 보스니아 땅이 있음) 비행기와 도로로 수도 자그레브까지 이동을 못한다. 따라서 배를 타고 이동해 수도 자그레브로 이동해야 하는데, 크로아티아 경찰들도 자기 스케쥴이 있어서 잘 만나기 쉽지 않고, 여권 분실시 대사관가서 작업해야 해서 최소 1주일이 걸릴 수도 있다고 한다.





(크로아티아 수도인 자그레브까지는 엄청 먼 곳이다.)






동양인 커플등을 주로 타겟으로 잡아서 골치라고 하니 참고 하길 바란다.

그래서 두브르부니크에서는 가방을 맬때는 중국처럼 꼭 앞으로 매길 바란다. 집시가 집시처럼 옷을 입지 않는다. 관광객처럼 돌아다닌다. 

짐이 거의 없고 옷도 너무 편하게(가볍게) 입고 거의 탄 얼굴이면 조심할 필요가 있다. 집시일 가능성이 높다. 



여권을 반드시 제일 중요하게 여겨야 한다.
현금 도난에 대한 보험은 한국에 아예 없다. (여행 보험사인 삼성생명에서 확인)
현금도난에 대비해 씨티 카드나 하나 비바 카드를 꼭 만들자. (비상금)


혹시 두브르부니크 경찰서에서 가야한다면 한국인 경찰관을 불러주시면 도와주실 것이다.




두브르부니크 경찰서 위치는 다음과 같다.



old city에서 상당히 멀리 떨어져 있다..

10번 버스가 경찰 근처까지 가니 참고바란다. (GPS보고 내려야 함)


Posted by 김용환 '김용환'


도커의 network 설정 중 bridge는 docker0이라는 네트워크를 사용한다. 



$ docker network inspect bridge

[

    {

        "Name": "bridge",

        "Id": "2b3831fb8f909d0a44d7a74f4f0df3327f1f02409096b4b8f4ba5a2ce5a5a7d6",

        "Created": "2019-06-28T22:52:24.973773315Z",

        "Scope": "local",

        "Driver": "bridge",

        "EnableIPv6": false,

        "IPAM": {

            "Driver": "default",

            "Options": null,

            "Config": [

                {

                    "Subnet": "1.1.0.0/16",

                    "Gateway": "1.1.0.1"

                }

            ]

        },

        "Internal": false,

        "Attachable": false,

        "Ingress": false,

        "ConfigFrom": {

            "Network": ""

        },

        "ConfigOnly": false,

        "Containers": {},

        "Options": {

            "com.docker.network.bridge.default_bridge": "true",

            "com.docker.network.bridge.enable_icc": "true",

            "com.docker.network.bridge.enable_ip_masquerade": "true",

            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",

            "com.docker.network.bridge.name": "docker0",

            "com.docker.network.driver.mtu": "1500"

        },

        "Labels": {}

    }

]




host라는 모드가 있는데 이는 eth0을 사용하는 것이다. 

$ docker network inspect host

[

    {

        "Name": "host",

        "Id": "ee9bddcf9dc5a7804f63522a9740d3226e8df3ce31575cfc9a7ebbd0f7d5a23d",

        "Created": "2018-10-15T07:14:31.9624055Z",

        "Scope": "local",

        "Driver": "host",

        "EnableIPv6": false,

        "IPAM": {

            "Driver": "default",

            "Options": null,

            "Config": []

        },

        "Internal": false,

        "Attachable": false,

        "Ingress": false,

        "ConfigFrom": {

            "Network": ""

        },

        "ConfigOnly": false,

        "Containers": {},

        "Options": {},

        "Labels": {}

    }

]


또한 17.06부터 docker container create를 사용할 때 --network host를 사용하면 eth0을 바로 사용할 수 있다. 



kubernetes에서도 이와 비슷한 기능이 있다. 

pod의 모든 컨테이너에서 노드의 eth0을 사용할 수 있도록 HostNetwork(즉 hostNetwork: true)을 설정할 수 있다.  








Posted by 김용환 '김용환'


카프카의 MirroMaker



https://cwiki.apache.org/confluence/display/KAFKA/KIP-3+-+Mirror+Maker+Enhancement

카프카 브로커의 특정 topic을 다른 곳으로 다른 브로커로 보낼 수 있는 간단한 기능이다.

복제가 된다는 점에서 훌륭한 툴이다.


(최근에 elasticsearch도 cross cluster replication를 선보였다.)



 replicator에 비하면 약한 부분이 있기는 하지만 무료이다.


https://docs.confluent.io/current/multi-dc-replicator/mirrormaker.html


사용법은 원체 간단하다. 

> bin/kafka-mirror-maker.sh

      --consumer.config consumer.properties

      --producer.config producer.properties --whitelist my-topic


특이할 점은 consumer 쓰레드 개수를  조절할 수 있다.


소스를 살펴보면,

https://github.com/apache/kafka/blob/trunk/core/src/main/scala/kafka/tools/MirrorMaker.scala


중요한 부분은 consumer는 multi-thread로 실행되고

producer는 while문에서 flush이 이루어지기 때문에. consumer 쪽 보다는 데이터가 많아진다면 producer쪽 이슈가 생길 수 있다. 


Posted by 김용환 '김용환'



pipenv 실행시 pkg_resources.DistributionNotFound가 발생하면

재설치를 진행한다. 



brew를 사용 중이라면

brew uninstall pipenv를 실행 후 

brew install pipenv를 실행한다

Posted by 김용환 '김용환'


최근에 국세청에 "종합소득세 경정 청구"를 올려 환급받았다. 

세무사 없이 공부겸사 도전해 봤고 괜찮았다. 도움이 될만한 링크를 작성한다.





경정 청구 개념에 대한 설명이 잘 나온 글이다.

https://1boon.kakao.com/moneyplus/taxKyunga2


경정 청구 방법

https://blog.naver.com/you_wish/221461237647
(경정 청구할 때 통장 번호를 입금했으면 통장으로 입금된다. 이 방법이 좋은 이유는 따로 우체국 갈 필요가 없다. 7월 2일 통장으로 입금되었다)


5월에 경정 청구를 진행한 후, 6월 쯤에 세무소 직원에게서 연락이 와서 이런 부분은 이렇다. 저런 부분은 이래서 실제는 이렇게 될 것이라고 얘기해 주었다.


그리고 7월 경에 세무서에서 경정 청구 결과에 대한 편지가 왔다.


홈택스의 세금 신고 결과 조회에서 경정 청구 신고 내용을 확인할 수 있다.

https://www.hometax.go.kr/websquare/websquare.wq?w2xPath=/ui/pp/index_pp.xml&tmIdx=01&tm2lIdx=0107000000&tm3lIdx=0107010000



국세환급금 통지서 재발급은 다음을 참고 한다.

https://youandyou1.tistory.com/556

(국세환급금 통지서를 못받으면 재발급 가능하다. 경정 청구시 환급받을 계좌를 등록했으면 바로 통장으로 들어온다)




검색을 해보면 환급된 국세 외에 지방세(10%)를 환급받으려면 따로 '지방소득세 소득세분 환급청구서'를 별도 작성한다고 한다고 하나..

https://cafe.naver.com/ak573/428032

https://m.blog.naver.com/PostView.nhn?blogId=sofushgdma39&logNo=221217593100&proxyReferer=https%3A%2F%2Fwww.google.com%2F


세무서에 전화를 해보니, 지자체에 알려줬으니 따로 신청할 필요가 없다고 알려준다.

하지만 종합 소득세 환급이 된 후, 2주일이 지나도 지방 소득세가 환급되지 않으면 

세무서와 지차체(구청)으로 전화해서 환급 일정을 알아본다.



그러나 중간에 이슈가 있어서 세무서-구청으로 전달되지 않는 경우가 있다. 

지자체 지방세과에 전화해서 확인해보니 경정 청구건을 못 받았다고 한다. 



결국 이차저차 두 군데 전화하고 담당자 확인해서 세무서에서 지자체 지방세과로 전달이 안된 부분이 생겼다.  좀 늦게 전달될 것 같다고 세무소 직원이 다음 달 안에 지방 소득세 환급이 될 것이라 얘기해주었다.


(참고로 동마다 담당자가 있으니.. 담당 공무원 전화번호를 알아두면 좋다. 참고할 것!!)






Posted by 김용환 '김용환'
컬럼에 "COLLATE utf8mb4_unicode_ci" 를 삭제하고 싶다면 다음을 진행한다.


1. 테이블 스키마에 COLLATE utf8mb4_unicode_ci 를 먼저 삭제한다.
> ALTER TABLE samuel_test DEFAULT CHARACTER SET utf8mb4;


2. 그다음에 컬럼에 COLLATE utf8mb4_unicode_ci 삭제한다 (먼저 컬럼 속성을 변경하지 않는다)

> ALTER TABLE samuel_test CHANGE `SESSION_ID` `SESSION_ID` char(36) NOT NULL; 




예시는 다음과 같다.  아래와 같은 테이블이 있다.



DROP TABLE samuel_test;


# dummy

CREATE TABLE `samuel_test` (

  `id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,

  `name` bigint(20) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;



# 안바뀐다. 

ALTER TABLE samuel_test CHANGE `id` `id` char(36) NOT NULL;



# 먼저 테이블 스키마에 COLLATE 부분을 먼저 정리

ALTER TABLE samuel_test DEFAULT CHARACTER SET utf8mb4;


# 테이블 스키마에 COLLATE 부분이 정리된 것을 확인할 수 있다.

SHOW CREATE TABLE samuel_test;


ALTER TABLE samuel_test CHANGE `id` `id` char(36) NOT NULL;


SHOW CREATE TABLE samuel_test;



이제 제대로 정리되었음을 알 수 있다.



samuel_test, CREATE TABLE `samuel_test` (

  `id` char(36) NOT NULL,

  `name` bigint(20) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4


Posted by 김용환 '김용환'