선언형 코드(Declarative Programming)

선언형 코드(Declarative Programming)는 프로그래밍에서 어떤 작업을 수행하는 방법보다는 수행하고자 하는 결과에 초점을 맞춘 접근 방식입니다. 이 방식은 ‘무엇을’ 할 것인가에 집중하며, ‘어떻게’ 할 것인가는 시스템이 결정하도록 합니다.

선언형 프로그래밍의 특징은 다음과 같습니다:

  1. 추상화의 수준이 높음: 선언형 코드는 복잡한 로직이나 상태 관리를 숨기고, 더 높은 수준의 추상화를 제공합니다. 프로그래머는 세부적인 구현보다는 전체적인 목표나 명세에 집중할 수 있습니다.
  2. 코드 간결성: 선언형 프로그래밍은 일반적으로 더 간결하고 읽기 쉬운 코드를 작성하는 데 도움이 됩니다. 이는 코드의 의도를 더 명확하게 전달하고 유지 보수를 용이하게 합니다.
  3. 코드 재사용성 및 모듈성 향상: 선언형 코드는 재사용 가능한 구성 요소로 작성되기 쉽습니다. 이러한 구성 요소는 다른 컨텍스트에서도 쉽게 사용될 수 있으며, 모듈성을 향상시킵니다.
  4. 부작용 감소: 선언형 프로그래밍은 부작용(side effects)을 최소화하는 경향이 있습니다. 이는 프로그램의 예측 가능성과 신뢰성을 높이는 데 도움이 됩니다.

HTML과 SQL은 선언형 프로그래밍의 좋은 예시입니다. 예를 들어, HTML에서는 웹 페이지의 구조를 선언하지만, 이를 어떻게 렌더링할지는 브라우저가 결정합니다. SQL에서는 데이터를 어떻게 조회하고 조작할지를 선언하지만, 실제 데이터베이스가 그 쿼리를 어떻게 처리할지는 숨겨져 있습니다.

React.js 역시 선언형 프로그래밍의 접근을 사용합니다. React에서는 UI의 상태를 선언하고, 그 상태가 변경될 때 UI가 어떻게 업데이트되어야 하는지 React 엔진이 결정합니다. 이는 개발자가 UI의 세부적인 동작보다는 UI의 전체적인 구조와 동작에 더 집중할 수 있게 해줍니다.

선언형 프로그래밍을 이해하기 쉽게 만드는 좋은 방법은, 선언형과 명령형(절차적) 프로그래밍의 차이를 예시를 통해 설명하는 것입니다. 각각의 스타일은 ‘무엇을’ 하고 싶은지(선언형)와 ‘어떻게’ 해야 하는지(명령형)에 초점을 맞춥니다.

명령형 프로그래밍 예시:

문제: 리스트에서 모든 짝수를 찾아 그 합을 계산합니다.

명령형 접근:

  1. 빈 합계 변수를 생성합니다.
  2. 리스트를 순회합니다.
  3. 각 요소가 짝수인지 확인합니다.
  4. 짝수라면 합계에 더합니다.
  5. 최종 합계를 반환합니다.
numbers = [1, 2, 3, 4, 5, 6]
sum_even = 0
for num in numbers:
    if num % 2 == 0:
        sum_even += num
print(sum_even)  # 결과: 12

이 접근 방식에서는 ‘어떻게’ 계산을 해야 하는지 단계별로 설명합니다.

선언형 프로그래밍 예시:

선언형 접근:

  1. 짝수만 필터링합니다.
  2. 필터링된 숫자의 합을 계산합니다.
numbers = [1, 2, 3, 4, 5, 6]
sum_even = sum(num for num in numbers if num % 2 == 0)
print(sum_even)  # 결과: 12

이 접근 방식에서는 ‘무엇을’ 할 것인지를 선언합니다. 즉, “짝수를 찾아 그 합을 구한다”고 선언하며, 구체적인 ‘어떻게’에 대해서는 걱정하지 않습니다.

HTML의 예시:

HTML은 웹 페이지의 구조를 선언적으로 정의합니다. 예를 들어:

