[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

[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 드라이버와 관련된 메세지이다.

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

[Linux] Ubuntu에 VMware 설치

https://my.vmware.com/en/web/vmware/free#desktop_end_user_computing/vmware_workstation_player/14_0

 

위 링크에서 VMware Workstation 14.1.1 Player for Linux 64-bit를 다운로드한다.

 

다운로드 완료되면 VMware-Player-14.1.1-7528167.x86_64.bundle 파일을 실행해준다.

 

sudo sh VMware-Player-14.1.1-7528167.x86_64.bundle

 

설치 창이 뜨면 설치를 진행한다.

 

 


 

 

VM이 위 창과 같이 뜨며 실행되지 않는다면, BIOS에서 Intel VT 혹은 AMD-V 기능을 활성화하면 해결된다.

 

UEFI BIOS에서는 아래와 같이 SVM을 활성화 해주면 된다.

 

 

 

[Linux] Ubuntu 해상도 설정

Ubuntu 16.04 Desktop에서 1920×1080 해상도로 변경하는 것을 예시로 작성하였습니다.

붉은 글씨는 각 사용자의 상황에 따라 달라지므로 이전 명령어 수행 결과를 참고하세요.

 


 

$ gtf 1920 1080 60
$ gtf [WIDTH] [HEIGHT] [Hz]

# 1920×1080 @ 60.00 Hz (GTF) hsync: 67.08 kHz; pclk: 172.80 MHz
Modeline “1920x1080_60.00” 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -HSync +Vsync

 

 

$ xrandr --newmode "1920x1080" 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -HSync +Vsync
$ xrandr

Screen 0: minimum 8 x 8, current 1024 x 768, maximum 32767 x 32767
DP1 disconnected (normal left inverted right x axis y axis)
HDMI1 disconnected (normal left inverted right x axis y axis)
HDMI2 disconnected (normal left inverted right x axis y axis)
HDMI3 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)
1920×1080 (0x19c) 172.800MHz -HSync +VSync
h: width 1920 start 2040 end 2248 total 2576 skew 0 clock 67.08KHz
v: height 1080 start 1081 end 1084 total 1118 clock 60.00Hz

 

$ xrandr --addmode VIRTUAL1 1920x1080
$ xrandr -s 1920x1080

 

[Linux] 새 하드디스크 추가하기

Ubuntu 16.04를 기준으로 작성된 글입니다.

 

우선 fdisk 명령어를 통해 새로 추가한 디스크가 인식됐는지 확인한다.

$ sudo fdisk -l
Disk /dev/sda: 238.5 GiB, 256060514304 bytes, 500118192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x0c5b2f70

Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 999423 997376 487M 83 Linux
/dev/sda2 1001470 500117503 499116034 238G 5 Extended
/dev/sda5 1001472 500117503 499116032 238G 8e Linux LVM



Disk /dev/sdb: 596.2 GiB, 640135028736 bytes, 1250263728 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes



Disk /dev/mapper/siya--vg-root: 222.1 GiB, 238441988096 bytes, 465707008 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes



Disk /dev/mapper/siya--vg-swap_1: 15.9 GiB, 17054040064 bytes, 33308672 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

이 글에서는  /dev/sdb가 마운트 할 디스크이다. 하드가 잘 꽂혔으므로, 파티션 설정작업을 진행한다. 파티션 설정작업은 fdisk 명령어를 통해 진행할 수 있다.

$ sudo fdisk /dev/sdb
Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0xcc2a90c7.

Command (m for help):

m을 입력하면 명렁어 정보를 볼 수 있다.

Help:

DOS (MBR)
a toggle a bootable flag
b edit nested BSD disklabel
c toggle the dos compatibility flag

Generic
d delete a partition
F list free unpartitioned space
l list known partition types
n add a new partition
p print the partition table
t change a partition type
v verify the partition table
i print information about a partition

Misc
m print this menu
u change display/entry units
x extra functionality (experts only)

Script
I load disk layout from sfdisk script file
O dump disk layout to sfdisk script file

Save & Exit
w write table to disk and exit
q quit without saving changes

Create a new label
g create a new empty GPT partition table
G create a new empty SGI (IRIX) partition table
o create a new empty DOS partition table
s create a new empty Sun partition table

새 파티션을 추가하기 위해 n을 누르고 엔터를 계속 쳐준다. 물론 기본값으로 만들기 싫다면 값을 입력해줘도 된다.

Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p):

Using default response p.
Partition number (1-4, default 1):
First sector (2048-1250263727, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-1250263727, default 1250263727):

