Author Archives: slime

RxJS (Reactive Extensions for JavaScript)

RxJS (Reactive Extensions for JavaScript)는 비동기 및 이벤트 기반 프로그램을 위한 라이브러리입니다. 이는 반응형 프로그래밍 패러다임을 따르며, 데이터 스트림과 변화를 쉽게 생성, 구성, 변환, 관리하고 조작할 수 있는 방법을 제공합니다.

RxJS는 옵저버블(Observables)이라는 핵심 개념을 중심으로 구축되어 있습니다. 옵저버블은 데이터 스트림을 비동기적으로 전달하는 객체로, 시간이 지남에 따라 여러 값을 방출할 수 있습니다. 개발자들은 이 옵저버블을 구독하여 데이터 스트림에 있는 값이나 이벤트가 발생할 때마다 반응할 수 있습니다.

RxJS는 다양한 유형의 비동기 이벤트를 처리할 수 있게 해주는 방대한 연산자 세트를 제공합니다. 이 연산자들은 필터링, 프로젝션, 변환, 집계 등의 작업을 수행할 수 있어, 복잡한 비동기 코드를 더 선언적이고 관리하기 쉬운 방식으로 작성할 수 있게 도와줍니다.

예를 들어, HTTP 요청, DOM 이벤트, 타이머 등 다양한 소스로부터 생성된 비동기 데이터 스트림을 RxJS를 사용하여 쉽게 다룰 수 있습니다. 이를 통해 개발자는 비동기 코드의 복잡성을 줄이고, 데이터 스트림을 통해 발생하는 다양한 시나리오를 쉽게 조작하고, 여러 데이터 스트림을 결합하고, 에러 처리를 보다 우아하게 할 수 있습니다.

RxJS는 프론트엔드 개발, 특히 Angular 프레임워크에서 널리 사용되며, Angular의 HTTP 클라이언트 및 이벤트 처리와 같은 비동기 작업을 처리하는 데 있어 중심적인 역할을 합니다. 하지만 그 사용범위는 Angular에 국한되지 않으며, 모든 JavaScript 환경에서 유용하게 사용될 수 있습니다.

CapacitorJS

 CapacitorJS는 웹 기술을 활용하여 iOS, Android 및 웹 플랫폼을 위한 크로스 플랫폼 앱을 개발할 수 있도록 해주는 오픈 소스 프레임워크입니다. Capacitor를 사용하면 HTML, CSS 및 JavaScript/TypeScript 같은 웹 기술을 사용하여 하나의 코드베이스로 다양한 플랫폼에 배포할 수 있는 애플리케이션을 만들 수 있습니다.

Capacitor는 Ionic 팀에 의해 개발되었으며, 특히 Ionic 프레임워크와 함께 사용하기 위해 설계되었습니다. 그러나 Ionic과 독립적으로 어떤 웹 프레임워크나 라이브러리와도 함께 사용될 수 있습니다. 이는 웹 뷰를 기반으로 작동하지만, 네이티브 기능에 접근할 수 있는 API를 제공하여 웹 앱이 마치 네이티브 앱처럼 느껴지게 합니다.

CapacitorJS는 네이티브 코드와의 통합을 용이하게 하고, 플러그인 시스템을 통해 네이티브 기능을 확장할 수 있는 기능을 제공합니다. 또한, 개발자들이 필요에 따라 자체 네이티브 코드를 쉽게 추가할 수 있도록 설계되었습니다. 이를 통해 웹 앱이 카메라, GPS, 파일 시스템 등의 네이티브 기능을 사용할 수 있게 합니다.

Publish/Subscribe (Pub/Sub) 패턴

Publish/Subscribe (Pub/Sub) 패턴은 메시징 패턴 중 하나로, 메시지를 보내는 출판자(publisher)와 메시지를 받는 구독자(subscriber)가 직접적인 연결 없이 메시지를 교환할 수 있는 방식입니다. 이 패턴은 분산 시스템, 이벤트 주도 아키텍처, 메시지 큐 시스템 등에서 널리 사용됩니다.