<!DOCTYPE html>
<html>
<head>
    <title>My Page</title>
</head>
<body>
    <h1>Welcome to My Page</h1>
    <p>This is a paragraph.</p>
</body>
</html>

여기서는 웹 페이지의 구조를 선언합니다: 제목이 있고, 그 아래에 단락이 있습니다. 이를 어떻게 브라우저에 표시할지는 선언하지 않습니다. 그 결정은 브라우저의 렌더링 엔진이 담당합니다.

React의 예시:

React에서는 UI를 선언적으로 구성합니다:

function WelcomeMessage() {
    return <h1>Welcome to My Page</h1>;
}

ReactDOM.render(<WelcomeMessage />, document.getElementById('root'));

이 코드는 “Welcome to My Page”라는 제목이 있는 컴포넌트를 선언합니다. 이 컴포넌트가 어떻게 렌더링되고, 화면에 어떻게 표시될지에 대해서는 걱정하지 않습니다. 그 작업은 React 라이브러리에 의해 처리됩니다.

이러한 예시들은 선언형 프로그래밍이 ‘무엇을’ 할 것인지에 집중하고, ‘어떻게’ 해야 하는지는 프로그래밍 언어나 프레임워크에 위임한다는 개념을 잘 보여줍니다.

좋은 아이디어는 멍때리기에서 나온다? DMN 탐구

미국 뇌과학자 마커스 라이클 박사의 연구에 따르면, 사람이 아무런 인지 활동을 하지 않을 때 활성화되는 뇌의 특정 부위가 있는데, 이를 ‘디폴트 모드 네트워크'(DMN)라고 합니다.

DMN은 휴식을 취할 때 활성화되며, 몽상을 즐길 때나 잠을 자는 동안에 활발한 활동을 합니다. DMN의 발견은 뇌가 아무것도 하지 않을 때도 몸 전체 산소 소비량의 20%를 차지하는 이유를 설명합니다.

또한, DMN이 활성화되면 창의성이 생겨나고 특정 수행 능력이 향상되는 것으로 나타났습니다. 예를 들어, 일본 도호쿠 대학 연구팀은 아무런 생각을 하지 않을 때 뇌 혈류 상태를 측정했고, 그 결과 백색질의 활동 증가와 혈류의 흐름이 활발해진 실험 참가자들이 새로운 아이디어를 신속하게 내는 데 높은 점수를 받았습니다

디폴트 모드 네트워크(Default Mode Network, DMN)는 뇌과학 분야에서 중요한 개념입니다. 이 네트워크는 뇌의 여러 부분이 서로 연결되어 있으며, 특히 주의가 외부 자극에서 벗어나 내부 사고나 기억에 집중될 때 활성화되는 것으로 알려져 있습니다.

DMN의 구성

  • 주요 영역: DMN은 뇌의 여러 영역을 포함하며, 특히 전전두엽 피질, 측두엽, 후두엽 상부, 그리고 후엽부(특히 시상하부와 연결된 부분)를 포함합니다.
  • 연결성: 이 네트워크는 이러한 뇌 영역들 간의 강한 기능적 연결성을 특징으로 합니다.

DMN의 기능

  • 내부적 사고: DMN은 자아 관련 사고, 과거의 추억 회상, 미래에 대한 상상, 그리고 다른 사람들의 관점을 이해하는 데 중요한 역할을 합니다.
  • 정신적 휴식: DMN은 외부 환경에 대한 주의력이 감소했을 때 활성화되며, 이는 정신적 휴식이나 명상과 같은 상태와 관련이 있습니다.
  • 자기 성찰: 자기 생각과 감정에 대한 성찰, 자아성찰의 과정에 중요합니다.

DMN과 질병

  • 정신 질환: 우울증, 불안 장애, 조현병과 같은 정신 질환에서 DMN의 활성화 패턴이 변화하는 것이 관찰되었습니다.
  • 신경퇴행성 질환: 알츠하이머병과 같은 신경퇴행성 질환에서도 DMN의 연결성 및 활성화에 변화가 나타납니다.

