[컴] 3-way merge

merge / diff / 3way / 3-way / three-way merge /git merge

3-way merge

우리가 단순하게 diff 를 한다고 생각하면, 2개의 file을 비교하는 것을 생각한다.

이전의 merge 는 단순하게 이전파일(이것을 A라고 하자)에서 현재파일(이것을 B라고 하자.)을 비교하는 것을 생각했다.

A <--> B

그런데 version control system(vcs) 에서 이 방식은 문제가 발생한다. 하나의 file에 대해서 한사람만 수정하는 것이 아니라 여럿이 하나의 파일을 수정하는 경우가 발생한다.

이 경우 당연히 같은 시간에 같은 위치에 대한 작업이 발생하고, 이것에 대한 판단이 어려워진다.

예를 들어 ’AC’라는 내용이 있는 file을 수정하는 경우, 한쪽은 ABC 로 수정하고, 한쪽은 ADC 로 수정했다고 하자. 그러면 이것이 merge 될때, B를 선택할지 D를 선택할지 알 수 없다.

이것을 2-way merge를 사용하는 경우라면, 단순히 ABC –> ADC 로 변화한 것으로 판단하게 된다. 그런데 3-way merge를 보면, ‘ABC’와 ’ADC’ 의 같은 origin 인 ‘AC’와 비교한다. 그래서 ’AC –> ABC’ 와 ‘AC –> ADC’ 두개를 보고, 추가를 해야할 곳이 ’BD’모두를 추가해야 한다고 판단할 수 있다.

---------------------> time flies

                            +------+
                            | A    |
                            | +B   |
+-----+     +-----+         | +D   |
| AC  | --> | ABC | --------| C    |
+-----+     +-----+         +------+  
   |                          ^
   |               +-----+    |
   +-------------> | ADC | ---+ 
                   +-----+    
                      
                    

좀 더 자세하고, 다양한 설명은 ref. 1을 참고하도록 하자.

Reference

  1. version control - Why is a 3-way merge advantageous over a 2-way merge? - Stack Overflow

[컴] Blind 에서 알려진 빅테크 기업의 연봉

연봉 / 미국 연봉 / big tech / 개발자 연봉 / 처우 /

Blind 에서 알려진 빅테크 기업의 연봉

우리가 흔히 아는 앱인 블라인드에서 각 회사 사람이 밝힌 연봉을 가지고 블라인드에서 자료를 만들어서 공표했따.

책임(Principle) 엔지니어의 평균 연봉

  • 기술 직무에서 가장 높은 직급에 해당
  • 아마존: 69만 1,000달러(약 9억 원)
  • 메타와 구글로 두 곳 모두 65만 5,000달러
  • 애플과 마이크로소프트도 50만 달러로 비슷한 수준
from ref. 1

개인적인 생각

개인적으로 개발자로서 마음에 든다. 이유는 개발자로서 최고지위가 되면, 대략 650만달러, 달러당 1000원으로 계산해도 6억5천만원 수준에 도달할 수 있기 때문이다. 열심히 개발에 매진하게 해주는 환경이라고 생각한다.

See Also

  1. Microsoft의 급여 가이드라인 유출. 연봉, 채용 보너스 및 주식 보상범위가 직급별로 | GeekNews

Reference

  1. 빅테크 5곳 개발자 연봉 비교해 보니··· 신입은 구글·메타, 관리직은 아마존이 연봉 높은 편 - CIO Korea

[컴] docker에서 db container를 실행한 이후에 app container 에서 flywayMigration 실행

podman / 도커

docker에서 db container를 실행한 이후에 app container 에서 flywayMigration 실행

주의할점은 나는 podman (root)과 podman-compose (root)를 이용했다. 여기 정리된 이슈에는 docker를 이용하면 발생하지 않을 문제도 있을 수 있다.

