반응형

OS: Ubuntu 16.04

Shell: bash



배쉬(bash) 쉘에서 반복문, 즉 루프(loop)를 돌릴 때 여러가지 방법을 사용할 수 있다.



1. seq 사용


가장 간단한 방법이다. seq라는 프로세스가 순서대로 숫자를 출력해 주는 역할을 하는데, 그 결과를 문자열로 받아서 루프로 사용한다.


skylit@Linux:~$ seq 1 10
1
2
3
4
5
6
7
8
9
10


배쉬 쉘에서 seq를 바로 실행하면 위와 같이 나오고, 이것을 문자열로 사용해서 루프를 돌린다.


#!/bin/bash


SET=$(seq 0 9)

for i in $SET

do

    echo "Running loop seq "$i

    # some instructions

done


실행 결과:

Running loop seq 0
Running loop seq 1
Running loop seq 2
Running loop seq 3
Running loop seq 4
Running loop seq 5
Running loop seq 6
Running loop seq 7
Running loop seq 8
Running loop seq 9




2. 공백으로 구분된 문자열 사용


위의 seq를 그냥 수동으로 입력하는 방법이다. seq 쓰는 것과 아무 차이가 없고, 대신 사용자가 원하는 순서대로 숫자의 나열을 바꾸거나 뺄 수 있다.

루프 돌리는 수가 적고, 특정한 번호 순서를 직접 명시하고 싶을 때 유용하다.

#!/bin/bash


ORDER="5 6 7 8 9 4 3 2 1 0"

for i in $ORDER

do

    echo "Running loop "$i

    # some instructions

done


실행 결과:

Running loop 5
Running loop 6
Running loop 7
Running loop 8
Running loop 9
Running loop 4
Running loop 3
Running loop 2
Running loop 1
Running loop 0


물론 숫자 말고 다른 문자열도 가능하다.


#!/bin/bash


ORDER="apple orange watermelon"

for i in $ORDER

do

    echo $i

    # some instructions

done


실행 결과:

apple
orange
watermelon




3. bash의 루프 문법 사용


C/C++과 가장 유사한 형태라서 편하게 쓸 수 있다.

그리고 앞서 소개한 두 방법은 메모리에 문자열 변수를 할당하고 있어야 하는데 루프의 수가 매우 커지면 문자열의 길이도 그만큼 길어지기 때문에, 혹시나 너무 큰 루프 숫자로 인해 발생하는 메모리 문제를 방지하고 싶다면 이 방법이 유리하다.


#!/bin/bash


for ((i=0;i<=9;i++))

do

    echo "Running loop "$i

    # some instructions

done


실행 결과:

Running loop 0
Running loop 1
Running loop 2
Running loop 3
Running loop 4
Running loop 5
Running loop 6
Running loop 7
Running loop 8
Running loop 9







반응형
블로그 이미지

Bryan_

,
반응형
  • Client OS: Ubuntu 16.04
  • FreeRDP (xfreerdp) version: 2.0.0-dev2 (3c4385e)
  • Server OS: Windows 10 (version 1709, build 16299.309)



xfreerdp를 이용해서 리눅스에서 원격 윈도우 머신에 RDP (Remote Desktop Protocol) 연결을 해서 쓰고 있었는데, 2018년 들어서 윈도우10이 업데이트되고 나서는 아래와 같이 오류가 나면서 접속이 되지 않았다.



[19:43:47:999] [2320:2321] [INFO][com.freerdp.client.common.cmdline] - loading channelEx cliprdr
[19:43:47:033] [2320:2321] [ERROR][com.freerdp.core] - freerdp_set_last_error ERRCONNECT_PASSWORD_CERTAINLY_EXPIRED [0x0002000F]
[19:43:47:033] [2320:2321] [ERROR][com.freerdp.core.transport] - BIO_read returned an error: error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error


확인해 보니, 윈도우 10에서 네트워크 수준 인증(Network Leval Authentication; NLA)을 사용하여 원격 접속을 허용하는 옵션과 연관된 듯 했다. 비슷한 문제를 겪는 사람들의 의견을 봤을 때, NLA 옵션을 끄니까 다시 되더라는 사람도 있었고, xfreerdp를 실행할 때 보안 옵션(/sec)으로 nla를 지정해 주었더니 되더라는 사람도 있었다.




