GitLab CE 비밀번호 초기화 (v12)

  • GitLab 서버에 SSH로 접속
$ ssh your_username@your_gitlab_server_ip

  • GitLab 레일즈 콘솔 실행: Omnibus 패키지로 설치된 경우, 다음 명령어를 사용하여 레일즈 콘솔을 실행합니다.
$ sudo gitlab-rails console -e production

  • 사용자 검색 및 비밀번호 재설정: 레일즈 콘솔에서 사용자 계정을 검색하고 비밀번호를 재설정합니다.
user = User.find_by(username: 'your_username') # 또는 email로 검색 가능: User.find_by(email: 'your_email@example.com')
user.password = 'new_password'
user.password_confirmation = 'new_password'
user.save!

  • 콘솔 종료: 비밀번호 재설정이 완료되면 레일즈 콘솔을 종료합니다.
exit

GitLab에 로그인: 새로 설정한 비밀번호로 GitLab에 로그인합니다.

카테고리: Tip & Tech, 미분류 | 태그: , | 댓글 남기기

프로그램 실행 과정

1. C 파일이 실행 파일로 변환되는 과정

A. 전처리 : Preprocessor / cpp

전처리기 지시문을 처리합니다. 예를 들어, #include, #define 등이 처리됩니다.

## main.c (C 소스 파일) => main.i (전처리된 파일)
$ gcc -E main.c -o main.i

B. 컴파일 : Compiler / cc1/cc1plus

전처리된 파일을 분석하여 어셈블리 코드로 변환합니다.

## main.i (전처리된 파일) => main.s (어셈블리 코드 파일)
$ gcc -S main.i -o main.s

C. 어셈블리 : Assembler / as

어셈블리 코드를 더 잘개 쪼개서 기계어 인스트럭션 단위로 만들고, 이것들을 모아 목적 파일을 생성합니다.

## main.s (어셈블리 코드 파일) => main.o (목적 파일)
$ gcc -c main.s -o main.o

D. 링크 : Linker / ld

여러 목적 파일과 라이브러리를 결합하여 실행 파일을 생성합니다.

## main.o (목적 파일) => main (실행 파일)
$ gcc main.o -o main

2. 프로그램 실행

A. 실행파일 생성 (컴파일)

컴파일러는 소스 코드를 분석하여 각 종류의 데이터를 적절한 세그먼트로 분류

  • Text 세그먼트 : 실행 가능한 기계어 코드를 텍스트 세그먼트로 분류
  • Data 세그먼트 : 초기화된 전역 변수와 정적 변수
    이 값들은 컴파일 시 이미 알려져 있고, 링크 과정에서 해당 세그먼트에 배치
  • BSS 세그먼트: 초기화되지 않은 전역 변수와 정적 변수
    초기화되지 않은 데이터를 위한 공간을 제공
    링크 과정에서 해당 세그먼트에 배치되고 실제 메모리는 프로그램 로드 시 할당

B. 실행 파일 로드

운영 체제의 로더(Loader)가 실행 파일을 스토리지에서 메모리로 적재.
이때, 실행 파일의 헤더 정보를 읽어서 프로그램 실행에 필요한 메모리 구조를 파악

C. 메모리 영역(Segment) 생성 및 맵핑 ★ ★ ★ ★ ★

컴파일러와 링커에 의해 설정된 세그먼트 위치와 크기를 기반으로 실제 메모리 영역을 설정

실행파일에 정의된 대로 메모리에 로드

  • Text (Read Only) : 실행 파일의 기계어 코드
  • Data (R/W) : 초기화된 전역 변수 및 정적 변수
  • BSS (R/W) : 초기화되지 않은 전역 변수 및 정적 변수. 실행 시 0으로 초기화

런타임에 결정

  • Heap (R/W) : 동적 메모리 할당이 이루어지는 영역
    프로그램 실행 중에 malloc, calloc, realloc 등의 함수로 메모리를 할당
  • Stack (R/W) : 함수 호출 시 지역 변수 및 함수 호출 정보(리턴 주소, 매개변수, 지역 변수 등)를 저장, 호출 시 스택 프레임이 생성되고, 함수가 종료되면 스택 프레임이 해제

