카테고리 보관물: 개발 Development

Tauri: 가벼운 데스크탑 애플리케이션 프레임워크

1. Tauri란 무엇인가?

Tauri는 데스크탑 애플리케이션을 개발할 수 있는 가볍고 안전한 오픈 소스 프레임워크입니다. Tauri를 사용하면 웹 기술을 이용해 Windows, macOS, Linux에서 실행 가능한 네이티브 애플리케이션을 만들 수 있습니다. 주로 Rust와 **웹 기술(HTML, CSS, JavaScript)**을 결합하여 제작되며, 성능과 보안 측면에서 매우 강력한 특징을 갖고 있습니다.

2. 왜 Tauri인가?

Tauri는 Electron이나 다른 데스크탑 앱 프레임워크에 비해 매우 경량입니다. 기존의 Electron 앱은 크롬과 같은 브라우저 엔진을 내장하여 용량이 큰 경우가 많습니다. 하지만 Tauri는 시스템의 네이티브 웹뷰를 사용하기 때문에 앱의 크기가 훨씬 작습니다.

주요 장점:

  • 가벼움: 앱 크기가 매우 작고, 시스템 리소스를 적게 사용합니다.
  • 보안성: Tauri는 보안을 최우선으로 하며, 웹 기술을 기반으로 하면서도 로컬 파일 시스템 접근을 최소화합니다.
  • 다중 플랫폼 지원: Windows, macOS, Linux 모두에서 동일한 코드베이스로 빌드가 가능합니다.
  • Rust의 성능: Tauri는 백엔드에서 고성능 언어인 Rust를 활용하여 더 빠른 실행 속도를 제공합니다.

3. Tauri와 Electron 비교

TauriElectron
기술 스택Rust + 웹 기술Node.js + Chromium
애플리케이션 크기1~10MB (작음)50~100MB (큼)
리소스 사용량적음많음
보안높은 보안성상대적으로 낮음
성능Rust 기반으로 매우 빠름비교적 무거움

4. Tauri의 특징

  1. 작은 크기: Tauri로 만든 애플리케이션은 1MB에서 10MB 정도의 크기를 가집니다. 작은 애플리케이션 크기는 다운로드 시간과 설치 시간을 크게 줄여줍니다.
  2. Rust로 백엔드 작성: Rust의 고성능과 안전성을 활용할 수 있습니다. Rust는 메모리 안전성을 보장하며, 시스템 리소스를 효율적으로 사용합니다.
  3. 웹 개발자의 쉬운 접근성: 이미 HTML, CSS, JavaScript를 알고 있는 웹 개발자라면 Tauri를 이용해 데스크탑 애플리케이션을 빠르게 개발할 수 있습니다.
  4. 보안성 강화: Tauri는 애플리케이션과 로컬 시스템 간의 상호작용을 엄격히 제한합니다. 보안에 민감한 앱 개발 시 매우 유용합니다.

5. Tauri로 개발을 시작하려면?

Tauri를 시작하려면 아래의 개발 환경이 필요합니다:

  • Rust 설치: Tauri는 Rust를 백엔드로 사용하므로, 먼저 Rust를 설치해야 합니다.
  • Node.js 및 패키지 관리자 설치: JavaScript 및 패키지 관리를 위해 Node.js와 npm/yarn을 설치합니다.
  • Tauri CLI 설치: 프로젝트를 생성하고 빌드하는 데 필요한 CLI 도구입니다.
bash코드 복사# Rust 설치
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# Node.js 및 패키지 관리자 설치 (Node.js 웹사이트에서 다운로드)
npm install -g tauri-cli

6. 결론

Tauri는 기존의 데스크탑 애플리케이션 개발 프레임워크보다 경량화된 솔루션을 제공합니다. Rust의 성능을 바탕으로 웹 기술과 결합하여 데스크탑 앱을 쉽게 개발할 수 있고, 작은 앱 크기와 높은 보안성 덕분에 사용자 경험도 우수합니다. Electron이 제공하는 풍부한 기능이 필요하지 않거나, 더 가벼운 대안을 찾고 있다면 Tauri가 훌륭한 선택이 될 수 있습니다.