처음에 하려던 것은 다음과 같다.

  1. 다음 2개의 container를 만들고
    • DB container 1 개
    • Application 1개(WAS)
  2. DB 가 run 한 이후에 app 을 이용해서, db 의 초기값을 생성(flywayMigration)
    • Application –> DB : database 생성
    • Application –> DB : flywayMigrate 실행

최종적으로 만든 내용은 다음 repo에 있다.

발생했던 이슈

tips

  • terminal 접속
    • compose2.yml 을 만들어 사용
    • 계속 run 하도록 해서 terminal 을 열때는, compose.yml 을 복사해서, entrypoint 에 tail -f /dev/null 을 넣어서 사용하자.
    • docker compose -f compose2.yml up

[컴] mariadb:lts docker image 사용

mariadb 사용 / docker 사용시 mariadb 가 실행이 안된다 / 접근이 안된다. / 도커/ 도커로 마리아 디비 사용 / 실행

docker image ‘mariadb:lts’ 사용

환경

  • podman
  • wsl2
  • windows 10

compose.yml

아래처럼 ’docker compose’를 이용해서 mariadb 를 실행했다.

주의할 점은 entrypoint 를 따로 주면 안된다. mariadb:lts의 Dockerfile를 보면 알지만, entrypoint 에 실행하는 script 가 있다.

  • ENTRYPOINT ["docker-entrypoint.sh"]

entrypoint 를 재정의해서 이것을 실행하지 않으면, db 가 실행되지 않는다.

version: '3.8'
services:
  db:
    image: mariadb:lts
    restart: always
    environment:
      MARIADB_ROOT_PASSWORD: rootpw
    ports:
      - "3326:3306"
    # 이러면 안된다.
    # entrypoint:
    #   - tail
    #   - -f
    #   - /dev/null
    networks:
      - test-network
    volumes:
      # - d:\a\cat:/cat
      - /mnt/d/a/cat/db_data/:/var/lib/mysql

networks:
  test-network:
    driver: bridge

db가 뜬 이후에 어떤 작업을 할 수 있는 방법

windows 에서 접근하기

windows 에서 wsl image 에 접근하기 위한 ip address

아래처럼 windows 에서 wsl hostname -I를 하면 알 수 있다. 아래의 경우에 172.17.192.211 을 사용해서 wsl 에 접근할 수 있다.

wsl hostname -I
172.17.192.211 10.89.1.1

db 에 접근

위처럼 mariadb 가 실행되면 windows 에서 접근할 수 있다. 위의 경우 ‘3326’ port 로 접근하면 된다.

"d:\a\appss\MariaDB 10.5\bin\mysql.exe" -u root -p -h 172.17.192.211 -P 3326

See Also

  1. 쿠…sal: [컴] docker에서 db container를 실행한 이후에 app container 에서 flywayMigration 실행

[컴] python 에서 cryptography 사용

encrypt / encryption / decrypt / 암호 / 암호화 / 복호화 / 파이썬

python 에서 cryptography 사용

이전에 사용했던 PyCrypto 가 이제 더이상 유지보수 되지 않는다. 그래서 페이지에서 추천한 cryptography 를 사용해봤다.


import os
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding

from urllib.parse import quote
import base64
import json

class Crypto:
    def __init__(self, key, iv) -> None:
        
        self.cipher = Cipher(algorithms.AES(key), modes.CBC(iv))
        self.encryptor = None
        self.decryptor = None

    def encrypt(self, plainText: str):
        # padding
        padder = padding.PKCS7(128).padder()
        padded_data = padder.update(plainText) + padder.finalize()

        if not self.encryptor :
            self.encryptor = self.cipher.encryptor()
        return self.encryptor.update(padded_data) + self.encryptor.finalize()

    def decrypt(self, encryptedText: str):
        if not self.decryptor :
            self.decryptor = self.cipher.decryptor()
        decrypted = self.decryptor.update(encryptedText) + self.decryptor.finalize()
        return self.unpad(decrypted)

    def unpad(self, data):
        # unpadding
        unpadder = padding.PKCS7(128).unpadder()
        unpadded_data = unpadder.update(data) + unpadder.finalize()
        return unpadded_data