기본 개념

  • Publisher: 메시지를 발행하는 주체로, 특정 토픽에 대한 정보를 보냅니다. 발행자는 메시지를 받을 구독자가 누구인지, 또는 메시지가 어떻게 전달되는지에 대해서는 알지 못합니다.

  • Subscriber: 메시지를 구독하는 주체로, 관심 있는 토픽을 구독하고 해당 토픽에 대한 메시지가 발행될 때마다 그 메시지를 받습니다.

  • Message: 특정 데이터 또는 정보를 담고 있는 패킷으로, 특정 토픽에 대한 정보를 포함할 수 있습니다.

  • Topic: 메시지를 분류하기 위한 범주 또는 채널입니다. 구독자는 하나 이상의 토픽을 구독할 수 있으며, 발행자는 하나의 토픽에 대해 메시지를 발행할 수 있습니다.

  • Broker or Message Queue: 발행자와 구독자 사이의 중개자 역할을 합니다. 메시지의 라우팅, 버퍼링, 전달 등을 담당합니다. 구독자와 발행자 사이를 연결하고, 구독자가 오프라인일 때는 메시지를 저장해 둘 수도 있습니다.

장점

  • 탈중앙화: 구독자와 발행자 간에는 직접적인 연결이 없어, 각자의 처리량과 성능에 영향을 주지 않습니다.
  • 확장성: 새로운 발행자나 구독자를 시스템에 추가하는 것이 비교적 쉽습니다.
  • 유연성: 구독자는 필요한 메시지만 선택적으로 받을 수 있으며, 발행자는 구독자의 존재를 신경 쓰지 않고 메시지를 발행할 수 있습니다.
  • 비동기 처리: 구독자는 메시지를 자신의 처리 속도에 맞추어 처리할 수 있으며, 메시지는 중간에 버퍼링 될 수 있습니다.

단점

  • 메시지 보장: 일부 Pub/Sub 시스템에서는 메시지가 항상 전달되리라는 것을 100% 보장하지 않습니다 (At-least-once, At-most-once, Exactly-once 등의 배달 보장 수준에 따라 다름).
  • 복잡성: 시스템의 규모가 커질수록, 더 많은 수의 토픽과 메시지 관리로 인해 복잡성이 증가할 수 있습니다.
  • 디버깅과 모니터링: 분산된 nature로 인해 디버깅과 모니터링이 더 어려울 수 있습니다.

예시

  • IoT 디바이스: 다양한 센서들이 온도, 습도 등의 데이터를 발행하고, 이를 분석하는 서버들이 해당 토픽을 구독하여 데이터를 처리합니다.
  • 서비스 간 통신: 마이크로서비스 아키텍처에서 서비스 간의 결합도를 낮추기 위해 사용됩니다.
  • 이벤트 주도 아키텍처: 사용자의 행동에 따른 이벤트를 발행하고, 이를 여러 시스템에서 구독하여 반응합니다.

메시지 브로커로는 Apache Kafka, RabbitMQ, Google Pub/Sub, Amazon SNS/SQS 등이 널리 사용됩니다.

C++ 의 vector

 

std::vector는 C++ 표준 템플릿 라이브러리(STL)의 일부로서, 동적 배열과 유사한 구조를 가진 컨테이너입니다.

std::vector의 주요 특징:

  1. 동적 크기: 백터는 크기가 동적으로 변경될 수 있습니다. 즉, 런타임에 항목을 추가하거나 제거할 수 있습니다.
  2. 연속 메모리: 백터는 내부적으로 연속된 메모리 공간에 데이터를 저장합니다. 따라서 배열처럼 인덱스를 사용하여 빠르게 접근할 수 있습니다.
  3. 자동 메모리 관리: 백터는 내부적으로 메모리를 자동으로 할당하고 해제합니다.

std::vector의 사용 예:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers;

    // 값을 추가합니다.
    numbers.push_back(1);
    numbers.push_back(2);
    numbers.push_back(3);

    // 인덱스를 사용하여 값에 접근합니다.
    std::cout << numbers[1] << std::endl;  // 출력: 2

    // 크기와 용량을 조회합니다.
    std::cout << "Size: " << numbers.size() << std::endl;  // 출력: 3
    std::cout << "Capacity: " << numbers.capacity() << std::endl;

    // 반복자를 사용하여 백터의 요소를 반복합니다.
    for(int num : numbers) {
        std::cout << num << " ";
    } // 출력: 1 2 3

    return 0;
}

