git submodule

기타 2023. 11. 18. 22:51

1 서브모듈 추가하고 싶은 폴더로 가서 

$git submodule add https://github.com/example/submodule.git path/to/submodule

 

2 변경 사항 커밋: 서브모듈을 추가한 후, .gitmodules 파일과 서브모듈 디렉토리에 대한 변경 사항을 커밋합니다.

git add .
git commit -m "Add submodule"

 

3. git push

 

========= 

전체 pull 하고 싶을때
최초한번

git submodule update --init --recursive

 

그 후 

git submodule update --remote --recursive

Posted by yongary
,

github

기타 2023. 11. 9. 22:23

 

ChatGPT

GitHub에서 특정 리포지토리를 clone하고 SSH 키를 설정하여 반복적으로 로그인하지 않도록 하는 방법은 다음과 같습니다:

  1. GitHub 계정 만들기 및 SSH 키 설정:
    • GitHub에 가입하려면 https://github.com/ 에서 가입 프로세스를 따릅니다.
    • 계정을 만들었다면, 로그인하세요.
    • SSH 키를 생성하려면 터미널 또는 명령 프롬프트에서 다음 명령을 실행합니다:이 명령에서 "your_email@example.com" 부분을 본인의 이메일 주소로 바꿉니다. 키 생성 중에 암호를 설정하라는 메시지가 나오면 암호를 설정하세요. 암호는 SSH 키를 사용할 때 필요할 수 있습니다.
    • mathematicaCopy code
      $ssh-keygen -t ed25519 -C "your_email@example.com"
    • 키 생성이 완료되면, 공개 키를 GitHub에 추가해야 합니다. 터미널에서 다음 명령으로 공개 키를 복사합니다:
    • bashCopy code
      $cat ~/.ssh/id_ed25519.pub
      ==> 공개키는  한 줄이며 ssh-ed25519 AAA로 시작하고 이메일로 끝납니다.
      • 공개 키를 클립보드에 복사한 후, GitHub 계정 설정 페이지로 이동하여 "SSH and GPG keys" 섹션에 공개 키를 추가합니다.
  2. 리포지토리 Clone:
    • SSH 키가 GitHub에 등록되었으면, 해당 리포지토리를 clone할 수 있습니다. 터미널에서 다음 명령을 사용하여 리포지토리를 clone합니다:여기서 사용자명과 리포지토리명을 실제 사용자명과 리포지토리 이름으로 바꿉니다.
    • scssCopy code
      $git clone git@github.com:사용자명/리포지토리명.git

 

 

 

만약 A PC에서 생성한 SSH 키를 B PC에서도 사용하려면, A PC에서 생성한 키를 B PC로 복사해야 합니다.

  1. 공개 키와 개인 키 복사 A PC의 SSH 키 파일을 B PC로 이동합니다. 예를 들어, 기본 경로(~/.ssh/id_ed25519와 ~/.ssh/id_ed25519.pub)를 복사합니다.
  2. bash
    코드 복사
    # A PC에서 B PC로 복사 (B PC의 IP가 192.168.1.100이고 사용자명이 user라고 가정) scp ~/.ssh/id_ed25519* user@192.168.1.100:~/.ssh/
  3. 권한 설정 B PC에서 복사한 파일의 권한을 올바르게 설정합니다:
  4. bash
    코드 복사
    chmod 600 ~/.ssh/id_ed25519 chmod 644 ~/.ssh/id_ed25519.pub
  5. SSH 에이전트에 추가 (B PC에서) 복사한 키를 SSH 에이전트에 추가합니다:
  6. bash
    코드 복사
    eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_ed25519 

    혹은 Window에서는 관리자용-PowerShell에서 아래방식이 잘됨.

Start-Service ssh-agent

ssh-add C:\Users\<YourUsername>\.ssh\id_ed25519

 

혹시 git 이 잘 안된다면 $which ssh 를 해보면 /usr/bin/ssh 가 나오는 경우가 있는데,
이걸 "/c/Windows/System32/OpenSSH/ssh" 를 사용하도록 바꿔야 한다.

 

간단하게 mv /usr/bin/ssh /usr/bin/ssh-backup 으로 없애버리면 된다.

Posted by yongary
,

postgreSQL array관련

BACK-END 2023. 9. 24. 18:29

postgreSQL에서 array필드를 query할 땐 아래처럼 하면 된다.
(tags가  TEXT[] 필드일 때 가정..==>  INSERT시에는 ARRAY['tag1', 'tag2']) 로 삽입.

 

== MyBatis. xml ===

<select id="getTags" resultType="string">
    SELECT array_agg(tag) AS tags
    FROM (SELECT unnest(tags) AS tag FROM posts) AS subquery
</select>

 

== java 코드 ==

public interface TagMapper {
    List getTags();
}

 

SqlSession sqlSession = sqlSessionFactory.openSession();
try {
    TagMapper tagMapper = sqlSession.getMapper(TagMapper.class);
    List<String> tags = tagMapper.getTags();
    
    // 결과(tags)를 처리
} finally {
    sqlSession.close();
}

 

Posted by yongary
,

 

JAVA python
for (int i = 0; i < arr.length; i++)     //0~99
     System.out.println( 'A')
for i in range(0,  len(arr)) :            #0~99
     print('A')

Arrays.sort 
         Collections.reverseOrder()


indexOf
a = [2,3,4, 1]
a.sort()
a.reverse()

[기본기능]
a.append( 7) 뒤에추가, 
a.index(7)  ==> 4 
a.insert( 위치=0,  99 )   특정위치에 추가, 위치기본값=0
a.remove는 value를 제거 => 이거보단 아래 filter 추천.

List 
   stream().map 
   .filter
   
list : 키워드 
arr = list(map(lambda x:x*2, arr))
arr = list(filter(lambda x:x>=2, arr))


HashMap  혹은 javascript의 json과 유사점도 많음
  hm.getKeys().stream()
  hm.getValues().stream()

딕셔너리. dic = [1:'kim', 2:'lee']
dic[1] ==> 'kim'. 혹은  dic.get(1) 
dic.keys
dic.values
class A {
   생성자 public A( ) 
}
class A:
    def __init__ (self):  
        self.value = 0
함수 및 static 느낌 x = 1
def add(num):
    global x
     return num + x
stream * boolean 느낌 -> 여러개 모두 체크 (java엔 없음) all([true, true, true])  --> true
any([treu, false, false])  ===> true

Posted by yongary
,

$ 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
,