레이블이 rust인 게시물을 표시합니다. 모든 게시물 표시
레이블이 rust인 게시물을 표시합니다. 모든 게시물 표시

automated version pull request

js package.json 이나 rust cargo.toml 등에 소스파일에 version 을 명시하는 언어가 있다.
참고로 golang 소스파일에 버전을 명시하지 않는것이 관례라고 한다.
기능 개발을 하고 버전 태깅전에 별도로 소스 버전(package.json 등)수정하기 위해 브랜치 체크아웃 > commit > push > pr > merge 과정을 거쳐야하는데 불편하다.

[해결방법]
메인 브랜치에 커밋이 쌓이면 도구가 자동으로 release pr 을 생성한다.
(주의) 커밋 메시지는 conventional-commits(https://www.conventionalcommits.org)이 아니면 파싱이 실패하고 release pr 이 생성이 안된다.

1. git tag에서 최신 버전 확인 (예: v1.2.3)
2. 그 tag 이후의 conventional-commits를 분석해 버전 자동 결정
- fix: v1.2.4 (patch)
- feat: v1.3.0 (minor)
- feat!: / BREAKING CHANGE v2.0.0 (major)
3. release pr 생성(package.json 버전 업데이트 + CHANGELOG.md 작성 포함)

.github/workflows/release-please.yml 에 다음과 같이 사용
on:
  push:
    branches:
      - main

permissions:
  contents: write
  pull-requests: write

jobs:
  release-please:
    runs-on: ubuntu-latest
    steps:
      - uses: googleapis/release-please-action@v4
        with:
          # 프로젝트의 언어 타입을 지정 (node, rust, go, python 등)
          release-type: node

github action 을 사용할 수 없는 환경이라면 다음과 같이 cli 로 실행하면 된다.
# bunx: npm 레지스트리에서 패키지를 임시 다운로드 후 바로 실행하는 기능입니다.(npx와 동일)
# --release-type : 프로젝트의 언어 타입을 지정 (node, rust, go, python 등)
# --api-url : 기업 github 사용시 별도 설정 필요
# --graphql-url : 기업 github 사용시 별도 설정 필요
bunx release-please release-pr \
    --repo-url=ysoftman/aaa \
    --target-branch=main \
    --release-type=node \
    --token="$GITHUB_TOKEN"

[참고]
이건 rust 전용으로 머지된 커밋을 확인하여 어떤 crate가 변경되었는지 분석해서 cargo.toml의 버전을 업데이트하고 의존성 버전을 맞춘 pr 을 생성한다.
머지 시 crates.io 배포까지 할 수 있다.

이건 개발자가 태그 생성하면 자동으로 빌드 및 파일 업로드해준다.

qsv toolkit

rust csv cli 툴들이 요렇게 있는데 qsv 가 기능이 다양하다.
https://github.com/burntsushi/xsv (유지보수 종료, readonly)
https://github.com/medialab/xan (excel 파일 지원 안함)
https://github.com/dathere/qsv (sql, csv, excel 지원 및 다양한 데이터 처리 기능)

# 설치
brew install qsv
# 또는
cargo install qsv

# excel -> csv 로 변환(csv 에 대해서 데이터 처리 가능)
qsv excel input.xlsx > output.csv

# name 필드가 ysoftman 인 레코드들 중
# pass 필드가 Y 인 레코드들 중
# id,hostname 필드(컬럼)만 조회
# table 로 컬럼 정렬
qsv search -s "name" "ysoftman" output.csv | qsv search -s "pass" "^Y$" | qsv select "id,hostname" | qsv table

# 뷰어(?: help, /: 검색)
qsv lens output.csv

# 테이블 출력
qsv table output.csv

# 필드명(header names)만 조회
qsv headers output.csv

# 구분자, 필드명등의 메타 데이터 확인
qsv sniff output.csv

# qsv edit <파일> <컬럼> <행번호> <새값>
# -i, --in-place 파일 바로 수정 (.bak 로 백업)
qsv edit -i output.csv myval 0 newval

# qsv replace <패턴> <대체값> <파일>
# -o 결과 저장파일
qsv replace "apple" "lemon" output.csv -o result.csv

rust incompatible architecture error

# 맥 m1 에서 cargo 로 coreaudio-sys 를 사용하는 패키지들을 설치시 컴파일에서 다음과 아키텍쳐 에러가 발생했다.
cargo install scope-tui termusic termusic-server
... 생략 ...
error: failed to run custom build command for `coreaudio-sys v0.2.17`
... 생략 ...
 '/opt/homebrew/Cellar/llvm/20.1.7/lib/libclang.dylib' (mach-o file, but is an incompatible architecture (have 'arm64', need 'x86_64')

# brew 설치한 rustc 외 cargo bin에 rustc 가 있고 이걸 우선 사용하게 되어 있었고
which -a rustc
/Users/ysoftman/.cargo/bin/rustc
/opt/homebrew/bin/rustc

# 다음과 같이 확인해 보니 rustc 가 x86_64 기준으로 설치되어 있었다.
~/.cargo/bin/rustc -vV
rustc 1.88.0 (6b00bc388 2025-06-23)
binary: rustc
commit-hash: 6b00bc3880198600130e1cf62b8f8a93494488cc
commit-date: 2025-06-23
host: x86_64-apple-darwin
release: 1.88.0
LLVM version: 20.1.5

# ~/.cargo 의 rust 를 삭제하자.(~/.cargo 를 모두 삭제하게 된다.)
rustup self uninstall

# rust 를 새로 설치하자.(~/.cargo 등의 경로가 생성된다.)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# 이제 다시 확인해보면 aarch64(arm64) 로 보이고 문제가 됐던 툴도 제대로 컴파일/설치 된다.
~/.cargo/bin/rustc -vV
rustc 1.88.0 (6b00bc388 2025-06-23)
binary: rustc
commit-hash: 6b00bc3880198600130e1cf62b8f8a93494488cc
commit-date: 2025-06-23
host: aarch64-apple-darwin
release: 1.88.0
LLVM version: 20.1.5

typos

# 소스에서 (영문)오타를 찾아보자.(git-cliff 에서도 사용)
# 설치
brew install typos-cli

# typos.toml 에 오타 대상 제외 설정하기

# 오타 보기
typos

# 대상 단어 보기
typos --words

# 대상 식별자 보기(snake_case,CamelCase등으로 구분)
typos --identifiers

git-cliff and git commit template

# git-cliff 로 커스텀한 changelog 를 생성할 수 있다.
https://github.com/orhun/git-cliff
# 설치
brew install git-cliff

# 이제 git-cliff 또는 git cliff 명령을 사용할 수 있다.
# 설정파일(cliff.toml) 생성
git cliff --init

# cliff.toml 에서 사용하는 template 엔진 tera 사용방법
# https://www.conventionalcommits.org 포맷을 사용하지 않으면 다음 2개의 설정을 비활성화 해야 커밋 메시지 파싱을 할 수 있다.
vi cliff.toml
[git]
conventional_commits = false
filter_unconventional = false

# changelog 생성
# stdout 출력
git cliff

# CHANGELOG.md 파일로 출력
git cliff -o CHANGELOG.md

# 버전명시(v 로시작하는 것은 자동 cliff.toml에서 trim 처리)
# 버전명시 하지 않으면 [unreleased] 로 표시된다.
git cliff -o CHANGELOG.md -t v1.0.0

# 현재 태그에 대한 변경사항만 생성(새 태그 버전에서의 변경 사항만 파악할때 유용)
git cliff -o CHANGELOG.md --current

# v0.0.1 이후 HEAD까지의 변경사항 파악
git cliff v0.0.1..HEAD

# 특정 커밋(hash)부터 HEAD까지의 변경사항 파악
git cliff 4c7b043..HEAD
# 또는
git cliff 4c7b043..

#####

# commit 메시지 템플릿 적용 및 체크
# 참고 ~/.git/hooks 에 각종 hook sample 파일이 있다.
# hook 파일들도 푸시해서 관리하기 위해서 별도 hookPath 를 설정
git config core.hooksPath .githooks

# commit_message_template.txt 내용으로 커밋 메시지 생성
# 템플릿 파일 설정
git config commit.template .githooks/commit_message_template.txt

# git commit 실행시 처리 순서
1. pre-commit 에서 커밋 파일 체크
설정 파일 참고 https://github.com/ysoftman/test_code/blob/master/.githooks/pre-commit

2. prepare-commit-msg 에서 커밋 메시지 처리할 내용
3. (vim 으로) 커밋 메시지 작성

4. commit-msg 에서 메시지 규칙 체크

vector certificate verify failed

# k8s 내부 인증서(apiserver,apiserver-etc-client...)를 업데이트 했다.

# vector daemonset 재시작했는데 vector pod error log 가 다음과 같이 발생한다.
# 에러 로그가 많아서 dump 로도 확인이 된다. 
kubectl cluster-info dump | rg -i error

2024-05-17T02:38:08.766363Z  WARN vector::kubernetes::reflector: Watcher Stream received an error. Retrying. error=InitialListFailed(HyperError(hyper::Error(Connect, ConnectError { error: Error { code: ErrorCode(1), cause: Some(Ssl(ErrorStack([Error { code: 167772294, library: "SSL routines", function: "(unknown function)", reason: "certificate verify failed", file: "ssl/statem/statem_clnt.c", line: 2092 }]))) }, verify_result: X509VerifyResult { code: 26, error: "unsuitable certificate purpose" } })))
2024-05-17T02:38:35.158930Z ERROR kube_client::client::builder: failed with error error trying to connect: error:0A000086:SSL routines:(unknown function):certificate verify failed:ssl/statem/statem_clnt.c:2092:: unsuitable certificate purpose

# vector 는 kubernetes_logs 를 소스로 하고 있고
# k8s 접근하기 위해서 인증과정을 거치게 되는것 같다.
# kube_config_file 로 kube config 파일을 명시하는 옵션이 있는데 사용하지 않아
# 디폴트로 in-cluster configuration 로 설정된다.

# vector 에서 사용하는 kube client rust 소스(go 소스도 같다.)에 다음과 같은 경로의 인증서를 참고 하는것 같다.
// Mounted credential files
const SERVICE_TOKENFILE: &str = "/var/run/secrets/kubernetes.io/serviceaccount/token";
const SERVICE_CERTFILE: &str = "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt";

# vector pod 에도 다음과 같이 mount 설정이 있다.
spec:
  containers:
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: kube-api-access-l82p5
      readOnly: true
  volumes:
  - name: kube-api-access-l82p5
    projected:
      defaultMode: 420
      sources:
      - serviceAccountToken:
          expirationSeconds: 3607
          path: token
      - configMap:
          items:
          - key: ca.crt
            path: ca.crt
          name: kube-root-ca.crt
      - downwardAPI:
          items:
          - fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
            path: namespace

# kube-root-ca.crt 는 모든 namespace 의 configmap 에 등록되어 있다.
# 확인 결과 ca.crt 문제는 아니였고 master 노드의 /etc/kubernetes/ssl/apiserver.crt 인증서 문제로 인증서를 변경하니 에러가 발생하지 않았다.

code editors

유료 IDE/editor 가 사용하기도 편하고 기능도 많지만 터미널 환경 + 무료 소프트웨어도 왠만한건 다되고 유료 못지 않게 편해서 이를 더 선호하는 편이다.
유료 에디터는 10년전 윈도우 환경 개발을 위해서 visual studio 사용이 마지막인것 같다.
요즘 많이 쓰는 jetbrains 제품은 사용하지 않는다.

예전에는 vscode 를 한참 썼는데 typescript/javascript 로 만들어서 그런지 뭔가 점점 무거워지고 느린 느낌이 들어 다시 vim 을 주로 사용하게 됐다.
neovim(nvim) 이 좀더 모던한 느낌이긴 한데 기존 vim 커스터마이징한 설정에 익숙해서 쉽게 nvim 으로 넘어가지 못하고 있다.
그러면서 가끔 vscode, neovim-lzayvim 의 command palette(커맨드를 검색해서 실행하는) 기능이 그리워 질때가 있다.

vscode 느낌이면서 가볍고 빠른 rust 로 다음 에디터들을 서브로 사용해 보려 한다.
참고로 요건 vim 에 영감을 받은 터미널 환경의 에디터들, amp는 요즘 관리가 안되고 있어 왠지 사라질것 같다.

zed, lapce 둘다 깃헙 좋아요가 30K 가 넘고, vscode 처럼 커맨드 팔렛트, 익스텐션(아직 개수는 많지 않음)을 사용할 수 있어 좋다.

아톰 만든 사람이 rust 로 만들었다는 zed
cmd+shift+p -> toggle vim mode

lapse 는 디폴트 단축키들이 vscode 많이 비슷해서 최종 낙점!ㅎ
[lapse default short cut]
cmd+shift+p -> enable modal editing (like vim)
cmd+shift+e toggle file explorer
cmd+shift+x toggle plugin focus
cmd+shift+f toggle search focus
cmd+= zoom in
cmd+- zoom out
cmd+] indent line  
cmd+[ outdent line
cmd+p goto file(fuzzy file finder)
alt+up move line up
alt+down move line down
ctrl+- jump location backward
ctrl+shift+- jump location forward
ctlr+` toggle terminal
alt+shift+i insert cursor end of line(multi cursor)
f2 rename
f12 goto definition

rust unstable library error

# wsl 환경에서 cargo 로 bat 설치(빌드)시 
cargo install bat

# 다음과 같은 에러가 발생한다.
error[E0658]: use of unstable library feature 'is_terminal'
/home/ysoftman/.cargo/registry/src/github.com-1ecc6299db9ec823/grep-cli-0.1.8/src/lib.rs:238:23
std::io::stderr().is_terminal()

# rust 버전은 다음과 같다.
rustc --version
rustc 1.66.1 (90743e729 2023-01-10) (built from a source tarball)

# 메시지의 링크를 보면 이슈가 있다.

# unstable 상태가 에러가 아니라면 계속 진행하는 옵션을 줘도 실패한다.
cargo install -Z unstable-option --keep-going bat

# mac 에선 cargo 로 bat 설치시 똑같은 grep-cli v0.1.8 버전을 사용해 빌드하는데 잘된다.
# mac 에 설치된 grep-cli library 버전
cargo search grep-cli
grep-cli = "0.1.8"    # Utilities for search oriented command line applications.

# rustup 을 설치해서 rustc/cargo 버전을 올려보자.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# cargo 가 제대로 동작하지 않는다면 다음과 같이 삭제 후 재설치한다.
rustup uninstall stable && rustup install stable

# 최신 버전 확인
cargo --version
cargo 1.71.0 (cfd3bbd8f 2023-06-08)

# 이제 빌드 에러 없이 설치된다.
cargo install bat

zellij multiplexer

# terminal multiplexer 로 tmux 만 사용하다 rust 로 만든 zellij 로 변경했는데, 역시 기대 이상으로 대만족!
# 더이상 tmux 가 생각나지 않을 정도로 좋다.

# 설치
# mac
brew install zellij
# cargo
cargo install zellij

# 자주 사용하는 단축키
# 기본적으로 아래 화면에 친절하게 단축키 설명이 있어 쉽게 사용할 수 있다.
# ctrl+b : 기본적인 tmux split(ctrl+", ctlr+%)등을 사용할 수 있다.
# ctrl+g : zellij 단축키 입력 비활성화(토글), 예를 들어 ctlr-t 로 fzf 단축키를 사용하고 싶은데 zellij 의 ctrl-t(tab 선택) 명령이 우선 작동하는데, ctrl-g 를 zellij 단축키를 비활성화한후 ctrl-t 를 하면 fzf ctrl-t 커맨드를 실행할 수 있다.
# ctrl-p : pane 선택
# ctrl-p, n : 새 pane 생성 
# ctrl-p, w : floating pane 생성, floating/일반 pane 사이 전환(토글)
# ctrl-p, x : 현재 pane 종료
# ctrl-p, z : pane frame 보이기/감추기(토글)
# ctrl-t, n : 새 tab 생성
# ctrl-t, x : 현재 tab 종료(tab 에 속한 모든 pane 종ㄹ)
# ctrl-t, ctrl-s : tab 에 속한 모든 pane 에 sync 로 동시 입력 가능(토글)
# ctrl-h, 방향키 또는 hjkl(vim방향키) : pane 을 특정 방향으로 이동
# ctrl-n, 방향키 또는 hjkl(vim방향키) : pane 크기를 특정 방향으로 줄이거나 늘이기
# ctrl-n, - : pane 크기를 전체적으로 줄이기
# ctrl-n, + : pane 크기를 전체적으로 늘이기
# alt-p : 적절한 위치와 크기로 pane 생성
# alt-h : 왼쪽 pane 으로 이동(선택), 다른 tab 의 pane 까지 이동 가능
# alt-l : 오른쪽 pane 으로 이동(선택), 다른 tab 의 pane 까지 이동 가능
# alt-k : 위 pane 으로 이동(선택)
# alt-j : 아래 pane 으로 이동(선택)

# 설정 파일
# 기본 설정 파일을 생성해 ~/.config/zellij/config.yaml 로 위치시키면 된다.
# config.yaml 수정으로 단축키 설정을 변경할 수 있다.
mkdir -p ~/.config/zellij/
zellij setup --dump-config > ~/.config/zellij/config.yaml

# 테마 변경
mkdir -p ~/.config/zellij/themes
https://github.com/zellij-org/zellij/tree/main/example/themes 에서 테마 마들을 다운로드 받는다.
~/.config/zellij/config.yaml > theme 필드값을 수정

Alacritty terminal emulator

terminal emulator 는 맥에서 iterm2 를, 윈도우에서는 자체 terminal 를 쓰고 있었다.

여담이지만 윈도우에서는 microsoft(마소) terminal 나오기전까지 hyper 를 썼었다.
오픈소스라 좋았지만 자잘한 버그도 꽤있었다. 마소 오픈소스로 terminal(스타수 69K , 2020-11기준)을 내놓은건 정말 잘한것 같다.

여러 터미널 예뮬레이터가 중 아직 0.5 버전이지만 스타수가 27k(2020-11기준)나 되고 
GPU Acceleration 으로 아주 빠르다는 alacritty 를 사용하게 됐다.
사실 rust 로 만들었다고 해서 더 끌렸는데, 
사용중인 ripgrep, fd, bat 등의 rust 로 만든 프로그램들이 아주 좋기 때문이다.

맥(catalina 버전)에서 brew 또는 cargo 또는 깃헙에 올려둔 Alacritty-v0.5.0.dmg 릴리즈 파일을 설치 후 실행하면 다음과 같은 에러가 발생한다.

이때는 system preferences > security & privacy > allows apps download from > app store and identified developers 로 선택한다.

설치하기
직접 클론 받아 빌드 & 설치하는 경우
cd alacritty
make app && make install

빌드 바이너리를 사용하는 경우, 아래 URL 에서 다운받으면 된다.

alacritty 깃헙에서 alcritty.yml 설정 파일을 ${HOME}/.alcritty.yml 로 위치시키고
폰트, 컬러, 크기등을 입맛에 맞게 설정해 저장하면 즉시 반영돼 보인다.

#####

alacritty vs iterm2 (GPU rendering 활성화)
성능 비교를 위해 다음 명령으로 수행시간을 측정했다.
time tree /usr

user+system 수행 시간 자체는 비슷하지만 화면에 뿌려지는 시간 차이가 난다.
alacrityy = 28 s
iterm2 = 35 s

time seq 1 1000000

seq 로 숫자 출력되는 속도도 alacritty 가 빠르다.
alacritty = 1.200 s
iterm2 = 4.156 s

터미널 화면을 크게 하고 cacademo 플레이 했을때도 iterm2 는 많이 끊기는데,
alacritty 는 매끄럽게 재생된다.(이건 fps 결과가 없어 직접 눈으로 체감해봐야 한다.)

역시 rust == fast 다. alacritty 터미널 화면 출력에서 확실히 빠른게 체감된다.
CPU 를 많이 쓰긴 하지만 빠른 화면 출력이 맘에 들고 폰트,컬러등 화면도 잘 나와 iterm2 보다 alacritty 를 주로 사용할것 같다.
(추가로 윈도우에서도 위 테스트를 해봤는데, terminal 더 빠르다. 윈도우에서는 terminal 을 주로 사용)

#####

디폴트 단축키
마우스 클릭으로 URL 오픈시 
iterm2: cmd+click
alacritty: shift+click

마우스 클릭으로 블럭(단어) 선택시
iterm2: alt+double-click
alacritty: shift+double-click

마우스 클릭으로 라인전체 선택시
iterm2: alt+triple-click
alacritty: shift+triple-click

#####

윈도우 환경
설정파일 위치
%APPDATA%\alacritty\alacritty.yml

wsl(windows subsystem for linux) 실행
alacritty -e wsl

rust cli tools


####

# rust 관련 유용한 사이트
https://rinthel.github.io/rust-lang-book-ko/ch00-00-introduction.html -->  한국어본 (최신판은 아니지만 한글이라 보기 편함)
https://play.rust-lang.org/  --> 테스트 해볼 수 있는 사이트
https://github.com/Dhghomon/easy_rust/  --> 러스트 강의 유튜버
https://www.youtube.com/watch?v=aW7wK4-2Dwc&list=PLdvEO-IMMcPvfiBkVwgIwDf4AuTjI2aeG  --> 간단하게 핵심만 보기(빠르게 파악 가능)
https://github.com/rust-unofficial/awesome-rust  --> 유명한 rust 코드/앱

chrome ERR_CONNECTION_RESET

rust 로 간단한 html 응답을 주는 웹 서버를 만들어 테스트하기 위해 chrome 에서 다음과 같이 입력하면 화면에 아무것도 나타나지 않는다.
chrome secret 모드에서도 안된다.
https://localhost:9090

같은 주소에 대해서 firefox 는 표시된다.
curl http://localhost:9090/ 요청도 html 응답을 받고 있다.
rust 서버에서 http request/response 출력해보면 응답도 잘 주고 있다.

chrome 79.0.3945.117 버전을 사용하는데,
chrome 개발툴 -> network 요청결과 status fail 이고,
chrome 개발툴 -> console 에는 다음과 같은 에러가 보인다.
GET http://localhost:9090/ net::ERR_CONNECTION_RESET 200 (OK)
맨 오른쪽 :9090/:1 링크를 클릭하면 그제야 html 화면이 보인다.

vscode rust language server 문제

# vscode 에서 RLS(rust language server) 플러그인을 사용한다.
https://marketplace.visualstudio.com/items?itemName=rust-lang.rust

# 그런데 상태 바에 RLS starting 계속 진행중이되면서
# formatting, completion 등이 동작하지 않는다.
# 원인은 cargo 로 생성한 여러 프로젝트들을 하나의 vsocde 에서 열게 되서 발생한것이다.
# 현재는 RLS 가 동작하려면 vscode 의 최상위(root)위치에 cargo.toml 이 있어야 한다.
# 해당 이슈는 현재 수정 중으로 좀더 있으면 개선 될것 같다.
https://github.com/rust-lang/rls-vscode/pull/601

# 참고로 단순히 하나의 프로젝트만 vscode 로 열면 잘 동작한다.
# 그리고 이때 RLS 설치가 되면 다시 멀티 프로젝트를 열었을때
# 빌드 등은 안되지만 formatting, completion 등은 작동한다.

Prev