Rust에서 속성(Attribute)은 메타데이터로, 컴파일러나 다른 툴에 특정 설정이나 추가 정보를 제공한다. 속성은 크게 두 가지로 나뉜다. 크레이트 레벨 속성 크레이트 전체 또는 모듈 수준에서 적용된다.아이템 레벨 속성 특정 함수, 변수, 구조체 등 개별 아이템에
Rust에서 Windows 환경에서 DLL을 빌드하는 방법을 간단히 설명합니다. cargo new dll_test --lib\--lib을 붙여서 프로젝트를 만들게 되면 위와같이 lib.rs 파일이 생성된다. lib.rs 파일을 빌드하게 되면 rust는 기본적으로 .li
문제점 > json format의 문자열을 만들 때 문자열 중간에 쌍 따움표나 특정 키워드가 있을 때 내부의 모든 문자가 이스케이프 기호를 붙이지 않고 있는 그대로 처리하는 방법을 알고싶음. Raw String 이란? 문자열을 자연스럽게 사용할 수 있도록 도와주는 기
글을 쓰는 이유 > 1. main.rs와 lib.rs의 관계와 rust에서 모듈을 자유롭게 호출하여 사용하는 방법을 정리하기 위함. lib.rs파일에 정의한 모듈을 main.rs에서 불러서 사용하는데 정확한 이해가 없기때문. main.rs와 lib.rs의 이해 두 파
스마트 포인터란? c/c++ 에서는 메모리를 할당 후 해제를 직접해줘야 한다. 스마트포인터를 사용하면 수동으로 메모리를 해제해 줄 필요가 없다. 즉, 안전하게 메모리를 사용할 수 있도록 도와준다. 스마트 포인터에 대해 쉽게 이해할 수 있도록 식당을 예로 들어보겠습니다
dioxus 프레임워크를 공부하며 use dioxus::prelude::\*;가 main.rs에 선언되어 있습니다. dioxus 크레이트의 prelude에 선언되어 있는 모든 모듈을 사용하는 거구나라고 알고는 있지만 정확하게 정리하기 위해서 글을 작성하게 되었습니다.p
rust로 코드를 작성하며 ? 연산자를 통해서 편리하게 에러 핸들링을 할 수 있다. Error 타입이 달라도 컴파일 에러가 발생하지 않는 것을 보고 찾아보니 From trait가 구현이 되어있으면 자동으로 변환이 이루어진다고 한다.From trait에 대해서 자세히 알
rust에서 전역변수 전역 변수는 프로그램 어디에서나 접근할 수 있다. 프로그램을 만들며 최대한 지양 해야하는 부분이라고 생각을 한다. 그러나 어쩔 수 없이 사용해야 하는 경우가 있다. rust에서는 데이터를 동시에 읽고 쓰는 것을 컴파일러가 금지한다. 전역변수는 기
local resource를 가져오려고 시도하면 위와같은 에러가 나왔다. rust에서 file path를 front에 넘겨주어 front에서 동적으로 img의 src에 image path를 넘겨주었다. 찾아보니 웹 브라우저에서는 로컬 파일을 직접 로드하는걸 기본적으로
rust에서 cpp의 클래스를 이용하는 방법을 찾고 있다. rust에서 autocxx crate를 사용하면 된다. Test Class가 있다고 하자. rust에서 Test의 객체를 만들어서 사용하는 법을 알아보겠다. cargo.toml 파일에 위와같이 의존성과 빌드 의
c++ 클래스 필드가 std::vector<특정 클래스>일 때, Rust에서 올바르게 사용하는 방법 autocxx 크레이트를 사용하면 된다. 다음과 같은 c++ 클래스가 있다고 가정하자.필드 goat_list의 경우 Goat 클래스를 담고 있는 vector이다.
Rust features를 통해서 크레이트 공개 모듈 정하기 windows 크레이트에서 CreateFile win32 api를 호출하기 위해서는 아래와 같은 features를 \[dependencies]에 추가해줘야한다. https://microsoft.git
dll 파일을 libloading 크레이트를 활용하여 로드하려고 하는데 모듈을 찾을 수 없다는 에러메시지가 나옴. 위와 같이 path를 설정했다. cargo.toml과 같은 경로에 두었는데 모듈을 찾을 수 없다고 나왔다. 생각해 보니 dll은 런타임에 로드하기 때문에
문제 해결 결론
Rust의 Cargo에서는 features를 활용하여 특정 기능을 활성화하거나 비활성화 할 수 있다. 이 기능을 활용하면 조건부 컴파일이 가능하고, 불필요한 코드 실행을 막을 수도 있다. 본 글에서 features를 활용하여 특정 기능을 포함한 테스트를 실행하는 방법을
libloading 크레이트를 사용하여 함수의 주소값을 가져올 때 b"함수명" 이런식으로 사용하기에 정리하고자 한다. b"..." 표기법은 문자열을 바이트 배열 &\[u8]으로 변환해준다. 출력결과72, 101, 108, 108, 111, 32, 87, 111, 114
\`C// region:과 // endregion:으로 숨기고 싶은 코드를 감싸면 된다. 원하는 코드를 감싸주어서 가독성을 높일 수 있다. 도움이 되었으면 좋겠다.
개요 vs2008로 빌드 된 dll을 rust에서 로드하여 사용하려고 했다. autocxx 크레이트를 사용하여 dll의 함수의 파라미터에 사용하는 class를 정의하였고 객체를 생성했다. 그러나 생성한 객체를 파라미터로 넘겼을 때 오류가 발생하며 정상적으로 동작이 되지
개요 for 반복문을 사용 시 iter를 왜 사용하는지에 대해 정리하는 내용이다. 정리 위 코드의 출력물은 어떻게 될까? 그렇다면 fruit_list에 추가로 배를 넣고 싶다면?? 컴파일 시 borrow관련 에러가 발생한다. 이유가 뭘까?? rust에서 fo
개요 >추상화는 성능을 희생해야 한다. 이 개념을 깨고, 추상화가 있어도 성능 손실이 없다 는 원칙을 Zero-Cost Abstraction이라고 한다. rust에서는 고수준 코드를 런타임 오버헤드가 거의 없이 사용할 수 있다. 1. Generic 2. Trai
serde_json으로 데이터 파싱하는것을 정리하겠다. 특히 json파일에서 필드값이 없는 경우를 serde_json의 Value를 활용하여 파싱하는법을 알아보겠다.아래 json 데이터를 살펴보자.Vec 내부에 Vec<f32>를 가지고 있는 구조이다.파싱을 해보도
super키워드가 정확히 어떤 역할을 하는지 알아보겠다.super 키워드는 상위 모듈을 가르킨다. 위 코드에서 test2 모듈은 test1모듈 내부에 있다. 즉, test2의 상위 모듈의 기능을 사용하고자 하면 super키워드를 통해서 손쉽게 접근할 수 있다. supe
trait을 선언 시 trait bound를 설정할 수 있는 문법을 보고 정리하고자 작성한다.위 코드는 일반적인 trait을 구현한 구조체 예시이다. trait를 선언 시 해당 트레이트를 구현할 타입에 대해 조건을 걸 수 있다. 아래 코드를 보자.위 코드를 컴파일 시
rust를 개발하며 dangling pointer로 난감한 경험을 했다. 분명 동작이 안되야하는 코드인데 정상적으로 동작하는 것처럼 보여서 무언가 잘못된 기분이었다. 우연한 프로그램을 처음으로 만났다.이 코드의 잘못된 점이 보이시나요? 저는 이 코드를 보자마자 dang
rust crate x86, x64 buildrust crate의 경우 바이너리가 아닌 소스형태로 제공이 되므로 사용하는 바이너리 크레이트가 설정한 타겟에 따라 빌드가 된다.rustup showrustup show 명령어를 실행하면 현재 로컬 pc에 설치된 toolch
asynchronous programming에 대해서 공부한 기록을 남긴다. future trait 구현 방법에 대해서 알아보겠다.중요한 poll, waker의 사용방법 및 원리에 대해서 정리할 것이다.poll 구현waker 등록 및 사용 방법간단한 타이머 예제 fut
binance api 통신을 하면서 query를 만들기위해서 매크로를 활용하다가 정리하고 싶어서 글을 작성하게 되었다.macro_use vs marcro_export둘 다 매크로를 정의하는데 사용되는 속성(attributes)이지만, 서로 다른 역할을 수행한다.정의된
개요 내용 결론
rust를 활용하여 stack trace를 통해 현재 함수가 어떤 모듈로 호출이 되었는지 확인하는 방법을 알아보겠다.windows crate를 활용하였다.RtlCaptureStackBackTrace winapi를 통해서 스택트레이스를 가져올 수 있다.RtlCapture
workspace 개념 및 features를 활용한 의존성 추가 방법rust의 여러 framework을 보면 workspace구조를 가지고 있다. root workspace가 존재하고 하위 크레이트들이 member 형태로 존재한다.오픈소스를 좀 더 잘 이해하기 위해서는
rust에서 dll로 빌드 시 진입지점인 DllMain을 만들어서 테스트한다.windows crates를 이용하여 DllMain을 만든다. 빌드를 하게되면 ./target/debug 디렉토리에 dll파일이 생성된다.c++ 콘솔프로그램에서 rust로 생성한 dll을 호출
hooking_api을 통해 iat hooking을 테스트하기 전, 모듈이 정상적으로 로드되어 동작을 하는지 확인하는 과정을 기록하겠다.위와 같이 cargo.toml파일을 설정 후 빌드하게되면 dll파일을 얻을 수 있다.cpp코드에서 이렇게 로드하게 되면 load시킨
구조체 안의 필드들을 한 줄로 꺼내서 각각의 변수로 선언하는 방법Student 구조체를 정의하였다. Student객체를 만들어보겠다.만약 내부 필드의 값을 로컬변수로 선언하여 사용하고 싶다면 위와같이 해야한다.여기서 구조체 패턴 디스트럭처링을 사용하면 간단하게 구현이
rust에서 확장 트레이트 구현하기확장 트레이트를 구현하여 편리한 기능을 제공할 수 있다. futures 크레이트를 사용하며 select!매크로를 활용할 때 fuse메서드에 대해서 어떻게 사용할 수 있는지 고민하며 해결한 내용을 작성해보겠다.위처럼 확장 트레이트를 구현
rust에서 primitive types, 내장 타입이 존재한다. 이 타입들은 Copy 트레잇을 기본적으로 구현하기때문에 소유권이 이동되지 않고, 값 복사가 발생한다.미리 할당된 스택 메모리에서 값을 읽어 쓰는 행위를 하기 때문에 속도가 상당히 빠르다는 장점이 있다.스
Box<dyn Trait>인 Trait 객체를 만들기 위해서는 객체 안전성을 지켜야 한다.즉, 트레이트 메서드가 반드시 self 매개변수를 가져야 한다는 중요한 규칙이 있다. 이 규칙을 지켜야만 vtable을 통해 올바른 메서드 호출을 동적으로 디스패치할 수 있다
lifetime이 이렇게도 쓰이는지 알게되어 작성해본다.위 코드는 std::thread::spawn 함수의 정의 부분이다.자세히 보면 타입을 정의하는 곳에 'static이 붙은 것을 볼 수 있다. 이것은 라이프타임의 문법으로 보통 &'static str 이런 식으로 사
OpenSource를 보다가 enum을 사용 시 깔끔한 방법이 있어서 간단히 정리한다.enum의 값을 확인하기 위해서는 match와 if를 활용한다. 위에서 사용한 enum의 경우 연관된 데이터가 없는 경우이다.만약에 연관된 데이터가 존재하는 경우는 어떻게 처리해야 하
bevy의 ecs에 대해서 관심을 가지게 되어서 Getting Start를 따라하면서 공부한 내용을 정리한다. 링크는 아래와 같다.https://bevy.org/learn/quick-start/getting-started/apps/Entity Component
Bevy ECS Example 개요 MQTT와 ECS를 활용하여 주차장의 주차 공간에 대해서 출력하는 프로그램을 만들어 보려고 한다. 만드는 이유는, MQTT통신을 연습하고 이해하는 동시에 ECS에 대해 이해도를 높이고자 한다. ECS의 경우 분산 시스템이나, 실시간
Arc를 사용 시 주의할 부분에 대해서 포스팅을 하겠다.순환 참조 참조 횟수가 0이 될 때 메모리를 해제한다.두 개 이상의 arc가 서로를 순환하며 가리키게 되면, 참조 횟수가 절대 0이 되지 않아 메모리 누수가 발생한다.a와 b 변수는 힙에 할당된 각각의 객체를 가르
Websocket? TCP 핸드쉐이크 WebSocket 핸드쉐이크 (Upgrade) 일반적인 HTTP프로토콜 -> WebSocket 프로토콜로 업그레이드 된다. 데이터 통신
블랭킷 구현은 특정 구조체 하나에 대해 트레잇을 구현하는 것이 아니라, 어떤 조건을 만족하는 모든 타입에 대해 포괄적으로 트레잇을 구현하는 기법을 말한다.이름처럼, 조건을 만족하는 모든 타입들을 하나의 blanket으로 덮어버리는 것과 같다고 해서 붙여진 이름이라고 한
일반적으로 tokio를 사용할 때 \`그러나 특정 상황에서는 tokio 런타임을 수동으로 관리해야하는 경우가 생긴다. 이에 대해서 알아보도록 하겠다.기존의 거대한 동기 코드베이스를 한 번에 async로 바꾸는 것은 거의 불가능에 가깝다. 또한 main을 async로 바
여기서 incoming 변수의 메서드인 try_for_each를 호출하는데 이게 어떻게 가능한지에 대해서 분석하다가 정리를 해야 할 것 같아서 작성한다.일단 try_for_each의 원형은 아래처럼 생김매개변수로 F타입을 받음. 즉, 제네릭 타입임.그럼 F: FnMut
스레드를 생성 시, spawn 메서드에 클로저를 넘겨주게 된다. spawn함수의 원형을 보면F 제네릭 타입이 Send + 'static이다. 여기서 중요한 것은 'static을 가진다는 것이다. 이 의미는 FnOnce가 호출 시 내부의 변수들은 모두 소유권을 가지고 있
개요 bevy의 ecs 프레임워크를 활용해서 websocket 통신을 구현하려고 한다. 특히 권위 서버(Authoritative Server) 형태로 만들 예정이다. 지속적으로 업데이트할 예정이다. 내용 간단하게 WebSocket을 tokio runtime을 통해서
개요 내용 위 코드는 정상적으로 컴파일되지 않는다. 소유권 문제가 발생한다. rust를 개발하면서 아주 자주 겪는 상황이다. 결론
데이터 프레이밍이란?이 기술을 사용하는 이유는 TCP 통신의 메시지 경계 문제를 해결하기 위해서이다.TCP는 데이터 스트림을 연속적으로 전송하므로, 하나의 큰 데이터 덩어리를 여러 번에 나눠 보내거나, 여러 개의 작은 메시지가 합쳐져서 한 번에 도착할 수 있다. Len
derive 매크로를 사용 시 어떻게 파싱하고 TokenStream으로 반환하여 코드를 만드는지 알아보겠다. 매번 사용은 하지만 정확하게 짚고 넘어가고 싶다. attributes에는 종류가 크게 3가지 있다.1\. Path2\. List3\. NameValue테스트를
개요 NameValue 속성에 대해서 파싱하는 방법을 알아보겠다. 내용 결론 syn::Meta::NameValue(metanamevalue) => { let Some(ident) = metanamevalue.path.get_ident()
rust의 tokio는 여러 비동기 채널을 제공해준다.https://docs.rs/tokio/1.47.1/tokio/sync/index.htmlmpsc 채널에서 bounded와 unbounded 채널의 차이점에 대해서 알아볼 예정이다. unbounded의 경우
개요 rust로 ocr 라이브러리를 사용해서 개발을 하려고 했다. 그러나 복잡하기도 하고 필요한 라이브러리들을 설치하기 위해서 로컬에 너무 많은 것을 설치해야 했고 ai 모델을 사용하는 거에 대해서 지식이 별로 없었기 때문에 어려웠다. 최근에 도커에 대해서 공부했고 편
개요 내용 결론