Go
-
Go: 카카오맵 API 지하철 역 주변 검색하기 (blevesearch)컴퓨터/Go language 2024. 10. 20. 20:21
현재 대한민국 철봉 지도 (https://www.k-pullup.com)검색 기능에 "수원역"처럼 역 이름으로 검색하면 검색이 안 되는 문제가 있다.인덱싱 할 때 주소를 ngram 방식으로 검색하면 쓸모없는 위치가 많이 검색된다.또한 "서울대입구역" 처럼 "서울대입구"는 대한민국 주소상 존재하지 않을 수 있다. 따라서 "서울대입구역"을 검색하면 그 주변 (ex 3km 반경)에 있는 나의 데이터들을 보여주고 싶었다. 1. 데이터 열린데이터광장 메인데이터분류,데이터검색,데이터활용data.seoul.go.kr서울시 역사마스터 정보를 보면 (최신으로 잘 업데이트되는 느낌)750개가 넘는 도시철도 역들의 좌표가 잘 나와있다. (지하철 + 고가철도 etc) (WGS84 좌표계)전국 5대 지하철을 받으려면 위 데이터..
-
Go: Fiber 서버 최적화 하기 (optimization)컴퓨터/Go language 2024. 9. 12. 21:39
Go언어 웹 프레임워크 fiber v2를 사용하면서 얻은 팁들을 정리한 글이다. GitHub - gofiber/fiber: ⚡️ Express inspired web framework written in Go⚡️ Express inspired web framework written in Go. Contribute to gofiber/fiber development by creating an account on GitHub.github.com 1. zero memory alloc []byte stringbyte 배열과 문자열 (json marshal/unmarshal 시 많은 사용)을 아래처럼 하면 allocation을 새롭게 하게 된다.string(byteArr) // var byteArr []byte..
-
Go: Bleve 인덱싱 한국어 주소 검색 서버 만들기 (Apache Lucene-like)컴퓨터/Go language 2024. 6. 2. 14:09
GitHub - blevesearch/bleve: A modern text/numeric/geo-spatial/vector indexing library for goA modern text/numeric/geo-spatial/vector indexing library for go - blevesearch/blevegithub.com ZincSearch (ElasticSearch-like)를 이용해 한국 주소 검색 시스템을 이용하고 있었다.웹 서버는 단일 서버로 돌리다보니 굳이 검색 서버를 따로 열어서 호출하는 것이 마음에 들진 않았다.프로젝트가 Go언어이다보니 모든 것을 Go언어로 된 것을 이용하려고 노력하다가 Bleve를 찾게 되었다. DoorDash 개발자 블로그를 읽다가 ElasticSearch를 ..
-
Go/Java: 금칙어 검사 함수들 벤치마크 및 향상컴퓨터/Go language 2024. 5. 2. 00:28
금지어 리스트를 .txt 에 저장하고 서버 메모리에 로딩했다. (10kb)금지어를 가장 빠르게 체크하는 방법은 무엇일까 궁금해서 벤치마크를 돌려보았다.기준: 10KB input string + 500개 금지어 리스트 1. 정규 표현식 사용성능: 14,260K ns/op메모리 사용: 4321B/op할당 횟수: 24 allocs/op아래처럼 첫 로딩에 regex로 패턴을 모두 컴파일하고, 인풋 string을 확인했다.생각보다 대용량일 수록 굉장히 느리다.func CompileBadWordsPattern() error { var pattern strings.Builder pattern.WriteString(`(`) for i, word := range badWordsList { if word == "" { ..
-
Go: 카카오맵 API 정적 지도 이미지에 여러 마커들 추가하기컴퓨터/Go language 2024. 4. 11. 16:45
오프라인 지도 저장 API를 만들어 보고 싶어서, 카카오맵 정적 지도 문서를 봤다.하지만, 하나의 마커만 지원한다.https://apis.map.kakao.com/web/sample/staticMapWithMarker/ 사진 렌더링하는 js 코드를 보면, CX와 CY (마커의 WCONGNAMUL 값)을 하나 밖에 안 받고 렌더링해서 이 부분을 고쳐보고 싶었으나 다른 방식을 택했다.c.Va = function() { var a = this.Gd , b = []; b.push("IW=" + String(this.b.m() | 0) + "&IH=" + String(this.b.i() | 0)); b.push(sf(this)); b.push("S..
-
HyperLogLog 데이터 구조컴퓨터/Go language 2024. 4. 3. 17:49
매일 접속한 unique 사용자들을 어떻게 알 수 있을까? (google analytics 무시) 수백만 명이 접속해 있다면 정확하진 않더라도 n 명 접속 중을 빠르게 표시할 수 있는 자료 구조가 있을까? 해쉬맵을 통해 모든 유저를 저장하면, 서버 메모리보다 커지지 않을까 등을 생각하다가 HyperLogLog 데이터 구조란 것을 알게 되었다. (다른 방법도 많을 것이다) https://www.youtube.com/watch?v=lJYufx0bfpw&t=479s HyperLogLog 추정치를 구하기 때문에 정확한 값을 원하면 옳지 않다. 이름이 왜 하이퍼로그로그 일까? 먼저, "LogLog"는 알고리즘이 고유한 요소들을 (유니크) 효율적으로 계산하기 위해 log 함수들을 사용함으로 셀 수 있는 요소들의 수..
-
Go: 백엔드 웹소켓 채팅 (fiber v2 + websocket + rabbitmq)컴퓨터/Go language 2024. 3. 31. 16:02
여러 가지 방이 있고 각 유저들이 있는 채팅 서비스를 만들고 싶었다. 우선 분산 시스템을 고려하지 않고 베이스를 만들어 준다. 싱글 서버 웹소켓이 양방향이라 (bi-directional) 선택했고, 객체를 저장하고 있으면 계속 주고받을 수 있다. 채팅 서버에서 websocket 연결 객체를 저장하고 있어야만 메시지를 전송할 수 있다. var WsRoomManager *RoomConnectionManager = NewRoomConnectionManager() type RoomConnectionManager struct { connections *haxmap.Map[string, []*websocket.Conn] // roomid and users } Concurrent Map 연결 객체들을 해쉬 맵에 저장..
-
Go: WGS84를 WCONGNAMUL로 변환 함수컴퓨터/Go language 2024. 3. 24. 19:44
Go언어 백엔드에서 카카오맵 API를 이용하다 보니, WCONGNAMUL로 전환하는 일도 꽤 생겼다.근데 외부 API를 부르자니 뭔가 싫고 공부겸 값을 찾아보기로 했다.(사실 마음 편하게 카카오 API를 이용하자: https://developers.kakao.com/docs/latest/ko/local/dev-guide#trans-coord) 우선 변환된 값들을 이용해서 python numpy의 lstsq로 linear 하게 계수를 찾아보는 방법을 택했다. numpy.linalg.lstsq — NumPy v1.26 ManualCut-off ratio for small singular values of a. For the purposes of rank determination, singular values..