Ubuntu 에서 Headless browser 인 PhantomJS를 설치하는 방법을 소개한다.


PhantomJS는 기본적으로 Multi platform 을 지원하여, Windows, Linux, FreeBSD 등 다양한 OS 상에서 구동 될 수 있다.

Architecture / OS 에 따라 기본적으로 제공되는 파일을 사용하여 설치 할 수 없는 경우

Github 로 부터 source code를 다운 받아 설치 할 수 있다.


PhantomJS에서 필요한 패키지(Qt, WebKit 등)를 자동으로 설치 하기 떄문에 Dependency가 없다고 하지만,

Ruby, gperf 등 일부 패키지를 설치 하지 않으면 install 도중 Error를 맞이하게 된다.


Prerequisites

1. Ruby Installation

Ruby install은 RVM(Ruby Version Manager)를 통해 할 수 있다. 따라서, Ruby install 을 위한 RVM install 이 필요하다. 

gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3

$ cd /tmp && \curl -sSL https://get.rvm.io -o rvm.sh

$ cat /tmp/rvm.sh | bash -s stable

*참조: https://www.rosehosting.com/blog/install-ruby-on-rails-on-ubuntu-16-04/

RVM이 설치 되면, Ruby를 설치 할 수 있다. 


RVM 실행

$ source /usr/local/rvm/scripts/rvm


RVM에서 설치 가능한 Ruby version 확인

$ rvm list known


Ruby 설치(stable 최신 버전 2.5.1, 2018.12.10 기준)

$ rvm install 2.5.1


2. Gperf Installation

$ sudo apt-get install gperf


Git source Fetch

$ git clone https://github.com/ariya/phantomjs


PhantomJS Installation from source

$ cd phantomjs

$ ./build.py 

(시간이 꽤 걸린다.)

'Programming > Linux' 카테고리의 다른 글

Piping ls to cp  (0) 2020.12.02
How to use GDB  (0) 2020.03.12
Linux screen  (0) 2018.09.27
Xshell + Xming  (0) 2018.09.10
Memtester  (0) 2018.07.15

인터넷이 되지 않는 어떤 머신에

OS가 Ubuntu가 설치 된 경우

apt get을 통해 패키지를 설치하고 싶지만, 인터넷이 되지 않기에 

인터넷이 되는 다른 머신에서 repository에서 필요한 패키지를 찾아 직접 설치 해야 한다.


Python을 이용해 이를 자동화 할 수 있는 코드를 짜보았다.

import gzip

import os

import wget

import sys


repository="old-releases.ubuntu.com/ubuntu"

ARCH="arm64"

release="vivid"

branch="main"


def check_dependency(package_depends):

if package_depends == None:

return;

depends_list_pre = package_depends.split(", ")

depends_list_post = [] #[depend_package, version, comparator]

for depend in depends_list_pre:

if depend.find("(") != -1:

depend_package = depend[:depend.find("(")-1]

version = depend[depend.find(" ", depend.find("("))+1:depend.find(")")]

comparator = depend[depend.find("(")+1: depend.find(" ", depend.find("("))]

else:

depend_package = depend

version = ""

comparator = ""

depends_list_post.append([depend_package, version, comparator])

print(depends_list_post)

for depend, ver, com in depends_list_post:

find_package(depend, ver, com)


def down_pacakge(filename):

file_path_and_name = filename.split("/")

if not os.path.exists("./"+repository+"/"+release+"/"+branch+"/deb/"+file_path_and_name[-1]):

url = "http://"+repository+"/"+filename

print(url)

wget.download(url, "./"+repository+"/"+release+"/"+branch+"/deb/"+file_path_and_name[-1])

return 1;

return 0;

def find_package(package_name, version="", comparator=""):

package_list_file = "./"+repository+"/"+release+"/"+branch+"/binary-"+ARCH+"/Packages.gz"

if not os.path.exists(package_list_file):

if not os.path.exists("./"+repository+"/"+release+"/"+branch+"/binary-"+ARCH):

os.mkdir("./"+repository+"/"+release+"/"+branch+"/binary-"+ARCH)

#download Packages.gz

url = "http://"+repository+"/dists/"+release+"/"+branch+"/binary-"+ARCH+"/Packages.gz"

