반응형

 

올해는 드디어 기회가 돼서 AWS submmit 에 다녀온 후기를 남겨볼까 한다. 난 경력이 적지 않은 편이라고 생각하는데, 이런 기술 행사를 다녀온 경험이 별로 없다. 

5월 16일~17일 동안 코엑스 컨벤션 센터에서 열렸고, 엄청난 인기를 경험했다. 

 

내가 생각하는 AWS 가 잘하는 비지니스 전략은 IT 트렌드한 신기술을 고객 관리형 서비스로 빠르게 출시하면서 시장 점유율을 높이는 것이다. 따라서 AWS 기술 행사에는 고객이 선택하고 집중하는 IT 트렌드를 엿 볼 수 있다고 믿는 편이다.

 

기조연설에서 기억에 남았던 내용은 2가지다. the frugal architect (검소한 아키텍트)가 돼서 비지니스 전략과 트래픽의 변화에 맞게 인프라 비용을 유연하게 절감하자는 내용과 생성형 AI 애플리케이션 개발 트렌드와 Amazon Bedrock 이다. 

 

우리 회사도 파트에서 Data on EKS 전략으로 넘어가면서 비용 절감에 큰 노력을 하고 있기 때문에,  배경과 목적이 크게 공감이 됐다. 그리고 앞으로 데이터 엔지니어링 영역이 생성형 AI 개발안에서도 RAG 영역에서 활용될 수 있는 부분이 흥미롭게 들렸다. 

 

개인적으로 EMR on EKS 를 주제로 발표한 우아한 형제들과 쿠팡의 레드시프트,  karpenter 주제를 맡은 요기요, 그리고 당근마켓의 실시간 분석에 대한 주제가 궁금했는데, 아쉽게도 당근마켓만 듣지 못했다. 세션 간 대기 시간이 30분이나 되는데도, 미리 줄을 서지 못해 못 들어갔다.. ㅎㅎ

 

내가 들었던 세션은 모두 큰 도움이 될 만한 내용들이었다. emr on eks 의 스케쥴러 도입과 karpenter 최적화 (사용 중인 provisioner 가 nodepool 로 대체됨) 등 해야 할 일들이 많이 생겼다.  

 

나도 내년에는 의미 있는 내용과 경험으로 저런 큰 행사에서 발표를 해보고 싶은 마음이 크게 들었다.

 

조금 더 열심히 해야겠다.

 

 

 

 

반응형
반응형

1. 문제 소개

 

1969번: DNA

DNA란 어떤 유전물질을 구성하는 분자이다. 이 DNA는 서로 다른 4가지의 뉴클레오티드로 이루어져 있다(Adenine, Thymine, Guanine, Cytosine). 우리는 어떤 DNA의 물질을 표현할 때, 이 DNA를 이루는 뉴클레오

www.acmicpc.net

 

2. 코드


# 2개의 DNA 뉴클레오티드로부터 해밍디스턴스의 길이를 반환하는 함수
def get_hamming_distance(dna1,dna2,m):
    hamming_distance = 0

    for i in range(m):
        if dna1[i] != dna2[i]:
            hamming_distance += 1

    return hamming_distance

def get_test_case():
    input_str= input().split(" ")
    h,m = int(input_str[0]),int(input_str[1])
    dna_list = ['' for x in range(h)]
    for i in range(h):
        dna_list[i] = input()
    return h, m, dna_list

def solution():
    H,M,DNA_list = get_test_case()
    min_dna = ''

    for i in range(M):
        alphabet_count = [0 for x in range(26)] 
        for dna in DNA_list:
            ch = ord(dna[i])
            alphabet_count[ch % 65] += 1
        max_count = max(alphabet_count)
        org_ch = alphabet_count.index(max_count) + 65
        dna_char = chr(org_ch)
        min_dna += dna_char
    min_hamming_distance_sum = 0

    # 해밍디스턴스의 합을 구하기
    for dna in DNA_list:
        min_hamming_distance_sum+= get_hamming_distance(dna,min_dna,M)
    print(f"{min_dna}\n{min_hamming_distance_sum}")

if __name__ == '__main__':
    solution()

 

 

