Author Archives: 홈피지기

아이폰 또는 아이패드 키노트에서 아이폰 또는 아이패드에 없는 폰트를 사용하는 법

맥을 사용하는 이유 중의 하나가 맥에는 키노트라는 PT 프로그램이 있기 때문입니다. 전 수업을 키노트를 이용해서 하는데 수업 한 번 하려고 매번 무거운 노트북을 들고 다니는 것도 너무 힘들거군요.

원래는 아이폰용 키노트가 맥용 키노트보다 품질이 좋지는 았지만, 애플이 맥에서 만든 키노트 파일을 아이폰에서도 그대로 사용하게 하기 위해서 맥용 키노트의 성능을 아이폰용 키노트에 맞춰 다운그래이드하고, 맥용 최신 버젼인 모하비에서는 아예 성능이 좋은 예전 맥용 키노트가 작동하지 못 하게 만들었습니다. 결국 이제는 맥용과 아이폰용 키노트는 거의 90% 같은 것이라고 할 수 있습니다.

이런 결과로 아이패드를 이용해서 수업시간에 키노트를 사용해서 PT를 해도 상관없게 되어버렸습니다.그런데 문제는 아이폰용 키노트는 아이폰에 없는 폰트를 공식적으로 사용할 수 없더군요. 그래서 맥에서 만들어서 iCloud Dive에 넣어 사용하려고 하면 폰트가 없다는 에러가 나오더군요. 그래서 상심하다가 혹시나 하고 찾아 봤더니 방법이 있었습니다. 아래 링크 참고!

How to install custom fonts on your iPhone or iPad | Cult of Mac

설치하는 방법은 다음과 같습니다.

  1. 아이폰이나 아이패드에서 iFont을 설치합니다. 돈을 내면 광고를 제거할 수 있지만, 굳이 그렇게 하지 않아도 폰트를 설치할 수 있습니다.
  2. 본인이 사용하고자 하는 폰트를 새로 폴더를 만들어서 거기에 넣고, 이 폴더를 zip으로 압축합니다. 맥에서는 파인더에서 “압축하기”를 쓰시면 됩니다. 그런 다음 이 압축한 파일을 iCloud Dive, dropbox 같은 곳에 업로드합니다. 전 iCloud Dive를 사용했습니다.
  3. 다 업로드 되면 아이폰이나 아이패드에서 위에서 올린 zip 파일을 ‘파일’이나 ‘dropbox’ 앱에서 확인합니다.
  4. 올린 파일을 선택해, ‘공유’ 메뉴가 나오면, 앞에서 설치한 iFont이 나올 것입니다. 이것을 선택하면, iFont이 폰트 파일의 압축을 풀고 저장합니다.
  5. 다 저장되면, iFont 앱을 실행합니다. 아래 메뉴에서 ‘files’를 선택하면 앞에서 저장한 폰트가 보일 것입니다. 여기서 아이폰에 설치하고 싶은 폰트 이름 옆에 있는 ‘install’ 버튼을 누르고 계속 진행하면 아이폰에 그 폰트가 설치될 것입니다.
  6. iFont 앱에서 ‘installed’ 메뉴를 누르시면 설치된 폰트를 확인하실 수 있습니다.
  7. 이제 키노트에서 서체를 선택하시면 앞에서 설치한 폰트를 사용할 수 있습니다.

파이썬에서 함수를 만들 때, 리턴값으로 namedtuple을 써보자.

파이썬에서 리턴값이 조금 복잡해지면, 딕셔너리를 많이 사용했었습니다. 그런데 이렇게 만든 함수를 쓰려면(함수 이름을 ‘fun’이라고 합시다!), fun[‘name’] 과 같이 딕셔너리를 불러오는 방식으로 써야합니다. 뭐 키보드를 많이 두드려야 합니다. 그래서 이를 쉽게 하는 방법을 찾다가 Not using named tuples when returning more than one value from a function이라는 글을 봤습니다. namedtuple을 이용해서 하면 fun.name과 같이 쉽게 처리할 수 있습니다. 윗글에서 코드를 가져왔습니다. 아주 쉽게 처리할 수 있습니다! name = namedtuple("name", ["first", "middle", "last"]), 코드에서 namedtuple을 만들어서 return name("Richard", "Xavier", "Jones")같이 사용하는 것입니다. 그러면 만들 때 사용했던, ["first", "middle", "last"]을 가지고 처리할 수 있게 됩니다.

from collections import namedtuple

