Recent posts

Gini coefficient algorithm

In economics, the Gini coefficient (or Gini index) is a measure of inequality of a dataset. It usually represents income inequality or wealth inequality. I stumbled upon this concept while reading this Go code which I was confused at the first look. This posting is my attempt to understand the code.

// calculate gini coefficient
sumOfAbsoluteDifferences := float64(0)
subSum := float64(0)

for i, x := range stakingAmount {
	temp := x*float64(i) - subSum
	sumOfAbsoluteDifferences = sumOfAbsoluteDifferences + temp
	subSum = subSum + x
}

result := sumOfAbsoluteDifferences / subSum / float64(len(stakingAmount))

Geometric definition

The Gini is a number between 0 to 1, that is defined using the Lorenz curve. Lorenz curve plots the cumulative share of data points sorted in ascending order. In the diagram below, the Gini is defined using the two areas A and B (since $A+B = 1/2$),

\[G = A / (A+B) = 2A\]

Economics_Gini_coefficient2

Consider a dataset with four data points, 1, 2, 3, 4. Then,

  • the sequence of cumulative sum is 1, 3, 6, 10.
  • the sequence of cumulative share is 0.1, 0.3, 0.6, 1.0, the cumulative sums divided by the total sum, 10.

The area between the curve and line, A, can be calculated by calculating the areas of below 6 triangles. Each triangle has the same height 0.25.

gini_1234

Read more


GPT시대, 코딩기술자의 쇠퇴를 생각하며 를 읽고

우연히 좋은 글을 읽었습니다. GPT시대, 코딩기술자의 쇠퇴를 생각하며 (번역).

원문은 뉴요커 매거진의 A Coder Considers the Waning Days of the Craft. 제목의 ‘Wane’은 영어로 달의 이지러짐 등을 표현할 때 쓰는 약해지다, 줄어들다, 시들해진다는 뜻이라고 합니다 (사전)

인공지능과 프로그래밍에 대한 에세이인데 흥미로운 대목이 많아서 글로써 기억해두려고 합니다.

재밌었던 부분 중 하나는 Dijkstra 교수님이 무려 1978년에 <자연어로 프로그래밍하는 것의 어리석음에 대하여 (On the foolishness of “natural language programming”)>란 글을 남기셨다는 점입니다. 앞서나가셨던 걸까요, 그 당시 연구 트렌드였던 걸까요. 그것도 아니면 COBOL같은 문장식의 프로그래밍 언어를 보고 말씀하신 걸까요. (SO: What programming language is most like natural language?)

100200 MAIN-LOGIC SECTION.
100300 BEGIN.
100400     DISPLAY " " LINE 1 POSITION 1 ERASE EOS.
100500     DISPLAY "Hello world!" LINE 15 POSITION 10.
100600     STOP RUN.
100700 MAIN-LOGIC-EXIT.
100800     EXIT.

SO 댓글에 이런 말도 있네요. 한 30년이 지나면 COBOL 자리에 ChatGPT가 들어간 문장이 돌아다닐까요?

I heard that when COBOL was released, many people expected that there would be no more professional programmers within a few years - since obviously, COBOL was so easy to use that anyone who needed a program could write it themselves.

Read more


DEFCON 2023 Quals - kkkkklik

오래간만에 데프콘 CTF 온라인 예선에 참가했다. 문제가 정말 다양하게 나왔는데 ChatGPT를 활용한 문제도 있었고 Torque3D라는 게임엔진에 대한 문제도 있었다. 모든 문제는 깃헙에 소스코드가 공개돼있어 언제든 살펴볼 수 있다 (https://github.com/Nautilus-Institute/quals-2023).

내가 해결했던 kkkkklik은 윈도우즈 리버싱 문제인데, 바이너리 리버싱을 몇 년만에 해 보는지라 쉬운 문제임에도 하루 종일 걸렸지만 옛날 생각(?)이 나서 개인적으로 즐거웠다.

The click handler

kkkkklik.exe 프로그램을 구동하면 작은 창이 하나 뜨는데 특별히 입력창도 없고 클릭해도 반응이 없다. 그래서 바로 바이너리 분석을 시작했다.

GUI 프로그램이라서 main함수에서 따라가는 방식이 아니라 이벤트 핸들러를 발견하는 방식으로 분석해야 한다. 크고 작은 함수들 중에서 한 함수 안을 보면 수상하게 1337이라는 숫자가 있다. x32dbg에서 함수에 브레이크포인트를 걸어보면 GUI 창을 클릭했을 때 불리는 클릭 핸들러라는 점을 알 수 있다. 클릭 핸들러는 커다란 switch-case를 기준으로 세 부분으로 나뉘어있다.

klik_gui.png

Read more


Deleting Azure "dangling" role assignments

Azure 클라우드에서 dangling role assignment 가 200여개가 생겨있길래 지웠다.

청소하는 Azure CLI 스크립트는 다음과 같다.

az role assignment delete --verbose --ids $(az role assignment list --all | jq -r '.[] | if (.resourceGroup | length == 0) and (.principalName | length == 0) then .id else empty end')

Role Assignment

Azure 클라우드에서 RBAC (role based access control) 은 “role assignment” 라는 단위로 정의된다. 하나의 role assignment 는 다음으로 구성된다. 자세한 내용은 Azure Docs에 잘 나와있다.

  • assignee or principal (주체): 누구에게
  • scope (범위): 어디에서
  • role (역할): 무엇을 하도록 허용한다

azure-role-assignment.png

Read more


Docker Buildkit 으로 빌드 시간 단축하기

Docker의 multi-stage build와 buildkit을 이용하여 복잡한 빌드의 시간을 단축하는 방법.

이 방법을 사용하면 덤으로 멋있는 빌드 화면을 볼 수 있다.

Read more