Menu
Home
Home / Links / Resume
Photo
Photo
BBS
Writing / Programming
Salsa / Guestbook
Wiki
Home / NDS HomeBrew

Search

Calendar 2017/11
< 2017 / 11 >
  1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

Calendar 2017/12
< 2017 / 12 >
  1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

Recent Comments
* gkagm2@gmail.com 이...
*
* jkj,k
*
*
* Test
*
*
*
* 승익
*
* 일본어글자앱이요 껏...
* 죄송
* 닥쳐
*

Get XML
Articles RSS
Photos RSS
Wiki New Pages
Wiki Changes

Counter
Today: 121
Month: 1432
Total: 632542
Statistics

Programming
Board: Programming (19 Articles) Page 3 / 4 pages.



9. [Programming] by GyonG at 2006-05-23 22:56:48 from 210.124.215.125
http://www.scgyong.net/twiki/bin/view/Kbase/BashLecture2

Bash 및 Shell Tools 강의 두번째이다.
Name: Comment:

8. [Programming] by GyonG at 2006-05-17 00:43:20 from 210.124.215.163
http://www.scgyong.net/twiki/bin/view/Kbase/BashLecture1

Bash 강의 첫번째 자료를 써봤다.
Name: Comment:

7. [Programming] by GyonG at 2005-09-12 14:52:21 from 210.91.42.253
http://www.scgyong.net/twiki/bin/view/Kbase/HexToRgb565 - find, perl, make 를 활용한 scripting.

자주 올려야 할텐데. PERL 관련글은 언제 쓰려나.
Name: Comment:

6. [Programming] by GyonG at 2005-08-24 14:35:54 from 210.91.42.253
http://www.scgyong.net/twiki/bin/view/Kbase/ShellUtils - cygwin, wget, grep, sed 를 이용한 CHM 파일 받기
Name: Comment:

5. [Programming] by GyonG at 2005-05-19 20:27:31 from 210.91.42.253
음력 코드에 버그가!

예전에 음력 관련 코딩을 할 때 인터넷을 뒤져서 찾은 코드로 JScript 코딩도 하고 C 코딩도 하고 PHP 로도 포팅을 했었다. 그런데 알아보니 이 음력 변환 소스에 버그가 있었다.

음력(태음태양력)은 19년에 7번의 윤달을 넣는 방법으로 계절을 쫒아 가는데, 이것이 일정한 규칙이 없다. 어찌어찌 자료를 찾다 보니 계산법을 통해 대략적인 날짜를 구하는 공식을 찾았지만, 이것은 오차가 있는 계산법이다. 그래서, 현재 음력 날짜를 구하기 위하여 사용되는 코드는 모두 매 달마다 큰달(30일)/작은달(29일)의 정보와 어느 달이 윤달인지 저장하는 방법을 사용한다.

뉴스검색을 해 보니, 이 DB 에 문제가 있었던 모양이다. 그래서 작년에 한번 기사가 난 것 같은데, 2004년 11월 15일이 음력 10월 3일이라고 나오는 코드는 잘못된 DB 를 바탕으로 한 코드이다. 10월 4일이 맞다. 주위에 있는 폰들을 다 알아보니 제대로 나오는 폰이 절반 정도 된다.

또, 2006년 설날이 1월 30일(월)로 나오는 코드도 오류다. 1월 29일(일)이 맞다. 내년 설 연휴를 알아보는 사람이 생기면서 이 문제도 조만간 터질 조짐이다. 내년 설이 정확히 나오는 폰은 딱 한 개였고, 모두 월요일이 설날인 것으로 나왔다.

우리 회사에서 Application 을 만드는 JINOS 폰 (일명 CanU 시리즈) 은 작년에 이 버그를 알고 모두 패치 했다고 한다. (나는 아직 패치를 받지 못해서 아직 버그가 있다) 그리고, 지금 개발중인 (JINOS 가 아닌) 프로젝트에서도 업데이트된 버전을 써서 개발을 진행하고 있다.

불만인 것은, 이게 DB 를 바탕으로 하고 있다 보니 소스의 데이터 부분이 참 길다는 거다. 윤달이고 아니고 하는 정보를 기억하는 정도일 뿐인데 달마다 하나의 바이트(혹은 그 이상)씩을 차지하고 있다. 게다가 더 불만인 것은, 양/음 변환 부분인데, 계산 첫 날을 정해 놓고 그 날 이후 지금까지 흐른 날 수를 센 뒤에, 그 날만큼을 다시 음력 날짜에 더하는 방법을 사용한다. JINOS 에 사용된 소스는 약간 더 똑똑한데, 이것은 매 해 며칠인지까지 기억해 두어서, 매 달을 계산하지 않아도 되게 했다.

