$ brew install python@3.11  을 하면  python3.11 은 실행되지만 python 명령어는 실행되지 않는다.

 

이 때 pyenv를 사용해서 해결하면 향후 프로젝트 별로 다른 python을 실행할 때도 도움이 된다.

애시당초 pyenv를 먼저 설치하고 python을 설치하는 것이 더 좋은 방법같다.

 

1.  $brew install pyenv

2. $pyenv install python3.11.5 

3. $pyenv global 3.11.5

4. $echo 'eval "$(pyenv init -)"' >> ~/.bashrc     하고 터미널 재시작 혹은 source .bashrc 실행 

 

 

 

Posted by yongary
,

프런트로 Stream을 리턴하는 방식은 프런트 처리시 난이도가 높아서, 특수한 경우에 한해 사용하면 좋다.

1. Flux나 Observable 생성: WebFlux나 RxJava에서 Flux 또는 Observable을 사용하여 데이터 스트림을 생성합니다. 이 스트림은 비동기적으로 데이터를 생성하거나 가져올 수 있습니다.
    dependencies { implementation 'org.springframework.boot:spring-boot-starter-webflux' }

2. 예제코드  : 보통 Flux를 리턴하고 데이터가 1/0 개일경우는 Mono 리턴. 

import reactor.core.publisher.Flux;

    @RestController
    public class StreamController {

        @GetMapping(value = "/stream-data", produces = "text/event-stream")
        public Flux<String> streamData() {
            // 스트림 생성 예제 (여기서는 간단한 문자열 스트림)
            return Flux.just("Data 1", "Data 2", "Data 3")
                    .delayElements(java.time.Duration.ofSeconds(1)); // 1초마다 데이터 전송
        }
    }

 

 

Posted by yongary
,

mtools

mongoDB, redis 2023. 9. 5. 17:59

mtools를 통해 EXPLAIN과 같이 slow query를 분석할 수 있다.

/var/logs/mongod 

밑에 있는 로그 파일을 50mb 정도의 사이즈로 나눠서

mloginfo --queries --no-progressbar 쪼개진파일.log > slow_queries.txt
(mtools 파이썬 패키지 설치하면 mloginfo라는 executable 생깁니다)

하면 늦은 query를 분석할 수 있다. 

Posted by yongary
,

Object, Vector

java core 2023. 8. 31. 23:44

Object class에 기본 포함되는 함수는

  • public boolean equals(Object o) 
  • public String toString()
  • finalize() : 가비지 콜렉션이 정리할 때 사용
  • public native int hashCode()  - 대략적인 hashCode 이며
  • clone()
    (그 외 wait, notify 등)

 

Vector 와  ArrayList의 차이
- Vector는 synchronized라서 Thred Safe하고 좀 늦다는 게 가장 큰 차이이고
- 둘 다 고정 사이즈이고 내부적으로는 array를 사용하며,  size를 증가시킬 때 Vector는 100%씩 증가, ArrayList는 50%씩 증가. 

 

 

 

Posted by yongary
,

bean 종류

springBoot gradle 2023. 8. 31. 23:12

spring에서 bean은 아무 생각없이 만들면

spring container에서 singleton 으로 만들어 준다.

(즉, 전체 sping container에서 항상 동일한 하나의 global instance로 bean을 만들어 준다)

 

따라서 immutable이고 status도 없이 만드는 것이 좋음.

 

만약, 다른 용도로 만드려면

 

Prototype Bean - 매번 생성

Session Bean  - WEB 세션별로 생성

Request  Bean - WEB Request별로 생성

이 존재하며..

 

 

@Component

@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)     과 같이 annotate 한다.

    - @Scope("prototype") 만 해도 되지만.. 위에 방식이 더 안전.

 

 

xml에서 할 경우에는
<baen id="note" class="my.Note" scope="prototype"> 으로 한다.

 

Posted by yongary
,

React 팁스

React.js 2023. 8. 26. 00:39