key = os.urandom(32)
iv = os.urandom(16)

cryptoNut = Crypto(key, iv)
encrypted = c.encrypt(b'testpw')
encoded_encrypted = base64.b64encode(encrypted)
print(encoded_encrypted)

encrypted2 = base64.b64decode(encoded_encrypted)
descrypted = c.decrypt(encrypted2)
print(descrypted)

Reference

  1. Welcome to pyca/cryptography — Cryptography 42.0.0.dev1 documentation

[컴] spring R2DBC에서 mariadb 연결

springboot r2dbc 연결 / db 연결 / database 연결 / 디비연결 / helloworld / springboot helloworld / spring hello world / spring helloworld

spring R2DBC에서 mariadb 연결

절차

  1. Spring Initializr에서 dependency 넣고 project 생성
    • Spring Data R2DBC SQL
    • MariaDB JDBC and R2DBC driver.
    • Spring Reactive Web Web
    • Lombok
  2. unzip
  3. /src/main/resources/application.properties 설정
    • spring.r2dbc.url
    • spring.r2dbc.username
    • spring.r2dbc.password
  4. gradlew
  5. JAVA_HOME 변수 확인
  6. gradlew bootRun

Spring Initializr

Spring Initializr로 가서 springboot project를 만들자

db configuration

  1. /src/main/resources/application.properties 에 설정

    spring.r2dbc.url=r2dbc:mariadb://127.0.0.1:3306/auth_server
    spring.r2dbc.username=myuser
    spring.r2dbc.password=mypass
  2. java file 설정

    아래는 ref. 5에서 가져온 code이다.

    @Configuration
    public class DatabaseConfiguration extends AbstractR2dbcConfiguration {
    
        @Override
        @Bean
        public ConnectionFactory connectionFactory() {
    
            return new PostgresqlConnectionFactory(PostgresqlConnectionConfiguration.builder()
                    .host("localhost")
                    .port(5432)
                    .username("username")
                    .password("password")
                    .database("mydb")
                    .build());
        }
    
    }

실행 결과

오전 10:46:25: Executing 'bootRun'...

Starting Gradle Daemon...
Connected to the target VM, address: '127.0.0.1:63799', transport: 'socket'
Gradle Daemon started in 890 ms
> Task :compileJava UP-TO-DATE
> Task :processResources
> Task :classes
Disconnected from the target VM, address: '127.0.0.1:63799', transport: 'socket'
> Task :bootRunMainClassName
Connected to the target VM, address: 'localhost:63866', transport: 'socket'

> Task :bootRun

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::               (v2.7.14)

2023-08-23 10:46:31.110  INFO 28476 --- [           main] com.mycom.test1.Test1Application         : Starting Test1Application using Java 17.0.6 on DESKTOP-V8P2I3H with PID 28476 (D:\a\prog\test02-from-springinitializer\test1\build\classes\java\main started by namh in D:\a\prog\test02-from-springinitializer\test1)
2023-08-23 10:46:31.112  INFO 28476 --- [           main] com.mycom.test1.Test1Application         : No active profile set, falling back to 1 default profile: "default"
2023-08-23 10:46:31.367  INFO 28476 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data R2DBC repositories in DEFAULT mode.
2023-08-23 10:46:31.372  INFO 28476 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 2 ms. Found 0 R2DBC repository interfaces.
2023-08-23 10:46:32.138  INFO 28476 --- [           main] o.s.b.web.embedded.netty.NettyWebServer  : Netty started on port 8080
2023-08-23 10:46:32.143  INFO 28476 --- [           main] com.mycom.test1.Test1Application         : Started Test1Application in 1.247 seconds (JVM running for 1.461)

gradlew bootRun 시점에 VM Option 사용방법