D. 실행

메모리에 적재된 후, CPU는 Text 세그먼트의 시작 주소에서 프로그램을 실행

  1. 프로그램 시작 : main 함수가 호출되면서 프로그램 실행이 시작
  2. 함수 호출 : 각 함수 호출 시 스택에 스택 프레임이 생성
    스택 프레임에는 함수의 매개변수, 지역 변수, 리턴 주소가 포함
  3. 메모리 할당 : 동적 메모리 할당이 필요한 경우 힙에서 메모리를 할당
  4. 프로그램 종료 : main 함수가 종료되거나 exit 함수가 호출되면, 프로그램 실행이 종료되고 운영 체제는 메모리를 회수

3. 예제

#include <stdio.h>;
#include <stdlib.h>;

int global_var = 10; // Data 영역

void function() {
    int local_var = 20; // Stack 영역
    printf("Local variable: %d\n", local_var);
}

int main() {
    static int static_var = 30; // Data 영역
    int *heap_var = (int *)malloc(sizeof(int)); // Heap 영역
    if (heap_var == NULL) {
        return 1;
    }
    *heap_var = 40;
    printf("Global variable: %d\n", global_var);
    printf("Static variable: %d\n", static_var);
    printf("Heap variable: %d\n", *heap_var);

    function();

    free(heap_var); // Heap 메모리 해제
    return 0;
}
  • global_var와 static_var는 Data 영역에 위치
  • local_var는 Stack 영역에 위치
  • heap_var는 Heap 영역에 위치
  • function과 main 함수의 기계어 코드는 Text 영역에 위치
카테고리: Tip & Tech | 태그: , , | 댓글 남기기

아이폰 카메라 포멧과 다운로드 방법에 따른 사진파일 특성

  • HEIF : High Efficiency Image File Format
  • HEVC : High Efficiency Video Coding
  • heic : High Efficiency Image Container

아이클라우드 웹 iCloud Web

포멧무수정 원본기본 (가장 호환성 높음)
고효율성
High Efficiency
(heic)
크롭/수정사항 미반영
heic 포멧
2048 x 1534 고정
jpeg 포멧
높은 호환성
Most Compatible
(jpeg)
크롭/수정사항 미반영
jpeg 포멧
수정된 해상도 반영
jpeg 포멧
< 카메라 포멧 / iCloud Web 옵션 에 따른 다운로드 받은 사진 특성 >

아이폰 카메라 포맷을 높은 호환성 Most Compatible 으로 설정하여 사용하는게 좋다.

< 고효율성+기본(가장 호환성 높음) vs 높은 호환성+기본(가장 호환성 높음) >

센드애니웨어 Send Anywhere

포멧센드애니웨어 Send Anywhere
고효율성
High Efficiency
(heic)
수정된 해상도 반영
jpg 포멧
높은 호환성
Most Compatible
(jpeg)
수정된 해상도 반영
jpg 포멧
iCloud 기본 옵션과 Binary 수준에서 완전 동일
< 센드애니웨어 Send Anywhere >

고효율성 High Efficiency 으로 설정되어 있어도 수정된 해상도를 반영하여 jpeg 로 변환하여 다운로드 되며, 높은 호환성 Most Compatible 으로 설정 된 경우 iCloud 와 동일한 파일로 다운로드 된다.
보안이 좀 걱정되긴 하지만 센드애니웨어 짱!

카테고리: Tip & Tech | 태그: , , , , , , | 댓글 남기기

Linux 서버에 SFTP 연결이 되지 않을 때

에러메세지 (Aptana Studio 3)

establishing sftp connection failed: no suitable key exchange algorithm could be agreed.

해결방법

  1. sshd_config를 찾아서 파일을 열어본다.
    # vi /etc/ssh/sshd_config
  2. 다음을 적절한곳에 추가한다.
    Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,blowfish-cbc,aes128-cbc,3des-cbc,cast128-cbc,arcfour,aes192-cbc,aes256-cbc
    KexAlgorithms=curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
  3. SSH Restart
    services ssh restart