3. 코멘트

  • 문제해결의 전략은 아래와 같다.
    • 해밍 디스턴스의 최소가 되는 DNA 문자열 = 입력 문자열 { DNA s(1)..s(n) } 에서 자리 별 최대 중복 문자로 조합된 문자열  
    • 최대 중복수가 같거나 없다면 사전 순 가장 처음으로 오는 영어 문자 배치
    • 문자열 카운팅은 배열과 아스키코드를 이용해서 구하기
  • 처음에 예제 입력에서 해답인 DNA s 를 구하는 것으로 생각하고 구현했다가 시간을 버렸다. 
  • 역시 문제는 꼼꼼히 읽고 해석해야 한다.. 그리고 오늘 같이 날씨가 너무 좋은 날에 스터디에 참여한 스터디원 들이 고맙다.

 

 

 

반응형
반응형

 

 

 

“패턴 시커”는 책 제목이다. 

 

자폐적 성향을 보인 인물들이 뛰어난 체계화 능력으로 높은 성과를 이뤄낸다는 주제를 담은 책인데, 사실은 나도 읽어보진 못했다. 

자폐에 대한 얘기가 하고 싶어서보다는 책의 제목이 마음에 들었기 때문이다. 

 

어떻게 보면 내가 하는 일도 Pattern seek이다. 업무에서 규칙을 찾고, 이를 자동화하는 업무도 내 일이다.

 

에디슨을 좋아하진 않지만, 그는 ‘만일-그리고-그렇다면’ 패턴으로 1만 번씩 검토하는 연구와 실험을 통해 새로운 패턴을 발견하고, 발명품 개발로 이어졌다고 한다. Pattern seek 은 좋은 결과를 만들어내는 중요한 작업임이 틀림없다.

 

우리도 가끔은 멈춰서 해결해야 할 문제를 정리하고 체계화해서 패턴을 찾는 방법을 써보는 것도 좋을 것 같다. 

 

 

 

 

 

 

반응형
반응형

1.성능 비교를 위한 예제코드

 
import time
import dis

SIZE=10000000
def func_forloop():
    start_time = time.time()
    factor = 1
    bucket = []
    for i in range(SIZE):
        bucket.append(i * factor)
    print(len(bucket))
    end_time = time.time()
    print(f"bucket size = {len(bucket)} \nfunc_forloop execution time : {(end_time - start_time)* 1000}ms")

    
def func_list_comprehension():
    start_time = time.time()
    factor = 1
    bucket =[i * factor for i in range(SIZE)]
    end_time = time.time()
    print(len(bucket))
    print(f"bucket size = {len(bucket)} \nfunc_list_comprehension execution time : {(end_time - start_time)* 1000}ms")
    

func_forloop()
func_list_comprehension()

dis.dis(func_forloop)
print('--------------------------')
dis.dis(func_list_comprehension)

 

2.요약

  • dis 를 통해 변환된 바이트 코드를 볼 수 있다.
  • for loop 는 리스트에 요소를 추가하는 작업을 append method 를 쓰고, list comprehension 은 LIST_APPEND 라는 바이트 코드를 쓴다.
  • 인터프리터 모드에서 동작하는 프로그램에서 ListComprehension 에서 바이트를 특별 처리하므로 성능이 빠르다. 구글링해보면 타 블로그에서 컴파일 할 경우 for loop와 성능이 비슷해진다는 실험을 봤다. 따라서 list comprehension 만을 고집할 필요도 없다.
반응형
반응형

1.레디스 란?

  • Redis = Re(remote) + di(Dictionary) + s (Server )
  • 메모리를 사용하는 db
  • NoSQL, Replication, Master/Slave 구조로 구성이 가능하다.
  • K/V 형태로 데이터 저장.
  • 파일 싱크를 제공
  • 다양한 데이터 타입 제공
  • Strings, Lists, Set, Hashes, Sorted Sets
  • NoSQL 이기 때문에 Table, db, function, row, column 이 존재 하지 않는다
  • 데이터 Interaction 이 Command 를 통해서 이뤄진다.

 

2.왜 레디스?

  • Simple , Flexible
  • Schema, Table, 이 필요없다.
  • Durable
  • Disk 에 데이터를 저장하는 옵션이 있다.
  • 깃헙, 스냅챗, 트위터, 스택오버플로우 등 다양한 서비스에서 사용중

 

** 추가 정보

  • 100만개의 키들을 저장할때 70MB 정도 공간이 소모 된다.
  • 100만개 - 70 MB. 1억개 - 약 7GB,
  • HashType은 매우 효과적으로 인코딩된 사전구조로 되어 있어, Redis 코어 개발자중 한명인 Pieter Noordhuis가 추천함
  • 아이디를 버킷 사이즈로 divid 한 값을 버킷으로 사용. 예를 들어 버킷 사이즈를 1000개로 만든다면?? 아이디를 1000으로 나눈다. >HSET 'mybucket:1155' '11552' '939' >HGET 'mybucket:1155' '11552'
  • HashType 을 이용하여 버킷으로 저장 하는경우 100만 키 - 16MB
  • 데이터를 durable 할 수 있게 파일에 쓰는 옵션이 다양한데, 안전한 옵션일 수록 redis의 속도를 느리게 한다.

 