1. json obj 이용 세팅

   setCount(prev => prev + 1) 처럼 json이용해서 사용하려면

   setUser (prev => { ...prev, name:'kim'} ) 하면 안된다.  이유는 { 를 함수시작으로 인식하기 때문이며, 해결 법은 2가지인데
       setUser(prev => (
{...prev, name:'kim'}) ) 괄호이용 ,   usetUser (prev => { return {prev..., name:'kim'} }) return 이용.

 

2. handleChange 에서 e.target.name 이용

    const handleChange = e => {

          setUser( {...user, 
                         [e.target.name]: e.target.value} ).  이렇게 중괄호(curly brace)를 이용하면  변수를 이용해 필드설정 가능

   }                                                                                   => 여러개 의 input text 를 하나의 handleChange로 이용하게 된다.
    

 

3. 페이지 reload 하는 경우

const TestApp = () => {

        console.log("reloaded");  // setQuantity(0) 호출시 안찍힘. setQuantity(1) 호출시 찍힘. 즉 state가 바뀔때만 reload

                                                      // json obj는 같은 {age:1} 대신  {age:1} 형태로 같은 내용이라도 pointer가 항상 바뀌므로 찍힘.

        const [quantity, setQuantity] = useState(0)

        const totalPrice = quantity * 5;   // useState 필요없이 이 방식대로 해도 page가 reload 될 때마다 재계산된다.                   

}

 

4. api호출 취소

  axios는 cancelToken 이용
  fetch는 AbortController 의   controller.signal 이용해서  취소

 

Posted by yongary
,

관련 react JSX코드:

   <div className="App">
      <h2> CSS Sample </h2>
      <div className="MyDiv">
         <div className="Child"></div> * 5개
         
      </div>
      <div className="MyDiv" style={{display:'flex', justifyContent:'spaceBetween'}}>
        <div className="Child" > </div>
        <div className="Child" > </div>
      </div>
      <div className="MyDiv">c</div>
    </div>

 

<POSITON 4가지 - 기본 static은 제외 >  - 4개 포지션은 left,top,right, bottom 제공.

  • relative -  기본static과 거의 동일하지만 left/top 등을 쓰면  dom흐름에서 좀 벋어난다. 
  • absolute -  (sticky가 아닌 다른 포지션에 대해, 없을경우는 전체 window에 대해)  left, top을 고정한다. 
                      =>  그래서 부모를 relative로 하면 제일 좋고,  부모를 absolute로 해도 좋음.
  • fixed - absolute와 비슷하나, fixed는 스크롤도 되지 않고 그자리 고정된다(absolute는 parent에 고정되므로 스크롤이 따라서 됨)
  • sticky = (relative+fixed) : 보통은 relative처럼 동작하지만, 스크롤시 fixed 처럼 동작한다. 

 

<grid >  display:flex와 함께 display:grid 가 유연한 레이아웃을 제공.  flex에서도 flex-wrap: wrap; 으로 어느정도 구현가능.

Posted by yongary
,

 

혹시 TreeMap TreeSet에서 element가 primitive일때 reverseOrder로 간단히 하려면.

TreeMap<Integer,Integer> tm = new TreeMap<>(Collections.reverseOrder());

 

  public static int[] mergeSortedArrays(int[] arr1, int[] arr2) {
        int[] result = new int[arr1.length + arr2.length];
        int i = 0, j = 0, k = 0;

        while (i < arr1.length && j < arr2.length) {
            if (arr1[i] < arr2[j]) {
                result[k++] = arr1[i++];
            } else {
                result[k++] = arr2[j++];
            }
        }

        while (i < arr1.length) {
            result[k++] = arr1[i++];
        }

        while (j < arr2.length) {
            result[k++] = arr2[j++];
        }

        return result;
    }
}
Posted by yongary
,

dynamic 프로그래밍은  로직만으로 계산이 어려워서
컴퓨터에게 반복적으로 계산도 시키고, 캐싱도 시키면서  캐싱된걸 이용해 나가면서 답을 구하는 방법이다.

 

문제 예제 1 . 숫자 n 만 주고, 가능한 모든 BST 개수 구하기.

   - BST(binary search tree: child는 max 2개이고, left child는 작은값, right child는 큰값) 

Posted by yongary
,

소프트웨어 아키텍처 패턴

정의

소프트웨어 아키텍처 패턴은 시스템의 전반적인 구조를 설명합니다. 아키텍처 패턴은 시스템의 핵심 구조와 그 구조의 특징을 묘사하며, 대규모 설계 문제를 해결하기 위한 고수준의 템플릿입니다.

종류

  1. 계층형 패턴 (Layered Pattern): 시스템을 독립된 계층으로 나누고 각 계층간의 상호작용을 정의합니다.
     Presentation Layer, Application Layer,  Domain Layer(비즈니스 로직), Infra Layer(데이터베이스 상호작용)

  2. 클라이언트-서버 패턴: 클라이언트와 서버의 역할 분리로 서비스 요청과 처리를 관리합니다.
  3. MVC (Model-View-Controller) 패턴: 사용자 인터페이스와 비즈니스 로직을 분리하여 관리합니다.
     View(사용자 상호작용) -> Controller에서 Model(비지니스 로직)과  View사이의 중계자 역할을 하게 됨. 
  4. 이벤트 버스 패턴: 컴포넌트 간 메시지를 중앙 이벤트 버스를 통해 전달합니다.
  5. 마이크로서비스 패턴: 작은 서비스로 분할하여 독립적으로 운영 및 개발할 수 있게 합니다.
    그 외 6~10번   더 나열하자면...  
    (Master-slave pattern 
    . Pipe-filter pattern  - 파이프를 통해 흐르는 데이터를 중간중간 필터 모듈이 처리하는 패턴. 
    . Broker pattern 
    . Peer-to-peer pattern 
    . Blackboard pattern  - "블랙보드"에 비유되는 중앙 저장소에 데이터를 공유 . 
     (interpreter패턴도 여기 들어갈 수 있는데, 아래꺼랑 헤깔려서 일단 제외)

 

 

SW 디자인 패턴

정의

디자인 패턴은 소프트웨어 설계 단계에서 특정 문제를 해결하는 일반적인 해법을 제공합니다. 디자인 패턴은 보다 구체적이며, 작은 범위의 설계 문제에 적용됩니다.

종류

  1. 생성 패턴: 객체 생성과 관련된 패턴으로, 싱글턴, 팩토리 메서드, 추상 팩토리, 빌더, 프로토타입 등이 있습니다.
  2. 구조 패턴: 객체 간의 구조화된 관계를 설명하는 패턴으로, 어댑터, 브리지, 컴퍼지트, 데코레이터, 퍼사드, 플라이웨이트, 프록시 등이 있습니다.
  3. 행동 패턴: 객체 간의 상호작용과 책임을 다루는 패턴으로, 책임 연쇄, 명령, 해석자, 반복자, 중재자, 메멘토, 옵저버, 상태, 전략, 템플릿 메서드, 방문자 등이 있습니다.

Posted by yongary
,