연구 및 응용

  • 뇌 이미징 연구: 기능적 자기 공명 영상(fMRI)을 통해 DMN의 활동을 연구하고 있으며, 이를 통해 다양한 신경정신 질환의 메커니즘을 이해하는 데 기여하고 있습니다.
  • 치료적 접근: DMN의 활동을 조절하는 것이 명상, 인지 행동 치료 등의 효과를 설명할 수 있으며, 이를 바탕으로 새로운 치료 방법을 모색하는 데 도움이 됩니다.

요약

DMN은 뇌의 여러 부분이 연결되어 있으며, 내부 사고, 자기 성찰, 그리고 정신적 휴식과 관련이 있는 중요한 뇌 네트워크입니다. 이 네트워크는 다양한 정신 질환의 이해와 치료에 중요한 역할을 하고 있습니다.


디폴트 모드 네트워크(DMN)는 인간 두뇌의 기본 구성 요소로, 고유한 역할과 특성으로 인해 신경과학 연구에서 큰 주목을 받고 있습니다.

인지 과정에서의 DMN의 역할: DMN은 특히 외부 작업에 집중하지 않고 공상, 과거 또는 미래 관조, 다른 사람의 관점 고려와 같은 내성적인 활동에 참여할 때 활성화됩니다. 이 네트워크는 깨어 있는 상태에서도 활성화되지만, 정신이 힘든 작업에 몰두하지 않는 휴식 상태에서는 더욱 활발하게 활동합니다.

정보와 감각의 통합: DMN은 공상, 회상, 미래 계획과 같은 내부 지향적 인지 과정에 특화된 ‘내재적’ 시스템으로 간주됩니다. 이 시스템은 들어오는 외재적 정보를 이전의 내재적 정보와 통합하여 상황에 따른 풍부한 상황 모델을 형성하고 공유 커뮤니케이션, 내러티브 및 소셜 네트워크에 기여하는 역동적인 역할을 합니다.

정신 질환에 대한 관여: DMN의 조절 장애는 다양한 형태의 정신 질환과 연관되어 있습니다. 예를 들어, DMN 내 연결성 문제는 우울증 환자의 높은 수준의 반추와 관련이 있습니다. 또한, DMN은 알츠하이머병이나 파킨슨병과 같은 질환에서 중요한 에피소드 기억 처리에 관여하여 기억 처리에 영향을 미칩니다.

창의력 향상에 기여: DMN은 다른 뇌 네트워크와 함께 창의력을 키우는 데 중요한 역할을 하는 것으로 알려져 있습니다. 사람의 머릿속이 공회전하는 동안 DMN의 활동은 아이디어를 생성하는 데 도움이 될 수 있으며, 이 아이디어는 다른 네트워크에 의해 추가로 처리될 수 있습니다.

수면 중 활동: DMN은 수면 중에도 활동하며, 정신적 이미지 및 꿈과 관련이 있습니다. 공상과 몽상은 비슷한 뇌 메커니즘을 사용하는 것으로 추정되며, 몽상은 공상이나 정신적 방황의 더 강렬한 형태라고 할 수 있습니다.

구조적 측면: 신경학자 마커스 라이클이 발견한 DMN은 전두엽, 두정엽, 측두엽 피질의 일부를 포함한 여러 뇌 영역에 걸쳐 있습니다. 이러한 영역은 특정 정신 기능과 관련하여 공동 활성화 또는 비활성화를 나타내며, 이는 DMN의 복잡성과 전두엽 네트워크 및 실행 제어 네트워크와 같은 다른 뇌 네트워크와의 통합을 강조합니다.

시간에 따른 이해의 진화: 지난 20년 동안 DMN의 기능에 대한 이해는 크게 발전해 왔습니다. 이제 DMN은 자기 참조, 사회적 인지, 에피소드 및 자서전적 기억, 언어, 의미 기억, 정신적 방황에서 그 역할이 인정받고 있습니다. DMN은 기억, 언어, 의미적 표현을 통합하고 방송하여 자아와 의식의 구성에 중심이 되는 ‘[[내적 내러티브]]’를 생성합니다.

