본문 바로가기

전체 글

(16)
GORM (3) - Associations Belongs To Belongs To belongs to 관계는 다른 모델과의 1대1 연결을 설정해줍니다. type User struct { gorm.Model Name string } // `Profile` belongs to `User`, `UserID` is the foreign key type Profile struct { gorm.Model UserID int User User Name string } Foreign Key belongs to 관계를 정의하기 위해서는 foreign key가 무조건 존재해야 합니다. 기본 값으로는 owner의 type 명과 pk의 결합이 사용된다. GORM은 foreign key를 커스터마이즈할 수 있도록 합니다. type User struct { gorm.Mo..
Online 알고리즘 (5) - Randomized Online Algorithms (MBG 문제) 이번 포스팅에서는 Modified Bit Guessing Problem (이하 MBG 문제) 에 대하여 randomness가 deterministic 알고리즘에 어떤 영향을 끼치는지 알아보도록 하겠습니다. MBG 문제는 다음과 같이 정의할 수 있습니다. 2명의 사람이 게임을 한다고 합시다. 한 사람이 n개의 비트의 나열 패턴을 정합니다. 그리고 다른 한 사람은 그 비트를 하나씩 들으면서 다음에 어떤 비트가 올 지 맞추는 게임입니다. 즉, 다음 비트가 0일지 1일지 과거 비트의 패턴을 보고 맞춰야 합니다. 목표는 하나라도 맞추는 것입니다. 맞춘다면 점수를 $g(n)/(1-1/2^{n-1})$를 얻고 모두 틀린다면 1 만큼 점수를 얻습니다. 우선 직관적으로 이 게임에 대해서 해석해봅시다. 만약 비트의 나열 ..
Online 알고리즘 (4) - Randomized Online Algorithms (1) 이번 포스팅에서는 온라인 알고리즘을 푸는데 있어서 randomness가 어떻게 영향을 끼치는지 정리해보도록 하겠습니다. 우선 randomized 온라인 알고리즘을 정리하려면 기존 deterministic 온라인 알고리즘에서 다음과 같은 몇가지 확장이 필요합니다. competitive ratio type of adversaries and relationship Randomized 온라인 알고리즘에서는 competitve ratio를 측정하는 것은 Randomness가 3가지의 adversaries를 허용하기 때문에 deterministc 온라인 알고리즘과 상이합니다. Randomness 온라인 알고리즘에서 adversary는 3가지 유형으로 oblivious(망각형), adaptive online (적응형..
GORM (2) - CRUD CREATE user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()} db.NewRecord(user) // => returns `true` as primary key is blank db.Create(&user) db.NewRecord(user) // => return `false` after `user` created Create할 때, default value tag를 줄 수 있습니다. type Animal struct { ID int64 Name string `gorm:"default:'galeone'"` Age int64 } insert SQL은 값이 없거나 zero value인거는 제외합니다. insert후에, gorm이 데이터 베이스로 부터 ..
Strong Connected Component - Gabow 알고리즘 Strong Connected Components(이하 SCC)를 구하기 위한 몇가지 알고리즘이 있는데, 그중에서 Gabow의 알고리즘은 간단하게 살펴보겠습니다. SCC를 구하는 알고리즘은 Gabow이외에도 여러가지가 있는데, 대표적으로 Kosaraju 알고리즘과 Tarjan 알고리즘이 있습니다. Kosaraju 알고리즘과 Tarjan 알고리즘이 궁금하다면 각각 다음 블로그를 참조하는 것을 추천드립니다. https://wondy1128.tistory.com/130 SCC-코사라주 알고리즘(Kosaraju's Algorithm) 방향 그래프(Directed Graph) 에서 SCC (Strongly Connected Component) 를 코사라주 알고리즘을 이용해 구하는 방법이다. ① 주어지는 방향 그래..
GORM (1) - Getting Started 이번 포스팅에서는 go를 이용하여 프로그램을 작성할 때, ORM을 이용한 개발을 하기 위해서 GORM에 대해서 정리하도록 하겠습니다. GORM은 go를 위한 object relation mapping(ORM)으로 Go를 위한 ORM 프로젝트 중에서는 document도 매우 준수하고 star도 가장 많이 보유하였기에 정리해보도록 하겠습니다. GORM Docs를 보고 기능들을 정리하였습니다. GORM에서 Entity를 정의하는 방법은 Go에서 일반전인 구조체를 정의하는 것과 같습니다. 다만, tag기능을 이용하여 옵션을 줄 수 있습니다. type Model struct { ID uint `gorm:"primary_key"` CreatedAt time.Time UpdatedAt time.Time Deleted..
Online 알고리즘 (3) - Deterministic Online Algorithms (2) Maximization Problem: Time Series Search 이번 포스팅에서는 전 포스팅의 Minimization과 대비되는 형태의 문제인 Maximization 문제를 다루도록 하겠습니다. Time Series Search (이하 TSS)문제는 대표적인 maximization 문제입니다. 한 항공사에서 유럽여행 이벤트를 한다고 가정하겠습니다. 이럴 경우는 없겠지만 이 이벤트는 여러분을 n일 후에 유럽으로 공짜로 보내주는 이벤트입니다. 다만 여러분은 n일이 언제인지 모르고 당일날 통보를 받게 됩니다. 이 여행을 가기 위해서 많은 준비를 해야하겠지만 가장 중요한 건 원화를 유로로 바꿔야합니다. 목표는 환율이 여러가지 요인으로 변동하는 상황에서 가장 이득이 되는 날을 골라서 모든 돈을 바꾸는 것..
gRPC - Multiplexing, Metadata, Load Balancing and Compression Multiplexing gRPC 서비스에서 우리는 하나의 client에 대해서 여러개의 gRPC 서비스로 지원을 해야 하는 경우가 있습니다. 이럴 경우, 서비스들을 하나의 서버에서 각각 띄우지 않아도, gRPC에서는 리퀘스트에 대해서 multiplex를 통해 하나의 gRPC 서버에서 여러개의 서비스를 지원할 수 있습니다. 아래 예제는 이미지를 받는 서비스와 글을 받는 서비스를 따로 구성한 뒤에 multiplex 기능을 통해 하나로 합친 코드의 구현 부분입니다. func main() { lis, err := net.Listen("tcp", ":4317") if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() pb.Re..