wget.download(url, package_list_file)

package_list = []

package_info = {}

package_list_filep = gzip.open(package_list_file, 'r')

for line in package_list_filep:

line_str = line.decode("utf-8")

line_str = line_str.replace("\n", "")

if line_str == "":

package_list.append(package_info)

package_info = {}

else:

line_elements = line_str.split(": ")

package_info.update({line_elements[0] : line_elements[1]})

package_list_filep.close()

for package in package_list:

if package.get("Package") == package_name:

if(version==""):

if down_pacakge(package.get("Filename")):

check_dependency(package.get("Depends"))

return package;

elif comparator == "=" and package.get("Version") == version:

if down_pacakge(package.get("Filename")):

check_dependency(package.get("Depends"))

return package;

elif comparator == ">=" and package.get("Version") >= version:

if down_pacakge(package.get("Filename")):

check_dependency(package.get("Depends"))

return package;

print("ERROR::Cannot find package("+package_name+")")


for argument in sys.argv:

if argument == "apt_get.py":

continue;

else:

find_package(argument)


패키지는 해당 머신에 복사해주시고,

설치는 아래와 같이 하면 된다.

$ sudo dpkg -i *.deb


원리는 간단하다.

repository 에는 package 정보가 담긴 파일이 존재하고(architecture / release / branch)

해당 파일에는 Package 의 이름, 버전, dependency, 패키지 파일 경로 등이 담겨 있다.

패키지 설치를 위해서는 각 패키지 파일(.deb)을 다운 받아야하고, 또한 dependency 파일들의 패키지 파일도 다운 받아야 한다.

다운받은 모든 파일을 dpkg 를 통해 한 번에 설치 하면 된다.




Ubuntu 패키지 중에 Memory(RAM) 를 테스트하기 위한 패키지가 있다

Memtester 


성능 분석을 할 수는 없고, Bit flip 등 error 가 발생하는 지 여부를 확인 할 수 있다.


설치

$ sudo apt-get install memtester


사용 방법

memtester <size_in_MB> <#_of_loops>

-p 와 함께 physical address base를 지정할 수 있다.


참조: https://www.techwalla.com/articles/how-to-reinstall-usb-mouse-drivers-in-ubuntu-using-the-command-line

'Programming > Linux' 카테고리의 다른 글

Linux screen  (0) 2018.09.27
Xshell + Xming  (0) 2018.09.10
Ctags  (0) 2018.07.03
scp  (0) 2018.05.29
Systemd Service  (0) 2018.05.04

Ubuntu 를 사용 할 때, 

각 종 프로그램을 다운 받거나 설치하기 위한 apt의 repository 를 어떻게 해야하나 고민이 된다.


잘은 모르겠지만, 복잡한 것은 싫을 때 사용할 만한 sources.list generation 사이트를 소개한다.

https://repogen.simplylinux.ch/

위 링크에 접속하면, 나라 / Ubuntu release / Ubuntu Bransches / Ubuntu Updates 등만 설정하면 그에 알맞는 sources.list 파일을 생성해 준다.

그 외에 널리 사용되는 PPA 도 추가 할 수 있다.


비교적 최신(아마도, 현재 Ubuntu에서 공식적으로 지원하는 release 만) 선택 할 수 있는 듯 하지만,

손쉽게 sources.list 를 생성 할 수 있어 편리하다.


위 링크에서 처음 제대로 알게된 Main / Restricted / Universe / Multiverse 의 차이

Main : Ubuntu 공식 supported Software

Restricted : supported Software 이지만, 완전 free license는 아님

Universe : 널리 사용되지만, 공식 supoort는 아님

Multiverse : free가 아님


Security : 중요 security update

Updates: : recommended update

Proposed : pre-relased update

Backports : unsupported update


Main + Universe + Security 만 선택해 generate 해도 별 문제 없이 사용할 듯 하다.


생성된 sources.list 는 나라를 South Korea 로 선택시

kr.archive.ubuntu.com 으로 생성 되지만,

보다 빠른 ftp.daumkakao.com 으로 변경하여 사용하면 더 빠르게 다운 받을 수 있다.


Vi 기준

:%s/kr.archive.ubuntu.com/ftp.daumkakao.com/g