이처럼 광범위한 인지 및 감정 과정에 관여하는 DMN은 인간 정신의 전반적인 기능과 안녕에 있어 그 중요성을 강조합니다. DMN은 내부 및 외부 정보를 통합하고 처리하는 데 중요한 네트워크 역할을 하며, 우리 자신을 인식하고 다른 사람과 상호 작용하며 창의적이고 반성적인 사고 과정에 참여하는 방식에 영향을 미칩니다.

OpenAI Whisper 새로운 버전 large-v3


OpenAI의 Whisper가 새로운 버전인 large-v3로 업데이트되었습니다. 이번 업데이트에서 주목할 점은 다음과 같습니다:

  1. 입력 오디오 처리: 새로운 모델은 128개의 Mel 주파수 빈을 사용하여 오디오를 처리합니다. 이는 이전 모델의 80개에 비해 증가한 수치입니다.
  2. 언어 지원 추가: Cantonese(광둥어) 언어 토큰이 새롭게 추가되었습니다.
  3. 학습 데이터: large-v3 모델은 large-v2를 사용해 수집한 1백만 시간의 약하게 레이블링된 오디오와 4백만 시간의 의사 레이블링된 오디오로 학습되었습니다.
  4. 성능 향상: large-v3는 다양한 언어에 대한 성능이 향상되었으며, 특히 오류율이 60% 미만인 모든 언어에서 large-v2에 비해 오류율이 10%에서 20% 감소한 것으로 나타났습니다.
  5. 캐릭터 오류율 사용: 일부 언어(한국어, 중국어, 일본어, 태국어, 라오스어, 미얀마어)는 문자 기반 오류율(CER)을 사용하여 평가했습니다.
  6. 사용 방법: large-v3 모델은 openai-whisper==20231106 버전 이후로 사용 가능하며, pip install -U openai-whisper 명령어를 통해 패키지를 업데이트한 후 "large-v3" 이름으로 모델을 로드할 수 있습니다

https://github.com/openai/whisper/discussions/1762

GPTQ-for-LLaMa

GPTQ-for-LLaMa는 Google AI의 LLaMa 대규모 언어 모델에 대해 특별히 설계된 양자화 프레임워크입니다. GPTQ는 “Gradient-Perturbed Training for Quantization”의 약자이며 모델 가중치를 양자화하여 메모리 사용량과 계산 비용을 줄이는 데 사용할 수 있습니다.

LLaMa는 175억 개의 매개변수를 가진 방대한 언어 모델입니다. 텍스트 생성, 언어 번역, 다양한 종류의 창의적인 콘텐츠 작성, 유익한 방식으로 질문에 답변할 수 있습니다. 그러나 LLaMa와 같은 대규모 언어 모델은 메모리 집약적이고 계산 비용이 많이 들 수 있습니다.

GPTQ-for-LLaMa를 사용하면 LLaMa 모델의 메모리 사용량과 계산 비용을 줄일 수 있습니다. 이를 통해 LLaMa를 저전력 장치에서 실행하고 더 많은 요청을 처리할 수 있습니다.

GPTQ-for-LLaMa는 아직 개발 중이지만 LLaMa 모델의 메모리 사용량과 계산 비용을 줄이는 데 효과적인 것으로 나타났습니다. 또한 LLaMa 모델의 성능 저하가 적은 것으로 나타났습니다.

GPTQ-for-LLaMa는 LLaMa 모델의 메모리 사용량과 계산 비용을 줄이는 데 유용한 도구입니다. 또한 LLaMa 모델을 다양한 장치에서 실행할 수 있으므로 더 많은 사용자에게 액세스할 수 있습니다.

JAX란 무엇인가요?

JAX란 무엇인가요?
JAX는 고성능 머신 러닝 연구를 위해 결합된 Autograd와 XLA입니다.

