study 973

How to get temporary credential from ec2 iam role

배경 : 현재 access key와 secret key가 그냥 평문으로 박혀있습니다. 그런데 이게 보안적으로 위험해서 내가 필요한 권한을 가진 iam role을 가진 ec2에서 임시 credential을 가져와서 동작하도록 하고자 합니다. 대충 구성도를 그리면 이렇습니다. 1. 1번 ec2 즉 s3로 업로드할 수 있는 iam role을 가진 ec2를 생성합니다. 권한 가져오기 전용이므로 인스턴스는 가장 작은거로 적당하게 만듭니다. 2. 1번 ec2의 메타데이터를 가져와서 2번 ec2에서 사용해야 합니다. 1번 ec2에 인스턴스 메타데이터 서비스 구성을 해줘야 합니다. aws cli로 아래 구문을 실행해줍니다. instance-id는 1번 ec2의 instance-id로 설정합니다. 참고로 아래 aws콘솔..

data engineering 2020.04.24

leetcode 75(구현), 14(구현), 1,167(2SUM), 15(3SUM)

75 https://leetcode.com/problems/sort-colors/ 정렬을 구현하는 문제이다. 라이브러리 함수를 쓰면 안 되고, 되도록 constant한 공간만 사용하고 in-place로 입력으로 주어진 배열 자체를 바꾸라고 한다. counting sort로도 해보라고 한다. class Solution(object): def sortColors(self, n): n0,n1,n2 = 0,0,0 for nn in n: if nn == 0: n0 += 1 elif nn == 1: n1 += 1 else: n2 += 1 n[:n0] = [0]*n0 n[n0:n0+n1] = [1]*n1 n[n0+n1:n0+n1+n2] = [2]*n2 discussion에 있는 흥미로운 구현 방법들을 더 적어본다. ..

데이터 직군 관련 블로그.

데이터 직군 관련해서 기술 스택 등등 너무 깔끔하게 정리해주셔서 링크 걸어놓음. https://github.com/Team-Neighborhood/I-want-to-study-Data-Science/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%95%BC%EC%9D%98-%EC%A7%81%EA%B5%B0-%EC%86%8C%EA%B0%9C 글 하나하나가 유용한게 많습니다. 취준생때는 데이터 직군에 관해서 정말 뭘 해야할지 검색해도 잘 안나오거나 말로만 뭐라뭐라 풀어쓴 글만 있는데 이런 구체적으로 기술 스택 등을 나열해놓은 블로그를 참조하면 좋을듯 싶네요. 실제 제가 하고 있는 업무나 기술스택이 거의 동일합니다.

data engineering 2020.04.22

leetcode 978(구현), 103(트리), 200(bfs), 130(bfs)

978 https://leetcode.com/problems/longest-turbulent-subarray/ 이거 푸는데 한참걸렸다.. turbulent는 내부의 값들이 올라갔다 내려가는 것들의 부분집합이다. 이후에는 길이가 2 이상인 것들만을 처리하기 위해 일단 맨 앞에서 길이가 1인것들과 2인것들을 미리 처리해준다. 그리고 [100, 100, 100]은 길이가 3 이상임에도 답은 1이 나와야하니 이런것들도 걸러준다. 최소 len(set(arr))으로 뽑았을때 두개 이상이 나와야 turbulent가 만들어진다. [1, 0, 1, 0, 1]같이 두개로도 만들어질수 있다. 그러니 예외케이스를 걸러주고.. 계산을 해야하는데 복잡하게 앞이 > i+1 i+2로 조건을 걸어놓으..

leetcode 338(dp), 11(two pointer), 36, 53(dp 카데인 알고리즘, 최대 부분합), 152(최대 부분곱)

338 https://leetcode.com/problems/counting-bits/ 비트의 갯수를 리턴하는 dp문제이다. 처음에 문제가 이해 안갔는데 예제의 2 -> [0,1,1]의 경우 0 0 1 -> 001 -> 1 2 -> 010 -> 13 -> 011 -> 2 4 -> 100 -> 15 -> 101 -> 26 -> 110 -> 27 -> 111 -> 32의 거듭제곱갯수를 주기로 f(n) = f(n-1) + (f(n-1)의 각각의 원소+1)가 성립된다. 4,5,6,7의 1,2,2,3의 경우 이전 주기 2,3-> (1,2) + ((1,2)의 각각의원소 + 1 == (2,3))인 1,2,2,3이 성립된다. 이걸 이용한다. class Solution(object): def countBits(self,..

