Competitive Progrmming Helper의 약자로 백준같은 사이트에서 testcase같은걸 긁어다가 vscode에서 할 수 있게 해준다.

chrome에서도 확장프로그램을 설치해야하고(Competitive Companion)

vscode에서도 확장을 설치해야한다(Competitive Programming Helper)

 

원격ssh로 실행하는 경우는 포트전달이 필요할수도 있다.

27121포트전달

 

반응형

'Programming > Problem Solving' 카테고리의 다른 글

double과 관련된 핸들링  (0) 2021.12.26
백준 4103 ATM  (0) 2020.05.05
백준 15481 그래프와 MST  (0) 2020.05.02
BST 트리 구현  (0) 2020.04.09
인접행렬, 인접리스트  (0) 2020.04.09

왼쪽 하단 SSH부분 클릭해서 연결정보를 설정해준다.

 

처음에 Linux냐 Windows냐 mac이냐를 묻는 화면이 지속적으로 나온다면 Ctrl+,를 누른다음 위처럼 remote.ssh.remotePlatform을 검색해서 해당 ip에 대한 값을 linux등으로 정해주면 된다.

반응형

'Programming' 카테고리의 다른 글

yaml  (0) 2024.03.02
디자인패턴  (0) 2023.08.17
라즈베리파이 초기 세팅  (0) 2023.01.20
STL lower_bound, upper_bound  (0) 2020.04.12

 

앵커와 별칭

resource_prefix: &resourceprefix Search

yaml내에서 위와 같은 구문이 있을 때, 

resource_prefix 부분은 키에 해당하며, python등 외부 프로그램에서 이 키로 조회하면 맨 오른쪽 Search가 조회된다.

resourceprefix 부분은 앵커에 해당하면 yaml파일내에서 *resourceprefix로 표현하면 Search로 대체된다.

Search부분은 밸류에 해당

즉 &로 표현된 앵커가 빠지면 일반적인 yaml key-value설정인데 중간에 앵커가 들어가서 yaml내 alias기능을 추가했다고 보면 된다. 

반응형

 

INNER JOIN

기존의 where절을 사용하여 두 테이블을 결합하는 방식과 동일

SELECT *
FROM table1, table2
WHERE table1.id = table2.id;

예를 들어 과거방식으로 위처럼 하는것도 inner join이며 아래처럼 명시적으로 INNER JOIN키워드를 사용할수도 있다.

SELECT *
FROM table1
INNER JOIN table2 ON table1.id = table2.id;

내가 볼때는 가독성 측면에서 오히려 퇴화한것 같기는 하지만 아래 소개할 다른 조인과의 통일성 측면에서 이해하면 좋을듯 하다.

 

 

 

LEFT JOIN

그냥 INNER JOIN과 다르게 null허용 조인으로 이해하면 편하다.

예를들어 다음과 같은 쿼리를 생각해보자.

SELECT a.name, b.department
FROM employee_table a
LEFT JOIN department_table b
ON a.department_id = b.department_id;

그럴경우 다음처럼 특정인물이 아직 부서배치 받기 전이더라도 NULL일지언정 조회가 된다(inner조인이었으면 조회에 포함이 안됐을것)

name department
john marketing
smith null
jake IT

 

반응형

여기 참조

단순 인덱싱을 넘어서는 고급 인덱싱의 한 형태로, 검색어를 통한 indirect 인덱싱형태로 다른 정보들을 가져올때 사용한다.

즉, 검색어를 일종의 포인터 삼아서 다른곳에서 값들을 가져오는것.

 

주요포인트

  • 키워드에 대해서 문서범위를 넘어서는 글로벌 범위에서 가중치를 부여하는게 아님(문서 내 가중치)
  • 반환되는 문서의 개수나 종류는 키워드 매칭에 기반하고, payload는 순서나 가중치에만 영향을 줄 수 있음
  • 주로 색인시 할당되며, 정적인 정보를 처리한다. 실시간 처리에는 다른 방식이 권장된다.

 