3.레디스 도커 컨테이너를 이용하여 빠르게 올려보기

 

A) 레디스 구축 명령어 history

#네트워크 생성
$sudo docker network create redis-net

#레디스 서버 
$sudo docker run --name my-redis --network redis-net -p 6379:6379 -v /home/deploy/redis_data:/data -d redis:alpine redis-server --appendonly yes

# 레디스 컨테이너 실행
$sudo docker run --name my-redis --network redis-net \
-p 6379:6379 \
-v ./redis_data:/data \
-v ./redis.conf:/usr/local/etc/redis/redis.conf \
-d redis:alpine redis-server /usr/local/etc/redis/redis.conf


#레디스 CLI
$sudo docker run -it --network redis-net --rm redis:alpine redis-cli -h my-redis

sudo docker run -it --rm redis:alpine redis-cli -h my-redis
$vi redis.conf
requirepass 1111

 

 

B) redis conf

#인증 패스워드 설정
requirepass 1111

#스냅샷 파일 저장 디렉토리 경로 설정
dir /data

#스냅샷 db 파일 이름 설정
dbfilename dump.rdb

#AOF 설정 (Append-Only File) OS 레벨에서 맛탱이 갔을 때를 대비해 
appendonly yes

# 60초마다 1000번 이상 데이터 변경 시 저장
save 60 1

 

C) Redis Client Command

#인증 패스워드 설정
requirepass 1111

#스냅샷 파일 저장 디렉토리 경로 설정
dir /data

#스냅샷 db 파일 이름 설정
dbfilename dump.rdb

#AOF 설정 (Append-Only File) OS 레벨에서 맛탱이 갔을 때를 대비해 
appendonly yes

# 60초마다 1000번 이상 데이터 변경 시 저장
save 60 1
반응형
반응형

개인 노션을 정리하다 궁금해서 신입부터 경력까지 지원했던 서류와 면접을 집계해봤습니다.

 

서류 탈락 141 개 
서류 합격 56 개 
면접 수 31회 

 

 

자소서 내용까지 보니 당시 어색한 정장을 입고, 심호흡을 하며 면접실로 들어갔던 제 모습이 떠오릅니다. 

 

그 때는 노력에 비해 좋은 결과보다 실망스런 결과가 더 많았던 것 같습니다. 노력이 부족했을 수도 있겠지만 그렇게 생각하고 싶지는 않구요.  "열심히 살았구나" 라고 생각하는게 더 좋겠죠.

 

제 경험을 집약해 볼 때 면접 전에 꼭 준비하고 숙지해야 할 내용들을 대충 생각해서 정리해봅니다. 물론 데이터엔지니어 입장에서..

 

  • 다루고 있는 배치 플랫폼/ 스트리밍 플랫폼의 데이터 규모 (신입이라면 다뤄본 데이터 유형들) 
  • 일일 데이터 적재량 또는 배치 프로그램의 규모 
  • DataWarehouse / DataMart / DataLake / ETL / ELT 의 이해
  • 내가 만들었거나 운영중인 데이터 파이프라인을 그림으로 그리고 설명할 준비
  • 내 강점을 집약해서 한 문장으로 표현
  • 지원한 회사의 정보들 그리고 조사 (회사의 기술 사례 발표 또는 시스템 아키텍쳐) 
  • 면접 마지막에 면접관들에게 던질 진문들 ( 인상적인 질문일 수록 좋음 ) 

 

누군가에게 도움이 되길 바랍니다.

 
반응형
반응형

1.streamlit 이란?

파이썬 웹 프레임워크 라이브러리

데이터 사이언스와 머신러닝에 유용한 커스텀 웹 앱을 쉽게 만들어 줄 수 있다고 한다.

시각화와 차트 제공을 위한 다양한 서드파티 모듈이 있다

참고) 공공 데이터  https://www.data.go.kr/index.do

2. 왜 streamlit 을 선택할까 ?

