분류 전체보기
-
VLC 미디어 재생의 데이타 흐름 다이어그램Streaming Media/Media Tools 2016. 12. 16. 14:24
아래는 VLC로 미디어 파일을 재생할 경우 구성되는 요소와 데이터의 흐름을 나타낸 다이어그램이다. read는 받는 쪽에서 데이터를 가져오는 방식이고 send/play는 보내는 쪽에서 밀어내는 방식이다. thread간에는 fifo(queue)로 이용하는 데이터를 전달한다. VLC의 객체 간의 구성을 데이타 흐름과 같이 구성해보면 다음과 같다. 실선은 객체의 부모/자식의 관계, 두꺼운 점선(···)은 데이타의 흐름과 관련된 구성(연결관계), 점선(---)은 객체의 일부 구성(포함관계)을 나타낸다. 2013/06/17 - [Practice/FFmpeg] - FFmpeg 데이타 흐름 다이어그램
-
쉘스크립트에서 안전하게 문자열(string)을 비교하는 방법Programmer/Computer Skills 2016. 9. 30. 16:50
두 문자열을 안전하게 비교할 때는 if [ x$A == x$B ]; then echo $1 fi 또는 if [ "$A" == "$B" ]; then echo $1 fi 를 사용한다. 빈 문자열인지 안전하게 검사하는 방법은 if [ x$A == x ]; then echo $1 fi 또는 if [ "$A" == "" ]; then echo $1 fi 내지는 if [ -z "$A" ]; then echo $1 fi 이 있다. x와 같은 문자를 추가하거나 인용문자(")로 둘러싸지 않으면 빈문자열이거나 옵션 형태의 문자열이 들어오면 오류가 발생할 수 있다. 아래와 같이 STRING을 따옴표로 둘러싸지 않으면 [ -z STRING ] STRING이 "-n", "-p" 등을 포함한 옵션 형태의 문자열이 들어오면 문제..
-
Common Lisp으로 구현한 트리(Tree)를 중위 순회(In-order Traversal)하는 반복자(Iterator)Programmer/Programming 2016. 5. 17. 15:02
사소해 보이는 연산 뒤에 숨어있는 것 은 인턴 전화 면접에서 깨달은 내용을 담고 있다. 이 글은 인턴 면접을 소재로 하는데, 면접의 내용 중에 트리(Tree)를 중위 순회(Inorder Traversal)하는 반복자를 구현하는 것이 있다. 이 글의 필자는 C++로 구현하였다. 평소 업무에서 Common Lisp을 쓸 기회가 없어서 자꾸 잊어버린다. 도구를 갈고 닦지 않으면 녹슬기 마련이다. 간단하게 트리의 중위 순회를 Common Lisp으로 작성해봤다. 순회 순서 왼쪽의 하위 트리를 순회한다. 자신(중간) 오른쪽의 하위 트리를 순회한다. 순회할 첫번째 노드 구하기 : begin 최상위 노드의 가장 왼쪽에 있는 노드가 첫번째 노드이다. 구현은 왼쪽 하위 노드를 재귀적으로 찾는다. (defun begin ..
-
Lisp에서 클로저(closures)Programmer/Programming 2016. 2. 18. 15:57
클로저란 함수가 lexical 환경(environment)의 변수를 참조하는 것을 말한다. 예를 들면, 아래 코드를 살펴보자. (defparameter *plus-10* (let ((x 10)) (lambda (y) (+ x y)))) X와 Y를 더하는 함수 객체를 만들고, *PLUS-10*이 이를 가르키게 한다. Lexical 변수 X는 LET 구문 블럭이 생성한 환경에 갇혀서 외부에서는 접근할 수 없다. LET 구문 블럭이 종료되었다는 것은 실행 흐름이 LET이 생성한 환경에서 벗어났다는 것을 의미한다. 그럼에도 불구하고, *PLUS-10*를 호출하면 X 변수를 참조할 수 있다. CL-USER> (funcall *plus-10* 20) 30 함수 객체가 다른 곳(예제에서는 dynamic 환경의 *PL..
-
Lisp에서 lexical과 dynamic 변수 타입Programmer/Programming 2016. 2. 18. 15:43
Lisp에는 lexical과 dynamic이라는 두가지 변수(variables) 형태가 존재한다. lexical 변수는 소스 코드를 읽는 단계에서 바인딩(binding)이 결정된다. C나 Java 같은 언어에서 말하는 지역(local) 변수를 생각하면 된다. 함수의 매개변수(parameters)나 LET 구문의 변수가 이런 타입니다. 함수의 매개변수 (defun foo (x y) (+ x y)) 함수를 호출하면, 이 함수에 전달하는 인자(arguments)와 연결(binding)하는 매개변수를 생성한다. 이 변수는 함수 내로 범위가 한정된다. LET 구문의 변수 (let ((x 10) (y 20)) (+ x y)) LET 구문 역시 함수 호출과 동일한 효과를 가진다. LAMBDA로 표현하면 함수의 매개변..
-
애덤 그랜트의 창의성에 관한 인터뷰 중 관심있는 내용 발췌Leader/Developer Leading 2016. 2. 15. 14:23
집단은 아이디어를 생산하지는 못하지만 가장 좋은 아이디어는 정확하게 뽑아낼 수 있습니다. 하나의 큰 아이디어보다는 적어도 8~9개의 다른 아이디어를 제시할 수 있어야 합니다. 창의성은 위험감수(risk taking)와 다릅니다. 위험감수는 실패할 확률이 높은 것에 도전하는 행위입니다. 생각이 다른 것이 위험을 감수하는 것은 아닙니다. 자녀의 창의성을 길러주는 방법 중에 하나는 "규칙을 최소화"하라 입니다. 창의력은 배양하기 어렵지만 꺾기는 쉽습니다 출처: 머리를 맞대고 아이디어 찾는다고? 창의성 죽이는 지름길 애덤 그랜트 미 펜실베이니아대 와튼스쿨 최연소 종신교수 2014/03/31 - [Theory/Problem Solving] - 창의적인 일을 찾지 말고 창의적으로 일을 하라.
-
Lisp 비교 : 암호 문자열 감추기 문제 풀이Programmer/Programming 2016. 1. 13. 18:53
"케빈 TV 12회 (상) - 느 언어엔 이런거 없지?"에 주어진 글자수만큼 '*'를 가진 문자열을 생성하는 문제가 나왔다. 여러 언어별 구현이 나왔지만, Common Lisp와 Emacs Lisp, Scheme, Clojure가 없어서 여기에 적어본다. Common Lisp: (defun hide-password (passwd) (coerce (mapcar #'(lambda (x) #\*) (coerce passwd 'list)) 'string)) Emacs Lisp: (defun hide-password (passwd) (coerce (mapcar (lambda (x) ?\*) (coerce passwd 'list)) 'string)) Scheme: (define (hide-password passw..
-
기반 기술을 어디까지 알아야 할까?Life/Software Engineer 2016. 1. 5. 11:42
"기반 기술"을 알아야 좋은 개발자이다. 대략 맞는 말이지만 알아야 하는 기반 기술의 깊이를 논의할 필요가 있다. 개발자의 시간 자원이 유한하기 때문이다. 전산학이나 소프트웨어 엔지니어링의 진보는, 다른 분야와 마찮가지로, 이전 세대가 완성했던 토대 위에 새로운 것을 더하는 과정이다. 어떤 기술이 기반 기술이 될 정도로 널리 인정받으면 그것 위에 다음 계층이 놓인다. 이렇게 기술은 블럭처럼 하나씩 쌓여나간다. 각 계층은 추상화로 구분한다. 새로이 추가된 층위는 하위 단계를 추상화한다. 만약, 하부 영역의 세부 구현에 의존한다면-즉, 추상화를 하지 않았다면- 아래 부분을 확장한 것이지 새로운 계층을 추가한 것이 아니다. 하위 영역를 추상화하면 문제의 범위가 현저하게 낮아진다. HTTP 프로토콜을 논할 때 ..