컴퓨터/Rust
-
Rust 문법: Ordering (Relaxed, Release, Acquire, AcqRel, SeqCst)컴퓨터/Rust 2023. 5. 11. 22:55
소개 Rust를 쓰다가 여러 스레드 상황에서 공유 변수를 사용해야 하는 상황이 생겼다. CTRL+C를 백그라운드에서 캡처하고 (tokio::signal::ctrl_c) CTRL+C를 누르면 exit_flag를 true로 만든다. 그러면 메인 함수 루프에서는 어떻게 읽고 종료해야 할까? 여기서 나올 수 있는 개념이 메모리 순서이다. 즉, 멀티스레드 프로그래밍에서 원자적 연산은 데이터가 여러 스레드를 통해 안전하게 처리되도록 보장하는 데 중요하다. 원자적이지 않은 연산은 여러 스레드의 상대적 타이밍에 따라 연산의 출력이 달라지는 경합 조건을 초래할 수 있으며, 이러한 조건은 디버깅하기 어려운 다양한 문제를 일으킬 수 있다. Rust의 std::sync::atomic::Ordering 열거형은 이러한 원자적 ..
-
Rust: 구글 Bard 바드 CLI 앱 만들기컴퓨터/Rust 2023. 4. 28. 17:21
Bard Bard is your creative and helpful collaborator to supercharge your imagination, boost productivity, and bring ideas to life. bard.google.com 소개 구글의 ChatGPT, 바드가 한국에서 사용할 수 있게 된 지 꽤 되었다. 성능은... 뭐라 못하겠고 아직 개발 초창기니까 믿어본다. 꽤 괜찮은 기능은 Bing처럼 Google 인덱싱 된 문서들을 긁어올 수 있고 출처도 남겨준다. (근데 물어봐도 이해를 잘못함) 아무튼 이 글에서는 Bard를 CLI 앱으로 만드는 과정을 적었다. Rust 언어 async로 작성하였다. How 우선 어떻게 답변이 생성되는지 확인하기 위해 네트워크에서 다음과 같이..
-
Rust: async의 늪컴퓨터/Rust 2023. 4. 18. 22:08
actix 웹 프레임워크에서 POST를 받으면 load_courses라는 async 함수를 부르는 상황이다. CSV 파일이 커서 tokio를 이용해 async read를 했다. use csv::ReaderBuilder; use tokio::fs::File; use tokio::io::AsyncReadExt; async fn load_csv_data(file_path: &str) -> Result { let mut buf = Vec::new(); let mut file = File::open(file_path).await?; file.read_to_end(&mut buf).await?; let mut reader = ReaderBuilder::new() .delimiter(b',') .flexible(tr..
-
Rust: 한글 종성 유니코드 변경하기컴퓨터/Rust 2023. 4. 17. 22:18
할 것: 종성이 'ㄲ'인 것을 'ㄴ'으로 바꾸기 (pdf를 txt로 변환하다 보니 "깐"인데 "깎" 이런 식으로 되어 있어서 만들게 됨) 한글 유니코드: 초성: (음절 - 0xAC00) / (21 * 28) 중성: (음절 - 0xAC00) % (21 * 28) / 28 종성: (음절 - 0xAC00) % 28 음절의 종성이 'ㄲ'(02)인 경우, 이를 'ㄴ'(04)으로 바꿔야 한다. fn main() { let input = "갂깡깔깐깎..."; let result = replace_gg_with_n(input); println!("Result: {:}", result); // Result: 간깡깔깐깐... } /// ㄲ 받침 -> ㄴ으로 바꿈 fn replace_gg_with_n(text: &str) ..
-
Rust: cargo something 만들기컴퓨터/Rust 2023. 3. 28. 10:06
cargo-subcommand 소개 cargo inspect cargo depsize cargo korea cargo 기본 옵션에 없는 위와 같은 옵션은 어떻게 만들까? cargo-subcommand라고도 불리며 Cargo를 수정하지 않고 새 하위 명령어를 추가할 수 있도록 설계되었다. $PATH에 있는 바이너리 파일의 이름이 cargo-something으로 지정되면 cargo something처럼 실행하여 마치 Cargo 하위 명령어인 것처럼 사용할 수 있다. 이러한 사용자 정의 명령어는 cargo --list를 실행할 때 나열된다. 이 글에서는 실제로 만들어보고 사용하는 과정을 적었다. @코드 바로 보기 만들 cargo-depsize는 Cargo 패키지 매니저를 사용하여 현재 Rust workspac..
-
Rust: 카카오 Karlo API wrapper컴퓨터/Rust 2023. 3. 24. 17:00
Karlo 소개 카카오브레인 ‘카카오디벨로퍼스’에서 카카오브레인의 한층 더 발전된 AI 이미지 모델 ‘Karlo(이하 칼로)’를 API가 있다. Generative AI Karlo는 사용자가 입력한 문장을 기반으로 사실적인 이미지와 다양한 작품을 생성할 수 있는 AI 모델이다. 1억 8천만 장 규모의 이미지와 이미지를 설명하는 텍스트와의 관계를 학습했다고 한다. 총 3가지 기능이 있다. 사용자가 입력한 단어나 문장을 기반으로 관련된 이미지와 다양한 작품을 생성 (Image gen) 사용자가 업로드한 이미지를 기반으로 관련된 이미지와 다양한 작품을 생성 (Variation gen) 이미지에 그리기 도구로 편집할 부분을 마스킹하고, 입력 단어나 문장(공백 가능)을 기반으로 지운 부분을 채워 새로운 작품을 생..
-
Rust: AsMut, AsRef, Deref, DerefMut 정리컴퓨터/Rust 2022. 12. 31. 21:22
Intro Rust의 AsRef, AsMut, Deref 및 DerefMut trait은 값을 변환하고 참조로 사용하는 방법을 제공한다. AsRef 및 AsMut trait을 사용하면 한 type의 값에 대한 참조를 다른 유형의 값에 대한 불변 또는 변경 가능한 참조로 변환할 수 있고, Deref와 DerefMut trait을 사용하면 값을 각각 참조 또는 변경 가능한 참조인 것처럼 사용할 수 있다. AsRef AsRef을 사용하면 참조를 immutable 참조로 변환할 수 있다. AsRef example1 이 예제는 i32 value이라는 단일 필드를 가진 MyStruct라는 구조를 정의하고, MyStruct에 대한 AsRef trait을 구현하여 MyStruct.value에 대한 참조를 i32 값에 ..
-
Rust: Send, Sync 정리컴퓨터/Rust 2022. 12. 29. 17:42
SS Rust의 Send 및 Sync trait은 데이터에 대한 안전한 동시 액세스를 보장하는 데 사용되는 관련 유형이다. 그러나 type이 concurrent 설정에서 사용되도록 설계되지 않은 경우에도 여전히 race 조건이나 기타 동시 액세스 문제가 발생할 수 있기 때문에 Send 및 Sync를 구현한다고 해서 해당 유형이 thread-safe 하다는 보장은 없다는 점에 유의해야 한다. 그러나 이러한 trait을 구현하는 것은 concurrent 설정에서 type을 사용하기 위해 필요한 조건이며, 그러한 맥락에서 type을 안전하게 사용할 수 있다는 보장을 제공한다. 이전에 쓴 RefCell, Arc, Rc, Mutex를 보면 다음 표와 같다. Trait Arc RefCell Rc Mutex Send..