Netsarang의 Xshell, Xftp 는 개인/학교 사용자의 경우 무료로 사용할 수 있다.

무료 버전과 유료 버전의 차이 점은 동시에 열 수 있는 shell 의 갯수의 제한 정도라고 하는데,

Xshell 과 Xftp만 무료이기 때문에, 유료로 구매하지 않으면 Xmanager(X11 포워딩) 을 사용할 수 없다.


따라서, Xming을 사용하여 X11 포워딩을 설정하여 사용한다.

(Xming 또한 무료)


Xming은 SourceForge.net에서 다운 받을 수 있다.


Xshell 실행 후 

파일 - 열기 - 세션 등록정보 에서

SSH - 터널링 의 X11 포워딩을 아래와 같이 설정해 주면 된다.

* 출처: https://www.netsarang.com/tutorial/xshell/2779/Using_X11_forwarding


혹은 Xshell 기본 세션 정보에서 수정하면, 기본 설정으로 X11 Forwarding 을 localhost:0.0으로 수정할 수 있다.

기본 세션 정보는 일반적으로 C:\Users\<User_name>\Documents\Netsarang Computer\Xshell\6\Xshell\Sessions\default 에 위치한다.

파일을 열어 

ForwardToXmanager=1 을

ForwardToXmanager=0 으로 수정한다.


Xming 으로 X11 포워딩 시 Xming이 사전에 실행되어 있어야 한다.

윈도우 시작프로그램으로 등록하는 것도 한 방법!


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

PhantomJS Installation on Ubuntu from source  (0) 2018.12.10
Linux screen  (0) 2018.09.27
Memtester  (0) 2018.07.15
Ctags  (0) 2018.07.03
scp  (0) 2018.05.29

라즈베리파이 등을 사용할 때, Root Filesystem의 size가 실제 SD 카드의 사이즈 보다 작게 인식 되는 경우가 있다.

라즈베리 파이의 경우에는 raspi-config를 사용하여 resize 할 수 있지만,

일반적인 Command를 사용해서 resize 하는 방법은 아래와 같다.

해당 과정 중에 문제가 생기는 경우 Kernel panic으로 다시 살릴 수 없기에 SD카드를 백업해 둘 것을 추천한다.

 - 백업은 win32 DiskImager로 Read 하면 이미지로 백업 가능. 추후 write로 복원


1. 현재 partition 확인

fdisk 로 device 정보 확인 후,

$ fdisk -l


해당 디바이스의 사이즈가 실제 디바이스의 사이즈보다 작은 경우

partition table을 다시 작성해준다.

이 때, partition table Start sector를 확인해 둔다.

$ fdisk /dev/mmcblk0


우선 기존의 작게 인식되는 partition을 삭제해 준다.

Command (m for help): d

Partition number (1,2, default 2): 2


새로 partition을 추가 한다.

이때, start sector가 위에서 확인한 기존 partition table과 일치해야 kernel panic이 나지 않을 것이다.

Command (m for help): n

Partition type

p    primary (1 primary, 0 extended, 3 free)

e     extended (container for logical partitions)

Select (default p): p

Partition number (2-4, default 2): 2

First sector (2088450-31116287, default 2088960): 2088450

Last sector, +sectors or +size{K,M,G,T,P} (2088450-31116287, default 31116287): 


작성된 partition table을 저장 하고 종료한다.

Command (m for help): w


현재 사용 중인 시스템에서는 partition table을 다시 작성한 것이 재부팅 후에 인식이 되므로, 시스템을 재부팅 해준다.

$ shutdown -r now


재부팅 된 시스템에서, partition 사이즈가 제대로 인식이 되는지 확인한다.

$ fdisk -l


제대로 인식이 됐다면, resize를 해준다.

$ resize2fs /dev/mmcblk0p2


끗.

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

Rasbian qbittorrent-nox installation  (0) 2019.11.19
SD card image backup  (0) 2018.10.12
RaspberryPi Remote Desktop Client  (0) 2018.06.01
Raspbian Korean(Hangul) Install  (0) 2018.05.18
Raspbian Install  (0) 2018.05.16

wget 등 사용 시 Progress가 프린팅 된다.

Carriage return(\r) 과 fflush를 활용하면 이쁘게 Progress를 print 할 수 있다.


percent = (float)i*100/(MEM_SIZE/sizeof(int));

printf("\r[");

for(j=0; j<50; j++){

if(j<(int)percent/2)

        printf(">");

else

printf(" ");

}

printf("]%.2f%%",percent);

fflush(stdout);


'Programming > C Language' 카테고리의 다른 글

Check the system's Endianness  (0) 2019.04.23
static  (0) 2018.07.13
가변 인자(variable arguments) stdarg.h  (0) 2017.12.11
extern  (0) 2017.06.21
static  (0) 2017.06.20

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

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

일반적으로 C언어에서, 지역 변수는 함수 내에서 존재하고, 함수가 종료되는 시점에 사라지게 된다.

이때 사라지지 않고 기존의 값을 보존하게 하기 위한 keyword 가 static 이다.


static keyword를 사용하면, 지역 변수가 함수 종료 때 사라지지 않고, 값을 보존하게 된다.


주의!!! static은 전역 변수에서 사용하여, 다른 파일에서 extern 해서 사용할 수 없다.

'Programming > C Language' 카테고리의 다른 글

Check the system's Endianness  (0) 2019.04.23
C progress printing  (0) 2018.08.07
가변 인자(variable arguments) stdarg.h  (0) 2017.12.11
extern  (0) 2017.06.21
static  (0) 2017.06.20