아직 잘은 모르겠지만 내가 봤을때, 데이터 레포트를 웹 페이지로 만들고 싶은데 웹 서버 구축에 대한 부담 없이 텍스트와 마크다운 수준의 코드 만으로 띄우고 싶을때 쓰면 좋을 것 같다.

 

3. streamlit 따라 해보기

a. lib 설치

$ pip install streamlit

 

 

b. app 코드 작성하기

# import module
import streamlit as st
import pandas as pd

# Title
st.title("This is Title line")

# Header
st.header("This is a header")

st.text("This line belongs to a text")



# Markdowns
st.markdown("### This is a markdown")
st.markdown("## This is a markdown")
st.markdown("# This is a markdown")

#Select the subject from the Selectbox
subject = st.selectbox("Subjects: ",['English', 'Hindi', 'Math',
                       'Science'])
# Print the subject
st.write("Your Subject is: ", subject)



# Reading the CSV file
df = pd.read_csv("Startups_Expense.csv")
# Putting title
st.title("View of the Data shown below:")
# To visualize the data
st.write(df)

 

 

c. 실행하기

$ streamlit run app.py

 

 

 

 

d. 그 외 컴포넌트를 알아보려면?

https://streamlit.io/components

 

Components • Streamlit

Streamlit is an open-source Python framework for machine learning and data science teams. Create interactive data apps in minutes.

streamlit.io

 

반응형
반응형

1.네트워크 통신 확인이란?

  • 데이터 엔지니어 포지션이라면 파이프라인 설계나 시스템을 연동할 때 네트워크 방화벽 체크는 필수다.
  • 자주 사용하는 네트워크 통신 확인 하는 방법을 소개한다.

 

2.네트워크 통신 확인

 

telnet 으로 ACL 확인

$ telnet [IP] [port]

 

 

프록시 확인

$ traceroute -p 8020 jssvs-server.home.io
$ traceroute -p [포트] [ip]

 

curl 명령어를 이용한 확인

$ curl -v [ip]:[port]

$ curl -vvv -x [proxy ip] [ip]:[port]

 

 

ping 명령어를 이용한 확인

$ ping [IP]:[port]
반응형

'System' 카테고리의 다른 글

ssh로 서버 접속하기  (1) 2024.03.04
반응형
 

1. 문제 소개

 

2. 코드

def solution():
    N = int(input())
    cnt = 1
    iter = 1
    while iter < N:
        iter = (cnt * 6) + iter
        cnt += 1

    print(cnt)




if __name__ == '__main__':
    solution()

3. 코멘트

  • 육각형 벌집은 1개에서 7 번 -> 19번 -> 37번 .. 이렇게 증가하는데 6의 배수로 증가한다.
  • 이 규칙을 알면 몇 번째 벌집 안에 있고, 총 몇번 이동해야 하는지 구할 수 있다.
반응형
반응형

1. ssh 로 서버 접속하기란?

  • SSH 는 컴퓨터와 서버 간의 안전한 원격통신을 제공해주는 프로토콜. 즉 통신을 어떻게 하겠다는 약속이다.
  • SSH 는 암호화, 인증, 원격제어, 파일전송이 특징이다.
  • pem 키를 생성해서 ssh 명령어 프로그램을 이용해 서버에 접근할 수 있다.

 

** AWS 를 예로 vpc 를 생성하면 public / private subnet 으로 네트워크를 외/내부 망으로 구분할 수 있다.

** 보안 네트워크 아키텍쳐를 따라 private zone 에 서비스/작업 서버를 두고 public zone 에 bastion 서버를 구성해서 접근 한다.

2. SSH 접속

** 사전 조건 - 접속하는 서버 측에 22번 포트의 방화벽 오픈 룰이 구성되있어야 한다.

 

1) 명령어 라인을 이용한 방법

 

ssh -i [pem 키 ] [서버]@[호스트]

$ ssh -i ~/.ssh/sample-key.pem ec2-user@----.ap-northeast-2.compute.amazonaws.com

 

 

2) config 파일을 이용한 방법

# vi ~/.ssh/config 파일을 생성 및 수정

Host dev-bastion
    HostName ---.ap-northeast-2.compute.amazonaws.com
    User ec2-user
    IdentityFile ~/.ssh/sample-key.pem

 

$ ssh dev-bastion

 

 

 

** 그 외에 pem 키를 서버측의 authorized_keys 에 등록하는 방법도 있다.

 

** Tip)  alias 로 미리 명령어를 등록해두면 편하다.

반응형

'System' 카테고리의 다른 글

네트워크 통신 확인하기  (0) 2024.03.14

+ Recent posts