어차피 DB 로 찾는 것인데, 좀 더 다른 방법을 연구하면 어떨까 하는 생각이 든다. 예로, 현재 JINOS 코드에서 한 해에 대한 정보는 (1 byte x 13 달) + 2 byte 해서 총 15 byte 이다. 이 정보는 달별로 최소한의 bit 씩만 쓰는 경우 3 bit * 13 + 9 bit = 48 bit 면 모두 표현이 가능하다.

bit 계산을 좀 더 달리 하게 되는 경우 2 bit 로 줄이는 코드도 작성해 보았다. 이 경우 26 bit 로 모두 처리 되었다. bit 를 좀 더 아끼려면, 큰달/작은달 정보만 기록하고 윤달인 달과 그 달이 큰달인지 작은달인지를 별도로 저장한다면, 1 bit x 12 + 4 bit + 1 bit 는 17 bit 로 모두 처리된다.

데이터의 단위를 32 bit 로 하게 되면 자리가 좀 더 남으므로, 여기에 다른 정보를 더 저장할 수 있다. 예를 들면, 첫해부터 계산하는 짓을 하지 말고, 매 해 1월 1일부터 계산하면 좀 더 빠른 계산을 할 수 있다.

2005 년 1월 1일은 음력 2004년 11월 21 일이다. 이 2004년 11월 21을 저장하는 방법은 여러 가지가 있겠지만, 이것도 7bit 면 표현이 가능하다. 양력 1월 1일은 음력으로 하면 반드시 11월 아니면 12월이다. 따라서 11월이면 0, 12월이면 1 을 저장하는 bit 하나와 그 달이 윤달인지 여부를 저장하는 1 bit 가 필요하다. 연도는 반드시 1 작으므로 저장할 필요가 없다. 그리고 날짜는 1~30 까지이므로 5 bit 가 필요하여 총 7 bit 가 된다.

이 7 bit 와 앞의 17 bit 를 더하면 24 bit 가 된다. 이렇게 계산된 값을 2001 년부터 2010 년까지로 나타내면

0x4E9527,0x24052B,0x3A0A5B,0x54535A,0x2A0B6A,0x44FB54,0x1A0BA4,0x2E0B49,0x4CBA93,0x220A95,

와 같이 된다. 아, 위 코드는 버그 있는 데이터를 바탕으로 만들어진 거라서 2004년 11월과 2006년 1월 정보가 틀리다.

위 데이터를 바탕으로 매년 1월 1일이 음력으로 몇월 몇일인지 출력하는 코드를 만들어 보았다. 시간이 없어서 m 월 d 일을 변환하는 코드까지 만들어 보지는 못했다. 나중에 시간이 나면 좀 더 해 봐야겠다.

그리고, 한국천문연구원 (http://www.kasi.re.kr) 에 가면 양력/음력 변환을 해 주는 페이지가 있다. 이 곳의 정보는 정확하리라 생각하고, 이 곳의 서비스를 이용하여 나만의 DB 를 구축하기로 했다. 위에 계산된 데이터 중 2004년 과 2006년이 틀렸다는 것은 알겠는데, 어디가 더 틀렸는지 모르니까.

예전에 만들었던 HTTP 연결 코드를 변형하여 y 년 m 월 d 일 을 음력으로 변환하는 HTTP POST Request 를 만들고 그 결과를 parsing 하여 텍스트 파일에 저장했다. 무슨 에러인지, 중간에 프로그램이 죽어 버려서 완료되지 않은 파일들이 있지만, 밤새 돌려놓고 집에 갔다 오니 1391 년 부터 2050 년 까지의 모든 해의 음력 정보를 저장해 주었다. 이제 이 데이터를 가공해서 위에 있는 것 같은 코드를 만들고, 음력변환 코드를 완성하면, 양/음 변환 코드의 새 장을 열 수도 있을 것 같다 : )

그러나...

시간이 있어야 이 짓을 계속 할 수 있다. 바빠서 못 한다...
홍 : 가장 큰 문제는 2006년 1월 29일이 일요일이라는 거지요! 휴일 하루 줄었음. 훌쩍. ( 05.20 16:16 211.189.163.131 )
Name: Comment:

Go To Page [ 1 2 3 4 ]