반응형

간단한건데 해당 옵션을 모르면 헤메는 경우가 있어 기왕 관련 작업한거 정리해보려 한다.

일반적으로 쉘스크립트에서 파일이 존재하는지 확인하고 싶다면 아래처럼 사용하면 된다.

if[ -e $FileName ]; then
	echo "file exist"
else
	echo "file not exist;
fi

주요 옵션 몇개만 살펴보자면

-c : 파일이 존재하고 특수문자가 있는지 체크 (File exists and is character special)

-e : 파일이 존재 하는지 체크 (File exists)

-d : 파일이 존재하고 파일이 폴더인지 체크 (File exists and is a directory)

-f : 파일이 존재하고 보통 파일인지 체크 (File exists and is a regular file)

-h : 파일이 존재하고 symbolic link 파일인지 확인 (File exists and is a symbolic link (same as -L)

-r : 파일이 존재하고 read 가능한 파일인지 확인 (File exists and read permission is granted)

-w : 파일이 존재하고 쓰기 가능한 파일인지 확인 (File exists and write permission is granted)

-s : 파일이 존재하고 0size 파일이 아닌지 체크 (File exists and has a size greater than zero)

 

반응형
반응형

Solution

$ yum -y install gcc-c++

 

반응형
반응형

Solution

$ yum -y install gcc 
반응형
반응형

Docker기반의 Superset을 사용중인데 yum update이후 docker관련 라이브러리들이 업데이트 되었다.

이로 인해 잘돌아가던 Superset UI에 접속할 수 가 없었다.

계속해서 페이지에 접속되지 않고 ERR_CONNECTION_TIMED_OUT 메세지가 떴다.

이에 Docker, Superset 재시작을 해보았지만 여전히 동일한 상황....문제는 둘 다 재시작되면서 별다른 에러메세지도 없었고 잘 구동되었다.

뭔가 네트워크적인 이슈가 있다고 판단 구글링을 해서 본 docker 디렉토리 밑의 network/files를 날려보기로 결심...(너무 무서워서 알파 환경에서 먼저 시도해보았다. 이래서 리얼환경과 동일한 알파환경은 꼭 필요하다.)

ref : https://github.com/moby/moby/issues/25981

 

알파환경에서 sudo systemctl stop docker 실행 후 /var/lib/docker/network/files를 날리고 기존 Docker container, image들을 모두 제거 해준 뒤 재시작해보았다.

sudo systemctl stop docker
sudo rm -rf /var/lib/docker/network/files  => 네트워크 파일 제거

incubator-superset/docker 폴더 밑에서
docker stop $(docker ps -a -q)     => 도커 모든 프로세스 중단
docker rm $(docker ps -a -q)        => 도커 모든 컨테이너 제거
docker rmi $(docker images -q)   => 도커 모든 이미지 제거

위와 같이 수행하였고 docker-compose up 명령어를 통해 다시 superset을 띄워보았다. 

문제없이 Superset내부의 데이터들이 그대로 남아있는 것을 확인(제일 중요)하고 리얼에 적용해 보았다.

동일하게 sudo rm -rf /var/lib/docker/network/files 제거 하고 docker stop $(docker ps -a -q)     => 도커 모든 프로세스 중단명령을 날리는데 다음과 같은 에러메세지가 떴다.

$ docker stop $(docker ps -a -q)
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
"docker stop" requires at least 1 argument.
See 'docker stop --help'.

Usage:  docker stop [OPTIONS] CONTAINER [CONTAINER...]

Stop one or more running containers

해결은 아래의 명령어로 처리

$ sudo dockerd

dockerd is the daemon service for docker containers, because it is not running in background we're not able to take any actions related to the service, which needs be restarted.

참조 : https://stackoverflow.com/questions/44678725/cannot-connect-to-the-docker-daemon-at-unix-var-run-docker-sock-is-the-docker

 

Cannot connect to the Docker daemon at unix:/var/run/docker.sock. Is the docker daemon running?

I have applied every solution available on internet but still I cannot run Docker. I want to use Scrapy Splash on my server. Here is history of commands I ran. docker run -p 8050:8050 scrapinghub/

stackoverflow.com

이렇게 문제를 해결해주고 알파환경과 동일하게 Docker Container, image 파일들을 제거하고 Docker, Superset을 재시작해주었더니...

문제가 말끔히 해결되어 Superset UI에 잘 접근하는 것을 확인 할 수 있었다.

뭔가 docker network 파일들이 꼬여있었던 것 같다.

docker network아래의 파일들을 지워주기 전에 시스템 로그(/var/log/messages)에서 아래와 같은 메세지가 계속해서 떴었다.

IPv6: ADDRCONF(NETDEV_UP): veth8155173: link is not ready
br-72dc763038be: port 4(veth8155173) entered blocking state
br-72dc763038be: port 4(veth8155173) entered forwarding state
br-72dc763038be: port 5(veth8f6205c) entered blocking state
br-72dc763038be: port 5(veth8f6205c) entered disabled state
device veth8f6205c entered promiscuous mode

하지만 Docker network 디렉토리 밑의 file들을 삭제해주고 Docker를 재부팅한 이부에는 시스템 로그에 위의 로그들이 나타나지 않음을 확인하였다. 어떠한 이유에서 위와 같은 문제가 발생했는지에 대한 정확한 원인은 파악하지 못했다.....찾게 되면 포스팅하도록 하겠다.

감사합니다.

반응형
반응형

이전에 어디선가 질문 받은게 갑자기 생각나 String.format을 사용하지 않고 메서드를 구현해보았다.

    @Test
    public void convertStringToNumberStyle(String money) {
        String[] strSplit = money.split("");
        String convertedNumberStyle = "";

        int size = strSplit.length - 1;

        int count = 1;
        for (int i = size; i >= 0; i--) {

            if (count == 1) {
                convertedNumberStyle += strSplit[i];
            } else if (((count % 3) == 0) && (i != 0)) {
                convertedNumberStyle = "," + strSplit[i] + convertedNumberStyle;
            } else {
                convertedNumberStyle = strSplit[i] + convertedNumberStyle;
            }

            count++;
        }

        System.out.println(convertedNumberStyle); // money : 5000000 => output : 5,000,000
    }

하지만 String.format을 쓰면 1줄이면 끝난다는거 ㅎㅎ

String.format("%,d", Integer.parseInt(money))

심심해서 구현해보았는데 보통 라이브러리들에 의존해서 이런 부분을 처리하다 보니 막상 코드로 옮기기가 쉽지 않았다.

방식도 다양하고 여러 방법이 있겠지만 나는 한글자씩 쪼개어서 string을 다시 합쳐가며 3자리 지점마다 ","를 붙여주는 방식을 택했다.

가끔 자바 관련 면접에도 나올 수 있기에 다양한 방법으로 직접 구현해 보면 좋을 것 같다.

반응형
반응형

간혹 intellij에서 서비스 실행시  java.net.BindException: Address already in use 가 뜨곤 한다.

서비스를 실행시키려는 PORT가 이미 사용중이라서 그렇다.

다음과 같이 명령어를 주어서 프로세스 ID를 알아내 Kill 하자.

$ lsof -i :포트번호

PID의 번호 31056을 KILL 시켜주면 된다.

$ kill -9 31056

 

반응형
반응형

보통 git + sourcetree로 작업을 할 때 기능별 featrue를 생성해 작업한다.

해당 작업이 완료되면 '깃 플로우'기능을 사용해 기능마무리 및 자동 develop브랜치에 머지하면서 삭제하는데 해당 작업을 할 때 다음과 같은 에러가 발생하였다.

Fatal: could not read username for 'https //github.com' device not configured

sourcetree Fatal: Could not fetch feature/#8 from origin.

해결책

소스트리에서 아래의 터미널을 클릭

터미널에서 다음 순서대로 입력한다

입력 > git config credential.helper 

osxkeychain

입력 > git config credential.helper sourcetree

입력 > git config credential.helper

sourcetree

그러면 마지막으로 'sourcetree'를 볼 수 있다. 

그리고 다시 터미널 종료하고 깃플로우의 기능 마무리 작업을 하면 정상적으로 처리 되는 것을 볼 수 있다~!

감사합니다~

 

반응형
반응형

nginx의 access log가 두 번이나 씌여지는 현상을 발견하여 포스팅 해본다.

location = '/getid'
{
     if ($scheme !~* "https") {
            return 308 https://$host$request_uri;
     } 
    access_log /home1/irteam/dmp_log_collector/nginx/logs/dmp_applog.${hostname} appmlog;
}

위와 같이 request의 scheme이 'http'가 아닌 경우 'https'로 리다이렉트 하도록 되어져 있다.

따라서 http로 요청을 하였을 때는 당연히 acces_log를 안찍을 거라고 생각을 했는데....아니였다.....

nginx는 기본적으로 요청이 들어왔을 때 현재의 스코프내에서 정의되어져 있는 access_log가 있다면 해당 경로에 access log를 남기고 그렇지 않다면 그 상위 스코프에 있는 access_log에 접근해 access log를 남긴다는 것이다. 자바스크립트의 hoisting(호이스팅)과 비슷한 느낌이다.

따라서 'http'요청일 경우 access log를 남기고 싶지 않다면 if 블럭에 'access_log off'를 주어 access log를 남기지 않도록 한다.

location = '/getid' 

     if ($scheme !~* "https") { 
            access_log off;
            return 308 https://$host$request_uri; 
     }
     access_log /home1/irteam/dmp_log_collector/nginx/logs/dmp_applog.${hostname} appmlog;
}

 