def get_name():
    name = namedtuple("name", ["first", "middle", "last"])
    return name("Richard", "Xavier", "Jones")

name = get_name()

# much easier to read
print(name.first, name.middle, name.last)

맥에서 홈브루(Homebrew)를 이용해서 chromedriver를 설치하기

통상적으로 웹 상에 있는 자료를 수집할 때 , 로그인과 같은 것을 처리하려면 PhantomJS을 이용해서, 즉 화면이 존재하지 않는 웹 브라우저, Headless Browser을 사용해서 웹 크롤링을 합니다. 그런데 문제는 이 방법이 진짜 웹 브라우저를 실행하는 것은 아니기 때문에 자잘한 문제가 많았습니다. 이를 해결하는 방법이 나왔는데, 창없는 크롬으로 크롤링하기 | Beomi’s Tech Blog입니다.

이 방법을 사용하기 위해서는 앞의 링크에서 언급한 것처럼 크롬과 chromedriver을 설치해야 합니다. 크롬은 설치하는 것을 쉽지만, chromedriver를 링크에서 언급한 곳에서 다운 받아 설치하면, 조금 번거로운 과정(chromedriver를 받아서 압축을 풀고, 그 압축을 푼 폴더 위치를 정확하게 찾아서 알아야 하는 과정)을 겪어야 합니다.

맥에서는 이를 쉽게 하는 방법이 있습니다. 이게 바로 Homebrew, macOS 용 패키지 관리자 — macOS 용 패키지 관리자를 사용하는 것입니다. 만약 맥에서 크롤링과 같은 작업을 하신다면, 이미 이게 무엇을 하는 것인지 알 것입니다. 모르신다면 설치할 가치가 있으니, Homebrew 사용법을 구글링해 볼 가치가 있습니다.

Homebrew를 알아보고 설치하셨다면, 터미널에서 brew cask install chromedriver이라고 치고 엔터를 누르면, 바로 chromedriver를 설치할 수 있습니다. 이렇게 설치한 다음 나만의 웹 크롤러 만들기(7): 창없는 크롬으로 크롤링하기 | Beomi’s Tech Blog에서 가져온 아래 python 코드를 실행하면, 바로 현재 naver 페이지를 naver_main_headless.png이라는 이름으로 저장할 것입니다.

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument('headless')
options.add_argument('window-size=1920x1080')
options.add_argument("disable-gpu")
# 혹은 options.add_argument("--disable-gpu")

driver = webdriver.Chrome('chromedriver', chrome_options=options)

driver.get('http://naver.com')
driver.implicitly_wait(3)
driver.get_screenshot_as_file('naver_main_headless.png')

driver.quit()

참고: homebrew – Brew install chromedriver not working? – Stack Overflow

추가: 맥에서 설치가 잘 되지 않으면 다음 글을 참고하세요! 맥에서 보안 때문에 사용할 수 없는 크롬드라이버 사용하는 법

Mac 용 R에서 잘 읽지 못 하는 한글 파일을 잘 읽는 방법

한국에서는 워낙 윈도우가 압도적으로 사용되는 곳입니다. 그래서 맥을 사용하는 사람 입장에서는 윈도우에서 만든 기본적인 자료, txt나 csv 형식 자료를 읽는데 가끔 문제가 생기기도 합니다. 물론 맥에서 작업하던 파일을 윈도우에 가져와 작업하려면 문제가 많이 발생합니다.

R을 사용할 때도 문제가 많이 생깁니다. 이는 파일에 들어가는 글자를 어떤 형식으로 구성하느냐 하는 문제, 즉 인코딩 문제 때문입니다. 일반적으로 윈도우는 euc-kr를 사용하고, 반면에 맥이나 리눅스는 utf-8을 사용하기 때문입니다.

이 문제를 극복하기 위한 여러가기 꼼수가 있었지만, R에서 이를 처리하는 함수를 하나 만들어서 처리하는 방식이 있어서 소개하고자 합니다. 이 방법은 r에서 한글문서 열때 인코딩 문제 에 소개된 것입니다. 뭐 이 글의 아이디어를 제가 했기 때문에 여기에 소개해도 무방할 것 같네요 ^^;

