Browsed by
[Category:] SW Development

Implementing Mutable PriorityQueue

Implementing Mutable PriorityQueue

내비게이션 경로탐색 알고리즘으로 가장 잘 알려져 있고 많이 이용하는 알고리즘이 Dijkstra 알고리즘이다. 알고리즘 수행 결과로 만들어진 경로는 최단거리를 제외하면 빠른경로/운전하기 편한 경로와 같이 정성적으로 판단하는 부분이 많다. 이와 같은 척도를 제외하면 경로탐색 엔진의 품질을 측정하는 중요한 척도는 경로탐색 과정에서 소요되는 시간일 것이다.  Dijkstra 알고리즘을 이용하면 최적의 경로를 찾긴 하지만 탐색시간이라는 비용을 지불해야 한다. 내비게이션 품질에서 탐색시간이라는 비용을 줄이기 위해 A*와 같이 탐색공간(Search Space)을 줄이는 Heuristic 기법들을 많이 활용하고 있으며 최근에는 개념을 바꿔 전처리(Preprocessing) 단계를 이용하여 좀 더 교통공학적으로 접근하여 탐색속도를 개선하려는…

Read More Read More

Rust memory safety explained

Rust memory safety explained

What makes the Rust language one of the best for writing fast, memory-safe applications? Rust’s memory safety features are baked into the language itself. In Rust, behaviors that are not memory-safe are treated not as runtime errors but as compiler errors. Whole classes of problems, like use-after-free(해제된 메모리 접근) error, are syntactically wrong in Rust. This doesn’t mean that code written in Rust is entirely bulletproof or infallible. Some runtime issues, line race conditions, are still the developer’s responsibility. But…

Read More Read More

Dijkstra Algorithm Explained

Dijkstra Algorithm Explained

개요 이 글은 자동차 내비게이션의 경로탐색 또는 그래프 이론에서 접하는 최단거리 탐색에 대해 설명한다. 출발지와 목적지 사이의 최단거리 경로탐색에 활용되는 알고리즘으로는 다익스트라 알고리즘이 대표적이라 할 수 있다. 다익스트라 알고리즘이 내부적으로 어떤 처리과정을 거쳐 결과를 만들어내는지에 대해 살펴보도록 한다. 다익스트라를 이용한 최단거리 찾기 그래프 이론에서 그래프는 링크(edge)와 노드(vertex)로 구성된다. 링크에 가중치(weight)가 적용되는 그래프를 가중치 그래프(weighted graph)라고 하며 이 가중치 그래프 상에서 출발지 노드가 주어졌을 때 다익스트라 알고리즘은 이 출발지 노드와 연결 가능한 모든 목적지 노드들 사이의 최단거리 경로와 거리(가중치의 합)를 구해낸다….

Read More Read More

ZooKeeper 긁적이기

ZooKeeper 긁적이기

ZooKeeper는 MSA에서 Scalable한 구조를 유지가히 위해 많은 오픈소스 솔루션이 내부적으로 활용하는 Coordination 서비스라 할 수 있다. 대표적으로 Kafka에서 내부적으로 환경을 관리하고 클러스터를 유지하기 위해 사용하는 정도로 알고 있다. ZooKeeper의 탄생을 보면 야후(Yahoo)가 아직은 그 명성이 살아 있을 때 클라우드 환경으로 전환과 맞물려 자체으로 필요에 의해 만든 후 오픈소스로 공개한 서비스이다(2011). 클라우드/MSA환경에서는 안정적인 서비스 운영을 위해 Scalable한 구조가 필수적이다. 이때 서비스의 트래픽 상황에 따라 노드 개수가 늘어나거나 줄어들어야 하며 바이너리 업데이트 배포시에도 모든 노드들에 동일한 환경이 구성되도록 해야 한다. 예를 들면…

Read More Read More

재사용성이 높은 자바 코드를 작성하려면

재사용성이 높은 자바 코드를 작성하려면

재사용성이 높고 보기에도 예쁜 코드를 작성해야 한다라는 얘기를 많이 듣긴 하지만 어떻게 하야 재사용성이 높고 예쁜 코드를 작성하는 것인지 막연할 것이다. 추상적이긴 하지만 아마도 읽기 쉽고 이해하기 편하며 유지보수가 용이한 코드를 말하는 것일 것이다. 이 글에서 재사용성이 높은 코드를 작성함에 있어 개발자들이 쉽게 시작할 수 있는 8가지 방법에 대해 얘기해 보고자 한다. 재사용성이 높은 코드를 작성한다는 것은 개발자들에게 매우 중요하게 요구되는 기술중의 하나라서 많은 엔지니어들이 반드시 알아야 하는 덕목이라 할 수 있다. 근래 마이크로서비스아키텍처(MSA)가 보편화 된 개념으로 자리잡고 널리 적용하고…

Read More Read More

