반응형

OS: Ubuntu 14.04 Desktop



scp 명령으로 IP주소를 알고 있는 원격 리눅스 머신에 파일을 전송할 수 있는데, 이 때 콘솔 창 마지막에 실시간으로 전송 현황이 갱신되어 출력된다. 보통은 지금 전송하고 있는 파일명, 전송률(%), 전송 속도(KB/s, MB/s 등), 남은 시간 등의 정보가 출력된다.


ping의 경우에는 RTT 측정 결과가 새로운 라인으로 찍히기 때문에 콘솔 화면에 이전의 기록을 모두 볼 수 있는 반면, scp는 그런 것 없이 마지막으로 갱신된 정보가 이전 라인에 계속 덮어써지는 구조라서 이전 기록을 확인할 수 없다.


scp를 통해 전송중인 정보를 ping과 유사하게 line-by-line으로 기록으로 남기기 위해서는 다른 도구와 조합해서 써야 하는데, script가 유용하다고 한다 [1]. Script는 콘솔 창에서 변화가 생기는 것(?? 적당한 표현을 찾지 못함...)을 모두 기록하는 도구이다.


인용한 StackOverflow에 달린 두 번째 답변에 의하면, 아래와 같이 할 수 있다:


$ script -c "아웃풋을 기록하고자 하는 명령어" [아웃풋을_저장할_파일]


예를 들어,

$ script -c "scp [sending_file_location] [receiving_host_and_location]" scplog.txt


맨 끝에 아웃풋을 저장할 파일을 지정하지 않으면, 

콘솔의 현재 위치에 typescript라는 파일을 자동으로 생성해서 저장한다.



123.yuv라는 20MB짜리 파일을 Remote host에 전달했을 때, 

예제로 생성된 로그파일(scplog.txt)은 아래와 같다:


Script started on 2016년 05월 13일 (금) 오전 03시 30분 26초


123.yuv                                         0%    0     0.0KB/s   --:-- ETA

123.yuv                                        34% 7072KB   6.9MB/s   00:01 ETA

123.yuv                                        59%   12MB   6.7MB/s   00:01 ETA

123.yuv                                        84%   17MB   6.6MB/s   00:00 ETA

123.yuv                                       100%   20MB   6.7MB/s   00:03    


Script done on 2016년 05월 13일 (금) 오전 03시 30분 30초



Script로 ping 명령을 테스트해 보면 그냥 콘솔에서 보는 것과 똑같이 찍힌다. 자세한 원리는 모르겠지만 실제로 변화가 생긴 라인을 기록하는 것 같은데, 여러 라인에 변화가 생기면 여러 라인이 동시에 기록되는지는 아직 모르겠다.


어쨌든 SCP도 그때그때 눈으로 보고 속도를 메모하던 안습한 짓을 하지 않아도 돼서 다행이다. (=_=)



<참고자료>

[1] How to best capture and log scp output? http://stackoverflow.com/questions/202432/how-to-best-capture-and-log-scp-output



반응형
블로그 이미지

Bryan_

,
반응형

연구실에 있던 학생이 개인적으로 쓰던 넥서스7 2세대(2013)가 액정이 깨졌는데, 졸업하면서 그걸 연구실에 기증(?)하고 갔다.


한참 동안 액정이 깨진 채 연구실 빈 책상 한켠에 방치되어 있었는데, 조만간 해외출장을 갈 일이 생겨서 이걸 고쳐서 비행기에서 쓰기로 마음먹고 eBay에서 액정을 사서 고쳤다. 액정만 있는 것 말고 프레임까지 이미 붙어 있는 일체형 세트가 배송비 없이 40달러가 조금 넘더라는... 


링크:

http://www.ebay.com/itm/LCD-Screen-Touch-Digitizer-Assembly-For-Asus-Google-Nexus7-2nd-2013-With-Frame-/181624026244?hash=item2a49a2b484:g:69YAAOSwDwtUm9y2



그리고 케이스도 하나 있으면 좋을 것 같아서 찾아보니, 

솔로젠에서 나온 히트 다이어리 케이스가 예뻐 보이고 가격대도 적당해서 질렀다.




↑ 색깔은 위의 사진에 찍힌 것보다 좀더 밝은 갈색 느낌이다. (형광등 불빛에서 봤을 때)




↑ 단단해 보이는 질감인데, 실제로도 딱딱해서 쉽게 휘어지지 않을 것 같다.



