IT in General 10

개인 개발자와 프로페셔널 개발자의 차이

나는 이천 여 사용자를 대상으로 하는 받아쓰기(speech-to-text) 도구를 여러 라이브러리를 조합해 혼자서 만들었고 사내에 서비스 했었으며, 이 경력을 토대로 채용 면접관들의 많은 의심을 뚫고 수천만 명을 서비스 대상으로 하는 국내 굴지의 IT 서비스 회사의 머신러닝 엔지니어로 취직했었다. 여기서 나는 두 개 부서, 총 3개 팀을 거치면서 여러가지 기술과 업무방식을 배울 수 있었다. 최근에는 핀테크 회사에 데이터 사이언티스트로 이직했으나 여기서는 업무 범위에 제한이 더 적어, 나의 경험과 흥미에 따라 머신러닝 엔지니어로서의 역할을 많이 하게 될 것 같다. 약 1년 반이 조금 넘는 시간 동안의 내 경험을 회고해 보면서 내가 개인 개발자로서 일할 때와 달리 대규모 서비스를 하게 되는 조직에서 엔지니어..

IT in General 2024.09.04

Immutable vs mutable

파이썬을 처음 접할때 Immutable과 mutable 객체가 있다는 것을 배운다. 그리고 그에 해당하는 것을 기억하면서, 무슨 자료형은 '바꿀 수 없다'고 기억한다. 예를 들어 string은 immutable, list는 mutable 이런 식이다. 그런데 그 효과를 정확히 알지 않으면 상당한 시간을 디버깅 하느라 낭비할 수 있다. 정리해본다. 만약에 "".join(L1) 이렇게 한다고 할 때와 L1.extend(L2) 할 때 큰 차이가 무엇일까. 전자는 새 string 객체가 리턴되지만, 후자는 None이 리턴된다. 따라서, 저 결과를 무언가에 append 하고 싶다면 전자는 그냥 저 식을 argument로 넣지만(오히려 .copy() 가 안됨), 후자는 저 식을 실행한 후의 L1을 argument ..

github 01: PR 날린데에 다시 commit하기

branch를 따서 작업하고 PR을 날린 다음에, 피드백이 오던지 아니면 내가 문제를 발견해서 commi을 하려고 할 때, 이미 그 사이에 원 레포(origin)에 다른 머지가 생겨서 이미 내가 최초에 branch를 따왔을 때 보다 origin이 앞으로 나가 있을 상황이 있다. 이 때 해결방법을 따라할 수 있도록 살펴보자. feature/jira-123 $ git branch -v 먼저 브랜치를 확인했다. 그랬더니 메인 브랜치 이름이 main 이더라. 예전에는 기본값이 master였다고 하는데 요즘은 main이 기본값이라고 한다. feature/jira-123 $ git checkout main error: 다음 파일의 로컬 변경 사항을 체크아웃 때문에 덮어 쓰게 됩니다: my/file.py 브랜치를 전..

IT in General/OS 2023.09.21

꿀팁 대방출

개발자 생활에 필요한 꿀팁을 적립해 두는 곳이다. 계속 추가할 예정 (별도 표시가 없다면 mac OS 기준). 웹사이트 다운로드 강의용 사이트 등 용량이 적은 파일이 있는 곳을 그 체계를 유지하며 다운로드 받아 다른 연관 자료들과 함께 로컬 폴더에 배치해 나중에도 편히 참고하고 싶은 경우에 유용. 먼저 자신이 다운로드 하고 싶은 디렉토리로 이동한 다음 아래 명령어 실행하면 그 위치에 에 해당하는 내용이 받아짐 (꺽쇠는 입력하지 않는다). # If you don't have wget, use brew install wget # Pretends I am a visitor via a web browser # but waits 10 secs between file download, limiting speed a..

IT in General/OS 2023.03.18

Iterator와 Generator 사용방법

Heron의 방법으로 제곱근을 구하는 수치해석 로직을 통해 Iterator와 Generator의 쓰임에 대해 설명하는 예제를 준비해보았다. 아래 코드는 [1] 에서 참조했다 (책에 존재하던 코드의 오류는 필자가 본 페이지와 같이 수정해서 원 저자의 레포에 커밋하고 머지되었다). 아래 sqrt1 함수는 제곱근을 구할 대상이 될 숫자인 a를 입력받아, a의 제곱근에 대한 추정치를 Heron의 알고리즘으로 반복해서 구하게 된다. 동 알고리즘은 매 횟수마다 이전보다 더 정밀한 추정치를 구하게 되며, 이전 단계에서 구한 추정치와 이번 단계에서 구한 추정치의 차이가 0.001보다 적게 되면 반복을 멈추고 결과를 돌려주며 종료된다.def sqrt1(a: float) -> float: x = a / 2 # initia..