*네트워크 수준 인증 (NLA) 끄는 방법:

  1. 시작버튼 누르고 "제어판"이라고 입력해서 제어판(윈도우10 설정 말고) 실행
  2. 시스템 선택
  3. 좌측에 "원격 설정" 선택
  4. 하단 부분에 "이 컴퓨터에 대한 원격 연결 허용" 아래에 있는 체크박스 해제 (네트워크 수준 인증을 사용하여 원격 데스크톱을 실행하는 컴퓨터에서만 연결 허용 (권장))



*xfreerdp에서 보안 옵션 지정하는 방법:

커맨드 라인에서 실행할 때 /sec 옵션을 추가해 준다.

  • 네트워크 수준 인증을 사용할 경우, /sec:nla
  • 그렇지 않을 경우, /sec:tls



나는 NLA 옵션을 끄고, xfreerdp를 실행할 때 /sec:tls 옵션을 추가했더니 문제 없이 접속이 잘 되었다.




<참고자료>

https://github.com/FreeRDP/FreeRDP/issues/4449#issuecomment-372979253



반응형
블로그 이미지

Bryan_

,
반응형

내 블로그에도 구글 애드센스(AdSense)를 달아 놓았고, 인터넷을 다니면서 구글 광고는 흔하게 많이 접한다. 몇 년 전부터 지금까지 구글 광고를 보면서 느끼는 명백한 한계점이 하나 있는데, 바로 "내가 이미 구입을 완료한 제품에 대한 광고를 지속적으로 나에게 노출시키 것"이다.


직접 확인한 두 가지 사례가 있다.

첫 번째로, 해외에 잠시 다녀오기 위해서 호텔 검색 사이트(호X스닷컴)에서 특정 지역의 호텔들을 검색해서 몇 개를 살펴보았고, 그렇게 며칠 동안 검색한 뒤에 하나를 정해서 예약과 결제를 모두 완료했다. 그런데 그 뒤로 일주일이 지나도록 내가 인터넷을 돌아다닐 때마다 거의 대부분의 구글 광고에서, 내가 이미 예약한 바로 그 호텔에 대한 광고를 보여주는 것이었다. 우스운 것은, 내가 며칠 전에 결제했을 때의 가격보다도 더 비싼 가격을 "특가"라고 광고하는 것이었다. ㅎㅎ


두 번째는, 얼마 전에 스마트폰 케이스를 사기 위해서 또 구글 검색을 여러 번 했고, 그 중에 매우 얇은 케이스 하나를 잘 구입했는데, 구입한 지 벌써 몇 주가 지났는데 오늘 갑자기 구글 광고에서 내가 구입한 것과 정확히 똑같은 제품을 광고의 한 가운데에 배치해서 보여주었다. 내가 그 케이스를 구입한 쇼핑몰에서 내보낸 광고였는데, 다른 모양의 케이스들이나 강화유리를 보여줬을 만도 한데 정확히 내가 구입한 그 물건만 일부러 강조해서 광고에서 표시되고 있었다.


결국 구글은 내가 검색하고 가장 많이 쳐다보고 있었던 페이지가 무엇인지는 알고 있지만, (쇼핑몰 사이트에 내장된 구글 애널리틱스와 내 구글 계정의 검색 기록을 종합하면 아마 쉽게 알 수 있을 것이다) 내가 이미 구입해서 더 이상 흥미가 없는 제품이라는 판단은 아직 못 하는 듯 하다.


솔직히 구매 내역도 내 계정의 지메일을 조사하면 알 수 있을 텐데, 내 지메일도 속속들이 다 들여다 보고 있으면서 (호텔이나 항공권을 결제하면 내가 시키지도 않았는데 자동으로 구글 캘린더에 모두 등록되는 것만 봐도 알 수 있다), 구글 광고에 보여 줄 제품을 표시할 때에 지메일을 적극적으로 확인하지 않는 것은 좀 의외다.

아직 특정 쇼핑몰에서 보내 주는 주문/구매 내역에 대한 이메일 내용을 "자신 있게(충분한 confidence level을 유지한 채)" 분석해 내지는 못하는 것인가 하는 생각이 든다. 쇼핑몰이나 각종 결제 사이트마다 워낙 레이아웃과 텍스트 내용이 제각각이라서 아마 정확도를 높이기가 아직은 쉽지는 않을 지도 모르겠다.


하지만 사실 구글 어시스턴트와 같이 음성인식 비서가 발전하는 속도로 봤을 때, 이메일에 적혀 있는 자연어와 표 형식으로 잘 구분된 데이터 (대부분의 주문 내역은 표를 이용해서 제품 이름과 구매수량, 단가, 결제금액, 시간 등을 정렬해서 보여주고 있으니까)를 머신러닝을 써서 분석해 내는 것은 마음만 먹으면 금새 해낼 수 있을 것 같다.