자세한 내용은 nginx의 documentation을 참고하자.

Similar to the  error_log directive, the access_log directive defined on a particular configuration level overrides the settings from the previous levels. When processing of a request is completed, the message is written to the log that is configured on the current level, or inherited from the previous levels. If one level defines multiple access logs, the message is written to all of them.

https://docs.nginx.com/nginx/admin-guide/monitoring/logging/

 

NGINX Docs | Configuring Logging

Capture detailed information about errors and request processing in log files, either locally or via syslog.

docs.nginx.com

 

반응형
반응형

해당 내용은 '소프트웨어 장인'이라는 책의 Chapter11장의 '잘못된 면접 방식'이라는 주제에서 와닿는 내용 몇 개만 발췌한 내용이다. 많은 분들이 공감할 거라 생각한다. 물론 아닌 분들이 계실수도 있겠지만 그 회사의 그 업무에 맞는 면접질문을 하는게 가장 좋다고 생각한다. 읽어보면서 공감가는 부분과 공감가지 않는 것에는 어떤 것이 있는지 생각해보며 읽으면 좋을 듯하다. 해당 내용들은 내게 공감이 많이 되었던 내용들만 추려 포스팅한 것이다.

1. 똑똑한 척하는 면접관을 세운다.

면접관이 지원자보다 똑똑하거나 더 우월해봉고 싶어해서는 안 된다. 면접관의 사사로운 즐거움을 위해 지원자를 힘든 상황으로 몰아붙이고, 자신의 직함, 권한, 지식같은 것들로 지원자를 압도하고 싶어 해서는 안된다. 어느 정도 경험이 있고 실력있는 개발자라면 면접관의 성향을 즉시 알아채고 같이 일하기 싫다는 생각을 할 것이다. 지원자 앞에서 겸손하고 정직해야 한다. 지원자를 프로페셔널 개발자로서 대하고, 채용을 위한 평가나 취조가 아니라 당신이 존주우하는 누군가와의 유익한 기술 토론이 되도록 면접을 이끌어야 한다. 무엇보다도, 지원자의 이야기를 경청하고 그에게 마음을 여는 것이 중요하다. 