gradle.build 에 다음 내용을 추가하면 gradlew bootRun 을 실행할 때 parameter 로 넘겨진 값들이 적용된다.

bootRun {
  // support passing -Dsystem.property=value to bootRun task
  systemProperties = System.properties
}

Reference

  1. Unblock Your Applications with R2DBC, Spring Data and MariaDB | MariaDB
  2. Native R2DBC Code Example — MariaDB Documentation
  3. Getting Started | Accessing data with R2DBC
  4. Spring Boot R2DBC + MySQL example - BezKoder
  5. java - How to set up database connection in r2dbc? - Stack Overflow
  6. 쿠...sal: [컴] Spring Boot 간략 정리

[컴][swe] 일할 때 대면이 필요한 이유

대면근무 좋은 점 / 오프라인 근무 / 온라인 근무 단점 / 원격 근무 리코트 / 원격보다 사무실 근무 / ms

일할 때 대면이 필요한 이유

다음 링크는 사무실근무에 대한 마이크로소프트 워크랩의 연구 결과이다. 이글은 대한 번역, 정리이다.

하이브리드 역설:

  • 2021년 Work Trend Index (The Next Great Disruption Is Hybrid Work—Are We Ready?) 에서 하이브리드 역설(hybrid paradox)을 발견
    • 70% 이상이 유연한 근무를 원했고
    • 65% 이상이 팀과 더 많은 대면 시간을 갈망
  • 새로운 연구
    • 사람들이 사무실에 있는 일수보다, 중요한 순간을 만드는 것이 중요

대면시간(in-person)이 가장 유익한 중요한 3가지 순간들:

  1. 팀 응집력 강화
  2. 새로운 role, 팀, 회사에 대한 시작(Onboarding)
  3. project 의 시작(kick off)

1. 팀 결속력 강화

  • Dawn Klinghoffer, 마이크로소프트의 people analytics 의 책임자
  • 코로나 이전에는 회사의 61% 의 팀들이 같은 위치에 있었다.
  • 현재는 27% 만이 같은 위치에 있다.
  • 최신 마이크로소프트 직원들 대상으로 설문조사
    • 93%의 직원들이 위치에 상관없이 팀으로 협력할 수 있다고 확신
    • 동료와의 연결품질을 중립또는 부정적으로 이야기한 직원의 의견을 보면,
      • 그중 29%는 remote work 가 의미있는 연결과 관계들을 만드는 것을 어렵게 한다고 말했다.
    • 회사에 오는 직원들은 그냥 협력이 아니라 연결에 보낼 시간을 찾고 있다는 것을 알 수 있었다.
    • 팀의 성공을 위해 회사가 제공해야 할 대면 활동이 무엇일까라는 질문
      • 그중 1위를 차지한 대답(37%)가 사회적 관계와 팀 구축활동에 관한 것이었다.

9월 2022 Work Trend Index :

  • 85%의 직원이 동료들과의 사회적관계를 맺기위해 회사로 가고 싶어했다.
  • 또한 팀의 유대감을 재구축하려는 열망으로 가고 싶어했다.


  • 대면 시간은 개개의 직원에게 더 넓은 팀과 조직 의 성공에서 자신이 수행하는 역할을 상기시켜 줄 수 있다.

Work Trend Index report 에서

  • 직속팀원과 긍정적관계를 맺는 직원
    • 더 나은 삶(wellbeing)을 보여준다.
    • 더 높은 생산성을 보여준다.
    • 이직을 할 가능성도 더 낮다.
  • 외부의 네트워크 강화도 중요
    • 직속팀원 이외의 사람과 긍정적인 관계가 있으면,
    • 회사에 대해 더 만족하고
    • 업무에 더 만족하고
    • 직장 스트레스에 대해 더 긍정적인 생각(outlook)을 가지고 있다고 한다.