결국 구글이 애드센스의 광고 추천 정확도를 지금보다 조금 더 개선시키기 위해서 사용자의 지메일 상의 각종 구매 내역과 전세계 쇼핑몰 사이트에서의 구글 애널리틱스에 기록된 방문 기록을 종합해서 빅데이터 분석을 수행할 의지가 있느냐 없느냐의 문제로 귀결된다.


...물론 이렇게 소소하게 구글이 인터넷에서 나에게 추천하는 모든 것에 대한 정확도를 높여 갈 수록 사람들은 오히려 구글을 더 무서워하게 될 지도 모른다. (이미 돌이킬 수 없게 무서운 존재인 것은 사실이지만...) 구글은 너무 무서워지지 않기 위해서 일부러 안하고 있는 것일까?




반응형
블로그 이미지

Bryan_

,
반응형

연구에 대한 실험 코드를 고쳐 가며 새로 데이터를 뽑고, 또 문제가 있거나 개선할 부분이 보이면 다시 고치기를 반복하고 있다. 이 과정에서 내가 개인적으로 유난히 시간을 많이 소비하는 단계가 있음을 알게 되었는데, 바로 어떤 설계(design)으로 개선해서 목적을 달성할 것인지 결정하는 단계이다.


예를 들어, 라우팅 프로토콜을 고치는 과정에서, source node가 자신이 트래픽을 보내기 위해서 먼저 경로를 탐색(route discovery)하고 선택해야 하는데, 이러한 과정을 자주 하게 되면 그만큼 네트워크 전체에 부정적인 영향을 끼치게 된다. 이러한 route discovery 자체를 줄이기 위해서 먼저 실제로 route discovery를 몇 번씩 했는지 파악을 할 필요가 생겼다. 이것을 어떻게 기록할 것인지 생각을 해 보았는데,

  1. 그냥 각 source node의 ID로 된 텍스트 파일을 만들고, 매 초마다 route discovery를 몇 번 했는지 숫자를 텍스트 파일에 시간 순서대로 한 줄씩 기록하는 방법
  2. Route discovery 전체를 기록하는 텍스트 파일 한 개를 만들고, 모든 source node가 같은 파일 포인터에 접근해서 시간, 노드ID, route discovery를 수행했다는 flag를 한 줄로 기록하는 방법

위의 두 가지 외에도 다양한 방법들로 기록할 수 있어 보였다.


그런데 나중에 통계를 내고 엑셀 파일 같은 곳에 가져다 쓸 것까지 생각을 해 봤을 때 어느 방법이 가장 좋은지 쉽게 판단이 잘 안 되는 것이었다. 이게 깔끔하게 마음 편한 방법으로 잘 정리가 되지 않자, 이것 때문에 하루 종일 다른 작업을 못하고 그냥 고민만 하고 딴짓만 하다가 시간을 보내고 말았다.


사실은 내가 연구 측면에서 정의한 문제를 해결하는 방법이 아니고, 라우팅프로토콜의 성능을 측정하는 데 필요한 작은 통계 생성 방법일 뿐이고 어떤 설계를 따르던지 어차피 시뮬레이션 성능에 큰 영향을 주지는 않기 때문에 무시하고 한 가지를 얼른 정해서 진행을 해도 되는 것이었는데, 어느 한 가지를 고르는 것이 속 시원하지 못하다는 이유로 연구 전체를 진행하지 못하고 마치 트랩에 걸리듯이 꼼짝하지 못했다.


결국 지금 밤이 되어서 그냥 첫 번째 방법으로 진행해서 얼른 경로 탐색에 대한 기록부터 만들어내고, 그렇게 각 source node별로 만들어진 기록을 합산하는 스크립트를 파이썬으로 빨리 만들어서 붙이기로 했다. 사실 이미 각 노드마다 flow 트래픽 사용량에 대한 통계를 똑같은 방식으로 만들어 내고 똑같이 파이썬 코드로 후처리(post-processing)를 하고 있었기 때문에 기존의 코드를 재활용해서 가장 적은 시간을 들여서 통계를 만들어낼 수 있는 것이기도 했다. (지저분하게 파일 개수가 많아지는 것, ns-3 코드 상에서 파일 포인터가 많아지는 것 외에는 그 어떤 문제도 없기도 하고...)


