Programming

You are currently browsing articles tagged Programming.

RSS 피드가 업데이트 되었을 때, 업데이트 된 항목을 이메일로 발송해주는 서비스를 만들었습니다.

SendMeFeed

사이트에 가셔서 메인 페이지에서

  1. 피드 타이틀 (메일 제목에 표시되는 걸 변경하고 싶을 때)
  2. 피드 주소
  3. 업데이트를 받아볼 email 주소!

를 입력하시면 RSS 피드에 새로운 아이템이 올라오면 해당 아이템을 메일로 발송해줍니다.

사용 용도

그럼 이 서비스를 왜 만들었냐! 하면, 간단히 설명하자면 요즘 웬만한 게시판이나 블로그, 카페, 커뮤니티 심지어 뉴스 사이트들도 RSS 를 제공하는 추세입니다. 그리고 이동통신사 이메일 서비스에 보면 메일 수신 알림 서비스가 있습니다. 이통사 메일 주소로 메일이 도착하면 SMS 나 MMS 로 알림을 보내주는 거지요.

따라서 이 서비스를 이용해서 RSS 업데이트를 이통사 메일주소로 받으면 RSS 업데이트를 실시간으로 SMS 통지 받을 수 있습니다.

참고로 이통사 메일 수신 알림 서비스가 안되는 경우 아레오와 같이 무료 메일 알림 서비스를 제공해주는 사이트들도 있으니 이용하시면 될 것 같습니다.

개발 뒷 이야기

제가 위와 같은 용도로 이런 서비스가 필요해서 찾아봤습니다. 찾아보니 원래 SendMeRSS 라는 사이트가 있었는데 아쉽게도 폐쇄되었더군요. 그리고 FeedMyInbox 라는 서비스가 있는데 아직 서비스 중이지만 한글이 깨지고 업데이트 발송이 좀 느린 편입니다.

그래서 구글 애플리케이션 엔진(Google App Engine)도 사용해볼 겸 심심풀이 삼아 만들어 본다는게 일이 커져서 공개할 정도가 되었네요. 제 영어가 부족해서 번역에는 Aradia 가 수고해주었습니다. 이 포스트를 빌어 다시 한번 감사를 ;)

그리고 RSS 를 지원하지 않는 게시판들이 있어서 웹페이지를 RSS 피드로 변환시켜주는 RSS Maker라는 서비스도 만들어서 개인적으로 사용하고 있습니다. 그런데 이건 아직 공개할 정도가 아니라서 더 개발중입니다.

그럼 사용해보시고 피드백이나 버그 리포팅은 리플이나 feedsend@gmail.com 으로 보내주세요~

Tags: , , ,

원문은 Monaca: 스도쿠 규칙 검사 에서 가져왔습니다. 저는 한단계 건너서 rein 님의 Quiz: 스도쿠 규칙 검사 를 보고 알게 되었습니다.

스도쿠는 1~9까지 숫자가 겹치지 않게 채워 넣는 게임이다.

여기서는 규칙을 조금 단순하게 해서 한 열에 1~9까지 숫자가 빠짐없이 들어 있는지 검사하는 코드를 작성한다고 가정하자.

입력 값이 규칙에 맞으면 True, 틀리면 False를 출력한다.

입력
123456789
112345678
223456788
012345678
134445679

출력
True
False
False
False
False

이런 문제를 풀 수 있는 방법은 대략

  1. 정렬 후 비교
  2. 원소 카운팅 – 카운팅 소트(counting sort)에서 사용하는
  3. set 같은 자료구조를 사용하는 방법

등이 있습니다.

아무래도 속도가 가장 빠른 방법은 카운팅 소트에서처럼 입력값을 쭉 읽어나가면서 1부터 9의 갯수를 세는 방법인데, 이 경우 길이가 9로 고정되어 있으므로 아무 카운트나 2가 되면 중간에 바로 False 를 리턴할 수 있습니다.

그 외에 파이썬의 경우 정렬 후 비교나 set() 으로 만든 후 비교해도 코드가 간단하게 한줄로 나옵니다.

이미 속도에 중점을 둔 방식이나 그 외에 방식들은 많은 분들이 좋은 코드를 올려주셔서 뭔가 다른 방법 없나 생각해보다가 원래 문제 의미를 그대로 풀어쓰는 형태로 Haskell 로 짜보기로 했습니다.