(화면에 보이는 흠집이 많은 것은 액정보호필름 대신 액정을 살 때 임시로 붙어 있던 비닐을 떼지 않아서 그렇다.)


↑ 커버 안쪽에 신용카드나 지폐를 넣을 수 있도록 되어 있다.

사실 나는 신용카드를 커버에 넣는 것을 싫어해서 수납공간 유무는 별로 중요하지 않다.

하지만 곧 출장가는 입장에서, 항공권이나 출입국 서류 등 잡다한 종이들을 보관하기에 유용할 것 같다.




↑ 뒷면. 특별할 것은 없고, 거치대처럼 세울 수 있게 접힐 수 있게 만들어졌다.





↑ 단추 부분은 자석으로 되어 있고, 자석이 맞닿는 부분이 약간 움푹 내려가 있어서 

미세하게나마 두께를 줄여 준다.

저 약간의 움푹 파인 부분 덕분에 손가락으로 덮개를 열기에도 편하다.




↑ 앞커버 안쪽의 홈을 이용해서 세워 보면, 각도가 약간 높은 편이다.

프레임 테두리의 고무 재질로 인한 마찰력이 있기 때문에

굳이 거치용 홈에 맞출 필요 없이 원하는 시야각이 되도록 적당히 세워도 아무 문제 없다.




↑ 같이 동봉된 스트랩을 끼웠다.

뭐 특별할 것은 없고, 무난하다. 쉽게 끊어지지만 않으면 됐지...




↑ 전체적으로 다 괜찮은데, 태블릿을 끼고 나서 오른쪽 테두리에 살짝 뜨는 공간이 생긴다.

고무 프레임 자체가 오른쪽 부분만 살짝 휘어져 있다.

하자가 있는 제품일 수도 있지만, 이미 몇년 된 태블릿을 저비용으로 살려서 쓰는 마당에 

이런 것까지 신경써서 교환할 필요는 느끼지 못해서 그냥 쓰기로 했다.




↑ 가장 결정적인 단점은:

안 그래도 누르기 힘든 넥서스7 2세대의 물리 버튼을 누르기가 더 힘들어졌다는 것.

애초에 넥서스7 2세대의 디자인에서부터 파생되는 문제점이다.


아무튼 버튼 부분이 고무 프레임과 일체형으로 만들어져 있기 때문에

정확한 각도로 확실한 힘을 줘서 꾹꾹 눌러야만 한다.

차라리 그냥 구멍을 뚫어 놓는 게 더 좋았을 것 같다.


그나마 다행인 점은, 넥서스7 2세대의 버튼 위치를 고려해서

케이스 뒷판 일부를 손가락이 쉽게 닿을 수 있도록 잘라 둔 것이다.

비슷한 다른 케이스들 중에는 뒷판이 잘려 있지 않아서 

아예 손가락으로 버튼을 누르는 것 자체가 간섭을 받는 경우도 있다.



이쯤에서 개인적으로 정리하는 장/단점...


<장점>

*예쁘다. (군더더기 없이 있을 것만 있는 깔끔한 디자인; 개인의 취향)

*커버가 단단하다. (태블릿을 잡고 있는 고무 프레임까지 합쳐서 떨어져도 액정이 쉽게 깨질 것 같지 않다.)

*무난한 가격 (찾아보면 배송비 제외하고 13,000원대에 살 수도 있다)


<단점>

*전원/볼륨 버튼을 누르기가 힘들다. (손가락이 버튼에 닿는 경로에 간섭이 없도록 배려하기는 했다.)

*2% 부족한 고무 프레임의 마감





아무튼 출장 다녀오는 동안 잘 써봐야겠다.





반응형
블로그 이미지

Bryan_

,
반응형
연구 코딩할 때마다 느끼는 점은, 왠지 나만 그런 것 같기도 하지만 ㅠㅠ 적합한 데이터 구조를 선택하는 것이 생각만큼 간단하지 않다는 것이다. 아니 좀더 정확하게 표현하면, 무엇이 적합한 데이터 구조인지는 뻔하지만, 그 구조가 어디서 어떻게 쓰일지를 미리 다 예측할 수 없어서 고민이다.

처음부터 몇 수 앞을 내다보고, 내가 구현한 실험환경이 어디까지 확장될 것인지를 염두에 둬서 요구사항 분석을 한다면 시행착오가 줄어들겠지만, 당장 실험결과를 빨리 그래프로 찍어내야 하는 마당에 장인정신(?)으로 이런 올라운드 플레이어 같은 제품을 천천히 제작할 수는 없는 노릇이다.