leetcode 67(합 구현), 415, 350(구현), 1002(구현), 202(구현), 258(숫자근 digit root)

67 https://leetcode.com/problems/add-binary/, 415 https://leetcode.com/problems/add-strings/ 1. 작은 자리의 수를 큰 자리의 수와 길이가 맞게 0으로 채워준다.2. 더하면서 carry가 생기면 다음에 추가해준다. 415는 아래 코드에서 10진수 개념으로만 보고 조금만 바꿔주면되어서 따로 안적는다 class Solution(object): def addBinary(self, a, b): if len(b) > len(a): a,b = b,a for i in xrange(len(a)-len(b)): b = '0' + b ret = '' carry = 0 for i in xrange(len(a)-1, -1, -1): s = carry +..

비트 연산 활용.

https://leetcode.com/problems/sum-of-two-integers/discuss/84278/A-summary%3A-how-to-use-bit-manipulation-to-solve-problems-easily-and-efficiently 의 글을 정리함. 파이썬 버전. 1. 숫자를 이진수로 변경했을때 1의 갯수 세기. def count_one(n): count = 0 while n: n = n&(n-1) count += 1 return count print count_one(3) 2.1 어떤 수가 2의 거듭제곱인지 판단. 2의 거듭제곱들은 이진수로 아래와 같다.1, 10, 100, 1000, 10000 .... 그리고 이것들보다 1 작은수의 이진수는 아래와 같다.0, 01, 011..

algorithm/theory 2020.04.15

leetcode 565(구현), 118(구현), 119, 2(구현), 445, 43(구현)

565 https://leetcode.com/problems/array-nesting/ S는 A로 만들수 있는 서브배열개념이고.. S를 만드는 방법은 A[i] -> A[A[i]] -> A[A[A[i]]] 이런식으로 위치를 찾아가면서 만들수 있다. 이중 가장 긴 S를 구하는거다. i일때의 그룹을 만들면서 사용한 인덱스들을 set에 저장해둔다. 그리고 그룹이 끝나면 그룹의 길이로 정답을 대체하고 다음거로 넘어간다. class Solution: def arrayNesting(self, nums: List[int]) -> int: i = 0 used = set() ret = [] while i < len(nums): if nums[i] in used: # nums[i]가 이미 이전의 숫자의 그룹을 만들면서 사용..

leetcode 62(dp), 63, 64, 341(dfs)

62 https://leetcode.com/problems/unique-paths/ 기초적인 dp문제이다. 0행과 0열은 전부 경우의 가지수가 1이고, n행 m열 = n-1행 m열의 경우의수 + n행 m-1열의 경우의수이다. class Solution(object): def uniquePaths(self, m, n): dp = [[1 for j in xrange(m)] for i in xrange(n)] for i in xrange(1, n): for j in xrange(1, m): dp[i][j] = dp[i-1][j] + dp[i][j-1] return dp[n-1][m-1] 63 https://leetcode.com/problems/unique-paths-ii/submissions/ 위에랑 비슷한..

leetcode 373(bfs + heap), 328(구현), 21(merge two linked list구현)

373 https://leetcode.com/problems/find-k-pairs-with-smallest-sums/ 단순히 O(n^2)으로 돌면서 힙에 넣은후 힙에서 k를 빼내는식으로 하면 메모리 초과가 난다. 메모리 초과를 피하기 위해 가장 가능성이 높은 인자들만 저장해두고 그중에 빼와서 답을 낸다. 모두 정렬된 상태이므로 첫번째로 가능한건 인덱스로 0,0이다.(nums1의 인덱스 0, nums2의 인덱스 0) 그리고 그다음으로 가능성 있는건 0,1이나 1,0일거다. 이런식으로 확장해나가면 되는데 항상 현재좌표의 (y,x+1), (y+1, x)처럼 확장하면서 이미 방문한 좌표인지 확인이 필요하다. from heapq import * class Solution: def kSmallestPairs(se..

leetcode 141(find cycle in linked list), 142, 287, 268(missing num)

141 https://leetcode.com/problems/linked-list-cycle/ https://qkqhxla1.tistory.com/1043에 이론을 정리해놨다. class Solution(object): def hasCycle(self, head): slow = fast = head while fast and fast.next: slow = slow.next fast = fast.next.next if slow == fast: return True return False 142 https://leetcode.com/problems/linked-list-cycle-ii/ linked list의 순환이 시작되는 첫번째 위치를 찾는 문제. 한번 만난 후에 fast는 놔두고, slow만 처음으로..