뭐 사용하는 방법은 간단합니다. 우선 이 함수를 사용하기 위해서 library(readr)을 입력합니다. 만약 에러가 난다면, install.packages("readr”)이라고 실행해서 패키지를 설치합니다. 패키지가 설치가 안 되면 R을 최신 것으로 설치하시면 됩니다. 그리고 다음과 같이 함수를 입력합니다. 전체 과정은 다음과 같이 하시면 됩니다.

library(readr)
read.any <- function(text, sep = "", ) {
encoding <- as.character(guess_encoding(text)[1,1])
setting <- as.character(tools::file_ext(text))
if(sep != "" | !(setting %in% c("csv", "txt")) ) setting <- "custom"
separate <- list(csv = ",", txt = "\n", custom = sep)
result <- read.table(text, sep = separate[[setting]], fileEncoding = encoding, )
return(result)
}

view raw

read_any.R

hosted with ❤ by GitHub

R을 많이 사용하신 분은 어떻게 사용할지 감을 잡으셨겠지만, 저와 같은 초보자를 위해서 한 번 사용해보겠습니다. 우선 다음 링크를 눌러서 사용할 샘플자료를 다운 받으세요! 바로 저장하시면 됩니다.

이 자료에 들어 있는 2017_7_8_KBO_win.csv 파일을 R에서 자료를 읽을 수 있는 폴더에 넣으세요. R에서 dir()을 입력했을 때, 위 파일 이름이 있는지 확인하세요.

맥에서 이 파일을 읽는 진행과정은 다음과 같습니다. 처음에는 read.csv()을 사용해서 읽는데 실패했던 파일이 read.any()을 이용해서는 성공하네요.

> temp_kbo <- read.csv("2017_7_8_KBO_win.csv", header = TRUE)
Error in make.names(col.names, unique = TRUE) :
'<bc><f8><c0><a7>'에서 유효하지 않은 멀티바이트 문자열이 있습니다
> library(readr)
> read.any <- function(text, sep = "", ) {
+ encoding <- as.character(guess_encoding(text)[1,1])
+ setting <- as.character(tools::file_ext(text))
+ if(sep != "" | !(setting %in% c("csv", "txt")) ) setting <- "custom"
+ separate <- list(csv = ",", txt = "\n", custom = sep)
+ result <- read.table(text, sep = separate[[setting]], fileEncoding = encoding, )
+ return(result)
+ }
> temp_kbo <- read.any("2017_7_8_KBO_win.csv", header = TRUE)
> head()
Error in head.default() : 기본값이 없는 인수 "x"가 누락되어 있습니다
> temp_kbo <- read.any("2017_7_8_KBO_win.csv")
> head(temp_kbo)
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16
1 순위 선수명 팀명 AVG G PA AB R H 2B 3B HR TB RBI SAC SF
2 1 김선빈 KIA 0.38 79 303 271 49 103 23 0 2 132 47 2 4
3 2 최형우 KIA 0.37 80 359 289 66 107 23 3 20 196 76 0 4
4 3 나성범 NC 0.359 61 264 237 53 85 20 1 13 146 51 0 1
5 4 김태균 한화 0.353 61 268 232 34 82 13 0 10 125 57 0 4
6 5 서건창 넥센 0.353 78 347 303 52 107 17 2 4 140 49 0 3
> temp_kbo <- read.any("2017_7_8_KBO_win.csv",header = TRUE)
> head(temp_kbo)
순위 선수명 팀명 AVG G PA AB R H X2B X3B HR TB RBI SAC SF
1 1 김선빈 KIA 0.380 79 303 271 49 103 23 0 2 132 47 2 4
2 2 최형우 KIA 0.370 80 359 289 66 107 23 3 20 196 76 0 4
3 3 나성범 NC 0.359 61 264 237 53 85 20 1 13 146 51 0 1
4 4 김태균 한화 0.353 61 268 232 34 82 13 0 10 125 57 0 4
5 5 서건창 넥센 0.353 78 347 303 52 107 17 2 4 140 49 0 3
6 6 이대호 롯데 0.351 79 333 302 44 106 7 0 16 161 60 0 0

view raw

read_any_ex.R

hosted with ❤ by GitHub

Noesis 라는 단어의 출처는 어디일까?

플라톤의 대화편이 테아이테토스를 읽다가 갑자기 ‘노에시스’라는 단어가 생각나서 찾아봤더니 후설:노에시스/노에마이라는 글을 발견했다. 이 곳에 다음과 같은 내용이 있었다.

중기부터 후기에 걸쳐 후설은 이 두 번째의 측면을 노에시스적 계기, 줄여서 노에시스(Noesis)라 불렀다.(좀 더 넓은 의미로, 지향적 체험 전체를 노에시스로 부르기도 한다.) 이것을 후설이 그리스어 누스’Nous(정신, 이성)’ 와 ‘노에인Noein(사유하다, 지각하다, 직관하다)’을 결합시켜 만들어낸 술어이다. 노에시스를 직역하면 ‘의식작용’이 된다.

진짜 그런가 하고 희랍어 텍스트에 이 단어가 들어있는 곳이 없는지 다음과 같이 Noesis를 검사해봤다. Perseus under Philologic: searching for νόησις

링크를 눌어보면 아시겠지만, 아쉽게 24군데에서 이 단어가 발견되었다. 결국 이 단어는 후설이 자신의 철학 체계에 끌어다 쓴 것일 뿐, 조어한 것은 아닐 것 같다.

터미널을 이용해서 현재 Raspberry Pi 서버의 IP 번호를 알고 싶을 때?

저는 라즈베리파이를 서버로 사용하고 있습니다. 터미널을 사용하다가 서버의 IP 주소를 알고자 할 때에는 조금 부식한 명령어인 ifconfig를 사용했습니다. 그런데 Raspberry Pi를 사용하다고 조금 더 쉬운 명령어를 알았습니다. hostname -I이라고 터미널에서 쓰면 바로 IP번호가 나옵니다. 이게 더 단순하게 이쁘게 나오네요! 아마도 파이가 우분투를 사용하니, 우분투를 사용하는 리눅스에서도 이 명령어는 돌아갈 것 같습니다. 맥에서는 이 명령어가 작동하지 않네요. 참고하세요. 이 내용은 Worksheet – Build a Python Web Server with Flask | Raspberry Pi Learning Resources에서 찾았습니다. ^^;

구글 R 스타일 가이드(Google’s R Style Guide)을 번역해 보았습니다.

구글에서 만든 Google’s R Style Guide를 번역해 봤습니다.

번역한 것을 보시려면, 아래 링크를 가시면 됩니다. 영어 부분은 링크파일에 주석처리되어 있습니다. 이상한 부분은 코드를 직접 보시고 확인해주셔도 됩니다. 앞부분에 있는 참고 부분을 추가한 것을 빼고는, 거의 구조와 내용은 손대지 않고 영어만 한글도 번역했습니다. 꼭 번역이 필요하지 않다고 생각된 부분은 번역을 하지 않았습니다.

Google’s R Style Guide

제가 전문 번역가가 아니기 때문에 이상한 부분이 많을 것 같습니다. 이상한 부분을 아래 링크를 통해 지적해주시면 수정하도록 하겠습니다. 참! 답글을 다실려면 github.com 아이디가 필요합니다.

구글 R 스타일 가이드(Google’s R Style Guide) 번역

Mac 에서 R의 rugarch 패키지 설치시 오류가 날 때 처리법

제목 그대로 다음과 같은 오류가 날 수 있습니다.

> require(rugarch)
필요한 패키지를 로딩중입니다: rugarch
Error : .onLoad가 loadNamespace()에서 'rgl'때문에 실패했습니다:
호출: dyn.load(file, DLLpath = DLLpath, )
에러: 공유된 객체 '/Library/Frameworks/R.framework/Versions/3.3/Resources/library/rgl/libs/rgl.so'를 로드 할 수 없습니다:
dlopen(/Library/Frameworks/R.framework/Versions/3.3/Resources/library/rgl/libs/rgl.so, 6): Library not loaded: /opt/X11/lib/libGLU.1.dylib
Referenced from: /Library/Frameworks/R.framework/Versions/3.3/Resources/library/rgl/libs/rgl.so
Reason: image not found

view raw

rugarch_error.R

hosted with ❤ by GitHub

그러면 XQuartz에 가서 XQuartz을 다운받아서 설치하시고 R을 종료하고 재실행하시면 잘 설치됩니다. 출처는 다음과 같습니다.

Installing “rgl” package in R, Mac OSX El Captian [fixed] – Stack Overflow

맥에 mpv을 설치해보자!

맥에는 이미 무비스트라는 걸출한 동영상을 보는 앱이 있기 때문에, 다른 앱이 거의 필요가 없죠. 그러나 가끔은 다른 앱이 필요한 경우가 있습니다. 이런 경우 저는 MPlayerx, MPlayer, VLC 등을 사용했었습니다. 그러나 MPlayerx은 malware 문제가 있는 관계로 바로 지워 버렸고, MPlayer 도 설치하는 것이 어렵고 뭘 설치해야 하는지 정신이 없고, VLC는 좀 사용하기가 불편했습니다. 예를 들어 앞으로 돌리기, 뒤로 되돌아 가기 등을 잘 찾을 수가 없더군요.

그러던 중 mplayer2 과 MPlayer을 포크해서(즉 소스를 갖다가 새로 만든) mpv(mpv.io)라는 새로운 플레이어 앱을 알게 되었습니다. 앞의 링크로 가보시면 아시겠지만, 정말로 단순한 UI을 가지고 있습니다. 물론 그건 것이 더 마음에 들었습니다. 그래서 설치를 해보고자 했더니 홈페이지에 OS X용은 다른 곳에 다운 받게 되어있더군요. 요즘 의심이 많아진 상태라서 앱을 직접 받는 것이 아니라 다른 방식으로 해보자는 생각이 들었습니다.

mpv.io | Installation를 보시면 아시겠지만, Homebrew으로 설치가 가능한 것 같더군요. 그래서 바로 설치에 들어갔습니다. Homebrew에 관련된 이야기는 다음 링크들을 참고하세요. 맨 마지막 링크를 보시면, 맥에 서버 같은 것을 쉽게 설치해주기도 합니다.

우선 Homebrew — macOS 용 패키지 관리자을 참고하여 Homebrew을 설치합니다. 그런 다음 다음과 같이 터미널에서 2줄만 입력하시면 됩니다. 참고로 첫번째 줄은 mpv이 있는지 확인하는 것입니다. 두번째 줄은 Homebrew를 최근 버젼으로 업그래이드 하는 것입니다. 마지막 세 번째 줄이 mpv이 바로 설치하는 명령어입니다.

brew search mpv
brew update
brew install mpv

뭐 이렇게 설치하면 앱 아이콘도 생기지 않습니다. 그러면 어떻게 mpv을 실행할까요? 터미널에서 실행하면 됩니다. mpv 파일명과 같이 입력하시면 됩니다. 불편해 보입니다. 그래서 제가 쓰는 편한 방법을 알려드리겠습니다. 우선 터미널에서 mpv이라고 키보드는 칩니다. 그런 다음 거기에 실행하고 싶은 파일 아이콘을 파인더에서 드래그 하여 터미널에 넣습니다. 그러면 파일 이름이 들어가게 됩니다. 그런 다음 엔터 키를 누르시면 됩니다. 뭐 설명은 복잡하지만, 한번해보시면 쉽습니다.

뭐 새로운 플래이어가 필요하시면 한번씩 설치해보세요! 생각보다 쓸만합니다.

데카르트의 Cogito ergo sum 에 대한 짧은 느낌

당근 지금 나는 생각하고 있겠지. 내가 있어야 생각할 수 있겠지. 없으면 생각할 수 있겠어? 나는 이것이 나에게 명석판명하게(clearly and distinctly), 인식되기 있기 때문에 참이라고 생각해. 그런데 그렇다고 해서, 다시 말해 내가 생각하고 있다고 해서, 내가 생각하고 있기 때문에, 이것을 근거로 내가 내 몸을 갖고 있다고 말할 수는 없지. 물론 나는 있지만 …?!

만일 내가 사고하지 않는다면 나는 내가 존재한다고 믿을 어떤 근거도 지니지 못할 것이다. 따라서 나는 오직 사고하는 것만을 본질로 삼는 실체이다. 따라서 내가 육체를 지닌다는 점은 나의 본질과 전혀 무관하다. 엔서니 케니, 『근대철학』, 김정호 옮김, 2014, 71~72쪽.

Cogito ergo sum – Wikipedia

데카르트가 새로운 옷을 만들어 그 옷을 입고 다녔는데 이 패션이 유행이 되었다. 모든 철학자들이 그 유행에 적합한, 그 옷에 잘 맞는 사람들이 아니었다. 데카르트이기 때문에 이 옷이 잘 맞았던 것일뿐이다.

고대 이래 자기 자신을 완전히 새로운 철학을 제시한 인물로 여긴 최초의 철학자는 바로 데카르트였다. 그는 자신을 인간과 인간을 둘러싼 세계에 관한 진리를 최초로 제시한 특권을 누린 인물로 여겼다. 이후 철학자들은 데카르트가 걸었던 길을 따랐다. 로크, 흄, 칸트는 각각 자신의 철학을 최초로 건전한 원리에 따라 구성된 새로운 창조물로 여겼다. ‘내 저술을 읽어라, 이전 사람들의 저술은 내다 버려라’ – 이것이 17, 18세기 사상가들의 한결 같은 주장이었다, 엔서니 케니, 『근대철학』, 김정호 옮김, 2014, 77쪽.