이 외에도 std::vector는 여러 메서드와 기능을 제공합니다. 예를 들면 inserteraseresizereserve 등이 있습니다. C++의 std::vector를 효과적으로 사용하려면 해당 메서드와 기능들을 숙지하는 것이 중요합니다.

Cimetech Bluetooth Numeric Keypad, 22-Keys Wireless Number Pad K304 Manual

Cimetech Bluetooth Numeric Keypad, 22-Keys Wireless Number Pad K304 Manual PDF
https://drive.google.com/file/d/1bTF3H9KNUHBFiseui2qHGQ92Vx_uVYGG/view?usp=drive_link

Amazon Link
https://www.amazon.ca/cimetech-Multi-Function-Accounting-Extensions-Compatible/dp/B0BG8BPN9C?ref_=ast_sto_dp&th=1

애플 실리콘을 능가하는 퀄컴의 새 프로세서

 Qualcomm은 새로운 Snapdragon Elite X 칩을 발표하여 노트북 시장에서 Intel, AMD 및 Apple과의 경쟁력을 강화하려 한다. 이 칩은 2024년부터 노트북에서 사용 가능하며 인공 지능 작업을 더 잘 처리할 수 있도록 재설계되었다. Qualcomm은 X Elite가 일부 작업에서 Apple의 M2 Max 칩보다 빠르며 Apple 및 Intel PC 칩보다 에너지 효율이 뛰어나다고 주장했다.

이 새로운 칩은 4nm 프로세스 기술을 기반으로 하며, 3.8GHz의 12개의 고성능 코어와 최대 4.3GHz까지의 듀얼 코어 부스트를 제공한다. 또한 Qualcomm은 CPU 메모리 성능을 향상시켰다고 밝혔다. Qualcomm의 이러한 발표는 PC 칩 경쟁에서 Qualcomm, Apple, Intel 간의 레이스를 가열시키고 있으며, Qualcomm은 Snapdragon X Elite를 “PC용으로 만든 가장 강력한 컴퓨팅 프로세서”로 부르며, 최고 수준의 CPU 성능, 선도적인 기기 내 AI 추론 및 매우 효율적인 전문 처리 기능을 제공한다고 주장했다.

이러한 발표와 새로운 칩 기술은 Qualcomm이 노트북 시장에서 Intel, AMD 및 Apple과의 경쟁에서 어떻게 위치할지에 대한 통찰력을 제공하며, 노트북 사용자에게 더 나은 성능과 효율성을 제공할 가능성을 보여준다.

특히 소프트웨어 개발자 입장에서 애플 실리콘 칩을 내장한 맥이 최신 인텔 칩을 내장한 윈도 PC 보다 컴파일이나 트랜스파일링 속도가 빠르지도 않았으며 가격이 비싸 가성비가 떨어지는 선택이었다. 장점은 어떠한 작업을 해도 하루 종일 버티는 베터리, 빠른 비디오 처리와 압축정도 였는데 이것은 개발자 입장에선 꼭 필요한 장점은 아니다.

하기 싫은 일, 미루는 일을 하는 간단한 방법

 


미루는 사람들의 특징

  • 주의력이 부족하다.
  • 학업 과제를 수행하는데 드는 시간에 대해 과소평가한다.
  • 과제에 대한 불쾌감을 과대평가한다.
  • 자신의 학습 행동의 효율성에 대해 비현실적으로 낙관적이다.
  • 시간관리를 잘하지 못한다.
  • 충동을 억제하기 힘들다.


해결책

  • 저 일을 완료하지 못하면 하고 싶은 것을 못한다는 규칙을 만든다. 예를 들면 이런거지. 저 일을 마치지 못하면 식사, 게임이나 섹스등은 못한다. 는 규칙을 만들고 주위 사람들이나 지인들에게 오픈하고 꼭 지키는 것이다. 그리고 일을 마치면 완료한 것에 대한 포상으로 못하던 것을 한번 하는 것이다. 쉽지 않은가? 꼭 해보시라. (반박하시면 당신이 옳습니다)