예시: 뉴스검색

1. Payload를 사용하지 않는 경우 (단순 인덱싱)
검색 쿼리: 사용자가 "블록체인"이라는 키워드로 뉴스 기사를 검색합니다.
인덱싱: 모든 기사에서 "블록체인"이라는 키워드를 포함하는 부분을 색인합니다. 색인은 키워드의 존재 여부에 초점을 맞춥니다.
검색 결과: "블록체인" 키워드를 포함하는 모든 기사가 결과로 반환됩니다. 결과는 키워드의 빈도수나 기사의 일반적인 인기도에 따라 정렬됩니다.
결과의 특징: 반환된 기사들은 "블록체인"이라는 키워드를 포함한다는 공통점이 있지만, 키워드의 위치나 문서 내의 중요도에 따른 차별화된 가중치는 고려되지 않습니다.

 

2. Payload를 사용하는 경우 (고급 인덱싱)
검색 쿼리: 동일하게 사용자가 "블록체인"이라는 키워드로 뉴스 기사를 검색합니다.
인덱싱과 Payload: 기사 내에서 "블록체인" 키워드가 나타나는 위치(예: 제목, 첫 문단, 본문)에 따라 다른 payload 값을 부여합니다. 제목에 나타날 경우 높은 가중치를, 본문에만 나타날 경우 낮은 가중치를 부여합니다.
검색 결과와 Payload 활용: 검색 결과는 "블록체인" 키워드를 포함하지만, payload 값을 기반으로 정렬됩니다. 이를 통해 제목에 "블록체인"을 포함한 기사가 본문에만 해당 키워드가 있는 기사보다 더 높은 순위에 배치됩니다.
결과의 특징: 검색 결과는 단순히 키워드의 존재 여부를 넘어서, 키워드의 위치와 문서 내 중요도에 따라 세밀하게 조정됩니다. 사용자는 주제에 대해 더 중요하고 관련성 높은 기사를 우선적으로 볼 수 있습니다.

 

결론
Payload를 사용하지 않는 경우, 검색 결과는 단순히 키워드의 존재와 빈도에 의존합니다. 반면, payload를 사용하는 경우,

검색 결과의 순위나 가중치가 키워드의 문서 내 위치와 맥락에 따라 조정되어 사용자에게 더 관련성 높은 정보를 제공합니다.



 

 

반응형

'Programming > Data Engineering' 카테고리의 다른 글

Solr - Facet  (0) 2024.01.13

영단어 Facet은 보석세공후 한 단면을 의미. Solr에서는 여기서 하나의 측면이라는 의미를 따 왔다.

페이싯 기능은 통계적 정보를 검색결과에 추가한다고 이야기할 수 있으며, 사용자가 대량의 데이터 속에서 필요한 정보를 빠르고 정확하게 찾을 수 있도록 도와주는 강력한 도구로 활용될수 있다.

 

 

솔라검색 예시

검색: http://localhost:8983/solr/컬렉션명/select?q=과학&facet=true&facet.field=장르

출력:

{
  "responseHeader":{
    "status":0,
    "QTime":10
  },
  "response":{"numFound":123,"start":0,"docs":[
      {
        "제목":"천체물리학 입문",
        "저자":"스티븐 호킹",
        "장르":"천문학",
        "가격":20000
        // 기타 도서 정보
      },
      // 검색된 다른 책들의 정보
    ]
  },
  "facet_counts":{
    "facet_fields":{
      "장르":[
        "천문학", 34,
        "생물학", 29,
        "물리학", 20,
        "지질학", 10,
        // 기타 장르 및 해당 장르의 책 개수
      ]
    }
  }
}

위에서 facet_counts부분이 facet과 관련되어 추가된 부분이다.

 

가격관련 facet예시

