콘텐츠로 건너뛰기
Home » Uncategorized

Uncategorized

띄어쓰기에 대한 생각

업무 메일을 쓸 때 가장 많이 쓰는 말 중에 하나가 메일 말미에 ‘업무에 참고 부탁 드립니다.‘인데요, 어느 날부터 아웃룩에서 이 ‘부탁 드립니다’가 틀렸다고 맞춤법 지적을 하기 시작했습니다. 맞는 말은 ‘부탁드립니다’라고 붙여 쓰는 거라고. 사실 아래아한글 시절부터 이전의 MS워드까지, 워드프로세서들의 한국어 맞춤법 검사 실력은 거의 있으나 마나 한 것이어서 그 말을 곧이 곧대로 믿기가 어려웠습니다. 그리고 느낌상 ‘부탁드립니다’라는 말은 붙여 쓰기에는 너무 긴 것이 아닌가하는 생각도 들었구요. 그래서 한 번 찾아보기로 했습니다. 가장 상위에 표시된 결과에서는 띄어 써야 한다고 합니다. 하지만… 더 보기 »띄어쓰기에 대한 생각

구글 포토에서 아이클라우드로 탈출한 후기

한 때 구글 포토가 백업 용량을 무제한으로 제공해 주겠다고해서, 구글 포토를 사용해서 사진을 백업해왔습니다. 물론 이 이야기의 결말은 저나 이 글을 읽고 있는 여러분이나 모두 알고 있습니다. 사실 AI에게 학습 시킬 이미지 데이터를 모으기 위한 것일 뿐이라거나 하는 이야기는 그 당시에도 있었습니다만, 에이 그래도 구글인데 용량은 넉넉하게 주겠지…하는 순진한 생각을 했던 게 실수였습니다. 구글은 어느 틈엔가 구글 계정의 저장 공간을 하나로 통합했고, 구글 포토에 사진이 많이 올라가 있는 사람은 구글 원 서비스를 구독하지 않으면 메일 용량이 꽉차서 메일을 더 이상 수신할 수가 없었습니다.

더 보기 »구글 포토에서 아이클라우드로 탈출한 후기

Julia의 함수 사용팁

연산자의 함수적 표기 Julia의 연산자는 기본적으로 함수이며, 함수 호출 표기와 같은 방식으로 호출하는 것이 가능합니다. 또한 그 자체로 함수이기 때문에 filter(), map() 과 같이 함수를 인자로 받는 함수에도 연산자를 그대로 적용하는 것이 가능합니다. 특히 + 연산자는 sum() 함수와 같이 여러 인자를 받아 인자들의 합을 구할 수 있습니다. 이 때, 비교 연산자들은 첫번째 인자만 전달된 경우에는 부분 적용된 함수를 생성합니다. 이는 특히 함수를 인자로 전달하는 함수에 사용될 때, 표현을 간결하게 하는데 유용합니다. map / filter / reduce 배열과 관련해서 가장 많이… 더 보기 »Julia의 함수 사용팁

git 사용자 선택 팝업 생략하기

git을 사용하다보면 언젠가부터 아래의 UI가 표시되면서 사용자 계정을 선택하라는 메시지가 표시되어 귀찮습니다. 처음에는 매번 인증을 하라는 건가?라고 생각했는데, 시스템에 git 사용자가 2개가 되면서 어떤 사용자로서 git 명령을 수행할 것인지를 묻는 내용이더군요. 매 번 이렇게 계정을 선택하라는 팝업이 뜨는 것은 git이라는 계정이 자동으로 등록되면서 시스템에 2개의 계정이 등록되어 있기 때문인데, 늘 같은 사용자 계정만 쓴다면 간단히 다음과 같은 명령으로 설정하여 이 귀찮은 계정 선택 팝업을 생략할 수 있습니다. 여기서 my_user_name 부분은 당연히 자신의 사용자 계정이어야 합니다.

Rust 기초 (1)

데이터의 변수와 메모리 관리 방식 Rust는 정적 타이핑 언어로, 컴파일 시점에 모든 변수의 타입이 결정됩니다. Rust는 다양한 데이터 타입을 가지고 있는데, 이러한 타입들은 메모리를 사용하는 특성에 따라 스칼라 타입과 복합형으로 구분됩니다. 스칼라 타입은 하나의 단일 값을 의미하는데, 불리언(bool), 정수, 실수, 문자(char) 타입등이 여기에 속합니다. 복합형은 한 가지 정보로만 구성되는 데이터가 아니며, 같은 타입이어도 크기가 다를 수 있는 유형입니다. 문자열(String) 같은 타입이 복합형에 해당합니다. 스칼라 타입은 단일 값이며, 항상 그 크기가 고정되어 있습니다. 따라서 이러한 타입들은 스택에 저장됩니다. 문자열과 같은 복합형은… 더 보기 »Rust 기초 (1)

async for 구문의 작동 원리