참조 : https://m.blog.naver.com/PostView.nhn?blogId=na1se&logNo=220479199429

카테고리: Tip & Tech | 태그: , , , | 댓글 한 개

C++ : 참조자 (Reference) 와 포인터 (Pointer)

  • Reference 는 원본에 대한 단지 하나의 별명일 뿐
    • 원본과 Address 가 동일
    • 메모리상에 추가 변수 공간을 할당받지 않음
    • 생성과 동시에 명확한 Target 이 지정되어야 함

추가 정보 : https://gracefulprograming.tistory.com/11

# Source Code

#include <stdio>;

int main() {
	int a = 10;
	int&amp; b = a;
	int* ap = &amp;a;
	int* bp = &amp;b;

	printf("a	%p	%d	%p	%d\n", &amp;a, a, ap, *ap);
	printf("b	%p	%d	%p	%d\n", &amp;b, b, bp, *bp);

	return 0;
}

# Result

A :	0x7ffcc980244c	10	0x7ffcc980244c	10
B :	0x7ffcc980244c	10	0x7ffcc980244c	10
카테고리: Tip & Tech | 태그: , , , | 댓글 남기기

Linux Terminal 의 Tab Size 설정

1. 현재 TAB 간격 확인

$ echo -e "1234567890\t321\n1\t2\n123\t1"
1234567890	321
1	2
123	1

2. TAB 간격 설정

## 4 칸으로 설정
$ tabs -4
카테고리: Tip & Tech | 태그: , , | 댓글 남기기

Bash Script 에서 문자열 변수 조작

https://www.snoopybox.co.kr/1811