2. 답을 모르는 질문을 한다.

면접관으로서 어떤 질문에 어떤 답변이 나와야 하는지 잘 모르겠다면 채용중인 직무와 관련해서는 그다지 중요한 질문이 아닐 가능성이 높다. 해당 직무에 대해서 잘 알고 있다면 무엇이 중요하고 무엇이 중요하지 않은지 이미 알고 있을 것이다. 엉뚱한 질문으로 지원자를 혼란스럽게 하거나 잘못 이끌지 말자. 팀 동료에게 흔히 하지 않는 질문이라면, 팀 동료가 짜증을 낼 질문이라면, 지원자에게도 삼가해야 한다.

3. 종이에 코드를 작성하게 한다.

지원자에게 종이나 화이트보드에 코드를 작성토록 하는 것은 참으로 바보 같은 면접 방법이다. 면접관 스스로도 할 수 없는 일이나 실제 업무 현장에서 부딪히지 않을 상황을 지원자에게 요구해서는 안된다. 실제 업무에서도 종이에 테스트 코드 작성, 코드 리펙토링을 하는가? 고등학교 교사가 학생들에게 알고리즘의 의사 코드를 작성하라고 하는 것과 프로페셔널 소프트웨어 개발자를 채용하는 것은 다르다. 자신의 도구와 기술을 마스터하고 테스트와 리펙토링을 통해 잘 작성된 코드를 만들 수 있는 개발자를 찾아야한다.