비동기, 즉 작업이 완료되지 않더라도 리턴하는 함수는 프로그래밍에서 꽤 오랜 역사를 가지고 있는 아이디어입니다. . 비동기 함수는 ‘동시성’ 혹은 ‘병렬처리’를 위해 고안된 개념이기도 하고요. asyncio 가 비동기 처리에 관한 라이브러리라는 것은 그 이름부터 이미 알려주고 있습니다. 그런데 다시 말하지만 ‘비동기’는 동시성이나 병렬처리를 위해 고안된 개념이라는 것입니다. 컴퓨터 공학 분야에서 병렬처리나 분산처리에 대한 논의는 오래전부터 있었고, 지금 널리 사용되고 있는 다중 스레드의 개념도 이때 등장하여, 여러 상황이나 조건들에 의해 채택되고 지금까지 이어지고 있는 것입니다. 거꾸로 말하면 동시성 처리를 위해서 반드시 스레드만… 더 보기 »async for 구문의 작동 원리

수식을 조합해서 1~40을 만들 수 있는 수 찾기

이 문제는 작년에 조카의 수행평가 관련해서 질문 받은 것인데, 네 개의 서로 다른 숫자와 기본연산자를 조합하여 1~40의 모든 정수를 만들 수 있는 숫자를 찾는 문제였다. 사실 이 문제가 코딩 문제가 아닌 수학 수행 평가라는 점에서 눈을 의심하지 않을 수 없는데, 4개의 숫자로 구성되는 순열(24개)에 대해서, 각 숫자 사이에 들어갈 수 있는 연산자의 경우는 중복을 허용하여 5가지 (사칙연산에 필요한 4개와 연산자를 쓰지 않고 숫자를 붙이는 경우 1개 더)이기 때문에, 숫자 4개가 결정되었을 때 만들 수 있는 식의 개수는 무려 3,000 개이다. 1~9의 9개 숫자 중에서 4개를 선택하는 경우는 126가지이므로 4개의 숫자를 사용해서 만들 수 있는 식의 경우는 총378,000 가지이고, 이 문제는 전수 검사 (운이 좋다면 중간에 40가지의 수를 만드는 식을 만들 수 있는 조합을 찾을 수 있겠지만)를 통해서 찾아야 하는 수 밖에 없고, 결국 가능한 경우를 찾으려면 최악의 경우 거의 38만개의 식을 검사해야 하는데 이걸 컴퓨터의 힘을 빌리지 않고 수행평가를 하라는 것인지 이해가 가지 않았기 때문이다.

컴퓨터를 사용해서 이 문제를 해결하는 방법 자체는 간단한데, 의외로 실행 시간이 오래 걸릴 수는 있다. 이 문제에서는 어떻게든 숫자 4개의 조합에서 1~40까지를 만들 수 있는 경우를 찾으면 바로 종료하여 최대한 시간을 단축하는 방법을 사용했다.

더 보기 »수식을 조합해서 1~40을 만들 수 있는 수 찾기

ZMQ 소켓 – Dealer, Router 이해하기

이전 글에서 프록시를 소개하면서 단순한 REQ – REP 패턴의 네트워크 중간에 중간 매개로 프록시를 넣어 REQ – ROUTER – DEALER – REP 형태로 패턴을 확장하는 예를 살펴보았다. 이 때, ROUTER – DEALER 사이에서 오가는 데이터를 보면 REQ-REP 사이에서 오가는 데이터와 다르게 추가된 프레임이 보인다는 것을 볼 수 있었다. 이번 글에서는 이런 현상은 왜 일어나며, ROUTER가 무슨 짓을 벌이는지에 대해 소개하고자 한다. 적어도 이 개념을 이해한다면 ZMQ를 통해서 훨씬 더 유연하고 창의적인(?) 패턴을 만드는 것도 가능하리라고 본다. 먼저 간단한 REQ-REP 패턴에서… 더 보기 »ZMQ 소켓 – Dealer, Router 이해하기

마이크로소프트 무선마우스 4000 사용후기

코로나로 인해서 학교에서 원격 수업을 하기 시작하면서 딸아이도 본격적으로 컴퓨터를 사용하게 됐다. 집에서 사용하는 노트북을 구매할 때 받은 미니 무선 마우스가 있었는데, 몇 번 떨어뜨려서 건전지 수납부 뚜껑이 떨어져서 잃어버렸다. 그 이후로 쓰는 중에 건전지가 빠져서 마우스가 꺼지는 일이 자주 있어서 새 마우스를 알아보았다. 아무래도 손이 작은 아이가 주로 쓸 것이라 크기가 작은 것들 위주로 알아보려 했는데, 별도의 USB 리시버를 꽂지 않아도 사용할 수 있는 블루투스 연결을 지원하는 마우스들도 많이 있더라. 노트북을 가지고 다니는 일이 잦은데, 이 리시버가 작긴하지만 가방에… 더 보기 »마이크로소프트 무선마우스 4000 사용후기

Julia – 파일 다루기

Julia에서 파일을 여는 법

줄리아에서 파일을 읽고 쓰기 위해서는 IOStream 객체이를 이용한다. 스트림 객체를 만들기 위해서는 open() 함수를 사용한다. 이렇게 얻은 스트림객체는 read(), write(), seek()등 파일 입출력 관련 함수에서 사용된다. 가장 기본적인 문법으로 파일을 열어서 내용을 읽고 출력하는 코드를 작성해보면 다음과 같은데, 다른 많은 언어들과 큰 차이를 보이지 않는 것 같다.

fd = open("myfile.txt")
body = read(fd, String)
println(body)
close(fd)
더 보기 »Julia – 파일 다루기