애니 및 드라마 자막 다운로드 서비스

안녕하세요,

자주 사용하던 smidown.com 이 다운되어서 임시로 애니, 일드 및 미드 자막 제작자 분들이 업로드한 자막을 수집해서 보여주는 사이트를 만들었습니다.

사용자 삽입 이미지

다음 주소 방문하시면 됩니다 : http://subtitle.sunghwanyoo.com

검색 기능 등은 지원하지 않습니다만, 나중에 추가하도록 하겠습니다. ^^

콘티 작성 및 찬양곡 연관도 분석 툴

(updated 2014.3.24)

취미생활로 제작하던 콘티 작성 및 찬양도 연관도 분석 툴을 공개합니다. 콘티를 짤 때 연결되는 곡들을 만들기 위해서 찬양집 목록을 뒤적이는 분들이 많으실 것 같은데요, 자동으로 연관된 가사를 가진 곡들이나 해당 곡과 같은 콘티에 들어갔던 적이 많은 곡들을 보여주는 도구입니다.

다음 주소를 방문하시면 됩니다 : http://project.sunghwanyoo.com/similar_worship

사용자 삽입 이미지


첫 화면을 보면, 기본적으로 가장 많이 불리는 곡 가운데 하나인 “예배합니다”와 “그 사랑”과 관련된 곡들이 화면상에 보여지게 됩니다.

메뉴를 보면 다음과 같은 기능들이 있습니다.

1. Relations

선택된 곡 (여기에서는 “예배합니다”와 “그 사랑”)과 관련된 곡들을 선정하는 기준을 설정합니다.  “By used”는, 같은 콘티에서 있었던 곡들 중에 가장 많이 선택된 곡을 출력하고(즉 같이 불려진 횟수), “By lyric”은 가사의 내용을 기반으로 가장 유사한 곡들을 출력해줍니다. “All”은 이 둘을 적절히 조합하여 출력해줍니다.

2. Layout

곡들을 화면상에 어떻게 출력할지를 결정합니다. “By similarity”는 유사한 곡들(같이 불려진 횟수 혹은 가사 유사성)이 가급적 근처에 붙어있을 수 있도록 하고, “By key”는 Key 별로 분류해서 출력해주는 역할을 합니다. 곡별로 있는 원들은 Key를 의미하므로, 아래와 같이 “By key”를 선택하면 색깔별로 모이는 것을 볼 수 있습니다.

사용자 삽입 이미지

3. Filter

화면상에 곡이 너무 많을 경우, 중요도 순으로 이를 필터링하는 기능을 합니다.

4. Sort

그다지 중요하지는 않는데, 곡들을 정렬할 때 출력 횟수를 기준으로 하는지 아니면 연결된 링크의 수를 기반으로 하는지를 결정합니다. 그냥 놔두셔도 됩니다.

* 곡별 정보 분석

화면상에 있는 각 곡의 이름 혹은 원 위에 마우스 커서를 올리면 가사 첫줄 제목과 작곡자 등의 정보가 보여집니다. 여기에서 “콘티에 추가”를 클릭하시면 오른쪽 콘티 리스트에 곡이 추가됩니다.

사용자 삽입 이미지

아직까지 콘티상의 곡을 삭제하거나 하는 기능은 없지만, 조만간 추가할 예정입니다. 그리고 콘티상의 곡을 클릭하시면 옆에 pin 아이콘이 나타나면서, 해당 곡을 중심으로 새로이 연관곡들을 갱신해서 화면에 출력해주게 됩니다. 이 때 여러곡을 선택해서 분석하실 수도 있습니다.

사용자 삽입 이미지

마지막으로 화면상에 없는 곡들은 위에 있는 검색 기능으로 콘티상에 추가하실 수 있습니다. 원하는 곡을 입력하고 Search 를 누르시면 됩니다.

사용자 삽입 이미지

악보보기나 음악듣기와 같은 기능들은 저작권 문제로 구현하지 않았습니다. 공개 버전에서는 추후 가사 보기 같은 기능 혹은 부분 악보보기 기능이라도 구현해 볼 예정입니다.

그럼 콘티 짜실 때 도움이 되었으면 좋겠습니다. ^^

Installing pptpd on Ubuntu

Recently I had to set up VPN server on my Ubuntu server 10.04.