중간결론으로 얻은 것은... 결국 내 입장에서는 너무 지나치게 이런 선택의 문제가 조심스러워서 생각만 하느라 시간을 많이 허비한다는 것이다. 일단 방향이 아예 잘못되지 않았다면, 즉 통째로 뜯어고칠 위험을 최대한 줄였다면, 재빨리 구현해서 비효율적이더라도 돌아가는 코드를 먼저 얻는 것이 필요한 것 같다. 그 다음에 계속 고칠 것들은 버전업 한다는 생각으로 고쳐야 할 것 같다.

예를 들면 이렇다:

네트워크로 연결된 이웃노드의 실시간 상태정보를 저장하는 간단한 테이블 구조가 필요해서 처음에 ArrayList로 무작정 시작했다가, 중간쯤 구현해서 생각해 보니 무진장 자주 테이블 검색을 해야 되는데 그 때마다 O(N)의 검색시간을 소비하면 낭비일 것 같아서 O(1)로 줄어드는 Hashtable로 바꿨다.
그렇게 구현을 하다가, 이 테이블의 값을 실시간으로 로그 파일에 저장시키야 하는 요구사항이 추가되었다. 테이블은 매번 최신 값만 저장하고 있기 때문에 매 시간마다 테이블의 값들을 로그 파일에 한 줄씩 추가로 기록해야 하는데, 이 때 테이블에 항목이 추가된 시간 순서를 유지해야 한다.
처음에는 Hashtable에서 values() 메쏘드로 값들만 통째로 얻어 와서 나열하면 될 줄 알았는데, 생각해 보니 해쉬값에 따라 제멋대로 정렬돼서 나오기 때문에 시간 순서를 유지하지 않는 것에 잠시 멘붕...
결국 시간 순서대로 입력되는 새로운 키 값을 순서대로 저장하는 ArrayList를 하나 더 유지하고, 이걸 기준으로 Hashtable을 다시 탐색해서 파일에 기록하기로 했다.

문제는 위와 같은 테이블 구조가 한개만 있는 것이 아니라서 각 테이블 구조에 다 시간 순서의 ArrayList를 추가해야 되는 것...

처음부터 시간 순서대로 추가되는 키의 ArrayList와 Hashtable을 쌍으로 관리하도록 설계를 하고 이것을 상속받아서 다른 모든 테이블들을 구현했으면 좋았겠지만, 그러면 아직도 돌아가는 코드를 못 봤을지도 모르겠다.


마치 알파고가 바둑 게임에서 다음 수를 선택할 때, 계산할 시간이 충분한 경우와 제한적일 경우에 최적의 선택이 미묘하게 달라지는 것처럼 어쩌면 나도 경험이 부족하고 생각할 시간도 제한적인 상황에서 최선의 코딩 방향을 선택하는 것에 어쩔 수 없이 차이가 있음을 인정해야 할 것 같다.

이렇게 배워 가면서 점차 더 빠른 시간 안에 더 효율적으로 돌아가는 프로그램을 개발할 수 있게 되겠지. 꾸준히 연습하자.

반응형
블로그 이미지

Bryan_

,
반응형

OS: 윈도우 10 (윈도우7, 8, 8.1 모두 해당될 것으로 예상됨)


윈도우에서 원격 데스크탑 연결(RDP)을 통한 접근을 어디서 누가 언제 했었는지 알고 싶을 때, 이벤트 로그에서 확인할 수 있다.

이벤트 로그를 볼 수 있는 이벤트 뷰어는 시작-실행에서 이벤트 뷰어(eventvwr)를 입력해서 실행할 수 있다.

RDP 관련 로그는 응용 프로그램 및 서비스 > Microsoft > Windows > TerminalServices-LocalSessionManager > Operational 을 선택한다.


하나씩 항목을 눌러보면서 IP주소는 확인이 안되는 줄 알았는데, 알고보니 하단의 이벤트 정보를 보여주는 창 중에서 "일반" 바로 밑의 창에서 확인할 수 있었다. 가려져 있지만, 그림 1에서 빨간 네모칸 영역에 해당하는 부분을 키우거나 스크롤 단추를 눌러서 아래쪽을 보면 접속한 클라이언트의 IP 주소가 보인다.



(그림 1. 이벤트 뷰어에서 RDP 로그에 대한 상세 화면)






반응형
블로그 이미지

Bryan_

,
반응형

