본문 바로가기

소프트웨어 이야기

XY Problem 이란? XY Problem이란? XY Problem은 실제 문제보다는 문제를 해결하기 위해 시도한 해결방안에 대해 묻는 것이다. XY Problem은 도움을 요청하는 사람과 도움을 제공하는 사람 모두에게 많은 시간과 에너지를 소모하게 만든다. 이 상황에 빠지게 되면, 사람들은 해결방안이라고 믿는 것에 집착하게 된다. 그래서 한발짝 물러서서 그 문제를 설명하지 못하게 만든다. XY Problem이 발생하는 순서 요청자는 X를 하고 싶어 한다. 개발자는 X는 모르겠지만, Y를 하면 문제를 해결할 수 있다고 생각한다. 요청자는 Y도 할 줄 모른다. 요청자는 다시 Y에 대한 도움을 요청한다. 다른 개발자가 Y로 요청자를 도와주려고 하지만, Y가 해결하고자 하는 것이 이상해보이기 때문에 혼란스러워한다. 많은 커뮤니케이션..
(Istio) Traffic Management - Network resilience Istio의 Traffic Management 기능은 네트워크의 탄력성 (resilience)을 높이는 역할을 담당하고 있다. 이를 위해 failure recovery 기능과 fault injection feature 기능을 지원한다. 특정 노드에서 네트워크 오류가 발생하면, Istio는 의도적으로 결함을 일으킨다. 그리고 그동안 서버가 복구될 수 있는 시간을 확보한다. 이러한 방식은 특정 노드의 장애가 전체 노드에 전파되는 것을 막는다. 이는 Fault tolerant 시스템을 가능하게 해준다. 덕분에, 일부 서비스에서 결함이 발생하더도, 전체 서비스는 잘 운영될 수 있다. Timeouts Envoy proxy가 서비스 노드에서 응답받아야하는 최대 시간을 의미한다. 이 시간내에 응답하지 않으면, HTT..
Symspell 알고리즘 살펴보기 Symspell은 "오타교정", "유사검색어 제안" 기능에서 활용되는 알고리즘이다. Peter Norving도 오타교정에서 유명한 알고리즘이다. 그러나 연산비용이 높기 중국어 같은 언어에서는 활용할 수 없다는 한계점이 있다. ( 글자를 표현하는 유니코드의 종류가 다양하기 때문에 후보군을 모두 계산하기 어렵다. ) Symspell 알고리즘은 Peter Norving 알고리즘의 단점을 보강한 알고리즘이다. 그래서 Peter Norving에 비하여 빠르고, 여러 자연어에서도 활용할 수 있단 장점이 있다. Symspell은 두가지 접근방법 덕분에 연산 비용을 줄이고, 속도를 개선할 수 있었다. 오타 후보군을 사전에 계산하기 DELETE 방식으로만 후보군 계산하기 오타 후보군을 사전에 계산하기 symspell은 ..
ngrok - 외부에서 로컬 컴퓨터에 접속할 수 있게 만들기 ngrok 로컬에서 실행중인 서버를 외부에서 접속할 수있도록 도와주는 프로그램이다. ngrok은 로컬에서 개발 중인 API와 웹페이지를 다른 컴퓨터에서 조회해야할 때 유용하다. 예를 들어, 로컬에서 띄운 포트인 "localhost:3000"를 "a6fee076.ngrok.io" 처럼 도메인을 만들어주고, 도메인을 통해 외부에서 접속도 가능하게 해준다. 설치 ngrok 사이트, npm, brew 등으로 설치하면 된다. npm install ngrok 실행 ngrok http 3000
Peter Norvig’s 알고리즘 살펴보기 Peter Norvig’s은 대표적인 오타교정 알고리즘이다. 피터노빙 알고리즘을 사용하면 오탈자 키워드가 Input 값으로 주어졌을 때, 해당 오타 키워드를 교정한 단어를 Output으로 주는 함수를 만들 수 있다. 동작 원리 첫번째 단계 : 단어 사전 구축 하기 1. 교정 사전으로 활용할 텍스트 파일을 준비한다. 2. 텍스트 파일에서 단어와 언급수를 계산해둔다. 단어가 언급된 수는 오타 교정 후보 단어가 여러개 나온 경우, 교정 단어의 우선순위를 정할때 사용한다. 두번째 단계 : 키워드 교정하기 1. 검색 키워드를 오타교정 함수에 전달한다. 2. 단어 사전에 있는 키워드인 경우, 그대로 키워드를 반환한다. 이 경우, 검색 키워드가 표준어라고 볼 수 있기 때문이다. 3. 단어사전에서 키워드를 찾지 못한 ..
내멋대로 React 개념 정리하기 런타임컴퓨터 언어 안에 쓰인 프로그램을 관리하기 위해 특정한 컴파일러나 가상 머신이 사용하는 기본 코드 라이브러리나 프로그램을 말한다. Nodes자바스크립트 엔진인 V8으로 빌드된 자바스크립트 런타임이다. 자바스크립트로 서버 사이드 애플리케이션으로 구현할 수 있게 해준다. npmNode js으로 만들어진 모듈을 관리해주는 툴이다. 파이썬에서는 pip, 루비에서는 gem으로 연상하면 된다. 명령문 npxnpm 5.2+ 버전의 패키지 실행 도구이다. React자바스크립트 라이브러리이다. 컴포넌트라고 불리는 독립적인 코드 조각들을 활용하여, 복잡한 UI를 유연하게 구현할 수 있게 도와주는 역할을 한다. Babel자바스크립트 컴파일러다.Babel의 입력과 출력 모두 자바스크립트이다. 최신 버전의 자바스크립트 문..
[Varnish] Vary User-Agent HTTP Header가 캐시 퍼포먼스에 미치는 영향 Vary HTTP Header란? vary: Accept-Language, User-Agent, Cookie, Accept-Encoding 동일한 URL에서 사용자 에이전트에 따라 다른 응답을 내려줄 때 가용되는 Header이다. Vary User-Agent HTTP Header가 Cache Hit에 미치는 영향 과거의 웹 환경에서는 에이전트 환경 별로 보여주는 HTML이 달랐다. 그래서 Vary Header의 User-Agent 값을 활용하여 클라이언트 별로 다른 데이터를 내려줬다. 그러나 오늘날에는 에이전트별로 다른 HTML을 내려주지 않는다. 그리고 현대 웹 개발에서는 JSON 데이터으로 데이터를 주고받기 때문에, 유저 에이전트 별로 데이터가 다른 경우는 흔치 않다. 때문에 Vary HTTP Hea..
[Django] Django에서 MultiProccess 사용 시 주의사항 Django에서는 하나의 프로세스에서 하나의 커넥션을 맺는 것을 가정하고 있다. 그러나 Python에서는 프로세스를 사용하는 경우, 자식 프로세스에서 부모 프로세스의 자원을 복제한다. 때문에 Django에서 멀티프로세스를 사용하는 경우, 위와 같은 처리 때문에 오류가 발생하기 쉽다. 해당 문제의 대표적인 해결안으로는 자식 프로세스 시작 시, 모든 커넥션을 닫아주는 방법이 있다. def close_service_connections(): # close db connections, they will be recreated automatically db.connections.close_all() # close ES connection, needs to be manually recreated connection..