Created a new partition 1 of type 'Linux' and of size 596.2 GiB.

파티션을 만들었으면 w를 입력해 저장하고 fdisk를 종료한다.

Command (m for help): w

The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

 

이제 파티션을 ext4 형식으로 포맷해주자. 포맷은 mkfs.ext4 명령어를 통해 할 수 있다. 여기서 /dev/sdb가 아닌 /dev/sdb1(첫번째 파티션)임에 유의하자

$ sudo mkfs.ext4 /dev/sdb1
mke2fs 1.42.13 (17-May-2015)
Creating filesystem with 156282710 4k blocks and 39075840 inodes
Filesystem UUID: e5bd4acf-cd6e-40df-9ebe-6967f4a569fb
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

 

그 후 새 파티션의 uuid를 조회한다.

$ ls -l /dev/disk/by-uuid/
합계 0
lrwxrwxrwx 1 root root 10 8월 28 23:17 86d4ee89-af0a-43e6-b08c-16dcd02c943e -> ../../sda1
lrwxrwxrwx 1 root root 10 8월 28 23:17 e46a2f40-84ef-4a9d-b53c-551f51eb0329 -> ../../dm-0
lrwxrwxrwx 1 root root 10 8월 28 23:17 e7f843c0-fa55-4e8b-bddb-e869a94211d8 -> ../../dm-1

(디스크 문제로 저는 마운트가 잘 되지 않은 상태입니다. 원래대로라면 sdb1이 떠야 정상입니다.)

 

마지막으로 부팅시 마다 마운트를 해야되는 번거로움을 피하기 위해 fstab에 새로 추가한 파티션을 등록해준다.

$ sudo vi /etc/fstab

맨 아래 행에 아래의 형태로 추가해주면 된다.

UUID="UUID" "MOUNT_POINT" "FILESYSTEM_TYPE" "MOUNT_OPTION" "DUMP" "FILE_SEQUENCE_CHECK_OPTION"

UUID는 위에서 조회한 값을 써주면 되고, MOUNT_POINT는 마운트 하고싶은 위치를 원하는대로 설정해주면 된다.

FILESYSTEM_TYPE은 파티션 생성시 정했던 파일시스템의 종류를 써주면 된다. 이 글에서는 ext4로 정했으므로 ext4를 써주면 된다. 그 외의 파일시스템은 아래 표를 참고하자.

 

 

 

ext 초기 리눅스에서 사용, 현재는 사용하지 않음
ext2 https://ko.wikipedia.org/wiki/Ext2
ext3 https://ko.wikipedia.org/wiki/Ext3
ext4 https://ko.wikipedia.org/wiki/Ext4

 


MOUNT_OPTION은 default로 설정한다. 그 외 옵션은 아래와 같다.

default rw, nouser, auto, exec, suid를 모두 사용
auto 부팅시 자동마운트를 함
noauto 부팅시 자동마운트를 하지않음
exec 실행파일이 실행되는것을 허용함
noexec 실행파일이 실행되는것을 허용하지 않음
suid SetUID, SetGID 사용을 허용함
nosuid SetUID, SetGID 사용을 허용하지 않음
ro 읽기 전용의 파일시스템으로 설정함
rw 읽기/쓰기 전용의 파일시스템으로 설정함
user  일반 사용자에게 마운트를 허가함
nouser 일반 사용자에게 마운트를 허가하지 않음(only root)
quota Quota 설정을 허용
noquota Quota 설정을 허용하지 않음

 


 

DUMP와 FILE_SEQUENCE_CHECK_OPTION는 0과 2로 설정해주자.

DUMP
0 덤프 불가능
1 덤프 가능
FILE_SEQUENCE_CHECK_OPTION
0 무결성 검사를 하지 않음
1 우선순위가 높음, 보통 루트에 설정함
2 우선순위가 낮음

 

 

이제 마운트가 끝났다. 다만 이 과정에서 실수를 하면 부팅이 안되므로 마운트가 제대로 됐는지 검사한다.

$ sudo mount -a
mount: can't find UUID=e5bd4acf-cd6e-40df-9ebe-6967f4a569fb

이렇게 오류가 뜨면 부팅이 안되므로, fstab에 가서 추가했던 라인을 주석처리해준다. 마운트는 다시 해야겠지만, 부팅이 안되서 고생하는 일은 없을 것이다.

혹시나 fstab이 꼬여서 부팅이 안된다면 당황하지 말고, Ubuntu ISO파일이 든 시동디스크를 꽂아 안전모드로 부팅해 /etc/fstab에서 꼬인부분을 풀어주자.