파이썬 문자열에서 특수문자 제거하는 3가지 방법 – python 3 ways to remove punctuations from a string

Python으로 특수기호 제거하는 예제입니다.

자연어처리, 크롤한 데이터 정제 등을 할 때 특수문자를 제거하거나 클린징을 해야 할 때 많이 하는 작업입니다.

특히 비정형 데이터 중에서 텍스트(문자열)을 다루다보면 계속 해야 하는 그런 작업입니다.

짧게 먼저 요약하면

  • 가장 빠른 것은 translate() 메서드를 사용하는 것이고
  • 그 다음은 string.replace() 메서드를 사용하는 것이고
  • 가장 느린 것은 정규표현식을 사용하는 것입니다.

속도가 문제되지 않으면 (느려도 되면) 정규표현식을 사용하는 것이 가장 유연하고 좋습니다. 특정 문자를 넣고 빼거나 숫자를 포함하거나 하는 여러가지 작업을 할 수 있습니다.

3가지 방법의 소스코드를 참고하세요.

translate() 함수 사용하기

# strings 패키지의 translate() 함수를 사용하여 특수기호를 제거하는 예제
import string
input_string = '!hi. wh?at is the weat[h]er lik?e. !@##$%%^^&*)_+{}|?"'
output_string = input_string.translate(str.maketrans('', '', string.punctuation))
print(output_string)
# Returns: hi what is the weather like
# 제거되는 특수기호는 아래와 같다.
print(string.punctuation)
# Returns: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

정규표현식 regular expression 사용하기

# 정규표현식을 사용하여 특수기호를 제거하는 예제
import re
input_string = '!hi. wh?at is the weat[h]er lik?e. !@##$%%^^&*)_+{}|?"'
output_string = re.sub(r'[^\w\s]', '', input_string)
print(output_string)
# Returns: hi what is the weather like

# 좀더 빨리 하려면 정규표현식을 컴파일하는 것이 좋다.
pattern_punctuation = re.compile(r'[^\w\s]')
output_string = pattern_punctuation.sub('', input_string)
print(output_string)

string.replace() 사용하기

# string.replace() 함수를 사용하여 특수기호를 제거하는 예제
import string
input_string = '!hi. wh?at is the weat[h]er lik?e. !@##$%%^^&*)_+{}|?"'
for character in string.punctuation:
    input_string = input_string.replace(character, '')
print(input_string)
# Returns: hi what is the weather like

소스 파일

github에 노트북으로도 올려놨습니다.

https://github.com/euriion/python-exams/blob/main/remove-punctuations.ipynb

rsync – ‘cannot delete non-empty directory’ errors

로컬에 있는 파일과 모델, 데이터 등을 리모트의 어딘가로 싱크하는 것은 데이터사이언스 작업을 하면서 빈번하게 있는 일입니다. 복잡한 파이프라인을 작성할 것은 아니기 때문에 간단하게 rsync를 사용할 때가 많습니다.

제가 주로 사용하는 옵션은 이렇습니다.

rsync -avzrub --delete /tmp/source /tmp/target

그런데 이 옵션을 실행하다 보면 다음과 같은 에러가 나올 때가 있습니다.

rsync 'cannot delete non-empty directory' errors

–delete 옵션은 소스에 없는 것들은 타겟에서도 지우라는 명령입니다. 이때 소스에 없는 파일과 디렉토리는 타겟에서도 지워야 하는데 디렉토리를 지우지 못하는 것입니다.

원인은 -b 옵션 때문인데 -b 옵션은 타겟에서 파일을 지욱 때 만약을 대비하기 위해 파일을 ~가 끝에 붙은 이름으로 변경해서 백업하는 기능입니다. 이 옵션으로 인해 지우지 못하게 됩니다.

-b 옵션을 제거하면 문제가 해결됩니다.

만약 그래도 백업을 해야 하고 특정 디렉토리는 다르게 관리해야 한다면 –exclude 옵션으로 그 디렉토리를 제외하고 그 디렉토리는 다른 옵션으로 rsync를 수행해야 합니다.