반응형

테스트 환경: Ubuntu 14.04, bash shell 사용



Bash 스크립트 파일에서 점점 awk를 써야 될 일이 많아지고, 그 awk 스크립트가 점점 더 복잡해지면서 한 줄에 주욱 이어서 썼더니 점점 가독성이 떨어지고 디버그하기 어렵게 되었다.


결론부터 말하자면, 그냥 가장 바깥에 있는 두 개의 single quote 문자 사이에는 마음대로 띄워써도 된다. ㅡㅡ;

개행 문자(newline), 탭 문자 마음대로 써도 상관이 없다.



그런데 내가 뭘 잘못했는지 command not found 에러가 났다.

뭐가 문제였을까?


확인해 보니,

awk [각종_옵션들] 

'                <---- awk 명령과 single quote 문자를 개행문자로 분리(...)

{

...

}

'


이런 식으로 썼던 거였다. 그러니까,


awk [각종_옵션들] '

{

...

}

'


코드의 시작을 나타내는 single quote 문자를 awk 명령줄과 같은 위치에 써야 하는데 그걸 엔터 쳐서 분리했더니, bash shell이 두 개의 서로 다른 명령으로 이해했던 것이었다. ㅜㅜ


아니면,

awk [각종_옵션들] \

'

{

...

}

'


이렇게 역슬래시로 다음 줄까지 명령 하나로 인식하도록 처리했어야 했다.


POSIX 명령의 기본 규칙을 잊지 말자. ㅠㅠ



반응형
블로그 이미지

Bryan_

,
반응형

두 개의 텍스트 파일에 각각 아래와 같이 데이터가 있는 경우,


 number.txt

alphabet.txt 

1

2

3

4

5

6

A

B

C

D

E

F


두 파일을 열(column)을 추가하는 형태로 이어붙여야 할 때가 있다. 즉,


1    A

2    B

3    C

4    D

5    E

6    F


이런 형태의 파일을 만들고 싶을 때, paste 명령을 쓰면 된다.


$ paste number.txt alphabet.txt


열 간의 기본 구분자는 탭 문자 '\t'로 되어 있다.

만약 두 열 간에 구분자를 다르게 주고 싶으면 -d 옵션으로 명시한다.


// 공백으로 구분할 때

$ paste -d ' ' number.txt alphabet.txt


// 쉼표로 구분할 때 (csv 파일 포맷)

$ paste -d , number.txt alphabet.txt


참고로 paste 명령 왼쪽에 있는 파일의 라인 수가 오른쪽 파일보다 짧더라도 구분자 문자를 먼저 추가한 다음 내용이 붙기 때문에 구분자를 기준으로 하면 각 column이 독립적으로 데이터를 유지할 수 있다.


 number.txt

alphabet.txt 

1

2

3

4

5

6

A

B

C

D

E

F

G
H
I
J
K


예를 들어 위의 두 파일을 paste로 이어붙이면,


1    A

2    B

3    C

4    D

5    E

6    F

G

H

I

J

K


이렇게 숫자 밑에 알파벳이 오지 않도록 column을 유지하며 붙는다.



반응형
블로그 이미지

Bryan_

,
반응형

Java에서 사용자가 정의한 클래스를 java.util.HashMap에서 key 값으로 사용하도록 만들 때, Overriding 메쏘드 중에서 hashCode 메쏘드를 제대로 구현해야 문제없이 작동한다. 사용자 정의 클래스의 몇몇 멤버변수 값들이 다른데도 불구하고 hashCode를 제대로 구현하지 않으면 차이가 없는 것으로 판단할 수도 있기 때문이다.


C++에서는 map<const Key, T>이 비슷한 역할을 하는데, Java처럼 hashCode 함수 대신 operator < 함수를 써서 키값을 비교하는 것으로 생각된다. 

처음에는 operator = 함수만 신경써서 만들고, 실수로 operator < 함수의 내부 구현을 대충 했더니, map의 key로 서로 다른 멤버변수 값을 갖는 클래스를 대입했는데 모두 같은 value를 리턴하는 것이었다.


내 경우에는 네트워크 상의 트래픽을 표현하기 위해 Flow라는 클래스를 아래와 같이 정의했다.


class Flow {

public:

std::string srcIp;

int srcPort;

std::string dstIp;

int dstPort;

int type;

Flow();

~Flow();

};


그리고 실수로 "operator <" 함수를 아래와 같이 간단하게 만들었더니,


bool Flow::operator <(const Flow& ref) const {

return (this->srcPort + this->dstPort) < (ref.getSrcPort() + ref.getDstPort()));

}


source 또는 destination IP 주소가 서로 다른 여러 개의 flow가 모두 같은 key 값을 갖게 되는 문제가 발생했다.