나는 지나치게 조심스러운 것이 단점이므로, 그냥 가급적이면 조금 더 빨리 결정한 다음, 뒤도 돌아보지 말고 밀어붙인 뒤에 나중에 문제가 터지면 그것을 그 시점에서 재빨리 고쳐 나가서 목적부터 달성하기 위해 노력해야겠다.



그러므로 내일 일을 걱정하지 말아라. 내일 일은 내일 걱정할 것이오. 한 날의 괴로움은 그 날의 것으로 충분하다 (마태복음 6:34)





반응형
블로그 이미지

Bryan_

,
반응형

내가 연구하는 무선 네트워크, 메쉬 네트워크, 오버레이 네트워크, Quality-of-Service (QoS), 라우팅(Routing), 엣지 컴퓨팅(Edge Computing) 등의 분야에서 내로라 하는 대단한 연구자들이 좋은 학회와 저널에 내는 논문들을 보면, 마치 명작 고전 문학 작품을 읽는 듯한 기분이 들 때가 있다.

물론 그 대단한 연구자들(일반적으로 대부분이 교수들)의 이름이 들어간 모든 논문이 다 명작 같은 기분이 드는 것은 아니지만, 그들이 엄청나게 다작(多作)을 하는 중에 특별히 신경을 많이 쓴 몇몇 논문들은 누가 봐도 내용이 짜임새 있게 구성되어 있고, 이해하기 좋은 문장으로 쓰여져 있으면서도 내용에 깊이가 있다.


논문들 중에 간혹 맨 뒤에 저자의 약력(bio)이 한두 문단씩 첨부되어 있는 경우가 있다. 평소에 굳이 저자들의 약력을 일부러 읽지는 않지만, 오늘은 잘 쓰여진 좋은 저널의 저자들(그래봤자 두 명이다)의 약력을 그냥 훑어보았다.


첫번째 저자는 박사과정 학생인데 중국에서 석사과정까지 마치고 미국으로 유학을 간 상태였다 (출판 연도로 봤을 때 지금은 이미 박사가 되었을 것이다). 두번째 저자는 지도교수인데, 인도계 미국인으로 학부, 석사, 박사를 모두 미국에서 했고, 그 뒤에 미국의 여러 주립 대학교에서 방문 연구원(아마도 포닥 PostDoc.)으로 있었다. 포닥뿐만 아니라 1990년대~2000년대 초반 사이에 인텔, 파나소닉, HP, EMC 등의 회사에서도 일했었다. (지금은 구글, 아마존, 페이스북 같은 회사의 위상이 워낙 강하지만, 1990년대~2000년대만 해도 인텔, HP 같은 회사들이 컴퓨터 공학 분야에서 갖는 위상이 상당했다. 지금도 연구 쪽에서는 아직 활발하기도 하고...) 아마 그 뒤에 교수가 된 듯 한데, 교수가 되고 나서는 top level 저널 여러 개의 에디터와 S급 국제학회의 세션 장과 리뷰어 등을 맡고 있다.


사실 다른 대부분의 잘 쓰여진 논문들도 논문 끝에 적혀 있는 저자 약력을 보면, 대부분이 위와 비슷하다.

내가 지금 내 연구를 느릿느릿 하는 입장에서 볼 때, 좋은 논문을 써 내는 미국대학의 교수들은 어떻게 저렇게 한결같이 열심히 자기 일을 해낼 수 있는지 신기하고 부럽다. 단 1년도 허투루 보내지 않고 열심히 살아야만, 아니 그렇게 살아도 달성할 수 있을지 모르겠는 엄청난 분량의 성과를, 그것도 질적으로도 우수한 성과를 척척 달성해 내는 원동력은 어디서 오는 걸까? 마치 처음부터 연구와 관련된 능력을 타고난 인간들인가 하는 생각마저 들게 한다.


잘 갖춰진 교육의 힘으로 전인적으로 올바르게 성장한 사람들 중에서 어느 정도 지능이 더해짐으로써 위와 같은 능력자가 만들어졌을 것이라고 추측할 수 있다. 어릴 때부터 부각되는 영재성을 비롯해서 선천적인 요소도 분명히 어느 정도 있겠지만, 그러한 원석을 잘 키워내는 후천적인 노력으로 우수한 연구자로 다듬어지고 만들어졌을 것이다.


내가 가장 궁금한 것은, "어떻게 저렇게 십수 년 동안 지치지 않고, 매너리즘에도 빠지지 않고 일관되게 자신의 분야에서 지속적으로 top level의 연구 성과를 만들어낼 수 있는가?"이다. 사실 연구 그 자체를 수행하는 데에는 비상한 머리도 도움이 되지만, 기존 연구들을 찾아보고 정리하고 분석해서 거기서 약간의 개선을 만들어 내는 꾸준한 노력이 더 큰 영향을 끼치는 것 같다. (여기에 공동 저자들의 분업이 잘 되면 금상첨화)