4. 알고리즘 문제를 낸다.

알고리즘 무누제를 코딩 면접 과제로 선택하는 면접관들이 많다. 시스템 개발에 필요한 상당수의 업무들이 알고리즘에 대한 깊은 이해를 필요로 하지 않는다. 그럼에도 불구하고 "지원자의 문제 해결 능력을 보아야 한다"라고들 이야기한다. 물론 틀린 이야기는 아니지만 알고리즘 문제 대신 회사의 실제 프로젝트와 가까운 연습문제를 통해서도 '문제 해결 능력'을 평가할 수 있다. 여러 시스템의 문제들 중 거의 대부분이 알고리즘이 어떻게 작성되었느냐와는 관계가 없었다. 테스트가 덜 되었거나 또는 좋은 테스트 방법이 준비되지 못했거나, 잘못된 설계, 떨어지는 응집성, 깊은 종속성, 새 기능 추가 시 부족했던 리팩토링, 지속적인 요구사항 변경, 도메인 모델이 꼼꼼하지 못했거나 등이 가장 흔한 문제였다. 이러한 것들이 '실전 문제'였다. 알고리즘은 절차적이고 함수적인 형태로 구현된다. 알고리즘을 만들 때 비지니스 도메인 모델이나 클래스를 만들지는 않는다.

시스템의 주요 문제가 알고리즘이 아니라면 코딩 면접 때 알고리즘 문제 대신 실제 문제와 가까운 과제를 제시해야 한다. 지원자가 비즈니스 도메인을 표현하고 솔루션을 설계할 역량이 있는지 집중해야 한다. 테스트 주도 개발이나 설계에 스킬이 뛰어난 개발자를 찾고 있다면 그 부분을 반영할 수 있는 코딩 문제를 제시해야 한다. 애플리케이션이 온통 알고리즘에 대한 것이라면 당연히 알고리즘 개발 역량을 평가해야 한다. 요지는 코딩 면접에 알고리즘 문제를 내야 하느냐의 여부가 아니라 프로젝트를 위해 실제 필요한 역량이 무엇인지, 무엇이 가장 가치 있는지를 면접용 코딩 문제에 잘 반영하고 있어야 한다는 것이다.

반응형

+ Recent posts