업데이트된 버전의 Autograd를 통해 JAX는 네이티브 Python과 NumPy 함수를 자동으로 구분할 수 있습니다. 루프, 브랜치, 재귀, 클로저를 통해 차별화할 수 있으며, 파생 함수의 파생 함수를 취할 수 있습니다. 정방향 미분뿐만 아니라 그라데이션을 통한 역방향 미분(일명 역전파)도 지원하며, 이 두 가지를 임의의 순서로 구성할 수 있습니다.

새로운 기능은 JAX가 XLA를 사용하여 GPU와 TPU에서 NumPy 프로그램을 컴파일하고 실행한다는 것입니다. 컴파일은 기본적으로 내부에서 이루어지며 라이브러리 호출은 적시에 컴파일되고 실행됩니다. 그러나 JAX를 사용하면 단일 함수 API인 jit를 사용하여 자체 Python 함수를 XLA에 최적화된 커널로 적시에 컴파일할 수도 있습니다. 컴파일과 자동 차별화를 임의로 구성할 수 있으므로 Python을 벗어나지 않고도 정교한 알고리즘을 표현하고 최대 성능을 얻을 수 있습니다. pmap을 사용하면 여러 개의 GPU나 TPU 코어를 한 번에 프로그래밍하고 전체를 통해 차별화할 수도 있습니다.

조금 더 자세히 살펴보면 JAX가 실제로 컴포저블 함수 변환을 위한 확장 가능한 시스템이라는 것을 알 수 있습니다. grad와 jit는 모두 이러한 변환의 인스턴스입니다. 그 외에도 자동 벡터화를 위한 vmap과 여러 가속기의 단일 프로그램 다중 데이터(SPMD) 병렬 프로그래밍을 위한 pmap이 있으며, 앞으로 더 많은 기능이 추가될 예정입니다.

https://github.com/google/jax

macOS에서 C 언어를 어셈블리어로 컴파일

macOS에서 C 언어를 어셈블리어로 컴파일하려면 GCC(GNU Compiler Collection) 또는 Clang 컴파일러를 사용할 수 있습니다. macOS에는 기본적으로 Clang이 설치되어 있지만, GCC를 설치하려면 Homebrew와 같은 패키지 관리자를 사용할 수 있습니다.

아래는 macOS에서 C 언어를 어셈블리어로 컴파일하는 방법입니다.

  1. C 프로그램이 있는 파일을 준비하세요. 예를 들어, 파일 이름이 hello.c라고 가정하겠습니다.
  2. 터미널을 열고 아래와 같은 명령어를 입력하여 C 소스 코드를 어셈블리어로 컴파일하세요.Clang을 사용하는 경우:
clang -S -O0 -mllvm --x86-asm-syntax=intel hello.c -o hello.s

GCC를 사용하는 경우:

gcc -S -O0 -masm=intel hello.c -o hello.s

여기서 -S 옵션은 컴파일러에게 어셈블리어로 컴파일하도록 지시합니다. -O0 옵션은 최적화를 비활성화합니다. 최적화를 끄면 더 읽기 쉬운 어셈블리 코드를 얻을 수 있습니다. -mllvm --x86-asm-syntax=intel (Clang) 또는 -masm=intel (GCC) 옵션은 어셈블리어를 인텔 구문으로 출력하도록 설정합니다.

위의 명령어를 실행한 후, hello.s 파일에 어셈블리어 코드가 생성됩니다. 이 파일을 열어 어셈블리 코드를 확인할 수 있습니다.

Hello C 코드

#include <stdio.h>

int main(){
	printf("Hello\n");
	return 0;
}

어셈블리어

	.section	__TEXT,__text,regular,pure_instructions
	.build_version macos, 13, 0	sdk_version 13, 0
	.intel_syntax noprefix
	.globl	_main                           ## -- Begin function main
	.p2align	4, 0x90
_main:                                  ## @main
	.cfi_startproc
## %bb.0:
	push	rbp
	.cfi_def_cfa_offset 16
	.cfi_offset rbp, -16
	mov	rbp, rsp
	.cfi_def_cfa_register rbp
	sub	rsp, 16
	mov	dword ptr [rbp - 4], 0
	lea	rdi, [rip + L_.str]
	mov	al, 0
	call	_printf
	xor	eax, eax
	add	rsp, 16
	pop	rbp
	ret
	.cfi_endproc
                                        ## -- End function
	.section	__TEXT,__cstring,cstring_literals