그래서 std::string 형식의 IP 주소에서 숫자를 빼내서 이것들도 모두 더하는 방식으로 operator <를 구현해서 key 값이 서로 달라지도록 만들었다.


bool Flow::operator <(const Flow& ref) const {

return ((convert(this->srcIp) + this->srcPort + convert(this->dstIp) + this->dstPort) < (convert(ref.getSrcIp()) + ref.getSrcPort() + convert(ref.getDstIp()) + ref.getDstPort()));

}


이런 부분에서의 실수는 컴파일 에러에서 전혀 잡히지 않고, 가끔은 Segmentation fault 같은 에러조차 발생시키지 않고서 정상적이면서 의미상으로만 이상하게 작동하기 때문에 앞으로는 더 주의해야 할 것이다.



반응형
블로그 이미지

Bryan_

,
반응형


C/C++, Java로 코딩을 하다가 가끔 접하는 상황이 있는데, 같은 목적을 if-return의 조합과 if-else의 조합 모두로 코딩할 수 있을 때 어느 것을 선택해야 하는지에 대한 것이다.


int runSomeFunction(int a, int b){

if(condition_A){

return A;

} else {

do_something_1();

do_something_2();

}

}


--------------------------------------------------------


int runSomeFunction(int a, int b){

if(condition_A){

return A;

}


do_something_1();

do_something_2();

}


조건이 1개만 있을 때는 둘 사이에 별로 차이가 나지 않는 것 같다. 하지만 첫번째 조건 이후에 또다른 조건을 검사해야 하는 2개 이상의 nested condition이 생기면 조금 다르게 보이기 시작한다.



int runSomeFunction(int a, int b){

if(condition_A){

return A;

} else {

if(condition_B){

   return B;

} else {

   do_something_1();

   do_something_2();

}

}

}


--------------------------------------------------------


int runSomeFunction(int a, int b){

if(condition_A){

return A;

}


if(condition_B){

return B;

}


do_something_1();

do_something_2();

}


아무래도 indent가 nested condition의 수만큼 더 깊어지는(?) 문제가 생긴다. 사실 둘 사이에 성능상의 차이는 거의 없다고 보이고, 결국 코딩 스타일이나 가독성의 문제로 귀결되는 것 같다.


개인적으로는 if-return으로 처리하는 것을 선호하지만, 꼭 모든 경우에 다 if-return이 가독성이 좋다고 보기도 애매할 때가 있다. 가령, nested condition 정도가 심하지는 않으면서 각 조건마다 실행해야 하는 코드의 양이 비슷하면,



int runSomeFunction(int a, int b){

if(condition_A){

do_something_1();

do_something_2();

do_something_3();

do_something_4();

} else {

do_something_5();

do_something_6();

do_something_7();

do_something_8();

}

}


--------------------------------------------------------


int runSomeFunction(int a, int b){

if(condition_A){

do_something_1();

do_something_2();

do_something_3();

do_something_4();

return;

}


do_something_5();

do_something_6();

do_something_7();

do_something_8();

}


이런 경우에는 if-else가 서로 다른 조건에 대한 코드들의 차이를 알아보기에 더 좋은 것처럼 보인다.


if-return이 가장 효과적일 때를 생각해 본다면, 초반에 input parameter라던지 변수의 null 여부 같은 것을 확인해서 함수/메쏘드 나머지 부분의 실행 여부를 판단해야 할 때가 아닐까?


int runSomeFunction(int a, int b){

if(var_A == NULL) return;

if(var_B < 0) return;


do_something_1();

do_something_2();

do_something_3();

do_something_4();

}



결론적으로, if-else와 if-return 사이에 성능의 차이는 별로 없기 때문에 본인의 코딩 스타일과 가독성을 생각해 가면서 그때그때 상황에 맞게 정하는 수밖에 없겠다. Indentation을 많이 하는 것을 선호하지 않는다면 if-return 조합으로 코딩하는 비중이 좀더 늘어나는 정도로 생각하면 될 것 같고, 그게 꼭 정답이라기보다는 개인마다 가독성에 대한 기준도 다르니까, 맞춰서 쓰면 될 것이다.



<참고자료>

[1] http://stackoverflow.com/questions/9267643/if-return-vs-if-else-efficiency


반응형
블로그 이미지

Bryan_

,
반응형

오늘 어쩌다 뉴스기사를 보게 되었는데,


[이코노미조선] 커피 달고 사는 직장인들…파킨슨병에 치매까지 발전 가능해 [1]


그런데 황당한 것은, 구글에 "커피 파킨슨병"으로 검색하면,