Recursion and Tail-Call Optimization

Recursion and Tail-Call Optimization

프로그래밍에서 Recursive Call을 설명할 때 당골로 언급되는 것이 factorial 예제를 통해 값을 구하는 것일 것이다. 그냥 겉으로 보기에는 코드의 길이가 짧고 깔금해 보이지만 내부적으로 보면 Stack을 과도하게 사용할 수 있고 이로 인해 Stack Overflow가 발생할 가능성이 있어 되도록이면 Recursion보다 Loop을 사용하도록 가이드 하고 있다. Tail Call이란 Java는 단지 언어(language)를 넘어 하나의 플랫폼 역할을 한다. 즉, JVM은 단지 Java 언어 뿐만 아니라 Groovy, Scala같이 다른 언어들도 지원한다는 것을 알고나면 플랫폼이란 말이 이해가 될 것이다. 많은 functional language interpreter들은 recursion 동작을 optimize함으로써…

Read More Read More

Sequential or Temporal Coupling

Sequential or Temporal Coupling

Functional Programming에 관심이 많은 개발자들은 위 제목이 무엇을 뜻하는지 잘 알것이다. 내용을 다시 확인해 보자면 Functional Programming은 할당문(assignment statements) 사용하지 않고 프로그래밍 하는 것이라 할 수 있다. 따라서 Functional Programming은 변수를 사용하지 않고 프로그래밍하는 것이며 functional Programming에서 값(values)는 변하지 않는다라고 할 수 있다. 왜 이것이 바람직한지 아래의 코드를 한번 보자 시스템의 상태는 Block A를 실행할 때와 Block B를 실행할 때가 서로 다를 것이다. 이 말은 Block A가 반드시 Block B에 앞서 실행되어야 한다는 것을 의미한다. 만약 이 두 Block의 순서를…

Read More Read More

Up and Running for Protobuf

Up and Running for Protobuf

다른 시스템과 데이터를 주고 받는다거나 용량이 큰 데이터를 효율적으로 저장하기 위해서는 데이터를 압축하거나 다른 효율적인 방법이 필요하다. 인터넷을 통해 데이터를 효율적으로 주고 받기 위해 많은 사람들이 고민을 해 왔고 그 중 요즘 Defacto Standard로 사용되는 것이 Google에서 만든 Protocol Buffer(a.k.a Protobuf)라는 것이다. Protocol Buffer는 language 중립적이고 데이터를 Serialize할 때 쉽게 확장 가능한 구조를 제공한다는 특징을 가지고 있다. Protocol Buffer를 사용하기 위해서는 몇가지 설치가 필요하다. 먼저 Protocol Compiler(확장자 .proto 파일을 컴파일하기 위해 사용됨)와 사용하고자 하는 language에 맞는 Protobuf Runtime을 먼저 설치해야…

Read More Read More

향후 50년은 초지능을 가진 두뇌를 만드는 시대

향후 50년은 초지능을 가진 두뇌를 만드는 시대

몇 년전 부터 AI가 IT업계의 메인스트림으로 인식하고 있다. 이제 AI가 가져다 줄 변화에 두려움이 느껴지기도 한다. AI가 어떻게 동작하는지 기술적인 관점에서 바라보는 것도 재미 있지만 좀 더 큰 그림, 한 1km 높이에서 AI기술을 이루는 큰 블럭들을 바라볼 수 있다면 요소 기술을 접하는데 더 도움이 될 것이다. AI가 보편화 될 수록 관련 기술 생태계는 아래의 그림과 같이 구성될 것이다. 지금까지의 IT 또는 SW의 발전은 더 나은 계산기를 만드는 과정이었다고 보면 된다. 즉 더 나은 CPU와 이를 활용하는 더 나은 SW로 다양한…

Read More Read More

ChatGPT가 하는 것이 무엇이고… 왜 동작하는 걸까?

ChatGPT가 하는 것이 무엇이고… 왜 동작하는 걸까?

2022년11월 ChatGPT를 처음 접하던 날 내가 받은 인상을 아직도 생생하게 기억한다. 프롬프트 뒤에는 사람이 직접 입력을 하고 있다는 우스게 소리도 있었다. 내가 질문한 답을 기-승-전-결에 맞추어 군더더기 없이 깔끔하게 설명을 해주다니… 그것도 오류없이. 이게 가능하단 말인가! 더구나 프로그래밍 관련 질문에 Boilerplate Code를 곁들인 답을 뱉어 내는 것을 보며서 이제 정말 개발자의 종말을 보게 될 것인가란 약간의 두려움도 있었지만 ChatGPT가 내부에서 어떤 과정을 거치기에 이런 놀라운 결과를 만들어내는지 궁금해 지지 않을 수가 없었다. GPT 이전의 AI는 주로 수학적인 설명을 토대로 미래를…

Read More Read More