그렇게 해서 나온 하스켈 코드가 …

sudoku_check x = all (flip elem x) [1..9]

실행 결과 (ghci 사용1)

Prelude> let sudoku_check x= all (flip elem x) [1..9]
Prelude> sudoku_check [1,2,3,4,5,6,7,8,9]
True
Prelude> sudoku_check [1,1,2,3,4,5,6,7,8]
False

입니다. 보시면 아시겠지만 1부터 9까지의 숫자가 모두 입력값에 있어야만 True 를 리턴하는 함수입니다.2 입력값을 여러번 읽으므로 물론 속도는 느리지만 문제의 의미를 그냥 코드로 옮겨적은 형태고 간단해 보여서 올립니다.

하지만 임의의 길이의 입력값들도 다 처리할 수 있는 일반적인 솔루션이기 때문에 입력값의 길이가 9로 제한되어 있다는 조건을 유용하게 사용하지 못한 점은 약간 아쉽네요.


  1. ghci 에 바로 입력 시에는 앞에 “let ” 을 붙여줘야 합니다. []
  2. 중간에 flip 은 인자 순서 때문에 들어간 보조 함수고 의미 상은 all (elem’ x) [1..9] 와 같습니다. []

Tags: , ,

개미 수열이란게 있습니다. 베르나르 베르베르의 소설 “개미” 에 나와서 유명해진 수열인데, 대략 아래와 같은 형태입니다.

1
11
12
1121
122111
112213
12221131

처음 보는 분들을 위해 간단히 설명하자면, 일단 수열의 처음은 “1” 로 시작합니다. 그리고 그 다음 원소부터는 이전 원소의 숫자들을 읽어서 만들어냅니다.

우선 첫 원소 “1” 은 1이 1개 있기 때문에 두번째 원소는 “11” (1이 1개) 가 됩니다.

그 다음 원소는 이전 원소가 “11” 이므로 “12” (1이 2개), 또 그 다음 원소는 “1121” (1이 1개, 2가 1개) 가 됩니다.

이와 같은 규칙으로 생성되는 수열인데, 문제가 간단해서 Haskell 이라는 함수형 언어(functional programming language)로 한번 작성해보았습니다.

module AntSeq
    where

ant_seq [] = []
ant_seq l@(x:xs) = let (xs1, xs2) = span ((==) x) l
                   in x : (length xs1) : ant_seq xs2

gen_seq n = take n $ iterate (ant_seq) [1]

--pretty print
pprint n = mapM_ print $ gen_seq n

위 하스켈 코드를 ant_seq.hs 파일로 저장한 다음 하스켈 인터프리터에서

:load ant_seq.hs

한 후 pprint 함수를 실행시키면 아래와 같이 출력됩니다.

*AntSeq> pprint 12
[1]
[1,1]
[1,2]
[1,1,2,1]
[1,2,2,1,1,1]
[1,1,2,2,1,3]
[1,2,2,2,1,1,3,1]
[1,1,2,3,1,2,3,1,1,1]
[1,2,2,1,3,1,1,1,2,1,3,1,1,3]
[1,1,2,2,1,1,3,1,1,3,2,1,1,1,3,1,1,2,3,1]
[1,2,2,2,1,2,3,1,1,2,3,1,2,1,1,3,3,1,1,2,2,1,3,1,1,1]
[1,1,2,3,1,1,2,1,3,1,1,2,2,1,3,1,1,1,2,1,1,2,3,2,1,2,2,2,1,1,3,1,1,3]

함수형 언어는 특정 타입의 문제들을 아주 깔끔하고 간단하게 구현하는 것이 가능합니다. 그러나 그런 몇가지 예제들을 가지고 함수형 언어가 마치 모든 문제의 가장 완전하고 빠른 해결책인 것처럼 오도하는 것은 분명 경계해야 할 것입니다.

이 예제는 함수형 언어의 특징을 효과적으로 보여주는 그런 전형적인 예제들과는 거리가 멀지만, 생각보다 코드가 간단하게 나와서 포스팅 해봤습니다.

간단한 문제이므로 각자 선호하는 언어로 구현해 보고 비교해보는 것도 재미있을 것 같습니다. :)

Tags: , ,

« Older entries