검색: http://localhost:8983/solr/컬렉션명/select?q=노트북&facet=true&facet.range=가격&facet.range.start=0&facet.range.end=2000000&facet.range.gap=500000

q=노트북: "노트북"이라는 키워드로 검색합니다.
facet=true: 페이싯 기능을 활성화합니다.
facet.range=가격: "가격" 필드를 기준으로 범위 페이싯을 적용합니다.
facet.range.start=0: 가격 범위의 시작을 0원으로 설정합니다.
facet.range.end=2000000: 가격 범위의 끝을 2,000,000원으로 설정합니다.
facet.range.gap=500000: 가격 범위의 간격을 500,000원으로 설정합니다.

 

출력:

{
  "responseHeader":{
    "status":0,
    "QTime":15
  },
  "response":{"numFound":250,"start":0,"docs":[
      {
        "제품명":"모델 A 노트북",
        "브랜드":"브랜드X",
        "가격":1500000
        // 기타 제품 정보
      },
      // 검색된 다른 노트북들의 정보
    ]
  },
  "facet_counts":{
    "facet_ranges":{
      "가격":{
        "counts":[
          "0-500000", 25,
          "500000-1000000", 75,
          "1000000-1500000", 100,
          "1500000-2000000", 50
        ]
      }
    }
  }
}

 

 

반응형

'Programming > Data Engineering' 카테고리의 다른 글

Solr - payload  (0) 2024.01.16

다음 코드를 보자(주석을 주의깊게 볼 것)

package org.example;
import reactor.core.publisher.Flux;
import reactor.core.scheduler.Schedulers;
public class Main {
	public static void main(String[] args) {
		Flux.just("a", "b", "c", "d")  // 1,2,3,4 네개의 아이템을 순차적으로 방출하는 단일 스트림 생성
			.map(s -> {  // 스레드 분기 없이 호출 스레드에서 해당 스트림 아이템에 대해서 대문자변환 연산수행(아래 .subscribe를 만나기 전까지 지연됨!)
				System.out.println("Map 1 - Thread: " + Thread.currentThread().getName());
				return s.toUpperCase();
			})
			.publishOn(Schedulers.boundedElastic())  //이후 작업은 boundedElastic이라는 사전정의된 별도 스레드에서 하도록 지정함!
			.map(s -> {
				System.out.println("Map 2 - Thread: " + Thread.currentThread().getName());
				return s + "!";
			})
			.subscribe(  // 지연 실행을 시작하는 시점이며, 마지막 스케줄러 지정이 boundedElastic이라 boundedElastic 스레드를 통해 수행됨
				s -> System.out.println("Received " + s + " on Thread: " + Thread.currentThread().getName()));
	}
}

실행결과

> Task :Main.main()
Map 1 - Thread: main
Map 1 - Thread: main
Map 1 - Thread: main
Map 1 - Thread: main
Map 2 - Thread: boundedElastic-1
Received A! on Thread: boundedElastic-1
Map 2 - Thread: boundedElastic-1
Received B! on Thread: boundedElastic-1
Map 2 - Thread: boundedElastic-1
Received C! on Thread: boundedElastic-1
Map 2 - Thread: boundedElastic-1
Received D! on Thread: boundedElastic-1

 

 

예제를 조금 수정한 코드를 보자.