Yes, Ubuntu 10.04 is old but the following guide  will also work for latest  Ubuntu systems as well.

pptpd is the VPN server that provides microsoft VPN protocol, which will mostly work fine with any vpn connection from Windows, OSX, or iOS systems.

Anyway, here are the steps for installing and configuring pptpd:

1. Install pptpd

sudo apt-get install pptpd

2. Configure your IP

sudo vi /etc/pptpd

(Use nano if you are not familiar with vi/vim)

At the last two bottom lines, pptpd would already have configured localip and remoteip according to your system. If not, you should modify it.

For example, if your server’s IP is 192.168.0.20, then you may configure as follows:

localip 192.168.0.20
remoteip 192.168.0.230-239

It will make pptpd to use server ip address as 192.168.0.20 while vpn clients that access to this server will use remove ip range from 192.168.0.230 – 192.168.0.239. It also means, you will allow only 10 multiple vpn client connections at a time. You can increase it if you want, but make sure remoteip range doesn’t overlap with localip.

3. Configure ppp options

In your /etc/pptpd/conf file, there may be options file location. It probably will be /etc/ppp/pptpd-options. Let’s open it and make sure we have right encryption level.

sudo vi /etc/ppp/pptpd-options

Do not allow pap, chap, and mschap.

refuse-pap
refuse-chap
refuse-mschap

Allow ms-chapv2 (which is more secure) and mppe-128.

require-mschap-v2
require-mpp3-128

I think those are already default option. If so, you don’t need to make any change.

Also, you need to configure DNS.  Check /etc/resolve.conf if your server already have configured DNS. If that address is 22.22.22.22 and 22.22.22.23 configure ms-dns as

ms-dns 22.22.22.22
ms-dns 22.22.22.23

Otherwise you may use Google’s DNS server.

ms-dns 8.8.8.8
ms-dns 8.8.4.4

4. Configure account for user

Lastly, you should configure user account for the VPN connection.

sudo vi /etc/ppp/chap-secrets

And add

testuser pptpd testpassword *

Then you may be able to connect to VPN with ID=testuser PW=testpassword.

Note that if you use special characters like “#” in the password, that will cause trouble. I recommend to use just alphanumeric for your password. Also, make sure your chap-secrets file in unix CRLF format. (I spent couple of hours to find the problem that pptpd didn’t let me log in–it was due to chap-secrets file)

5. Restart pptpd

You can simply

sudo server pptpd start

to start the pptpd server or

sudo server pptpd restart

to restart pptpd.

6. Check what’s going on with syslog

If VPN doesn’t work, you may want to check out what’s going on under the hood. All the message will be recorded through syslog. So

sudo tail -f /var/log/messages

will show you any log associated with pptpd.

I hope this helps whom wants to run VPN server on Ubuntu.

Cheers,

문제로 풀어보는 알고리즘 0.3 생각해보기 풀이 – Ruby version

연구실에서 실험 중에 facebook 에 링크가 하나 올라왔길래 풀어봅니다. ㅎㅎ 자꾸 딴 짓 하면 안되는데…;;

원본 문제는 http://www.insightbook.co.kr/post/3814 에 게제되어 있습니다.

배열 arr[]과 위치 s, t가 있을 때,
arr[s], arr[s+1], … , arr[t-1]을 오른쪽으로 한 칸씩 이동하고,
arr[t]는 arr[s]로 복사하는 것을 ’1만큼 오른쪽으로 회전시켰다’고 한다.

예를 들어 길이가 8인 배열에서 s=2, t=6이면 다음 그림처럼 바뀐다.

길이가 n인 배열의 위치는 0, 1, 2, … , n-1이다.

문제 :
k를 인자로 받아서 k만큼 오른쪽으로 회전시키는 함수를 작성하라.
단, 1만큼 오른쪽으로 이동시키는 과정을 k번 반복해서는 안 된다.

조건 1 : 작성하는 언어에는 제한이 없습니다.
조건 2 : 답안으로 작성하신 글 제목에는 ‘문제로 풀어보는 알고리즘 0.3 생각해보기 풀이’라는 문장이 들어가야 합니다. (저희 블로그에도 트랙백을 걸어주세요.)

(주의: 이 코딩 인터뷰는 인사이트 입사와는 무관합니다. ㅡㅁㅡ /)

shift(array, k)를 어떻게 구현하냐는 것인데요,