1분마다 죽었는지 확인하고 죽었으면 다시 시작시키는 cron job 설정하는 법

1분마다 특정 서비스의 상태를 확인하고, 해당 서비스가 중지되었을 경우 다시 시작시키는 작업을 cron을 사용하여 자동화하려면 다음과 같은 절차를 따르면 됩니다:

  1. 스크립트 작성
  2. 먼저, 서비스 상태를 확인하고 필요한 경우 시작시키는 스크립트를 작성합니다. 아래 예시는 gnome-remote-desktop.service를 대상으로 합니다.

    #!/bin/bash
    
    status=$(systemctl is-active gnome-remote-desktop.service)
    
    if [ "$status" != "active" ]; then
        sudo systemctl start gnome-remote-desktop.service
    fi
        
  3. 스크립트 실행 권한 부여
  4. 스크립트에 실행 권한을 부여합니다:

    chmod +x /path/to/check_service.sh
  5. sudoers 파일 수정
  6. sudo 명령어를 비밀번호 없이 실행할 수 있도록 설정해야 합니다. 이를 위해 sudoers 파일을 수정합니다:

    sudo visudo

    아래의 내용을 파일의 마지막에 추가합니다 (여기서 username은 실제 사용자 이름으로 바꿔주세요):

    username ALL=(ALL) NOPASSWD: /bin/systemctl start gnome-remote-desktop.service
  7. cron job 설정
  8. crontab을 사용하여 새로운 cron job을 추가합니다:

    crontab -e

    다음 내용을 에디터의 마지막에 추가합니다:

    * * * * * /path/to/check_service.sh

    이제 check_service.sh 스크립트는 1분마다 실행됩니다.

    주의: cron을 사용할 때는 경로와 환경 변수가 제한적이므로 절대 경로를 사용하는 것이 좋습니다. 필요한 경우 스크립트 내에서 환경 변수를 설정해 주세요.

C++ 의 참조 개념

C++에서의 참조는 변수나 객체의 별칭을 제공하는 방법입니다. 참조를 사용하면 변수나 객체에 대한 간접적인 접근을 할 수 있습니다. 여기서 주요 포인트와 예제를 통해 C++의 참조 개념을 설명하겠습니다.

  1. 참조의 선언:
    참조는 & 기호를 사용하여 선언됩니다. 예를 들어, int 타입의 변수에 대한 참조는 다음과 같이 선언할 수 있습니다.

    int num = 10;
    int &ref = num;
    
  2. 참조의 특징:

    • 참조는 선언과 동시에 초기화되어야 합니다.
    • 한번 초기화된 참조는 다른 변수나 객체를 참조하도록 변경할 수 없습니다.
    • 참조는 NULL 값을 가질 수 없습니다.
  3. 참조와 포인터의 차이:

    • 포인터는 메모리 주소를 저장하는 반면, 참조는 별칭으로 작동하며 메모리 주소를 직접 저장하지 않습니다.
    • 포인터는 *& 연산자를 사용하여 역참조하고 주소를 얻는 반면, 참조는 추가적인 연산자 없이도 원래의 변수나 객체에 접근할 수 있습니다.
  4. 참조의 활용:

    • 함수의 인자로 사용될 때, 값을 복사하는 것이 아닌 원래의 변수나 객체에 대한 접근을 제공하므로 효율적입니다.
    • 함수에서 여러 값을 반환할 필요가 있을 때 사용됩니다.
  5. 예제:

    void swap(int &x, int &y) {
        int temp = x;
        x = y;
        y = temp;
    }
    
    int main() {
        int a = 5, b = 10;
        swap(a, b);
        cout << "a: " << a << ", b: " << b;  // a: 10, b: 5
        return 0;
    }
    

    위의 예제에서 swap 함수는 참조를 인자로 받아 원래의 변수의 값을 직접 변경합니다.

이러한 참조의 개념은 C++에서 매우 중요하며, 효율적인 프로그래밍을 위해 잘 알아두어야 합니다.