콘텐츠로 건너뛰기

ASCIIMATICS TUI – 데이터 다루기

입력필드나 드롭다운 메뉴 같은 UI들은 실제로는 어떤 값을 화면에 표시하기 위해 사용됩니다. 지금까지 asciimatics를 사용하여 UI를 구성하는 방법을 살펴보았는데, 앱이 다루는 실제 데이터와 UI가 어떻게 연결되고, 어떤 식으로 사용해야 하는지에 대한 내용은 아직 이야기 하지 않았습니다. 이제서야 이 이야기를 할 순서가 된 것 같습니다. 오늘은 asciimatics로 TUI를 구현할 때, 데이터를 연동하는 방법에 대해서 살펴보겠습니다. asciimatics의 애니메이션 기능을 설명하면서, 이 라이브러리는 애니메이션 구축 측면에서는 실제 애니메이션 영화를 제작할 때 사용하는 스토리보드 기법을 차용했다고 했습니다. 그리고 UI를 구성하는 측면에서는 모델과 뷰를 구분합니다.… 더 보기 »ASCIIMATICS TUI – 데이터 다루기

컴퓨터에서의 반올림 규칙

대부분의 프로그래밍 언어에서는 사칙연산을 포함한 기본적인 산술 기능이나 고급 수학 함수들을 제공합니다. 그리고 여기에 올림이나 내림, 반올림 같은 정밀도와 관련된 기능도 포함됩니다. 숫자를 포맷팅하는 기능을 제공하는 언어는 어떤 숫자값을 소수점 아래 몇 자리까지 표현하는 포맷을 적용할 때 기본적으로 반올림 기능을 사용합니다. 그런데 컴퓨터에서 사용하는 반올림 기능와 우리가 학교에서 배워서 알고있는 반올림이 좀 다른 규칙이라는 건 알고 있나요? 아니, 반올림이 동네마다 다른 규칙을 쓴다니, 그건 어느 동네 수학이죠? 암튼, 컴퓨터에서 부동소수점 소수값을 정수로 변환하는 규칙에 관한 국제 표준이 있습니다. 우리가 학교에서… 더 보기 »컴퓨터에서의 반올림 규칙

Python 101 – 클래스

이 글을 읽으시는 파이썬을 공부하는 여러분은 아마도 들어보셨겠지만, 파이썬은 객체 지향 언어입니다. 객체 지향 언어는 객체 지향 프로그래밍이라는 패러다임을 따르는 방식으로 설계된 언어입니다. 그리고 클래스는 어떤 객체를 정의해놓은 청사진과 같다고들 합니다. 그래서 클래스가 무엇인지를 이해하려면 먼저 객체가 무엇인지를 알아야겠네요. 위키 백과에서 객체에 대해 찾아보면 다음과 같은 설명을 찾을 수 있습니다.

컴퓨터 과학에서 객체 또는 오브젝트(object)는 클래스에서 정의한 것을 토대로 메모리에 할당된 것으로 프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간을 의미하며, 변수, 자료 구조, 함수 또는 메소드가 될 수 있다.

여러 편집자들이 고민하여 작성한 설명이겠지만, 이 설명만 들어서는 객체가 무엇인지 알기가 어렵습니다. 사실 객체의 개념은 워낙 추상적이라 일상의 언어로 정확하게 설명하기란 어렵습니다. 그래서 대략의 어설픈 이해를 바탕으로 접근해서, 객체가 어떤 식으로 사용되고 또 어떻게 만들 수 있는지를 받아들이는 편이 좋을 듯 합니다. 사실 학문적으로 엄밀하고 정확한 이해보다는 어떻게 만들고 사용할 수 있는지를 아는 것이 더 중요하니까요.

더 보기 »Python 101 – 클래스

ASCIIMATICS로 UI를 구성하는 방법

지난 글에서 asciimatics를 사용하여 간단한 애니메이션을 만드는 예를 보면서, 애니메이션을 구성하는 요소들에 대해 알아보았습니다. 그리고 이 애니메이션을 구성하는 요소들이 UI에서는 어떤 식으로 대응하는지를 간략하게 언급했습니다. 이를 다시 정리해보면 다음과 같은 원리들이 보입니다. 애니메이션처럼 UI를 갖춘 앱도 여러 개의 화면을 가질 수 있습니다. 메모앱이나 연락처와 같은 앱을 생각하면 목록화면과 내용 편집 화면의 두 개의 화면이 필요할 것입니다. 이러한 화면들은 각 화면이 하나의 장면(Scene)에 대응합니다. 각 화면은 적어도 1개 이상의 창을 포함할 것입니다. 각각의 창은 프레임(Frame)이라는 클래스를 서브클래싱하여 구현합니다. 이 Frame은 다시… 더 보기 »ASCIIMATICS로 UI를 구성하는 방법