일반적으로 생각하기 쉬운 알고리즘은 2가지 정도가 있습니다.

첫째는 array를 하나 더 만들어서 각 element를 새로운 배열의 (element+k) MOD n 위치로 복사하는 방법이 있습니다. 가장 일반적인 방법이지만, 창의적이지는 않지요.

둘째는, 해답이라기 보다도 트릭이겠지만, 위의 (element_k) MOD n 을 함수처럼 제공하는 방법이 있습니다. 즉 shift(array, k, i)를 억세스하면 shift 된 array를 반환시키는 방법이죠. 하지만 이것은 문제에서 요구하는 방법은 아니니까 패스…

스크립팅 언어를 사용하면 코딩량을 줄일 수 있는 다른 괜찮은 트릭이 나오겠지만, 문제에서 코딩량 보다는 O(n) 알고리즘을 어떻게 효율적으로 구현하느냐의 트릭을 요구하는 것 같아서 한 번 reverse 를 3번 구현해서 shift를 구현하는 방법을 사용해 보았습니다. 예전 고등학생 때 올림피아드 준비하면서 알아뒀던 알고리즘인데, 여기서 다시 볼 줄은 몰랐네요. ㅎㅎ

ruby 로 된 답을 한번 제시해봅니다.

#!/usr/bin/ruby

# Reverse the array
def rev(a,s,e)
    for i in 0..(e-s-1)/2 do
        tmp=a[s+i]
        a[s+i]=a[e-i]
        a[e-i]=tmp
    end
end

# Shift the array with size of k with three reverses
def func(a,k)
    rev(a,0,a.length-1)
    rev(a,0,k-1)
    rev(a,k,a.length-1)
end

arr = Array.new
arr = [1, 2, 3, 4, 5, 6]

puts "Original = " + arr.inspect

func(arr,3)

puts "Shifted  = " + arr.inspect

rev()를 3번 이용해서 Shift 시키게 됩니다. rev()는 주어진 array의 주어진 범위 내에 있는 원소들의 위치를 반대 방향으로 만들어주는 함수입니다.

하나씩 뜯어보면

    rev(a,0,a.length-1)

를 실행하면

a = [6, 5, 4, 3, 2, 1]

이 됩니다. 그 상태에서

    rev(a,0,k-1)

를 실행하면

a = [4, 5, 6, 3, 2, 1]

이 되고, 마지막으로

    rev(a,k,a.length-1)

를 실행하면

a = [4, 5, 6, 1, 2, 3]

이 되어서 shift 연산을 완료하게 됩니다.

실제로 shift를 구현할 때 위 방법이 많이 쓰이는지는 모르겠군요. 메모리 가격이 중요했던 예전에는 array 하나로 해결할 수 있는 저런 알고리즘이 각광을 받았는데, 요즘은 뭐… 그냥 알아보기 쉬운 코드가 제일이 아닌가 싶습니다.

array가 정수라고 가정해서 덧셈을 이용한 swap을 하면 tmp 변수도 필요없이 swap 하는 트릭도 있습니다만, 대신 속도가 느려서 요즘은 쓸 일 없겠죠.

HTML5+CSS web application building blocks

HTML5+CSS web application building blocks.

<fundamentals>
    □ jQuery.js : simplifies selecting and modifying selecting DOM objects.
    □ Prototype.js : Javascript framework
    □ backbone.js : enables rich web applications(like Gmail) on front-end side with MVC model.
    □ underscore.js : adds functional programming language features.
    □ LAB.js : on-demand javascript loader.

<template>
    □ handlebars.js : template engine
    □ mustach.js : template engine

<server-side script>
    □ node.js : server-side javascript.
    □ phantomJS : webkit console program

<javascript compiler>
    □ coffeescript : little language that compiles into JavaScript

<css>
    □ SASS : extendable and hierarchical css sheet.

<mobile support>
    □ iscroll : enables ipad/iphone ready scroll interface to web.
    □ zepto.js

<unit testing>
    □ jslint : javascript code quality tool
    □ Qunit : javascript test suite
    □ Ready.js : tool to prepare your javascript files for production

<Ruby integrated>
    □ Jammit : asset packaging library for Rails

Holstee Manifesto

Holstee 의 기업 사명문(Manifesto) :

이것은 당신의 인생이다.
사랑하는 것을 하고, 자주 하라.