구분자 (Delimiter / Split) 이용

  • ${변수명#삭제문자} : 좌측부터 가장 짧게 매칭되는 패턴 삭제
  • ${변수명##삭제문자} : 좌측부터 가장 길게 매칭되는 패턴 삭제
  • ${변수명%삭제문자} : 우측부터 가장 짧게 매칭되는 패턴 삭제
  • ${변수명%%삭제문자} : 우측부터 가장 길게 매칭되는 패턴 삭제
  • 와일드 카드(*, ?) 사용 가능
[root@NETo-c7test01 ~]# AAA="AAABBBCCCBBBDDDAAA"
[root@NETo-c7test01 ~]# echo ${AAA#A*B}
BBCCCBBBDDDAAA
[root@NETo-c7test01 ~]# echo ${AAA##A*B}
DDDAAA
[root@NETo-c7test01 ~]# echo ${AAA%B*A}
AAABBBCCCBB
[root@NETo-c7test01 ~]# echo ${AAA%%B*A}
AAA
  • #*= : 좌측부터 시작해 맨 처음으로 찾은 =까지의 모든 문자 삭제
  • ##*= : 좌측부터 시작해 맨 마지막으로 찾은 =까지의 모든 문자 삭제
  • %=* : 우측부터 시작해 맨 처음으로 찾은 =까지의 모든 문자 삭제
  • %%=* : 우측부터 시작해 맨 마지막으로 찾은 =까지의 모든 문자 삭제
$ rootfs="debian-jessie-armhf-target+gstreamer"

$ echo ${rootfs}
debian-jessie-armhf-target+gstreamer

$ echo ${rootfs%%+*}
debian-jessie-armhf-target

$ echo ${rootfs##*+}
gstreamer

인덱스 이용

  • ${변수명: 시작지점} : 시작지점부터 끝까지 출력
  • ${변수명: 시작지점: 갯수(양수)} : 시작지점부터 갯수 만큼 출력
  • ${변수명: 시작지점: 끝지점(음수)} : 시작지점부터 끝지점 까지 출력
  • 양수 : 좌측부터 또는 갯수
  • 음수 : 우측부터, 빈칸(space) 또는 괄호() 삽입 필수
$ rootfs="debian-jessie-armhf-target+gstreamer" 

$ echo ${rootfs}
debian-jessie-armhf-target+gstreamer

$ echo ${rootfs: 0}
debian-jessie-armhf-target+gstreamer

$ echo ${rootfs: 7: 6}
jessie

$ echo ${rootfs: -9}
gstreamer

$ echo ${rootfs: 7: -10}
jessie-armhf-target

길이

  • ${#변수명} : 변수의 길이 출력
$ echo ${#rootfs}
36
카테고리: Tip & Tech | 태그: , , , , , , | 댓글 남기기

Raspberry Pi 에서 CAN 통신 사용하기 (MCP2515)

CAN Controller Module 준비

카테고리: Tip & Tech | 태그: , , , | 댓글 남기기

Zynq-7000 SoC 에서 CAN 통신 사용하기

의식의 흐름따라 삽질한 순서 기억 나는대로…

1. 목표

Zynq-7000 SoC 사용 장비에서 CAN BUS 를 통해 다른 장비와 통신 가능한 환경 구성

2. 환경

3. 기본 정보

CAN 이란?

Linux 에서 CAN

$ ## CAN Interface 인식 확인
$ ls -al /sys/class/net
$ ifconfig can0

$ ## bitrate 설정 및 활성화 : can0, 250000 bps
$ ip link set can0 up type can bitrate 250000
$ ## or
$  ip link set can0 type can bitrate 250000
$ ifconfig can0 up

## 모든 Interface 의 모든 데이터 출력

$ candump any,0:0,#FFFFFFFF

## can0 / can1 로 수신된 모든 데이터 출력
$ candump can0,0:0,#FFFFFFFF
$ candump can1,0:0,#FFFFFFFF

모든 Interface 의 모든 데이터 출력

$ candump any,0:0,#FFFFFFFF

can0 / can1 로 수신된 모든 데이터 출력
$ candump can0,0:0,#FFFFFFFF
$ candump can1,0:0,#FFFFFFFF

## ID : 545, Message : 02 00 00 00 00 00 00 00
$ cansend can0 545#0200000000000000

## ID : 001, Message : AaBbCcDd (Ascii)
$ cansend can0 001#4161426243634464

$ ifconfig can0 down
$ ip link set can0 type can loopback on
$ inconfig can0 up
$ candump can0 | grep C0FFEE
$ cansend can0 00C0FFEE#00112233445566

Zynq 에서 CAN

1) Zynq 내장 CAN Controller

https://www.xilinx.com/support/documentation/user_guides/ug585-Zynq-7000-TRM.pdf

$ cat ./PetaLinuxProject/subsystems/linux/configs/device-tree/zynq-7000.dtsi
can0: can@e0008000 {
	compatible = "xlnx,zynq-can-1.0";
	status = "disabled";
	clocks = &lt;&amp;clkc 19&gt;, &lt;&amp;clkc 36&gt;;
	clock-names = "can_clk", "pclk";
	reg = &lt;0xe0008000 0x1000&gt;;
	interrupts = &lt;0 28 4&gt;;
	interrupt-parent = &lt;&amp;intc&gt;;
	tx-fifo-depth = &lt;0x40&gt;;
	rx-fifo-depth = &lt;0x40&gt;;
};

can1: can@e0009000 {
	compatible = "xlnx,zynq-can-1.0";
	status = "disabled";
	clocks = &lt;&amp;clkc 20&gt;, &lt;&amp;clkc 37&gt;;
	clock-names = "can_clk", "pclk";
	reg = &lt;0xe0009000 0x1000&gt;;
	interrupts = &lt;0 51 4&gt;;
	interrupt-parent = &lt;&amp;intc&gt;;
	tx-fifo-depth = &lt;0x40&gt;;
	rx-fifo-depth = &lt;0x40&gt;;
};

$ cat ./PetaLinuxProject/subsystems/linux/configs/device-tree/pcw.dtsi
can0 {
	status = "okay";
};
can1 {
	status = "okay";
};

But, CAN Interface 가 정상적으로 활성화 되지 않음!!!

$ ip link set can0 up type can bitrate 250000
xilinx_can e0008000.can can0: bitrate error 0.0%
A link change request failed with some changes committed already. Interface can0 may have been left with an inconsistent configuration, please check.
RTNETLINK answers: No such device

2) 외부 CAN Controller (MCP2515)

http://ww1.microchip.com/downloads/en/DeviceDoc/MCP2515-Stand-Alone-CAN-Controller-with-SPI-20001801J.pdf

$ cat ./PetaLinuxProject/subsystems/linux/configs/device-tree/system-top.dts
spi0 {
/*
	SPI Clock : 10 MHz
	SPI modes : 0,0 and 1,1
	Operates from 2.7V-5.5V
*/

	clocks{
		clk8m: can_oscillator {
			#clock-cells = <0>;
			compatible = "fixed-clock";
			clock-frequency = <8000000>;	//8MHz
		};
	};

	can2: can@0 {
		compatible = "microchip,mcp2515";
		reg = <0>;	//Chip select 0
		clocks = <clk8m>;
		interrupt-parent = <gpio0>;
		interrupts = &lt;70 0x2&gt;;			// EMIO:16, Bare:70, Linux:976 : IRQ_TYPE_EDGE_FALLING
		spi-max-frequency = <10000000>;	// 10MHz
		status = "okay";
	};

	can3: can@1 {
		compatible = "microchip,mcp2515";
		reg = <1>;	//Chip select 1
		clocks = <amp;clk8m>;
		interrupt-parent = <gpio0>;
		interrupts = <71 0x2>;			// EMIO:17, Bare:71, Linux:977 : IRQ_TYPE_EDGE_FALLING
		spi-max-frequency = <10000000>;	// 10MHz
		status = "okay";
	};
};

4. 정리 및 테스트

  1. Zynq 내장 CAN Controller 는 알수없는 이유로 Interface 가 활성화 되지 않는다.
  2. MCP2515 의 Interrupt Pin 을 Zynq 의 Interrupt-Controller (IRQ_F2P) 에 연결시,
    Zynq SPI (Shared Peripheral Interrupts) 의 Edge Type 설정 제약으로 사용 불가
    MCP2515 는 Falling Edge 만 지원
  3. Interrupt Pin 을 Zynq 의 EMIO(GPIO) 로 연결 후 에러없이 CAN Interface 가 활성화 됨
    $ ip link set can0 up type can bitrate 250000
  4. 테스트용 ZIG 와는 통신이 되지 않음
    메세지를 한번 보냈으나 SPI 신호는 꽤 오랜시간동안 반복(Retry) 후 멈춘다.
    추가로 메세지를 보낼 경우 송신 버퍼 에러가 발생 한다.
    임시로 송신 버퍼 크기 늘리면 에러는 사라진지만,
    송신이 안되고 있는 근본 문제는 여전 하다.
    $ sudo ifconfig can0 txqueuelen 1000
  5. Raspberry Pi 에 MCP2515 Module 을 적용한 장치와는 통신이 잘 된다.
  6. 테스트용 JIG 에 종단저항 (120 옴) 추가 후 통신이 잘 된다.
  7. 회선이 불안정 하여 Retry 하다 멈춘 경우,
    CAN Interface 를 재설정 (down / up) 해주어야 복구가 된다.

Raspberry (Sender)
Zynq 사용 보드 (Receiver)
테스트 JIG (Receiver)

카테고리: Tip & Tech | 태그: , , , , , , | 댓글 남기기

SD Card / eMMC 의 CID / CSD Register 읽기

https://goughlui.com/2014/01/02/project-read-collect-decode-sd-card-cid-register-data/

$ cat /sys/block/mmcblk1/device/cid<br>$ cat /sys/block/mmcblk1/device/csd

개발중인 장비에 사용중인 eMMC 의 ECSD Register Field Parameters 를 확인 하고 싶은데 이건 어찌해야 하나…?

The 512-byte extended card-specific data (ECSD) register
Hardware reset function : [162] Byte | 00h
he host can change the properties of modes segments using the SWITCH command.

카테고리: 미분류 | 태그: , , , | 댓글 남기기