나는 가끔 내 연구가 정말 쳐다도 보기 싫을 때가 있고, 그러다가 어느 순간에는 또 흥미가 생겨서 열심히 이것저것 찾아보고 글로 정리도 하는 등 마치 감정의 변화에 따라 생산성도 같이 따라 움직이는 듯한 취약한 모습이 많이 보인다. 가령 일주일의 시간을 투입해도 생산성이 천차만별인 경우가 많다.


사실 속으로 잘 하고 싶은 마음은 가득한데, 그게 결과만 취하고 싶어하는 욕심이 아닌가 스스로 반성하게 된다. 좋은 논문의 뒤에 약력이 적힌 그런 멋진 연구자가 지금 당장 "되고는" 싶지만, 그렇게 되기 위해서 쌓아 올려야 할 노력과 훈련은 싫어하는 이율배반적인 태도를 버리지 못하는 것이 문제다.

길게 말할 것도 없이, 내 천성이 게으르고 노력을 투입해야 할 때의 인내심이 부족한 것이다. 이러한 게으름을 극복하고 인내심을 유지하려면 뼈를 깎는 심정으로 훈련을 하거나, 나의 동기 부여가 게으름을 뛰어넘어야만 한다. 아마 둘 다 병행해야 할 것이다. 그러나 내가 연구를 진행하는 과정에서 약간의 어려움에 봉착하면 그걸 지속적으로 고민하면서 이리 찔러보고 저리 찔러보며 해결책을 찾아내는 노력을 하는 대신, 그 고민을 회피하고 잠깐의 즐거움을 찾기 위해 포털 사이트와 SNS를 헤매게 된다. 그래서 하루 종일, 때로는 며칠에 걸쳐서 그 문제에서 벗어나지 못하는 것이다.


지금 해결해야 되는 그 연구, 그 문제가 정말로 내가 성취하고 싶어하는 것이라면 쉬지 않고 계속 파고들었을 것이다. 롤플레잉 게임을 하면서 아직 잡지 못하는 보스 몬스터를 꼭 내 손으로 잡아야겠다는 목표의식이 생기면 무서운 속도로 인내심을 갖고 레벨업을 할 수 있는데, 그런 목표를 상실하면 레벨업을 할 생각은 들지 않고 그저 내가 때려잡기 쉬운 잡몹(잡 몬스터)을 잡으며 채워지지 않는 아주 작은 양의 행복으로 공허한 마음을 계속 채우려고만 든다.


나의 목표의식은 무엇인가?

진짜 질 좋은 논문을 쓰는 우수한 연구자가 되고 싶은 것이 맞나?

솔직히 진짜 그런 사람보다 그냥 하루 벌어 하루 먹고 살면서 주변에 존재하는 소소한 소비거리만을 소비하면 그저 좋다고 생각하며 현실에 안주하고 있는 것은 아닐까? (맞는 것 같다.)


마음만 단단히 먹으면 5일 만에 논문의 처음부터 끝까지 글을 다 새로 뒤집어 엎어서 쓸 수도 있으면서, 몇 달, 아니 실제로 실험을 시작한 것으로 따지면 일 년이 다 되도록 논문을 써내지 못하는 것은 결국 내가 동기 부여를 상실한 것으로밖에 설명되지 않는다.


나는 왜 욕심이 없는 것인가?

잘 되고 싶고, 인정받고 싶지 않은 것인가?

왜 스스로 그저 그런 별 볼일 없는 인생에 안주하려고 하는 것일까?

더 큰 목표와 더 큰 행복을 위해, 지금 당장 해결되지 못한 문제를 피해서 포털 사이트와 SNS에서 아주 작은 위안을 얻으려고 하는 잘못된 생각의 흐름을 끊자. 그리고 더 나은 나를 상상하며, 하나씩 작은 문제들을 해결해 가는 기쁨을 습관으로 만들자.

나는 충분히 내가 맡은 연구 문제를 해결할 수 있는 능력이 있다. 나 자신을 믿고, (+나에게 근본적인 지혜와 힘을 주시는 전능자의 사랑과 도움의 손길을 믿고) 지금 해결을 기다리는 문제를 향해 breakthrough 해 보자.




반응형
블로그 이미지

Bryan_

,