무언가 마음에 들지 않는다면, 바꿔라.
직업이 마음에 들지 않는다면, 그만 둬라.
충분한 시간이 없다면, TV를 그만 봐라.

당신 삶 속에서 사랑을 찾는다면, 멈춰라.
사랑하기 시작한다면,
당신을 기다리는 누군가를 발견할 수 있을 것이다.

더 이상 분석하려 들지 마라. 삶은 간단하다.
모든 감정은 아름답다.
무언가를 먹는다면, 마지막 한입까지 즐겨라.

새로운 것과 사람들에게 당신의 정신과, 양팔과, 마음을 열라.
우리 모두는 다양함 가운데 하나되어 있다.

자주 여행하라. 길을 잃으면 자기 자신을 찾을 수 있을 것이다.
어떤 기회들은 오직 한번만 찾아오니, 꼭 붙잡아라.

삶은 곧 당신과 만나는 사람들이자, 그들과 함께 창조하는 것이다.
그러니 나가서 만들기를 시작하라.

인생은 짧다.
당신의 꿈을 좇아 살고, 당신의 열정을 나누라.

원본 주소 : http://shop.holstee.com/pages/about

이렇게 간지나는 기업 사명문도 흔치 않은 것 같다.. 나의 삶은 무엇일까?

내가 사용하는 bash prompt

bash prompt 를 어떻게 꾸미느냐는 사람 취향에 따라 다르겠지만, 나는 아래와 같이 사용한다.

PS1=”\n\[\e[30;1m\](\`if [ \$? = 0 ]; then echo \[\e[32m\]^_^\[\e[0m\]; else echo \[\e[31m\]O_O\[\e[0m\]; fi\`\[\e[30;1m\])-(\[\e[37;1m\]\u@\h\[\e[30;1m\])-(\[\e[37;1m\]jobs:\j\[\e[30;1m\])-(\[\e[37;1m\]cpus:\`ps u | grep `whoami` | awk ‘{ SUM += \$3 } END {print SUM}’\`%\[\e[30;1m\])-(\[\e[33;1m\]\w\[\e[30;1m\])\n(\[\[\e[37;1m\]! \!\[\e[30;1m\])-> \[\e[0m\]”

이하는 스크린샷:

사용자 삽입 이미지

2개의 라인에 걸쳐 이전 커맨드의 성공 여부, 자신의 whoami 및 hostname, job 개수, cpu 점유율, 그리고 현재 디렉토리를 차례로 표시하기 때문에 보다 편하게 사용할 수 있다. 짧은 프롬프트를 원하는 분들에게는 비추.

다른 괜찮은 bash prompt 를 참조하려면 아래 사이트를 방문하면 된다:

http://maketecheasier.com/8-useful-and-interesting-bash-prompts/2009/09/04

110511 From hobby to business

개인적으로 2011년은 여러모로 나에게 많은 변화가 있는 해이다.

연구 쪽에서도 큰 트랙을 잡아가고 있는 중이고, 또한 high worship 프로젝트의 일정 성과물들을 내고자 하는 해이기도 하다.

high worship 프로젝트와 관련된 가장 큰 변화라면, 이제는 취미 생활을 사업으로 변환시키는 과정이라고 볼 수 있다.

악보 프로젝트는 사실 내 개인 취미로부터 시작한 것이다. 다만 그 쌓인 컨텐츠가 방대해지고, 또한 거기에 더해 찬양인도자로서의 몇 가지 아쉬운 점들에 대해 직접 웹 서비스로 해결하고자 하면서 나름대로 의미있는 성과가 나오고 있는 중이다.

이에 대해 드는 생각은, public 하게 만든다는 것은 생각보다 많은 것들을 고려해야 한다는 것이다. 개인 서비스였을 때는 단순히 “쓰기 싫으면 쓰지 마”라고 할 수 있지만, public 한 서비스는 그렇지 않기 때문이다.

그렇기 때문에 마케팅, 펀딩, 홍보, 인력 고용, … 이 모든 것 하나하나가 꽤나 큰 이슈들이 될 수 밖에 없다.

여하튼 사업화 관련해서도 2011년에는 의미있는 성과들이 나왔으면 한다. 그리고 찬양 인도자 커뮤니티에 의미있는 툴이 되었으면 좋겠다.