이런 내용들이 일관되게 첫 페이지에 검색 결과로 나온다. 게다가 위의 3개 기사는 모두 의학저널에 게재된 논문의 결과를 인용하고 있으며, 각 기사마다 인용하는 논문과 그 연구를 진행한 연구팀이 다 다르다.


[2] 미국 하와이 호놀룰루 재향군인 메디컬 센터, 미국의학협회지(JAMA), Neurology 분야 저널 랭킹 9위

[3] 캐나다 맥길 대학 의과대, 신경학(Neurology) 저널, Neurology 분야 저널 랭킹 10위

[4] 미국 마이애미 대학교 의과대학, Archives of Neurology, Neurology 분야 top 50위 안에는 없음.


더 확실하게 보기 위해서 좀더 상위 랭킹에 있는 저널에도 카페인(또는 커피)가 파킨슨병에 미치는 영향을 분석한 연구가 있는지 봤더니, 있었다.


[5] Alberto Ascherio MD et al., "Prospective study of caffeine consumption and risk of Parkinson's disease in men and women", Annals of Neurology, doi:10.1002/ana.1052, 2 May 2001.


Neurology 분야 top 랭킹 4위 저널에서도 위와 같이 연구결과가 있었고, 카페인을 전혀 섭취하지 않는 성인남성에 비해 카페인 섭취량이 많은 성인남성이 파킨슨병 발병 위험이 42%로 나왔다.



반면에 저 이코노미조선 기사 [1]에서는 연구 결과에 대한 인용이 전혀 없고, 다만 커피를 많이 마실 때 발생할 수 있는 손떨림 같은 증상과 파킨슨병에서도 일어나는 유사 증상을 근거 없이 연관지어서 설명하고 있을 뿐이다.


커피를 과다하게 마셔서 수전증이 일어나는 것은 사실이고,

파킨슨병의 초기 증상으로 손떨림이 일어나는 것도 사실이다.

그러나 커피를 과다하게 마시기 때문에 파킨슨병 발병으로 이어진다는 근거는 어디에도 없다.



결론적으로 "CEO 뇌 건강"이라는 중요하고 무게감 있어 보이는 특집을 달고 나오는 기사가 공신력 있어 보이는 신경학 분야 국제저널 top 4위, 9위, 10위의 연구 결과들을 모두 공격하는 위엄(?)을 보여주고 있다.


물론 의학 쪽으로는 연구가 워낙 case-by-case이기도 하고, 각 연구 결과마다 통제변인이 다양할 뿐더러, 통제변인 중 일부를 조금만 바꿔도 상관관계가 없어지거나 반대로 나타나는 등 온갖 복잡한 상황이 다 일어나는 것은 충분히 인정할 수 있다. 하지만 그 case-by-case 때문에 커피가 파킨슨병에 나쁘다는 이야기를 하고 싶으면 최소한의 근거로 공신력 있는 연구 결과를 인용했어야 한다.


적어도 지금까지의 결과들을 놓고 봐서는, "카페인이 파킨슨병의 발병을 방지하거나, 치료효과를 주기도 한다"는 명제가 더 우세한 상태다. 이것을 뒤집고 싶으면 마찬가지로 신경학 분야의 최상위 랭킹 저널에 누구든지 납득할 만한 실험 환경과 수치화된 데이터를 근거로 조심스럽게 설득을 시작해야 하는 것이지, 조선비즈의 기사처럼 오히려 비논리적으로 주장해서는 안 된다.




<참고자료>


[1] [이코노미조선] 커피 달고 사는 직장인들…파킨슨병에 치매까지 발전 가능해

http://biz.chosun.com/site/data/html_dir/2017/03/27/2017032703095.html?main_hot2

[2] 커피 파킨슨병 예방 효과, http://www.foodnews.co.kr/news/articleView.html?idxno=3377

[3] 하루 커피 2잔이면 파킨슨병 치료도 가능해 

http://news.khan.co.kr/kh_news/khan_art_view.html?artid=201208022152401&code=930401 

[4] 담배와 커피가 파킨슨병 발병위험 낮춘다

http://www.sciencetimes.co.kr/?news=%EB%8B%B4%EB%B0%B0%EC%99%80-%EC%BB%A4%ED%94%BC%EA%B0%80-%ED%8C%8C%ED%82%A8%EC%8A%A8%EB%B3%91-%EB%B0%9C%EB%B3%91%EC%9C%84%ED%97%98-%EB%82%AE%EC%B6%98%EB%8B%A4

[5] Alberto Ascherio MD et al., "Prospective study of caffeine consumption and risk of Parkinson's disease in men and women", Annals of Neurology, doi:10.1002/ana.1052, 2 May 2001.

http://onlinelibrary.wiley.com/doi/10.1002/ana.1052/full



반응형
블로그 이미지

Bryan_

,