파이썬 추상 클래스로 Comparable 타입 선언하기

파이썬에서 타입 어노테이션을 붙일 때, 제네릭 타입에 대해서는 typing.TypeVar 를 사용하면 일반적인 타입 T를 가정하고 정의할 수 있습니다. 그런데 이러한 타입 T에 대해서 특정한 성질을 만족하게끔 하는 조건을 넣고 싶은 경우가 있습니다. 예를 들어 리스트에 대한 버블 정렬 기능을 함수로 구현한다고 하면, 인자의 타입은 list[T] 와 같이 타입 T를 원소로 하는 리스트라고 명시할 수 있는데, 이 때 정렬을 위해서는 순서나 대소를 비교할 수 있어야 하므로, 타입 T 는 x > y 와 같이 대소를 비교할 수 있는 타입이어야 합니다. 파이썬에서는… 더 보기 »파이썬 추상 클래스로 Comparable 타입 선언하기

AHK – 탐색기 파일 확장자 숨김/표시 전환

  • 기준

윈도 탐색기에서 파일 확장자를 표시하거나 숨기는 설정은 레지스트리의 값에 저장된다. 이 값을 변경한 후 F5키를 눌러서 탐색기의 화면을 새로 고침하면 변경 사항은 즉시 적용된다. 해당 키는 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced 아래에 있는 HideFileExt 로 REG_DWORD 타입의 값으로 이 값이 1이면 숨김, 0이면 표시이다. 탐색기에서 Win + Y 키를 눌러서 이 설정을 즉시 변경할 수 있는 기능을 AutoHotKey를 통해서 만들어 보자. 아래 스크립트는 AHK v2용이다. 위 스크립트를 실행한 상태에서 탐색기 화면에서 Win+Y 키를 누르면 파일 확장자가 보였다/숨겨졌다 하는 것을 확인할 수 있다. 비슷하게 탐색기에서… 더 보기 »AHK – 탐색기 파일 확장자 숨김/표시 전환

Python 101 – 함수

프로그래밍에서 함수는 핵심적인 개념이지만, 언어나 상황마다 용어가 다르기도 하고 정의도 모호해서 “함수는 이것이다!”라고 딱 잘라 말하기는 사실 힘듭니다. 위키 백과의 정의만 찾아봐도요.

함수(function), 서브루틴(subroutine), 루틴(routine), 메서드(method), 프로시저(procedure)는 소프트웨어에서 특정 동작을 수행하는 일정 코드 부분을 의미한다.

함수는 대부분의 프로그래밍 언어에서 지원하는 기능으로, 하나의 큰 프로그램을 여러 부분으로 나누어주기 때문에 같은 함수를 여러 상황에서 여러 차례 호출할 수 있으며 일부분을 수정하기 쉽다는 장점을 가진다.

https://ko.wikipedia.org/wiki/함수_(컴퓨터_과학)

가장 넓은 의미에서 함수를 정의하자면 “1개 이상의 동작을 묶어놓은 것”이라고 할 수 있습니다. 즉 일련의 동작을 하나의 단위로 묶어두고, 원하는 만큼 여러 차례 호출하여 사용하는 것이죠. 그렇게해서 전체 코드의 양을 줄일 수 있고, 또 공통된 동작에서 어떤 변경이나 수정이 필요할 때, 소스 코드의 이곳 저곳이 아닌 한 부분만 수정하면 되기 때문에 유지 보수 관점에서도 노력을 아낄 수 있죠.

이미 우리는 파이썬에서 함수를 사용하는 법을 알고 있습니다. 어떤 문자열이나 객체의 내용을 출력하는 print() 나 사용자로부터 문자열을 입력받는 input() 과 같은 동작은 파이썬이 미리 제공하는 함수입니다. 이렇게 별다른 사전 준비 없이 바로 사용할 수 있는, 파이썬이 기본적으로 제공하는 함수를 내장함수(builtin function)라고 합니다. 우리는 내장 함수를 사용하는 것외에 우리가 원하는 동작을 함수로 만들어서 사용할 수도 있습니다. 이런 개념을 내장함수에 상대적인 개념으로 사용자 정의 함수 (user defined function)이라고 합니다.