L_.str:                                 ## @.str
	.asciz	"Hello\n"

.subsections_via_symbols

주어진 어셈블리 코드를 실행하려면 먼저 해당 코드를 컴파일하고 링크해야 합니다. 이 과정에서 다음과 같은 단계를 거칩니다.

어셈블리 코드를 파일에 저장합니다. 예를 들어, hello.s라는 파일로 저장합니다.

터미널을 열고, 해당 어셈블리 파일을 목적 파일로 컴파일합니다. 이 때, 아래와 같은 명령어를 사용합니다.

gcc -c hello.s -o hello.o

이 명령어는 hello.s 파일을 hello.o라는 목적 파일로 컴파일합니다.

이제 목적 파일을 실행 파일로 링크합니다. 다음과 같은 명령어를 사용합니다.

gcc hello.o -o hello

이 명령어는 hello.o라는 목적 파일을 hello이라는 실행 파일로 링크합니다.

실행 파일을 실행합니다.

./hello
  1. 이 명령어를 실행하면, 프로그램이 실행되고 “Hello” 문자열이 출력됩니다.

참고로, 이 과정은 x86-64 아키텍처 기반의 macOS 또는 Linux 시스템에서 작동합니다. 다른 시스템이나 아키텍처에서 실행하려면 명령어와 옵션을 조정해야 할 수도 있습니다.

Github 개인 액세스 토큰 만들기 :: 깃허브

개인 액세스 토큰 사용

You can create a personal access token to use in place of a password with the command line or with the API.

노트:

  • If you use GitHub CLI to authenticate to GitHub on the command line, you can skip generating a personal access token and authenticate via the web browser instead. For more information about authenticating with GitHub CLI, see gh auth login.
  • Git Credential Manager is a secure, cross-platform alternative to using personal access tokens (PATs) and eliminates the need to manage PAT scope and expiration. For installation instructions, see Download and install in the GitCredentialManager/git-credential-manager repository.

개인 액세스 토큰(PAT)은 GitHub API 또는 명령줄 을 사용할 때 GitHub에 인증하는 데 암호 대신 사용할 수 있습니다.

PAT를 사용하여 SAML SSO를 사용하는 Organization이 소유한 리소스에 액세스하는 경우 PAT를 인증해야 합니다. For more information, see ” About authentication with SAML single sign-on ” and ” Authorizing a personal access token for use with SAML single sign-on ” in the GitHub Enterprise Cloud documentation.

As a security precaution, GitHub automatically removes personal access tokens that haven’t been used in a year. To provide additional security, we highly recommend adding an expiration to your personal access tokens.

토큰을 사용하여 할당되지 않은 scopes can only access public information repo. For more information, see ” Available scopes “.

토큰 만들기

  1. 아직 확인하지 않은 경우 이메일 주소를 확인 합니다.
  2. 모든 페이지의 오른쪽 상단에서 프로필 이미지를 클릭한 다음 Settings(설정) 를 클릭합니다.
  3. In the left sidebar, click Developer settings .
  4. 왼쪽 사이드바에서 Personal access tokens(개인 액세스 토큰) 를 클릭합니다.
  5. Generate new token 을 클릭합니다.
  6. 토큰에 알기 쉬운 이름을 지정합니다.
  7. To give your token an expiration, select the Expiration drop-down menu, then click a default or use the calendar picker.
  8. 이 토큰에 부여할 범위, 즉 권한을 선택합니다. 토큰을 사용하여 명령줄에서 리포지토리에 액세스하려면 repo 를 선택합니다.
  9. Generate token 을 클릭합니다.경고 : 토큰은 비밀번호처럼 취급하고 비밀로 유지하십시오. API를 사용하는 경우 토큰을 프로그램에 하드 코딩하는 대신 환경 변수로 사용하십시오.
  10. To use your token to authenticate to an organization that uses SAML single sign-on, authorize the token. For more information, see ” Authorizing a personal access token for use with SAML single sign-on ” in the GitHub Enterprise Cloud documentation.

