하네스(Harness) 엔지니어링
·
AI
LLM이 막 퍼지기 시작했을 때는 프롬프트 엔지니어링이라는 말이 정말 많이 나왔습니다.당시 모델들은 지금처럼 똑똑하지 않았기 때문에 프롬프트를 어떻게 작성하느냐에 따라 결과물 차이가 꽤 컸습니다. 같은 작업을 시켜도 한 줄을 더 적느냐, 예시를 넣느냐에 따라 결과가 완전히 달라지곤 했습니다. 그래서 자연스럽게 "어떻게 프롬프트를 작성해야 원하는 결과를 얻을 수 있는가?"에 대한 연구와 노하우가 쌓이기 시작했고, 이를 프롬프트 엔지니어링이라고 불렀습니다. 그런데 최근에는 조금 다른 문제가 생기고 있습니다.오히려 모델 성능이 좋아지면서 사용자가 말하지 않은 부분까지 추론해서 작업하는 경우가 늘어났습니다. 가끔은 편리하지만, 실제 개발 환경에서는 오히려 문제가 되기도 합니다. 기존 코드 스타일을 무시하거나,..
ROS(Robot Operating System)
·
Robotics/ROS & Tools
로봇 소프트웨어 개발을 위해 사용되는 오픈소스ROS 개요Gihub 설명에 따르면 ROS는 로봇 어플리케이션을 개발하기 위한 라이브러리와 툴들의 모음 이라고 되어있습니다.단순한 프로그램 하나라고 생각하기 보다는 프레임워크 또는 미들웨어 라고 보는 것이 적절해 보입니다. ROS에서는 독립적인 실행 하는 단위를 Node라고 합니다.각 Node는 센서 데이터 처리, 위치 추정, 경로 계획 등 특정 기능을 담당하고, 서로 분리된 구조로 동작 합니다. Node간 데이터 통신은 Topic을 통해 이루어집니다.Topic은 메시지(데이터)를 주고받기 위한 통신 채널이며, 데이터를 보내는 쪽을 Publisher데이터를 받는 쪽을 Subscriber 라고 합니다. 예를들어 특정 센서 데이터를 수집하는 Node가 특정 To..
[System Monitor] GPU
·
Rust
GPU 사용량 체크에 관한 글 입니다. nvml-wrapper 라는 nvml 래퍼 크레이트를 사용합니다. 사용량, 메모리 등등 필요한 정보는 모두 조회가 가능해서 별도로 벤더사 api사용할 필요는 없을 듯 합니다. # cargo add nvml-wrapper[dependencies]nvml-wrapper = "0.11.0"use nvml_wrapper::Nvml;use nvml_wrapper::enum_wrappers::device::Clock;const CONST_GB: f64 = 1024.0 * 1024.0 * 1024.0;fn main() { let nvml = Nvml::init().expect("Failed to initialize NVML"); let device = nvml.dev..
파이썬 기초 - 1 -
·
Python
지도에서 직선 거리구하기자 강남역 9번 출구에서 CU로 가려고 합니다. 여기서 우리는 9번 출구에서 CU까지 직선 거리가 얼마인지 궁금할 때가 있을겁니다.네이버 지도에서는 그냥 대각선으로 쭉 그어서 거리 구할 수 있기는 하지만 우리는 파이썬으로 이걸 구해봅시다   우선 우리에게 주어진 정보는 두가지라고 가정하겠습니다.삼각형의 밑변 삼각형의 높이가 주어졌습니다.피타고라스 정리를 활용하면 이 문제를 풀 수 있습니다. 우리는 a와 b의 길이를 알면 c를 알수 있다! 라는 지식을 가지고 있습니다.왜 그렇냐구요?  a의 길이를 한변으로 하는 정사각형의 넓이와, b의 길이를 한 변으로 하는 정사각형의 넓이를 구해보니 c를 한변으로 하는 정사각형의 넓이와 같더라! 라는걸 옛날에 수학자들이 밝혀냈습니다. 정사각형의 넓..
Rust 기본개념 - 패키지, 모듈관리
·
Rust
거대한 프로그램의 코드를 작성 할 때는 코드의 구조화가 중요해집니다. 코드에서 연관된 기능을 묶고 서로 다른 기능을 분리해두면 이후 특정 기능을 구현하는 코드를 찾거나 변경할 때 헤매지 않습니다. 한 패키지에는 여러 개의 바이너리 크레이트와 라이브러리 크레이트가 포함될 수 있으므로, 커진 프로젝트의 각 부분을 크레이트로 나눠서 외부 라이브러리 처럼 쓸 수 있습니다. 패키지와 크레이트크레이트크레이트는 러스트가 컴파일 한 차례에 고려하는 가장 작은 코드 단위 입니다. 크레이트는 바이너리일 수도 있고 라이브러리일 수도 있습니다. 바이너리 크레이트는 main 함수를 포함하고 실행파일이 실행되면 무슨일이 일어나야 하는지 정의한 파일입니다. 반대로 라이브러리 크레이트는 main함수를 가지지 않고 실행파일 형태로 컴..
Rust 기본개념 - 패턴매칭 match
·
Rust
Match란?Rust에서 패턴 매칭 분기를 위한 흐름제어 도구 입니다.기본 문법match 값 { 패턴 => 표현식, 패턴 => 표현식, // ...}값: 매칭하려는 값입니다.패턴: 값과 비교할 패턴입니다.표현식: 패턴이 일치했을 때 실행할 코드입니다. Match의 사용법숫자 매칭fn main() { let number = 3; match number { 1 => println!("Number is one"), 2 => println!("Number is two"), 3 => println!("Number is three"), _ => println!("Number is something else"), }}패턴: 1, 2, ..
Rust 기본개념 - 열거형의 활용
·
Rust
아래 코드는 랜덤으로 날씨를 선택하고 패턴 매칭으로 해당하는 문자열을 출력하는 코드 입니다.use rand::Rng;fn main () { enum Weather { Sunny, Ranny, Snowy {cm:u32} } let weather_list = vec![Weather::Sunny, Weather::Ranny, Weather::Snowy { cm: 5 }]; let random_number = rand::thread_rng().gen_range(0..3); match &weather_list[random_number] { Weather::Ranny => println!("Ranny!"), Weathe..
Rust 기본개념 - 열거형
·
Rust
열거형 정의하기구조체가 서로 연관된 필드 및 데이터를 묶는 방법을 제공 했다면 열거형은 어떤 값이 여러개의 간으한 값의 집합 중 하나라는 것을 나타내는 방법을 제공 합니다. 예를들어 Rectangle이 Circle과 Triangle을 포함하는 다양한 모양들의 집합 중 하나라고 표현하고 싶을 수 있습니다. 이때 열거형을 사용하여 나타낼 수 있습니다. 값의 제한과 가독성,안전성을 위해 열거형을 사용합니다.IP 주소를 열거형으로 나타내면 아래와 같이 나타낼 수 있습니다.enum IpAddrKind { V4, V6,} IP 주소라는 것은 IPv4, IPv6 두 종류 입니다. 이 처럼 정해진 값만 사용하도록 값을 제한할 수 있습니다. 열거형의 활용아래처럼 IpAddrKind의 두 개의 값에 대한 인스턴..
Rust 기본개념 - 메서드
·
Rust
메서드란? 함수와 유사한 개념으로 fn 키워드와 함수명으로 선언하고 매개변수화 반환값을 가집니다. 메서드 문법메서드는 다른 어딘가로부터 호출될 때 실행됩니다. 하지만 메서드는 함수와 달리 구조체 컨텍스트에 정의되고, 첫번째 매개변수는 메서드를 호출하고 있는 구조체 인스턴스를 나타냅니다. 메서드 정의하기우선 함수를 구조체에 정의된 메서드로 변환해봅시다.Rect 컨텍스트에 함수를 정의하기 위해서 impl 블록을 만듭니다.// 명시적 동의#[derive(Debug)]struct Rect { width: u32, height: u32}impl Rect { fn area(&self) -> u32 { self.width * self.height }}fn main() { let..
Rust 기본 개념 - 구조체
·
Rust
구조체는 타입이 다른 여러 값을 하나로 묶는 방법 입니다. 구조체는 설명만 보면 튜플과 상당히 비슷해 보입니다. 실제로도 튜플처럼 구조체의 구성요소들을 각각 다른 타입이 될 수 있습니다.그리고 구조체는 각각의 구성 요소에 이름을 붙일 수 있습니다. 객체지향 언어를 해보았던 사람이라면 바로 객체가 떠오를겁니다.아래를 보면 우리가 생각한 객체의 모습과 상당히 비슷합니다. 자바에서는 아마 이런 구조를 객체 또는 클래스 라고 불렀던 것 같습니다.타입스크립트 에서는 타입 혹은 인터페이스가 구조체와 비슷하다고 볼 수 있겠네요!struct User { active: bool, username: String, email: String, sign_in_count: u64,}정의한 구조체는 해당 구조..
Rust 기본개념 - 슬라이스
·
Rust
슬라이스는 컬렉션을 통째로 참조하는 것이 아닌 연속된 일련의 요소를 참조하도록 해줍니다.슬라이스는 참조자의 일종으로 소유권을 갖지 않습니다. fn first_word(s: &String) -> usize { let bytes = s.as_bytes(); for (i, &item) in bytes.iter().enumerate() { if item == b' ' { return i; } } s.len()} 위 예제는 함수의 인자로 받은 문자열에서 첫번째 공백문자를 찾아 리턴하는 예제 입니다.우선 슬라이스 개념 없이 이를 수행해보도록 하겠습니다. let bytes = s.as_bytes();// 공백 여부 체크를 위해 바이트로 변환 Rust의..
Atan2
·
Unity
Atan( 아크탄젠트 )유니티에서 오브젝트를 회전 시킬 때 아크탄젠트라는 개념이 필요합니다.탄젠트의 역함수이며 좌표평면에서 x,y값으로 각도를 구하기 위해 사용합니다. angle = Mathf.Atan2(vertical, horizontal) * Mathf.Rad2Deg; // 순서 변경transform.rotation = Quaternion.Euler(0, angle, 0); 인자로 넣은 vertical과 horizontal은 유저가 입력한 방향에 관한 정보 입니다.인자는 y,x순으로 넣으면 됩니다. vertical 값이 0.7이고, horizontal 값이 0.8이라면0.7/0.8이 됩니다이를 계산 해보면 약 0.875라디안 이라는 값이 나오는데 이를 "도"로 변환하면 39.8도가 됩니다.좌표평면에서..