linked list 안에 cycle이 있는지 확인하는 방법.(토끼와 거북이 알고리즘)

https://leetcode.com/problems/linked-list-cycle/ 문제로 설명함. 설명 : https://leetcode.com/problems/linked-list-cycle/discuss/44539/AC-Python-76ms-Floyd-loop-detection-in-7-lines 코드는 위에꺼 그대로 가져옴. def hasCycle(self, head): slow = fast = head while fast and fast.next: # fast는 두칸 뒤로 가고, slow는 한칸만 뒤로 감. # cycle이 없으면 while fast and fast.next에서 False가 나와서 루프가 끝날 것이고, # cycle이 있으면 fast가 속도가 더 빠르므로 slow를 결국에는 ..

algorithm/theory 2020.04.11

leetcode 48(rotate), 171(진법 변환?), 168

48 https://leetcode.com/problems/rotate-image/ 이거 몰랐다.... 답을 보고나서야 이런 방법이 있는지 알았다. n x n의 행렬을 시계방향, 반시계로 돌리는 방법.https://leetcode.com/problems/rotate-image/discuss/18872/A-common-method-to-rotate-the-image class Solution(object): def rotate(self, matrix): n = len(matrix) for i in xrange(n/2): matrix[i],matrix[n-1-i] = matrix[n-1-i], matrix[i] for i in xrange(n): for j in xrange(i+1, n): matrix[i]..

n x n 행렬을 시계방향, 반시계방향으로 돌리는 방법.

https://leetcode.com/problems/rotate-image/discuss/18872/A-common-method-to-rotate-the-image 되게 일반적인 문제인데 여태까지 이걸 몰랐다...;코드를 그대로 가져온다. /* * clockwise rotate * first reverse up to down, then swap the symmetry * 1 2 3 7 8 9 7 4 1 * 4 5 6 => 4 5 6 => 8 5 2 * 7 8 9 1 2 3 9 6 3 */ /* matrix의 길이를 n이라고 하면 0행과 n-1행을 변경, 1행과 n-2행을 변경, 등등등 반복 후 반복으로 돌면서 스왑해준다.*/ void rotate(vector &matrix) { reverse(matri..

algorithm/theory 2020.04.10

leetcode 122(그리디), 121(구현?), 219(구현), 13(구현)

122 https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/ 오랫만에 보는 기초적인 그리디 문제이다. class Solution(object): def maxProfit(self, prices): if not prices: return 0 p = 0 for i in xrange(1, len(prices)): if prices[i] > prices[i-1]: p += prices[i] - prices[i-1] return p 121 https://leetcode.com/problems/best-time-to-buy-and-sell-stock/ O(n)으로 풀어야 시간초과가 안 걸린다. class Solution(object): def maxP..

leetcode 283(구현), 108(array to bst), 109, 49(anagram), 438, 567(sliding window)

283 https://leetcode.com/problems/move-zeroes/ 모든 0을 리스트의 끝부분으로 보내는 문제이다. easy인데 기발한 답이 많았다. 생각해보다 0이면 해당 원소를 pop하고.. 0을 끝에 넣는식으로 짰다. 근데 아래에는 기발한 답 리스트이다. 1. 0의 위치를 기록해두고, 0이 아닌 원소들이 나오면 0과 자리를 바꿔줌. https://leetcode.com/problems/move-zeroes/discuss/72012/Python-short-in-place-solution-with-comments. # in-place def moveZeroes(self, nums): zero = 0 # records the position of "0" for i in xrange(len..

leetcode 206(linked list), 92, 238(product), 78(subset, dfs)

206번. https://leetcode.com/problems/reverse-linked-list/ 노드, pre 노드 등을 따로 만들어서 처리하는게 더 복잡해서 이렇게 리스트에 넣고 리스트의 특성을 이용했다. class Solution(object): def reverseList(self, head): if not head: return None if not head.next: return head linked_list = [] while head: linked_list.append(head) head = head.next for i in xrange(len(linked_list)-1, 0, -1): linked_list[i].next = linked_list[i-1] linked_list[0].ne..

leetcode 230(트리), 22(구현), 17(dfs), 136(xor)

230번. https://leetcode.com/problems/kth-smallest-element-in-a-bst/submissions/ pre, in, post중 아무거나 순회한 다음에 원소들을 정렬후 k번째 작은 값을 리턴한다. class Solution(object): def kthSmallest(self, root, k): stack = [root] tree = [] while stack: node = stack.pop() tree.append(node.val) if node.right: stack.append(node.right) if node.left: stack.append(node.left) return sorted(tree)[k-1] 22번. https://leetcode.com/pr..