package org.example;
import reactor.core.publisher.Flux;
import reactor.core.scheduler.Schedulers;
public class Main {
	public static void main(String[] args) {
		Flux.just(1, 2, 0, 4)  // 1,2,0,4 네개의 아이템을 순차적으로 방출하는 단일 스트림 생성
			.map(n -> {  // 스레드 분기 없이 호출 스레드에서 해당 스트림 아이템에 대해서 나누기변환 연산수행(아래 .subscribe를 만나기 전까지 지연됨!)
				System.out.println("Map 1 - Thread: " + Thread.currentThread().getName());
				return 10 / n;
			})
			.publishOn(Schedulers.boundedElastic())  //이후 작업은 boundedElastic이라는 사전정의된 별도 스레드에서 하도록 지정함!
			.map(s -> {
				System.out.println("Map 2 - Thread: " + Thread.currentThread().getName());
				return s + "!";
			})
			.doOnNext(s -> {  // 스트림에 영향을 주지 않으면 로깅등 부가작업을 할때 사용
				System.out.println("doOnNext - Thread: " + Thread.currentThread().getName() + " with value: " + s);
			})
			.doOnError(error -> {  // Exception이 발생한 경우만 여기로 떨어진다.
				System.out.println("Error occurred - Thread: " + Thread.currentThread().getName() + " with error: " + error.getMessage());
			})
			.subscribe(  // 지연 실행을 시작하는 시점이며, 마지막 스케줄러 지정이 boundedElastic이라 boundedElastic 스레드를 통해 수행됨
				s -> System.out.println("Received " + s + " on Thread: " + Thread.currentThread().getName()));
		// boundElastic스레드로 중간에 분기되기 때문에 이 출력이 마지막 줄이 아닐 수 있다!
		// 자바에서는 main함수가 종료되더라도 다른 스레드가 강제종료되지 않는다!
		System.out.println("main end");
	}
}

실행결과

> Task :Main.main()
Map 1 - Thread: main
Map 1 - Thread: main
Map 1 - Thread: main
Map 2 - Thread: boundedElastic-1
doOnNext - Thread: boundedElastic-1 with value: 10!
Received 10! on Thread: boundedElastic-1
Map 2 - Thread: boundedElastic-1
doOnNext - Thread: boundedElastic-1 with value: 5!
Received 5! on Thread: boundedElastic-1
main end
Error occurred - Thread: boundedElastic-1 with error: / by zero

이 예시에서는 onDoNext, onDoError, main end시 스레드 종료 개념을 추가적으로 배울 수 있다.

주석을 주의깊에 보면 되기 때문에 따로 설명은 안하겠다.

반응형

'Programming > JAVA' 카테고리의 다른 글

BiFunction, Function을 사용한 함수형 프로그래밍  (0) 2024.01.01
java Optional  (1) 2023.11.04
java enum  (0) 2023.11.03
IntelliJ 팁  (0) 2023.11.03
java공부  (0) 2023.08.12

다음 코드를 보자.

public class SimpleFunctionExample {

    public static void main(String[] args) {
        double powResult = power(2, 3);
        String result = formatResult(powResult);

        System.out.println(result);
    }

    private static double power(int a, int b) {
        return Math.pow(a, b);
    }

    private static String formatResult(double number) {
        return "Result: " + number;
    }
}

실행결과 Result: 8

 

power함수와 formatResult함수를 만들고 farmatResult(power(2,3)) 이렇게 중첩함수를 사용했다.

반면 BiFunction, Function을 사용하면 다음처럼 andThen, apply를 통해 함수형 프로그래밍으로 체이닝을 할 수 있다.

코드출처: https://codechacha.com/ko/java8-bifunction-example/

import java.util.function.BiFunction;
import java.util.function.Function;

public class BiFunctionExample2 {

    public static void main(String[] args) {

        BiFunction<Integer, Integer, Double> func1 = (a1, a2) -> Math.pow(a1, a2);
        Function<Double, String> func2 = (a1) -> "Result: " + a1;

        String result = func1.andThen(func2).apply(2, 3);

        System.out.println(result);
    }
}

실행결과는 동일하다.

 

반응형

'Programming > JAVA' 카테고리의 다른 글

reactor #1  (1) 2024.01.01
java Optional  (1) 2023.11.04
java enum  (0) 2023.11.03
IntelliJ 팁  (0) 2023.11.03
java공부  (0) 2023.08.12

mac에서 brew install python@3.6 등의 명령으로 여러버전의 python을 설치할 수 있으나, 과거 버전은 지원하지 않는다.