2. 새로운 역할, 새로운팀, 새로운 회사의 시작

  • 시작할 시점에 관리자나, 같이 onboarding 하는 친구를 만나면, 명확한 작업을 더 쉽게 만든다.
  • 90일이내 관리자를 만난 직원은 90일이내에 관리자를 못만난 직원보다,
    • 피드백을 얻고
    • 팀의 조언을 구하고
    • 동료와 강력한 관계 구축
    • 어려운 문제논의할 때 지원받을 가능성이 더 높았다.
  • onboarindg buddy 를 90일이내 만나는 것도 좋은 영향을 줬다. (새로운 팀으로 이전을 도와주는 팀메이트)
    • 피드백을 얻을 가능성이 높다.
    • 팀으로 부터 소속감 느낄 확률이 높다.
    • 팀으로 부터 믿음을 받을 확률이 높다.
    • 그들이 영향을 미치는 방법이 명확하다고 보고할 가능성이 높고,
    • 그것을 위한 도구도 가지고 있다고 보고할 가능성이 높다.
    • 그러나 다음 분야에서는 의미있는 점수를 얻지 못했다.
      • 그들이 원하는 지원을 찾거나, 그들의 조직의 비젼을 이해하고나, 그들의 이해관계자를 아는 것들
  • 새로운 사원이 ‘관리자’ 및 ’팀원’과의 신뢰를 더 빨리 쌓으면
    --> 더 빨리 팀과 회사의 생산적인 기여자가 된다.
  • 사원이 마찰을 줄이면서 업무와 우선 순위를 이해하는 데 도움이 된다.
    • 가까운 안내를 받을 수 있고,
    • 즉각적인 피드백
    • 도움, 명확함, 문화(tacit knowledge)에 대해 쉽게 접근할 수 있다.
  • 신입사원은 그들이 정기적으로 같은 장소에서 그들의 팀동료와 일할 때 좀 더 활기를 느꼈다.
  • 대면시간(in-person time) 회사 규범(company norms)과 팀 활력(team dynamics)을 관찰할 수 있는 기회를 제공
    • 이것이 신입사원에게는 특히 중요할 수 있다.
  • 관리자를 초기에 만나는 것은 좋은 결과를 내는데 도움을 주지만, 이후엔 주기적으로 면담을 할 필요가 없다.

3. 프로젝트 시작

  • onboarding 과정에서 대면시간에 의해 얻는 이점과 같은 좋은 점이 있다.
  • 프로젝트 라이프사이클의 초기단계에서 유용한다.
  • Microsoft 365 Copilot project 킥오프는 대면으로 진행됐다.
    • 물리적 근접성이 동료가 자신을 이해한다고 느끼는데 도움이 된다.
    • 누구나 다른 사람이 자신의 말을 듣는 다는 느낌을 좋아한다. –> 옆에서 이야기할 때 이 느낌을 받기가 더 쉽다.
  • 상호 신뢰와 조율이 이루어지면 창의적인 아이디어가 샘솟는다.
    • 혁신을 이으키는 데 도움을 주고, 틀에 박히지 않은 사고를 촉발하는 데 도움을 준다.
    • 연구에서, 대면그룹이 같은 시간동안 가상그룹보다
      • 18% 더 많은 창의적인 아이디어를 냈다.
      • 14% 더 많은 아이디어를 냈다.
  • 프로젝트 초기에 만나는 것은 좀 더 효과적으로 다음의 것들을 공유할 수 있게 해준다.
    • 문화(tacit knowledge),
    • 명확성(get clarity),
    • 각자의 역할 정립(establish individual roles),
    • 노력을 조율(coordinate their efforts)

요점

  • 원격 근무는 대면 근무와 마찬가지로 이점이 있다.
  • 팀마다 다르지만 한 가지 분명한 것은 이러한 균형을 찾는 데는 의도적인 접근이 필요하다
  • 팀에서 수행하는 업무 유형을 고려하고 직접 모여야 하는 주요 시점이나 이유를 결정해야 한다.

Reference

  1. In the Office, It’s All About Moments That Matter