Windows 10 에서 C++ 프로그램 컴파일하기

Linux 계열과 달리 Windows 운영체제를 설치해도 C++ 컴파일러가 포함되어 있지 않다. 따라서 이를 추가로 설치하고 경로 지정을 해줘야 한다. 먼저, minGW를 설치한다(https://www.mingw-w64.org/downloads/). minimum GNU for Windows 라는 뜻의 프로그램들로, 이로부터 g++ 를 설치하면 c++ 컴파일이 가능하다. 그다음, minGW가 설치된 경로를 찾아, bin 폴더를 path에 추가하여 어디서든 실행이 가능하도록 한다. setx path "%PATH%;C:\MinGW\bin" 그리고, 소스코드를 작성하여 .cpp 확장자로 저장한 다음, 아래 화면과 같이 명령어를 입력하여 컴파일 함으로써 .exe 파일을 만들고 실행한다. 컴파일시: g++ Pro..

IT in General/C++ 2022.09.25

any와 all, 그리고 return

any와 all은 Python 기본함수로서 여러가지 경우에 대해 참/거짓 값을 종합적으로 판단할 때 긴 for 루프를 줄이고 간단하게 만들게 되어 전체 코드가 한 눈에 들어올 수 있도록 도와주고 코드 길이도 줄여주면서 구현도 간편하게 해줄 수 있다. DP, graph, 각종 구현 등 쓰이는 곳이 많은 팔방미인이다. 그러나 그 정의를 정확히 알지 않으면 기대한 것과 전혀 다른 엉뚱한 결과가 나와 머리를 부여잡고 몇 시간 고민해도 답을 못 얻는 경우가 있는데 바로 이 두 함수가 대표적인 사례이다. 확실히 알고 향후 오류를 방지해보자. 리턴(return)의 신중함 먼저 필자가 겪은 오류의 사례를 보자. return any(color != black and is_cycle(u) for u in graph[v])..

데코레이터와 피보나치

Python의 decorator에 대한 설명으로 대표적인 것이 이름을 출력하는 예제일 것이다. 그러나 실제로 그런 일을 할 일이 별로 없기 때문에 마음에 와닿지가 않아 이해도 잘 되지 않았다. 가장 실용적인 사례로서 DP(dynamic programming)을 위한 memoization의 경우에 활용되는 @cache()라는 decorator를 피보나치 수를 구하는 예제에 적용하여 그 내부 동작을 살펴본다. 먼저 팩토리얼을 구하는 코드를 소개한다. 아래 데코레이터는 @cache로서, DP의 top-down시 많이 활용하는 lru_cache(maxsize=None)과 동일한 결과를 돌려주는 것으로 3.9에서 추가된 함수이다. @cache def factorial(n): return n * factorial(..

itertools.islice, tee, groupby, product

islice 형태: itertools.islice(seq, [start,] stop [,step]) 역할: 주어진 sequence를 start:stop:step으로 잘라서 그 원소를 돌려주는 역할을 한다. 예 import itertools for c in itertools.islice('ABCDEFG', 2): print(c, end=" ") print() for c in itertools.islice('ABCDEFG', 2, None): print(c, end=" ") 결과는 다음과 같다. A B C D E F G 즉, 인수 2개만 주면, seq, stop으로 해석하므로, [:2] 까지의 원소를 돌려준다. 그러나 islice만으로는 어떠한 결과를 보여주지 않고 그저 iterator만을 돌려줄 뿐이다. ..

functools.reduce

functools는 잘 이용하면 코테나 인터뷰 뿐 아니라 실무에서도 많은 작업을 간편하게 할 수 있도록 도와준다. 구문: functools.reduce(function, iterable[, initializer]) 역할: list와 같은 iterable의 값을 앞에서부터 하나씩 function에 넣어 계산하고, 그 결과를 다시 function의 입력값으로 넣어 계산하는 과정을 반복하여 최종적인 값을 돌려준다. 예1. 리스트에 있는 값을 누적해서 계산 import functools functools.reduce(lambda x, y: x+y, [2,3,4,5], 1) # ((((1+2)+3)+4)+5)​ 예2. pandas Dataframe에 저장된 값을 통해 기하평균을 구함 data['returns_GA..