leetcode 1379(트리), 46(permutation), 98(트리), 173(트리)

1379번. https://leetcode.com/problems/find-a-corresponding-node-of-a-binary-tree-in-a-clone-of-that-tree/ 트리 순환 문제이다. 왜 굳이 original과 cloned을 따로 나눴는지 모르겠다. pre order던 post order던 순회하면서 해당 val이 있으면 return하도록 하면 문제는 풀린다. 아래는 일반적인 dfs식 트리순회. class Solution(object): def getTargetCopy(self, original, cloned, target): stack = [cloned] while stack: pop = stack.pop() if pop.val == target.val: return pop i..

python get autoscaling group ip list

https://stackoverflow.com/questions/47558854/boto3-to-pull-all-ec2-instances-from-a-given-asg 나중에 보기 위해 코드 저장해둠. 오토 스케일링 그룹 내의 인스턴스 하나하나로 ssh로 들어가야 할 경우가 많은데 오토 스케일링 그룹 내의 인스턴스가 좀 많으면 aws콘솔에서는 하나하나 확인하기가 너무 짜증난다. 다시 들어가서 로딩되는데 시간도 오래걸리고.. 그래서 ip리스트를 받아오는 코드가 있으면 매우 쉽게 해당 ip로 들어갈수 있는 ssh프로그램을 짤 수 있다. # -*- coding: utf-8 -*- import boto3 class AwsManager: def __init__(self): self.access_key = aws ..

data engineering 2020.03.26

remove docker image over 2 month