Verilog에서 보다 깔끔하면서 configurable 한 코드를 만들기 위해 generate 문을 활용할 수 있다.

일반적으로 자주 사용하는 문법은 아니지만, 긴 코드를 작성할 때 유리하다.


generate 문은 일반적인 verilog 문법과는 다르게, pre-compile 된다고 이해하면 쉽다.

(C언어에서의 전처리기 명령어(#define 등)와 비슷하다.)


generate 문에는 아래와 같이 2가지 종류가 있다.

1. generate loop

일반적으로 verilog에서는 for 문을 사용하지 않는다. Verilog에서 사용하는 for 문은 사실 generate 문의 일부이다.

loop index는 genvar로 선언하여야 하며, generate loop 내에서 선언된 wire 등은 loop iteration 간의 충돌이 일어나지 않는다.(local 변수로 이해하면 된다.)

genvar idx;

generate

for(idx = 0; idx < 3; idx = idx + 1) begin : gen_inst

wire w1, w2;

assign w1 = in1[idx] & in2[idx];

assign w2 = in1[idx] | in2[idx];

assign out[idx] = w1 & w2;

end

endgenerate

위의 코드는 아래와 같다.

wire gen_inst[0].w1, gen_inst[0].w2;

assign gen_inst[0].w1 = in1[0] & in2[0];

assign gen_inst[0].w2 = in1[0] | in2[0];

assign out[0] = gen_inst[0].w1 & gen_inst[0].w2;

wire gen_inst[1].w1, gen_inst[1].w2;

assign gen_inst[1].w1 = in1[1] & in2[1];

assign gen_inst[1].w2 = in1[1] | in2[1];

assign out[1] = gen_inst[1].w1 & gen_inst[1].w2;

wire gen_inst[2].w1, gen_inst[2].w2;

assign gen_inst[2].w1 = in1[2] & in2[2];

assign gen_inst[2].w2 = in1[2] | in2[2];

assign out[2] = gen_inst[2].w1 & gen_inst[2].w2;

2. if-generate / case-generate

if-generate와 case-generate는 코드에는 등장하지만, 조건에 따라서 실제 synthesis 되지 않는 코드를 말한다.

간단히 이해하기로는, parameter 등 constant 한 값에 의한 if / case 문에서 해당될 수 없는 구문은 애초에 없는 코드로 생각하면 된다.


주의 사항

 - generate 문은 generate 와 endgenerate 사이로 구성할 수 있으나 사실 이는 필수는 아니다.

 - generate 문은 named / unamed 둘 다 가능하나, named로 사용하는 편이 좋다.


참조: http://www.verilogpro.com/verilog-generate-configurable-rtl/

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

AXI FIFO  (0) 2020.02.13
AXI Register Slice  (0) 2020.02.12
Xilinx bootgen  (0) 2017.06.21
Xilinx SDK disable cache  (0) 2017.06.12
Xilinx Vivado IP import  (0) 2017.05.31

Linux 에서 여러 파일 간의 코드 연결을 보고자 할 때, Ctags를 활용 할 수 있다.


설치

$ sudo apt-get install ctags


태그 생성

$ ctags -R


명령어(Vim 사용 중)

 - 커서 + Ctrl + ] : 커서 위치의 tag로 이동(push to stack)

 - :ts : tag stack 확인

 - Ctrl + t : Pop stack

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

Xshell + Xming  (0) 2018.09.10
Memtester  (0) 2018.07.15
scp  (0) 2018.05.29
Systemd Service  (0) 2018.05.04
Linux tar, gz, bz2  (0) 2018.04.25

Ubuntu에서 Remote Desktop Client를 써 봤을 때, 매우 만족했었다.

해당 Remote Desktop Client는 Remmina인데,

Raspbian에서도 설치가 가능하다.


설치는

$ sudo apt-get install remmina


사용법은

$ remmina

윈도우 접속 하고자 하는 경우: RDP 선택 후, IP 입력하면 연결 할 수 있다.


라즈베리 파이로 돌리기에는 다소 버거울 수 있지만, 

그래도 없는 것 보다는 낫지 않을까...?하는 마음으로 켜봤는데

예상보다 훨~~씬 빠르다!!! 오히려 라즈베리파이 데스크톱 보다 빠른 느낌...?

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

Rasbian qbittorrent-nox installation  (0) 2019.11.19
SD card image backup  (0) 2018.10.12
SDcard Partition Resize  (0) 2018.08.21
Raspbian Korean(Hangul) Install  (0) 2018.05.18
Raspbian Install  (0) 2018.05.16

Linux 상에서 다른 서버의 파일을 복사해 오고자 하는 경우

scp 명령어를 활용할 수 있다.


scp 명령어는 cp와 문법이 비슷하다.

$ scp <user_id>@<ip_addess_of_source>:/<file> <user_id>@<ip_address_of_dest>:/<file_name>

scp 명령어를 사용하는 서버로(부터) 옮기고자 하는 경우에는 <user_id>@<ip_address>:를 생략 할 수 있다.


scp 명령어를 사용할 때 password를 포함하게 하는 방법

$ sshpass -p '<PASSWORD>' scp <user_id>@<ip_addess_of_source>:/<file> <user_id>@<ip_address_of_dest>:/<file_name>

※ 이렇게 사용하면 PASSWORD가 드러날 수 있으니 보안에 취약하다는 점을 유념하자.

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

Memtester  (0) 2018.07.15
Ctags  (0) 2018.07.03
Systemd Service  (0) 2018.05.04
Linux tar, gz, bz2  (0) 2018.04.25
Linux HDD mount  (0) 2018.04.06

+ Recent posts