명령줄에서 토큰 사용

토큰을 받으면 HTTPS를 통해 Git을 조작할 때 암호 대신 해당 토큰을 입력할 수 있습니다.

예를 들어, 명령줄에서 다음을 입력할 수 있습니다.

$ git clone https://github.com/username/repo.git
Username: your_username
Password: your_token

개인 액세스 토큰은 HTTPS Git 작업에만 사용할 수 있습니다. SSH 원격 URL을 사용하는 리포지토리의 경우 원격을 SSH에서 HTTPS로 전환 해야 합니다.

사용자 이름과 암호를 묻는 메시지가 표시되지 않으면 자격 증명이 컴퓨터에 캐시되었을 수 있습니다. 이전 암호를 토큰으로 교환하도록 키체인에서 자격 증명을 업데이트 할 수 있습니다.

Instead of manually entering your PAT for every HTTPS Git operation, you can cache your PAT with a Git client. Git will temporarily store your credentials in memory until an expiry interval has passed. You can also store the token in a plain text file that can read before every request. 자세한 내용은 Git에 GitHub 자격 증명 캐싱 을 참조하십시오.

참고 링크

안경닦는 천

  • 눈가에 무엇인가 아른거린다.
  • 시선을 돌리면 따라오지 않고 고개를 돌리면 따라오는걸로 봐서는
  • 안경에 뭐가 묻은것이 확실하다.
  • 내 몸은 뇌가 시키지도 않는데 책상 첫번째 서랍을 열고 있다.
  • 그 안에 안경닦는 천이 있기 때문이다.
  • 보통은 안경닦는 천이 그리 깨끗하지 않다.
  • 최근 안경을 새로 맞춘 관계로 아주 깨끗한 안경닦는 천이 들어 있었다.
  • 왼쪽을 3번 오른쪽을 3번 닦고 나니 그래도 새로 사서 깨끗한 안경이 더욱더 깨끗해졌다.

영화 테넷을 보았다.

영화 테넷을 보았다.

CGV 극장

  • 테넷 개봉일 오전 9시 강남역 CGV에 가운데 좋은 자리를 예매했다.
  • 오전 9시까지 가기 위해 약간의 빠른 걸음을 걸으니 오랜전 회사에 출근하던 기억이 잠깐 났다.
  • 정시간에 출근했던 적이 거의 없었던거 같았는데 
  • 지금은 서두루고 있구나.

조조할인

  • 조조할인이라 7천원밖에 안했다.
  • 코로나로 한칸씩 띄어서 좌석을 배치했지만 극장안에 대략 15명 정도 밖에 없었다.
  • 더욱 좋은 점은 내 앞에는 아무도 없었다.

테넷

  • 테넷의 주인공은 자신의 목숨을 내던져 인류 멸망을 막는다는 이야기다.
  • 만약 인류의 절반이 망한다면 지금처럼 넓은 극장을 독차지 할 수 있겠다는 멍청한 생각이 문득 들었다.
  • 강남역은 뜨거운 햇살때문인지 코로나 때문인지 사람의 절반정도는 없는거 같았다.

알라딘 중고 서점

  • 영화를 다 보고 바로 옆 알라딘 중고 서점에서 무라카미 하루키의 “직업으로서의 소설가” 책을 샀다.
  • 중고 서적은 처음 사 보는데 그냥 새책 같아서 너무 놀랐다.
  • 아무리 봐도 중고책의 흔적을 찾을 수 없었다.
  • 책의 절반이 멸망해도 괜찮을 것같다는 또 멍청한 생각이 잠시 스쳐갔다.

바닐라 라떼

  • 내가 좋아하는 아이스 바닐라 라떼를 한잔 하면서 책을 읽어 볼까 했는데
  • 때마침 점심시간이라 카페에는 앉을 자리가 없을 정도였다.
  • 영화 테넷의 인버스와 만나는 현상같이 사람이 너무 많았다.