더 보기 »Python 101 – 함수

윈도 재설치에 대한 기록

  • 기준

코로나로 인해 본격적으로 재택근무를 시작하게 된 재작년에 8년정도 사용한 아이맥이 맛이갔던 관계로 급히 데스크탑 PC를 따로 주문했다. 당시에는 PC 수요가 많아서 한참 PC가격이 오르고 있던 때라, 원격 데스크톱만 구동이 되면 상관없다고 생각해서 가장 저렴한 견적으로 조립했었다. 이때 256MB 용량의 SATA 방식 SSD를 구매했는데, 이것 저것 설치하고 만들고 하다보니 어느덧 70% 정도 용량을 사용했다. 게다가 습관적으로 이걸 다시 5 : 2 정도의 비율로 드라이브 2개로 나눠서 사용하다보니 C드라이브 용량의 압박이 점점 심해졌다.

하여, SSD 증설을 해야겠다고 마음먹고 케이스를 열어보니 NVMe 방식 SSD를 설치할 수 있는 M.2 슬롯이 하나 있는게 아닌가? SATA 드라이브를 하나 더 다는 것 보다는 NVMe 드라이브를 연결하는 것이 더 빠르다는 이야기가 있으니까 이것은 단순히 새 SATA 드라이브를 하나 더 다는 대신 더 빠른 새 디스크에 윈도를 재설치하라는 계시로 받아들일만 했다.(그리고 지금 설치된 윈도는 윈도10으로 설치해서 윈도11으로 업그레이드를 한 것이라, 깔끔하게 새로 설치하고 싶었다. 물론 기존 OS에서 업그레이드했다고 해서 별 문제가 되지는 않는다. 늘 그렇듯이 이런 결정은 그냥 기분 문제이다.)

사실 PC를 포맷하고 재설치하는 일련의 작업들은 컴퓨터를 사용해온 시간이 오래된 만큼, 어느 정도는 익숙한 일이기는 하다. 그래도 또 최근 몇년간은 맥만 사용하다보니 살짝 헤맨 부분도 있고 당시에 뭔가를 선택하면서도 잘 모르겠지만 일단(?) 진행해서 운좋게 성공한 것들이 좀 있어서, 그런 점들을 확인하고 기록해두고 싶어서 재설치 과정을 정리해둔다.

더 보기 »윈도 재설치에 대한 기록

vim에서 설정파일을 메뉴로 열기

  • 기준

개인적으로 vim 설정을 하나의 vimrc 파일에 몰아서 만들기 보다는 여러 개의 파일로 쪼개어 사용자 설정 폴더 내에 배치해두고 사용하고 있다. 그러다보니 특정한 설정을 수정하려 할 때, 해당 파일을 빨리 찾아서 여는 기능이 필요했다. 사용자 정의 Ex 명령으로 만드는 방법이 있지만, Vim8의 팝업 기능을 사용하면 메뉴에서 원하는 파일을 선택해서 여는 기능을 구현할 수 있다.

더 보기 »vim에서 설정파일을 메뉴로 열기

정적/공유 라이브러리 만드는 법

  • 기준

정적 라이브러리 정적 라이브러리는 컴파일된 코드, 즉 오브젝트들의 모음이라고 이해할 수 있다. 컴파일러로 생성한 오브젝트 파일을 ar 명령을 사용해서 하나의 파일로 아카이브를 만들면 정적 라이브러리를 생성할 수 있다. 정적 라이브러리를 사용할 때에는 -L ./ -lmylib 과 같은 식으로 -L, -l 스위치를 사용해서 라이브러리 경로와 파일을 지정하여 컴파일하면 된다. 이렇게 컴파일한 프로그램에는 라이브러리가 실행파일에 통째로 포함되기 때문에 라이브러를 함께 배포할 필요가 없다. (대신 그만큼 실행파일의 크기가 그만큼 커진다.) sqlite3 소스를 받아서 아래와 같은 식으로 정적 라이브러리를 만든 후 실행파일을 만들 수… 더 보기 »정적/공유 라이브러리 만드는 법