로컬에서 테스트로 도커 빌드를 자주 해보는데 이미지가 계속 쌓인다. 이미지를 계속해서 만들다보면 도커의 이미지를 저장하는곳의 공간이 풀나서 정말 몇개월에 한번씩 이미지를 더이상 생성할수 없다고 나오는데 2달이 지난 이미지는 필요없다고 판단해 지우는 스크립트를 하나 만들었다. 여기에 저장해놓고 가져다가 쓰려고 간단하게 만들어둠. python3 import subprocess import re def get_docker_image_list(name): docker_image_list, _ = subprocess.Popen(['docker', 'image', 'ls'], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() docker_image_lis..

fluentd와 elasticsearch, kibana(EFK)를 이용한 haproxy 로그 시각화

현재 우리 프록시 시스템의 아키텍쳐 일부 그림이다. 일부 간단하게 몇개만 그리긴 했지만 haproxy로 들어오는 패킷이 엄청나게 많다. 패킷이 추가로 많이 들어올것 같아서, 이 패킷들이 어디에서 들어와서 어디로 나가는지 모니터링하기위한 시스템을 구축하고자 한다. 시각화 툴은 https://qkqhxla1.tistory.com/1031?category=802922 에서 삽질하면서 구축했던 키바나를 쓰고자 한다. fluentd로 haproxy의 로그를 실시간으로 모아서, 엘라스틱서치로 쏴주고, 그걸 키바나로 시각화하고자 한다. 만들어질 아키텍쳐 예상도는 아래와 같다. 위의 아키텍쳐 예상도를 보면 내가 추가해야할 부분은 fluentd만 오토 스케일링 그룹 내의 인스턴스에 하나씩 설치 후, 엘라스틱서치로 쏘게 ..

data engineering 2020.02.27

aws route53 ~ 쿠버네티스 ingress 흐름관련

처음 aws와 쿠버네티스를 접하면서 누구나 그렇겠지만 이해하기 힘들었던 개념이 로드밸런싱과 라우팅이 어떻게 동작하는가였다. 그러니까 단순하게 로드밸런싱은 부하를 분산해준다.. 그런건 알고있었는데 구체적으로 어떻게 설정해줘야 이게 어떤식으로 로드밸런싱이 되는지, 포트포워딩은 어디에 어떻게 적어줘야 밖에서 내부로 제대로 접속이 되는지 몰랐다.docs를 찾아봐도 이미 어느정도 아는 사람들을(알것같은 사람들을) 대상으로 써서 그런지 잘 이해가 되지 않았다. 테스트도 못해보고 구름위에 둥둥 떠있는 느낌이어서 고생좀 했다. 아래에는 aws route53을 통해서 어떻게 데이터가 들어오는지 그림을 좀 그려보고자 한다. 요즘 이런 개념정리의 필요성을 느낀다. 너무 휙휙 지나가다보니 할줄은 아는데 이게 왜 이런건지 아무..

data engineering 2020.02.22

rancher kubernetes kibana + elasticsearch 설치 삽질 정리.

로깅용으로 elasticsearch + kibana를 띄우려고 한다. 현재 우리서버에 엘라스틱서치서버가 있는데 여기 말고 내가 만들 서비스의 로깅용도로 새로 만들라고 하셔서, 즐거운 마음으로(?) 저 조합으로 띄워 보고자 하였다. 그런데 애초에 엘라스틱서치와 친한 내가 아니어서, 쿠버네티스 설정의 어려움 말고도 엘라스틱서치 설정의 어려움까지 더해져서 진짜 엄청나게 삽질을 했다. 필요없었던 삽질은 정리하고, 유용한 삽질과 얻은것들을 정리해보고자 한다. 처음에는 가장 쉬운 방법으로 접근해보았다. 가장 쉬운 랜쳐에서 App으로 efk라고 불리는 elasticsearch + flunted + kibana조합으로 패키징이 이미 다 되어있어서 클릭만 하면 자동으로 만들어진다. 이거로 만들어보기로 하였다. 그런데 랜..

data engineering 2020.02.18

apache kafka 기본, 삽질 등.

카프카를 처음 다루게 되면서, 겪었던 삽질이나, 삽질하면서 얻었던 것 등의 과정을 올리고자 한다. 그냥 내가 한 삽질을 따라가면서 기본 튜토리얼만 읽었을때와 다르게 어떤 어려움이 있었는지,있을지 짐작하는 용도로 쓰자. 개발자들이 대부분 어떤 기술이나 이런걸 처음 입문하거나 할때, 아마 대부분 기본적으로 데스크탑에 설치해보고, 튜토리얼을 따라하면서 사용법을 익힐것이다. 나도 동일하게 튜토리얼을 보고 회사 맥에 설치해보려다가 계정 권한 문제인지 실행이 잘 되지 않았다.(순수 admin을 내가 갖고있는게 아님.) 요 글에서 적었듯이 우리 팀에서는 쿠버네티스를 편리하게 컨트롤해주는 gui플랫폼인 랜쳐라는걸 쓴다. 랜쳐에서는(쿠버네티스에서는) 매우 편하게 클릭 몇번으로 서비스를 설치하거나 할수 있는데, 로컬에서는..

data engineering 2020.02.04

aws clb, alb, nlb

aws에는 3개의 로드밸런서가 있다. 3개는 classic load balancer, application load balancer, network load balancer이고,(clb, alb, nlb라고 부름) 개념이 모호해서 잘 몰랐던 내용을 정리해보려고 한다. 첫번째 참고 링크 : https://jackiechen.org/2018/01/10/aws-elb-clb-vs-alb-vs-nlb/ 일단 clb이다. clb는 가장 오래된 로드밸런서이며, 현재는 잘 안쓰는 추세라고 한다. 처음엔 clb만 있었다가 alb가 나오고, nlb가 가장 최근에 나왔다고 한다. 위의 링크를 읽어보면 작성자 생각에는 clb로 네트워크와 어플리케이션의 플로우 컨트롤을 다 하려다가 제한된 기능으로 인해 7계층과 4계층에 특화..

data engineering 2020.01.23

rancher kubernetes add aws cluster (infrastructure)

저번에 aws를 처음으로 만지면서 인프라를 구축했었는데 글로 정리할만한 내용이 없었다. 이거 적어볼까? 하면 적을 내용이 그냥 aws gui에서 이거 하는거 찾아서 클릭하면 됨. 이런게 전부여서 저번에 내가 만든 쿠버네티스에 aws cluster를 추가한 내용을 어떻게 만들었는지 적어보겠다. infrastructure라는 단어가 뭔가 거창하다는 무게감을 주는데 주니어인 내가 만든 만큼 복잡한건 없다. aws는 책만보면 아 뭐야 간단하네? 그냥 gui에서 잘 찾아서 만들면 되는구나. 하는데 막상 실제로 해보면 어 뭐지...? 하면서 막힌다. 근데 한번만 해보면 많이 쉬워지니 공부를 위해서는 한번 직접 만들어보는걸 추천함. 우선 만들었던 인프라의 구성도다. 어떤 순서로 어떻게 만들었는지 대략적으로만 적겠다...

data engineering 2020.01.03