Host OS: Ubuntu 14.04.1 Desktop (amd64)

Host OS (이동 대상): Ubuntu 14.04 Server (amd64)

Guest OS: Windows 10 (64-bit)


개인 PC에서 개인용 윈도우10 VM 하나를 만들어서 KVM에서 돌리다가, PC의 디스크 속도가 받쳐주질 못해서 서버에 옮기기로 했다.


원래 개인 PC에서 VM을 쓰려고 했던 이유는 guest OS에 원격접속할 때 네트워크 지연 시간을 극단적으로 줄이려는 목적이었고, 실제로 지연 시간은 매우 적었지만 물리적인 하드디스크 1개에서 host OS (Ubuntu)와 guest OS (Windows 10)를 모두 써 보니 전체적인 속도가 느려지고 말았다. 안 그래도 디스크를 많이 쓰는 경향이 있는데 SSD도 아니라서 bottleneck이 되고 말았다. 그래서 같은 건물에 있어서 어차피 LAN의 범위 안에 있는 자원이 충분한 서버에 VM을 옮기기로 했다.


VirtualBox처럼 간단하게 이미지 파일만 복사하면 되는 것 같지는 않아서 찾아본 결과, 나와 같은 목적으로 VM을 다른 호스트 머신에 복사해서 성공한 사례가 있었다. [1]



정리하면:


1. clone 명령으로 옮길(==복사할) 이미지를 만든다. 사실은 새로 안 만들고 바로 옮겨도 될 것 같다. 

즉, 굳이 복사할 필요성을 못 느낀다면 원래 있던 VM 이름과 이미지 파일 위치, xml 파일 위치를 기억해 두고 바로 2번부터 시작한다.


# virt-clone --original=[원래 있던 VM 이름] --name=[새로 만들 VM 이름] -f [생성할 img 파일 위치] --mac [랜카드 맥주소]


예를 들어,

# virt-clone --original=testvm1 --name=newvm -f /var/lib/libvirt/images/skylit_newvm.img --mac 00:12:34:56:78:90



2. 기존 호스트 머신에서 방금 생성한 img 파일과 설정 파일(xml)을 새로운 호스트 머신에 옮긴다.

서로 네트워크로 연결돼 있다면 scp를 쓰는 게 제일 빠를 듯. 일반적으로 virt-manager에 의해서 생성되는 VM 이미지가 저장되는 위치는 /var/lib/libvirt/images/ 이다. (루트 권한으로만 접근 가능)그리고 xml파일은 /etc/libvirt/qemu/ 에 [새로 만든 VM 이름].xml 로 생성된다.


예를 들어, 아래 두 파일을 새로운 호스트 머신으로 옮긴다.

  • /var/lib/libvirt/images/newvm.img
  • /etc/libvirt/qemu/newvm.xml



3. 새로운 호스트 서버의 콘솔에서, virt-manager에서 인식할 수 있도록 새로 옮긴 VM 이미지를 추가한다.

$ virsh define /etc/libvirt/qemu/[옮겨온 VM 이름].xml



4. 이제 virt-manager를 실행하면 목록에 방금 옮겨온 VM 이름이 추가되어 있음을 확인할 수 있다.



<주의사항>


옮겨 가는 새로운 호스트 머신의 KVM 설정에 따라서 기존 호스트 머신에서 설정한 것이 작동하지 않을 수도 있다.

대표적으로 CPU 설정, 메모리 용량, display 설정 등이 있다. 


  • CPU는 가상 CPU로 특정 모델(e.g. Intel SandyBridge)을 지정해 두었는데 새로운 호스트 머신에서 해당 CPU 모델을 가상화하지 못할 수 있으므로, CPU 프로파일을 한번 확인해 볼 필요는 있다.
  • 메모리의 경우, [1] 에서도 언급되었듯이 물리적인 전체 메모리 용량을 넘어서는 등의 자원 할당 문제가 있는지 살펴봐야 한다.
  • Display의 경우, 필자는 기존 호스트 머신에서 SPICE 프로토콜을 썼는데 옮겨 가는 새로운 호스트 머신에 SPICE를 설치해 두지 않아서 virt-manager를 통해서는 화면을 볼 수 없었다. 하지만 네트워크 관련 설정에 문제가 없어서 원격 접속하는 데에는 문제가 없었다.




<참고자료>

[1] http://serverfault.com/questions/399835/clone-kvm-qemu-vm-to-a-different-server


반응형
블로그 이미지

Bryan_

,