[Linux] make remote desktop in Terminal

< Real desktop >

 

< fontsize 12 : xterm-color >

 

< fontsize 2 : xterm-color >

 

 

 

 

 

 

 

 

 

Why need this program?

secure shell(ssh)을 통해 작업을 하다보면, 원격에서 서버의 GUI를 직접 확인하고 싶을 때가 있다. (물론 대다수의 서버용 컴퓨터는 GUI를 사용하지 않겠지만…)

또는, 직접 서버의 GUI모드에서 마우스를 움직이거나 키보드를 칠 필요성이 있을 것이다.

이 소스 코드는 별도의 비용 없이(팀뷰어 등) 간단한 원격 작업을 수행할 수 있다.

 

 

 

 

Remote control in Terminal

터미널 원격제어 프로그램은 이전 포스트에서 소개한 Image2ASCII(http://siya.co.kr/?p=439)에 두 가지 모듈을 추가하여 만든다.

 

  1. robotjs node.js 데스크톱 자동화도구
  2. shutter : 스크린샷 어플리케이션

 

데스크톱을 직접 제어하기위해 robotjs(https://github.com/octalmage/robotjs)를 사용한다. 그 결과 화면을 shutter가 캡쳐하고, Image2ASCII가 출력한다.

 

 

 

Install

npm i robotjs

sudo apt-get install shutter

 

 

 

Usage

  • robotjs

 

공식 사이트를 참조하여 필요한 기능을 추가한다.

(https://robotjs.io/docs/syntax)

 

Example : 마우스 이동 후 클릭

const robot = require('robotjs');

 

robot.moveMouse(X, Y);

robot.mouseClick();

 

 

  • shutter

 

shutter help를 치고 필요한 옵션을 찾으면 된다.

 

Example : 스크립트로 데스크톱 전체화면 캡쳐

shutter -f -e -o="./desktop.png"

 

 

 

Source code

아래 코드는 node.js 버전으로 작성되었으며, github(https://url)을 통해서도 받을 수 있다.

//CODE ADD


[Linux] make Image viewer in Terminal

< original image >

 

< fontsize 12 : xterm-color >

 

< fontsize 2 : xterm-color >

 

< fontsize 2: xterm-greyscale>

 

 

 

 

 

 

 

 

Why need this program?

secure shell(ssh)을 통해 작업을 하다보면, GUI가 필요한 순간이 있다.

예를들면 딥러닝 작업을 할 때 결과물을 그래프로 보고 싶은 경우가 있다.

물론, scp(secure copy)를 통해 그래프를 로컬로 가져와서 보는 방법도 있지만, 아무래도 귀찮은 것이 사실이다.

이 경우에 (비록 저화질이더라도)터미널로 이미지를 바로 볼 수 있다면 작업속도가 향상 될 것이다.

 

 

 

GreyScale

각 글자 별로 칸을 차지하는 크기가 다르다는 것에 착안하였다.

Paul Bourke에 의하면(http://paulbourke.net/dataformats/asciiart/)  아래 문자열은왼쪽에서 오른쪽으로 갈 수록 밝아진다고 하였다.(검은색 배경, 흰색 폰트 기준)

[ .\’`^”,:;Il!i><~+_-?][}{1)(|\\/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$]

 

따라서 이미지를 Greyscale 한 후, 위 문자열로 적당히 매핑해주면 될 것이다.

Greyscale에는 여러 방법이 있다.

Tanner(http://www.tannerhelland.com/3643/grayscale-image-algorithm-vb6/)가 이런 방법을 잘 정리해놓았다.

각자 원하는 방법으로 Greyscale을 하면 될 것이다.

(나는 r*0.2126 + g*0.7152 + b*0.0722의 수식을 썼을때 가장 그럴싸한 이미지를 얻었다.)

 

let black2white = "  .\'`^",:;Il!i><~+_-?][}{1)(|\\/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$"

let greyscale = r*0.2126 + g*0.7152 + b*0.0722

let character = black2white.charAt(Math.floor(black2white.length * (greyscale - 0.0001) / 255));

 

 

 

Color quantization

Xterm color sheet(https://jonasjacek.github.io/colors/)를 보면 색상간에 규칙이 존재한다.

코드 16번(rgb(0,0,0))부터 b, g, r순으로 0, 95, 135, 175, 215, 255를 표현하고 있다.

즉 색상코드를 16 + R*6^2 + G*6 + B로 정의할 수 있다. (R, G, B는 r, g, b를 0 ~ 5 값으로 축소한 것)

RGB의 각 값은 0 ~ 255인데 반해, 표현 가능한 색상은 6가지 뿐이므로, 각 색상값마다 표현 가능한 가장 가까운 값으로 매핑할 필요가 있다.

 

매핑에는 여러 방법이 있겠지만, 나의 경우 아래의 방법을 썼다.

let colorGap = [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5];

let color = colorGap[r/10] * 36 + colorGap[g/10] * 6 + colorGap[b/10] + 16

 

어떤 방법을 쓰든, 각 자리의 색상값을 매핑하여 출력하면, 216가지 색깔로 양자화 된 이미지가 나온다.

조금 더 다양한 색상을 표현하고 싶다면, 위 Greyscale 방법과 합쳐서 글자, 배경색, 전경색 세가지 요소로 픽셀을 표현해도 괜찮을 것이다.

 

 

 

Source code

아래 코드는 node.js 버전으로 작성되었으며, github(https://url)을 통해서도 받을 수 있다.

//CODE ADD

[Node.js] webdriverio node-gyp rebuild

# node 버전 확인
  대부분 이 경우로 해결 됨.

$ node -v

  결과가 8버전 이상이라면 node 버전을 낮추면 된다.

$ sudo npm install -g n
$ sudo n 7
$ npm install webdriverio

 

# gcc update
  위 방법으로 안될 때 gcc를 업데이트. OS X에서는 Xcode를 업데이트 하면 된다.

 

 

 

 

 

[Keras] get train accuracy, test accuracy

Keras에서 정확도를 측정하고 변수에 담는 방법이다.

 

model.compile(loss= ~, optimizer= ~, metrics=['accuracy'])
result = model.fit(X, y, ~~~, validation_split=0.3, validation_data=(testX, testY), shuffle=True)

print(result.history['acc']) # 0.9987

 

참고

result.history = {
   'acc' : [0.9987],
   'loss': [0.0478],
   'val_acc': [0.9543],
   'val_loss': [0.0498],

   ...
}

[Web] Cross domain 문제

최근 아는 형님께서 Cross domain issue로 연락을 주셨다.

 

옛날에 웹을 처음 배울 때 같은 문제로 고생했던 적이 있는데, 옛 추억도 되새길 겸 Cross domain issue와 관련하여 포스팅 하고자 한다.

 

Cross domain 문제는 ajax 통신 시 동일 서버(같은 도메인, 같은 포트)가 아닐 경우 보안상의 이유로 접근을 거부하는 것이다.

Cross domain issue는 Javascript의 same origin policy 정책을 위반한 것으로, 인터넷 브라우져의 Sandbox 정책과 관련이 있다.

 

위 문장에 Cross domain issue의 정의와 해결 방법에 대한 힌트가 모두 들어있다.

 

위 문장을 다시 정리하면 다음과 같다.

1.  동일 서버로 ajax 통신 하는 것은 정책에 위배되지 않는다.

2.  백엔드단에서 다른 도메인과 통신하는 것은 문제가 없다.

 

그러므로, 1) ajax로 내 백엔드 서버를 호출하고,  2) 내 백엔드 서버에서 다른 도메인과 통신 한 후 3) 결과 값을 적당히 리턴하면 해결되는 문제이다.

 

 

 

그러나 작업을 하다보면 어디 내 뜻대로 문제가 해결되랴?

모종의 이유로 백엔드 실무자가 협조해주지 않으면 이 해결방법은 쓸 수 없다.

 

이럴 경우 쓸만한 것이 “jsonp“이다. 그러나 jsonp은 get 요청만 처리할 수 있으므로, 만능 해결책은 아니다.

 

 

다음은 좀 특수한 경우인데, cafe.naver.com, blog.naver.com과 같이 서브 도메인만 다르거나, 두 도메인 모두 내 소유일 경우 사용 가능한 방법이다.

 

전자는 스크립트에 document.domain = “naver.com”를 넣어주므로서 해결할 수 있고, 후자는 CORS를 설정해서 해결할 수 있다.

 

 

만약 위 방법 모두 쓸 수 없다면 남은 방법은 하나 뿐이다.

요청하려고 하는 API Server의 실무자에게 CORS를 설정해달라고 공손하게 메일을 보내보자.

 

 

그 외에 인터넷 브라우져에 옵션을 걸고 실행하거나, 이상한 플러그인을 설치하는 방법이 있다. 이는 모든 사용자가 수동으로 설정해줘야 하는 문제이므로, 서비스에 적합치 않으므로 설명하지 않겠다.

또 flash, iframe, ActiveX(!!!)를 사용하는 방법도 있지만…  굳이 설명해야 될까 싶다.

 

 

 

3줄요약

1.  내 백엔드를 경유해서 호출하기 (가장 추천하는 방법)

2.  백엔드를 건드릴 수 없다면 구글에 jsonp 검색

3.  jsonp도 쓸 수 없다면 CORS를 설정, 공손히 메일을 보내보자.

[Windows] 다시 로그인하면 윈도우 다시 열기

맥에서 참 편리하게 쓰는 기능 중 하나가 [다시 로그인하면 윈도우 다시 열기] 기능이다.

컴퓨터를 쓰다보면, 새 프로그램을 설치하는 등의 이유로 재부팅이 강제되는 상황이 온다.

 

이 때, 펼쳐놓은 작업물(웹 페이지, 프로그램 등)이 많다면 난감한데, 이럴 때 유용하게 사용되는 기능이 [다시 로그인하면 윈도우 다시 열기]이다.

 

 

그런데 잘 알려지진 않았지만, 윈도우에도 이런 기능이 있었다.

 

 

컴퓨터를 종료 시에 Shift키를 누른 상태로 종료(혹은 다시시작)하면 된다.

 

Windows 7과 Windows 10에서 실험해본 결과, Windows 7은 아쉽게도 지원을 하지 않는 듯 하다.

Windows 10 지원하긴 하지만, 평상시보다 부팅이 오래걸리는 느낌을 받았다.

 

만약 Chrome 탭이 많아서 재부팅이 꺼려지는 경우라면, 이 방법이 아니라 Chrome 실행 후 Ctrl + Shift + T 기능을 이용하는 것을 권장한다.

[Windows] 제어판을 좀 더 편리하게! GodMode

공식문서 : https://support.microsoft.com/ko-kr/help/2480851

 

  1. [오른쪽 마우스] – [새로 만들기] – [새 폴더]로 새 폴더를 만든다.
  2. 이름바꾸기를 사용하여 폴더를 [NAME].{ED7BA470-8E54-465E-825C-99712043E01C}로 변경한다.
  3. ????
  4. PROFIT!

 

사실 주소창에 shell:::{ED7BA470-8E54-465E-825C-99712043E01C 라고 쳐도 되긴 한다. 귀찮을뿐이지…

 

 

 

 

공식문서에서 GodMode라고 해서 GodMode라고는 하지만, 다들 Master Control Panel로 부르는 것 같다.

Master Control Panel쪽이 더 의미가 와닿기도 하고… 아무튼 이 기능은 사실상 제어판 기능을 다 풀어놓은 것이랑 다를게 없다.

 

제어판을 자주쓴다면 바탕화면에 하나쯤 만들어 두자.

 

 

 

[YouTube] Chorme에서 로딩 되지 않는 문제 (Uncaught SyntaxError: Unexpected end of input)

 

 

언제부터인지 모르겠지만 크롬에서 유튜브가 위 창처럼 뜨면서 먹통이 되버렸다.

원인은 잘 모르겠으나, 콘솔에 Uncaught SyntaxError: Unexpected end of input 로그가 뜨면서 유튜브에 접속이 전혀 되지 않는 문제가 발생하였다.

 

처음엔 Chrome 익스텐션에서 문제가 발생한 줄 알고 문제를 찾아나가려 했으나, 이내 다른 컴퓨터나, 해당 증상이 있는 컴퓨터의 다른 브라우저(Chorme 시크릿 모드 포함)를 사용하면 유튜브에 정상적으로 접속이 된다는 것을 확인하였다.

 

이에 Chrome 설정을 한 번 초기화 해주었다.

 

 

 

크롬 주소창에 chrome://settings이라 치면 설정창이 뜬다.

 

 

 

스크롤을 계속 내리면 [고급] 버튼이 나온다. 클릭해주자.

 

 

 

계속 스크롤을 내리면 설정 초기화가 있다.

 

설정 초기화 후 해당 문제가 해결됐다.

혹시 이 방법으로도 해결이 되지 않는다면, chrome://extensions에서 익스텐션을 하나씩 비활성화 하면서 문제를 해결해보자.

 

 

 

[Linux] Keras Backend 변경

Keras를 사용하다보면 keras using theano backend.,  keras using tensorflow backend. 등 자신이 원치않는 프레임 워크를 불러오는 경우가 있다.

 

이럴 경우 자신이 원하는 프레임 워크를 명시적으로 지정해줘야한다.

 

Ubuntu 16.04 / Anaconda3를 기준으로 Keras Backend를 Tensorflow로 바꾸는 예시이다.

 

$ source activate YOUR_ENV
(YOUR_ENV)$ set "KERAS_BACKEND=tensorflow"

 

다시 Theano로 바꾸려면

(YOUR_ENV)$ set "KERAS_BACKEND=theano"

 

매번 바꾸기 귀찮을 경우 ~/.bashrc에 지정해두자.

 

 

 


# 위 방법대로 했으나 바뀌지 않을 경우

$ which conda
/home/{USER}/anaconda3/bin/conda

$ cd /home/{USER}/anaconda3/envs/{YOUR_ENV}/etc/conda
$ ls
activated.d  deactivated.d

activated.d 는 Default Keras backend를 정의

deactivated.d는 Default Keras backend를 해제

 

권장하진 않으나, 아래의 방법을 통해 임시방편으로 해결할 수 있음.

 

$ vi activate.d/keras_activate.sh

:wq

$ vi deactivate.d/keras_deactivate.sh

:wq

 

[Linux] Teamviewer 접속 시 검은 화면만 나올 때

간만에 팀뷰어에 접속했더니 검은화면만 나온다.

 

sudo service lightdm restart

 

디스플레이 매니저를 껐다 켜보니 여러 메세지들이 보인다.

찾아보니 Nvidia 드라이버와 관련된 메세지이다.

왜 안되나 했더니 새로 산 그래픽 카드가 잘못 설치됐나보다.