'Programming > Linux' 카테고리의 다른 글

HandBrakeCLI  (0) 2018.04.06
Linux sed  (0) 2018.02.05
Linux find  (0) 2018.02.04
Ubuntu Redshift  (0) 2017.07.02
Linux timezone  (0) 2017.06.20

시력 보호를 위해 모니터의 색온도를 조절하여 사용하는 사람들이 많이 있다.

Windows 에서는 Flux 라는 프로그램을 사용하는데,

Ubuntu 에도 Flux 가 있지만, 원하는 동작을 제대로 해주지 않는다.


Flux 대신 Redshift 를 사용하면

보다 편하게 화면의 색온도를 설정할 수 있다.

Redshift 는 Ubuntu 12.04 버전 이후로 사용할 수 있다.


설치 방법

sudo apt-get install redshift-gtk

※Debian: sudo apt-get install redshift


Redshift 를 설치 후 아래의 명령어로 색온도를 설정 할 수 있다.

$ redshift -o <temperature>


다른 많은 옵션도 있지만, 버그가 있는지 잘 안되는 명령어도 있는 듯하다. 다양한 옵션을 man 으로 확인 할 수 있다.

그냥 단순히 색온도를 설정해서 사용하기엔 편리하다.

 


'Programming > Linux' 카테고리의 다른 글

HandBrakeCLI  (0) 2018.04.06
Linux sed  (0) 2018.02.05
Linux find  (0) 2018.02.04
Ubuntu sources.list generation  (0) 2017.09.06
Linux timezone  (0) 2017.06.20

OrangePi Plus 2에 Ubuntu 설치 방법이다.


OrangePi Plus 2 는 RaspberryPi 의 모조품 이라 할 수 있는, 중국의 OrangePi의 제품 중 하나로, 

AllWinner H3 SoC, 2GB DDR3 SDRAM, 1G Ethernet interface, 16GB eMMC 및 SATA 2.5 interface를 가지고 있는 것이 특징이다.

AllWinner H3 SoC 는 ARM Quad-core Cortex-A7 CPU 와 ARM Mali 400 GPU 및 H.265 Codec 을 포함하고 있지만, 발열이 심하다고 알려져 있다.(실제로 발열문제는 심각하다.)


기존에 OrangePi 에서 다운받을 수 있는 Linux version 은 인터넷이 되지 않는 문제가 있었지만,

오랜만에 들어가 보니 상당한 업데이트를 한 듯한 느낌이 든다.


OrangePi 공식 홈페이지에서 wiki 타고 google drive로 이동해 원하는 Linux 이미지를 다운 받아서 Disk Imager 로 구워주면 끝

Ubuntu MATE vivid 버전으로 테스트 해봤는데 별 문제 없이 잘 작동한다.


요즘에는 ARMbian이 더 잘 Support 해주는 느낌이 들어 ARMbian으로 설치 하고자 한다.

Ubuntu 16.04(Xenial) 버전도 설치 가능하다. @.@


설치 방법은 간단하다.

1. SD 카드를 준비한다. (사실 microSD 카드)

2. SD Card Formatter 를 이용해 FAT32 로 포멧한다. (사실 꼭 SD Card Formatter 를 써야하는지 모름)

3. ARMbian Ubuntu Image 를 다운받아 압축을 푼다. (해당 보드에 맞는 image 를 다운 받아 압축을 풀면 됨. 압축은 반디집으로 풀었음)

4. Win32 Disk Imager 를 이용해 image 를 굽는다. 

5. OrangePi 에 SD 카드를 넣고 전원을 넣어준다.

6. HDMI 연결을 통해 부팅 된 OrangePi 를 확인한다. (UART 를 사용해도 되지만 사실상 HDMI 가 편함)

   (로그인 ID:root PW:1234)

'Programming > OrangePi' 카테고리의 다른 글

sftp 네트워크 드라이브 연결  (0) 2018.04.05
OrangePi Plus 2 + SATA  (0) 2017.10.02
OrangePi 에 Telegram Bot 구축하기  (0) 2017.09.16
OrangePi Fan on GPIO  (0) 2017.09.15
U+ 공유기 포트포워딩 문제  (0) 2017.09.09

+ Recent posts