이때 pyenv를 통해서 여러버전의 python을 동시에 운용할 수 있다.

먼저 brew install pyenv를 통해서 pyenv를 설치한다음

pyenv install 3.6 등의 명령어를 통해 필요한 버전을 설치하면 된다.

해당 버전으로 전환하기 위해서는 먼저 .zshrc또는 .bashrc파일에 다음 내용을 추가해야한다.

(참고로 macOS의 경우 요즘엔 zsh이 기본이다)

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"

그다음 source ~/.zshrc 또는 source ~/.bashrc로 적용하고

 

pyenv global 3.6 등의 명령어를 통해 버전을 전환하면 된다.

global은 시스템 전체에서 기본적으로 사용할 Python 버전을 설정하라는 명령어이다.

local을 대신 쓰면  그 프로젝트의 디렉터리 내에서만 사용할 Python 버전을 따로 설정할 수 있다.

pyenv versions 를 통해서 현재 시스템에 설치된 버전들을 볼 수도 있다.

pyenv global system을 하면 원래 시스템의 python으로 돌아갈 수도 있다.

 

virtualenv와의 관계

pyenv
역할: pyenv는 여러 버전의 Python을 설치하고 관리하는 데 사용됩니다. pyenv를 사용하면 시스템 전체에 걸쳐 여러 Python 버전을 설치하고, 각각을 필요에 따라 선택하여 사용할 수 있습니다. 이를 통해 서로 다른 프로젝트에서 다른 Python 버전을 쉽게 사용할 수 있습니다.

activate 명령어: pyenv는 환경을 활성화하기 위해 activate 명령어를 직접 사용하지 않습니다. 대신, pyenv local, pyenv global, pyenv shell 같은 명령어를 통해 Python 버전을 설정합니다. 이러한 설정을 통해 특정 디렉터리나 세션에서 사용할 Python 버전을 자동으로 활성화하게 됩니다.

많은 사용자들은 pyenv 를 사용하여 여러 Python 버전을 관리하고,
virtualenv (또는 pyenv 의 플러그인인 pyenv-virtualenv )를 사용하여 특정 버전에 대한 독립적인 개발 환경을 생성합니다. 이렇게 하면 Python 버전 관리와 프로젝트 의존성 관리를 모두 효과적으로 할 수 있습니다.

 

반응형

'Programming > Python' 카테고리의 다른 글

venv  (0) 2023.12.17
mypy / pytype  (1) 2023.10.07
python 한글 스트링 인코딩 핸들링  (0) 2021.11.30
Python GUI Programming(Tkinter)  (0) 2021.01.02
파이선환경 그리고 requirements.txt  (0) 2020.09.20

 

venv는 virtualenv와 비슷하며 특징을 정리하면 다음과 같음

 

venv

  • venv는 python개발진에 의해 개발되었으며, python3.3부터 등장과 동시에 표준라이브러리로 공식 지원됨.
  • 공식 지원되므로 별도의 설치과정이 필요 없음

 

virtualenv

  • virtualenv는 python 2버전 시절 부터 널리 사용되었으며, 따라서 지금도 python2버전을 지원함
  • virtualenv가 표준으로 채택되지 않은 이유는 더 간단하고 일관된 환경을 만들기 위한 판단이었던것으로 보임
  • virtualenv는 venv보다 더 많은 기능을 제공. 예를 들어, 특정 버전의 Python을 지정하여 가상 환경을 생성할 수 있음
  •  Python 표준 라이브러리에 포함되어 있지 않기 때문에 별도로 설치해야 함
반응형

'Programming > Python' 카테고리의 다른 글

pyenv를 통한 python버전 변경  (0) 2023.12.17
mypy / pytype  (1) 2023.10.07
python 한글 스트링 인코딩 핸들링  (0) 2021.11.30
Python GUI Programming(Tkinter)  (0) 2021.01.02
파이선환경 그리고 requirements.txt  (0) 2020.09.20

+ Recent posts